skillmux 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/commands/agents.ts","../src/config/resolve-skillmux-home.ts","../src/discovery/discover-agents.ts","../src/config/default-agent-rules.ts","../src/config/load-user-config.ts","../src/core/errors.ts","../src/output/print-json.ts","../src/output/print-table.ts","../src/commands/config.ts","../src/commands/doctor.ts","../src/discovery/scan-agent-skills.ts","../src/discovery/infer-skill-entry.ts","../src/fs/path-utils.ts","../src/manifest/read-manifest.ts","../src/manifest/build-empty-manifest.ts","../src/manifest/manifest-schema.ts","../src/core/ids.ts","../src/manifest/write-manifest.ts","../src/commands/disable.ts","../src/fs/link-ops.ts","../src/fs/safe-remove-link.ts","../src/commands/enable.ts","../src/commands/import.ts","../src/fs/safe-copy.ts","../src/commands/scan.ts","../src/output/format-issue.ts","../src/commands/list.ts","../src/cli.ts"],"sourcesContent":["import { Command } from \"commander\";\r\nimport { runAgents } from \"./commands/agents\";\r\nimport { runConfig } from \"./commands/config\";\r\nimport { runDoctor } from \"./commands/doctor\";\r\nimport { runDisable } from \"./commands/disable\";\r\nimport { runEnable } from \"./commands/enable\";\r\nimport { runImport } from \"./commands/import\";\r\nimport { runList } from \"./commands/list\";\r\nimport { runScan } from \"./commands/scan\";\r\n\r\nexport function buildCli(): Command {\r\n const program = new Command();\r\n program.name(\"skillmux\");\r\n\r\n program\r\n .command(\"scan\")\r\n .option(\"--json\", \"Emit structured JSON output\")\r\n .action(async (options: { json?: boolean }) => {\r\n const result = await runScan({ json: options.json === true });\r\n process.stdout.write(result.output);\r\n });\r\n\r\n program\r\n .command(\"agents\")\r\n .option(\"--json\", \"Emit structured JSON output\")\r\n .action(async (options: { json?: boolean }) => {\r\n const result = await runAgents({ json: options.json === true });\r\n process.stdout.write(result.output);\r\n });\r\n\r\n program\r\n .command(\"list\")\r\n .option(\"--view <view>\", \"Select records, agents, or skills view\", \"records\")\r\n .option(\"--format <format>\", \"Select table or json output\", \"table\")\r\n .action(async (options: { view?: \"records\" | \"agents\" | \"skills\"; format?: \"table\" | \"json\" }) => {\r\n const result = await runList({\r\n view: options.view,\r\n format: options.format\r\n });\r\n process.stdout.write(result.output);\r\n });\r\n\r\n program\r\n .command(\"import\")\r\n .requiredOption(\"--source <path>\", \"Local skill source directory\")\r\n .requiredOption(\"--name <name>\", \"Managed skill name\")\r\n .action(async (options: { source: string; name: string }) => {\r\n const result = await runImport({\r\n sourcePath: options.source,\r\n skillName: options.name\r\n });\r\n process.stdout.write(result.output);\r\n });\r\n\r\n program\r\n .command(\"doctor\")\r\n .option(\"--json\", \"Emit structured JSON output\")\r\n .action(async (options: { json?: boolean }) => {\r\n const result = await runDoctor({ json: options.json === true });\r\n process.stdout.write(result.output);\r\n });\r\n\r\n program\r\n .command(\"config\")\r\n .option(\"--json\", \"Emit structured JSON output\")\r\n .action(async (options: { json?: boolean }) => {\r\n const result = await runConfig({ json: options.json === true });\r\n process.stdout.write(result.output);\r\n });\r\n\r\n program\r\n .command(\"enable\")\r\n .requiredOption(\"--skill <skill>\", \"Managed skill name or id\")\r\n .requiredOption(\"--agent <agent>\", \"Target agent id\")\r\n .action(async (options: { skill: string; agent: string }) => {\r\n const result = await runEnable({\r\n skill: options.skill,\r\n agent: options.agent\r\n });\r\n process.stdout.write(result.output);\r\n });\r\n\r\n program\r\n .command(\"disable\")\r\n .requiredOption(\"--skill <skill>\", \"Managed skill name or id\")\r\n .requiredOption(\"--agent <agent>\", \"Target agent id\")\r\n .action(async (options: { skill: string; agent: string }) => {\r\n const result = await runDisable({\r\n skill: options.skill,\r\n agent: options.agent\r\n });\r\n process.stdout.write(result.output);\r\n });\r\n\r\n return program;\r\n}\r\n","import { homedir } from \"node:os\";\r\nimport { resolveSkillmuxHome } from \"../config/resolve-skillmux-home\";\r\nimport {\r\n discoverAgents,\r\n type DiscoveredAgent\r\n} from \"../discovery/discover-agents\";\r\nimport { printJson } from \"../output/print-json\";\r\nimport { printTable } from \"../output/print-table\";\r\n\r\nexport type RunAgentsOptions = {\r\n homeDir?: string;\r\n skillmuxHome?: string;\r\n platform?: NodeJS.Platform;\r\n json?: boolean;\r\n};\r\n\r\nexport type RunAgentsResult = {\r\n agents: DiscoveredAgent[];\r\n output: string;\r\n};\r\n\r\nfunction buildTableOutput(agents: DiscoveredAgent[]): string {\r\n return printTable(\r\n agents.map((agent) => ({\r\n id: agent.id,\r\n name: agent.stableName,\r\n path: agent.absoluteSkillsDirectoryPath,\r\n exists: String(agent.exists),\r\n supported: String(agent.supportedOnPlatform),\r\n discovery: agent.discovery\r\n })),\r\n [\r\n { key: \"id\", label: \"Agent\" },\r\n { key: \"name\", label: \"Name\" },\r\n { key: \"path\", label: \"Path\" },\r\n { key: \"exists\", label: \"Exists\" },\r\n { key: \"supported\", label: \"Supported\" },\r\n { key: \"discovery\", label: \"Discovery\" }\r\n ]\r\n );\r\n}\r\n\r\nexport async function runAgents(\r\n options: RunAgentsOptions = {}\r\n): Promise<RunAgentsResult> {\r\n const homeDir = options.homeDir ?? homedir();\r\n const resolvedPaths = resolveSkillmuxHome(homeDir);\r\n const skillmuxHome = options.skillmuxHome ?? resolvedPaths.skillmuxHome;\r\n const agents = await discoverAgents({\r\n homeDir,\r\n skillmuxHome,\r\n platform: options.platform\r\n });\r\n\r\n return {\r\n agents,\r\n output:\r\n options.json === true\r\n ? printJson(agents)\r\n : buildTableOutput(agents)\r\n };\r\n}\r\n","import { join, resolve } from \"node:path\";\n\nexport type SkillmuxHomeResolution = {\n skillmuxHome: string;\n configPath: string;\n};\n\nexport function buildConfigPath(skillmuxHome: string): string {\n return join(resolve(skillmuxHome), \"config.json\");\n}\n\nexport function resolveSkillmuxHome(homeDir: string): SkillmuxHomeResolution {\n const resolvedHomeDir = resolve(homeDir);\n const skillmuxHome = join(resolvedHomeDir, \".skillmux\");\n\n return {\n skillmuxHome,\n configPath: buildConfigPath(skillmuxHome)\n };\n}\n","import * as fs from \"node:fs/promises\";\nimport { join, resolve } from \"node:path\";\nimport {\n builtInAgentIds,\n defaultAgentRuleMap,\n supportedPlatforms,\n type AgentRule,\n type BuiltInAgentId,\n type SupportedPlatform\n} from \"../config/default-agent-rules\";\nimport { loadUserConfig, type AgentOverride } from \"../config/load-user-config\";\nimport { resolveSkillmuxHome } from \"../config/resolve-skillmux-home\";\n\nexport type DiscoveredAgent = AgentRule & {\n absoluteRootPath: string;\n absoluteSkillsDirectoryPath: string;\n exists: boolean;\n supportedOnPlatform: boolean;\n};\n\nexport type DiscoverAgentsOptions = {\n homeDir: string;\n platform?: NodeJS.Platform;\n skillmuxHome?: string;\n};\n\nfunction mergeRule(rule: AgentRule, override?: AgentOverride): AgentRule {\n if (override === undefined) {\n return rule;\n }\n\n return {\n ...rule,\n ...override\n };\n}\n\nfunction buildCustomRule(id: string, override: AgentOverride): AgentRule {\n if (\n override.homeRelativeRootPath === undefined ||\n override.skillsDirectoryPath === undefined\n ) {\n throw new Error(\n `Custom agent override \"${id}\" must define homeRelativeRootPath and skillsDirectoryPath`\n );\n }\n\n return {\n id,\n stableName: override.stableName ?? id,\n supportedPlatforms: override.supportedPlatforms ?? [...supportedPlatforms],\n homeRelativeRootPath: override.homeRelativeRootPath,\n skillsDirectoryPath: override.skillsDirectoryPath,\n enabledByDefault: override.enabledByDefault ?? true,\n discovery: \"custom\"\n };\n}\n\nasync function pathExists(path: string): Promise<boolean> {\n try {\n await fs.access(path);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction resolveAgentRulePaths(homeDir: string, rule: AgentRule): {\n absoluteRootPath: string;\n absoluteSkillsDirectoryPath: string;\n} {\n const absoluteRootPath = resolve(homeDir, rule.homeRelativeRootPath);\n\n return {\n absoluteRootPath,\n absoluteSkillsDirectoryPath: join(\n absoluteRootPath,\n rule.skillsDirectoryPath\n )\n };\n}\n\nexport async function discoverAgents(\n options: DiscoverAgentsOptions\n): Promise<DiscoveredAgent[]> {\n const platform = options.platform ?? process.platform;\n const homeDir = resolve(options.homeDir);\n const skillmuxHome =\n options.skillmuxHome ?? resolveSkillmuxHome(homeDir).skillmuxHome;\n const userConfig = await loadUserConfig(skillmuxHome);\n\n const discoveredAgents: DiscoveredAgent[] = [];\n\n for (const agentId of builtInAgentIds) {\n const mergedRule = mergeRule(\n defaultAgentRuleMap[agentId as BuiltInAgentId],\n userConfig.agents[agentId]\n );\n const resolvedPaths = resolveAgentRulePaths(homeDir, mergedRule);\n\n discoveredAgents.push({\n ...mergedRule,\n ...resolvedPaths,\n exists: await pathExists(resolvedPaths.absoluteSkillsDirectoryPath),\n supportedOnPlatform: mergedRule.supportedPlatforms.some(\n (supportedPlatform) => supportedPlatform === platform\n )\n });\n }\n\n for (const [agentId, override] of Object.entries(userConfig.agents)) {\n if (Object.hasOwn(defaultAgentRuleMap, agentId)) {\n continue;\n }\n\n const customRule = buildCustomRule(agentId, override);\n const resolvedPaths = resolveAgentRulePaths(homeDir, customRule);\n\n discoveredAgents.push({\n ...customRule,\n ...resolvedPaths,\n exists: await pathExists(resolvedPaths.absoluteSkillsDirectoryPath),\n supportedOnPlatform: customRule.supportedPlatforms.some(\n (supportedPlatform) => supportedPlatform === platform\n )\n });\n }\n\n return discoveredAgents;\n}\n","export const supportedPlatforms = [\"win32\", \"linux\", \"darwin\"] as const;\n\nexport type SupportedPlatform = (typeof supportedPlatforms)[number];\n\nexport const builtInAgentIds = [\n \"codex\",\n \"claude\",\n \"gemini\",\n \"agents\",\n \"openclaw\"\n] as const;\n\nexport type BuiltInAgentId = (typeof builtInAgentIds)[number];\n\nexport type AgentRule = {\n id: string;\n stableName: string;\n supportedPlatforms: SupportedPlatform[];\n homeRelativeRootPath: string;\n skillsDirectoryPath: string;\n enabledByDefault: boolean;\n discovery: \"builtin\" | \"custom\";\n};\n\nexport const defaultAgentRules: AgentRule[] = [\n {\n id: \"codex\",\n stableName: \"OpenAI Codex\",\n supportedPlatforms: [...supportedPlatforms],\n homeRelativeRootPath: \".codex\",\n skillsDirectoryPath: \"skills\",\n enabledByDefault: true,\n discovery: \"builtin\"\n },\n {\n id: \"claude\",\n stableName: \"Claude Code\",\n supportedPlatforms: [...supportedPlatforms],\n homeRelativeRootPath: \".claude\",\n skillsDirectoryPath: \"skills\",\n enabledByDefault: true,\n discovery: \"builtin\"\n },\n {\n id: \"gemini\",\n stableName: \"Gemini CLI\",\n supportedPlatforms: [...supportedPlatforms],\n homeRelativeRootPath: \".gemini\",\n skillsDirectoryPath: \"skills\",\n enabledByDefault: true,\n discovery: \"builtin\"\n },\n {\n id: \"agents\",\n stableName: \"Agents\",\n supportedPlatforms: [...supportedPlatforms],\n homeRelativeRootPath: \".agents\",\n skillsDirectoryPath: \"skills\",\n enabledByDefault: true,\n discovery: \"builtin\"\n },\n {\n id: \"openclaw\",\n stableName: \"OpenClaw\",\n supportedPlatforms: [...supportedPlatforms],\n homeRelativeRootPath: \".openclaw\",\n skillsDirectoryPath: \"skills\",\n enabledByDefault: true,\n discovery: \"builtin\"\n }\n];\n\nexport const defaultAgentRuleMap = Object.fromEntries(\n defaultAgentRules.map((rule) => [rule.id, rule])\n) as Record<BuiltInAgentId, AgentRule>;\n","import * as fs from \"node:fs/promises\";\r\nimport { z } from \"zod\";\r\nimport { UserConfigValidationError } from \"../core/errors\";\r\nimport {\r\n supportedPlatforms,\r\n type SupportedPlatform\r\n} from \"./default-agent-rules\";\r\nimport { buildConfigPath } from \"./resolve-skillmux-home\";\r\n\r\nconst supportedPlatformSchema = z.enum(supportedPlatforms);\r\n\r\nconst agentOverrideSchema = z\r\n .object({\r\n stableName: z.string().min(1).optional(),\r\n supportedPlatforms: z.array(supportedPlatformSchema).min(1).optional(),\r\n homeRelativeRootPath: z.string().min(1).optional(),\r\n skillsDirectoryPath: z.string().min(1).optional(),\r\n enabledByDefault: z.boolean().optional()\r\n })\r\n .strict();\r\n\r\nexport const userConfigSchema = z\r\n .object({\r\n version: z.literal(1),\r\n agents: z.record(z.string().min(1), agentOverrideSchema)\r\n })\r\n .strict();\r\n\r\nexport type AgentOverride = {\r\n stableName?: string;\r\n supportedPlatforms?: SupportedPlatform[];\r\n homeRelativeRootPath?: string;\r\n skillsDirectoryPath?: string;\r\n enabledByDefault?: boolean;\r\n};\r\n\r\nexport type UserConfig = {\r\n version: 1;\r\n agents: Record<string, AgentOverride>;\r\n};\r\n\r\nfunction createEmptyUserConfig(): UserConfig {\r\n return {\r\n version: 1,\r\n agents: {}\r\n };\r\n}\r\n\r\nfunction formatValidationIssues(error: { issues: Array<{ path: (string | number)[]; message: string }> }): string {\r\n return error.issues\r\n .map((issue) => {\r\n const path = issue.path.length > 0 ? issue.path.join(\".\") : \"<root>\";\r\n return `${path}: ${issue.message}`;\r\n })\r\n .join(\"; \");\r\n}\r\n\r\nexport async function loadUserConfig(skillmuxHome: string): Promise<UserConfig> {\r\n const configPath = buildConfigPath(skillmuxHome);\r\n\r\n try {\r\n const contents = await fs.readFile(configPath, \"utf8\");\r\n const parsed = JSON.parse(contents) as unknown;\r\n const validated = userConfigSchema.safeParse(parsed);\r\n\r\n if (!validated.success) {\r\n throw new UserConfigValidationError(\r\n `Invalid config at ${configPath}: ${formatValidationIssues(validated.error)}`\r\n );\r\n }\r\n\r\n return validated.data;\r\n } catch (error) {\r\n if (\r\n typeof error === \"object\" &&\r\n error !== null &&\r\n \"code\" in error &&\r\n (error as NodeJS.ErrnoException).code === \"ENOENT\"\r\n ) {\r\n return createEmptyUserConfig();\r\n }\r\n\r\n if (error instanceof SyntaxError) {\r\n throw new UserConfigValidationError(\r\n `Invalid config at ${configPath}: malformed JSON`\r\n );\r\n }\r\n\r\n throw error;\r\n }\r\n}\r\n","export class SkillMuxError extends Error {\r\n constructor(message: string) {\r\n super(message);\r\n this.name = new.target.name;\r\n }\r\n}\r\n\r\nexport class InvalidIdentifierError extends SkillMuxError {\r\n constructor(\r\n public readonly kind: string,\r\n public readonly value: string\r\n ) {\r\n super(`Invalid ${kind}: ${value}`);\r\n }\r\n}\r\n\r\nexport class ManifestValidationError extends SkillMuxError {\r\n constructor(message: string) {\r\n super(message);\r\n }\r\n}\r\n\r\nexport class UserConfigValidationError extends SkillMuxError {\r\n constructor(message: string) {\r\n super(message);\r\n }\r\n}\r\n","export function printJson(value: unknown): string {\r\n return `${JSON.stringify(value, null, 2)}\\n`;\r\n}\r\n","export type TableColumn<Row extends Record<string, unknown>> = {\r\n key: keyof Row;\r\n label: string;\r\n};\r\n\r\nexport function printTable<Row extends Record<string, unknown>>(\r\n rows: Row[],\r\n columns: TableColumn<Row>[]\r\n): string {\r\n const renderedRows = rows.map((row) =>\r\n columns.map((column) => String(row[column.key] ?? \"\"))\r\n );\r\n const widths = columns.map((column, index) =>\r\n Math.max(\r\n column.label.length,\r\n ...renderedRows.map((row) => row[index]?.length ?? 0)\r\n )\r\n );\r\n\r\n const header = columns\r\n .map((column, index) => column.label.padEnd(widths[index]))\r\n .join(\" \");\r\n const separator = widths.map((width) => \"-\".repeat(width)).join(\" \");\r\n const body = renderedRows.map((row) =>\r\n row.map((cell, index) => cell.padEnd(widths[index])).join(\" \")\r\n );\r\n\r\n return `${[header, separator, ...body].join(\"\\n\")}\\n`;\r\n}\r\n","import { homedir } from \"node:os\";\r\nimport { loadUserConfig, type UserConfig } from \"../config/load-user-config\";\r\nimport { resolveSkillmuxHome } from \"../config/resolve-skillmux-home\";\r\nimport { printJson } from \"../output/print-json\";\r\nimport { printTable } from \"../output/print-table\";\r\n\r\nexport type RunConfigOptions = {\r\n homeDir?: string;\r\n skillmuxHome?: string;\r\n json?: boolean;\r\n};\r\n\r\nexport type RunConfigResult = {\r\n skillmuxHome: string;\r\n configPath: string;\r\n config: UserConfig;\r\n output: string;\r\n};\r\n\r\nfunction buildTableOutput(result: Omit<RunConfigResult, \"output\">): string {\r\n const summary = printTable(\r\n [\r\n {\r\n skillmuxHome: result.skillmuxHome,\r\n configPath: result.configPath,\r\n overrides: String(Object.keys(result.config.agents).length)\r\n }\r\n ],\r\n [\r\n { key: \"skillmuxHome\", label: \"SkillMux Home\" },\r\n { key: \"configPath\", label: \"Config Path\" },\r\n { key: \"overrides\", label: \"Overrides\" }\r\n ]\r\n );\r\n\r\n const agentRows = Object.entries(result.config.agents)\r\n .sort(([left], [right]) => left.localeCompare(right))\r\n .map(([agentId, agent]) => ({\r\n agentId,\r\n stableName: agent.stableName ?? \"\",\r\n root: agent.homeRelativeRootPath ?? \"\",\r\n skills: agent.skillsDirectoryPath ?? \"\"\r\n }));\r\n\r\n if (agentRows.length === 0) {\r\n return `${summary}\\nNo user overrides configured.\\n`;\r\n }\r\n\r\n return `${summary}\\n${printTable(agentRows, [\r\n { key: \"agentId\", label: \"Agent\" },\r\n { key: \"stableName\", label: \"Name\" },\r\n { key: \"root\", label: \"Root\" },\r\n { key: \"skills\", label: \"Skills Dir\" }\r\n ])}`;\r\n}\r\n\r\nexport async function runConfig(\r\n options: RunConfigOptions = {}\r\n): Promise<RunConfigResult> {\r\n const homeDir = options.homeDir ?? homedir();\r\n const resolvedPaths = resolveSkillmuxHome(homeDir);\r\n const skillmuxHome = options.skillmuxHome ?? resolvedPaths.skillmuxHome;\r\n const config = await loadUserConfig(skillmuxHome);\r\n\r\n const resultWithoutOutput = {\r\n skillmuxHome,\r\n configPath: resolvedPaths.configPath,\r\n config\r\n };\r\n\r\n return {\r\n ...resultWithoutOutput,\r\n output:\r\n options.json === true\r\n ? printJson(resultWithoutOutput)\r\n : buildTableOutput(resultWithoutOutput)\r\n };\r\n}\r\n","import * as fs from \"node:fs/promises\";\r\nimport { homedir } from \"node:os\";\r\nimport { join } from \"node:path\";\r\nimport type { Manifest, ScanIssue } from \"../core/types\";\r\nimport { loadUserConfig, type UserConfig } from \"../config/load-user-config\";\r\nimport { resolveSkillmuxHome } from \"../config/resolve-skillmux-home\";\r\nimport {\r\n discoverAgents,\r\n type DiscoveredAgent\r\n} from \"../discovery/discover-agents\";\r\nimport {\r\n scanAgentSkills,\r\n type ScanAgentSkillsResult\r\n} from \"../discovery/scan-agent-skills\";\r\nimport { type ScannedSkillEntry } from \"../discovery/infer-skill-entry\";\r\nimport { normalizeAbsolutePath } from \"../fs/path-utils\";\r\nimport { readManifest } from \"../manifest/read-manifest\";\r\nimport { formatIssue } from \"../output/format-issue\";\r\nimport { printJson } from \"../output/print-json\";\r\nimport { printTable } from \"../output/print-table\";\r\n\r\nexport type RunDoctorOptions = {\r\n homeDir?: string;\r\n skillmuxHome?: string;\r\n platform?: NodeJS.Platform;\r\n json?: boolean;\r\n};\r\n\r\nexport type RunDoctorResult = {\r\n skillmuxHome: string;\r\n manifest: Manifest;\r\n config: UserConfig;\r\n agents: DiscoveredAgent[];\r\n entries: ScannedSkillEntry[];\r\n issues: ScanIssue[];\r\n output: string;\r\n};\r\n\r\nfunction buildIssue(\r\n code: string,\r\n severity: ScanIssue[\"severity\"],\r\n message: string,\r\n path?: string\r\n): ScanIssue {\r\n return path === undefined ? { code, severity, message } : { code, severity, message, path };\r\n}\r\n\r\nasync function pathExists(path: string): Promise<boolean> {\r\n try {\r\n await fs.access(path);\r\n return true;\r\n } catch (error) {\r\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\r\n return false;\r\n }\r\n\r\n throw error;\r\n }\r\n}\r\n\r\nasync function addUnmanagedDirectoryIssues(\r\n entries: ScannedSkillEntry[],\r\n issues: ScanIssue[]\r\n): Promise<void> {\r\n for (const entry of entries) {\r\n if (entry.kind !== \"unmanaged-directory\") {\r\n continue;\r\n }\r\n\r\n if (await pathExists(join(entry.path, \"SKILL.md\"))) {\r\n issues.push(\r\n buildIssue(\r\n \"unmanaged-skill-directory\",\r\n \"warning\",\r\n `Unmanaged skill directory is present for ${entry.agentId}/${entry.skillName}`,\r\n entry.path\r\n )\r\n );\r\n }\r\n }\r\n}\r\n\r\nasync function addMissingManagedSkillIssues(\r\n manifest: Manifest,\r\n issues: ScanIssue[]\r\n): Promise<void> {\r\n for (const skill of Object.values(manifest.skills)) {\r\n if (await pathExists(skill.path)) {\r\n continue;\r\n }\r\n\r\n issues.push(\r\n buildIssue(\r\n \"missing-managed-skill-path\",\r\n \"error\",\r\n `Managed skill path is missing for ${skill.id}`,\r\n skill.path\r\n )\r\n );\r\n }\r\n}\r\n\r\nfunction addConflictingAgentPathIssues(\r\n agents: DiscoveredAgent[],\r\n issues: ScanIssue[]\r\n): void {\r\n const pathToAgents = new Map<string, DiscoveredAgent[]>();\r\n\r\n for (const agent of agents) {\r\n const key = normalizeAbsolutePath(agent.absoluteSkillsDirectoryPath);\r\n const current = pathToAgents.get(key) ?? [];\r\n current.push(agent);\r\n pathToAgents.set(key, current);\r\n }\r\n\r\n for (const conflictedAgents of pathToAgents.values()) {\r\n if (conflictedAgents.length < 2) {\r\n continue;\r\n }\r\n\r\n const agentIds = conflictedAgents\r\n .map((agent) => agent.id)\r\n .sort((left, right) => left.localeCompare(right));\r\n\r\n issues.push(\r\n buildIssue(\r\n \"conflicting-agent-path\",\r\n \"warning\",\r\n `Multiple agents resolve to the same skills directory: ${agentIds.join(\", \")}`,\r\n conflictedAgents[0].absoluteSkillsDirectoryPath\r\n )\r\n );\r\n }\r\n}\r\n\r\nfunction buildTableOutput(issues: ScanIssue[]): string {\r\n if (issues.length === 0) {\r\n return \"No doctor issues found.\\n\";\r\n }\r\n\r\n return printTable(\r\n issues.map((issue) => ({\r\n severity: issue.severity,\r\n code: issue.code,\r\n path: issue.path ?? \"\",\r\n message: issue.message\r\n })),\r\n [\r\n { key: \"severity\", label: \"Severity\" },\r\n { key: \"code\", label: \"Code\" },\r\n { key: \"path\", label: \"Path\" },\r\n { key: \"message\", label: \"Message\" }\r\n ]\r\n );\r\n}\r\n\r\nfunction buildJsonOutput(result: Omit<RunDoctorResult, \"output\">): string {\r\n return printJson({\r\n skillmuxHome: result.skillmuxHome,\r\n issues: result.issues,\r\n agents: result.agents.map((agent) => ({\r\n id: agent.id,\r\n path: agent.absoluteSkillsDirectoryPath,\r\n supportedOnPlatform: agent.supportedOnPlatform\r\n })),\r\n entries: result.entries\r\n });\r\n}\r\n\r\nexport async function runDoctor(\r\n options: RunDoctorOptions = {}\r\n): Promise<RunDoctorResult> {\r\n const homeDir = options.homeDir ?? homedir();\r\n const resolvedPaths = resolveSkillmuxHome(homeDir);\r\n const skillmuxHome = options.skillmuxHome ?? resolvedPaths.skillmuxHome;\r\n const [manifest, config, agents] = await Promise.all([\r\n readManifest(skillmuxHome),\r\n loadUserConfig(skillmuxHome),\r\n discoverAgents({\r\n homeDir,\r\n skillmuxHome,\r\n platform: options.platform\r\n })\r\n ]);\r\n\r\n const entries: ScannedSkillEntry[] = [];\r\n const issues: ScanIssue[] = [];\r\n\r\n for (const agent of agents) {\r\n const scannedAgent: ScanAgentSkillsResult = await scanAgentSkills(agent, skillmuxHome);\r\n entries.push(...scannedAgent.entries);\r\n issues.push(...scannedAgent.issues);\r\n }\r\n\r\n await addUnmanagedDirectoryIssues(entries, issues);\r\n await addMissingManagedSkillIssues(manifest, issues);\r\n addConflictingAgentPathIssues(agents, issues);\r\n\r\n const dedupedIssues = [...issues].sort((left, right) => {\r\n const leftKey = `${left.severity}:${left.code}:${left.path ?? \"\"}:${left.message}`;\r\n const rightKey = `${right.severity}:${right.code}:${right.path ?? \"\"}:${right.message}`;\r\n return leftKey.localeCompare(rightKey);\r\n });\r\n\r\n const resultWithoutOutput = {\r\n skillmuxHome,\r\n manifest,\r\n config,\r\n agents,\r\n entries,\r\n issues: dedupedIssues\r\n };\r\n\r\n return {\r\n ...resultWithoutOutput,\r\n output:\r\n options.json === true\r\n ? buildJsonOutput(resultWithoutOutput)\r\n : buildTableOutput(dedupedIssues)\r\n };\r\n}\r\n","import * as fs from \"node:fs/promises\";\r\nimport type { ScanIssue } from \"../core/types\";\r\nimport type { DiscoveredAgent } from \"./discover-agents\";\r\nimport {\r\n inferSkillEntry,\r\n type ScannedSkillEntry\r\n} from \"./infer-skill-entry\";\r\n\r\nexport type ScanAgentSkillsResult = {\r\n entries: ScannedSkillEntry[];\r\n issues: ScanIssue[];\r\n};\r\n\r\nexport async function scanAgentSkills(\r\n agent: DiscoveredAgent,\r\n skillmuxHome: string\r\n): Promise<ScanAgentSkillsResult> {\r\n if (!agent.exists || !agent.supportedOnPlatform) {\r\n return {\r\n entries: [],\r\n issues: []\r\n };\r\n }\r\n\r\n const directoryEntries = await fs.readdir(agent.absoluteSkillsDirectoryPath, {\r\n withFileTypes: true\r\n });\r\n const sortedDirectoryEntries = [...directoryEntries].sort((left, right) =>\r\n left.name.localeCompare(right.name)\r\n );\r\n\r\n const entries: ScannedSkillEntry[] = [];\r\n const issues: ScanIssue[] = [];\r\n\r\n for (const directoryEntry of sortedDirectoryEntries) {\r\n const result = await inferSkillEntry({\r\n agentId: agent.id,\r\n agentName: agent.stableName,\r\n path: `${agent.absoluteSkillsDirectoryPath}/${directoryEntry.name}`,\r\n skillmuxHome\r\n });\r\n\r\n entries.push(result.entry);\r\n\r\n if (result.issue !== undefined) {\r\n issues.push(result.issue);\r\n }\r\n }\r\n\r\n return {\r\n entries,\r\n issues\r\n };\r\n}\r\n","import * as fs from \"node:fs/promises\";\r\nimport { basename, resolve } from \"node:path\";\r\nimport type { ScanIssue } from \"../core/types\";\r\nimport { isPathInside } from \"../fs/path-utils\";\r\n\r\nexport type SkillEntryKind =\r\n | \"managed-link\"\r\n | \"unmanaged-directory\"\r\n | \"broken-link\"\r\n | \"unknown\";\r\n\r\nexport type ScannedSkillEntry = {\r\n agentId: string;\r\n agentName: string;\r\n skillName: string;\r\n kind: SkillEntryKind;\r\n path: string;\r\n targetPath?: string;\r\n};\r\n\r\nexport type InferSkillEntryOptions = {\r\n agentId: string;\r\n agentName: string;\r\n path: string;\r\n skillmuxHome: string;\r\n};\r\n\r\nexport type InferSkillEntryResult = {\r\n entry: ScannedSkillEntry;\r\n issue?: ScanIssue;\r\n};\r\n\r\nfunction buildIssue(\r\n code: string,\r\n severity: ScanIssue[\"severity\"],\r\n message: string,\r\n path: string\r\n): ScanIssue {\r\n return { code, severity, message, path };\r\n}\r\n\r\nexport async function inferSkillEntry(\r\n options: InferSkillEntryOptions\r\n): Promise<InferSkillEntryResult> {\r\n const absolutePath = resolve(options.path);\r\n const skillName = basename(absolutePath);\r\n const stats = await fs.lstat(absolutePath);\r\n\r\n if (stats.isSymbolicLink()) {\r\n try {\r\n const targetPath = await fs.realpath(absolutePath);\r\n\r\n if (isPathInside(options.skillmuxHome, targetPath)) {\r\n return {\r\n entry: {\r\n agentId: options.agentId,\r\n agentName: options.agentName,\r\n skillName,\r\n kind: \"managed-link\",\r\n path: absolutePath,\r\n targetPath\r\n }\r\n };\r\n }\r\n\r\n return {\r\n entry: {\r\n agentId: options.agentId,\r\n agentName: options.agentName,\r\n skillName,\r\n kind: \"unknown\",\r\n path: absolutePath,\r\n targetPath\r\n },\r\n issue: buildIssue(\r\n \"unknown-entry\",\r\n \"warning\",\r\n \"Skill entry is a link that points outside the SkillMux managed store\",\r\n absolutePath\r\n )\r\n };\r\n } catch (error) {\r\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") {\r\n throw error;\r\n }\r\n\r\n return {\r\n entry: {\r\n agentId: options.agentId,\r\n agentName: options.agentName,\r\n skillName,\r\n kind: \"broken-link\",\r\n path: absolutePath\r\n },\r\n issue: buildIssue(\r\n \"broken-link\",\r\n \"error\",\r\n \"Skill entry points to a missing target\",\r\n absolutePath\r\n )\r\n };\r\n }\r\n }\r\n\r\n if (stats.isDirectory()) {\r\n return {\r\n entry: {\r\n agentId: options.agentId,\r\n agentName: options.agentName,\r\n skillName,\r\n kind: \"unmanaged-directory\",\r\n path: absolutePath\r\n }\r\n };\r\n }\r\n\r\n return {\r\n entry: {\r\n agentId: options.agentId,\r\n agentName: options.agentName,\r\n skillName,\r\n kind: \"unknown\",\r\n path: absolutePath\r\n },\r\n issue: buildIssue(\r\n \"unknown-entry\",\r\n \"warning\",\r\n \"Skill entry is neither a managed link nor a directory\",\r\n absolutePath\r\n )\r\n };\r\n}\r\n","import * as fs from \"node:fs/promises\";\nimport { dirname, parse, relative, resolve, sep } from \"node:path\";\n\nexport function normalizeAbsolutePath(path: string): string {\n const normalized = resolve(path);\n return process.platform === \"win32\"\n ? normalized.replaceAll(\"/\", \"\\\\\").toLowerCase()\n : normalized;\n}\n\nexport function pathsAreEqual(left: string, right: string): boolean {\n return normalizeAbsolutePath(left) === normalizeAbsolutePath(right);\n}\n\nexport function isPathInside(parentPath: string, childPath: string): boolean {\n const parent = normalizeAbsolutePath(parentPath);\n const child = normalizeAbsolutePath(childPath);\n\n if (parse(parent).root !== parse(child).root) {\n return false;\n }\n\n const relativePath = relative(parent, child);\n\n if (relativePath === \"\") {\n return true;\n }\n\n if (relativePath === \"..\") {\n return false;\n }\n\n if (relativePath.startsWith(`..${sep}`)) {\n return false;\n }\n\n return true;\n}\n\nexport async function assertNoSymlinkAncestors(\n path: string,\n options?: { includeLeaf?: boolean }\n): Promise<void> {\n let current = options?.includeLeaf === true ? resolve(path) : dirname(resolve(path));\n\n while (true) {\n try {\n const entry = await fs.lstat(current);\n if (entry.isSymbolicLink()) {\n throw new Error(`Refusing to use path with symlink ancestor at ${current}`);\n }\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") {\n throw error;\n }\n }\n\n const parent = dirname(current);\n if (parent === current) {\n return;\n }\n\n current = parent;\n }\n}\n","import * as fs from \"node:fs/promises\";\nimport { join, resolve } from \"node:path\";\nimport { ManifestValidationError } from \"../core/errors\";\nimport type { Manifest } from \"../core/types\";\nimport { buildEmptyManifest } from \"./build-empty-manifest\";\nimport { manifestSchema } from \"./manifest-schema\";\nimport { writeManifest } from \"./write-manifest\";\n\nfunction getManifestPath(home: string): string {\n return join(home, \"manifest.json\");\n}\n\nfunction normalizeHomePath(home: string): string {\n const resolvedHome = resolve(home);\n return process.platform === \"win32\"\n ? resolvedHome.toLowerCase()\n : resolvedHome;\n}\n\nfunction formatValidationIssues(error: { issues: Array<{ path: (string | number)[]; message: string }> }): string {\n return error.issues\n .map((issue) => {\n const path = issue.path.length > 0 ? issue.path.join(\".\") : \"<root>\";\n return `${path}: ${issue.message}`;\n })\n .join(\"; \");\n}\n\nexport async function readManifest(home: string): Promise<Manifest> {\n const manifestPath = getManifestPath(home);\n\n try {\n const contents = await fs.readFile(manifestPath, \"utf8\");\n const parsedJson = JSON.parse(contents) as unknown;\n const parsedManifest = manifestSchema.safeParse(parsedJson);\n\n if (!parsedManifest.success) {\n throw new ManifestValidationError(\n `Invalid manifest at ${manifestPath}: ${formatValidationIssues(parsedManifest.error)}`\n );\n }\n\n if (\n normalizeHomePath(parsedManifest.data.skillmuxHome) !==\n normalizeHomePath(home)\n ) {\n throw new ManifestValidationError(\n `Invalid manifest at ${manifestPath}: skillmuxHome must match ${home}`\n );\n }\n\n return parsedManifest.data;\n } catch (error) {\n if (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n (error as NodeJS.ErrnoException).code === \"ENOENT\"\n ) {\n const emptyManifest = buildEmptyManifest(home);\n await writeManifest(home, emptyManifest);\n return emptyManifest;\n }\n\n if (error instanceof SyntaxError) {\n throw new ManifestValidationError(\n `Invalid manifest at ${manifestPath}: malformed JSON`\n );\n }\n\n throw error;\n }\n}\n","import type { Manifest } from \"../core/types\";\r\n\r\nexport function buildEmptyManifest(skillmuxHome: string): Manifest {\r\n return {\r\n version: 1,\r\n skillmuxHome,\r\n skills: {},\r\n agents: {},\r\n activations: [],\r\n lastScan: {\r\n at: null,\r\n issues: []\r\n }\r\n };\r\n}\r\n","import { z } from \"zod\";\r\nimport { isValidId } from \"../core/ids\";\r\nimport type {\r\n ActivationRecord,\r\n AgentRecord,\r\n ManagedSkill,\r\n Manifest,\r\n ScanIssue\r\n} from \"../core/types\";\r\n\r\nconst idSchema = z\r\n .string()\r\n .min(1)\r\n .refine(isValidId, \"Expected a canonical lowercase slug identifier\");\r\n\r\nexport const scanIssueSchema = z\r\n .object({\r\n code: z.string().min(1),\r\n severity: z.enum([\"info\", \"warning\", \"error\"]),\r\n message: z.string().min(1),\r\n path: z.string().min(1).optional()\r\n })\r\n .strict();\r\n\r\nexport const managedSkillSchema = z\r\n .object({\r\n id: idSchema,\r\n name: z.string().min(1),\r\n path: z.string().min(1),\r\n source: z\r\n .object({\r\n kind: z.enum([\"local\", \"imported\"]),\r\n path: z.string().min(1)\r\n })\r\n .strict(),\r\n importedAt: z.string().min(1)\r\n })\r\n .strict();\r\n\r\nexport const agentRecordSchema = z\r\n .object({\r\n id: idSchema,\r\n name: z.string().min(1),\r\n path: z.string().min(1),\r\n discovery: z.enum([\"builtin\", \"custom\"]),\r\n available: z.boolean(),\r\n lastSeenAt: z.string().min(1).nullable()\r\n })\r\n .strict();\r\n\r\nexport const activationRecordSchema = z\r\n .object({\r\n skillId: idSchema,\r\n agentId: idSchema,\r\n linkPath: z.string().min(1),\r\n state: z.enum([\"enabled\", \"disabled\"]),\r\n updatedAt: z.string().min(1)\r\n })\r\n .strict();\r\n\r\nexport const manifestSchema = z\r\n .object({\r\n version: z.literal(1),\r\n skillmuxHome: z.string().min(1),\r\n skills: z.record(z.string(), managedSkillSchema),\r\n agents: z.record(z.string(), agentRecordSchema),\r\n activations: z.array(activationRecordSchema),\r\n lastScan: z\r\n .object({\r\n at: z.string().min(1).nullable(),\r\n issues: z.array(scanIssueSchema)\r\n })\r\n .strict()\r\n })\r\n .strict()\r\n .superRefine((manifest, ctx) => {\r\n for (const [skillId, skill] of Object.entries(manifest.skills)) {\r\n if (!isValidId(skillId)) {\r\n ctx.addIssue({\r\n code: z.ZodIssueCode.custom,\r\n path: [\"skills\", skillId],\r\n message: `Invalid skill id key: ${skillId}`\r\n });\r\n }\r\n\r\n if (skill.id !== skillId) {\r\n ctx.addIssue({\r\n code: z.ZodIssueCode.custom,\r\n path: [\"skills\", skillId, \"id\"],\r\n message: `Skill id must match its record key: ${skillId}`\r\n });\r\n }\r\n }\r\n\r\n for (const [agentId, agent] of Object.entries(manifest.agents)) {\r\n if (!isValidId(agentId)) {\r\n ctx.addIssue({\r\n code: z.ZodIssueCode.custom,\r\n path: [\"agents\", agentId],\r\n message: `Invalid agent id key: ${agentId}`\r\n });\r\n }\r\n\r\n if (agent.id !== agentId) {\r\n ctx.addIssue({\r\n code: z.ZodIssueCode.custom,\r\n path: [\"agents\", agentId, \"id\"],\r\n message: `Agent id must match its record key: ${agentId}`\r\n });\r\n }\r\n }\r\n\r\n const activationPairs = new Set<string>();\r\n\r\n manifest.activations.forEach((activation, index) => {\r\n if (!(activation.skillId in manifest.skills)) {\r\n ctx.addIssue({\r\n code: z.ZodIssueCode.custom,\r\n path: [\"activations\", index, \"skillId\"],\r\n message: `Unknown skill reference: ${activation.skillId}`\r\n });\r\n }\r\n\r\n if (!(activation.agentId in manifest.agents)) {\r\n ctx.addIssue({\r\n code: z.ZodIssueCode.custom,\r\n path: [\"activations\", index, \"agentId\"],\r\n message: `Unknown agent reference: ${activation.agentId}`\r\n });\r\n }\r\n\r\n const pairKey = `${activation.skillId}:${activation.agentId}`;\r\n if (activationPairs.has(pairKey)) {\r\n ctx.addIssue({\r\n code: z.ZodIssueCode.custom,\r\n path: [\"activations\", index],\r\n message: `Duplicate activation for ${pairKey}`\r\n });\r\n return;\r\n }\r\n\r\n activationPairs.add(pairKey);\r\n });\r\n });\r\n\r\nexport type { ActivationRecord, AgentRecord, ManagedSkill, Manifest, ScanIssue };\r\n","import { InvalidIdentifierError } from \"./errors\";\r\n\r\nconst ID_PATTERN = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;\r\n\r\nexport function normalizeId(value: string): string {\r\n const normalized = value\r\n .trim()\r\n .toLowerCase()\r\n .replace(/[^a-z0-9]+/g, \"-\")\r\n .replace(/^-+|-+$/g, \"\");\r\n\r\n return normalized.length > 0 ? normalized : \"skill\";\r\n}\r\n\r\nexport function isValidId(value: string): boolean {\r\n return ID_PATTERN.test(value);\r\n}\r\n\r\nexport function assertValidId(value: string, kind = \"identifier\"): string {\r\n if (!isValidId(value)) {\r\n throw new InvalidIdentifierError(kind, value);\r\n }\r\n\r\n return value;\r\n}\r\n","import { randomUUID } from \"node:crypto\";\nimport * as fs from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { Manifest } from \"../core/types\";\n\nfunction getManifestPath(home: string): string {\n return join(home, \"manifest.json\");\n}\n\nexport function createManifestTempPath(manifestPath: string): string {\n return `${manifestPath}.${process.pid}.${randomUUID()}.tmp`;\n}\n\nexport async function writeManifest(\n home: string,\n manifest: Manifest\n): Promise<void> {\n await fs.mkdir(home, { recursive: true });\n\n const manifestPath = getManifestPath(home);\n const tempPath = createManifestTempPath(manifestPath);\n const contents = `${JSON.stringify(manifest, null, 2)}\\n`;\n\n await fs.writeFile(tempPath, contents, \"utf8\");\n\n try {\n await fs.rename(tempPath, manifestPath);\n } catch (error) {\n await fs.unlink(tempPath).catch(() => undefined);\n throw error;\n }\n}\n","import * as fs from \"node:fs/promises\";\r\nimport { homedir } from \"node:os\";\r\nimport { join } from \"node:path\";\r\nimport type {\r\n ActivationRecord,\r\n AgentRecord,\r\n ManagedSkill,\r\n Manifest\r\n} from \"../core/types\";\r\nimport { normalizeId } from \"../core/ids\";\r\nimport { resolveSkillmuxHome } from \"../config/resolve-skillmux-home\";\r\nimport {\r\n discoverAgents,\r\n type DiscoveredAgent\r\n} from \"../discovery/discover-agents\";\r\nimport { isLinkPointingToTarget } from \"../fs/link-ops\";\r\nimport { safeRemoveLink } from \"../fs/safe-remove-link\";\r\nimport { readManifest } from \"../manifest/read-manifest\";\r\nimport { writeManifest } from \"../manifest/write-manifest\";\r\n\r\nexport type RunDisableOptions = {\r\n homeDir?: string;\r\n skillmuxHome?: string;\r\n skill: string;\r\n agent: string;\r\n now?: Date;\r\n};\r\n\r\nexport type RunDisableResult = {\r\n changed: boolean;\r\n skill: ManagedSkill;\r\n agent: AgentRecord;\r\n activation: ActivationRecord | null;\r\n manifest: Manifest;\r\n output: string;\r\n};\r\n\r\nfunction buildAgentRecord(agent: DiscoveredAgent, timestamp: string): AgentRecord {\r\n return {\r\n id: agent.id,\r\n name: agent.stableName,\r\n path: agent.absoluteSkillsDirectoryPath,\r\n discovery: agent.discovery,\r\n available: agent.exists && agent.supportedOnPlatform,\r\n lastSeenAt: agent.exists ? timestamp : null\r\n };\r\n}\r\n\r\nfunction buildActivationRecord(\r\n skillId: string,\r\n agentId: string,\r\n linkPath: string,\r\n timestamp: string\r\n): ActivationRecord {\r\n return {\r\n skillId,\r\n agentId,\r\n linkPath,\r\n state: \"disabled\",\r\n updatedAt: timestamp\r\n };\r\n}\r\n\r\nfunction upsertActivation(\r\n manifest: Manifest,\r\n activation: ActivationRecord\r\n): void {\r\n const index = manifest.activations.findIndex(\r\n (entry) =>\r\n entry.skillId === activation.skillId && entry.agentId === activation.agentId\r\n );\r\n\r\n if (index === -1) {\r\n manifest.activations.push(activation);\r\n return;\r\n }\r\n\r\n manifest.activations[index] = activation;\r\n}\r\n\r\nasync function resolveTargetAgent(\r\n homeDir: string,\r\n skillmuxHome: string,\r\n agentName: string\r\n): Promise<DiscoveredAgent> {\r\n const agentId = normalizeId(agentName);\r\n const agents = await discoverAgents({ homeDir, skillmuxHome });\r\n const agent = agents.find((entry) => entry.id === agentId);\r\n\r\n if (agent === undefined) {\r\n throw new Error(`Unknown agent: ${agentName}`);\r\n }\r\n\r\n if (!agent.supportedOnPlatform) {\r\n throw new Error(`Agent ${agent.id} is not supported on ${process.platform}`);\r\n }\r\n\r\n return agent;\r\n}\r\n\r\nasync function pathExists(path: string): Promise<boolean> {\r\n try {\r\n await fs.lstat(path);\r\n return true;\r\n } catch (error) {\r\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\r\n return false;\r\n }\r\n\r\n throw error;\r\n }\r\n}\r\n\r\nexport async function runDisable(\r\n options: RunDisableOptions\r\n): Promise<RunDisableResult> {\r\n const homeDir = options.homeDir ?? homedir();\r\n const { skillmuxHome: defaultSkillmuxHome } = resolveSkillmuxHome(homeDir);\r\n const skillmuxHome = options.skillmuxHome ?? defaultSkillmuxHome;\r\n const timestamp = (options.now ?? new Date()).toISOString();\r\n const manifest = await readManifest(skillmuxHome);\r\n const skillId = normalizeId(options.skill);\r\n const skill = manifest.skills[skillId];\r\n\r\n if (skill === undefined) {\r\n throw new Error(`Managed skill not found: ${skillId}`);\r\n }\r\n\r\n const agent = await resolveTargetAgent(homeDir, skillmuxHome, options.agent);\r\n const currentActivation = manifest.activations.find(\r\n (entry) => entry.skillId === skill.id && entry.agentId === agent.id\r\n );\r\n const linkPath =\r\n currentActivation?.linkPath ?? join(agent.absoluteSkillsDirectoryPath, skill.id);\r\n const agentRecord = buildAgentRecord(agent, timestamp);\r\n manifest.agents[agent.id] = agentRecord;\r\n\r\n const linkMatchesSkill = await isLinkPointingToTarget(linkPath, skill.path);\r\n if (!linkMatchesSkill && (await pathExists(linkPath))) {\r\n throw new Error(`Refusing to disable non-managed entry at ${linkPath}`);\r\n }\r\n\r\n const removedLink = linkMatchesSkill\r\n ? await safeRemoveLink(linkPath)\r\n : false;\r\n\r\n if (removedLink === false && currentActivation?.state !== \"enabled\") {\r\n return {\r\n changed: false,\r\n skill,\r\n agent: agentRecord,\r\n activation: currentActivation ?? null,\r\n manifest,\r\n output: `${skill.id} is already disabled for ${agent.id}\\n`\r\n };\r\n }\r\n\r\n const activation = buildActivationRecord(skill.id, agent.id, linkPath, timestamp);\r\n upsertActivation(manifest, activation);\r\n await writeManifest(skillmuxHome, manifest);\r\n\r\n return {\r\n changed: true,\r\n skill,\r\n agent: agentRecord,\r\n activation,\r\n manifest,\r\n output: `Disabled ${skill.id} for ${agent.id}\\n`\r\n };\r\n}\r\n","import * as fs from \"node:fs/promises\";\r\nimport { dirname, resolve } from \"node:path\";\r\nimport {\r\n assertNoSymlinkAncestors,\r\n isPathInside,\r\n pathsAreEqual\r\n} from \"./path-utils\";\r\n\r\nconst directoryLinkType = process.platform === \"win32\" ? \"junction\" : \"dir\";\r\n\r\nexport async function createManagedLink(\r\n linkPath: string,\r\n targetPath: string\r\n): Promise<void> {\r\n const resolvedLinkPath = resolve(linkPath);\r\n const resolvedTargetPath = resolve(targetPath);\r\n\r\n await assertNoSymlinkAncestors(resolvedLinkPath);\r\n await assertNoSymlinkAncestors(resolvedTargetPath, { includeLeaf: true });\r\n await fs.mkdir(dirname(resolvedLinkPath), { recursive: true });\r\n\r\n try {\r\n const existingEntry = await fs.lstat(resolvedLinkPath);\r\n\r\n if (!existingEntry.isSymbolicLink()) {\r\n throw new Error(`Refusing to replace non-link entry at ${resolvedLinkPath}`);\r\n }\r\n\r\n const currentTargetPath = await fs.realpath(resolvedLinkPath);\r\n if (pathsAreEqual(currentTargetPath, resolvedTargetPath)) {\r\n return;\r\n }\r\n\r\n throw new Error(`Refusing to replace link at ${resolvedLinkPath}`);\r\n } catch (error) {\r\n if (\r\n (error as NodeJS.ErrnoException).code === \"ENOENT\" &&\r\n (await fs\r\n .lstat(resolvedLinkPath)\r\n .then((entry) => entry.isSymbolicLink())\r\n .catch(() => false))\r\n ) {\r\n await fs.rm(resolvedLinkPath, { recursive: true, force: false });\r\n } else if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") {\r\n throw error;\r\n }\r\n }\r\n\r\n await fs.symlink(resolvedTargetPath, resolvedLinkPath, directoryLinkType);\r\n}\r\n\r\nexport async function isLinkPointingToTarget(\r\n linkPath: string,\r\n targetPath: string\r\n): Promise<boolean> {\r\n try {\r\n const entry = await fs.lstat(linkPath);\r\n if (!entry.isSymbolicLink()) {\r\n return false;\r\n }\r\n\r\n const resolvedTargetPath = await fs.realpath(linkPath);\r\n return pathsAreEqual(resolvedTargetPath, targetPath);\r\n } catch (error) {\r\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\r\n return false;\r\n }\r\n\r\n throw error;\r\n }\r\n}\r\n\r\nexport async function isManagedLinkTarget(\r\n linkPath: string,\r\n skillmuxHome: string\r\n): Promise<boolean> {\r\n try {\r\n const entry = await fs.lstat(linkPath);\r\n if (!entry.isSymbolicLink()) {\r\n return false;\r\n }\r\n\r\n const resolvedTargetPath = await fs.realpath(linkPath);\r\n return isPathInside(skillmuxHome, resolvedTargetPath);\r\n } catch (error) {\r\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\r\n return false;\r\n }\r\n\r\n throw error;\r\n }\r\n}\r\n","import * as fs from \"node:fs/promises\";\n\nexport async function safeRemoveLink(path: string): Promise<boolean> {\n try {\n const entry = await fs.lstat(path);\n\n if (!entry.isSymbolicLink()) {\n return false;\n }\n\n await fs.rm(path, { recursive: true, force: false });\n return true;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return false;\n }\n\n throw error;\n }\n}\n","import * as fs from \"node:fs/promises\";\r\nimport { homedir } from \"node:os\";\r\nimport { join } from \"node:path\";\r\nimport type {\r\n ActivationRecord,\r\n AgentRecord,\r\n ManagedSkill,\r\n Manifest\r\n} from \"../core/types\";\r\nimport { normalizeId } from \"../core/ids\";\r\nimport { resolveSkillmuxHome } from \"../config/resolve-skillmux-home\";\r\nimport {\r\n discoverAgents,\r\n type DiscoveredAgent\r\n} from \"../discovery/discover-agents\";\r\nimport { createManagedLink, isLinkPointingToTarget } from \"../fs/link-ops\";\r\nimport { readManifest } from \"../manifest/read-manifest\";\r\nimport { writeManifest } from \"../manifest/write-manifest\";\r\n\r\nexport type RunEnableOptions = {\r\n homeDir?: string;\r\n skillmuxHome?: string;\r\n skill: string;\r\n agent: string;\r\n now?: Date;\r\n};\r\n\r\nexport type RunEnableResult = {\r\n changed: boolean;\r\n skill: ManagedSkill;\r\n agent: AgentRecord;\r\n activation: ActivationRecord;\r\n manifest: Manifest;\r\n output: string;\r\n};\r\n\r\nfunction buildAgentRecord(agent: DiscoveredAgent, timestamp: string): AgentRecord {\r\n return {\r\n id: agent.id,\r\n name: agent.stableName,\r\n path: agent.absoluteSkillsDirectoryPath,\r\n discovery: agent.discovery,\r\n available: agent.supportedOnPlatform,\r\n lastSeenAt: timestamp\r\n };\r\n}\r\n\r\nfunction buildActivationRecord(\r\n skillId: string,\r\n agentId: string,\r\n linkPath: string,\r\n timestamp: string,\r\n state: \"enabled\" | \"disabled\"\r\n): ActivationRecord {\r\n return {\r\n skillId,\r\n agentId,\r\n linkPath,\r\n state,\r\n updatedAt: timestamp\r\n };\r\n}\r\n\r\nfunction upsertActivation(\r\n manifest: Manifest,\r\n activation: ActivationRecord\r\n): void {\r\n const index = manifest.activations.findIndex(\r\n (entry) =>\r\n entry.skillId === activation.skillId && entry.agentId === activation.agentId\r\n );\r\n\r\n if (index === -1) {\r\n manifest.activations.push(activation);\r\n return;\r\n }\r\n\r\n manifest.activations[index] = activation;\r\n}\r\n\r\nasync function resolveTargetAgent(\r\n homeDir: string,\r\n skillmuxHome: string,\r\n agentName: string\r\n): Promise<DiscoveredAgent> {\r\n const agentId = normalizeId(agentName);\r\n const agents = await discoverAgents({ homeDir, skillmuxHome });\r\n const agent = agents.find((entry) => entry.id === agentId);\r\n\r\n if (agent === undefined) {\r\n throw new Error(`Unknown agent: ${agentName}`);\r\n }\r\n\r\n if (!agent.supportedOnPlatform) {\r\n throw new Error(`Agent ${agent.id} is not supported on ${process.platform}`);\r\n }\r\n\r\n return agent;\r\n}\r\n\r\nexport async function runEnable(\r\n options: RunEnableOptions\r\n): Promise<RunEnableResult> {\r\n const homeDir = options.homeDir ?? homedir();\r\n const { skillmuxHome: defaultSkillmuxHome } = resolveSkillmuxHome(homeDir);\r\n const skillmuxHome = options.skillmuxHome ?? defaultSkillmuxHome;\r\n const timestamp = (options.now ?? new Date()).toISOString();\r\n const manifest = await readManifest(skillmuxHome);\r\n const skillId = normalizeId(options.skill);\r\n const skill = manifest.skills[skillId];\r\n\r\n if (skill === undefined) {\r\n throw new Error(`Managed skill not found: ${skillId}`);\r\n }\r\n\r\n const agent = await resolveTargetAgent(homeDir, skillmuxHome, options.agent);\r\n const linkPath = join(agent.absoluteSkillsDirectoryPath, skill.id);\r\n const currentActivation = manifest.activations.find(\r\n (entry) => entry.skillId === skill.id && entry.agentId === agent.id\r\n );\r\n const agentRecord = buildAgentRecord(agent, timestamp);\r\n\r\n manifest.agents[agent.id] = agentRecord;\r\n await fs.mkdir(agent.absoluteSkillsDirectoryPath, { recursive: true });\r\n\r\n const linkAlreadyEnabled = await isLinkPointingToTarget(linkPath, skill.path);\r\n const activationAlreadyEnabled =\r\n currentActivation?.state === \"enabled\" && currentActivation.linkPath === linkPath;\r\n\r\n if (linkAlreadyEnabled && activationAlreadyEnabled) {\r\n return {\r\n changed: false,\r\n skill,\r\n agent: agentRecord,\r\n activation: currentActivation,\r\n manifest,\r\n output: `${skill.id} is already enabled for ${agent.id}\\n`\r\n };\r\n }\r\n\r\n await createManagedLink(linkPath, skill.path);\r\n\r\n const activation = buildActivationRecord(\r\n skill.id,\r\n agent.id,\r\n linkPath,\r\n timestamp,\r\n \"enabled\"\r\n );\r\n upsertActivation(manifest, activation);\r\n await writeManifest(skillmuxHome, manifest);\r\n\r\n return {\r\n changed: true,\r\n skill,\r\n agent: agentRecord,\r\n activation,\r\n manifest,\r\n output: `Enabled ${skill.id} for ${agent.id}\\n`\r\n };\r\n}\r\n","import { resolve } from \"node:path\";\r\nimport { homedir } from \"node:os\";\r\nimport type { ManagedSkill, Manifest } from \"../core/types\";\r\nimport { normalizeId } from \"../core/ids\";\r\nimport { resolveSkillmuxHome } from \"../config/resolve-skillmux-home\";\r\nimport {\r\n assertSkillSourceLayout,\r\n copySkillContentsToManagedStore\r\n} from \"../fs/safe-copy\";\r\nimport { readManifest } from \"../manifest/read-manifest\";\r\nimport { writeManifest } from \"../manifest/write-manifest\";\r\n\r\nexport type RunImportOptions = {\r\n homeDir?: string;\r\n skillmuxHome?: string;\r\n sourcePath: string;\r\n skillName: string;\r\n now?: Date;\r\n};\r\n\r\nexport type RunImportResult = {\r\n skill: ManagedSkill;\r\n manifest: Manifest;\r\n output: string;\r\n};\r\n\r\nfunction buildManagedSkillPath(skillmuxHome: string, skillId: string): string {\r\n return resolve(skillmuxHome, \"skills\", skillId);\r\n}\r\n\r\nexport async function runImport(\r\n options: RunImportOptions\r\n): Promise<RunImportResult> {\r\n const homeDir = options.homeDir ?? homedir();\r\n const resolvedPaths = resolveSkillmuxHome(homeDir);\r\n const skillmuxHome = options.skillmuxHome ?? resolvedPaths.skillmuxHome;\r\n const sourcePath = resolve(options.sourcePath);\r\n const skillId = normalizeId(options.skillName);\r\n const importedAt = (options.now ?? new Date()).toISOString();\r\n const manifest = await readManifest(skillmuxHome);\r\n const managedSkillPath = buildManagedSkillPath(skillmuxHome, skillId);\r\n\r\n await assertSkillSourceLayout(sourcePath);\r\n\r\n if (manifest.skills[skillId] !== undefined) {\r\n throw new Error(`Managed skill already exists for ${skillId}`);\r\n }\r\n\r\n await copySkillContentsToManagedStore(sourcePath, managedSkillPath);\r\n\r\n const skill: ManagedSkill = {\r\n id: skillId,\r\n name: options.skillName,\r\n path: managedSkillPath,\r\n source: {\r\n kind: \"local\",\r\n path: sourcePath\r\n },\r\n importedAt\r\n };\r\n\r\n manifest.skills[skillId] = skill;\r\n await writeManifest(skillmuxHome, manifest);\r\n\r\n return {\r\n skill,\r\n manifest,\r\n output: `Imported ${skillId} to ${managedSkillPath}\\n`\r\n };\r\n}\r\n","import * as fs from \"node:fs/promises\";\r\nimport { dirname, join, resolve } from \"node:path\";\r\nimport {\r\n assertNoSymlinkAncestors,\r\n isPathInside,\r\n pathsAreEqual\r\n} from \"./path-utils\";\r\n\r\nasync function assertDirectory(path: string): Promise<void> {\r\n const entry = await fs.lstat(path);\r\n if (!entry.isDirectory()) {\r\n throw new Error(`Expected a directory at ${path}`);\r\n }\r\n}\r\n\r\nasync function assertRegularFile(path: string, label: string): Promise<void> {\r\n const entry = await fs.lstat(path);\r\n if (!entry.isFile()) {\r\n throw new Error(`Expected ${label} to be a regular file at ${path}`);\r\n }\r\n}\r\n\r\nasync function assertTargetDoesNotExist(path: string): Promise<void> {\r\n try {\r\n await fs.lstat(path);\r\n throw new Error(`Refusing to overwrite existing path at ${path}`);\r\n } catch (error) {\r\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") {\r\n throw error;\r\n }\r\n }\r\n}\r\n\r\nasync function copyDirectoryContents(sourcePath: string, targetPath: string): Promise<void> {\r\n await fs.mkdir(targetPath, { recursive: true });\r\n const entries = await fs.readdir(sourcePath, { withFileTypes: true });\r\n\r\n for (const entry of entries) {\r\n const sourceEntryPath = join(sourcePath, entry.name);\r\n const targetEntryPath = join(targetPath, entry.name);\r\n const entryStats = await fs.lstat(sourceEntryPath);\r\n\r\n if (entryStats.isSymbolicLink()) {\r\n throw new Error(`Refusing to copy source symlink at ${sourceEntryPath}`);\r\n }\r\n\r\n if (entryStats.isDirectory()) {\r\n await copyDirectoryContents(sourceEntryPath, targetEntryPath);\r\n continue;\r\n }\r\n\r\n if (entryStats.isFile()) {\r\n await fs.mkdir(dirname(targetEntryPath), { recursive: true });\r\n await fs.copyFile(sourceEntryPath, targetEntryPath);\r\n continue;\r\n }\r\n\r\n throw new Error(`Unsupported filesystem entry at ${sourceEntryPath}`);\r\n }\r\n}\r\n\r\nexport async function assertSkillSourceLayout(sourcePath: string): Promise<void> {\r\n const resolvedSourcePath = resolve(sourcePath);\r\n const skillFilePath = join(resolvedSourcePath, \"SKILL.md\");\r\n\r\n await assertNoSymlinkAncestors(resolvedSourcePath, { includeLeaf: true });\r\n await assertDirectory(resolvedSourcePath);\r\n\r\n try {\r\n await assertRegularFile(skillFilePath, \"SKILL.md\");\r\n } catch (error) {\r\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\r\n throw new Error(`Refusing to import ${resolvedSourcePath} without a root SKILL.md`);\r\n }\r\n\r\n throw error;\r\n }\r\n}\r\n\r\nexport async function copySkillContentsToManagedStore(\r\n sourcePath: string,\r\n targetPath: string\r\n): Promise<void> {\r\n const resolvedSourcePath = resolve(sourcePath);\r\n const resolvedTargetPath = resolve(targetPath);\r\n\r\n if (pathsAreEqual(resolvedSourcePath, resolvedTargetPath)) {\r\n throw new Error(\"Source and target paths must differ\");\r\n }\r\n\r\n if (isPathInside(resolvedSourcePath, resolvedTargetPath)) {\r\n throw new Error(\"Refusing to copy into a child of the source directory\");\r\n }\r\n\r\n await assertSkillSourceLayout(resolvedSourcePath);\r\n await assertNoSymlinkAncestors(resolvedTargetPath);\r\n await assertTargetDoesNotExist(resolvedTargetPath);\r\n await copyDirectoryContents(resolvedSourcePath, resolvedTargetPath);\r\n}\r\n","import { homedir } from \"node:os\";\r\nimport type { AgentRecord, Manifest, ScanIssue } from \"../core/types\";\r\nimport { resolveSkillmuxHome } from \"../config/resolve-skillmux-home\";\r\nimport {\r\n discoverAgents,\r\n type DiscoveredAgent\r\n} from \"../discovery/discover-agents\";\r\nimport {\r\n scanAgentSkills,\r\n type ScanAgentSkillsResult\r\n} from \"../discovery/scan-agent-skills\";\r\nimport { type ScannedSkillEntry } from \"../discovery/infer-skill-entry\";\r\nimport { readManifest } from \"../manifest/read-manifest\";\r\nimport { writeManifest } from \"../manifest/write-manifest\";\r\nimport { formatIssue } from \"../output/format-issue\";\r\nimport { printJson } from \"../output/print-json\";\r\nimport { printTable } from \"../output/print-table\";\r\n\r\nexport type RunScanOptions = {\r\n homeDir?: string;\r\n skillmuxHome?: string;\r\n platform?: NodeJS.Platform;\r\n now?: Date;\r\n json?: boolean;\r\n};\r\n\r\nexport type RunScanResult = {\r\n manifest: Manifest;\r\n agents: DiscoveredAgent[];\r\n entries: ScannedSkillEntry[];\r\n issues: ScanIssue[];\r\n output: string;\r\n};\r\n\r\nfunction buildAgentRecord(\r\n agent: DiscoveredAgent,\r\n timestamp: string,\r\n previousRecord?: AgentRecord\r\n): AgentRecord {\r\n const lastSeenAt = agent.exists ? timestamp : previousRecord?.lastSeenAt ?? null;\r\n\r\n return {\r\n id: agent.id,\r\n name: agent.stableName,\r\n path: agent.absoluteSkillsDirectoryPath,\r\n discovery: agent.discovery,\r\n available: agent.exists && agent.supportedOnPlatform,\r\n lastSeenAt\r\n };\r\n}\r\n\r\nfunction buildScanOutput(result: Omit<RunScanResult, \"output\">, json: boolean): string {\r\n if (json) {\r\n return printJson({\r\n lastScan: result.manifest.lastScan,\r\n agents: result.agents.map((agent) => ({\r\n id: agent.id,\r\n name: agent.stableName,\r\n path: agent.absoluteSkillsDirectoryPath,\r\n exists: agent.exists,\r\n supportedOnPlatform: agent.supportedOnPlatform\r\n })),\r\n entries: result.entries\r\n });\r\n }\r\n\r\n if (result.entries.length === 0) {\r\n return \"No skill entries found.\\n\";\r\n }\r\n\r\n const table = printTable(\r\n result.entries.map((entry) => ({\r\n agent: entry.agentId,\r\n skill: entry.skillName,\r\n kind: entry.kind,\r\n path: entry.path\r\n })),\r\n [\r\n { key: \"agent\", label: \"Agent\" },\r\n { key: \"skill\", label: \"Skill\" },\r\n { key: \"kind\", label: \"Kind\" },\r\n { key: \"path\", label: \"Path\" }\r\n ]\r\n );\r\n\r\n if (result.issues.length === 0) {\r\n return table;\r\n }\r\n\r\n return `${table}\\n${result.issues.map(formatIssue).join(\"\\n\")}\\n`;\r\n}\r\n\r\nexport async function runScan(options: RunScanOptions = {}): Promise<RunScanResult> {\r\n const homeDir = options.homeDir ?? homedir();\r\n const resolvedPaths = resolveSkillmuxHome(homeDir);\r\n const skillmuxHome = options.skillmuxHome ?? resolvedPaths.skillmuxHome;\r\n const manifest = await readManifest(skillmuxHome);\r\n const agents = await discoverAgents({\r\n homeDir,\r\n platform: options.platform,\r\n skillmuxHome\r\n });\r\n\r\n const timestamp = (options.now ?? new Date()).toISOString();\r\n const entries: ScannedSkillEntry[] = [];\r\n const issues: ScanIssue[] = [];\r\n\r\n for (const agent of agents) {\r\n const scannedAgent = await scanAgentSkills(agent, skillmuxHome);\r\n entries.push(...scannedAgent.entries);\r\n issues.push(...scannedAgent.issues);\r\n manifest.agents[agent.id] = buildAgentRecord(\r\n agent,\r\n timestamp,\r\n manifest.agents[agent.id]\r\n );\r\n }\r\n\r\n manifest.lastScan = {\r\n at: timestamp,\r\n issues\r\n };\r\n\r\n await writeManifest(skillmuxHome, manifest);\r\n\r\n const resultWithoutOutput = {\r\n manifest,\r\n agents,\r\n entries,\r\n issues\r\n };\r\n\r\n return {\r\n ...resultWithoutOutput,\r\n output: buildScanOutput(resultWithoutOutput, options.json === true)\r\n };\r\n}\r\n","import type { ScanIssue } from \"../core/types\";\r\n\r\nexport function formatIssue(issue: ScanIssue): string {\r\n if (issue.path === undefined) {\r\n return `[${issue.severity}] ${issue.code}: ${issue.message}`;\r\n }\r\n\r\n return `[${issue.severity}] ${issue.code} @ ${issue.path}: ${issue.message}`;\r\n}\r\n","import { printJson } from \"../output/print-json\";\r\nimport { printTable } from \"../output/print-table\";\r\nimport { runScan, type RunScanOptions, type RunScanResult } from \"./scan\";\r\n\r\nexport type ListView = \"records\" | \"agents\" | \"skills\";\r\nexport type ListFormat = \"table\" | \"json\";\r\n\r\nexport type RunListOptions = Omit<RunScanOptions, \"json\"> & {\r\n view?: ListView;\r\n format?: ListFormat;\r\n};\r\n\r\nexport type RunListResult = {\r\n output: string;\r\n data: unknown;\r\n};\r\n\r\nfunction buildRecordsView(scanResult: RunScanResult) {\r\n return {\r\n view: \"records\" as const,\r\n records: scanResult.entries,\r\n issues: scanResult.issues\r\n };\r\n}\r\n\r\nfunction buildAgentsView(scanResult: RunScanResult) {\r\n const groups = new Map<\r\n string,\r\n {\r\n agentId: string;\r\n agentName: string;\r\n entries: RunScanResult[\"entries\"];\r\n }\r\n >();\r\n\r\n for (const entry of scanResult.entries) {\r\n const current = groups.get(entry.agentId) ?? {\r\n agentId: entry.agentId,\r\n agentName: entry.agentName,\r\n entries: []\r\n };\r\n current.entries.push(entry);\r\n groups.set(entry.agentId, current);\r\n }\r\n\r\n return {\r\n view: \"agents\" as const,\r\n agents: [...groups.values()].sort((left, right) =>\r\n left.agentId.localeCompare(right.agentId)\r\n ),\r\n issues: scanResult.issues\r\n };\r\n}\r\n\r\nfunction buildSkillsView(scanResult: RunScanResult) {\r\n const groups = new Map<\r\n string,\r\n {\r\n skillName: string;\r\n entries: RunScanResult[\"entries\"];\r\n }\r\n >();\r\n\r\n for (const entry of scanResult.entries) {\r\n const current = groups.get(entry.skillName) ?? {\r\n skillName: entry.skillName,\r\n entries: []\r\n };\r\n current.entries.push(entry);\r\n groups.set(entry.skillName, current);\r\n }\r\n\r\n return {\r\n view: \"skills\" as const,\r\n skills: [...groups.values()].sort((left, right) =>\r\n left.skillName.localeCompare(right.skillName)\r\n ),\r\n issues: scanResult.issues\r\n };\r\n}\r\n\r\nfunction buildListData(scanResult: RunScanResult, view: ListView): unknown {\r\n if (view === \"agents\") {\r\n return buildAgentsView(scanResult);\r\n }\r\n\r\n if (view === \"skills\") {\r\n return buildSkillsView(scanResult);\r\n }\r\n\r\n return buildRecordsView(scanResult);\r\n}\r\n\r\nfunction buildTableOutput(data: unknown, view: ListView): string {\r\n if (view === \"agents\") {\r\n const agentRows = (data as { agents: Array<{ agentId: string; agentName: string; entries: unknown[] }> }).agents;\r\n return printTable(\r\n agentRows.map((agent) => ({\r\n agent: agent.agentId,\r\n name: agent.agentName,\r\n entries: String(agent.entries.length)\r\n })),\r\n [\r\n { key: \"agent\", label: \"Agent\" },\r\n { key: \"name\", label: \"Name\" },\r\n { key: \"entries\", label: \"Entries\" }\r\n ]\r\n );\r\n }\r\n\r\n if (view === \"skills\") {\r\n const skillRows = (data as { skills: Array<{ skillName: string; entries: unknown[] }> }).skills;\r\n return printTable(\r\n skillRows.map((skill) => ({\r\n skill: skill.skillName,\r\n entries: String(skill.entries.length)\r\n })),\r\n [\r\n { key: \"skill\", label: \"Skill\" },\r\n { key: \"entries\", label: \"Entries\" }\r\n ]\r\n );\r\n }\r\n\r\n const records = (data as { records: Array<{ agentId: string; skillName: string; kind: string }> }).records;\r\n return printTable(\r\n records.map((record) => ({\r\n agent: record.agentId,\r\n skill: record.skillName,\r\n kind: record.kind\r\n })),\r\n [\r\n { key: \"agent\", label: \"Agent\" },\r\n { key: \"skill\", label: \"Skill\" },\r\n { key: \"kind\", label: \"Kind\" }\r\n ]\r\n );\r\n}\r\n\r\nexport async function runList(options: RunListOptions = {}): Promise<RunListResult> {\r\n const view = options.view ?? \"records\";\r\n const format = options.format ?? \"table\";\r\n const scanResult = await runScan(options);\r\n const data = buildListData(scanResult, view);\r\n\r\n return {\r\n data,\r\n output: format === \"json\" ? printJson(data) : buildTableOutput(data, view)\r\n };\r\n}\r\n","#!/usr/bin/env node\r\n\r\nimport { buildCli } from \"./index\";\r\n\r\nawait buildCli().parseAsync(process.argv);\r\n"],"mappings":"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","names":["fs","join","resolve","resolve","join","homedir","buildTableOutput","homedir","fs","homedir","join","fs","fs","resolve","fs","resolve","resolve","fs","join","resolve","z","z","fs","join","getManifestPath","join","resolve","formatValidationIssues","buildIssue","pathExists","join","buildTableOutput","homedir","fs","homedir","join","fs","dirname","resolve","resolve","dirname","fs","pathExists","homedir","join","fs","homedir","join","buildAgentRecord","buildActivationRecord","upsertActivation","resolveTargetAgent","homedir","join","resolve","homedir","fs","dirname","join","resolve","join","dirname","resolve","resolve","homedir","homedir","buildAgentRecord","homedir","buildTableOutput"]}
@@ -0,0 +1,5 @@
1
+ import { Command } from 'commander';
2
+
3
+ declare function buildCli(): Command;
4
+
5
+ export { buildCli };