diff --git a/src/agents/agent-tools.before-tool-call.e2e.test.ts b/src/agents/agent-tools.before-tool-call.e2e.test.ts index 0acf11b5ec2..86c7f0bc433 100644 --- a/src/agents/agent-tools.before-tool-call.e2e.test.ts +++ b/src/agents/agent-tools.before-tool-call.e2e.test.ts @@ -13,11 +13,11 @@ import { getGlobalHookRunner } from "../plugins/hook-runner-global.js"; import { createEmptyPluginRegistry } from "../plugins/registry-empty.js"; import { setActivePluginRegistry } from "../plugins/runtime.js"; import { setPluginToolMeta } from "../plugins/tools.js"; +import { createCanonicalFixtureSkill } from "../skills/test-helpers.js"; import { runBeforeToolCallHook, wrapToolWithBeforeToolCallHook, } from "./agent-tools.before-tool-call.js"; -import { createCanonicalFixtureSkill } from "./skills.test-helpers.js"; import { CRITICAL_THRESHOLD } from "./tool-loop-detection.js"; import type { AnyAgentTool } from "./tools/common.js"; import { callGatewayTool } from "./tools/gateway.js"; diff --git a/src/agents/agent-tools.workspace-paths.test.ts b/src/agents/agent-tools.workspace-paths.test.ts index a6d895291fe..2fe35c6821c 100644 --- a/src/agents/agent-tools.workspace-paths.test.ts +++ b/src/agents/agent-tools.workspace-paths.test.ts @@ -5,8 +5,8 @@ import { describe, expect, it, vi } from "vitest"; import "./test-helpers/fast-coding-tools.js"; import "./test-helpers/fast-openclaw-tools.js"; import type { OpenClawConfig } from "../config/config.js"; +import { createCanonicalFixtureSkill } from "../skills/test-helpers.js"; import { createOpenClawCodingTools } from "./agent-tools.js"; -import { createCanonicalFixtureSkill } from "./skills.test-helpers.js"; import { expectReadWriteEditTools, getTextContent } from "./test-helpers/agent-tools-fs-helpers.js"; import { createAgentToolsSandboxContext } from "./test-helpers/agent-tools-sandbox-context.js"; import { createHostSandboxFsBridge } from "./test-helpers/host-sandbox-fs-bridge.js"; diff --git a/src/agents/embedded-agent-runner/skills-runtime.integration.test.ts b/src/agents/embedded-agent-runner/skills-runtime.integration.test.ts index 7acaa176888..6d884a380b8 100644 --- a/src/agents/embedded-agent-runner/skills-runtime.integration.test.ts +++ b/src/agents/embedded-agent-runner/skills-runtime.integration.test.ts @@ -3,7 +3,7 @@ import os from "node:os"; import path from "node:path"; import { afterEach, describe, expect, it } from "vitest"; import type { OpenClawConfig } from "../../config/config.js"; -import { writePluginWithSkill } from "../test-helpers/skill-plugin-fixtures.js"; +import { writePluginWithSkill } from "../../skills/skill-plugin-fixtures.test-support.js"; import { resolveEmbeddedRunSkillEntries } from "./skills-runtime.js"; const tempDirs: string[] = []; diff --git a/src/cli/skills-cli.commands.test.ts b/src/cli/skills-cli.commands.test.ts index e94b2e1182d..e0064357ed9 100644 --- a/src/cli/skills-cli.commands.test.ts +++ b/src/cli/skills-cli.commands.test.ts @@ -178,7 +178,7 @@ vi.mock("../agents/agent-scope.js", () => ({ mocks.resolveAgentWorkspaceDirMock(config, agentId), })); -vi.mock("../agents/skills-clawhub.js", () => ({ +vi.mock("../skills/clawhub.js", () => ({ searchSkillsFromClawHub: (...args: unknown[]) => mocks.searchSkillsFromClawHubMock(...args), installSkillFromClawHub: (...args: unknown[]) => mocks.installSkillFromClawHubMock(...args), updateSkillsFromClawHub: (...args: unknown[]) => mocks.updateSkillsFromClawHubMock(...args), @@ -194,7 +194,7 @@ vi.mock("../infra/clawhub.js", () => ({ fetchClawHubSkillCard: (...args: unknown[]) => mocks.fetchClawHubSkillCardMock(...args), })); -vi.mock("../agents/skills-source-install.js", () => ({ +vi.mock("../skills/source-install.js", () => ({ installSkillFromSource: (...args: unknown[]) => mocks.installSkillFromSourceMock(...args), isSkillSourceInstallSpec: (raw: string) => raw.startsWith("git:") || @@ -204,7 +204,7 @@ vi.mock("../agents/skills-source-install.js", () => ({ raw.startsWith("/"), })); -vi.mock("../agents/skills-status.js", () => ({ +vi.mock("../skills/status.js", () => ({ buildWorkspaceSkillStatus: (workspaceDir: string, options?: unknown) => mocks.buildWorkspaceSkillStatusMock(workspaceDir, options), })); diff --git a/src/cli/skills-cli.format.ts b/src/cli/skills-cli.format.ts index 975ab09cb68..6111216c98e 100644 --- a/src/cli/skills-cli.format.ts +++ b/src/cli/skills-cli.format.ts @@ -1,4 +1,4 @@ -import type { SkillStatusEntry, SkillStatusReport } from "../agents/skills-status.js"; +import type { SkillStatusEntry, SkillStatusReport } from "../skills/status.js"; import { sanitizeForLog, stripAnsi } from "../terminal/ansi.js"; import { decorativeEmoji, decorativePrefix } from "../terminal/decorative-emoji.js"; import { getTerminalTableWidth, renderTable } from "../terminal/table.js"; diff --git a/src/cli/skills-cli.formatting.test.ts b/src/cli/skills-cli.formatting.test.ts index 64b3550c5cf..bb986a4b71b 100644 --- a/src/cli/skills-cli.formatting.test.ts +++ b/src/cli/skills-cli.formatting.test.ts @@ -2,9 +2,9 @@ import fs from "node:fs"; import os from "node:os"; import path from "node:path"; import { afterAll, beforeAll, describe, expect, it } from "vitest"; -import { buildWorkspaceSkillStatus } from "../agents/skills-status.js"; -import { createCanonicalFixtureSkill } from "../agents/skills.test-helpers.js"; import type { SkillEntry } from "../skills/index.js"; +import { buildWorkspaceSkillStatus } from "../skills/status.js"; +import { createCanonicalFixtureSkill } from "../skills/test-helpers.js"; import { captureEnv } from "../test-utils/env.js"; import { formatSkillInfo, formatSkillsCheck, formatSkillsList } from "./skills-cli.format.js"; diff --git a/src/cli/skills-cli.test.ts b/src/cli/skills-cli.test.ts index e247a3ea3e5..bfccba5d5f0 100644 --- a/src/cli/skills-cli.test.ts +++ b/src/cli/skills-cli.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it, vi } from "vitest"; -import type { SkillStatusEntry, SkillStatusReport } from "../agents/skills-status.js"; +import type { SkillStatusEntry, SkillStatusReport } from "../skills/status.js"; import { createEmptyInstallChecks } from "./requirements-test-fixtures.js"; import { formatSkillInfo, formatSkillsCheck, formatSkillsList } from "./skills-cli.format.js"; diff --git a/src/cli/skills-cli.ts b/src/cli/skills-cli.ts index 9e9e50b74c7..44bdcb44ef4 100644 --- a/src/cli/skills-cli.ts +++ b/src/cli/skills-cli.ts @@ -4,17 +4,6 @@ import { resolveAgentWorkspaceDir, resolveDefaultAgentId, } from "../agents/agent-scope.js"; -import { - installSkillFromClawHub, - readTrackedClawHubSkillSlugs, - resolveClawHubSkillVerificationTarget, - searchSkillsFromClawHub, - updateSkillsFromClawHub, -} from "../agents/skills-clawhub.js"; -import { - installSkillFromSource, - isSkillSourceInstallSpec, -} from "../agents/skills-source-install.js"; import { getRuntimeConfig } from "../config/config.js"; import { fetchClawHubSkillCard, @@ -23,6 +12,14 @@ import { } from "../infra/clawhub.js"; import { defaultRuntime } from "../runtime.js"; import { normalizeOptionalString } from "../shared/string-coerce.js"; +import { + installSkillFromClawHub, + readTrackedClawHubSkillSlugs, + resolveClawHubSkillVerificationTarget, + searchSkillsFromClawHub, + updateSkillsFromClawHub, +} from "../skills/clawhub.js"; +import { installSkillFromSource, isSkillSourceInstallSpec } from "../skills/source-install.js"; import { formatDocsLink } from "../terminal/links.js"; import { theme } from "../terminal/theme.js"; import { CONFIG_DIR } from "../utils.js"; @@ -38,7 +35,7 @@ export type { export { formatSkillInfo, formatSkillsCheck, formatSkillsList } from "./skills-cli.format.js"; type SkillStatusReport = Awaited< - ReturnType<(typeof import("../agents/skills-status.js"))["buildWorkspaceSkillStatus"]> + ReturnType<(typeof import("../skills/status.js"))["buildWorkspaceSkillStatus"]> >; type ResolvedClawHubSkillVerificationTarget = Extract< Awaited>, @@ -79,7 +76,7 @@ async function loadSkillsStatusReport( options?: ResolveSkillsWorkspaceOptions, ): Promise { const { config, workspaceDir, agentId } = resolveSkillsWorkspace(options); - const { buildWorkspaceSkillStatus } = await import("../agents/skills-status.js"); + const { buildWorkspaceSkillStatus } = await import("../skills/status.js"); return buildWorkspaceSkillStatus(workspaceDir, { config, agentId }); } diff --git a/src/commands/doctor-skills-core.ts b/src/commands/doctor-skills-core.ts index 439ba305fef..d2e98074398 100644 --- a/src/commands/doctor-skills-core.ts +++ b/src/commands/doctor-skills-core.ts @@ -1,5 +1,5 @@ -import type { SkillStatusEntry, SkillStatusReport } from "../agents/skills-status.js"; import type { OpenClawConfig } from "../config/types.openclaw.js"; +import type { SkillStatusEntry, SkillStatusReport } from "../skills/status.js"; export function collectUnavailableAgentSkills(report: SkillStatusReport): SkillStatusEntry[] { return report.skills.filter( diff --git a/src/commands/doctor-skills.test.ts b/src/commands/doctor-skills.test.ts index 628b7d97b43..11ca2bc2d8b 100644 --- a/src/commands/doctor-skills.test.ts +++ b/src/commands/doctor-skills.test.ts @@ -1,8 +1,8 @@ import { describe, expect, it } from "vitest"; -import type { SkillStatusEntry, SkillStatusReport } from "../agents/skills-status.js"; import { createEmptyInstallChecks } from "../cli/requirements-test-fixtures.js"; import type { OpenClawConfig } from "../config/types.openclaw.js"; import type { GhConfigDiscoveryInput } from "../skills/gh-config-discovery.js"; +import type { SkillStatusEntry, SkillStatusReport } from "../skills/status.js"; import { collectUnavailableAgentSkills, describeGhConfigDirHintFromDiscovery, diff --git a/src/commands/doctor-skills.ts b/src/commands/doctor-skills.ts index bda85123e19..ad9a5836a46 100644 --- a/src/commands/doctor-skills.ts +++ b/src/commands/doctor-skills.ts @@ -1,7 +1,5 @@ import { existsSync } from "node:fs"; import { resolveAgentWorkspaceDir, resolveDefaultAgentId } from "../agents/agent-scope.js"; -import type { SkillStatusEntry } from "../agents/skills-status.js"; -import { buildWorkspaceSkillStatus } from "../agents/skills-status.js"; import { formatCliCommand } from "../cli/command-format.js"; import type { OpenClawConfig } from "../config/types.openclaw.js"; import { @@ -10,6 +8,8 @@ import { type GhConfigDiscoveryInput, type GhConfigDiscoveryResult, } from "../skills/gh-config-discovery.js"; +import type { SkillStatusEntry } from "../skills/status.js"; +import { buildWorkspaceSkillStatus } from "../skills/status.js"; import { note } from "../terminal/note.js"; import type { DoctorPrompter } from "./doctor-prompter.js"; import { diff --git a/src/commands/doctor-workspace-status.test.ts b/src/commands/doctor-workspace-status.test.ts index 93407462dcb..da9033c09ce 100644 --- a/src/commands/doctor-workspace-status.test.ts +++ b/src/commands/doctor-workspace-status.test.ts @@ -22,7 +22,7 @@ vi.mock("../agents/agent-scope.js", () => ({ resolveDefaultAgentId: (...args: unknown[]) => mocks.resolveDefaultAgentId(...args), })); -vi.mock("../agents/skills-status.js", () => ({ +vi.mock("../skills/status.js", () => ({ buildWorkspaceSkillStatus: (...args: unknown[]) => mocks.buildWorkspaceSkillStatus(...args), })); diff --git a/src/commands/doctor-workspace-status.ts b/src/commands/doctor-workspace-status.ts index c8f98a7846c..bde3b67f723 100644 --- a/src/commands/doctor-workspace-status.ts +++ b/src/commands/doctor-workspace-status.ts @@ -1,11 +1,11 @@ import { resolveAgentWorkspaceDir, resolveDefaultAgentId } from "../agents/agent-scope.js"; -import { buildWorkspaceSkillStatus } from "../agents/skills-status.js"; import { formatCliCommand } from "../cli/command-format.js"; import type { OpenClawConfig } from "../config/types.openclaw.js"; import { buildPluginCompatibilityWarnings, buildPluginRegistrySnapshotReport, } from "../plugins/status.js"; +import { buildWorkspaceSkillStatus } from "../skills/status.js"; import { listTasksForFlowId } from "../tasks/runtime-internal.js"; import { listTaskFlowRecords } from "../tasks/task-flow-runtime-internal.js"; import { note } from "../terminal/note.js"; diff --git a/src/commands/doctor.e2e-harness.ts b/src/commands/doctor.e2e-harness.ts index fa81f6b4b90..b8da0ef9eba 100644 --- a/src/commands/doctor.e2e-harness.ts +++ b/src/commands/doctor.e2e-harness.ts @@ -242,7 +242,7 @@ vi.mock("@clack/prompts", () => ({ select, })); -vi.mock("../agents/skills-status.js", () => ({ +vi.mock("../skills/status.js", () => ({ buildWorkspaceSkillStatus: () => ({ skills: [] }), })); diff --git a/src/commands/onboard-skills.test.ts b/src/commands/onboard-skills.test.ts index c90b017b540..0de0f480c46 100644 --- a/src/commands/onboard-skills.test.ts +++ b/src/commands/onboard-skills.test.ts @@ -17,10 +17,10 @@ const mocks = vi.hoisted(() => ({ })); // Module under test imports these at module scope. -vi.mock("../agents/skills-status.js", () => ({ +vi.mock("../skills/status.js", () => ({ buildWorkspaceSkillStatus: mocks.buildWorkspaceSkillStatus, })); -vi.mock("../agents/skills-install.js", () => ({ +vi.mock("../skills/install.js", () => ({ installSkill: mocks.installSkill, })); vi.mock("../infra/container-environment.js", () => ({ diff --git a/src/commands/onboard-skills.ts b/src/commands/onboard-skills.ts index ab8739e2695..4712fda05c7 100644 --- a/src/commands/onboard-skills.ts +++ b/src/commands/onboard-skills.ts @@ -1,10 +1,10 @@ -import { installSkill } from "../agents/skills-install.js"; -import { buildWorkspaceSkillStatus } from "../agents/skills-status.js"; import { formatCliCommand } from "../cli/command-format.js"; import type { OpenClawConfig } from "../config/types.openclaw.js"; import { resolveBrewExecutable } from "../infra/brew.js"; import { isContainerEnvironment } from "../infra/container-environment.js"; import type { RuntimeEnv } from "../runtime.js"; +import { installSkill } from "../skills/install.js"; +import { buildWorkspaceSkillStatus } from "../skills/status.js"; import { normalizeSecretInput } from "../utils/normalize-secret-input.js"; import { t } from "../wizard/i18n/index.js"; import type { WizardPrompter } from "../wizard/prompts.js"; diff --git a/src/commands/status-all/report-data.ts b/src/commands/status-all/report-data.ts index da7fc25c82c..221baef6b2f 100644 --- a/src/commands/status-all/report-data.ts +++ b/src/commands/status-all/report-data.ts @@ -1,11 +1,11 @@ import { canExecRequestNode } from "../../agents/exec-defaults.js"; -import { buildWorkspaceSkillStatus } from "../../agents/skills-status.js"; import { readConfigFileSnapshot, resolveGatewayPort } from "../../config/config.js"; import { readLastGatewayErrorLine } from "../../daemon/diagnostics.js"; import { inspectPortUsage } from "../../infra/ports.js"; import { readRestartSentinel } from "../../infra/restart-sentinel.js"; import { getRemoteSkillEligibility } from "../../infra/skills-remote.js"; import { buildPluginCompatibilityNotices } from "../../plugins/status.js"; +import { buildWorkspaceSkillStatus } from "../../skills/status.js"; import { buildStatusAllOverviewRows } from "../status-overview-rows.ts"; import { buildStatusOverviewSurfaceFromOverview, diff --git a/src/config/sessions/store.skills-stripping.test.ts b/src/config/sessions/store.skills-stripping.test.ts index 66eb31170a7..c744abdab50 100644 --- a/src/config/sessions/store.skills-stripping.test.ts +++ b/src/config/sessions/store.skills-stripping.test.ts @@ -3,12 +3,12 @@ import fs from "node:fs/promises"; import path from "node:path"; import { afterAll, afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { resolveEmbeddedRunSkillEntries } from "../../agents/embedded-agent-runner/skills-runtime.js"; -import { createCanonicalFixtureSkill } from "../../agents/skills.test-helpers.js"; import type { Skill } from "../../skills/skill-contract.js"; import { hydrateResolvedSkills, hydrateResolvedSkillsAsync, } from "../../skills/snapshot-hydration.js"; +import { createCanonicalFixtureSkill } from "../../skills/test-helpers.js"; import { createSuiteTempRootTracker } from "../../test-helpers/temp-dir.js"; import type { SessionEntry, SessionSkillPromptRef, SessionSkillSnapshot } from "./types.js"; diff --git a/src/flows/doctor-core-checks.runtime.ts b/src/flows/doctor-core-checks.runtime.ts index e3cc6a9f37c..5eb1126a00f 100644 --- a/src/flows/doctor-core-checks.runtime.ts +++ b/src/flows/doctor-core-checks.runtime.ts @@ -22,7 +22,6 @@ import { import { resolveDefaultModelForAgent } from "../agents/model-selection.js"; import { supportsModelTools } from "../agents/model-tool-support.js"; import { normalizeAgentRuntimeTools } from "../agents/runtime-plan/tools.js"; -import { buildWorkspaceSkillStatus, type SkillStatusEntry } from "../agents/skills-status.js"; import { collectExplicitAllowlist, normalizeToolName } from "../agents/tool-policy.js"; import { inspectRuntimeToolInputSchemas, @@ -35,6 +34,7 @@ import { formatErrorMessage } from "../infra/errors.js"; import type { ProviderRuntimeModel } from "../plugins/provider-runtime-model.types.js"; import { getPluginToolMeta, setPluginToolMeta } from "../plugins/tools.js"; import { normalizeAgentId } from "../routing/session-key.js"; +import { buildWorkspaceSkillStatus, type SkillStatusEntry } from "../skills/status.js"; import type { HealthFinding } from "./health-checks.js"; type BundleMcpToolRuntime = Awaited>; diff --git a/src/flows/doctor-core-checks.test.ts b/src/flows/doctor-core-checks.test.ts index adb0c265e20..f1bc4645e59 100644 --- a/src/flows/doctor-core-checks.test.ts +++ b/src/flows/doctor-core-checks.test.ts @@ -2,8 +2,8 @@ import { promises as fs } from "node:fs"; import { tmpdir } from "node:os"; import { join } from "node:path"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; -import type { SkillStatusEntry } from "../agents/skills-status.js"; import type { OpenClawConfig } from "../config/types.openclaw.js"; +import type { SkillStatusEntry } from "../skills/status.js"; import { CORE_HEALTH_CHECKS, createCoreHealthChecks, diff --git a/src/flows/doctor-core-checks.ts b/src/flows/doctor-core-checks.ts index 00e2b9e70be..ffb302de42b 100644 --- a/src/flows/doctor-core-checks.ts +++ b/src/flows/doctor-core-checks.ts @@ -1,6 +1,5 @@ import path from "node:path"; import { resolveAgentWorkspaceDir, resolveDefaultAgentId } from "../agents/agent-scope.js"; -import type { SkillStatusEntry } from "../agents/skills-status.js"; import { detectLegacyClawdBrowserProfileResidue, maybeArchiveLegacyClawdBrowserProfileResidue, @@ -19,6 +18,7 @@ import { hasAmbiguousGatewayAuthModeConfig } from "../gateway/auth-mode-policy.j import { resolveGatewayAuthToken } from "../gateway/auth-token-resolution.js"; import { resolveGatewayAuth } from "../gateway/auth.js"; import { getSkippedExecRefStaticError } from "../secrets/exec-resolution-policy.js"; +import type { SkillStatusEntry } from "../skills/status.js"; import { registerHealthCheck } from "./health-check-registry.js"; import type { HealthCheck, HealthCheckContext, HealthFinding } from "./health-checks.js"; diff --git a/src/gateway/server-methods/skills-upload-store.ts b/src/gateway/server-methods/skills-upload-store.ts index 72235e4bed1..d88f9de8b52 100644 --- a/src/gateway/server-methods/skills-upload-store.ts +++ b/src/gateway/server-methods/skills-upload-store.ts @@ -2,11 +2,11 @@ import { createHash, randomUUID } from "node:crypto"; import { createReadStream } from "node:fs"; import fs from "node:fs/promises"; import path from "node:path"; -import { validateRequestedSkillSlug } from "../../agents/skills-archive-install.js"; import { resolveStateDir } from "../../config/paths.js"; import { DEFAULT_MAX_ARCHIVE_BYTES_ZIP } from "../../infra/archive.js"; import { formatErrorMessage } from "../../infra/errors.js"; import { createAsyncLock, readDurableJsonFile, writeJsonAtomic } from "../../infra/json-files.js"; +import { validateRequestedSkillSlug } from "../../skills/archive-install.js"; export const SKILL_UPLOAD_TTL_MS = 60 * 60 * 1000; export const MAX_SKILL_UPLOAD_CHUNK_BYTES = 4 * 1024 * 1024; diff --git a/src/gateway/server-methods/skills-upload.ts b/src/gateway/server-methods/skills-upload.ts index f94134b739c..10b6902e858 100644 --- a/src/gateway/server-methods/skills-upload.ts +++ b/src/gateway/server-methods/skills-upload.ts @@ -1,3 +1,10 @@ +import type { OpenClawConfig } from "../../config/types.openclaw.js"; +import { formatErrorMessage } from "../../infra/errors.js"; +import { + installSkillArchiveFromPath, + type SkillArchiveInstallFailureKind, + validateRequestedSkillSlug, +} from "../../skills/archive-install.js"; import { ErrorCodes, errorShape, @@ -8,13 +15,6 @@ import { validateSkillsUploadCommitParams, } from "../../../packages/gateway-protocol/src/index.js"; import type { ErrorShape } from "../../../packages/gateway-protocol/src/index.js"; -import { - installSkillArchiveFromPath, - type SkillArchiveInstallFailureKind, - validateRequestedSkillSlug, -} from "../../agents/skills-archive-install.js"; -import type { OpenClawConfig } from "../../config/types.openclaw.js"; -import { formatErrorMessage } from "../../infra/errors.js"; import { defaultSkillUploadStore, normalizeSkillUploadSha256, diff --git a/src/gateway/server-methods/skills.clawhub.test.ts b/src/gateway/server-methods/skills.clawhub.test.ts index b6c9c3746a6..43b819e9053 100644 --- a/src/gateway/server-methods/skills.clawhub.test.ts +++ b/src/gateway/server-methods/skills.clawhub.test.ts @@ -23,17 +23,17 @@ vi.mock("../../agents/agent-scope.js", () => ({ resolveSessionAgentId: vi.fn(() => undefined), })); -vi.mock("../../agents/skills-clawhub.js", () => ({ +vi.mock("../../skills/clawhub.js", () => ({ installSkillFromClawHub: (...args: unknown[]) => installSkillFromClawHubMock(...args), readLocalSkillCardContentSync: (...args: unknown[]) => readLocalSkillCardContentSyncMock(...args), updateSkillsFromClawHub: (...args: unknown[]) => updateSkillsFromClawHubMock(...args), })); -vi.mock("../../agents/skills-status.js", () => ({ +vi.mock("../../skills/status.js", () => ({ buildWorkspaceSkillStatus: (...args: unknown[]) => buildWorkspaceSkillStatusMock(...args), })); -vi.mock("../../agents/skills-install.js", () => ({ +vi.mock("../../skills/install.js", () => ({ installSkill: (...args: unknown[]) => installSkillMock(...args), })); diff --git a/src/gateway/server-methods/skills.search-detail.test.ts b/src/gateway/server-methods/skills.search-detail.test.ts index 5796c749066..693d6948d9c 100644 --- a/src/gateway/server-methods/skills.search-detail.test.ts +++ b/src/gateway/server-methods/skills.search-detail.test.ts @@ -14,7 +14,7 @@ vi.mock("../../agents/agent-scope.js", () => ({ resolveAgentWorkspaceDir: vi.fn(() => "/tmp/workspace"), })); -vi.mock("../../agents/skills-clawhub.js", () => ({ +vi.mock("../../skills/clawhub.js", () => ({ installSkillFromClawHub: vi.fn(), updateSkillsFromClawHub: vi.fn(), searchSkillsFromClawHub: (...args: unknown[]) => searchSkillsFromClawHubMock(...args), @@ -27,7 +27,7 @@ vi.mock("../../infra/clawhub.js", () => ({ downloadClawHubSkillArchive: vi.fn(), })); -vi.mock("../../agents/skills-install.js", () => ({ +vi.mock("../../skills/install.js", () => ({ installSkill: vi.fn(), })); diff --git a/src/gateway/server-methods/skills.ts b/src/gateway/server-methods/skills.ts index 19b306140f1..8c2bd423219 100644 --- a/src/gateway/server-methods/skills.ts +++ b/src/gateway/server-methods/skills.ts @@ -17,14 +17,6 @@ import { resolveDefaultAgentId, } from "../../agents/agent-scope.js"; import { canExecRequestNode } from "../../agents/exec-defaults.js"; -import { - installSkillFromClawHub, - readLocalSkillCardContentSync, - searchSkillsFromClawHub, - updateSkillsFromClawHub, -} from "../../agents/skills-clawhub.js"; -import { installSkill } from "../../agents/skills-install.js"; -import { buildWorkspaceSkillStatus } from "../../agents/skills-status.js"; import { listAgentWorkspaceDirs } from "../../agents/workspace-dirs.js"; import { redactConfigObject } from "../../config/redact-snapshot.js"; import { @@ -37,7 +29,15 @@ import { formatErrorMessage } from "../../infra/errors.js"; import { getRemoteSkillEligibility } from "../../infra/skills-remote.js"; import { normalizeAgentId } from "../../routing/session-key.js"; import { normalizeOptionalString } from "../../shared/string-coerce.js"; +import { + installSkillFromClawHub, + readLocalSkillCardContentSync, + searchSkillsFromClawHub, + updateSkillsFromClawHub, +} from "../../skills/clawhub.js"; import { loadWorkspaceSkillEntries, type SkillEntry } from "../../skills/index.js"; +import { installSkill } from "../../skills/install.js"; +import { buildWorkspaceSkillStatus } from "../../skills/status.js"; import { updateSkillConfigEntry } from "./skills-config-mutations.js"; import { installUploadedSkillArchive, skillsUploadHandlers } from "./skills-upload.js"; import type { GatewayRequestContext, GatewayRequestHandlers } from "./types.js"; diff --git a/src/plugin-sdk/test-fixtures.ts b/src/plugin-sdk/test-fixtures.ts index b4a1751dcc1..dcbefdeea6d 100644 --- a/src/plugin-sdk/test-fixtures.ts +++ b/src/plugin-sdk/test-fixtures.ts @@ -14,7 +14,7 @@ export { createSandboxPruneConfig, createSandboxSshConfig, } from "./test-helpers/sandbox-fixtures.js"; -export { writeSkill } from "../agents/skills.e2e-test-helpers.js"; +export { writeSkill } from "../skills/e2e-test-helpers.js"; export { castAgentMessage, makeAgentAssistantMessage, diff --git a/src/plugin-sdk/testing.ts b/src/plugin-sdk/testing.ts index 4b2e71d9e6a..f9faa450486 100644 --- a/src/plugin-sdk/testing.ts +++ b/src/plugin-sdk/testing.ts @@ -107,7 +107,7 @@ export { isLiveTestEnabled, } from "../agents/live-test-helpers.js"; export { createSandboxTestContext } from "../agents/sandbox/test-fixtures.js"; -export { writeSkill } from "../agents/skills.e2e-test-helpers.js"; +export { writeSkill } from "../skills/e2e-test-helpers.js"; export { castAgentMessage, makeAgentAssistantMessage, diff --git a/src/agents/skills.agents-skills-directory.test.ts b/src/skills/agents-directory.test.ts similarity index 95% rename from src/agents/skills.agents-skills-directory.test.ts rename to src/skills/agents-directory.test.ts index 205e7f4203d..c0ea006d507 100644 --- a/src/agents/skills.agents-skills-directory.test.ts +++ b/src/skills/agents-directory.test.ts @@ -6,11 +6,11 @@ import { restoreMockSkillsHomeEnv, setMockSkillsHomeEnv, type SkillsHomeEnvSnapshot, -} from "../skills/home-env.test-support.js"; -import { buildWorkspaceSkillsPrompt } from "../skills/workspace.js"; -import { writeSkill } from "./skills.test-helpers.js"; +} from "./home-env.test-support.js"; +import { writeSkill } from "./test-helpers.js"; +import { buildWorkspaceSkillsPrompt } from "./workspace.js"; -vi.mock("../skills/plugin-skills.js", () => ({ +vi.mock("./plugin-skills.js", () => ({ resolvePluginSkillDirs: () => [], })); diff --git a/src/agents/skills-archive-install.test.ts b/src/skills/archive-install.test.ts similarity index 99% rename from src/agents/skills-archive-install.test.ts rename to src/skills/archive-install.test.ts index 9810a04f20b..00312538545 100644 --- a/src/agents/skills-archive-install.test.ts +++ b/src/skills/archive-install.test.ts @@ -7,7 +7,7 @@ import { createTrackedTempDirs } from "../test-utils/tracked-temp-dirs.js"; import { CLAWHUB_SKILL_ARCHIVE_ROOT_MARKERS, installExtractedSkillRoot, -} from "./skills-archive-install.js"; +} from "./archive-install.js"; const tempDirs = createTrackedTempDirs(); diff --git a/src/agents/skills-archive-install.ts b/src/skills/archive-install.ts similarity index 100% rename from src/agents/skills-archive-install.ts rename to src/skills/archive-install.ts diff --git a/src/skills/bundled-dir.test.ts b/src/skills/bundled-dir.test.ts index 594419a0030..899cf96c538 100644 --- a/src/skills/bundled-dir.test.ts +++ b/src/skills/bundled-dir.test.ts @@ -3,9 +3,9 @@ import os from "node:os"; import path from "node:path"; import { pathToFileURL } from "node:url"; import { afterEach, beforeEach, describe, expect, it } from "vitest"; -import { writeSkill } from "../skills.e2e-test-helpers.js"; import { captureEnv } from "../test-utils/env.js"; import { resolveBundledSkillsDir } from "./bundled-dir.js"; +import { writeSkill } from "./e2e-test-helpers.js"; describe("resolveBundledSkillsDir", () => { let envSnapshot: ReturnType; diff --git a/src/agents/skills.bundled-frontmatter.test.ts b/src/skills/bundled-frontmatter.test.ts similarity index 94% rename from src/agents/skills.bundled-frontmatter.test.ts rename to src/skills/bundled-frontmatter.test.ts index e81c9df4caf..10ad380cf66 100644 --- a/src/agents/skills.bundled-frontmatter.test.ts +++ b/src/skills/bundled-frontmatter.test.ts @@ -2,7 +2,7 @@ import fs from "node:fs/promises"; import path from "node:path"; import { fileURLToPath } from "node:url"; import { describe, expect, it } from "vitest"; -import { parseFrontmatter } from "../skills/frontmatter.js"; +import { parseFrontmatter } from "./frontmatter.js"; const repoRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "../.."); diff --git a/src/agents/skills-clawhub.test.ts b/src/skills/clawhub.test.ts similarity index 99% rename from src/agents/skills-clawhub.test.ts rename to src/skills/clawhub.test.ts index d8b6a7782cc..4654d545dd7 100644 --- a/src/agents/skills-clawhub.test.ts +++ b/src/skills/clawhub.test.ts @@ -38,7 +38,7 @@ const { resolveClawHubSkillVerificationTarget, searchSkillsFromClawHub, updateSkillsFromClawHub, -} = await import("./skills-clawhub.js"); +} = await import("./clawhub.js"); function expectInstallPackageSourceDir(sourceDir: string) { const call = installPackageDirMock.mock.calls.at(0); diff --git a/src/agents/skills-clawhub.ts b/src/skills/clawhub.ts similarity index 99% rename from src/agents/skills-clawhub.ts rename to src/skills/clawhub.ts index bf73aa22e2f..5ee663583ac 100644 --- a/src/agents/skills-clawhub.ts +++ b/src/skills/clawhub.ts @@ -18,7 +18,7 @@ import { normalizeTrackedSkillSlug, resolveWorkspaceSkillInstallDir, validateRequestedSkillSlug, -} from "./skills-archive-install.js"; +} from "./archive-install.js"; const DOT_DIR = ".clawhub"; const LEGACY_DOT_DIR = ".clawdhub"; diff --git a/src/skills/compact-format.test.ts b/src/skills/compact-format.test.ts index 3253c16d30e..5e02ca3d162 100644 --- a/src/skills/compact-format.test.ts +++ b/src/skills/compact-format.test.ts @@ -2,13 +2,13 @@ import os from "node:os"; import { formatSkillsForPrompt as upstreamFormatSkillsForPrompt } from "openclaw/plugin-sdk/agent-sessions"; import { afterEach, beforeEach, describe, expect, it } from "vitest"; import type { OpenClawConfig } from "../config/config.js"; -import { createCanonicalFixtureSkill } from "../skills.test-helpers.js"; import { restoreMockSkillsHomeEnv, setMockSkillsHomeEnv, type SkillsHomeEnvSnapshot, } from "./home-env.test-support.js"; import { formatSkillsForPrompt, type Skill } from "./skill-contract.js"; +import { createCanonicalFixtureSkill } from "./test-helpers.js"; import type { SkillEntry } from "./types.js"; import { formatSkillsCompact, diff --git a/src/agents/skills.compact-skill-paths.test.ts b/src/skills/compact-skill-paths.test.ts similarity index 94% rename from src/agents/skills.compact-skill-paths.test.ts rename to src/skills/compact-skill-paths.test.ts index fe494552349..79262caad14 100644 --- a/src/agents/skills.compact-skill-paths.test.ts +++ b/src/skills/compact-skill-paths.test.ts @@ -1,11 +1,8 @@ import os from "node:os"; import path from "node:path"; import { describe, expect, it } from "vitest"; -import { - testing as workspaceSkillsTesting, - buildWorkspaceSkillsPrompt, -} from "../skills/workspace.js"; -import { createCanonicalFixtureSkill } from "./skills.test-helpers.js"; +import { createCanonicalFixtureSkill } from "./test-helpers.js"; +import { testing as workspaceSkillsTesting, buildWorkspaceSkillsPrompt } from "./workspace.js"; describe("compactSkillPaths", () => { function buildPromptForFixtureSkill(params: { diff --git a/src/agents/skills.summarize-skill-description.test.ts b/src/skills/description-summary.test.ts similarity index 91% rename from src/agents/skills.summarize-skill-description.test.ts rename to src/skills/description-summary.test.ts index 2431777108b..0e4d30670cf 100644 --- a/src/agents/skills.summarize-skill-description.test.ts +++ b/src/skills/description-summary.test.ts @@ -1,7 +1,7 @@ import fs from "node:fs"; import path from "node:path"; import { describe, expect, it } from "vitest"; -import { parseFrontmatter } from "../skills/frontmatter.js"; +import { parseFrontmatter } from "./frontmatter.js"; describe("skills/summarize frontmatter", () => { it("mentions podcasts, local files, and transcription use cases", () => { diff --git a/src/agents/skills.e2e-test-helpers.test.ts b/src/skills/e2e-test-helpers.test.ts similarity index 97% rename from src/agents/skills.e2e-test-helpers.test.ts rename to src/skills/e2e-test-helpers.test.ts index 849878597e6..dec2a9aed34 100644 --- a/src/agents/skills.e2e-test-helpers.test.ts +++ b/src/skills/e2e-test-helpers.test.ts @@ -2,7 +2,7 @@ import fs from "node:fs/promises"; import os from "node:os"; import path from "node:path"; import { afterEach, describe, expect, it } from "vitest"; -import { writeSkill } from "./skills.e2e-test-helpers.js"; +import { writeSkill } from "./e2e-test-helpers.js"; const tempDirs: string[] = []; diff --git a/src/agents/skills.e2e-test-helpers.ts b/src/skills/e2e-test-helpers.ts similarity index 100% rename from src/agents/skills.e2e-test-helpers.ts rename to src/skills/e2e-test-helpers.ts diff --git a/src/agents/skills.env-path-guidance.test.ts b/src/skills/env-path-guidance.test.ts similarity index 100% rename from src/agents/skills.env-path-guidance.test.ts rename to src/skills/env-path-guidance.test.ts diff --git a/src/agents/skills-install.download-test-utils.ts b/src/skills/install-download-test-utils.ts similarity index 100% rename from src/agents/skills-install.download-test-utils.ts rename to src/skills/install-download-test-utils.ts diff --git a/src/agents/skills-install.download.test.ts b/src/skills/install-download.test.ts similarity index 96% rename from src/agents/skills-install.download.test.ts rename to src/skills/install-download.test.ts index 96ef1d732b0..ebb72e81527 100644 --- a/src/agents/skills-install.download.test.ts +++ b/src/skills/install-download.test.ts @@ -3,16 +3,16 @@ import os from "node:os"; import path from "node:path"; import { Readable } from "node:stream"; import { afterAll, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import { resolveSkillToolsRootDir } from "../skills/tools-dir.js"; -import type { SkillEntry, SkillInstallSpec } from "../skills/types.js"; -import { installDownloadSpec } from "./skills-install-download.js"; -import { setTempStateDir } from "./skills-install.download-test-utils.js"; +import { setTempStateDir } from "./install-download-test-utils.js"; +import { installDownloadSpec } from "./install-download.js"; import { fetchWithSsrFGuardMock, hasBinaryMock, runCommandWithTimeoutMock, -} from "./skills-install.test-mocks.js"; -import { createCanonicalFixtureSkill } from "./skills.test-helpers.js"; +} from "./install-test-mocks.js"; +import { createCanonicalFixtureSkill } from "./test-helpers.js"; +import { resolveSkillToolsRootDir } from "./tools-dir.js"; +import type { SkillEntry, SkillInstallSpec } from "./types.js"; vi.mock("../process/exec.js", () => ({ runCommandWithTimeout: (...args: unknown[]) => runCommandWithTimeoutMock(...args), @@ -22,7 +22,7 @@ vi.mock("../infra/net/fetch-guard.js", () => ({ fetchWithSsrFGuard: (...args: unknown[]) => fetchWithSsrFGuardMock(...args), })); -vi.mock("../skills/index.js", () => ({ +vi.mock("./index.js", () => ({ hasBinary: (bin: string) => hasBinaryMock(bin), })); diff --git a/src/agents/skills-install-download.ts b/src/skills/install-download.ts similarity index 96% rename from src/agents/skills-install-download.ts rename to src/skills/install-download.ts index aac83118ae2..fc3de5f0e2a 100644 --- a/src/agents/skills-install-download.ts +++ b/src/skills/install-download.ts @@ -12,13 +12,13 @@ import { fetchWithSsrFGuard } from "../infra/net/fetch-guard.js"; import { isWithinDir } from "../infra/path-safety.js"; import { createLazyImportLoader } from "../shared/lazy-promise.js"; import { normalizeOptionalLowercaseString } from "../shared/string-coerce.js"; -import type { SkillEntry, SkillInstallSpec } from "../skills/index.js"; -import { resolveSkillToolsRootDir } from "../skills/tools-dir.js"; import { ensureDir, resolveUserPath } from "../utils.js"; -import { formatInstallFailureMessage } from "./skills-install-output.js"; -import type { SkillInstallResult } from "./skills-install.types.js"; +import type { SkillEntry, SkillInstallSpec } from "./index.js"; +import { formatInstallFailureMessage } from "./install-output.js"; +import type { SkillInstallResult } from "./install-types.js"; +import { resolveSkillToolsRootDir } from "./tools-dir.js"; -const extractModuleLoader = createLazyImportLoader(() => import("./skills-install-extract.js")); +const extractModuleLoader = createLazyImportLoader(() => import("./install-extract.js")); async function loadExtractModule() { return await extractModuleLoader.load(); diff --git a/src/agents/skills-install-extract.ts b/src/skills/install-extract.ts similarity index 98% rename from src/agents/skills-install-extract.ts rename to src/skills/install-extract.ts index 975c2e209e9..b2a3e89887f 100644 --- a/src/agents/skills-install-extract.ts +++ b/src/skills/install-extract.ts @@ -10,8 +10,8 @@ import { import { formatErrorMessage } from "../infra/errors.js"; import { runCommandWithTimeout } from "../process/exec.js"; import { normalizeStringEntries } from "../shared/string-normalization.js"; -import { hasBinary } from "../skills/index.js"; -import { parseTarVerboseMetadata } from "./skills-install-tar-verbose.js"; +import { hasBinary } from "./index.js"; +import { parseTarVerboseMetadata } from "./install-tar-verbose.js"; export type ArchiveExtractResult = { stdout: string; stderr: string; code: number | null }; type TarPreflightResult = { diff --git a/src/agents/skills-install-fallback.test.ts b/src/skills/install-fallback.test.ts similarity index 95% rename from src/agents/skills-install-fallback.test.ts rename to src/skills/install-fallback.test.ts index 1a2db20ea6a..29629c438aa 100644 --- a/src/agents/skills-install-fallback.test.ts +++ b/src/skills/install-fallback.test.ts @@ -2,9 +2,9 @@ import fs from "node:fs/promises"; import os from "node:os"; import path from "node:path"; import { afterAll, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import type { SkillEntry, SkillInstallSpec } from "../skills/index.js"; import { captureEnv } from "../test-utils/env.js"; -import { hasBinaryMock, runCommandWithTimeoutMock } from "./skills-install.test-mocks.js"; +import type { SkillEntry, SkillInstallSpec } from "./index.js"; +import { hasBinaryMock, runCommandWithTimeoutMock } from "./install-test-mocks.js"; const skillsMocks = vi.hoisted(() => ({ loadWorkspaceSkillEntries: vi.fn(), @@ -18,19 +18,19 @@ vi.mock("../plugins/install-security-scan.js", () => ({ scanSkillInstallSource: vi.fn(async () => undefined), })); -vi.mock("../skills/index.js", async (importOriginal) => { - const actual = await importOriginal(); +vi.mock("./index.js", async (importOriginal) => { + const actual = await importOriginal(); return { ...actual, loadWorkspaceSkillEntries: skillsMocks.loadWorkspaceSkillEntries, }; }); -let installSkill: typeof import("./skills-install.js").installSkill; -let skillsInstallTesting: typeof import("./skills-install.js").testing; +let installSkill: typeof import("./install.js").installSkill; +let skillsInstallTesting: typeof import("./install.js").testing; async function loadSkillsInstallModulesForTest() { - ({ installSkill, testing: skillsInstallTesting } = await import("./skills-install.js")); + ({ installSkill, testing: skillsInstallTesting } = await import("./install.js")); } function makeSkillEntry( diff --git a/src/agents/skills-install-output.ts b/src/skills/install-output.ts similarity index 100% rename from src/agents/skills-install-output.ts rename to src/skills/install-output.ts diff --git a/src/agents/skills-install-tar-verbose.ts b/src/skills/install-tar-verbose.ts similarity index 100% rename from src/agents/skills-install-tar-verbose.ts rename to src/skills/install-tar-verbose.ts diff --git a/src/agents/skills-install.test-mocks.ts b/src/skills/install-test-mocks.ts similarity index 100% rename from src/agents/skills-install.test-mocks.ts rename to src/skills/install-test-mocks.ts diff --git a/src/agents/skills-install.types.ts b/src/skills/install-types.ts similarity index 100% rename from src/agents/skills-install.types.ts rename to src/skills/install-types.ts diff --git a/src/agents/skills-install.test.ts b/src/skills/install.test.ts similarity index 97% rename from src/agents/skills-install.test.ts rename to src/skills/install.test.ts index c54fef24424..01daba34842 100644 --- a/src/agents/skills-install.test.ts +++ b/src/skills/install.test.ts @@ -6,16 +6,13 @@ import { resetGlobalHookRunner, } from "../plugins/hook-runner-global.js"; import { createMockPluginRegistry } from "../plugins/hooks.test-helpers.js"; -import { resolveOpenClawMetadata, resolveSkillInvocationPolicy } from "../skills/frontmatter.js"; -import { loadSkillsFromDirSafe, readSkillFrontmatterSafe } from "../skills/local-loader.js"; -import type { SkillEntry } from "../skills/types.js"; import { captureEnv } from "../test-utils/env.js"; import { createFixtureSuite } from "../test-utils/fixture-suite.js"; -import { installSkill, testing as skillsInstallTesting } from "./skills-install.js"; -import { - runCommandWithTimeoutMock, - scanDirectoryWithSummaryMock, -} from "./skills-install.test-mocks.js"; +import { resolveOpenClawMetadata, resolveSkillInvocationPolicy } from "./frontmatter.js"; +import { runCommandWithTimeoutMock, scanDirectoryWithSummaryMock } from "./install-test-mocks.js"; +import { installSkill, testing as skillsInstallTesting } from "./install.js"; +import { loadSkillsFromDirSafe, readSkillFrontmatterSafe } from "./local-loader.js"; +import type { SkillEntry } from "./types.js"; vi.mock("../process/exec.js", () => ({ runCommandWithTimeout: (...args: unknown[]) => runCommandWithTimeoutMock(...args), @@ -25,7 +22,7 @@ vi.mock("../security/skill-scanner.js", () => ({ scanDirectoryWithSummary: (...args: unknown[]) => scanDirectoryWithSummaryMock(...args), })); -vi.mock("../skills/plugin-skills.js", () => ({ +vi.mock("./plugin-skills.js", () => ({ resolvePluginSkillDirs: () => [], })); diff --git a/src/agents/skills-install.ts b/src/skills/install.ts similarity index 98% rename from src/agents/skills-install.ts rename to src/skills/install.ts index 82da96a8c61..b28453ed1ec 100644 --- a/src/agents/skills-install.ts +++ b/src/skills/install.ts @@ -11,6 +11,7 @@ import { type SkillInstallSpecMetadata, } from "../plugins/install-security-scan.js"; import { runCommandWithTimeout, type CommandOptions } from "../process/exec.js"; +import { resolveUserPath } from "../utils.js"; import { hasBinary as defaultHasBinary, loadWorkspaceSkillEntries as defaultLoadWorkspaceSkillEntries, @@ -18,12 +19,11 @@ import { type SkillEntry, type SkillInstallSpec, type SkillsInstallPreferences, -} from "../skills/index.js"; -import { resolveSkillSource } from "../skills/source.js"; -import { resolveUserPath } from "../utils.js"; -import { installDownloadSpec } from "./skills-install-download.js"; -import { formatInstallFailureMessage } from "./skills-install-output.js"; -import type { SkillInstallResult } from "./skills-install.types.js"; +} from "./index.js"; +import { installDownloadSpec } from "./install-download.js"; +import { formatInstallFailureMessage } from "./install-output.js"; +import type { SkillInstallResult } from "./install-types.js"; +import { resolveSkillSource } from "./source.js"; export type SkillInstallRequest = InstallSafetyOverrides & { workspaceDir: string; @@ -32,7 +32,7 @@ export type SkillInstallRequest = InstallSafetyOverrides & { timeoutMs?: number; config?: OpenClawConfig; }; -export type { SkillInstallResult } from "./skills-install.types.js"; +export type { SkillInstallResult } from "./install-types.js"; type SkillsInstallDeps = { hasBinary: (bin: string) => boolean; diff --git a/src/agents/skills.plugin-skills-sandbox-sync.test.ts b/src/skills/plugin-sandbox-sync.test.ts similarity index 98% rename from src/agents/skills.plugin-skills-sandbox-sync.test.ts rename to src/skills/plugin-sandbox-sync.test.ts index 4d22d804506..67feb86cb63 100644 --- a/src/agents/skills.plugin-skills-sandbox-sync.test.ts +++ b/src/skills/plugin-sandbox-sync.test.ts @@ -3,13 +3,13 @@ import fsPromises from "node:fs/promises"; import os from "node:os"; import path from "node:path"; import { afterAll, beforeAll, describe, expect, it, vi } from "vitest"; -import { buildWorkspaceSkillsPrompt, syncSkillsToWorkspace } from "../skills/workspace.js"; -import { writeSkill } from "./skills.e2e-test-helpers.js"; +import { writeSkill } from "./e2e-test-helpers.js"; +import { buildWorkspaceSkillsPrompt, syncSkillsToWorkspace } from "./workspace.js"; // Mock resolvePluginSkillDirs to return our test plugin skill directories const mockResolvePluginSkillDirs = vi.hoisted(() => vi.fn(() => [] as string[])); -vi.mock("../skills/plugin-skills.js", () => ({ +vi.mock("./plugin-skills.js", () => ({ resolvePluginSkillDirs: mockResolvePluginSkillDirs, })); diff --git a/src/agents/skills.resolveskillspromptforrun.test.ts b/src/skills/prompt-resolution.test.ts similarity index 95% rename from src/agents/skills.resolveskillspromptforrun.test.ts rename to src/skills/prompt-resolution.test.ts index 28f4fed8ed4..53884a1859b 100644 --- a/src/agents/skills.resolveskillspromptforrun.test.ts +++ b/src/skills/prompt-resolution.test.ts @@ -1,7 +1,7 @@ import { describe, expect, it } from "vitest"; -import type { SkillEntry } from "../skills/types.js"; -import { resolveSkillsPromptForRun } from "../skills/workspace.js"; -import { createCanonicalFixtureSkill } from "./skills.test-helpers.js"; +import { createCanonicalFixtureSkill } from "./test-helpers.js"; +import type { SkillEntry } from "./types.js"; +import { resolveSkillsPromptForRun } from "./workspace.js"; describe("resolveSkillsPromptForRun", () => { it("prefers snapshot prompt when available", () => { diff --git a/src/skills/service.test.ts b/src/skills/service.test.ts index cff4878447e..1850c4f0879 100644 --- a/src/skills/service.test.ts +++ b/src/skills/service.test.ts @@ -2,7 +2,7 @@ import fs from "node:fs/promises"; import os from "node:os"; import path from "node:path"; import { afterEach, describe, expect, it } from "vitest"; -import { writeWorkspaceSkills } from "../agents/skills.e2e-test-helpers.js"; +import { writeWorkspaceSkills } from "./e2e-test-helpers.js"; import { SkillsService } from "./service.js"; import { buildWorkspaceSkillSnapshot as buildLegacyWorkspaceSkillSnapshot } from "./workspace.js"; diff --git a/src/agents/skills.sherpa-onnx-tts-bin.test.ts b/src/skills/sherpa-onnx-tts-bin.test.ts similarity index 100% rename from src/agents/skills.sherpa-onnx-tts-bin.test.ts rename to src/skills/sherpa-onnx-tts-bin.test.ts diff --git a/src/agents/test-helpers/skill-plugin-fixtures.ts b/src/skills/skill-plugin-fixtures.test-support.ts similarity index 100% rename from src/agents/test-helpers/skill-plugin-fixtures.ts rename to src/skills/skill-plugin-fixtures.test-support.ts diff --git a/src/agents/skills.test.ts b/src/skills/skills.test.ts similarity index 98% rename from src/agents/skills.test.ts rename to src/skills/skills.test.ts index e41d72c4404..01f067b3a29 100644 --- a/src/agents/skills.test.ts +++ b/src/skills/skills.test.ts @@ -7,25 +7,25 @@ import { } from "../config/runtime-snapshot.js"; import type { OpenClawConfig } from "../config/types.openclaw.js"; import { clearPluginMetadataLifecycleCaches } from "../plugins/plugin-metadata-lifecycle.js"; -import { buildWorkspaceSkillCommandSpecs } from "../skills/command-specs.js"; import { captureEnv, withPathResolutionEnv } from "../test-utils/env.js"; import { createFixtureSuite } from "../test-utils/fixture-suite.js"; import { createTempHomeEnv, type TempHomeEnv } from "../test-utils/temp-home.js"; -import { writeSkill } from "./skills.e2e-test-helpers.js"; +import { buildWorkspaceSkillCommandSpecs } from "./command-specs.js"; +import { writeSkill } from "./e2e-test-helpers.js"; import { applySkillEnvOverrides, applySkillEnvOverridesFromSnapshot, getActiveSkillEnvKeys, -} from "../skills/env-overrides.js"; +} from "./env-overrides.js"; import { restoreMockSkillsHomeEnv, setMockSkillsHomeEnv, type SkillsHomeEnvSnapshot, -} from "../skills/home-env.test-support.js"; -import type { SkillEntry, SkillSnapshot } from "../skills/types.js"; -import { buildWorkspaceSkillsPrompt } from "../skills/workspace.js"; +} from "./home-env.test-support.js"; +import type { SkillEntry, SkillSnapshot } from "./types.js"; +import { buildWorkspaceSkillsPrompt } from "./workspace.js"; -vi.mock("../skills/plugin-skills.js", () => ({ +vi.mock("./plugin-skills.js", () => ({ resolvePluginSkillDirs: () => [], })); diff --git a/src/agents/skills-source-install.test.ts b/src/skills/source-install.test.ts similarity index 98% rename from src/agents/skills-source-install.test.ts rename to src/skills/source-install.test.ts index 1eba447504c..b844a6b8631 100644 --- a/src/agents/skills-source-install.test.ts +++ b/src/skills/source-install.test.ts @@ -3,8 +3,8 @@ import path from "node:path"; import { describe, expect, it } from "vitest"; import { runCommandWithTimeout } from "../process/exec.js"; import { withTempDir } from "../test-helpers/temp-dir.js"; -import { installSkillFromSource } from "./skills-source-install.js"; -import { buildWorkspaceSkillStatus } from "./skills-status.js"; +import { installSkillFromSource } from "./source-install.js"; +import { buildWorkspaceSkillStatus } from "./status.js"; async function writeSkill(dir: string, params: { name?: string; description?: string } = {}) { await fs.mkdir(dir, { recursive: true }); diff --git a/src/agents/skills-source-install.ts b/src/skills/source-install.ts similarity index 98% rename from src/agents/skills-source-install.ts rename to src/skills/source-install.ts index 7da8995a988..7d051791706 100644 --- a/src/agents/skills-source-install.ts +++ b/src/skills/source-install.ts @@ -7,11 +7,11 @@ import { writeJson } from "../infra/json-files.js"; import { parseGitPluginSpec } from "../plugins/git-install.js"; import { runCommandWithTimeout } from "../process/exec.js"; import { normalizeOptionalString } from "../shared/string-coerce.js"; -import { parseFrontmatter } from "../skills/frontmatter.js"; import { sanitizeForLog } from "../terminal/ansi.js"; import { resolveUserPath } from "../utils.js"; -import { installExtractedSkillRoot, validateRequestedSkillSlug } from "./skills-archive-install.js"; -import { untrackClawHubSkill } from "./skills-clawhub.js"; +import { installExtractedSkillRoot, validateRequestedSkillSlug } from "./archive-install.js"; +import { untrackClawHubSkill } from "./clawhub.js"; +import { parseFrontmatter } from "./frontmatter.js"; type Logger = { info?: (message: string) => void; diff --git a/src/agents/skills.buildworkspaceskillstatus.test.ts b/src/skills/status-workspace.test.ts similarity index 96% rename from src/agents/skills.buildworkspaceskillstatus.test.ts rename to src/skills/status-workspace.test.ts index 69b1030afcf..d4c01e7a320 100644 --- a/src/agents/skills.buildworkspaceskillstatus.test.ts +++ b/src/skills/status-workspace.test.ts @@ -2,12 +2,12 @@ import fs from "node:fs/promises"; import os from "node:os"; import path from "node:path"; import { afterEach, describe, expect, it } from "vitest"; -import type { SkillEntry } from "../skills/types.js"; -import { loadWorkspaceSkillEntries } from "../skills/workspace.js"; import { withEnv, withEnvAsync } from "../test-utils/env.js"; -import { buildWorkspaceSkillStatus } from "./skills-status.js"; -import { writeSkill } from "./skills.e2e-test-helpers.js"; -import { createCanonicalFixtureSkill } from "./skills.test-helpers.js"; +import { writeSkill } from "./e2e-test-helpers.js"; +import { buildWorkspaceSkillStatus } from "./status.js"; +import { createCanonicalFixtureSkill } from "./test-helpers.js"; +import type { SkillEntry } from "./types.js"; +import { loadWorkspaceSkillEntries } from "./workspace.js"; const tempDirs: string[] = []; diff --git a/src/agents/skills-status.test.ts b/src/skills/status.test.ts similarity index 98% rename from src/agents/skills-status.test.ts rename to src/skills/status.test.ts index b637b74fbd1..15a679ca37c 100644 --- a/src/agents/skills-status.test.ts +++ b/src/skills/status.test.ts @@ -2,10 +2,10 @@ import fs from "node:fs/promises"; import os from "node:os"; import path from "node:path"; import { describe, expect, it } from "vitest"; -import type { SkillEntry } from "../skills/types.js"; -import { readLocalSkillCardContentSync } from "./skills-clawhub.js"; -import { buildWorkspaceSkillStatus } from "./skills-status.js"; -import { createCanonicalFixtureSkill } from "./skills.test-helpers.js"; +import { readLocalSkillCardContentSync } from "./clawhub.js"; +import { buildWorkspaceSkillStatus } from "./status.js"; +import { createCanonicalFixtureSkill } from "./test-helpers.js"; +import type { SkillEntry } from "./types.js"; type SkillStatus = ReturnType["skills"][number]; diff --git a/src/agents/skills-status.ts b/src/skills/status.ts similarity index 97% rename from src/agents/skills-status.ts rename to src/skills/status.ts index 27321215ad6..f97a623e084 100644 --- a/src/agents/skills-status.ts +++ b/src/skills/status.ts @@ -2,8 +2,17 @@ import path from "node:path"; import type { OpenClawConfig } from "../config/types.openclaw.js"; import { evaluateEntryRequirementsForCurrentPlatform } from "../shared/entry-status.js"; import type { RequirementConfigCheck, Requirements } from "../shared/requirements.js"; -import { resolveEffectiveAgentSkillFilter } from "../skills/agent-filter.js"; -import { resolveBundledSkillsContext } from "../skills/bundled-context.js"; +import { CONFIG_DIR } from "../utils.js"; +import { resolveEffectiveAgentSkillFilter } from "./agent-filter.js"; +import { resolveBundledSkillsContext } from "./bundled-context.js"; +import { + readClawHubSkillsLockfileStatusSync, + resolveClawHubSkillStatusLinkSync, + resolveLocalSkillCardStatusSync, + type ClawHubSkillStatusLink, + type ClawHubSkillsLockfileStatusRead, + type LocalSkillCardStatus, +} from "./clawhub.js"; import { hasBinary, isBundledSkillAllowed, @@ -16,17 +25,8 @@ import { type SkillEligibilityContext, type SkillInstallSpec, type SkillsInstallPreferences, -} from "../skills/index.js"; -import { resolveSkillSource } from "../skills/source.js"; -import { CONFIG_DIR } from "../utils.js"; -import { - readClawHubSkillsLockfileStatusSync, - resolveClawHubSkillStatusLinkSync, - resolveLocalSkillCardStatusSync, - type ClawHubSkillStatusLink, - type ClawHubSkillsLockfileStatusRead, - type LocalSkillCardStatus, -} from "./skills-clawhub.js"; +} from "./index.js"; +import { resolveSkillSource } from "./source.js"; export type SkillStatusConfigCheck = RequirementConfigCheck; diff --git a/src/agents/skills.test-helpers.ts b/src/skills/test-helpers.ts similarity index 92% rename from src/agents/skills.test-helpers.ts rename to src/skills/test-helpers.ts index a22b2f7000a..b7a01610963 100644 --- a/src/agents/skills.test-helpers.ts +++ b/src/skills/test-helpers.ts @@ -1,6 +1,6 @@ import fs from "node:fs/promises"; import path from "node:path"; -import { createSyntheticSourceInfo, type Skill } from "../skills/skill-contract.js"; +import { createSyntheticSourceInfo, type Skill } from "./skill-contract.js"; export async function writeSkill(params: { dir: string; diff --git a/src/agents/skills.build-workspace-skills-prompt.applies-bundled-allowlist-without-affecting-workspace-skills.test.ts b/src/skills/workspace-bundled-allowlist.test.ts similarity index 92% rename from src/agents/skills.build-workspace-skills-prompt.applies-bundled-allowlist-without-affecting-workspace-skills.test.ts rename to src/skills/workspace-bundled-allowlist.test.ts index 0bc74c597fe..f50fe62210e 100644 --- a/src/agents/skills.build-workspace-skills-prompt.applies-bundled-allowlist-without-affecting-workspace-skills.test.ts +++ b/src/skills/workspace-bundled-allowlist.test.ts @@ -2,9 +2,9 @@ import fs from "node:fs/promises"; import os from "node:os"; import path from "node:path"; import { describe, expect, it } from "vitest"; -import { buildWorkspaceSkillsPrompt } from "../skills/workspace.js"; import { captureEnv } from "../test-utils/env.js"; -import { writeSkill } from "./skills.e2e-test-helpers.js"; +import { writeSkill } from "./e2e-test-helpers.js"; +import { buildWorkspaceSkillsPrompt } from "./workspace.js"; describe("buildWorkspaceSkillsPrompt", () => { it("applies bundled allowlist without affecting workspace skills", async () => { diff --git a/src/agents/skills.loadworkspaceskillentries.test.ts b/src/skills/workspace-load.test.ts similarity index 99% rename from src/agents/skills.loadworkspaceskillentries.test.ts rename to src/skills/workspace-load.test.ts index de3bf979f83..004220ec04f 100644 --- a/src/agents/skills.loadworkspaceskillentries.test.ts +++ b/src/skills/workspace-load.test.ts @@ -13,15 +13,15 @@ import { import { resolveInstalledPluginIndexPolicyHash } from "../plugins/installed-plugin-index-policy.js"; import type { PluginManifestRecord, PluginManifestRegistry } from "../plugins/manifest-registry.js"; import type { PluginMetadataSnapshot } from "../plugins/plugin-metadata-snapshot.js"; +import { writeSkill, writeWorkspaceSkills } from "./e2e-test-helpers.js"; import { restoreMockSkillsHomeEnv, setMockSkillsHomeEnv, type SkillsHomeEnvSnapshot, -} from "../skills/home-env.test-support.js"; -import { readSkillFrontmatterSafe } from "../skills/local-loader.js"; -import { loadWorkspaceSkillEntries } from "../skills/workspace.js"; -import { writeSkill, writeWorkspaceSkills } from "./skills.e2e-test-helpers.js"; -import { writePluginWithSkill } from "./test-helpers/skill-plugin-fixtures.js"; +} from "./home-env.test-support.js"; +import { readSkillFrontmatterSafe } from "./local-loader.js"; +import { writePluginWithSkill } from "./skill-plugin-fixtures.test-support.js"; +import { loadWorkspaceSkillEntries } from "./workspace.js"; vi.mock("../plugins/manifest-registry.js", async () => { const fs = await import("node:fs"); diff --git a/src/agents/skills.build-workspace-skills-prompt.prefers-workspace-skills-managed-skills.test.ts b/src/skills/workspace-precedence.test.ts similarity index 94% rename from src/agents/skills.build-workspace-skills-prompt.prefers-workspace-skills-managed-skills.test.ts rename to src/skills/workspace-precedence.test.ts index a96c7eb6995..c78033fe3df 100644 --- a/src/agents/skills.build-workspace-skills-prompt.prefers-workspace-skills-managed-skills.test.ts +++ b/src/skills/workspace-precedence.test.ts @@ -1,13 +1,13 @@ import path from "node:path"; import { afterAll, beforeAll, describe, expect, it, vi } from "vitest"; -import { createSyntheticSourceInfo } from "../skills/skill-contract.js"; -import type { OpenClawSkillMetadata, SkillEntry } from "../skills/types.js"; -import { buildWorkspaceSkillsPrompt } from "../skills/workspace.js"; import { withEnv } from "../test-utils/env.js"; import { createFixtureSuite } from "../test-utils/fixture-suite.js"; -import { writeSkill } from "./skills.e2e-test-helpers.js"; +import { writeSkill } from "./e2e-test-helpers.js"; +import { createSyntheticSourceInfo } from "./skill-contract.js"; +import type { OpenClawSkillMetadata, SkillEntry } from "./types.js"; +import { buildWorkspaceSkillsPrompt } from "./workspace.js"; -vi.mock("../skills/plugin-skills.js", () => ({ +vi.mock("./plugin-skills.js", () => ({ resolvePluginSkillDirs: () => [], })); diff --git a/src/agents/skills.buildworkspaceskillsnapshot.test.ts b/src/skills/workspace-snapshot.test.ts similarity index 98% rename from src/agents/skills.buildworkspaceskillsnapshot.test.ts rename to src/skills/workspace-snapshot.test.ts index 9fe11002d62..7576a885493 100644 --- a/src/agents/skills.buildworkspaceskillsnapshot.test.ts +++ b/src/skills/workspace-snapshot.test.ts @@ -1,18 +1,18 @@ import fs from "node:fs/promises"; import path from "node:path"; import { afterAll, beforeAll, describe, expect, it, vi } from "vitest"; +import { withPathResolutionEnv } from "../test-utils/env.js"; +import { createFixtureSuite } from "../test-utils/fixture-suite.js"; +import { createTempHomeEnv, type TempHomeEnv } from "../test-utils/temp-home.js"; +import { writeSkill, writeWorkspaceSkills } from "./e2e-test-helpers.js"; import { restoreMockSkillsHomeEnv, setMockSkillsHomeEnv, type SkillsHomeEnvSnapshot, -} from "../skills/home-env.test-support.js"; -import { buildWorkspaceSkillSnapshot, buildWorkspaceSkillsPrompt } from "../skills/workspace.js"; -import { withPathResolutionEnv } from "../test-utils/env.js"; -import { createFixtureSuite } from "../test-utils/fixture-suite.js"; -import { createTempHomeEnv, type TempHomeEnv } from "../test-utils/temp-home.js"; -import { writeSkill, writeWorkspaceSkills } from "./skills.e2e-test-helpers.js"; +} from "./home-env.test-support.js"; +import { buildWorkspaceSkillSnapshot, buildWorkspaceSkillsPrompt } from "./workspace.js"; -vi.mock("../skills/plugin-skills.js", () => ({ +vi.mock("./plugin-skills.js", () => ({ resolvePluginSkillDirs: () => [], })); diff --git a/src/agents/skills.build-workspace-skills-prompt.syncs-merged-skills-into-target-workspace.test.ts b/src/skills/workspace-sync.test.ts similarity index 99% rename from src/agents/skills.build-workspace-skills-prompt.syncs-merged-skills-into-target-workspace.test.ts rename to src/skills/workspace-sync.test.ts index bfe57f76c1b..7da6973c7f8 100644 --- a/src/agents/skills.build-workspace-skills-prompt.syncs-merged-skills-into-target-workspace.test.ts +++ b/src/skills/workspace-sync.test.ts @@ -2,11 +2,11 @@ import fs from "node:fs/promises"; import os from "node:os"; import path from "node:path"; import { afterAll, beforeAll, describe, expect, it, vi } from "vitest"; -import { buildWorkspaceSkillsPrompt, syncSkillsToWorkspace } from "../skills/workspace.js"; import { withEnv, withEnvAsync } from "../test-utils/env.js"; -import { writeSkill } from "./skills.e2e-test-helpers.js"; +import { writeSkill } from "./e2e-test-helpers.js"; +import { buildWorkspaceSkillsPrompt, syncSkillsToWorkspace } from "./workspace.js"; -vi.mock("../skills/plugin-skills.js", () => ({ +vi.mock("./plugin-skills.js", () => ({ resolvePluginSkillDirs: () => [], }));