skillmux 0.1.3 → 0.1.5

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/config/default-agent-rules.ts","../src/commands/adopt.ts","../src/core/errors.ts","../src/core/ids.ts","../src/config/resolve-skillmux-home.ts","../src/discovery/discover-agents.ts","../src/config/auto-register-agents.ts","../src/config/load-user-config.ts","../src/config/write-user-config.ts","../src/discovery/scan-agent-skills.ts","../src/discovery/infer-skill-entry.ts","../src/fs/path-utils.ts","../src/fs/safe-copy.ts","../src/core/batch-operation-error.ts","../src/fs/link-ops.ts","../src/manifest/read-manifest.ts","../src/manifest/build-empty-manifest.ts","../src/manifest/manifest-schema.ts","../src/manifest/write-manifest.ts","../src/output/print-json.ts","../src/commands/config-add-agent.ts","../src/config/agent-override-validation.ts","../src/output/print-table.ts","../src/commands/config-remove-agent.ts","../src/commands/config-update-agent.ts","../src/commands/doctor.ts","../src/diagnostics/collect-doctor-issues.ts","../src/commands/disable.ts","../src/fs/safe-remove-link.ts","../src/commands/enable.ts","../src/commands/import.ts","../src/commands/scan.ts","../src/output/format-issue.ts","../src/commands/remove.ts"],"sourcesContent":["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 { homedir } from \"node:os\";\r\nimport { join, resolve } 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 { AdoptionError } from \"../core/errors\";\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 {\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 {\r\n assertSkillSourceLayout,\r\n copySkillContentsToManagedStore,\r\n hasRootSkillFile\r\n} from \"../fs/safe-copy\";\r\nimport { BatchOperationError } from \"../core/batch-operation-error\";\r\nimport {\r\n isLinkPointingToTarget,\r\n replaceEntryWithManagedLink\r\n} from \"../fs/link-ops\";\r\nimport { pathsAreEqual } from \"../fs/path-utils\";\r\nimport { readManifest } from \"../manifest/read-manifest\";\r\nimport { writeManifest } from \"../manifest/write-manifest\";\r\nimport { printJson } from \"../output/print-json\";\r\n\r\nexport type AdoptSkippedReason =\r\n | \"already-managed\"\r\n | \"missing-skill-file\"\r\n | \"not-adoptable\";\r\n\r\nexport type AdoptedSkill = {\r\n skillId: string;\r\n agentId: string;\r\n sourcePath: string;\r\n managedPath: string;\r\n linkPath: string;\r\n};\r\n\r\nexport type SkippedAdoption = {\r\n skillId: string;\r\n agentId: string;\r\n path: string;\r\n reason: AdoptSkippedReason;\r\n};\r\n\r\nexport type RunAdoptOptions = {\r\n homeDir?: string;\r\n skillmuxHome?: string;\r\n agent: string;\r\n skill?: string;\r\n skills?: string[];\r\n now?: Date;\r\n json?: boolean;\r\n};\r\n\r\nexport type RunAdoptSingleResult = {\r\n agent: AgentRecord;\r\n adopted: AdoptedSkill[];\r\n skipped: SkippedAdoption[];\r\n manifest: Manifest;\r\n output: string;\r\n};\r\n\r\nexport type RunAdoptBatchResult = RunAdoptSingleResult & {\r\n results: RunAdoptSingleResult[];\r\n};\r\n\r\nexport type RunAdoptResult = RunAdoptSingleResult | RunAdoptBatchResult;\r\n\r\nfunction buildManagedSkillPath(skillmuxHome: string, skillId: string): string {\r\n return resolve(skillmuxHome, \"skills\", skillId);\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: \"enabled\",\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 AdoptionError(`Unknown agent: ${agentName}`);\r\n }\r\n\r\n if (!agent.supportedOnPlatform) {\r\n throw new AdoptionError(\r\n `Agent ${agent.id} is not supported on ${process.platform}`\r\n );\r\n }\r\n\r\n return agent;\r\n}\r\n\r\nfunction filterEntries(\r\n scannedAgent: ScanAgentSkillsResult,\r\n skillFilter?: string\r\n): ScannedSkillEntry[] {\r\n if (skillFilter === undefined) {\r\n return scannedAgent.entries;\r\n }\r\n\r\n const skillId = normalizeId(skillFilter);\r\n return scannedAgent.entries.filter(\r\n (entry) => normalizeId(entry.skillName) === skillId\r\n );\r\n}\r\n\r\nasync function resolveAdoptionSource(\r\n entry: ScannedSkillEntry\r\n): Promise<string | undefined> {\r\n if (entry.kind === \"unmanaged-link\") {\r\n return entry.targetPath;\r\n }\r\n\r\n if (entry.kind === \"unmanaged-directory\") {\r\n return entry.path;\r\n }\r\n\r\n return undefined;\r\n}\r\n\r\nfunction buildManagedSkill(\r\n skillId: string,\r\n skillName: string,\r\n managedPath: string,\r\n sourcePath: string,\r\n timestamp: string\r\n): ManagedSkill {\r\n return {\r\n id: skillId,\r\n name: skillName,\r\n path: managedPath,\r\n source: {\r\n kind: \"imported\",\r\n path: sourcePath\r\n },\r\n importedAt: timestamp\r\n };\r\n}\r\n\r\nasync function reconcileManagedLink(\r\n manifest: Manifest,\r\n skillId: string,\r\n entry: ScannedSkillEntry,\r\n agentId: string,\r\n timestamp: string\r\n): Promise<void> {\r\n if (entry.targetPath === undefined) {\r\n throw new AdoptionError(`Managed link target is missing for ${entry.path}`);\r\n }\r\n\r\n await assertSkillSourceLayout(entry.targetPath);\r\n\r\n const skill = manifest.skills[skillId];\r\n if (skill === undefined || !pathsAreEqual(skill.path, entry.targetPath)) {\r\n throw new AdoptionError(\r\n `Managed link for ${agentId}/${skillId} has no matching manifest skill record`\r\n );\r\n }\r\n\r\n upsertActivation(\r\n manifest,\r\n buildActivationRecord(skillId, agentId, entry.path, timestamp)\r\n );\r\n}\r\n\r\nfunction buildOutput(result: Omit<RunAdoptResult, \"output\">, json: boolean): string {\r\n if (json) {\r\n return printJson({\r\n agent: result.agent,\r\n adopted: result.adopted,\r\n skipped: result.skipped\r\n });\r\n }\r\n\r\n if (result.adopted.length === 0) {\r\n return `No skills adopted for ${result.agent.id}.\\n`;\r\n }\r\n\r\n const adoptedSkills = result.adopted\r\n .map((entry) => entry.skillId)\r\n .sort((left, right) => left.localeCompare(right))\r\n .join(\", \");\r\n return `Adopted ${adoptedSkills} for ${result.agent.id}\\n`;\r\n}\r\n\r\nasync function runAdoptSingle(\r\n options: RunAdoptOptions\r\n): Promise<RunAdoptSingleResult> {\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 agent = await resolveTargetAgent(homeDir, skillmuxHome, options.agent);\r\n const agentRecord = buildAgentRecord(agent, timestamp);\r\n const scannedAgent = await scanAgentSkills(agent, skillmuxHome);\r\n const entries = filterEntries(scannedAgent, options.skill);\r\n const adopted: AdoptedSkill[] = [];\r\n const skipped: SkippedAdoption[] = [];\r\n\r\n manifest.agents[agent.id] = agentRecord;\r\n\r\n for (const entry of entries) {\r\n const skillId = normalizeId(entry.skillName);\r\n\r\n if (entry.kind === \"managed-link\") {\r\n await reconcileManagedLink(\r\n manifest,\r\n skillId,\r\n entry,\r\n agent.id,\r\n timestamp\r\n );\r\n skipped.push({\r\n skillId,\r\n agentId: agent.id,\r\n path: entry.path,\r\n reason: \"already-managed\"\r\n });\r\n await writeManifest(skillmuxHome, manifest);\r\n continue;\r\n }\r\n\r\n const sourcePath = await resolveAdoptionSource(entry);\r\n if (sourcePath === undefined) {\r\n skipped.push({\r\n skillId,\r\n agentId: agent.id,\r\n path: entry.path,\r\n reason: \"not-adoptable\"\r\n });\r\n continue;\r\n }\r\n\r\n if (!(await hasRootSkillFile(sourcePath))) {\r\n skipped.push({\r\n skillId,\r\n agentId: agent.id,\r\n path: entry.path,\r\n reason: \"missing-skill-file\"\r\n });\r\n continue;\r\n }\r\n\r\n const managedPath = buildManagedSkillPath(skillmuxHome, skillId);\r\n\r\n if (manifest.skills[skillId] === undefined) {\r\n await copySkillContentsToManagedStore(sourcePath, managedPath);\r\n manifest.skills[skillId] = buildManagedSkill(\r\n skillId,\r\n entry.skillName,\r\n managedPath,\r\n sourcePath,\r\n timestamp\r\n );\r\n } else if (await isLinkPointingToTarget(entry.path, manifest.skills[skillId].path)) {\r\n skipped.push({\r\n skillId,\r\n agentId: agent.id,\r\n path: entry.path,\r\n reason: \"already-managed\"\r\n });\r\n continue;\r\n } else {\r\n await assertSkillSourceLayout(manifest.skills[skillId].path);\r\n }\r\n\r\n await replaceEntryWithManagedLink(\r\n entry.path,\r\n manifest.skills[skillId].path,\r\n sourcePath\r\n );\r\n\r\n const activation = buildActivationRecord(\r\n skillId,\r\n agent.id,\r\n join(agent.absoluteSkillsDirectoryPath, entry.skillName),\r\n timestamp\r\n );\r\n upsertActivation(manifest, activation);\r\n adopted.push({\r\n skillId,\r\n agentId: agent.id,\r\n sourcePath,\r\n managedPath: manifest.skills[skillId].path,\r\n linkPath: activation.linkPath\r\n });\r\n await writeManifest(skillmuxHome, manifest);\r\n }\r\n\r\n await writeManifest(skillmuxHome, manifest);\r\n\r\n const resultWithoutOutput = {\r\n agent: agentRecord,\r\n adopted,\r\n skipped,\r\n manifest\r\n };\r\n\r\n return {\r\n ...resultWithoutOutput,\r\n output: buildOutput(resultWithoutOutput, options.json === true)\r\n };\r\n}\r\n\r\nexport async function runAdopt(\r\n options: RunAdoptOptions & { skills: string[] }\r\n): Promise<RunAdoptBatchResult>;\r\nexport async function runAdopt(\r\n options: RunAdoptOptions\r\n): Promise<RunAdoptSingleResult>;\r\nexport async function runAdopt(\r\n options: RunAdoptOptions\r\n): Promise<RunAdoptResult> {\r\n if (options.skills !== undefined) {\r\n const results: RunAdoptSingleResult[] = [];\r\n const completedSkills: string[] = [];\r\n\r\n for (const skill of options.skills) {\r\n try {\r\n results.push(await runAdoptSingle({ ...options, skill, skills: undefined }));\r\n completedSkills.push(skill);\r\n } catch (error) {\r\n throw new BatchOperationError({\r\n operation: \"adopt\",\r\n failedItem: skill,\r\n failedAction: `adopt ${skill} for ${options.agent}`,\r\n completedAction: \"adopting\",\r\n completedItems: completedSkills,\r\n cause: error\r\n });\r\n }\r\n }\r\n\r\n if (results.length === 0) {\r\n throw new AdoptionError(\"Adopt requires at least one target skill\");\r\n }\r\n\r\n const lastResult = results[results.length - 1] as RunAdoptSingleResult;\r\n const resultWithoutOutput = {\r\n agent: lastResult.agent,\r\n adopted: results.flatMap((result) => result.adopted),\r\n skipped: results.flatMap((result) => result.skipped),\r\n manifest: lastResult.manifest,\r\n results\r\n };\r\n\r\n return {\r\n ...resultWithoutOutput,\r\n output: options.json === true\r\n ? printJson({\r\n agent: resultWithoutOutput.agent,\r\n adopted: resultWithoutOutput.adopted,\r\n skipped: resultWithoutOutput.skipped,\r\n results: resultWithoutOutput.results\r\n })\r\n : results.map((result) => result.output).join(\"\")\r\n };\r\n }\r\n\r\n return runAdoptSingle(options);\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\r\nexport class AdoptionError extends SkillMuxError {\r\n constructor(message: string) {\r\n super(message);\r\n }\r\n}\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 { 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 { autoRegisterNewAgents } from \"../config/auto-register-agents\";\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 autoDiscovered?: 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 await autoRegisterNewAgents(homeDir);\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 autoDiscovered: override.autoDiscovered === true || undefined\n });\n }\n\n return discoveredAgents;\n}\n","import { existsSync, readdirSync, statSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport {\n builtInAgentIds,\n type BuiltInAgentId\n} from \"./default-agent-rules\";\nimport {\n loadUserConfig,\n type AgentOverride,\n type UserConfig\n} from \"./load-user-config\";\nimport { resolveSkillmuxHome } from \"./resolve-skillmux-home\";\nimport { writeUserConfig } from \"./write-user-config\";\n\nfunction isDotDir(name: string): boolean {\n return name.startsWith(\".\");\n}\n\nfunction isValidAgentId(name: string): boolean {\n if (name.length < 2) return false;\n const stem = name.slice(1);\n return /^[a-z][a-z0-9-]*$/u.test(stem);\n}\n\nfunction dirExists(dirPath: string): boolean {\n try {\n return statSync(dirPath).isDirectory();\n } catch {\n return false;\n }\n}\n\nfunction isBuiltInAgentId(id: string): id is BuiltInAgentId {\n return (builtInAgentIds as readonly string[]).includes(id);\n}\n\nfunction makeAutoDiscoveredOverride(dirName: string): AgentOverride {\n const stem = dirName.slice(1);\n return {\n stableName: stem.charAt(0).toUpperCase() + stem.slice(1),\n supportedPlatforms: [\"win32\", \"linux\", \"darwin\"],\n homeRelativeRootPath: dirName,\n skillsDirectoryPath: \"skills\",\n enabledByDefault: true,\n autoDiscovered: true\n };\n}\n\nexport async function autoRegisterNewAgents(\n homeDir?: string\n): Promise<void> {\n const resolvedHomeDir = homeDir ?? homedir();\n const { skillmuxHome } = resolveSkillmuxHome(resolvedHomeDir);\n const config = await loadUserConfig(skillmuxHome);\n\n const autoDiscover = config.autoDiscover ?? {\n lastRunAt: null,\n intervalMs: 3600000\n };\n\n if (autoDiscover.lastRunAt !== null && autoDiscover.intervalMs > 0) {\n const elapsed = Date.now() - new Date(autoDiscover.lastRunAt).getTime();\n if (elapsed < autoDiscover.intervalMs) {\n return;\n }\n }\n\n const wellKnownNonAgentDirs = new Set([\".skillmux\"]);\n\n const removedIds = new Set(config.removedAutoAgentIds ?? []);\n let changed = false;\n\n let entries: string[];\n try {\n entries = readdirSync(resolvedHomeDir);\n } catch {\n return;\n }\n\n const nextAgents: Record<string, AgentOverride> = { ...config.agents };\n\n for (const name of entries) {\n if (!isDotDir(name)) continue;\n if (wellKnownNonAgentDirs.has(name)) continue;\n if (!isValidAgentId(name)) continue;\n\n const agentId = name.slice(1).toLowerCase().replace(/[^a-z0-9]+/g, \"-\");\n\n if (agentId in nextAgents) continue;\n if (isBuiltInAgentId(agentId)) continue;\n if (removedIds.has(agentId)) continue;\n\n const skillsDir = join(resolvedHomeDir, name, \"skills\");\n if (!dirExists(skillsDir)) continue;\n\n nextAgents[agentId] = makeAutoDiscoveredOverride(name);\n changed = true;\n }\n\n if (!changed && autoDiscover.lastRunAt !== null) {\n return;\n }\n\n const nextConfig: UserConfig = {\n ...config,\n agents: nextAgents,\n autoDiscover: {\n ...autoDiscover,\n lastRunAt: new Date().toISOString()\n },\n removedAutoAgentIds: [...removedIds]\n };\n\n await writeUserConfig(skillmuxHome, nextConfig);\n}\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 autoDiscovered: z.literal(true).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 autoDiscover: z\r\n .object({\r\n lastRunAt: z.string().nullable(),\r\n intervalMs: z.number().int().nonnegative()\r\n })\r\n .optional(),\r\n removedAutoAgentIds: z.array(z.string().min(1)).optional()\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 autoDiscovered?: true;\r\n};\r\n\r\nexport type UserConfig = {\r\n version: 1;\r\n agents: Record<string, AgentOverride>;\r\n autoDiscover?: {\r\n lastRunAt: string | null;\r\n intervalMs: number;\r\n };\r\n removedAutoAgentIds?: string[];\r\n};\r\n\r\nfunction createEmptyUserConfig(): UserConfig {\r\n return {\r\n version: 1,\r\n agents: {},\r\n autoDiscover: {\r\n lastRunAt: null,\r\n intervalMs: 3600000\r\n },\r\n removedAutoAgentIds: []\r\n };\r\n}\n\nfunction stripUtf8Bom(contents: string): string {\n return contents.charCodeAt(0) === 0xfeff ? contents.slice(1) : contents;\n}\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 {\n const contents = await fs.readFile(configPath, \"utf8\");\n const parsed = JSON.parse(stripUtf8Bom(contents)) as unknown;\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","import * as fs from \"node:fs/promises\";\nimport { buildConfigPath, type SkillmuxHomeResolution } from \"./resolve-skillmux-home\";\nimport type { UserConfig } from \"./load-user-config\";\n\nexport async function writeUserConfig(\n skillmuxHome: string,\n config: UserConfig\n): Promise<SkillmuxHomeResolution> {\n const configPath = buildConfigPath(skillmuxHome);\n await fs.mkdir(skillmuxHome, { recursive: true });\n await fs.writeFile(configPath, `${JSON.stringify(config, null, 2)}\\n`, \"utf8\");\n\n return {\n skillmuxHome,\n configPath\n };\n}\n","import * as fs from \"node:fs/promises\";\r\nimport { join } from \"node:path\";\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: join(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-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: \"unmanaged-link\",\r\n path: absolutePath,\r\n targetPath\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\";\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 hasRootSkillFile(sourcePath: string): Promise<boolean> {\r\n const resolvedSourcePath = resolve(sourcePath);\r\n const skillFilePath = join(resolvedSourcePath, \"SKILL.md\");\r\n\r\n try {\r\n await assertDirectory(resolvedSourcePath);\r\n await assertRegularFile(skillFilePath, \"SKILL.md\");\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 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","export type BatchOperationName = \"enable\" | \"disable\" | \"adopt\" | \"remove\";\r\n\r\nexport type BatchOperationErrorOptions = {\r\n operation: BatchOperationName;\r\n failedItem: string;\r\n failedAction: string;\r\n completedAction: string;\r\n completedItems: string[];\r\n cause: unknown;\r\n};\r\n\r\nfunction getCauseMessage(cause: unknown): string {\r\n if (cause instanceof Error) {\r\n return cause.message;\r\n }\r\n\r\n return String(cause);\r\n}\r\n\r\nfunction buildBatchOperationMessage(options: BatchOperationErrorOptions): string {\r\n const completedSuffix = options.completedItems.length > 0\r\n ? ` after ${options.completedAction}: ${options.completedItems.join(\", \")}`\r\n : \"\";\r\n\r\n return `Failed to ${options.failedAction}${completedSuffix}: ${getCauseMessage(options.cause)}`;\r\n}\r\n\r\nexport class BatchOperationError extends Error {\r\n readonly operation: BatchOperationName;\r\n readonly failedItem: string;\r\n readonly completedItems: string[];\r\n override readonly cause: unknown;\r\n\r\n constructor(options: BatchOperationErrorOptions) {\r\n super(buildBatchOperationMessage(options), { cause: options.cause });\r\n this.name = \"BatchOperationError\";\r\n this.operation = options.operation;\r\n this.failedItem = options.failedItem;\r\n this.completedItems = [...options.completedItems];\r\n this.cause = options.cause;\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 replaceEntryWithManagedLink(\r\n linkPath: string,\r\n targetPath: string,\r\n expectedCurrentPath: string\r\n): Promise<boolean> {\r\n const resolvedLinkPath = resolve(linkPath);\r\n const resolvedTargetPath = resolve(targetPath);\r\n const resolvedExpectedCurrentPath = resolve(expectedCurrentPath);\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 const existingEntry = await fs.lstat(resolvedLinkPath);\r\n\r\n if (existingEntry.isSymbolicLink()) {\r\n const currentTargetPath = await fs.realpath(resolvedLinkPath);\r\n\r\n if (pathsAreEqual(currentTargetPath, resolvedTargetPath)) {\r\n return false;\r\n }\r\n\r\n if (!pathsAreEqual(currentTargetPath, resolvedExpectedCurrentPath)) {\r\n throw new Error(`Refusing to replace unexpected link at ${resolvedLinkPath}`);\r\n }\r\n\r\n await fs.rm(resolvedLinkPath, { recursive: true, force: false });\r\n await fs.symlink(resolvedTargetPath, resolvedLinkPath, directoryLinkType);\r\n return true;\r\n }\r\n\r\n if (!existingEntry.isDirectory()) {\r\n throw new Error(`Refusing to replace non-directory entry at ${resolvedLinkPath}`);\r\n }\r\n\r\n const currentPath = await fs.realpath(resolvedLinkPath);\r\n if (!pathsAreEqual(currentPath, resolvedExpectedCurrentPath)) {\r\n throw new Error(`Refusing to replace unexpected directory at ${resolvedLinkPath}`);\r\n }\r\n\r\n await fs.rm(resolvedLinkPath, { recursive: true, force: false });\r\n await fs.symlink(resolvedTargetPath, resolvedLinkPath, directoryLinkType);\r\n return true;\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\";\r\nimport { join, resolve } from \"node:path\";\r\nimport { ManifestValidationError } from \"../core/errors\";\r\nimport type { Manifest } from \"../core/types\";\r\nimport { buildEmptyManifest } from \"./build-empty-manifest\";\r\nimport { manifestSchema } from \"./manifest-schema\";\r\nimport { writeManifest } from \"./write-manifest\";\r\n\r\nfunction getManifestPath(home: string): string {\r\n return join(home, \"manifest.json\");\r\n}\r\n\r\nfunction normalizeHomePath(home: string): string {\r\n const resolvedHome = resolve(home);\r\n return process.platform === \"win32\"\r\n ? resolvedHome.toLowerCase()\r\n : resolvedHome;\r\n}\r\n\r\nexport function formatValidationIssues(error: {\r\n issues: Array<{ path: (string | number)[]; message: string }>;\r\n}): 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 readManifest(home: string): Promise<Manifest> {\r\n const manifestPath = getManifestPath(home);\r\n\r\n try {\r\n const contents = await fs.readFile(manifestPath, \"utf8\");\r\n const parsedJson = JSON.parse(contents) as unknown;\r\n const parsedManifest = manifestSchema.safeParse(parsedJson);\r\n\r\n if (!parsedManifest.success) {\r\n throw new ManifestValidationError(\r\n `Invalid manifest at ${manifestPath}: ${formatValidationIssues(parsedManifest.error)}`\r\n );\r\n }\r\n\r\n if (\r\n normalizeHomePath(parsedManifest.data.skillmuxHome) !==\r\n normalizeHomePath(home)\r\n ) {\r\n throw new ManifestValidationError(\r\n `Invalid manifest at ${manifestPath}: skillmuxHome must match ${home}`\r\n );\r\n }\r\n\r\n return parsedManifest.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 const emptyManifest = buildEmptyManifest(home);\r\n await writeManifest(home, emptyManifest);\r\n return emptyManifest;\r\n }\r\n\r\n if (error instanceof SyntaxError) {\r\n throw new ManifestValidationError(\r\n `Invalid manifest at ${manifestPath}: malformed JSON`\r\n );\r\n }\r\n\r\n throw error;\r\n }\r\n}\r\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 { 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","export function printJson(value: unknown): string {\r\n return `${JSON.stringify(value, null, 2)}\\n`;\r\n}\r\n","import { homedir } from \"node:os\";\nimport {\r\n normalizeAgentId,\r\n normalizePlatforms,\r\n normalizeRelativePath\r\n} from \"../config/agent-override-validation\";\r\nimport { loadUserConfig, type AgentOverride, type UserConfig } from \"../config/load-user-config\";\nimport { buildConfigPath, resolveSkillmuxHome } from \"../config/resolve-skillmux-home\";\nimport { writeUserConfig } from \"../config/write-user-config\";\nimport { printJson } from \"../output/print-json\";\nimport { printTable } from \"../output/print-table\";\n\nexport type RunConfigAddAgentOptions = {\n homeDir?: string;\n skillmuxHome?: string;\n id: string;\n root: string;\n skills?: string;\n name?: string;\n platforms?: string[];\n disabledByDefault?: boolean;\n json?: boolean;\n};\n\nexport type RunConfigAddAgentResult = {\n skillmuxHome: string;\n configPath: string;\n agentId: string;\n changed: boolean;\n agent: AgentOverride;\n config: UserConfig;\n output: string;\n};\n\nfunction buildAgentOverride(options: RunConfigAddAgentOptions): {\n agentId: string;\n agent: AgentOverride;\n} {\n const agentId = normalizeAgentId(options.id);\n const agent: AgentOverride = {\n supportedPlatforms: normalizePlatforms(options.platforms),\n homeRelativeRootPath: normalizeRelativePath(options.root, \"root\"),\n skillsDirectoryPath: normalizeRelativePath(options.skills ?? \"skills\", \"skills\")\n };\n\n if (options.name !== undefined && options.name.trim().length > 0) {\n agent.stableName = options.name.trim();\n }\n\n if (options.disabledByDefault === true) {\n agent.enabledByDefault = false;\n }\n\n return { agentId, agent };\n}\n\nfunction buildTableOutput(result: Omit<RunConfigAddAgentResult, \"output\">): string {\n const summary = printTable(\n [\n {\n agentId: result.agentId,\n configPath: result.configPath,\n changed: String(result.changed)\n }\n ],\n [\n { key: \"agentId\", label: \"Agent\" },\n { key: \"configPath\", label: \"Config Path\" },\n { key: \"changed\", label: \"Changed\" }\n ]\n );\n\n const detail = printTable(\n [\n {\n stableName: result.agent.stableName ?? \"\",\n platforms: (result.agent.supportedPlatforms ?? []).join(\",\"),\n root: result.agent.homeRelativeRootPath ?? \"\",\n skills: result.agent.skillsDirectoryPath ?? \"\",\n enabledByDefault:\n result.agent.enabledByDefault === undefined\n ? \"\"\n : String(result.agent.enabledByDefault)\n }\n ],\n [\n { key: \"stableName\", label: \"Name\" },\n { key: \"platforms\", label: \"Platforms\" },\n { key: \"root\", label: \"Root\" },\n { key: \"skills\", label: \"Skills Dir\" },\n { key: \"enabledByDefault\", label: \"Enabled By Default\" }\n ]\n );\n\n return `${summary}${detail}`;\n}\n\nexport async function runConfigAddAgent(\n options: RunConfigAddAgentOptions\n): Promise<RunConfigAddAgentResult> {\n const homeDir = options.homeDir ?? homedir();\n const resolvedPaths = resolveSkillmuxHome(homeDir);\n const skillmuxHome = options.skillmuxHome ?? resolvedPaths.skillmuxHome;\n const configPath = buildConfigPath(skillmuxHome);\n const config = await loadUserConfig(skillmuxHome);\n const { agentId, agent } = buildAgentOverride(options);\n const previous = config.agents[agentId];\n const changed = JSON.stringify(previous ?? null) !== JSON.stringify(agent);\n\n const nextConfig: UserConfig = {\n ...config,\n agents: {\n ...config.agents,\n [agentId]: agent\n }\n };\n\n await writeUserConfig(skillmuxHome, nextConfig);\n\n const resultWithoutOutput = {\n skillmuxHome,\n configPath,\n agentId,\n changed,\n agent,\n config: nextConfig\n };\n\n return {\n ...resultWithoutOutput,\n output:\n options.json === true\n ? printJson(resultWithoutOutput)\n : buildTableOutput(resultWithoutOutput)\n };\n}\n","import { isAbsolute } from \"node:path\";\r\nimport { InvalidIdentifierError, UserConfigValidationError } from \"../core/errors\";\r\nimport { normalizeId } from \"../core/ids\";\r\nimport { supportedPlatforms, type SupportedPlatform } from \"./default-agent-rules\";\r\n\r\nexport function normalizeRelativePath(value: string, field: string): string {\r\n const trimmed = value.trim();\r\n\r\n if (trimmed.length === 0) {\r\n throw new UserConfigValidationError(`${field} must not be empty`);\r\n }\r\n\r\n if (isAbsolute(trimmed)) {\r\n throw new UserConfigValidationError(`${field} must be a relative path`);\r\n }\r\n\r\n const normalized = trimmed.replaceAll(\"\\\\\", \"/\");\r\n\r\n if (normalized === \".\" || normalized === \"..\" || normalized.startsWith(\"../\") || normalized.includes(\"/../\")) {\r\n throw new UserConfigValidationError(`${field} must stay within the configured home-relative tree`);\r\n }\r\n\r\n return normalized.replace(/^\\.\\/+/, \"\");\r\n}\r\n\r\nexport function normalizeAgentId(value: string): string {\r\n const trimmed = value.trim();\r\n\r\n if (trimmed.length === 0 || /[a-z0-9]/i.test(trimmed) === false) {\r\n throw new InvalidIdentifierError(\"agent id\", value);\r\n }\r\n\r\n return normalizeId(trimmed);\r\n}\r\n\r\nexport function normalizePlatforms(value: string[] | undefined): SupportedPlatform[] {\r\n if (value === undefined || value.length === 0) {\r\n return [process.platform as SupportedPlatform];\r\n }\r\n\r\n const normalized = [...new Set(value.map((entry) => entry.trim().toLowerCase()))];\r\n const invalid = normalized.filter(\r\n (entry): entry is string => supportedPlatforms.includes(entry as SupportedPlatform) === false\r\n );\r\n\r\n if (invalid.length > 0) {\r\n throw new UserConfigValidationError(\r\n `platform must be one of: ${supportedPlatforms.join(\", \")}`\r\n );\r\n }\r\n\r\n return normalized as SupportedPlatform[];\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\";\nimport { InvalidIdentifierError } from \"../core/errors\";\nimport { normalizeId } from \"../core/ids\";\nimport { loadUserConfig, type UserConfig } from \"../config/load-user-config\";\nimport { buildConfigPath, resolveSkillmuxHome } from \"../config/resolve-skillmux-home\";\nimport { writeUserConfig } from \"../config/write-user-config\";\nimport { printJson } from \"../output/print-json\";\nimport { printTable } from \"../output/print-table\";\n\nexport type RunConfigRemoveAgentOptions = {\n homeDir?: string;\n skillmuxHome?: string;\n id: string;\n json?: boolean;\n};\n\nexport type RunConfigRemoveAgentResult = {\n skillmuxHome: string;\n configPath: string;\n agentId: string;\n changed: boolean;\n removed: boolean;\n config: UserConfig;\n output: string;\n};\n\nfunction normalizeAgentId(value: string): string {\n const trimmed = value.trim();\n\n if (trimmed.length === 0 || /[a-z0-9]/i.test(trimmed) === false) {\n throw new InvalidIdentifierError(\"agent id\", value);\n }\n\n return normalizeId(trimmed);\n}\n\nfunction buildTableOutput(result: Omit<RunConfigRemoveAgentResult, \"output\">): string {\n return printTable(\n [\n {\n agentId: result.agentId,\n configPath: result.configPath,\n changed: String(result.changed),\n removed: String(result.removed)\n }\n ],\n [\n { key: \"agentId\", label: \"Agent\" },\n { key: \"configPath\", label: \"Config Path\" },\n { key: \"changed\", label: \"Changed\" },\n { key: \"removed\", label: \"Removed\" }\n ]\n );\n}\n\nexport async function runConfigRemoveAgent(\n options: RunConfigRemoveAgentOptions\n): Promise<RunConfigRemoveAgentResult> {\n const homeDir = options.homeDir ?? homedir();\n const resolvedPaths = resolveSkillmuxHome(homeDir);\n const skillmuxHome = options.skillmuxHome ?? resolvedPaths.skillmuxHome;\n const configPath = buildConfigPath(skillmuxHome);\n const config = await loadUserConfig(skillmuxHome);\n const agentId = normalizeAgentId(options.id);\n const removed = agentId in config.agents;\n\n const removedOverride = config.agents[agentId];\n const wasAutoDiscovered = removedOverride?.autoDiscovered === true;\n\n const removedAutoAgentIds = wasAutoDiscovered\n ? [...(config.removedAutoAgentIds ?? []), agentId]\n : config.removedAutoAgentIds;\n\n const nextConfig: UserConfig = {\n ...config,\n agents: Object.fromEntries(\n Object.entries(config.agents).filter(([currentAgentId]) => currentAgentId !== agentId)\n ),\n ...(wasAutoDiscovered ? { removedAutoAgentIds } : {})\n };\n\n if (removed) {\n await writeUserConfig(skillmuxHome, nextConfig);\n }\n\n const resultWithoutOutput = {\n skillmuxHome,\n configPath,\n agentId,\n changed: removed,\n removed,\n config: nextConfig\n };\n\n return {\n ...resultWithoutOutput,\n output:\n options.json === true\n ? printJson(resultWithoutOutput)\n : buildTableOutput(resultWithoutOutput)\n };\n}\n","import { homedir } from \"node:os\";\r\nimport {\r\n normalizeAgentId,\r\n normalizePlatforms,\r\n normalizeRelativePath\r\n} from \"../config/agent-override-validation\";\r\nimport { UserConfigValidationError } from \"../core/errors\";\r\nimport { loadUserConfig, type AgentOverride, type UserConfig } from \"../config/load-user-config\";\r\nimport { buildConfigPath, resolveSkillmuxHome } from \"../config/resolve-skillmux-home\";\r\nimport { writeUserConfig } from \"../config/write-user-config\";\r\nimport { printJson } from \"../output/print-json\";\r\nimport { printTable } from \"../output/print-table\";\r\n\r\nexport type RunConfigUpdateAgentOptions = {\r\n homeDir?: string;\r\n skillmuxHome?: string;\r\n id: string;\r\n root?: string;\r\n skills?: string;\r\n name?: string;\r\n platforms?: string[];\r\n enabledByDefault?: boolean;\r\n disabledByDefault?: boolean;\r\n json?: boolean;\r\n};\r\n\r\nexport type RunConfigUpdateAgentResult = {\r\n skillmuxHome: string;\r\n configPath: string;\r\n agentId: string;\r\n changed: boolean;\r\n agent: AgentOverride;\r\n config: UserConfig;\r\n output: string;\r\n};\r\n\r\nfunction buildAgentPatch(options: RunConfigUpdateAgentOptions): AgentOverride {\r\n const patch: AgentOverride = {};\r\n\r\n if (options.root !== undefined) {\r\n patch.homeRelativeRootPath = normalizeRelativePath(options.root, \"root\");\r\n }\r\n\r\n if (options.skills !== undefined) {\r\n patch.skillsDirectoryPath = normalizeRelativePath(options.skills, \"skills\");\r\n }\r\n\r\n if (options.name !== undefined && options.name.trim().length > 0) {\r\n patch.stableName = options.name.trim();\r\n }\r\n\r\n if (options.platforms !== undefined) {\r\n patch.supportedPlatforms = normalizePlatforms(options.platforms);\r\n }\r\n\r\n if (options.enabledByDefault !== undefined && options.disabledByDefault === true) {\r\n throw new UserConfigValidationError(\r\n \"enabled-by-default and disabled-by-default cannot both be set\"\r\n );\r\n }\r\n\r\n if (options.enabledByDefault !== undefined) {\r\n patch.enabledByDefault = options.enabledByDefault;\r\n }\r\n\r\n if (options.disabledByDefault === true) {\r\n patch.enabledByDefault = false;\r\n }\r\n\r\n return patch;\r\n}\r\n\r\nfunction buildTableOutput(result: Omit<RunConfigUpdateAgentResult, \"output\">): string {\r\n const summary = printTable(\r\n [\r\n {\r\n agentId: result.agentId,\r\n configPath: result.configPath,\r\n changed: String(result.changed)\r\n }\r\n ],\r\n [\r\n { key: \"agentId\", label: \"Agent\" },\r\n { key: \"configPath\", label: \"Config Path\" },\r\n { key: \"changed\", label: \"Changed\" }\r\n ]\r\n );\r\n\r\n const detail = printTable(\r\n [\r\n {\r\n stableName: result.agent.stableName ?? \"\",\r\n platforms: (result.agent.supportedPlatforms ?? []).join(\",\"),\r\n root: result.agent.homeRelativeRootPath ?? \"\",\r\n skills: result.agent.skillsDirectoryPath ?? \"\",\r\n enabledByDefault:\r\n result.agent.enabledByDefault === undefined\r\n ? \"\"\r\n : String(result.agent.enabledByDefault)\r\n }\r\n ],\r\n [\r\n { key: \"stableName\", label: \"Name\" },\r\n { key: \"platforms\", label: \"Platforms\" },\r\n { key: \"root\", label: \"Root\" },\r\n { key: \"skills\", label: \"Skills Dir\" },\r\n { key: \"enabledByDefault\", label: \"Enabled By Default\" }\r\n ]\r\n );\r\n\r\n return `${summary}${detail}`;\r\n}\r\n\r\nexport async function runConfigUpdateAgent(\r\n options: RunConfigUpdateAgentOptions\r\n): Promise<RunConfigUpdateAgentResult> {\r\n const homeDir = options.homeDir ?? homedir();\r\n const resolvedPaths = resolveSkillmuxHome(homeDir);\r\n const skillmuxHome = options.skillmuxHome ?? resolvedPaths.skillmuxHome;\r\n const configPath = buildConfigPath(skillmuxHome);\r\n const config = await loadUserConfig(skillmuxHome);\r\n const agentId = normalizeAgentId(options.id);\r\n const previous = config.agents[agentId];\r\n\r\n if (previous === undefined) {\r\n throw new UserConfigValidationError(`Agent override does not exist: ${agentId}`);\r\n }\r\n\r\n const agent: AgentOverride = {\r\n ...previous,\r\n ...buildAgentPatch(options)\r\n };\r\n\r\n if (previous.autoDiscovered === true) {\r\n delete agent.autoDiscovered;\r\n }\r\n\r\n const changed = JSON.stringify(previous) !== JSON.stringify(agent);\r\n\r\n const nextConfig: UserConfig = {\r\n ...config,\r\n agents: {\r\n ...config.agents,\r\n [agentId]: agent\r\n }\r\n };\r\n\r\n if (changed) {\r\n await writeUserConfig(skillmuxHome, nextConfig);\r\n }\r\n\r\n const resultWithoutOutput = {\r\n skillmuxHome,\r\n configPath,\r\n agentId,\r\n changed,\r\n agent,\r\n config: nextConfig\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 { homedir } from \"node:os\";\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 collectDoctorIssues,\r\n dedupeAndSortIssues\r\n} from \"../diagnostics/collect-doctor-issues\";\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 { 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 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 const doctorIssues = await collectDoctorIssues({\r\n manifest,\r\n agents,\r\n entries\r\n });\r\n const dedupedIssues = dedupeAndSortIssues([...issues, ...doctorIssues]);\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 { join } from \"node:path\";\r\nimport type { Manifest, ScanIssue } from \"../core/types\";\r\nimport type { DiscoveredAgent } from \"../discovery/discover-agents\";\r\nimport type { ScannedSkillEntry } from \"../discovery/infer-skill-entry\";\r\nimport { normalizeAbsolutePath } from \"../fs/path-utils\";\r\n\r\nexport type CollectDoctorIssuesInput = {\r\n manifest: Manifest;\r\n agents: DiscoveredAgent[];\r\n entries: ScannedSkillEntry[];\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\r\n ? { code, severity, message }\r\n : { 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 issueSortKey(issue: ScanIssue): string {\r\n return `${issue.severity}:${issue.code}:${issue.path ?? \"\"}:${issue.message}`;\r\n}\r\n\r\nfunction sortIssues(issues: ScanIssue[]): ScanIssue[] {\r\n return [...issues].sort((left, right) =>\r\n issueSortKey(left).localeCompare(issueSortKey(right))\r\n );\r\n}\r\n\r\nexport function dedupeAndSortIssues(issues: ScanIssue[]): ScanIssue[] {\r\n const issueByKey = new Map<string, ScanIssue>();\r\n\r\n for (const issue of issues) {\r\n issueByKey.set(issueSortKey(issue), issue);\r\n }\r\n\r\n return sortIssues([...issueByKey.values()]);\r\n}\r\n\r\nexport async function collectDoctorIssues(\r\n input: CollectDoctorIssuesInput\r\n): Promise<ScanIssue[]> {\r\n const issues: ScanIssue[] = [];\r\n\r\n await addUnmanagedDirectoryIssues(input.entries, issues);\r\n await addMissingManagedSkillIssues(input.manifest, issues);\r\n addConflictingAgentPathIssues(input.agents, issues);\r\n\r\n return dedupeAndSortIssues(issues);\r\n}\r\n","import * as fs from \"node:fs/promises\";\r\nimport { homedir } from \"node:os\";\r\nimport { join, resolve } 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 { BatchOperationError } from \"../core/batch-operation-error\";\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 {\r\n assertSkillSourceLayout,\r\n copySkillContentsToManagedStore\r\n} from \"../fs/safe-copy\";\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 agents?: string[];\r\n now?: Date;\r\n};\r\n\r\nexport type RunDisableSingleResult = {\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\nexport type RunDisableBatchResult = {\r\n changed: boolean;\r\n skill: ManagedSkill;\r\n results: RunDisableSingleResult[];\r\n changedAgents: string[];\r\n manifest: Manifest;\r\n output: string;\r\n};\r\n\r\nexport type RunDisableResult = RunDisableSingleResult | RunDisableBatchResult;\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\nfunction buildManagedSkillPath(skillmuxHome: string, skillId: string): string {\r\n return resolve(skillmuxHome, \"skills\", skillId);\r\n}\r\n\r\nasync function tryAdoptManagedSkill(\r\n manifest: Manifest,\r\n skillmuxHome: string,\r\n skillId: string,\r\n skillName: string,\r\n linkPath: string,\r\n timestamp: string\r\n): Promise<{ skill: ManagedSkill; sourcePath: string } | undefined> {\r\n try {\r\n const entry = await fs.lstat(linkPath);\r\n\r\n if (!entry.isSymbolicLink()) {\r\n return undefined;\r\n }\r\n } catch (error) {\r\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\r\n return undefined;\r\n }\r\n\r\n throw error;\r\n }\r\n\r\n const sourcePath = await fs.realpath(linkPath);\r\n await assertSkillSourceLayout(sourcePath);\r\n\r\n const managedSkillPath = buildManagedSkillPath(skillmuxHome, skillId);\r\n await copySkillContentsToManagedStore(sourcePath, managedSkillPath);\r\n\r\n const skill: ManagedSkill = {\r\n id: skillId,\r\n name: skillName,\r\n path: managedSkillPath,\r\n source: {\r\n kind: \"imported\",\r\n path: sourcePath\r\n },\r\n importedAt: timestamp\r\n };\r\n\r\n manifest.skills[skillId] = skill;\r\n return { skill, sourcePath };\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\nasync function runDisableSingle(\r\n options: RunDisableOptions\r\n): Promise<RunDisableSingleResult> {\r\n if (options.agent === undefined) {\r\n throw new Error(\"Disable requires one target agent\");\r\n }\r\n\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 agent = await resolveTargetAgent(homeDir, skillmuxHome, options.agent);\r\n const linkPath = join(agent.absoluteSkillsDirectoryPath, skillId);\r\n const adoption = manifest.skills[skillId]\r\n ? undefined\r\n : await tryAdoptManagedSkill(\r\n manifest,\r\n skillmuxHome,\r\n skillId,\r\n options.skill,\r\n linkPath,\r\n timestamp\r\n );\r\n const skill = manifest.skills[skillId] ?? adoption?.skill;\r\n\r\n if (skill === undefined) {\r\n throw new Error(`Managed skill not found: ${skillId}`);\r\n }\r\n\r\n const currentActivation = manifest.activations.find(\r\n (entry) => entry.skillId === skill.id && entry.agentId === agent.id\r\n );\r\n const activationLinkPath = currentActivation?.linkPath ?? linkPath;\r\n const agentRecord = buildAgentRecord(agent, timestamp);\r\n manifest.agents[agent.id] = agentRecord;\r\n\r\n const adoptedLinkRemoved =\r\n adoption !== undefined ? await safeRemoveLink(linkPath) : false;\r\n\r\n const linkMatchesSkill = adoption === undefined\r\n ? await isLinkPointingToTarget(activationLinkPath, skill.path)\r\n : false;\r\n if (\r\n adoption === undefined &&\r\n !linkMatchesSkill &&\r\n (await pathExists(activationLinkPath))\r\n ) {\r\n throw new Error(`Refusing to disable non-managed entry at ${linkPath}`);\r\n }\r\n\r\n const removedLink = adoptedLinkRemoved\r\n ? true\r\n : linkMatchesSkill\r\n ? await safeRemoveLink(activationLinkPath)\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\r\nexport async function runDisable(\r\n options: RunDisableOptions & { agents: string[] }\r\n): Promise<RunDisableBatchResult>;\r\nexport async function runDisable(\r\n options: RunDisableOptions & { agent: string }\r\n): Promise<RunDisableSingleResult>;\r\nexport async function runDisable(\r\n options: RunDisableOptions\r\n): Promise<RunDisableResult> {\r\n if (options.agents !== undefined) {\r\n const results: RunDisableSingleResult[] = [];\r\n\r\n for (const agent of options.agents) {\r\n try {\r\n results.push(await runDisableSingle({ ...options, agent, agents: undefined }));\r\n } catch (error) {\r\n throw new BatchOperationError({\r\n operation: \"disable\",\r\n failedItem: agent,\r\n failedAction: `disable ${options.skill} for ${agent}`,\r\n completedAction: \"disabling\",\r\n completedItems: results.map((result) => result.agent.id),\r\n cause: error\r\n });\r\n }\r\n }\r\n\r\n if (results.length === 0) {\r\n throw new Error(\"Disable requires at least one target agent\");\r\n }\r\n\r\n const lastResult = results[results.length - 1] as RunDisableSingleResult;\r\n return {\r\n changed: results.some((result) => result.changed),\r\n skill: lastResult.skill,\r\n results,\r\n changedAgents: results\r\n .filter((result) => result.changed)\r\n .map((result) => result.agent.id),\r\n manifest: lastResult.manifest,\r\n output: results.map((result) => result.output).join(\"\")\r\n };\r\n }\r\n\r\n return runDisableSingle(options);\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 { BatchOperationError } from \"../core/batch-operation-error\";\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 agents?: string[];\r\n now?: Date;\r\n};\r\n\r\nexport type RunEnableSingleResult = {\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\nexport type RunEnableBatchResult = {\r\n changed: boolean;\r\n skill: ManagedSkill;\r\n results: RunEnableSingleResult[];\r\n changedAgents: string[];\r\n manifest: Manifest;\r\n output: string;\r\n};\r\n\r\nexport type RunEnableResult = RunEnableSingleResult | RunEnableBatchResult;\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\nasync function runEnableSingle(\r\n options: RunEnableOptions\r\n): Promise<RunEnableSingleResult> {\r\n if (options.agent === undefined) {\r\n throw new Error(\"Enable requires one target agent\");\r\n }\r\n\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\r\nexport async function runEnable(\r\n options: RunEnableOptions & { agents: string[] }\r\n): Promise<RunEnableBatchResult>;\r\nexport async function runEnable(\r\n options: RunEnableOptions & { agent: string }\r\n): Promise<RunEnableSingleResult>;\r\nexport async function runEnable(\r\n options: RunEnableOptions\r\n): Promise<RunEnableResult> {\r\n if (options.agents !== undefined) {\r\n const results: RunEnableSingleResult[] = [];\r\n\r\n for (const agent of options.agents) {\r\n try {\r\n results.push(await runEnableSingle({ ...options, agent, agents: undefined }));\r\n } catch (error) {\r\n throw new BatchOperationError({\r\n operation: \"enable\",\r\n failedItem: agent,\r\n failedAction: `enable ${options.skill} for ${agent}`,\r\n completedAction: \"enabling\",\r\n completedItems: results.map((result) => result.agent.id),\r\n cause: error\r\n });\r\n }\r\n }\r\n\r\n if (results.length === 0) {\r\n throw new Error(\"Enable requires at least one target agent\");\r\n }\r\n\r\n const lastResult = results[results.length - 1] as RunEnableSingleResult;\r\n return {\r\n changed: results.some((result) => result.changed),\r\n skill: lastResult.skill,\r\n results,\r\n changedAgents: results\r\n .filter((result) => result.changed)\r\n .map((result) => result.agent.id),\r\n manifest: lastResult.manifest,\r\n output: results.map((result) => result.output).join(\"\")\r\n };\r\n }\r\n\r\n return runEnableSingle(options);\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 { 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 * as fs from \"node:fs/promises\";\r\nimport { homedir } from \"node:os\";\r\nimport { resolve } from \"node:path\";\r\nimport type { ManagedSkill, Manifest } from \"../core/types\";\r\nimport { BatchOperationError } from \"../core/batch-operation-error\";\r\nimport { normalizeId } from \"../core/ids\";\r\nimport { resolveSkillmuxHome } from \"../config/resolve-skillmux-home\";\r\nimport { assertNoSymlinkAncestors, pathsAreEqual } from \"../fs/path-utils\";\r\nimport { readManifest } from \"../manifest/read-manifest\";\r\nimport { writeManifest } from \"../manifest/write-manifest\";\r\nimport { printJson } from \"../output/print-json\";\r\n\r\nexport type RunRemoveOptions = {\r\n homeDir?: string;\r\n skillmuxHome?: string;\r\n skill?: string;\r\n skills?: string[];\r\n json?: boolean;\r\n};\r\n\r\nexport type RunRemoveSingleResult = {\r\n changed: boolean;\r\n removedSkillId: string;\r\n skill: ManagedSkill;\r\n location: {\r\n skillmuxHome: string;\r\n configPath: string;\r\n manifestPath: string;\r\n managedSkillsDirectory: string;\r\n managedSkillPath: string;\r\n };\r\n manifest: Manifest;\r\n output: string;\r\n};\r\n\r\nexport type RunRemoveBatchResult = {\r\n changed: boolean;\r\n removedSkillIds: string[];\r\n results: RunRemoveSingleResult[];\r\n manifest: Manifest;\r\n output: string;\r\n};\r\n\r\nexport type RunRemoveResult = RunRemoveSingleResult | RunRemoveBatchResult;\r\n\r\nfunction buildManagedSkillPath(skillmuxHome: string, skillId: string): string {\r\n return resolve(skillmuxHome, \"skills\", skillId);\r\n}\r\n\r\nfunction buildManifestPath(skillmuxHome: string): string {\r\n return resolve(skillmuxHome, \"manifest.json\");\r\n}\r\n\r\nfunction buildConfigPath(skillmuxHome: string): string {\r\n return resolve(skillmuxHome, \"config.json\");\r\n}\r\n\r\nfunction resolveManagedSkill(manifest: Manifest, skillNameOrId: string): ManagedSkill {\r\n const skillId = normalizeId(skillNameOrId);\r\n const directMatch = manifest.skills[skillId];\r\n\r\n if (directMatch !== undefined) {\r\n return directMatch;\r\n }\r\n\r\n const nameMatches = Object.values(manifest.skills).filter(\r\n (skill) => normalizeId(skill.name) === skillId\r\n );\r\n\r\n if (nameMatches.length === 1) {\r\n return nameMatches[0] as ManagedSkill;\r\n }\r\n\r\n if (nameMatches.length > 1) {\r\n const candidateIds = nameMatches.map((skill) => skill.id).sort((left, right) => left.localeCompare(right));\r\n throw new Error(\r\n `Ambiguous managed skill name ${skillNameOrId}: ${candidateIds.join(\", \")}`\r\n );\r\n }\r\n\r\n throw new Error(`Managed skill not found: ${skillId}`);\r\n}\r\n\r\nfunction buildHumanOutput(skill: ManagedSkill, managedSkillPath: string): string {\r\n return `Removed ${skill.id} from ${managedSkillPath}\\n`;\r\n}\r\n\r\nfunction buildJsonOutput(result: Omit<RunRemoveSingleResult, \"output\">): string {\r\n return printJson({\r\n changed: result.changed,\r\n removedSkillId: result.removedSkillId,\r\n skill: result.skill,\r\n location: result.location,\r\n manifest: result.manifest\r\n });\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\nasync function assertManagedSkillRemovalSafety(\r\n skillmuxHome: string,\r\n skillPath: string,\r\n skillId: string\r\n): Promise<void> {\r\n const expectedSkillPath = buildManagedSkillPath(skillmuxHome, skillId);\r\n\r\n if (!pathsAreEqual(skillPath, expectedSkillPath)) {\r\n throw new Error(`Refusing to remove unmanaged skill path at ${skillPath}`);\r\n }\r\n\r\n await assertNoSymlinkAncestors(skillPath, { includeLeaf: true });\r\n\r\n if (!(await pathExists(skillPath))) {\r\n return;\r\n }\r\n\r\n const entry = await fs.lstat(skillPath);\r\n\r\n if (entry.isSymbolicLink()) {\r\n throw new Error(`Refusing to remove symlinked managed skill path at ${skillPath}`);\r\n }\r\n\r\n if (!entry.isDirectory()) {\r\n throw new Error(`Refusing to remove non-directory managed skill path at ${skillPath}`);\r\n }\r\n}\r\n\r\nasync function runRemoveSingle(\r\n options: RunRemoveOptions\r\n): Promise<RunRemoveSingleResult> {\r\n if (options.skill === undefined) {\r\n throw new Error(\"Remove requires one target skill\");\r\n }\r\n\r\n const homeDir = options.homeDir ?? homedir();\r\n const { skillmuxHome: defaultSkillmuxHome } = resolveSkillmuxHome(homeDir);\r\n const skillmuxHome = options.skillmuxHome ?? defaultSkillmuxHome;\r\n const manifestPath = buildManifestPath(skillmuxHome);\r\n const configPath = buildConfigPath(skillmuxHome);\r\n const manifest = await readManifest(skillmuxHome);\r\n const skill = resolveManagedSkill(manifest, options.skill);\r\n const managedSkillsDirectory = resolve(skillmuxHome, \"skills\");\r\n const managedSkillPath = skill.path;\r\n const enabledActivations = manifest.activations.filter(\r\n (activation) => activation.skillId === skill.id && activation.state === \"enabled\"\r\n );\r\n\r\n if (enabledActivations.length > 0) {\r\n const enabledAgents = [...new Set(enabledActivations.map((activation) => activation.agentId))].sort(\r\n (left, right) => left.localeCompare(right)\r\n );\r\n throw new Error(\r\n `Cannot remove ${skill.id}; it is still enabled for: ${enabledAgents.join(\", \")}`\r\n );\r\n }\r\n\r\n await assertManagedSkillRemovalSafety(skillmuxHome, managedSkillPath, skill.id);\r\n\r\n if (await pathExists(managedSkillPath)) {\r\n await fs.rm(managedSkillPath, { recursive: true, force: false });\r\n }\r\n\r\n delete manifest.skills[skill.id];\r\n manifest.activations = manifest.activations.filter(\r\n (activation) => activation.skillId !== skill.id\r\n );\r\n\r\n await writeManifest(skillmuxHome, manifest);\r\n\r\n const resultWithoutOutput = {\r\n changed: true,\r\n removedSkillId: skill.id,\r\n skill,\r\n location: {\r\n skillmuxHome,\r\n configPath,\r\n manifestPath,\r\n managedSkillsDirectory,\r\n managedSkillPath\r\n },\r\n manifest\r\n };\r\n\r\n return {\r\n ...resultWithoutOutput,\r\n output: options.json === true\r\n ? buildJsonOutput(resultWithoutOutput)\r\n : buildHumanOutput(skill, managedSkillPath)\r\n };\r\n}\r\n\r\nexport async function runRemove(\r\n options: RunRemoveOptions & { skills: string[] }\r\n): Promise<RunRemoveBatchResult>;\r\nexport async function runRemove(\r\n options: RunRemoveOptions & { skill: string }\r\n): Promise<RunRemoveSingleResult>;\r\nexport async function runRemove(\r\n options: RunRemoveOptions\r\n): Promise<RunRemoveResult> {\r\n if (options.skills !== undefined) {\r\n const results: RunRemoveSingleResult[] = [];\r\n\r\n for (const skill of options.skills) {\r\n try {\r\n results.push(await runRemoveSingle({ ...options, skill, skills: undefined }));\r\n } catch (error) {\r\n throw new BatchOperationError({\r\n operation: \"remove\",\r\n failedItem: skill,\r\n failedAction: `remove ${skill}`,\r\n completedAction: \"removing\",\r\n completedItems: results.map((result) => result.removedSkillId),\r\n cause: error\r\n });\r\n }\r\n }\r\n\r\n if (results.length === 0) {\r\n throw new Error(\"Remove requires at least one target skill\");\r\n }\r\n\r\n const lastResult = results[results.length - 1] as RunRemoveSingleResult;\r\n const resultWithoutOutput = {\r\n changed: results.some((result) => result.changed),\r\n removedSkillIds: results.map((result) => result.removedSkillId),\r\n results,\r\n manifest: lastResult.manifest\r\n };\r\n\r\n return {\r\n ...resultWithoutOutput,\r\n output: options.json === true\r\n ? printJson(resultWithoutOutput)\r\n : results.map((result) => result.output).join(\"\")\r\n };\r\n }\r\n\r\n return runRemoveSingle(options);\r\n}\r\n"],"mappings":"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","names":["homedir","join","resolve","fs","join","resolve","join","fs","join","resolve","join","fs","join","fs","resolve","fs","resolve","resolve","join","fs","dirname","join","resolve","join","dirname","resolve","fs","dirname","resolve","resolve","dirname","fs","join","resolve","z","z","fs","join","getManifestPath","join","resolve","formatValidationIssues","resolve","homedir","join","homedir","homedir","homedir","normalizeAgentId","buildTableOutput","homedir","homedir","buildTableOutput","homedir","homedir","fs","join","buildIssue","pathExists","join","buildTableOutput","homedir","fs","homedir","join","resolve","fs","buildAgentRecord","buildActivationRecord","upsertActivation","buildManagedSkillPath","resolve","resolveTargetAgent","pathExists","homedir","join","fs","homedir","join","buildAgentRecord","buildActivationRecord","upsertActivation","resolveTargetAgent","homedir","join","resolve","homedir","buildManagedSkillPath","resolve","homedir","homedir","buildAgentRecord","homedir","fs","homedir","resolve","buildManagedSkillPath","resolve","buildConfigPath","buildJsonOutput","pathExists","homedir"]}