skillmux 0.1.1 → 0.1.2

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.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/config/default-agent-rules.ts","../src/commands/agents.ts","../src/config/resolve-skillmux-home.ts","../src/discovery/discover-agents.ts","../src/config/load-user-config.ts","../src/core/errors.ts","../src/output/print-json.ts","../src/output/print-table.ts","../src/commands/config-add-agent.ts","../src/core/ids.ts","../src/config/write-user-config.ts","../src/commands/config-remove-agent.ts","../src/commands/config.ts","../src/commands/doctor.ts","../src/discovery/scan-agent-skills.ts","../src/discovery/infer-skill-entry.ts","../src/fs/path-utils.ts","../src/manifest/read-manifest.ts","../src/manifest/build-empty-manifest.ts","../src/manifest/manifest-schema.ts","../src/manifest/write-manifest.ts","../src/commands/disable.ts","../src/fs/safe-copy.ts","../src/fs/link-ops.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/list.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport { supportedPlatforms } from \"./config/default-agent-rules\";\nimport { runAgents } from \"./commands/agents\";\nimport { runConfigAddAgent } from \"./commands/config-add-agent\";\nimport { runConfigRemoveAgent } from \"./commands/config-remove-agent\";\nimport { runConfig } from \"./commands/config\";\nimport { runDoctor } from \"./commands/doctor\";\r\nimport { runDisable } from \"./commands/disable\";\r\nimport { runEnable } from \"./commands/enable\";\r\nimport { runImport } from \"./commands/import\";\r\nimport { runList } from \"./commands/list\";\r\nimport { runScan } from \"./commands/scan\";\r\n\r\nexport function buildCli(): Command {\r\n const program = new Command();\r\n program.name(\"skillmux\");\r\n\r\n program\r\n .command(\"scan\")\r\n .option(\"--json\", \"Emit structured JSON output\")\r\n .action(async (options: { json?: boolean }) => {\r\n const result = await runScan({ json: options.json === true });\r\n process.stdout.write(result.output);\r\n });\r\n\r\n program\r\n .command(\"agents\")\r\n .option(\"--json\", \"Emit structured JSON output\")\r\n .action(async (options: { json?: boolean }) => {\r\n const result = await runAgents({ json: options.json === true });\r\n process.stdout.write(result.output);\r\n });\r\n\r\n program\r\n .command(\"list\")\r\n .option(\"--view <view>\", \"Select records, agents, or skills view\", \"records\")\r\n .option(\"--format <format>\", \"Select table or json output\", \"table\")\r\n .action(async (options: { view?: \"records\" | \"agents\" | \"skills\"; format?: \"table\" | \"json\" }) => {\r\n const result = await runList({\r\n view: options.view,\r\n format: options.format\r\n });\r\n process.stdout.write(result.output);\r\n });\r\n\r\n program\r\n .command(\"import\")\r\n .requiredOption(\"--source <path>\", \"Local skill source directory\")\r\n .requiredOption(\"--name <name>\", \"Managed skill name\")\r\n .action(async (options: { source: string; name: string }) => {\r\n const result = await runImport({\r\n sourcePath: options.source,\r\n skillName: options.name\r\n });\r\n process.stdout.write(result.output);\r\n });\r\n\r\n program\r\n .command(\"doctor\")\r\n .option(\"--json\", \"Emit structured JSON output\")\r\n .action(async (options: { json?: boolean }) => {\r\n const result = await runDoctor({ json: options.json === true });\r\n process.stdout.write(result.output);\r\n });\r\n\r\n const configCommand = program.command(\"config\");\n\n configCommand\n .option(\"--json\", \"Emit structured JSON output\")\n .action(async (options: { json?: boolean }) => {\n const result = await runConfig({ json: options.json === true });\n process.stdout.write(result.output);\n });\n\n configCommand\n .command(\"add-agent\")\n .requiredOption(\"--id <id>\", \"Agent id\")\n .requiredOption(\"--root <path>\", \"Home-relative root path\")\n .option(\"--skills <path>\", \"Skills directory path relative to the agent root\", \"skills\")\n .option(\"--name <name>\", \"Stable display name\")\n .option(\n \"--platform <platform>\",\n `Supported platform (${supportedPlatforms.join(\", \")})`,\n (value: string, previous: string[] = []) => [...previous, value],\n []\n )\n .option(\"--disabled-by-default\", \"Mark this custom agent as disabled by default\")\n .option(\"--json\", \"Emit structured JSON output\")\n .action(\n async (options: {\n id: string;\n root: string;\n skills?: string;\n name?: string;\n platform?: string[];\n disabledByDefault?: boolean;\n json?: boolean;\n }) => {\n const result = await runConfigAddAgent({\n id: options.id,\n root: options.root,\n skills: options.skills,\n name: options.name,\n platforms: options.platform,\n disabledByDefault: options.disabledByDefault === true,\n json: options.json === true\n });\n process.stdout.write(result.output);\n }\n );\n\n configCommand\n .command(\"remove-agent\")\n .requiredOption(\"--id <id>\", \"Agent id\")\n .option(\"--json\", \"Emit structured JSON output\")\n .action(async (options: { id: string; json?: boolean }) => {\n const result = await runConfigRemoveAgent({\n id: options.id,\n json: options.json === true\n });\n process.stdout.write(result.output);\n });\n\n program\n .command(\"enable\")\r\n .requiredOption(\"--skill <skill>\", \"Managed skill name or id\")\r\n .requiredOption(\"--agent <agent>\", \"Target agent id\")\r\n .action(async (options: { skill: string; agent: string }) => {\r\n const result = await runEnable({\r\n skill: options.skill,\r\n agent: options.agent\r\n });\r\n process.stdout.write(result.output);\r\n });\r\n\r\n program\r\n .command(\"disable\")\r\n .requiredOption(\"--skill <skill>\", \"Managed skill name or id\")\r\n .requiredOption(\"--agent <agent>\", \"Target agent id\")\r\n .action(async (options: { skill: string; agent: string }) => {\r\n const result = await runDisable({\r\n skill: options.skill,\r\n agent: options.agent\r\n });\r\n process.stdout.write(result.output);\r\n });\r\n\r\n return program;\r\n}\r\n","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 { resolveSkillmuxHome } from \"../config/resolve-skillmux-home\";\r\nimport {\r\n discoverAgents,\r\n type DiscoveredAgent\r\n} from \"../discovery/discover-agents\";\r\nimport { printJson } from \"../output/print-json\";\r\nimport { printTable } from \"../output/print-table\";\r\n\r\nexport type RunAgentsOptions = {\r\n homeDir?: string;\r\n skillmuxHome?: string;\r\n platform?: NodeJS.Platform;\r\n json?: boolean;\r\n};\r\n\r\nexport type RunAgentsResult = {\r\n agents: DiscoveredAgent[];\r\n output: string;\r\n};\r\n\r\nfunction buildTableOutput(agents: DiscoveredAgent[]): string {\r\n return printTable(\r\n agents.map((agent) => ({\r\n id: agent.id,\r\n name: agent.stableName,\r\n path: agent.absoluteSkillsDirectoryPath,\r\n exists: String(agent.exists),\r\n supported: String(agent.supportedOnPlatform),\r\n discovery: agent.discovery\r\n })),\r\n [\r\n { key: \"id\", label: \"Agent\" },\r\n { key: \"name\", label: \"Name\" },\r\n { key: \"path\", label: \"Path\" },\r\n { key: \"exists\", label: \"Exists\" },\r\n { key: \"supported\", label: \"Supported\" },\r\n { key: \"discovery\", label: \"Discovery\" }\r\n ]\r\n );\r\n}\r\n\r\nexport async function runAgents(\r\n options: RunAgentsOptions = {}\r\n): Promise<RunAgentsResult> {\r\n const homeDir = options.homeDir ?? homedir();\r\n const resolvedPaths = resolveSkillmuxHome(homeDir);\r\n const skillmuxHome = options.skillmuxHome ?? resolvedPaths.skillmuxHome;\r\n const agents = await discoverAgents({\r\n homeDir,\r\n skillmuxHome,\r\n platform: options.platform\r\n });\r\n\r\n return {\r\n agents,\r\n output:\r\n options.json === true\r\n ? printJson(agents)\r\n : buildTableOutput(agents)\r\n };\r\n}\r\n","import { join, resolve } from \"node:path\";\n\nexport type SkillmuxHomeResolution = {\n skillmuxHome: string;\n configPath: string;\n};\n\nexport function buildConfigPath(skillmuxHome: string): string {\n return join(resolve(skillmuxHome), \"config.json\");\n}\n\nexport function resolveSkillmuxHome(homeDir: string): SkillmuxHomeResolution {\n const resolvedHomeDir = resolve(homeDir);\n const skillmuxHome = join(resolvedHomeDir, \".skillmux\");\n\n return {\n skillmuxHome,\n configPath: buildConfigPath(skillmuxHome)\n };\n}\n","import * as fs from \"node:fs/promises\";\nimport { join, resolve } from \"node:path\";\nimport {\n builtInAgentIds,\n defaultAgentRuleMap,\n supportedPlatforms,\n type AgentRule,\n type BuiltInAgentId,\n type SupportedPlatform\n} from \"../config/default-agent-rules\";\nimport { loadUserConfig, type AgentOverride } from \"../config/load-user-config\";\nimport { resolveSkillmuxHome } from \"../config/resolve-skillmux-home\";\n\nexport type DiscoveredAgent = AgentRule & {\n absoluteRootPath: string;\n absoluteSkillsDirectoryPath: string;\n exists: boolean;\n supportedOnPlatform: boolean;\n};\n\nexport type DiscoverAgentsOptions = {\n homeDir: string;\n platform?: NodeJS.Platform;\n skillmuxHome?: string;\n};\n\nfunction mergeRule(rule: AgentRule, override?: AgentOverride): AgentRule {\n if (override === undefined) {\n return rule;\n }\n\n return {\n ...rule,\n ...override\n };\n}\n\nfunction buildCustomRule(id: string, override: AgentOverride): AgentRule {\n if (\n override.homeRelativeRootPath === undefined ||\n override.skillsDirectoryPath === undefined\n ) {\n throw new Error(\n `Custom agent override \"${id}\" must define homeRelativeRootPath and skillsDirectoryPath`\n );\n }\n\n return {\n id,\n stableName: override.stableName ?? id,\n supportedPlatforms: override.supportedPlatforms ?? [...supportedPlatforms],\n homeRelativeRootPath: override.homeRelativeRootPath,\n skillsDirectoryPath: override.skillsDirectoryPath,\n enabledByDefault: override.enabledByDefault ?? true,\n discovery: \"custom\"\n };\n}\n\nasync function pathExists(path: string): Promise<boolean> {\n try {\n await fs.access(path);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction resolveAgentRulePaths(homeDir: string, rule: AgentRule): {\n absoluteRootPath: string;\n absoluteSkillsDirectoryPath: string;\n} {\n const absoluteRootPath = resolve(homeDir, rule.homeRelativeRootPath);\n\n return {\n absoluteRootPath,\n absoluteSkillsDirectoryPath: join(\n absoluteRootPath,\n rule.skillsDirectoryPath\n )\n };\n}\n\nexport async function discoverAgents(\n options: DiscoverAgentsOptions\n): Promise<DiscoveredAgent[]> {\n const platform = options.platform ?? process.platform;\n const homeDir = resolve(options.homeDir);\n const skillmuxHome =\n options.skillmuxHome ?? resolveSkillmuxHome(homeDir).skillmuxHome;\n const userConfig = await loadUserConfig(skillmuxHome);\n\n const discoveredAgents: DiscoveredAgent[] = [];\n\n for (const agentId of builtInAgentIds) {\n const mergedRule = mergeRule(\n defaultAgentRuleMap[agentId as BuiltInAgentId],\n userConfig.agents[agentId]\n );\n const resolvedPaths = resolveAgentRulePaths(homeDir, mergedRule);\n\n discoveredAgents.push({\n ...mergedRule,\n ...resolvedPaths,\n exists: await pathExists(resolvedPaths.absoluteSkillsDirectoryPath),\n supportedOnPlatform: mergedRule.supportedPlatforms.some(\n (supportedPlatform) => supportedPlatform === platform\n )\n });\n }\n\n for (const [agentId, override] of Object.entries(userConfig.agents)) {\n if (Object.hasOwn(defaultAgentRuleMap, agentId)) {\n continue;\n }\n\n const customRule = buildCustomRule(agentId, override);\n const resolvedPaths = resolveAgentRulePaths(homeDir, customRule);\n\n discoveredAgents.push({\n ...customRule,\n ...resolvedPaths,\n exists: await pathExists(resolvedPaths.absoluteSkillsDirectoryPath),\n supportedOnPlatform: customRule.supportedPlatforms.some(\n (supportedPlatform) => supportedPlatform === platform\n )\n });\n }\n\n return discoveredAgents;\n}\n","import * as fs from \"node:fs/promises\";\r\nimport { z } from \"zod\";\r\nimport { UserConfigValidationError } from \"../core/errors\";\r\nimport {\r\n supportedPlatforms,\r\n type SupportedPlatform\r\n} from \"./default-agent-rules\";\r\nimport { buildConfigPath } from \"./resolve-skillmux-home\";\r\n\r\nconst supportedPlatformSchema = z.enum(supportedPlatforms);\r\n\r\nconst agentOverrideSchema = z\r\n .object({\r\n stableName: z.string().min(1).optional(),\r\n supportedPlatforms: z.array(supportedPlatformSchema).min(1).optional(),\r\n homeRelativeRootPath: z.string().min(1).optional(),\r\n skillsDirectoryPath: z.string().min(1).optional(),\r\n enabledByDefault: z.boolean().optional()\r\n })\r\n .strict();\r\n\r\nexport const userConfigSchema = z\r\n .object({\r\n version: z.literal(1),\r\n agents: z.record(z.string().min(1), agentOverrideSchema)\r\n })\r\n .strict();\r\n\r\nexport type AgentOverride = {\r\n stableName?: string;\r\n supportedPlatforms?: SupportedPlatform[];\r\n homeRelativeRootPath?: string;\r\n skillsDirectoryPath?: string;\r\n enabledByDefault?: boolean;\r\n};\r\n\r\nexport type UserConfig = {\r\n version: 1;\r\n agents: Record<string, AgentOverride>;\r\n};\r\n\r\nfunction createEmptyUserConfig(): UserConfig {\n return {\n version: 1,\n agents: {}\n };\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","export class SkillMuxError extends Error {\r\n constructor(message: string) {\r\n super(message);\r\n this.name = new.target.name;\r\n }\r\n}\r\n\r\nexport class InvalidIdentifierError extends SkillMuxError {\r\n constructor(\r\n public readonly kind: string,\r\n public readonly value: string\r\n ) {\r\n super(`Invalid ${kind}: ${value}`);\r\n }\r\n}\r\n\r\nexport class ManifestValidationError extends SkillMuxError {\r\n constructor(message: string) {\r\n super(message);\r\n }\r\n}\r\n\r\nexport class UserConfigValidationError extends SkillMuxError {\r\n constructor(message: string) {\r\n super(message);\r\n }\r\n}\r\n","export function printJson(value: unknown): string {\r\n return `${JSON.stringify(value, null, 2)}\\n`;\r\n}\r\n","export type TableColumn<Row extends Record<string, unknown>> = {\r\n key: keyof Row;\r\n label: string;\r\n};\r\n\r\nexport function printTable<Row extends Record<string, unknown>>(\r\n rows: Row[],\r\n columns: TableColumn<Row>[]\r\n): string {\r\n const renderedRows = rows.map((row) =>\r\n columns.map((column) => String(row[column.key] ?? \"\"))\r\n );\r\n const widths = columns.map((column, index) =>\r\n Math.max(\r\n column.label.length,\r\n ...renderedRows.map((row) => row[index]?.length ?? 0)\r\n )\r\n );\r\n\r\n const header = columns\r\n .map((column, index) => column.label.padEnd(widths[index]))\r\n .join(\" \");\r\n const separator = widths.map((width) => \"-\".repeat(width)).join(\" \");\r\n const body = renderedRows.map((row) =>\r\n row.map((cell, index) => cell.padEnd(widths[index])).join(\" \")\r\n );\r\n\r\n return `${[header, separator, ...body].join(\"\\n\")}\\n`;\r\n}\r\n","import { homedir } from \"node:os\";\nimport { isAbsolute } from \"node:path\";\nimport { InvalidIdentifierError, UserConfigValidationError } from \"../core/errors\";\nimport { normalizeId } from \"../core/ids\";\nimport { supportedPlatforms, type SupportedPlatform } from \"../config/default-agent-rules\";\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 normalizeRelativePath(value: string, field: string): string {\n const trimmed = value.trim();\n\n if (trimmed.length === 0) {\n throw new UserConfigValidationError(`${field} must not be empty`);\n }\n\n if (isAbsolute(trimmed)) {\n throw new UserConfigValidationError(`${field} must be a relative path`);\n }\n\n const normalized = trimmed.replaceAll(\"\\\\\", \"/\");\n\n if (normalized === \".\" || normalized === \"..\" || normalized.startsWith(\"../\") || normalized.includes(\"/../\")) {\n throw new UserConfigValidationError(`${field} must stay within the configured home-relative tree`);\n }\n\n return normalized.replace(/^\\.\\/+/, \"\");\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 normalizePlatforms(value: string[] | undefined): SupportedPlatform[] {\n if (value === undefined || value.length === 0) {\n return [process.platform as SupportedPlatform];\n }\n\n const normalized = [...new Set(value.map((entry) => entry.trim().toLowerCase()))];\n const invalid = normalized.filter(\n (entry): entry is string => supportedPlatforms.includes(entry as SupportedPlatform) === false\n );\n\n if (invalid.length > 0) {\n throw new UserConfigValidationError(\n `platform must be one of: ${supportedPlatforms.join(\", \")}`\n );\n }\n\n return normalized as SupportedPlatform[];\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 { 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 * 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 { 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 nextConfig: UserConfig = {\n ...config,\n agents: Object.fromEntries(\n Object.entries(config.agents).filter(([currentAgentId]) => currentAgentId !== agentId)\n )\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\";\nimport { buildConfigPath } from \"../config/resolve-skillmux-home\";\nimport { loadUserConfig, type UserConfig } from \"../config/load-user-config\";\nimport { resolveSkillmuxHome } from \"../config/resolve-skillmux-home\";\nimport { printJson } from \"../output/print-json\";\r\nimport { printTable } from \"../output/print-table\";\r\n\r\nexport type RunConfigOptions = {\r\n homeDir?: string;\r\n skillmuxHome?: string;\r\n json?: boolean;\r\n};\r\n\r\nexport type RunConfigResult = {\r\n skillmuxHome: string;\r\n configPath: string;\r\n config: UserConfig;\r\n output: string;\r\n};\r\n\r\nfunction buildTableOutput(result: Omit<RunConfigResult, \"output\">): string {\r\n const summary = printTable(\r\n [\r\n {\r\n skillmuxHome: result.skillmuxHome,\r\n configPath: result.configPath,\r\n overrides: String(Object.keys(result.config.agents).length)\r\n }\r\n ],\r\n [\r\n { key: \"skillmuxHome\", label: \"SkillMux Home\" },\r\n { key: \"configPath\", label: \"Config Path\" },\r\n { key: \"overrides\", label: \"Overrides\" }\r\n ]\r\n );\r\n\r\n const agentRows = Object.entries(result.config.agents)\r\n .sort(([left], [right]) => left.localeCompare(right))\r\n .map(([agentId, agent]) => ({\r\n agentId,\r\n stableName: agent.stableName ?? \"\",\r\n root: agent.homeRelativeRootPath ?? \"\",\r\n skills: agent.skillsDirectoryPath ?? \"\"\r\n }));\r\n\r\n if (agentRows.length === 0) {\r\n return `${summary}\\nNo user overrides configured.\\n`;\r\n }\r\n\r\n return `${summary}\\n${printTable(agentRows, [\r\n { key: \"agentId\", label: \"Agent\" },\r\n { key: \"stableName\", label: \"Name\" },\r\n { key: \"root\", label: \"Root\" },\r\n { key: \"skills\", label: \"Skills Dir\" }\r\n ])}`;\r\n}\r\n\r\nexport async function runConfig(\r\n options: RunConfigOptions = {}\r\n): Promise<RunConfigResult> {\r\n const homeDir = options.homeDir ?? homedir();\n const resolvedPaths = resolveSkillmuxHome(homeDir);\n const skillmuxHome = options.skillmuxHome ?? resolvedPaths.skillmuxHome;\n const config = await loadUserConfig(skillmuxHome);\n\r\n const resultWithoutOutput = {\r\n skillmuxHome,\n configPath: buildConfigPath(skillmuxHome),\n config\n };\n\r\n return {\r\n ...resultWithoutOutput,\r\n output:\r\n options.json === true\r\n ? printJson(resultWithoutOutput)\r\n : buildTableOutput(resultWithoutOutput)\r\n };\r\n}\r\n","import * as fs from \"node:fs/promises\";\r\nimport { homedir } from \"node:os\";\r\nimport { join } from \"node:path\";\r\nimport type { Manifest, ScanIssue } from \"../core/types\";\r\nimport { loadUserConfig, type UserConfig } from \"../config/load-user-config\";\r\nimport { resolveSkillmuxHome } from \"../config/resolve-skillmux-home\";\r\nimport {\r\n discoverAgents,\r\n type DiscoveredAgent\r\n} from \"../discovery/discover-agents\";\r\nimport {\r\n scanAgentSkills,\r\n type ScanAgentSkillsResult\r\n} from \"../discovery/scan-agent-skills\";\r\nimport { type ScannedSkillEntry } from \"../discovery/infer-skill-entry\";\r\nimport { normalizeAbsolutePath } from \"../fs/path-utils\";\r\nimport { readManifest } from \"../manifest/read-manifest\";\r\nimport { formatIssue } from \"../output/format-issue\";\r\nimport { printJson } from \"../output/print-json\";\r\nimport { printTable } from \"../output/print-table\";\r\n\r\nexport type RunDoctorOptions = {\r\n homeDir?: string;\r\n skillmuxHome?: string;\r\n platform?: NodeJS.Platform;\r\n json?: boolean;\r\n};\r\n\r\nexport type RunDoctorResult = {\r\n skillmuxHome: string;\r\n manifest: Manifest;\r\n config: UserConfig;\r\n agents: DiscoveredAgent[];\r\n entries: ScannedSkillEntry[];\r\n issues: ScanIssue[];\r\n output: string;\r\n};\r\n\r\nfunction buildIssue(\r\n code: string,\r\n severity: ScanIssue[\"severity\"],\r\n message: string,\r\n path?: string\r\n): ScanIssue {\r\n return path === undefined ? { code, severity, message } : { code, severity, message, path };\r\n}\r\n\r\nasync function pathExists(path: string): Promise<boolean> {\r\n try {\r\n await fs.access(path);\r\n return true;\r\n } catch (error) {\r\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\r\n return false;\r\n }\r\n\r\n throw error;\r\n }\r\n}\r\n\r\nasync function addUnmanagedDirectoryIssues(\r\n entries: ScannedSkillEntry[],\r\n issues: ScanIssue[]\r\n): Promise<void> {\r\n for (const entry of entries) {\r\n if (entry.kind !== \"unmanaged-directory\") {\r\n continue;\r\n }\r\n\r\n if (await pathExists(join(entry.path, \"SKILL.md\"))) {\r\n issues.push(\r\n buildIssue(\r\n \"unmanaged-skill-directory\",\r\n \"warning\",\r\n `Unmanaged skill directory is present for ${entry.agentId}/${entry.skillName}`,\r\n entry.path\r\n )\r\n );\r\n }\r\n }\r\n}\r\n\r\nasync function addMissingManagedSkillIssues(\r\n manifest: Manifest,\r\n issues: ScanIssue[]\r\n): Promise<void> {\r\n for (const skill of Object.values(manifest.skills)) {\r\n if (await pathExists(skill.path)) {\r\n continue;\r\n }\r\n\r\n issues.push(\r\n buildIssue(\r\n \"missing-managed-skill-path\",\r\n \"error\",\r\n `Managed skill path is missing for ${skill.id}`,\r\n skill.path\r\n )\r\n );\r\n }\r\n}\r\n\r\nfunction addConflictingAgentPathIssues(\r\n agents: DiscoveredAgent[],\r\n issues: ScanIssue[]\r\n): void {\r\n const pathToAgents = new Map<string, DiscoveredAgent[]>();\r\n\r\n for (const agent of agents) {\r\n const key = normalizeAbsolutePath(agent.absoluteSkillsDirectoryPath);\r\n const current = pathToAgents.get(key) ?? [];\r\n current.push(agent);\r\n pathToAgents.set(key, current);\r\n }\r\n\r\n for (const conflictedAgents of pathToAgents.values()) {\r\n if (conflictedAgents.length < 2) {\r\n continue;\r\n }\r\n\r\n const agentIds = conflictedAgents\r\n .map((agent) => agent.id)\r\n .sort((left, right) => left.localeCompare(right));\r\n\r\n issues.push(\r\n buildIssue(\r\n \"conflicting-agent-path\",\r\n \"warning\",\r\n `Multiple agents resolve to the same skills directory: ${agentIds.join(\", \")}`,\r\n conflictedAgents[0].absoluteSkillsDirectoryPath\r\n )\r\n );\r\n }\r\n}\r\n\r\nfunction buildTableOutput(issues: ScanIssue[]): string {\r\n if (issues.length === 0) {\r\n return \"No doctor issues found.\\n\";\r\n }\r\n\r\n return printTable(\r\n issues.map((issue) => ({\r\n severity: issue.severity,\r\n code: issue.code,\r\n path: issue.path ?? \"\",\r\n message: issue.message\r\n })),\r\n [\r\n { key: \"severity\", label: \"Severity\" },\r\n { key: \"code\", label: \"Code\" },\r\n { key: \"path\", label: \"Path\" },\r\n { key: \"message\", label: \"Message\" }\r\n ]\r\n );\r\n}\r\n\r\nfunction buildJsonOutput(result: Omit<RunDoctorResult, \"output\">): string {\r\n return printJson({\r\n skillmuxHome: result.skillmuxHome,\r\n issues: result.issues,\r\n agents: result.agents.map((agent) => ({\r\n id: agent.id,\r\n path: agent.absoluteSkillsDirectoryPath,\r\n supportedOnPlatform: agent.supportedOnPlatform\r\n })),\r\n entries: result.entries\r\n });\r\n}\r\n\r\nexport async function runDoctor(\r\n options: RunDoctorOptions = {}\r\n): Promise<RunDoctorResult> {\r\n const homeDir = options.homeDir ?? homedir();\r\n const resolvedPaths = resolveSkillmuxHome(homeDir);\r\n const skillmuxHome = options.skillmuxHome ?? resolvedPaths.skillmuxHome;\r\n const [manifest, config, agents] = await Promise.all([\r\n readManifest(skillmuxHome),\r\n loadUserConfig(skillmuxHome),\r\n discoverAgents({\r\n homeDir,\r\n skillmuxHome,\r\n platform: options.platform\r\n })\r\n ]);\r\n\r\n const entries: ScannedSkillEntry[] = [];\r\n const issues: ScanIssue[] = [];\r\n\r\n for (const agent of agents) {\r\n const scannedAgent: ScanAgentSkillsResult = await scanAgentSkills(agent, skillmuxHome);\r\n entries.push(...scannedAgent.entries);\r\n issues.push(...scannedAgent.issues);\r\n }\r\n\r\n await addUnmanagedDirectoryIssues(entries, issues);\r\n await addMissingManagedSkillIssues(manifest, issues);\r\n addConflictingAgentPathIssues(agents, issues);\r\n\r\n const dedupedIssues = [...issues].sort((left, right) => {\r\n const leftKey = `${left.severity}:${left.code}:${left.path ?? \"\"}:${left.message}`;\r\n const rightKey = `${right.severity}:${right.code}:${right.path ?? \"\"}:${right.message}`;\r\n return leftKey.localeCompare(rightKey);\r\n });\r\n\r\n const resultWithoutOutput = {\r\n skillmuxHome,\r\n manifest,\r\n config,\r\n agents,\r\n entries,\r\n issues: dedupedIssues\r\n };\r\n\r\n return {\r\n ...resultWithoutOutput,\r\n output:\r\n options.json === true\r\n ? buildJsonOutput(resultWithoutOutput)\r\n : buildTableOutput(dedupedIssues)\r\n };\r\n}\r\n","import * as fs from \"node:fs/promises\";\r\nimport type { ScanIssue } from \"../core/types\";\r\nimport type { DiscoveredAgent } from \"./discover-agents\";\r\nimport {\r\n inferSkillEntry,\r\n type ScannedSkillEntry\r\n} from \"./infer-skill-entry\";\r\n\r\nexport type ScanAgentSkillsResult = {\r\n entries: ScannedSkillEntry[];\r\n issues: ScanIssue[];\r\n};\r\n\r\nexport async function scanAgentSkills(\r\n agent: DiscoveredAgent,\r\n skillmuxHome: string\r\n): Promise<ScanAgentSkillsResult> {\r\n if (!agent.exists || !agent.supportedOnPlatform) {\r\n return {\r\n entries: [],\r\n issues: []\r\n };\r\n }\r\n\r\n const directoryEntries = await fs.readdir(agent.absoluteSkillsDirectoryPath, {\r\n withFileTypes: true\r\n });\r\n const sortedDirectoryEntries = [...directoryEntries].sort((left, right) =>\r\n left.name.localeCompare(right.name)\r\n );\r\n\r\n const entries: ScannedSkillEntry[] = [];\r\n const issues: ScanIssue[] = [];\r\n\r\n for (const directoryEntry of sortedDirectoryEntries) {\r\n const result = await inferSkillEntry({\r\n agentId: agent.id,\r\n agentName: agent.stableName,\r\n path: `${agent.absoluteSkillsDirectoryPath}/${directoryEntry.name}`,\r\n skillmuxHome\r\n });\r\n\r\n entries.push(result.entry);\r\n\r\n if (result.issue !== undefined) {\r\n issues.push(result.issue);\r\n }\r\n }\r\n\r\n return {\r\n entries,\r\n issues\r\n };\r\n}\r\n","import * as fs from \"node:fs/promises\";\r\nimport { basename, resolve } from \"node:path\";\r\nimport type { ScanIssue } from \"../core/types\";\r\nimport { isPathInside } from \"../fs/path-utils\";\r\n\r\nexport type SkillEntryKind =\r\n | \"managed-link\"\r\n | \"unmanaged-directory\"\r\n | \"broken-link\"\r\n | \"unknown\";\r\n\r\nexport type ScannedSkillEntry = {\r\n agentId: string;\r\n agentName: string;\r\n skillName: string;\r\n kind: SkillEntryKind;\r\n path: string;\r\n targetPath?: string;\r\n};\r\n\r\nexport type InferSkillEntryOptions = {\r\n agentId: string;\r\n agentName: string;\r\n path: string;\r\n skillmuxHome: string;\r\n};\r\n\r\nexport type InferSkillEntryResult = {\r\n entry: ScannedSkillEntry;\r\n issue?: ScanIssue;\r\n};\r\n\r\nfunction buildIssue(\r\n code: string,\r\n severity: ScanIssue[\"severity\"],\r\n message: string,\r\n path: string\r\n): ScanIssue {\r\n return { code, severity, message, path };\r\n}\r\n\r\nexport async function inferSkillEntry(\r\n options: InferSkillEntryOptions\r\n): Promise<InferSkillEntryResult> {\r\n const absolutePath = resolve(options.path);\r\n const skillName = basename(absolutePath);\r\n const stats = await fs.lstat(absolutePath);\r\n\r\n if (stats.isSymbolicLink()) {\r\n try {\r\n const targetPath = await fs.realpath(absolutePath);\r\n\r\n if (isPathInside(options.skillmuxHome, targetPath)) {\r\n return {\r\n entry: {\r\n agentId: options.agentId,\r\n agentName: options.agentName,\r\n skillName,\r\n kind: \"managed-link\",\r\n path: absolutePath,\r\n targetPath\r\n }\r\n };\r\n }\r\n\r\n return {\r\n entry: {\r\n agentId: options.agentId,\r\n agentName: options.agentName,\r\n skillName,\r\n kind: \"unknown\",\r\n path: absolutePath,\r\n targetPath\r\n },\r\n issue: buildIssue(\r\n \"unknown-entry\",\r\n \"warning\",\r\n \"Skill entry is a link that points outside the SkillMux managed store\",\r\n absolutePath\r\n )\r\n };\r\n } catch (error) {\r\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") {\r\n throw error;\r\n }\r\n\r\n return {\r\n entry: {\r\n agentId: options.agentId,\r\n agentName: options.agentName,\r\n skillName,\r\n kind: \"broken-link\",\r\n path: absolutePath\r\n },\r\n issue: buildIssue(\r\n \"broken-link\",\r\n \"error\",\r\n \"Skill entry points to a missing target\",\r\n absolutePath\r\n )\r\n };\r\n }\r\n }\r\n\r\n if (stats.isDirectory()) {\r\n return {\r\n entry: {\r\n agentId: options.agentId,\r\n agentName: options.agentName,\r\n skillName,\r\n kind: \"unmanaged-directory\",\r\n path: absolutePath\r\n }\r\n };\r\n }\r\n\r\n return {\r\n entry: {\r\n agentId: options.agentId,\r\n agentName: options.agentName,\r\n skillName,\r\n kind: \"unknown\",\r\n path: absolutePath\r\n },\r\n issue: buildIssue(\r\n \"unknown-entry\",\r\n \"warning\",\r\n \"Skill entry is neither a managed link nor a directory\",\r\n absolutePath\r\n )\r\n };\r\n}\r\n","import * as fs from \"node:fs/promises\";\nimport { dirname, parse, relative, resolve, sep } from \"node:path\";\n\nexport function normalizeAbsolutePath(path: string): string {\n const normalized = resolve(path);\n return process.platform === \"win32\"\n ? normalized.replaceAll(\"/\", \"\\\\\").toLowerCase()\n : normalized;\n}\n\nexport function pathsAreEqual(left: string, right: string): boolean {\n return normalizeAbsolutePath(left) === normalizeAbsolutePath(right);\n}\n\nexport function isPathInside(parentPath: string, childPath: string): boolean {\n const parent = normalizeAbsolutePath(parentPath);\n const child = normalizeAbsolutePath(childPath);\n\n if (parse(parent).root !== parse(child).root) {\n return false;\n }\n\n const relativePath = relative(parent, child);\n\n if (relativePath === \"\") {\n return true;\n }\n\n if (relativePath === \"..\") {\n return false;\n }\n\n if (relativePath.startsWith(`..${sep}`)) {\n return false;\n }\n\n return true;\n}\n\nexport async function assertNoSymlinkAncestors(\n path: string,\n options?: { includeLeaf?: boolean }\n): Promise<void> {\n let current = options?.includeLeaf === true ? resolve(path) : dirname(resolve(path));\n\n while (true) {\n try {\n const entry = await fs.lstat(current);\n if (entry.isSymbolicLink()) {\n throw new Error(`Refusing to use path with symlink ancestor at ${current}`);\n }\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") {\n throw error;\n }\n }\n\n const parent = dirname(current);\n if (parent === current) {\n return;\n }\n\n current = parent;\n }\n}\n","import * as fs from \"node:fs/promises\";\nimport { join, resolve } from \"node:path\";\nimport { ManifestValidationError } from \"../core/errors\";\nimport type { Manifest } from \"../core/types\";\nimport { buildEmptyManifest } from \"./build-empty-manifest\";\nimport { manifestSchema } from \"./manifest-schema\";\nimport { writeManifest } from \"./write-manifest\";\n\nfunction getManifestPath(home: string): string {\n return join(home, \"manifest.json\");\n}\n\nfunction normalizeHomePath(home: string): string {\n const resolvedHome = resolve(home);\n return process.platform === \"win32\"\n ? resolvedHome.toLowerCase()\n : resolvedHome;\n}\n\nfunction formatValidationIssues(error: { issues: Array<{ path: (string | number)[]; message: string }> }): string {\n return error.issues\n .map((issue) => {\n const path = issue.path.length > 0 ? issue.path.join(\".\") : \"<root>\";\n return `${path}: ${issue.message}`;\n })\n .join(\"; \");\n}\n\nexport async function readManifest(home: string): Promise<Manifest> {\n const manifestPath = getManifestPath(home);\n\n try {\n const contents = await fs.readFile(manifestPath, \"utf8\");\n const parsedJson = JSON.parse(contents) as unknown;\n const parsedManifest = manifestSchema.safeParse(parsedJson);\n\n if (!parsedManifest.success) {\n throw new ManifestValidationError(\n `Invalid manifest at ${manifestPath}: ${formatValidationIssues(parsedManifest.error)}`\n );\n }\n\n if (\n normalizeHomePath(parsedManifest.data.skillmuxHome) !==\n normalizeHomePath(home)\n ) {\n throw new ManifestValidationError(\n `Invalid manifest at ${manifestPath}: skillmuxHome must match ${home}`\n );\n }\n\n return parsedManifest.data;\n } catch (error) {\n if (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n (error as NodeJS.ErrnoException).code === \"ENOENT\"\n ) {\n const emptyManifest = buildEmptyManifest(home);\n await writeManifest(home, emptyManifest);\n return emptyManifest;\n }\n\n if (error instanceof SyntaxError) {\n throw new ManifestValidationError(\n `Invalid manifest at ${manifestPath}: malformed JSON`\n );\n }\n\n throw error;\n }\n}\n","import type { Manifest } from \"../core/types\";\r\n\r\nexport function buildEmptyManifest(skillmuxHome: string): Manifest {\r\n return {\r\n version: 1,\r\n skillmuxHome,\r\n skills: {},\r\n agents: {},\r\n activations: [],\r\n lastScan: {\r\n at: null,\r\n issues: []\r\n }\r\n };\r\n}\r\n","import { z } from \"zod\";\r\nimport { isValidId } from \"../core/ids\";\r\nimport type {\r\n ActivationRecord,\r\n AgentRecord,\r\n ManagedSkill,\r\n Manifest,\r\n ScanIssue\r\n} from \"../core/types\";\r\n\r\nconst idSchema = z\r\n .string()\r\n .min(1)\r\n .refine(isValidId, \"Expected a canonical lowercase slug identifier\");\r\n\r\nexport const scanIssueSchema = z\r\n .object({\r\n code: z.string().min(1),\r\n severity: z.enum([\"info\", \"warning\", \"error\"]),\r\n message: z.string().min(1),\r\n path: z.string().min(1).optional()\r\n })\r\n .strict();\r\n\r\nexport const managedSkillSchema = z\r\n .object({\r\n id: idSchema,\r\n name: z.string().min(1),\r\n path: z.string().min(1),\r\n source: z\r\n .object({\r\n kind: z.enum([\"local\", \"imported\"]),\r\n path: z.string().min(1)\r\n })\r\n .strict(),\r\n importedAt: z.string().min(1)\r\n })\r\n .strict();\r\n\r\nexport const agentRecordSchema = z\r\n .object({\r\n id: idSchema,\r\n name: z.string().min(1),\r\n path: z.string().min(1),\r\n discovery: z.enum([\"builtin\", \"custom\"]),\r\n available: z.boolean(),\r\n lastSeenAt: z.string().min(1).nullable()\r\n })\r\n .strict();\r\n\r\nexport const activationRecordSchema = z\r\n .object({\r\n skillId: idSchema,\r\n agentId: idSchema,\r\n linkPath: z.string().min(1),\r\n state: z.enum([\"enabled\", \"disabled\"]),\r\n updatedAt: z.string().min(1)\r\n })\r\n .strict();\r\n\r\nexport const manifestSchema = z\r\n .object({\r\n version: z.literal(1),\r\n skillmuxHome: z.string().min(1),\r\n skills: z.record(z.string(), managedSkillSchema),\r\n agents: z.record(z.string(), agentRecordSchema),\r\n activations: z.array(activationRecordSchema),\r\n lastScan: z\r\n .object({\r\n at: z.string().min(1).nullable(),\r\n issues: z.array(scanIssueSchema)\r\n })\r\n .strict()\r\n })\r\n .strict()\r\n .superRefine((manifest, ctx) => {\r\n for (const [skillId, skill] of Object.entries(manifest.skills)) {\r\n if (!isValidId(skillId)) {\r\n ctx.addIssue({\r\n code: z.ZodIssueCode.custom,\r\n path: [\"skills\", skillId],\r\n message: `Invalid skill id key: ${skillId}`\r\n });\r\n }\r\n\r\n if (skill.id !== skillId) {\r\n ctx.addIssue({\r\n code: z.ZodIssueCode.custom,\r\n path: [\"skills\", skillId, \"id\"],\r\n message: `Skill id must match its record key: ${skillId}`\r\n });\r\n }\r\n }\r\n\r\n for (const [agentId, agent] of Object.entries(manifest.agents)) {\r\n if (!isValidId(agentId)) {\r\n ctx.addIssue({\r\n code: z.ZodIssueCode.custom,\r\n path: [\"agents\", agentId],\r\n message: `Invalid agent id key: ${agentId}`\r\n });\r\n }\r\n\r\n if (agent.id !== agentId) {\r\n ctx.addIssue({\r\n code: z.ZodIssueCode.custom,\r\n path: [\"agents\", agentId, \"id\"],\r\n message: `Agent id must match its record key: ${agentId}`\r\n });\r\n }\r\n }\r\n\r\n const activationPairs = new Set<string>();\r\n\r\n manifest.activations.forEach((activation, index) => {\r\n if (!(activation.skillId in manifest.skills)) {\r\n ctx.addIssue({\r\n code: z.ZodIssueCode.custom,\r\n path: [\"activations\", index, \"skillId\"],\r\n message: `Unknown skill reference: ${activation.skillId}`\r\n });\r\n }\r\n\r\n if (!(activation.agentId in manifest.agents)) {\r\n ctx.addIssue({\r\n code: z.ZodIssueCode.custom,\r\n path: [\"activations\", index, \"agentId\"],\r\n message: `Unknown agent reference: ${activation.agentId}`\r\n });\r\n }\r\n\r\n const pairKey = `${activation.skillId}:${activation.agentId}`;\r\n if (activationPairs.has(pairKey)) {\r\n ctx.addIssue({\r\n code: z.ZodIssueCode.custom,\r\n path: [\"activations\", index],\r\n message: `Duplicate activation for ${pairKey}`\r\n });\r\n return;\r\n }\r\n\r\n activationPairs.add(pairKey);\r\n });\r\n });\r\n\r\nexport type { ActivationRecord, AgentRecord, ManagedSkill, Manifest, ScanIssue };\r\n","import { randomUUID } from \"node:crypto\";\nimport * as fs from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { Manifest } from \"../core/types\";\n\nfunction getManifestPath(home: string): string {\n return join(home, \"manifest.json\");\n}\n\nexport function createManifestTempPath(manifestPath: string): string {\n return `${manifestPath}.${process.pid}.${randomUUID()}.tmp`;\n}\n\nexport async function writeManifest(\n home: string,\n manifest: Manifest\n): Promise<void> {\n await fs.mkdir(home, { recursive: true });\n\n const manifestPath = getManifestPath(home);\n const tempPath = createManifestTempPath(manifestPath);\n const contents = `${JSON.stringify(manifest, null, 2)}\\n`;\n\n await fs.writeFile(tempPath, contents, \"utf8\");\n\n try {\n await fs.rename(tempPath, manifestPath);\n } catch (error) {\n await fs.unlink(tempPath).catch(() => undefined);\n throw error;\n }\n}\n","import * as fs from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { join, resolve } from \"node:path\";\nimport type {\n ActivationRecord,\n AgentRecord,\n ManagedSkill,\r\n Manifest\r\n} from \"../core/types\";\r\nimport { normalizeId } from \"../core/ids\";\r\nimport { resolveSkillmuxHome } from \"../config/resolve-skillmux-home\";\r\nimport {\r\n discoverAgents,\r\n type DiscoveredAgent\r\n} from \"../discovery/discover-agents\";\nimport {\n assertSkillSourceLayout,\n copySkillContentsToManagedStore\n} from \"../fs/safe-copy\";\nimport { isLinkPointingToTarget } from \"../fs/link-ops\";\nimport { safeRemoveLink } from \"../fs/safe-remove-link\";\nimport { readManifest } from \"../manifest/read-manifest\";\nimport { writeManifest } from \"../manifest/write-manifest\";\n\r\nexport type RunDisableOptions = {\r\n homeDir?: string;\r\n skillmuxHome?: string;\r\n skill: string;\r\n agent: string;\r\n now?: Date;\r\n};\r\n\r\nexport type RunDisableResult = {\r\n changed: boolean;\r\n skill: ManagedSkill;\r\n agent: AgentRecord;\r\n activation: ActivationRecord | null;\r\n manifest: Manifest;\r\n output: string;\r\n};\r\n\r\nfunction buildAgentRecord(agent: DiscoveredAgent, timestamp: string): AgentRecord {\r\n return {\r\n id: agent.id,\r\n name: agent.stableName,\r\n path: agent.absoluteSkillsDirectoryPath,\r\n discovery: agent.discovery,\r\n available: agent.exists && agent.supportedOnPlatform,\r\n lastSeenAt: agent.exists ? timestamp : null\r\n };\r\n}\r\n\r\nfunction buildActivationRecord(\n skillId: string,\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;\n}\n\nfunction buildManagedSkillPath(skillmuxHome: string, skillId: string): string {\n return resolve(skillmuxHome, \"skills\", skillId);\n}\n\nasync function tryAdoptManagedSkill(\n manifest: Manifest,\n skillmuxHome: string,\n skillId: string,\n skillName: string,\n linkPath: string,\n timestamp: string\n): Promise<{ skill: ManagedSkill; sourcePath: string } | undefined> {\n try {\n const entry = await fs.lstat(linkPath);\n\n if (!entry.isSymbolicLink()) {\n return undefined;\n }\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return undefined;\n }\n\n throw error;\n }\n\n const sourcePath = await fs.realpath(linkPath);\n await assertSkillSourceLayout(sourcePath);\n\n const managedSkillPath = buildManagedSkillPath(skillmuxHome, skillId);\n await copySkillContentsToManagedStore(sourcePath, managedSkillPath);\n\n const skill: ManagedSkill = {\n id: skillId,\n name: skillName,\n path: managedSkillPath,\n source: {\n kind: \"imported\",\n path: sourcePath\n },\n importedAt: timestamp\n };\n\n manifest.skills[skillId] = skill;\n return { skill, sourcePath };\n}\n\r\nasync function resolveTargetAgent(\r\n homeDir: string,\r\n skillmuxHome: string,\r\n agentName: string\r\n): Promise<DiscoveredAgent> {\r\n const agentId = normalizeId(agentName);\r\n const agents = await discoverAgents({ homeDir, skillmuxHome });\r\n const agent = agents.find((entry) => entry.id === agentId);\r\n\r\n if (agent === undefined) {\r\n throw new Error(`Unknown agent: ${agentName}`);\r\n }\r\n\r\n if (!agent.supportedOnPlatform) {\r\n throw new Error(`Agent ${agent.id} is not supported on ${process.platform}`);\r\n }\r\n\r\n return agent;\r\n}\r\n\r\nasync function pathExists(path: string): Promise<boolean> {\r\n try {\r\n await fs.lstat(path);\r\n return true;\r\n } catch (error) {\r\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\r\n return false;\r\n }\r\n\r\n throw error;\r\n }\r\n}\r\n\r\nexport async function runDisable(\r\n options: RunDisableOptions\r\n): Promise<RunDisableResult> {\r\n const homeDir = options.homeDir ?? homedir();\r\n const { skillmuxHome: defaultSkillmuxHome } = resolveSkillmuxHome(homeDir);\r\n const skillmuxHome = options.skillmuxHome ?? defaultSkillmuxHome;\n const timestamp = (options.now ?? new Date()).toISOString();\n const manifest = await readManifest(skillmuxHome);\n const skillId = normalizeId(options.skill);\n const agent = await resolveTargetAgent(homeDir, skillmuxHome, options.agent);\n const linkPath = join(agent.absoluteSkillsDirectoryPath, skillId);\n const adoption = manifest.skills[skillId]\n ? undefined\n : await tryAdoptManagedSkill(\n manifest,\n skillmuxHome,\n skillId,\n options.skill,\n linkPath,\n timestamp\n );\n const skill = manifest.skills[skillId] ?? adoption?.skill;\n\n if (skill === undefined) {\n throw new Error(`Managed skill not found: ${skillId}`);\n }\n\n const currentActivation = manifest.activations.find(\n (entry) => entry.skillId === skill.id && entry.agentId === agent.id\n );\n const activationLinkPath = currentActivation?.linkPath ?? linkPath;\n const agentRecord = buildAgentRecord(agent, timestamp);\n manifest.agents[agent.id] = agentRecord;\n\n const adoptedLinkRemoved =\n adoption !== undefined ? await safeRemoveLink(linkPath) : false;\n\n const linkMatchesSkill = adoption === undefined\n ? await isLinkPointingToTarget(activationLinkPath, skill.path)\n : false;\n if (\n adoption === undefined &&\n !linkMatchesSkill &&\n (await pathExists(activationLinkPath))\n ) {\n throw new Error(`Refusing to disable non-managed entry at ${linkPath}`);\n }\n\n const removedLink = adoptedLinkRemoved\n ? true\n : linkMatchesSkill\n ? await safeRemoveLink(activationLinkPath)\n : false;\n\n if (removedLink === false && currentActivation?.state !== \"enabled\") {\n return {\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);\n upsertActivation(manifest, activation);\r\n await writeManifest(skillmuxHome, manifest);\r\n\r\n return {\r\n changed: true,\r\n skill,\r\n agent: agentRecord,\r\n activation,\r\n manifest,\r\n output: `Disabled ${skill.id} for ${agent.id}\\n`\r\n };\r\n}\r\n","import * as fs from \"node:fs/promises\";\r\nimport { dirname, join, resolve } from \"node:path\";\r\nimport {\r\n assertNoSymlinkAncestors,\r\n isPathInside,\r\n pathsAreEqual\r\n} from \"./path-utils\";\r\n\r\nasync function assertDirectory(path: string): Promise<void> {\r\n const entry = await fs.lstat(path);\r\n if (!entry.isDirectory()) {\r\n throw new Error(`Expected a directory at ${path}`);\r\n }\r\n}\r\n\r\nasync function assertRegularFile(path: string, label: string): Promise<void> {\r\n const entry = await fs.lstat(path);\r\n if (!entry.isFile()) {\r\n throw new Error(`Expected ${label} to be a regular file at ${path}`);\r\n }\r\n}\r\n\r\nasync function assertTargetDoesNotExist(path: string): Promise<void> {\r\n try {\r\n await fs.lstat(path);\r\n throw new Error(`Refusing to overwrite existing path at ${path}`);\r\n } catch (error) {\r\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") {\r\n throw error;\r\n }\r\n }\r\n}\r\n\r\nasync function copyDirectoryContents(sourcePath: string, targetPath: string): Promise<void> {\r\n await fs.mkdir(targetPath, { recursive: true });\r\n const entries = await fs.readdir(sourcePath, { withFileTypes: true });\r\n\r\n for (const entry of entries) {\r\n const sourceEntryPath = join(sourcePath, entry.name);\r\n const targetEntryPath = join(targetPath, entry.name);\r\n const entryStats = await fs.lstat(sourceEntryPath);\r\n\r\n if (entryStats.isSymbolicLink()) {\r\n throw new Error(`Refusing to copy source symlink at ${sourceEntryPath}`);\r\n }\r\n\r\n if (entryStats.isDirectory()) {\r\n await copyDirectoryContents(sourceEntryPath, targetEntryPath);\r\n continue;\r\n }\r\n\r\n if (entryStats.isFile()) {\r\n await fs.mkdir(dirname(targetEntryPath), { recursive: true });\r\n await fs.copyFile(sourceEntryPath, targetEntryPath);\r\n continue;\r\n }\r\n\r\n throw new Error(`Unsupported filesystem entry at ${sourceEntryPath}`);\r\n }\r\n}\r\n\r\nexport async function assertSkillSourceLayout(sourcePath: string): Promise<void> {\r\n const resolvedSourcePath = resolve(sourcePath);\r\n const skillFilePath = join(resolvedSourcePath, \"SKILL.md\");\r\n\r\n await assertNoSymlinkAncestors(resolvedSourcePath, { includeLeaf: true });\r\n await assertDirectory(resolvedSourcePath);\r\n\r\n try {\r\n await assertRegularFile(skillFilePath, \"SKILL.md\");\r\n } catch (error) {\r\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\r\n throw new Error(`Refusing to import ${resolvedSourcePath} without a root SKILL.md`);\r\n }\r\n\r\n throw error;\r\n }\r\n}\r\n\r\nexport async function copySkillContentsToManagedStore(\r\n sourcePath: string,\r\n targetPath: string\r\n): Promise<void> {\r\n const resolvedSourcePath = resolve(sourcePath);\r\n const resolvedTargetPath = resolve(targetPath);\r\n\r\n if (pathsAreEqual(resolvedSourcePath, resolvedTargetPath)) {\r\n throw new Error(\"Source and target paths must differ\");\r\n }\r\n\r\n if (isPathInside(resolvedSourcePath, resolvedTargetPath)) {\r\n throw new Error(\"Refusing to copy into a child of the source directory\");\r\n }\r\n\r\n await assertSkillSourceLayout(resolvedSourcePath);\r\n await assertNoSymlinkAncestors(resolvedTargetPath);\r\n await assertTargetDoesNotExist(resolvedTargetPath);\r\n await copyDirectoryContents(resolvedSourcePath, resolvedTargetPath);\r\n}\r\n","import * as fs from \"node:fs/promises\";\r\nimport { dirname, resolve } from \"node:path\";\r\nimport {\r\n assertNoSymlinkAncestors,\r\n isPathInside,\r\n pathsAreEqual\r\n} from \"./path-utils\";\r\n\r\nconst directoryLinkType = process.platform === \"win32\" ? \"junction\" : \"dir\";\r\n\r\nexport async function createManagedLink(\r\n linkPath: string,\r\n targetPath: string\r\n): Promise<void> {\r\n const resolvedLinkPath = resolve(linkPath);\r\n const resolvedTargetPath = resolve(targetPath);\r\n\r\n await assertNoSymlinkAncestors(resolvedLinkPath);\r\n await assertNoSymlinkAncestors(resolvedTargetPath, { includeLeaf: true });\r\n await fs.mkdir(dirname(resolvedLinkPath), { recursive: true });\r\n\r\n try {\r\n const existingEntry = await fs.lstat(resolvedLinkPath);\r\n\r\n if (!existingEntry.isSymbolicLink()) {\r\n throw new Error(`Refusing to replace non-link entry at ${resolvedLinkPath}`);\r\n }\r\n\r\n const currentTargetPath = await fs.realpath(resolvedLinkPath);\r\n if (pathsAreEqual(currentTargetPath, resolvedTargetPath)) {\r\n return;\r\n }\r\n\r\n throw new Error(`Refusing to replace link at ${resolvedLinkPath}`);\r\n } catch (error) {\r\n if (\r\n (error as NodeJS.ErrnoException).code === \"ENOENT\" &&\r\n (await fs\r\n .lstat(resolvedLinkPath)\r\n .then((entry) => entry.isSymbolicLink())\r\n .catch(() => false))\r\n ) {\r\n await fs.rm(resolvedLinkPath, { recursive: true, force: false });\r\n } else if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") {\r\n throw error;\r\n }\r\n }\r\n\r\n await fs.symlink(resolvedTargetPath, resolvedLinkPath, directoryLinkType);\r\n}\r\n\r\nexport async function isLinkPointingToTarget(\r\n linkPath: string,\r\n targetPath: string\r\n): Promise<boolean> {\r\n try {\r\n const entry = await fs.lstat(linkPath);\r\n if (!entry.isSymbolicLink()) {\r\n return false;\r\n }\r\n\r\n const resolvedTargetPath = await fs.realpath(linkPath);\r\n return pathsAreEqual(resolvedTargetPath, targetPath);\r\n } catch (error) {\r\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\r\n return false;\r\n }\r\n\r\n throw error;\r\n }\r\n}\r\n\r\nexport async function isManagedLinkTarget(\r\n linkPath: string,\r\n skillmuxHome: string\r\n): Promise<boolean> {\r\n try {\r\n const entry = await fs.lstat(linkPath);\r\n if (!entry.isSymbolicLink()) {\r\n return false;\r\n }\r\n\r\n const resolvedTargetPath = await fs.realpath(linkPath);\r\n return isPathInside(skillmuxHome, resolvedTargetPath);\r\n } catch (error) {\r\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\r\n return false;\r\n }\r\n\r\n throw error;\r\n }\r\n}\r\n","import * as fs from \"node:fs/promises\";\n\nexport async function safeRemoveLink(path: string): Promise<boolean> {\n try {\n const entry = await fs.lstat(path);\n\n if (!entry.isSymbolicLink()) {\n return false;\n }\n\n await fs.rm(path, { recursive: true, force: false });\n return true;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return false;\n }\n\n throw error;\n }\n}\n","import * as fs from \"node:fs/promises\";\r\nimport { homedir } from \"node:os\";\r\nimport { join } from \"node:path\";\r\nimport type {\r\n ActivationRecord,\r\n AgentRecord,\r\n ManagedSkill,\r\n Manifest\r\n} from \"../core/types\";\r\nimport { normalizeId } from \"../core/ids\";\r\nimport { resolveSkillmuxHome } from \"../config/resolve-skillmux-home\";\r\nimport {\r\n discoverAgents,\r\n type DiscoveredAgent\r\n} from \"../discovery/discover-agents\";\r\nimport { createManagedLink, isLinkPointingToTarget } from \"../fs/link-ops\";\r\nimport { readManifest } from \"../manifest/read-manifest\";\r\nimport { writeManifest } from \"../manifest/write-manifest\";\r\n\r\nexport type RunEnableOptions = {\r\n homeDir?: string;\r\n skillmuxHome?: string;\r\n skill: string;\r\n agent: string;\r\n now?: Date;\r\n};\r\n\r\nexport type RunEnableResult = {\r\n changed: boolean;\r\n skill: ManagedSkill;\r\n agent: AgentRecord;\r\n activation: ActivationRecord;\r\n manifest: Manifest;\r\n output: string;\r\n};\r\n\r\nfunction buildAgentRecord(agent: DiscoveredAgent, timestamp: string): AgentRecord {\r\n return {\r\n id: agent.id,\r\n name: agent.stableName,\r\n path: agent.absoluteSkillsDirectoryPath,\r\n discovery: agent.discovery,\r\n available: agent.supportedOnPlatform,\r\n lastSeenAt: timestamp\r\n };\r\n}\r\n\r\nfunction buildActivationRecord(\r\n skillId: string,\r\n agentId: string,\r\n linkPath: string,\r\n timestamp: string,\r\n state: \"enabled\" | \"disabled\"\r\n): ActivationRecord {\r\n return {\r\n skillId,\r\n agentId,\r\n linkPath,\r\n state,\r\n updatedAt: timestamp\r\n };\r\n}\r\n\r\nfunction upsertActivation(\r\n manifest: Manifest,\r\n activation: ActivationRecord\r\n): void {\r\n const index = manifest.activations.findIndex(\r\n (entry) =>\r\n entry.skillId === activation.skillId && entry.agentId === activation.agentId\r\n );\r\n\r\n if (index === -1) {\r\n manifest.activations.push(activation);\r\n return;\r\n }\r\n\r\n manifest.activations[index] = activation;\r\n}\r\n\r\nasync function resolveTargetAgent(\r\n homeDir: string,\r\n skillmuxHome: string,\r\n agentName: string\r\n): Promise<DiscoveredAgent> {\r\n const agentId = normalizeId(agentName);\r\n const agents = await discoverAgents({ homeDir, skillmuxHome });\r\n const agent = agents.find((entry) => entry.id === agentId);\r\n\r\n if (agent === undefined) {\r\n throw new Error(`Unknown agent: ${agentName}`);\r\n }\r\n\r\n if (!agent.supportedOnPlatform) {\r\n throw new Error(`Agent ${agent.id} is not supported on ${process.platform}`);\r\n }\r\n\r\n return agent;\r\n}\r\n\r\nexport async function runEnable(\r\n options: RunEnableOptions\r\n): Promise<RunEnableResult> {\r\n const homeDir = options.homeDir ?? homedir();\r\n const { skillmuxHome: defaultSkillmuxHome } = resolveSkillmuxHome(homeDir);\r\n const skillmuxHome = options.skillmuxHome ?? defaultSkillmuxHome;\r\n const timestamp = (options.now ?? new Date()).toISOString();\r\n const manifest = await readManifest(skillmuxHome);\r\n const skillId = normalizeId(options.skill);\r\n const skill = manifest.skills[skillId];\r\n\r\n if (skill === undefined) {\r\n throw new Error(`Managed skill not found: ${skillId}`);\r\n }\r\n\r\n const agent = await resolveTargetAgent(homeDir, skillmuxHome, options.agent);\r\n const linkPath = join(agent.absoluteSkillsDirectoryPath, skill.id);\r\n const currentActivation = manifest.activations.find(\r\n (entry) => entry.skillId === skill.id && entry.agentId === agent.id\r\n );\r\n const agentRecord = buildAgentRecord(agent, timestamp);\r\n\r\n manifest.agents[agent.id] = agentRecord;\r\n await fs.mkdir(agent.absoluteSkillsDirectoryPath, { recursive: true });\r\n\r\n const linkAlreadyEnabled = await isLinkPointingToTarget(linkPath, skill.path);\r\n const activationAlreadyEnabled =\r\n currentActivation?.state === \"enabled\" && currentActivation.linkPath === linkPath;\r\n\r\n if (linkAlreadyEnabled && activationAlreadyEnabled) {\r\n return {\r\n changed: false,\r\n skill,\r\n agent: agentRecord,\r\n activation: currentActivation,\r\n manifest,\r\n output: `${skill.id} is already enabled for ${agent.id}\\n`\r\n };\r\n }\r\n\r\n await createManagedLink(linkPath, skill.path);\r\n\r\n const activation = buildActivationRecord(\r\n skill.id,\r\n agent.id,\r\n linkPath,\r\n timestamp,\r\n \"enabled\"\r\n );\r\n upsertActivation(manifest, activation);\r\n await writeManifest(skillmuxHome, manifest);\r\n\r\n return {\r\n changed: true,\r\n skill,\r\n agent: agentRecord,\r\n activation,\r\n manifest,\r\n output: `Enabled ${skill.id} for ${agent.id}\\n`\r\n };\r\n}\r\n","import { resolve } from \"node:path\";\r\nimport { homedir } from \"node:os\";\r\nimport type { ManagedSkill, Manifest } from \"../core/types\";\r\nimport { normalizeId } from \"../core/ids\";\r\nimport { resolveSkillmuxHome } from \"../config/resolve-skillmux-home\";\r\nimport {\r\n assertSkillSourceLayout,\r\n copySkillContentsToManagedStore\r\n} from \"../fs/safe-copy\";\r\nimport { readManifest } from \"../manifest/read-manifest\";\r\nimport { writeManifest } from \"../manifest/write-manifest\";\r\n\r\nexport type RunImportOptions = {\r\n homeDir?: string;\r\n skillmuxHome?: string;\r\n sourcePath: string;\r\n skillName: string;\r\n now?: Date;\r\n};\r\n\r\nexport type RunImportResult = {\r\n skill: ManagedSkill;\r\n manifest: Manifest;\r\n output: string;\r\n};\r\n\r\nfunction buildManagedSkillPath(skillmuxHome: string, skillId: string): string {\r\n return resolve(skillmuxHome, \"skills\", skillId);\r\n}\r\n\r\nexport async function runImport(\r\n options: RunImportOptions\r\n): Promise<RunImportResult> {\r\n const homeDir = options.homeDir ?? homedir();\r\n const resolvedPaths = resolveSkillmuxHome(homeDir);\r\n const skillmuxHome = options.skillmuxHome ?? resolvedPaths.skillmuxHome;\r\n const sourcePath = resolve(options.sourcePath);\r\n const skillId = normalizeId(options.skillName);\r\n const importedAt = (options.now ?? new Date()).toISOString();\r\n const manifest = await readManifest(skillmuxHome);\r\n const managedSkillPath = buildManagedSkillPath(skillmuxHome, skillId);\r\n\r\n await assertSkillSourceLayout(sourcePath);\r\n\r\n if (manifest.skills[skillId] !== undefined) {\r\n throw new Error(`Managed skill already exists for ${skillId}`);\r\n }\r\n\r\n await copySkillContentsToManagedStore(sourcePath, managedSkillPath);\r\n\r\n const skill: ManagedSkill = {\r\n id: skillId,\r\n name: options.skillName,\r\n path: managedSkillPath,\r\n source: {\r\n kind: \"local\",\r\n path: sourcePath\r\n },\r\n importedAt\r\n };\r\n\r\n manifest.skills[skillId] = skill;\r\n await writeManifest(skillmuxHome, manifest);\r\n\r\n return {\r\n skill,\r\n manifest,\r\n output: `Imported ${skillId} to ${managedSkillPath}\\n`\r\n };\r\n}\r\n","import { homedir } from \"node:os\";\r\nimport type { AgentRecord, Manifest, ScanIssue } from \"../core/types\";\r\nimport { resolveSkillmuxHome } from \"../config/resolve-skillmux-home\";\r\nimport {\r\n discoverAgents,\r\n type DiscoveredAgent\r\n} from \"../discovery/discover-agents\";\r\nimport {\r\n scanAgentSkills,\r\n type ScanAgentSkillsResult\r\n} from \"../discovery/scan-agent-skills\";\r\nimport { type ScannedSkillEntry } from \"../discovery/infer-skill-entry\";\r\nimport { readManifest } from \"../manifest/read-manifest\";\r\nimport { writeManifest } from \"../manifest/write-manifest\";\r\nimport { formatIssue } from \"../output/format-issue\";\r\nimport { printJson } from \"../output/print-json\";\r\nimport { printTable } from \"../output/print-table\";\r\n\r\nexport type RunScanOptions = {\r\n homeDir?: string;\r\n skillmuxHome?: string;\r\n platform?: NodeJS.Platform;\r\n now?: Date;\r\n json?: boolean;\r\n};\r\n\r\nexport type RunScanResult = {\r\n manifest: Manifest;\r\n agents: DiscoveredAgent[];\r\n entries: ScannedSkillEntry[];\r\n issues: ScanIssue[];\r\n output: string;\r\n};\r\n\r\nfunction buildAgentRecord(\r\n agent: DiscoveredAgent,\r\n timestamp: string,\r\n previousRecord?: AgentRecord\r\n): AgentRecord {\r\n const lastSeenAt = agent.exists ? timestamp : previousRecord?.lastSeenAt ?? null;\r\n\r\n return {\r\n id: agent.id,\r\n name: agent.stableName,\r\n path: agent.absoluteSkillsDirectoryPath,\r\n discovery: agent.discovery,\r\n available: agent.exists && agent.supportedOnPlatform,\r\n lastSeenAt\r\n };\r\n}\r\n\r\nfunction buildScanOutput(result: Omit<RunScanResult, \"output\">, json: boolean): string {\r\n if (json) {\r\n return printJson({\r\n lastScan: result.manifest.lastScan,\r\n agents: result.agents.map((agent) => ({\r\n id: agent.id,\r\n name: agent.stableName,\r\n path: agent.absoluteSkillsDirectoryPath,\r\n exists: agent.exists,\r\n supportedOnPlatform: agent.supportedOnPlatform\r\n })),\r\n entries: result.entries\r\n });\r\n }\r\n\r\n if (result.entries.length === 0) {\r\n return \"No skill entries found.\\n\";\r\n }\r\n\r\n const table = printTable(\r\n result.entries.map((entry) => ({\r\n agent: entry.agentId,\r\n skill: entry.skillName,\r\n kind: entry.kind,\r\n path: entry.path\r\n })),\r\n [\r\n { key: \"agent\", label: \"Agent\" },\r\n { key: \"skill\", label: \"Skill\" },\r\n { key: \"kind\", label: \"Kind\" },\r\n { key: \"path\", label: \"Path\" }\r\n ]\r\n );\r\n\r\n if (result.issues.length === 0) {\r\n return table;\r\n }\r\n\r\n return `${table}\\n${result.issues.map(formatIssue).join(\"\\n\")}\\n`;\r\n}\r\n\r\nexport async function runScan(options: RunScanOptions = {}): Promise<RunScanResult> {\r\n const homeDir = options.homeDir ?? homedir();\r\n const resolvedPaths = resolveSkillmuxHome(homeDir);\r\n const skillmuxHome = options.skillmuxHome ?? resolvedPaths.skillmuxHome;\r\n const manifest = await readManifest(skillmuxHome);\r\n const agents = await discoverAgents({\r\n homeDir,\r\n platform: options.platform,\r\n skillmuxHome\r\n });\r\n\r\n const timestamp = (options.now ?? new Date()).toISOString();\r\n const entries: ScannedSkillEntry[] = [];\r\n const issues: ScanIssue[] = [];\r\n\r\n for (const agent of agents) {\r\n const scannedAgent = await scanAgentSkills(agent, skillmuxHome);\r\n entries.push(...scannedAgent.entries);\r\n issues.push(...scannedAgent.issues);\r\n manifest.agents[agent.id] = buildAgentRecord(\r\n agent,\r\n timestamp,\r\n manifest.agents[agent.id]\r\n );\r\n }\r\n\r\n manifest.lastScan = {\r\n at: timestamp,\r\n issues\r\n };\r\n\r\n await writeManifest(skillmuxHome, manifest);\r\n\r\n const resultWithoutOutput = {\r\n manifest,\r\n agents,\r\n entries,\r\n issues\r\n };\r\n\r\n return {\r\n ...resultWithoutOutput,\r\n output: buildScanOutput(resultWithoutOutput, options.json === true)\r\n };\r\n}\r\n","import type { ScanIssue } from \"../core/types\";\r\n\r\nexport function formatIssue(issue: ScanIssue): string {\r\n if (issue.path === undefined) {\r\n return `[${issue.severity}] ${issue.code}: ${issue.message}`;\r\n }\r\n\r\n return `[${issue.severity}] ${issue.code} @ ${issue.path}: ${issue.message}`;\r\n}\r\n","import { printJson } from \"../output/print-json\";\r\nimport { printTable } from \"../output/print-table\";\r\nimport { runScan, type RunScanOptions, type RunScanResult } from \"./scan\";\r\n\r\nexport type ListView = \"records\" | \"agents\" | \"skills\";\r\nexport type ListFormat = \"table\" | \"json\";\r\n\r\nexport type RunListOptions = Omit<RunScanOptions, \"json\"> & {\r\n view?: ListView;\r\n format?: ListFormat;\r\n};\r\n\r\nexport type RunListResult = {\r\n output: string;\r\n data: unknown;\r\n};\r\n\r\nfunction buildRecordsView(scanResult: RunScanResult) {\r\n return {\r\n view: \"records\" as const,\r\n records: scanResult.entries,\r\n issues: scanResult.issues\r\n };\r\n}\r\n\r\nfunction buildAgentsView(scanResult: RunScanResult) {\n const groups = new Map<\n string,\n {\r\n agentId: string;\r\n agentName: string;\r\n entries: RunScanResult[\"entries\"];\r\n }\n >();\n\n for (const agent of scanResult.agents) {\n groups.set(agent.id, {\n agentId: agent.id,\n agentName: agent.stableName,\n entries: []\n });\n }\n\n for (const entry of scanResult.entries) {\n const current = groups.get(entry.agentId) ?? {\n agentId: entry.agentId,\n agentName: entry.agentName,\r\n entries: []\r\n };\r\n current.entries.push(entry);\r\n groups.set(entry.agentId, current);\r\n }\r\n\r\n return {\r\n view: \"agents\" as const,\r\n agents: [...groups.values()].sort((left, right) =>\r\n left.agentId.localeCompare(right.agentId)\r\n ),\r\n issues: scanResult.issues\r\n };\r\n}\r\n\r\nfunction buildSkillsView(scanResult: RunScanResult) {\n const groups = new Map<\n string,\n {\r\n skillName: string;\r\n entries: RunScanResult[\"entries\"];\r\n }\n >();\n\n for (const skill of Object.values(scanResult.manifest.skills)) {\n groups.set(skill.id, {\n skillName: skill.id,\n entries: []\n });\n }\n\n for (const entry of scanResult.entries) {\n const current = groups.get(entry.skillName) ?? {\n skillName: entry.skillName,\n entries: []\r\n };\r\n current.entries.push(entry);\r\n groups.set(entry.skillName, current);\r\n }\r\n\r\n return {\r\n view: \"skills\" as const,\r\n skills: [...groups.values()].sort((left, right) =>\r\n left.skillName.localeCompare(right.skillName)\r\n ),\r\n issues: scanResult.issues\r\n };\r\n}\r\n\r\nfunction buildListData(scanResult: RunScanResult, view: ListView): unknown {\r\n if (view === \"agents\") {\r\n return buildAgentsView(scanResult);\r\n }\r\n\r\n if (view === \"skills\") {\r\n return buildSkillsView(scanResult);\r\n }\r\n\r\n return buildRecordsView(scanResult);\r\n}\r\n\r\nfunction buildTableOutput(data: unknown, view: ListView): string {\r\n if (view === \"agents\") {\r\n const agentRows = (data as { agents: Array<{ agentId: string; agentName: string; entries: unknown[] }> }).agents;\r\n return printTable(\r\n agentRows.map((agent) => ({\r\n agent: agent.agentId,\r\n name: agent.agentName,\r\n entries: String(agent.entries.length)\r\n })),\r\n [\r\n { key: \"agent\", label: \"Agent\" },\r\n { key: \"name\", label: \"Name\" },\r\n { key: \"entries\", label: \"Entries\" }\r\n ]\r\n );\r\n }\r\n\r\n if (view === \"skills\") {\r\n const skillRows = (data as { skills: Array<{ skillName: string; entries: unknown[] }> }).skills;\r\n return printTable(\r\n skillRows.map((skill) => ({\r\n skill: skill.skillName,\r\n entries: String(skill.entries.length)\r\n })),\r\n [\r\n { key: \"skill\", label: \"Skill\" },\r\n { key: \"entries\", label: \"Entries\" }\r\n ]\r\n );\r\n }\r\n\r\n const records = (data as { records: Array<{ agentId: string; skillName: string; kind: string }> }).records;\r\n return printTable(\r\n records.map((record) => ({\r\n agent: record.agentId,\r\n skill: record.skillName,\r\n kind: record.kind\r\n })),\r\n [\r\n { key: \"agent\", label: \"Agent\" },\r\n { key: \"skill\", label: \"Skill\" },\r\n { key: \"kind\", label: \"Kind\" }\r\n ]\r\n );\r\n}\r\n\r\nexport async function runList(options: RunListOptions = {}): Promise<RunListResult> {\r\n const view = options.view ?? \"records\";\r\n const format = options.format ?? \"table\";\r\n const scanResult = await runScan(options);\r\n const data = buildListData(scanResult, view);\r\n\r\n return {\r\n data,\r\n output: format === \"json\" ? printJson(data) : buildTableOutput(data, view)\r\n };\r\n}\r\n"],"mappings":";AAAA,SAAS,eAAe;;;ACAjB,IAAM,qBAAqB,CAAC,SAAS,SAAS,QAAQ;AAItD,IAAM,kBAAkB;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAcO,IAAM,oBAAiC;AAAA,EAC5C;AAAA,IACE,IAAI;AAAA,IACJ,YAAY;AAAA,IACZ,oBAAoB,CAAC,GAAG,kBAAkB;AAAA,IAC1C,sBAAsB;AAAA,IACtB,qBAAqB;AAAA,IACrB,kBAAkB;AAAA,IAClB,WAAW;AAAA,EACb;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,YAAY;AAAA,IACZ,oBAAoB,CAAC,GAAG,kBAAkB;AAAA,IAC1C,sBAAsB;AAAA,IACtB,qBAAqB;AAAA,IACrB,kBAAkB;AAAA,IAClB,WAAW;AAAA,EACb;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,YAAY;AAAA,IACZ,oBAAoB,CAAC,GAAG,kBAAkB;AAAA,IAC1C,sBAAsB;AAAA,IACtB,qBAAqB;AAAA,IACrB,kBAAkB;AAAA,IAClB,WAAW;AAAA,EACb;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,YAAY;AAAA,IACZ,oBAAoB,CAAC,GAAG,kBAAkB;AAAA,IAC1C,sBAAsB;AAAA,IACtB,qBAAqB;AAAA,IACrB,kBAAkB;AAAA,IAClB,WAAW;AAAA,EACb;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,YAAY;AAAA,IACZ,oBAAoB,CAAC,GAAG,kBAAkB;AAAA,IAC1C,sBAAsB;AAAA,IACtB,qBAAqB;AAAA,IACrB,kBAAkB;AAAA,IAClB,WAAW;AAAA,EACb;AACF;AAEO,IAAM,sBAAsB,OAAO;AAAA,EACxC,kBAAkB,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,IAAI,CAAC;AACjD;;;AC1EA,SAAS,eAAe;;;ACAxB,SAAS,MAAM,eAAe;AAOvB,SAAS,gBAAgB,cAA8B;AAC5D,SAAO,KAAK,QAAQ,YAAY,GAAG,aAAa;AAClD;AAEO,SAAS,oBAAoB,SAAyC;AAC3E,QAAM,kBAAkB,QAAQ,OAAO;AACvC,QAAM,eAAe,KAAK,iBAAiB,WAAW;AAEtD,SAAO;AAAA,IACL;AAAA,IACA,YAAY,gBAAgB,YAAY;AAAA,EAC1C;AACF;;;ACnBA,YAAYA,SAAQ;AACpB,SAAS,QAAAC,OAAM,WAAAC,gBAAe;;;ACD9B,YAAY,QAAQ;AACpB,SAAS,SAAS;;;ACDX,IAAM,gBAAN,cAA4B,MAAM;AAAA,EACvC,YAAY,SAAiB;AAC3B,UAAM,OAAO;AACb,SAAK,OAAO,WAAW;AAAA,EACzB;AACF;AAEO,IAAM,yBAAN,cAAqC,cAAc;AAAA,EACxD,YACkB,MACA,OAChB;AACA,UAAM,WAAW,IAAI,KAAK,KAAK,EAAE;AAHjB;AACA;AAAA,EAGlB;AAAA,EAJkB;AAAA,EACA;AAIpB;AAEO,IAAM,0BAAN,cAAsC,cAAc;AAAA,EACzD,YAAY,SAAiB;AAC3B,UAAM,OAAO;AAAA,EACf;AACF;AAEO,IAAM,4BAAN,cAAwC,cAAc;AAAA,EAC3D,YAAY,SAAiB;AAC3B,UAAM,OAAO;AAAA,EACf;AACF;;;ADjBA,IAAM,0BAA0B,EAAE,KAAK,kBAAkB;AAEzD,IAAM,sBAAsB,EACzB,OAAO;AAAA,EACN,YAAY,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EACvC,oBAAoB,EAAE,MAAM,uBAAuB,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EACrE,sBAAsB,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EACjD,qBAAqB,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EAChD,kBAAkB,EAAE,QAAQ,EAAE,SAAS;AACzC,CAAC,EACA,OAAO;AAEH,IAAM,mBAAmB,EAC7B,OAAO;AAAA,EACN,SAAS,EAAE,QAAQ,CAAC;AAAA,EACpB,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,GAAG,mBAAmB;AACzD,CAAC,EACA,OAAO;AAeV,SAAS,wBAAoC;AAC3C,SAAO;AAAA,IACL,SAAS;AAAA,IACT,QAAQ,CAAC;AAAA,EACX;AACF;AAEA,SAAS,aAAa,UAA0B;AAC9C,SAAO,SAAS,WAAW,CAAC,MAAM,QAAS,SAAS,MAAM,CAAC,IAAI;AACjE;AAEA,SAAS,uBAAuB,OAAkF;AAChH,SAAO,MAAM,OACV,IAAI,CAAC,UAAU;AACd,UAAM,OAAO,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,KAAK,GAAG,IAAI;AAC5D,WAAO,GAAG,IAAI,KAAK,MAAM,OAAO;AAAA,EAClC,CAAC,EACA,KAAK,IAAI;AACd;AAEA,eAAsB,eAAe,cAA2C;AAC9E,QAAM,aAAa,gBAAgB,YAAY;AAE/C,MAAI;AACF,UAAM,WAAW,MAAS,YAAS,YAAY,MAAM;AACrD,UAAM,SAAS,KAAK,MAAM,aAAa,QAAQ,CAAC;AAChD,UAAM,YAAY,iBAAiB,UAAU,MAAM;AAEnD,QAAI,CAAC,UAAU,SAAS;AACtB,YAAM,IAAI;AAAA,QACR,qBAAqB,UAAU,KAAK,uBAAuB,UAAU,KAAK,CAAC;AAAA,MAC7E;AAAA,IACF;AAEA,WAAO,UAAU;AAAA,EACnB,SAAS,OAAO;AACd,QACE,OAAO,UAAU,YACjB,UAAU,QACV,UAAU,SACT,MAAgC,SAAS,UAC1C;AACA,aAAO,sBAAsB;AAAA,IAC/B;AAEA,QAAI,iBAAiB,aAAa;AAChC,YAAM,IAAI;AAAA,QACR,qBAAqB,UAAU;AAAA,MACjC;AAAA,IACF;AAEA,UAAM;AAAA,EACR;AACF;;;ADpEA,SAAS,UAAU,MAAiB,UAAqC;AACvE,MAAI,aAAa,QAAW;AAC1B,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,GAAG;AAAA,EACL;AACF;AAEA,SAAS,gBAAgB,IAAY,UAAoC;AACvE,MACE,SAAS,yBAAyB,UAClC,SAAS,wBAAwB,QACjC;AACA,UAAM,IAAI;AAAA,MACR,0BAA0B,EAAE;AAAA,IAC9B;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA,YAAY,SAAS,cAAc;AAAA,IACnC,oBAAoB,SAAS,sBAAsB,CAAC,GAAG,kBAAkB;AAAA,IACzE,sBAAsB,SAAS;AAAA,IAC/B,qBAAqB,SAAS;AAAA,IAC9B,kBAAkB,SAAS,oBAAoB;AAAA,IAC/C,WAAW;AAAA,EACb;AACF;AAEA,eAAe,WAAW,MAAgC;AACxD,MAAI;AACF,UAAS,WAAO,IAAI;AACpB,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,sBAAsB,SAAiB,MAG9C;AACA,QAAM,mBAAmBC,SAAQ,SAAS,KAAK,oBAAoB;AAEnE,SAAO;AAAA,IACL;AAAA,IACA,6BAA6BC;AAAA,MAC3B;AAAA,MACA,KAAK;AAAA,IACP;AAAA,EACF;AACF;AAEA,eAAsB,eACpB,SAC4B;AAC5B,QAAM,WAAW,QAAQ,YAAY,QAAQ;AAC7C,QAAM,UAAUD,SAAQ,QAAQ,OAAO;AACvC,QAAM,eACJ,QAAQ,gBAAgB,oBAAoB,OAAO,EAAE;AACvD,QAAM,aAAa,MAAM,eAAe,YAAY;AAEpD,QAAM,mBAAsC,CAAC;AAE7C,aAAW,WAAW,iBAAiB;AACrC,UAAM,aAAa;AAAA,MACjB,oBAAoB,OAAyB;AAAA,MAC7C,WAAW,OAAO,OAAO;AAAA,IAC3B;AACA,UAAM,gBAAgB,sBAAsB,SAAS,UAAU;AAE/D,qBAAiB,KAAK;AAAA,MACpB,GAAG;AAAA,MACH,GAAG;AAAA,MACH,QAAQ,MAAM,WAAW,cAAc,2BAA2B;AAAA,MAClE,qBAAqB,WAAW,mBAAmB;AAAA,QACjD,CAAC,sBAAsB,sBAAsB;AAAA,MAC/C;AAAA,IACF,CAAC;AAAA,EACH;AAEA,aAAW,CAAC,SAAS,QAAQ,KAAK,OAAO,QAAQ,WAAW,MAAM,GAAG;AACnE,QAAI,OAAO,OAAO,qBAAqB,OAAO,GAAG;AAC/C;AAAA,IACF;AAEA,UAAM,aAAa,gBAAgB,SAAS,QAAQ;AACpD,UAAM,gBAAgB,sBAAsB,SAAS,UAAU;AAE/D,qBAAiB,KAAK;AAAA,MACpB,GAAG;AAAA,MACH,GAAG;AAAA,MACH,QAAQ,MAAM,WAAW,cAAc,2BAA2B;AAAA,MAClE,qBAAqB,WAAW,mBAAmB;AAAA,QACjD,CAAC,sBAAsB,sBAAsB;AAAA,MAC/C;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO;AACT;;;AGjIO,SAAS,UAAU,OAAwB;AAChD,SAAO,GAAG,KAAK,UAAU,OAAO,MAAM,CAAC,CAAC;AAAA;AAC1C;;;ACGO,SAAS,WACd,MACA,SACQ;AACR,QAAM,eAAe,KAAK;AAAA,IAAI,CAAC,QAC7B,QAAQ,IAAI,CAAC,WAAW,OAAO,IAAI,OAAO,GAAG,KAAK,EAAE,CAAC;AAAA,EACvD;AACA,QAAM,SAAS,QAAQ;AAAA,IAAI,CAAC,QAAQ,UAClC,KAAK;AAAA,MACH,OAAO,MAAM;AAAA,MACb,GAAG,aAAa,IAAI,CAAC,QAAQ,IAAI,KAAK,GAAG,UAAU,CAAC;AAAA,IACtD;AAAA,EACF;AAEA,QAAM,SAAS,QACZ,IAAI,CAAC,QAAQ,UAAU,OAAO,MAAM,OAAO,OAAO,KAAK,CAAC,CAAC,EACzD,KAAK,IAAI;AACZ,QAAM,YAAY,OAAO,IAAI,CAAC,UAAU,IAAI,OAAO,KAAK,CAAC,EAAE,KAAK,IAAI;AACpE,QAAM,OAAO,aAAa;AAAA,IAAI,CAAC,QAC7B,IAAI,IAAI,CAAC,MAAM,UAAU,KAAK,OAAO,OAAO,KAAK,CAAC,CAAC,EAAE,KAAK,IAAI;AAAA,EAChE;AAEA,SAAO,GAAG,CAAC,QAAQ,WAAW,GAAG,IAAI,EAAE,KAAK,IAAI,CAAC;AAAA;AACnD;;;ANPA,SAAS,iBAAiB,QAAmC;AAC3D,SAAO;AAAA,IACL,OAAO,IAAI,CAAC,WAAW;AAAA,MACrB,IAAI,MAAM;AAAA,MACV,MAAM,MAAM;AAAA,MACZ,MAAM,MAAM;AAAA,MACZ,QAAQ,OAAO,MAAM,MAAM;AAAA,MAC3B,WAAW,OAAO,MAAM,mBAAmB;AAAA,MAC3C,WAAW,MAAM;AAAA,IACnB,EAAE;AAAA,IACF;AAAA,MACE,EAAE,KAAK,MAAM,OAAO,QAAQ;AAAA,MAC5B,EAAE,KAAK,QAAQ,OAAO,OAAO;AAAA,MAC7B,EAAE,KAAK,QAAQ,OAAO,OAAO;AAAA,MAC7B,EAAE,KAAK,UAAU,OAAO,SAAS;AAAA,MACjC,EAAE,KAAK,aAAa,OAAO,YAAY;AAAA,MACvC,EAAE,KAAK,aAAa,OAAO,YAAY;AAAA,IACzC;AAAA,EACF;AACF;AAEA,eAAsB,UACpB,UAA4B,CAAC,GACH;AAC1B,QAAM,UAAU,QAAQ,WAAW,QAAQ;AAC3C,QAAM,gBAAgB,oBAAoB,OAAO;AACjD,QAAM,eAAe,QAAQ,gBAAgB,cAAc;AAC3D,QAAM,SAAS,MAAM,eAAe;AAAA,IAClC;AAAA,IACA;AAAA,IACA,UAAU,QAAQ;AAAA,EACpB,CAAC;AAED,SAAO;AAAA,IACL;AAAA,IACA,QACE,QAAQ,SAAS,OACb,UAAU,MAAM,IAChB,iBAAiB,MAAM;AAAA,EAC/B;AACF;;;AO7DA,SAAS,WAAAE,gBAAe;AACxB,SAAS,kBAAkB;;;ACC3B,IAAM,aAAa;AAEZ,SAAS,YAAY,OAAuB;AACjD,QAAM,aAAa,MAChB,KAAK,EACL,YAAY,EACZ,QAAQ,eAAe,GAAG,EAC1B,QAAQ,YAAY,EAAE;AAEzB,SAAO,WAAW,SAAS,IAAI,aAAa;AAC9C;AAEO,SAAS,UAAU,OAAwB;AAChD,SAAO,WAAW,KAAK,KAAK;AAC9B;;;AChBA,YAAYC,SAAQ;AAIpB,eAAsB,gBACpB,cACA,QACiC;AACjC,QAAM,aAAa,gBAAgB,YAAY;AAC/C,QAAS,UAAM,cAAc,EAAE,WAAW,KAAK,CAAC;AAChD,QAAS,cAAU,YAAY,GAAG,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,GAAM,MAAM;AAE7E,SAAO;AAAA,IACL;AAAA,IACA;AAAA,EACF;AACF;;;AFiBA,SAAS,sBAAsB,OAAe,OAAuB;AACnE,QAAM,UAAU,MAAM,KAAK;AAE3B,MAAI,QAAQ,WAAW,GAAG;AACxB,UAAM,IAAI,0BAA0B,GAAG,KAAK,oBAAoB;AAAA,EAClE;AAEA,MAAI,WAAW,OAAO,GAAG;AACvB,UAAM,IAAI,0BAA0B,GAAG,KAAK,0BAA0B;AAAA,EACxE;AAEA,QAAM,aAAa,QAAQ,WAAW,MAAM,GAAG;AAE/C,MAAI,eAAe,OAAO,eAAe,QAAQ,WAAW,WAAW,KAAK,KAAK,WAAW,SAAS,MAAM,GAAG;AAC5G,UAAM,IAAI,0BAA0B,GAAG,KAAK,qDAAqD;AAAA,EACnG;AAEA,SAAO,WAAW,QAAQ,UAAU,EAAE;AACxC;AAEA,SAAS,iBAAiB,OAAuB;AAC/C,QAAM,UAAU,MAAM,KAAK;AAE3B,MAAI,QAAQ,WAAW,KAAK,YAAY,KAAK,OAAO,MAAM,OAAO;AAC/D,UAAM,IAAI,uBAAuB,YAAY,KAAK;AAAA,EACpD;AAEA,SAAO,YAAY,OAAO;AAC5B;AAEA,SAAS,mBAAmB,OAAkD;AAC5E,MAAI,UAAU,UAAa,MAAM,WAAW,GAAG;AAC7C,WAAO,CAAC,QAAQ,QAA6B;AAAA,EAC/C;AAEA,QAAM,aAAa,CAAC,GAAG,IAAI,IAAI,MAAM,IAAI,CAAC,UAAU,MAAM,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC;AAChF,QAAM,UAAU,WAAW;AAAA,IACzB,CAAC,UAA2B,mBAAmB,SAAS,KAA0B,MAAM;AAAA,EAC1F;AAEA,MAAI,QAAQ,SAAS,GAAG;AACtB,UAAM,IAAI;AAAA,MACR,4BAA4B,mBAAmB,KAAK,IAAI,CAAC;AAAA,IAC3D;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,mBAAmB,SAG1B;AACA,QAAM,UAAU,iBAAiB,QAAQ,EAAE;AAC3C,QAAM,QAAuB;AAAA,IAC3B,oBAAoB,mBAAmB,QAAQ,SAAS;AAAA,IACxD,sBAAsB,sBAAsB,QAAQ,MAAM,MAAM;AAAA,IAChE,qBAAqB,sBAAsB,QAAQ,UAAU,UAAU,QAAQ;AAAA,EACjF;AAEA,MAAI,QAAQ,SAAS,UAAa,QAAQ,KAAK,KAAK,EAAE,SAAS,GAAG;AAChE,UAAM,aAAa,QAAQ,KAAK,KAAK;AAAA,EACvC;AAEA,MAAI,QAAQ,sBAAsB,MAAM;AACtC,UAAM,mBAAmB;AAAA,EAC3B;AAEA,SAAO,EAAE,SAAS,MAAM;AAC1B;AAEA,SAASC,kBAAiB,QAAyD;AACjF,QAAM,UAAU;AAAA,IACd;AAAA,MACE;AAAA,QACE,SAAS,OAAO;AAAA,QAChB,YAAY,OAAO;AAAA,QACnB,SAAS,OAAO,OAAO,OAAO;AAAA,MAChC;AAAA,IACF;AAAA,IACA;AAAA,MACE,EAAE,KAAK,WAAW,OAAO,QAAQ;AAAA,MACjC,EAAE,KAAK,cAAc,OAAO,cAAc;AAAA,MAC1C,EAAE,KAAK,WAAW,OAAO,UAAU;AAAA,IACrC;AAAA,EACF;AAEA,QAAM,SAAS;AAAA,IACb;AAAA,MACE;AAAA,QACE,YAAY,OAAO,MAAM,cAAc;AAAA,QACvC,YAAY,OAAO,MAAM,sBAAsB,CAAC,GAAG,KAAK,GAAG;AAAA,QAC3D,MAAM,OAAO,MAAM,wBAAwB;AAAA,QAC3C,QAAQ,OAAO,MAAM,uBAAuB;AAAA,QAC5C,kBACE,OAAO,MAAM,qBAAqB,SAC9B,KACA,OAAO,OAAO,MAAM,gBAAgB;AAAA,MAC5C;AAAA,IACF;AAAA,IACA;AAAA,MACE,EAAE,KAAK,cAAc,OAAO,OAAO;AAAA,MACnC,EAAE,KAAK,aAAa,OAAO,YAAY;AAAA,MACvC,EAAE,KAAK,QAAQ,OAAO,OAAO;AAAA,MAC7B,EAAE,KAAK,UAAU,OAAO,aAAa;AAAA,MACrC,EAAE,KAAK,oBAAoB,OAAO,qBAAqB;AAAA,IACzD;AAAA,EACF;AAEA,SAAO,GAAG,OAAO,GAAG,MAAM;AAC5B;AAEA,eAAsB,kBACpB,SACkC;AAClC,QAAM,UAAU,QAAQ,WAAWC,SAAQ;AAC3C,QAAM,gBAAgB,oBAAoB,OAAO;AACjD,QAAM,eAAe,QAAQ,gBAAgB,cAAc;AAC3D,QAAM,aAAa,gBAAgB,YAAY;AAC/C,QAAM,SAAS,MAAM,eAAe,YAAY;AAChD,QAAM,EAAE,SAAS,MAAM,IAAI,mBAAmB,OAAO;AACrD,QAAM,WAAW,OAAO,OAAO,OAAO;AACtC,QAAM,UAAU,KAAK,UAAU,YAAY,IAAI,MAAM,KAAK,UAAU,KAAK;AAEzE,QAAM,aAAyB;AAAA,IAC7B,GAAG;AAAA,IACH,QAAQ;AAAA,MACN,GAAG,OAAO;AAAA,MACV,CAAC,OAAO,GAAG;AAAA,IACb;AAAA,EACF;AAEA,QAAM,gBAAgB,cAAc,UAAU;AAE9C,QAAM,sBAAsB;AAAA,IAC1B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,EACV;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,QACE,QAAQ,SAAS,OACb,UAAU,mBAAmB,IAC7BD,kBAAiB,mBAAmB;AAAA,EAC5C;AACF;;;AGvLA,SAAS,WAAAE,gBAAe;AA0BxB,SAASC,kBAAiB,OAAuB;AAC/C,QAAM,UAAU,MAAM,KAAK;AAE3B,MAAI,QAAQ,WAAW,KAAK,YAAY,KAAK,OAAO,MAAM,OAAO;AAC/D,UAAM,IAAI,uBAAuB,YAAY,KAAK;AAAA,EACpD;AAEA,SAAO,YAAY,OAAO;AAC5B;AAEA,SAASC,kBAAiB,QAA4D;AACpF,SAAO;AAAA,IACL;AAAA,MACE;AAAA,QACE,SAAS,OAAO;AAAA,QAChB,YAAY,OAAO;AAAA,QACnB,SAAS,OAAO,OAAO,OAAO;AAAA,QAC9B,SAAS,OAAO,OAAO,OAAO;AAAA,MAChC;AAAA,IACF;AAAA,IACA;AAAA,MACE,EAAE,KAAK,WAAW,OAAO,QAAQ;AAAA,MACjC,EAAE,KAAK,cAAc,OAAO,cAAc;AAAA,MAC1C,EAAE,KAAK,WAAW,OAAO,UAAU;AAAA,MACnC,EAAE,KAAK,WAAW,OAAO,UAAU;AAAA,IACrC;AAAA,EACF;AACF;AAEA,eAAsB,qBACpB,SACqC;AACrC,QAAM,UAAU,QAAQ,WAAWC,SAAQ;AAC3C,QAAM,gBAAgB,oBAAoB,OAAO;AACjD,QAAM,eAAe,QAAQ,gBAAgB,cAAc;AAC3D,QAAM,aAAa,gBAAgB,YAAY;AAC/C,QAAM,SAAS,MAAM,eAAe,YAAY;AAChD,QAAM,UAAUF,kBAAiB,QAAQ,EAAE;AAC3C,QAAM,UAAU,WAAW,OAAO;AAElC,QAAM,aAAyB;AAAA,IAC7B,GAAG;AAAA,IACH,QAAQ,OAAO;AAAA,MACb,OAAO,QAAQ,OAAO,MAAM,EAAE,OAAO,CAAC,CAAC,cAAc,MAAM,mBAAmB,OAAO;AAAA,IACvF;AAAA,EACF;AAEA,MAAI,SAAS;AACX,UAAM,gBAAgB,cAAc,UAAU;AAAA,EAChD;AAEA,QAAM,sBAAsB;AAAA,IAC1B;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS;AAAA,IACT;AAAA,IACA,QAAQ;AAAA,EACV;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,QACE,QAAQ,SAAS,OACb,UAAU,mBAAmB,IAC7BC,kBAAiB,mBAAmB;AAAA,EAC5C;AACF;;;AC7FA,SAAS,WAAAE,gBAAe;AAoBxB,SAASC,kBAAiB,QAAiD;AACzE,QAAM,UAAU;AAAA,IACd;AAAA,MACE;AAAA,QACE,cAAc,OAAO;AAAA,QACrB,YAAY,OAAO;AAAA,QACnB,WAAW,OAAO,OAAO,KAAK,OAAO,OAAO,MAAM,EAAE,MAAM;AAAA,MAC5D;AAAA,IACF;AAAA,IACA;AAAA,MACE,EAAE,KAAK,gBAAgB,OAAO,gBAAgB;AAAA,MAC9C,EAAE,KAAK,cAAc,OAAO,cAAc;AAAA,MAC1C,EAAE,KAAK,aAAa,OAAO,YAAY;AAAA,IACzC;AAAA,EACF;AAEA,QAAM,YAAY,OAAO,QAAQ,OAAO,OAAO,MAAM,EAClD,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,MAAM,KAAK,cAAc,KAAK,CAAC,EACnD,IAAI,CAAC,CAAC,SAAS,KAAK,OAAO;AAAA,IAC1B;AAAA,IACA,YAAY,MAAM,cAAc;AAAA,IAChC,MAAM,MAAM,wBAAwB;AAAA,IACpC,QAAQ,MAAM,uBAAuB;AAAA,EACvC,EAAE;AAEJ,MAAI,UAAU,WAAW,GAAG;AAC1B,WAAO,GAAG,OAAO;AAAA;AAAA;AAAA,EACnB;AAEA,SAAO,GAAG,OAAO;AAAA,EAAK,WAAW,WAAW;AAAA,IAC1C,EAAE,KAAK,WAAW,OAAO,QAAQ;AAAA,IACjC,EAAE,KAAK,cAAc,OAAO,OAAO;AAAA,IACnC,EAAE,KAAK,QAAQ,OAAO,OAAO;AAAA,IAC7B,EAAE,KAAK,UAAU,OAAO,aAAa;AAAA,EACvC,CAAC,CAAC;AACJ;AAEA,eAAsB,UACpB,UAA4B,CAAC,GACH;AAC1B,QAAM,UAAU,QAAQ,WAAWC,SAAQ;AAC3C,QAAM,gBAAgB,oBAAoB,OAAO;AACjD,QAAM,eAAe,QAAQ,gBAAgB,cAAc;AAC3D,QAAM,SAAS,MAAM,eAAe,YAAY;AAEhD,QAAM,sBAAsB;AAAA,IAC1B;AAAA,IACA,YAAY,gBAAgB,YAAY;AAAA,IACxC;AAAA,EACF;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,QACE,QAAQ,SAAS,OACb,UAAU,mBAAmB,IAC7BD,kBAAiB,mBAAmB;AAAA,EAC5C;AACF;;;AC9EA,YAAYE,SAAQ;AACpB,SAAS,WAAAC,gBAAe;AACxB,SAAS,QAAAC,aAAY;;;ACFrB,YAAYC,SAAQ;;;ACApB,YAAYC,SAAQ;AACpB,SAAS,UAAU,WAAAC,gBAAe;;;ACDlC,YAAYC,SAAQ;AACpB,SAAS,SAAS,OAAO,UAAU,WAAAC,UAAS,WAAW;AAEhD,SAAS,sBAAsB,MAAsB;AAC1D,QAAM,aAAaA,SAAQ,IAAI;AAC/B,SAAO,QAAQ,aAAa,UACxB,WAAW,WAAW,KAAK,IAAI,EAAE,YAAY,IAC7C;AACN;AAEO,SAAS,cAAc,MAAc,OAAwB;AAClE,SAAO,sBAAsB,IAAI,MAAM,sBAAsB,KAAK;AACpE;AAEO,SAAS,aAAa,YAAoB,WAA4B;AAC3E,QAAM,SAAS,sBAAsB,UAAU;AAC/C,QAAM,QAAQ,sBAAsB,SAAS;AAE7C,MAAI,MAAM,MAAM,EAAE,SAAS,MAAM,KAAK,EAAE,MAAM;AAC5C,WAAO;AAAA,EACT;AAEA,QAAM,eAAe,SAAS,QAAQ,KAAK;AAE3C,MAAI,iBAAiB,IAAI;AACvB,WAAO;AAAA,EACT;AAEA,MAAI,iBAAiB,MAAM;AACzB,WAAO;AAAA,EACT;AAEA,MAAI,aAAa,WAAW,KAAK,GAAG,EAAE,GAAG;AACvC,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,eAAsB,yBACpB,MACA,SACe;AACf,MAAI,UAAU,SAAS,gBAAgB,OAAOA,SAAQ,IAAI,IAAI,QAAQA,SAAQ,IAAI,CAAC;AAEnF,SAAO,MAAM;AACX,QAAI;AACF,YAAM,QAAQ,MAAS,UAAM,OAAO;AACpC,UAAI,MAAM,eAAe,GAAG;AAC1B,cAAM,IAAI,MAAM,iDAAiD,OAAO,EAAE;AAAA,MAC5E;AAAA,IACF,SAAS,OAAO;AACd,UAAK,MAAgC,SAAS,UAAU;AACtD,cAAM;AAAA,MACR;AAAA,IACF;AAEA,UAAM,SAAS,QAAQ,OAAO;AAC9B,QAAI,WAAW,SAAS;AACtB;AAAA,IACF;AAEA,cAAU;AAAA,EACZ;AACF;;;ADhCA,SAAS,WACP,MACA,UACA,SACA,MACW;AACX,SAAO,EAAE,MAAM,UAAU,SAAS,KAAK;AACzC;AAEA,eAAsB,gBACpB,SACgC;AAChC,QAAM,eAAeC,SAAQ,QAAQ,IAAI;AACzC,QAAM,YAAY,SAAS,YAAY;AACvC,QAAM,QAAQ,MAAS,UAAM,YAAY;AAEzC,MAAI,MAAM,eAAe,GAAG;AAC1B,QAAI;AACF,YAAM,aAAa,MAAS,aAAS,YAAY;AAEjD,UAAI,aAAa,QAAQ,cAAc,UAAU,GAAG;AAClD,eAAO;AAAA,UACL,OAAO;AAAA,YACL,SAAS,QAAQ;AAAA,YACjB,WAAW,QAAQ;AAAA,YACnB;AAAA,YACA,MAAM;AAAA,YACN,MAAM;AAAA,YACN;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,aAAO;AAAA,QACL,OAAO;AAAA,UACL,SAAS,QAAQ;AAAA,UACjB,WAAW,QAAQ;AAAA,UACnB;AAAA,UACA,MAAM;AAAA,UACN,MAAM;AAAA,UACN;AAAA,QACF;AAAA,QACA,OAAO;AAAA,UACL;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF,SAAS,OAAO;AACd,UAAK,MAAgC,SAAS,UAAU;AACtD,cAAM;AAAA,MACR;AAEA,aAAO;AAAA,QACL,OAAO;AAAA,UACL,SAAS,QAAQ;AAAA,UACjB,WAAW,QAAQ;AAAA,UACnB;AAAA,UACA,MAAM;AAAA,UACN,MAAM;AAAA,QACR;AAAA,QACA,OAAO;AAAA,UACL;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,MAAI,MAAM,YAAY,GAAG;AACvB,WAAO;AAAA,MACL,OAAO;AAAA,QACL,SAAS,QAAQ;AAAA,QACjB,WAAW,QAAQ;AAAA,QACnB;AAAA,QACA,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,OAAO;AAAA,MACL,SAAS,QAAQ;AAAA,MACjB,WAAW,QAAQ;AAAA,MACnB;AAAA,MACA,MAAM;AAAA,MACN,MAAM;AAAA,IACR;AAAA,IACA,OAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;;;ADtHA,eAAsB,gBACpB,OACA,cACgC;AAChC,MAAI,CAAC,MAAM,UAAU,CAAC,MAAM,qBAAqB;AAC/C,WAAO;AAAA,MACL,SAAS,CAAC;AAAA,MACV,QAAQ,CAAC;AAAA,IACX;AAAA,EACF;AAEA,QAAM,mBAAmB,MAAS,YAAQ,MAAM,6BAA6B;AAAA,IAC3E,eAAe;AAAA,EACjB,CAAC;AACD,QAAM,yBAAyB,CAAC,GAAG,gBAAgB,EAAE;AAAA,IAAK,CAAC,MAAM,UAC/D,KAAK,KAAK,cAAc,MAAM,IAAI;AAAA,EACpC;AAEA,QAAM,UAA+B,CAAC;AACtC,QAAM,SAAsB,CAAC;AAE7B,aAAW,kBAAkB,wBAAwB;AACnD,UAAM,SAAS,MAAM,gBAAgB;AAAA,MACnC,SAAS,MAAM;AAAA,MACf,WAAW,MAAM;AAAA,MACjB,MAAM,GAAG,MAAM,2BAA2B,IAAI,eAAe,IAAI;AAAA,MACjE;AAAA,IACF,CAAC;AAED,YAAQ,KAAK,OAAO,KAAK;AAEzB,QAAI,OAAO,UAAU,QAAW;AAC9B,aAAO,KAAK,OAAO,KAAK;AAAA,IAC1B;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,EACF;AACF;;;AGrDA,YAAYC,SAAQ;AACpB,SAAS,QAAAC,OAAM,WAAAC,gBAAe;;;ACCvB,SAAS,mBAAmB,cAAgC;AACjE,SAAO;AAAA,IACL,SAAS;AAAA,IACT;AAAA,IACA,QAAQ,CAAC;AAAA,IACT,QAAQ,CAAC;AAAA,IACT,aAAa,CAAC;AAAA,IACd,UAAU;AAAA,MACR,IAAI;AAAA,MACJ,QAAQ,CAAC;AAAA,IACX;AAAA,EACF;AACF;;;ACdA,SAAS,KAAAC,UAAS;AAUlB,IAAM,WAAWC,GACd,OAAO,EACP,IAAI,CAAC,EACL,OAAO,WAAW,gDAAgD;AAE9D,IAAM,kBAAkBA,GAC5B,OAAO;AAAA,EACN,MAAMA,GAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACtB,UAAUA,GAAE,KAAK,CAAC,QAAQ,WAAW,OAAO,CAAC;AAAA,EAC7C,SAASA,GAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACzB,MAAMA,GAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;AACnC,CAAC,EACA,OAAO;AAEH,IAAM,qBAAqBA,GAC/B,OAAO;AAAA,EACN,IAAI;AAAA,EACJ,MAAMA,GAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACtB,MAAMA,GAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACtB,QAAQA,GACL,OAAO;AAAA,IACN,MAAMA,GAAE,KAAK,CAAC,SAAS,UAAU,CAAC;AAAA,IAClC,MAAMA,GAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACxB,CAAC,EACA,OAAO;AAAA,EACV,YAAYA,GAAE,OAAO,EAAE,IAAI,CAAC;AAC9B,CAAC,EACA,OAAO;AAEH,IAAM,oBAAoBA,GAC9B,OAAO;AAAA,EACN,IAAI;AAAA,EACJ,MAAMA,GAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACtB,MAAMA,GAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACtB,WAAWA,GAAE,KAAK,CAAC,WAAW,QAAQ,CAAC;AAAA,EACvC,WAAWA,GAAE,QAAQ;AAAA,EACrB,YAAYA,GAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;AACzC,CAAC,EACA,OAAO;AAEH,IAAM,yBAAyBA,GACnC,OAAO;AAAA,EACN,SAAS;AAAA,EACT,SAAS;AAAA,EACT,UAAUA,GAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EAC1B,OAAOA,GAAE,KAAK,CAAC,WAAW,UAAU,CAAC;AAAA,EACrC,WAAWA,GAAE,OAAO,EAAE,IAAI,CAAC;AAC7B,CAAC,EACA,OAAO;AAEH,IAAM,iBAAiBA,GAC3B,OAAO;AAAA,EACN,SAASA,GAAE,QAAQ,CAAC;AAAA,EACpB,cAAcA,GAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EAC9B,QAAQA,GAAE,OAAOA,GAAE,OAAO,GAAG,kBAAkB;AAAA,EAC/C,QAAQA,GAAE,OAAOA,GAAE,OAAO,GAAG,iBAAiB;AAAA,EAC9C,aAAaA,GAAE,MAAM,sBAAsB;AAAA,EAC3C,UAAUA,GACP,OAAO;AAAA,IACN,IAAIA,GAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,IAC/B,QAAQA,GAAE,MAAM,eAAe;AAAA,EACjC,CAAC,EACA,OAAO;AACZ,CAAC,EACA,OAAO,EACP,YAAY,CAAC,UAAU,QAAQ;AAC9B,aAAW,CAAC,SAAS,KAAK,KAAK,OAAO,QAAQ,SAAS,MAAM,GAAG;AAC9D,QAAI,CAAC,UAAU,OAAO,GAAG;AACvB,UAAI,SAAS;AAAA,QACX,MAAMA,GAAE,aAAa;AAAA,QACrB,MAAM,CAAC,UAAU,OAAO;AAAA,QACxB,SAAS,yBAAyB,OAAO;AAAA,MAC3C,CAAC;AAAA,IACH;AAEA,QAAI,MAAM,OAAO,SAAS;AACxB,UAAI,SAAS;AAAA,QACX,MAAMA,GAAE,aAAa;AAAA,QACrB,MAAM,CAAC,UAAU,SAAS,IAAI;AAAA,QAC9B,SAAS,uCAAuC,OAAO;AAAA,MACzD,CAAC;AAAA,IACH;AAAA,EACF;AAEA,aAAW,CAAC,SAAS,KAAK,KAAK,OAAO,QAAQ,SAAS,MAAM,GAAG;AAC9D,QAAI,CAAC,UAAU,OAAO,GAAG;AACvB,UAAI,SAAS;AAAA,QACX,MAAMA,GAAE,aAAa;AAAA,QACrB,MAAM,CAAC,UAAU,OAAO;AAAA,QACxB,SAAS,yBAAyB,OAAO;AAAA,MAC3C,CAAC;AAAA,IACH;AAEA,QAAI,MAAM,OAAO,SAAS;AACxB,UAAI,SAAS;AAAA,QACX,MAAMA,GAAE,aAAa;AAAA,QACrB,MAAM,CAAC,UAAU,SAAS,IAAI;AAAA,QAC9B,SAAS,uCAAuC,OAAO;AAAA,MACzD,CAAC;AAAA,IACH;AAAA,EACF;AAEA,QAAM,kBAAkB,oBAAI,IAAY;AAExC,WAAS,YAAY,QAAQ,CAAC,YAAY,UAAU;AAClD,QAAI,EAAE,WAAW,WAAW,SAAS,SAAS;AAC5C,UAAI,SAAS;AAAA,QACX,MAAMA,GAAE,aAAa;AAAA,QACrB,MAAM,CAAC,eAAe,OAAO,SAAS;AAAA,QACtC,SAAS,4BAA4B,WAAW,OAAO;AAAA,MACzD,CAAC;AAAA,IACH;AAEA,QAAI,EAAE,WAAW,WAAW,SAAS,SAAS;AAC5C,UAAI,SAAS;AAAA,QACX,MAAMA,GAAE,aAAa;AAAA,QACrB,MAAM,CAAC,eAAe,OAAO,SAAS;AAAA,QACtC,SAAS,4BAA4B,WAAW,OAAO;AAAA,MACzD,CAAC;AAAA,IACH;AAEA,UAAM,UAAU,GAAG,WAAW,OAAO,IAAI,WAAW,OAAO;AAC3D,QAAI,gBAAgB,IAAI,OAAO,GAAG;AAChC,UAAI,SAAS;AAAA,QACX,MAAMA,GAAE,aAAa;AAAA,QACrB,MAAM,CAAC,eAAe,KAAK;AAAA,QAC3B,SAAS,4BAA4B,OAAO;AAAA,MAC9C,CAAC;AACD;AAAA,IACF;AAEA,oBAAgB,IAAI,OAAO;AAAA,EAC7B,CAAC;AACH,CAAC;;;AC/IH,SAAS,kBAAkB;AAC3B,YAAYC,SAAQ;AACpB,SAAS,QAAAC,aAAY;AAGrB,SAAS,gBAAgB,MAAsB;AAC7C,SAAOA,MAAK,MAAM,eAAe;AACnC;AAEO,SAAS,uBAAuB,cAA8B;AACnE,SAAO,GAAG,YAAY,IAAI,QAAQ,GAAG,IAAI,WAAW,CAAC;AACvD;AAEA,eAAsB,cACpB,MACA,UACe;AACf,QAAS,UAAM,MAAM,EAAE,WAAW,KAAK,CAAC;AAExC,QAAM,eAAe,gBAAgB,IAAI;AACzC,QAAM,WAAW,uBAAuB,YAAY;AACpD,QAAM,WAAW,GAAG,KAAK,UAAU,UAAU,MAAM,CAAC,CAAC;AAAA;AAErD,QAAS,cAAU,UAAU,UAAU,MAAM;AAE7C,MAAI;AACF,UAAS,WAAO,UAAU,YAAY;AAAA,EACxC,SAAS,OAAO;AACd,UAAS,WAAO,QAAQ,EAAE,MAAM,MAAM,MAAS;AAC/C,UAAM;AAAA,EACR;AACF;;;AHvBA,SAASC,iBAAgB,MAAsB;AAC7C,SAAOC,MAAK,MAAM,eAAe;AACnC;AAEA,SAAS,kBAAkB,MAAsB;AAC/C,QAAM,eAAeC,SAAQ,IAAI;AACjC,SAAO,QAAQ,aAAa,UACxB,aAAa,YAAY,IACzB;AACN;AAEA,SAASC,wBAAuB,OAAkF;AAChH,SAAO,MAAM,OACV,IAAI,CAAC,UAAU;AACd,UAAM,OAAO,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,KAAK,GAAG,IAAI;AAC5D,WAAO,GAAG,IAAI,KAAK,MAAM,OAAO;AAAA,EAClC,CAAC,EACA,KAAK,IAAI;AACd;AAEA,eAAsB,aAAa,MAAiC;AAClE,QAAM,eAAeH,iBAAgB,IAAI;AAEzC,MAAI;AACF,UAAM,WAAW,MAAS,aAAS,cAAc,MAAM;AACvD,UAAM,aAAa,KAAK,MAAM,QAAQ;AACtC,UAAM,iBAAiB,eAAe,UAAU,UAAU;AAE1D,QAAI,CAAC,eAAe,SAAS;AAC3B,YAAM,IAAI;AAAA,QACR,uBAAuB,YAAY,KAAKG,wBAAuB,eAAe,KAAK,CAAC;AAAA,MACtF;AAAA,IACF;AAEA,QACE,kBAAkB,eAAe,KAAK,YAAY,MAClD,kBAAkB,IAAI,GACtB;AACA,YAAM,IAAI;AAAA,QACR,uBAAuB,YAAY,6BAA6B,IAAI;AAAA,MACtE;AAAA,IACF;AAEA,WAAO,eAAe;AAAA,EACxB,SAAS,OAAO;AACd,QACE,OAAO,UAAU,YACjB,UAAU,QACV,UAAU,SACT,MAAgC,SAAS,UAC1C;AACA,YAAM,gBAAgB,mBAAmB,IAAI;AAC7C,YAAM,cAAc,MAAM,aAAa;AACvC,aAAO;AAAA,IACT;AAEA,QAAI,iBAAiB,aAAa;AAChC,YAAM,IAAI;AAAA,QACR,uBAAuB,YAAY;AAAA,MACrC;AAAA,IACF;AAEA,UAAM;AAAA,EACR;AACF;;;AJlCA,SAASC,YACP,MACA,UACA,SACA,MACW;AACX,SAAO,SAAS,SAAY,EAAE,MAAM,UAAU,QAAQ,IAAI,EAAE,MAAM,UAAU,SAAS,KAAK;AAC5F;AAEA,eAAeC,YAAW,MAAgC;AACxD,MAAI;AACF,UAAS,WAAO,IAAI;AACpB,WAAO;AAAA,EACT,SAAS,OAAO;AACd,QAAK,MAAgC,SAAS,UAAU;AACtD,aAAO;AAAA,IACT;AAEA,UAAM;AAAA,EACR;AACF;AAEA,eAAe,4BACb,SACA,QACe;AACf,aAAW,SAAS,SAAS;AAC3B,QAAI,MAAM,SAAS,uBAAuB;AACxC;AAAA,IACF;AAEA,QAAI,MAAMA,YAAWC,MAAK,MAAM,MAAM,UAAU,CAAC,GAAG;AAClD,aAAO;AAAA,QACLF;AAAA,UACE;AAAA,UACA;AAAA,UACA,4CAA4C,MAAM,OAAO,IAAI,MAAM,SAAS;AAAA,UAC5E,MAAM;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,eAAe,6BACb,UACA,QACe;AACf,aAAW,SAAS,OAAO,OAAO,SAAS,MAAM,GAAG;AAClD,QAAI,MAAMC,YAAW,MAAM,IAAI,GAAG;AAChC;AAAA,IACF;AAEA,WAAO;AAAA,MACLD;AAAA,QACE;AAAA,QACA;AAAA,QACA,qCAAqC,MAAM,EAAE;AAAA,QAC7C,MAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,8BACP,QACA,QACM;AACN,QAAM,eAAe,oBAAI,IAA+B;AAExD,aAAW,SAAS,QAAQ;AAC1B,UAAM,MAAM,sBAAsB,MAAM,2BAA2B;AACnE,UAAM,UAAU,aAAa,IAAI,GAAG,KAAK,CAAC;AAC1C,YAAQ,KAAK,KAAK;AAClB,iBAAa,IAAI,KAAK,OAAO;AAAA,EAC/B;AAEA,aAAW,oBAAoB,aAAa,OAAO,GAAG;AACpD,QAAI,iBAAiB,SAAS,GAAG;AAC/B;AAAA,IACF;AAEA,UAAM,WAAW,iBACd,IAAI,CAAC,UAAU,MAAM,EAAE,EACvB,KAAK,CAAC,MAAM,UAAU,KAAK,cAAc,KAAK,CAAC;AAElD,WAAO;AAAA,MACLA;AAAA,QACE;AAAA,QACA;AAAA,QACA,yDAAyD,SAAS,KAAK,IAAI,CAAC;AAAA,QAC5E,iBAAiB,CAAC,EAAE;AAAA,MACtB;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAASG,kBAAiB,QAA6B;AACrD,MAAI,OAAO,WAAW,GAAG;AACvB,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,OAAO,IAAI,CAAC,WAAW;AAAA,MACrB,UAAU,MAAM;AAAA,MAChB,MAAM,MAAM;AAAA,MACZ,MAAM,MAAM,QAAQ;AAAA,MACpB,SAAS,MAAM;AAAA,IACjB,EAAE;AAAA,IACF;AAAA,MACE,EAAE,KAAK,YAAY,OAAO,WAAW;AAAA,MACrC,EAAE,KAAK,QAAQ,OAAO,OAAO;AAAA,MAC7B,EAAE,KAAK,QAAQ,OAAO,OAAO;AAAA,MAC7B,EAAE,KAAK,WAAW,OAAO,UAAU;AAAA,IACrC;AAAA,EACF;AACF;AAEA,SAAS,gBAAgB,QAAiD;AACxE,SAAO,UAAU;AAAA,IACf,cAAc,OAAO;AAAA,IACrB,QAAQ,OAAO;AAAA,IACf,QAAQ,OAAO,OAAO,IAAI,CAAC,WAAW;AAAA,MACpC,IAAI,MAAM;AAAA,MACV,MAAM,MAAM;AAAA,MACZ,qBAAqB,MAAM;AAAA,IAC7B,EAAE;AAAA,IACF,SAAS,OAAO;AAAA,EAClB,CAAC;AACH;AAEA,eAAsB,UACpB,UAA4B,CAAC,GACH;AAC1B,QAAM,UAAU,QAAQ,WAAWC,SAAQ;AAC3C,QAAM,gBAAgB,oBAAoB,OAAO;AACjD,QAAM,eAAe,QAAQ,gBAAgB,cAAc;AAC3D,QAAM,CAAC,UAAU,QAAQ,MAAM,IAAI,MAAM,QAAQ,IAAI;AAAA,IACnD,aAAa,YAAY;AAAA,IACzB,eAAe,YAAY;AAAA,IAC3B,eAAe;AAAA,MACb;AAAA,MACA;AAAA,MACA,UAAU,QAAQ;AAAA,IACpB,CAAC;AAAA,EACH,CAAC;AAED,QAAM,UAA+B,CAAC;AACtC,QAAM,SAAsB,CAAC;AAE7B,aAAW,SAAS,QAAQ;AAC1B,UAAM,eAAsC,MAAM,gBAAgB,OAAO,YAAY;AACrF,YAAQ,KAAK,GAAG,aAAa,OAAO;AACpC,WAAO,KAAK,GAAG,aAAa,MAAM;AAAA,EACpC;AAEA,QAAM,4BAA4B,SAAS,MAAM;AACjD,QAAM,6BAA6B,UAAU,MAAM;AACnD,gCAA8B,QAAQ,MAAM;AAE5C,QAAM,gBAAgB,CAAC,GAAG,MAAM,EAAE,KAAK,CAAC,MAAM,UAAU;AACtD,UAAM,UAAU,GAAG,KAAK,QAAQ,IAAI,KAAK,IAAI,IAAI,KAAK,QAAQ,EAAE,IAAI,KAAK,OAAO;AAChF,UAAM,WAAW,GAAG,MAAM,QAAQ,IAAI,MAAM,IAAI,IAAI,MAAM,QAAQ,EAAE,IAAI,MAAM,OAAO;AACrF,WAAO,QAAQ,cAAc,QAAQ;AAAA,EACvC,CAAC;AAED,QAAM,sBAAsB;AAAA,IAC1B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,EACV;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,QACE,QAAQ,SAAS,OACb,gBAAgB,mBAAmB,IACnCD,kBAAiB,aAAa;AAAA,EACtC;AACF;;;AQ5NA,YAAYE,UAAQ;AACpB,SAAS,WAAAC,gBAAe;AACxB,SAAS,QAAAC,OAAM,WAAAC,gBAAe;;;ACF9B,YAAYC,UAAQ;AACpB,SAAS,WAAAC,UAAS,QAAAC,OAAM,WAAAC,gBAAe;AAOvC,eAAe,gBAAgB,MAA6B;AAC1D,QAAM,QAAQ,MAAS,WAAM,IAAI;AACjC,MAAI,CAAC,MAAM,YAAY,GAAG;AACxB,UAAM,IAAI,MAAM,2BAA2B,IAAI,EAAE;AAAA,EACnD;AACF;AAEA,eAAe,kBAAkB,MAAc,OAA8B;AAC3E,QAAM,QAAQ,MAAS,WAAM,IAAI;AACjC,MAAI,CAAC,MAAM,OAAO,GAAG;AACnB,UAAM,IAAI,MAAM,YAAY,KAAK,4BAA4B,IAAI,EAAE;AAAA,EACrE;AACF;AAEA,eAAe,yBAAyB,MAA6B;AACnE,MAAI;AACF,UAAS,WAAM,IAAI;AACnB,UAAM,IAAI,MAAM,0CAA0C,IAAI,EAAE;AAAA,EAClE,SAAS,OAAO;AACd,QAAK,MAAgC,SAAS,UAAU;AACtD,YAAM;AAAA,IACR;AAAA,EACF;AACF;AAEA,eAAe,sBAAsB,YAAoB,YAAmC;AAC1F,QAAS,WAAM,YAAY,EAAE,WAAW,KAAK,CAAC;AAC9C,QAAM,UAAU,MAAS,aAAQ,YAAY,EAAE,eAAe,KAAK,CAAC;AAEpE,aAAW,SAAS,SAAS;AAC3B,UAAM,kBAAkBC,MAAK,YAAY,MAAM,IAAI;AACnD,UAAM,kBAAkBA,MAAK,YAAY,MAAM,IAAI;AACnD,UAAM,aAAa,MAAS,WAAM,eAAe;AAEjD,QAAI,WAAW,eAAe,GAAG;AAC/B,YAAM,IAAI,MAAM,sCAAsC,eAAe,EAAE;AAAA,IACzE;AAEA,QAAI,WAAW,YAAY,GAAG;AAC5B,YAAM,sBAAsB,iBAAiB,eAAe;AAC5D;AAAA,IACF;AAEA,QAAI,WAAW,OAAO,GAAG;AACvB,YAAS,WAAMC,SAAQ,eAAe,GAAG,EAAE,WAAW,KAAK,CAAC;AAC5D,YAAS,cAAS,iBAAiB,eAAe;AAClD;AAAA,IACF;AAEA,UAAM,IAAI,MAAM,mCAAmC,eAAe,EAAE;AAAA,EACtE;AACF;AAEA,eAAsB,wBAAwB,YAAmC;AAC/E,QAAM,qBAAqBC,SAAQ,UAAU;AAC7C,QAAM,gBAAgBF,MAAK,oBAAoB,UAAU;AAEzD,QAAM,yBAAyB,oBAAoB,EAAE,aAAa,KAAK,CAAC;AACxE,QAAM,gBAAgB,kBAAkB;AAExC,MAAI;AACF,UAAM,kBAAkB,eAAe,UAAU;AAAA,EACnD,SAAS,OAAO;AACd,QAAK,MAAgC,SAAS,UAAU;AACtD,YAAM,IAAI,MAAM,sBAAsB,kBAAkB,0BAA0B;AAAA,IACpF;AAEA,UAAM;AAAA,EACR;AACF;AAEA,eAAsB,gCACpB,YACA,YACe;AACf,QAAM,qBAAqBE,SAAQ,UAAU;AAC7C,QAAM,qBAAqBA,SAAQ,UAAU;AAE7C,MAAI,cAAc,oBAAoB,kBAAkB,GAAG;AACzD,UAAM,IAAI,MAAM,qCAAqC;AAAA,EACvD;AAEA,MAAI,aAAa,oBAAoB,kBAAkB,GAAG;AACxD,UAAM,IAAI,MAAM,uDAAuD;AAAA,EACzE;AAEA,QAAM,wBAAwB,kBAAkB;AAChD,QAAM,yBAAyB,kBAAkB;AACjD,QAAM,yBAAyB,kBAAkB;AACjD,QAAM,sBAAsB,oBAAoB,kBAAkB;AACpE;;;AClGA,YAAYC,UAAQ;AACpB,SAAS,WAAAC,UAAS,WAAAC,gBAAe;AAOjC,IAAM,oBAAoB,QAAQ,aAAa,UAAU,aAAa;AAEtE,eAAsB,kBACpB,UACA,YACe;AACf,QAAM,mBAAmBC,SAAQ,QAAQ;AACzC,QAAM,qBAAqBA,SAAQ,UAAU;AAE7C,QAAM,yBAAyB,gBAAgB;AAC/C,QAAM,yBAAyB,oBAAoB,EAAE,aAAa,KAAK,CAAC;AACxE,QAAS,WAAMC,SAAQ,gBAAgB,GAAG,EAAE,WAAW,KAAK,CAAC;AAE7D,MAAI;AACF,UAAM,gBAAgB,MAAS,WAAM,gBAAgB;AAErD,QAAI,CAAC,cAAc,eAAe,GAAG;AACnC,YAAM,IAAI,MAAM,yCAAyC,gBAAgB,EAAE;AAAA,IAC7E;AAEA,UAAM,oBAAoB,MAAS,cAAS,gBAAgB;AAC5D,QAAI,cAAc,mBAAmB,kBAAkB,GAAG;AACxD;AAAA,IACF;AAEA,UAAM,IAAI,MAAM,+BAA+B,gBAAgB,EAAE;AAAA,EACnE,SAAS,OAAO;AACd,QACG,MAAgC,SAAS,YACzC,MACE,WAAM,gBAAgB,EACtB,KAAK,CAAC,UAAU,MAAM,eAAe,CAAC,EACtC,MAAM,MAAM,KAAK,GACpB;AACA,YAAS,QAAG,kBAAkB,EAAE,WAAW,MAAM,OAAO,MAAM,CAAC;AAAA,IACjE,WAAY,MAAgC,SAAS,UAAU;AAC7D,YAAM;AAAA,IACR;AAAA,EACF;AAEA,QAAS,aAAQ,oBAAoB,kBAAkB,iBAAiB;AAC1E;AAEA,eAAsB,uBACpB,UACA,YACkB;AAClB,MAAI;AACF,UAAM,QAAQ,MAAS,WAAM,QAAQ;AACrC,QAAI,CAAC,MAAM,eAAe,GAAG;AAC3B,aAAO;AAAA,IACT;AAEA,UAAM,qBAAqB,MAAS,cAAS,QAAQ;AACrD,WAAO,cAAc,oBAAoB,UAAU;AAAA,EACrD,SAAS,OAAO;AACd,QAAK,MAAgC,SAAS,UAAU;AACtD,aAAO;AAAA,IACT;AAEA,UAAM;AAAA,EACR;AACF;;;ACtEA,YAAYC,UAAQ;AAEpB,eAAsB,eAAe,MAAgC;AACnE,MAAI;AACF,UAAM,QAAQ,MAAS,WAAM,IAAI;AAEjC,QAAI,CAAC,MAAM,eAAe,GAAG;AAC3B,aAAO;AAAA,IACT;AAEA,UAAS,QAAG,MAAM,EAAE,WAAW,MAAM,OAAO,MAAM,CAAC;AACnD,WAAO;AAAA,EACT,SAAS,OAAO;AACd,QAAK,MAAgC,SAAS,UAAU;AACtD,aAAO;AAAA,IACT;AAEA,UAAM;AAAA,EACR;AACF;;;AHsBA,SAAS,iBAAiB,OAAwB,WAAgC;AAChF,SAAO;AAAA,IACL,IAAI,MAAM;AAAA,IACV,MAAM,MAAM;AAAA,IACZ,MAAM,MAAM;AAAA,IACZ,WAAW,MAAM;AAAA,IACjB,WAAW,MAAM,UAAU,MAAM;AAAA,IACjC,YAAY,MAAM,SAAS,YAAY;AAAA,EACzC;AACF;AAEA,SAAS,sBACP,SACA,SACA,UACA,WACkB;AAClB,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO;AAAA,IACP,WAAW;AAAA,EACb;AACF;AAEA,SAAS,iBACP,UACA,YACM;AACN,QAAM,QAAQ,SAAS,YAAY;AAAA,IACjC,CAAC,UACC,MAAM,YAAY,WAAW,WAAW,MAAM,YAAY,WAAW;AAAA,EACzE;AAEA,MAAI,UAAU,IAAI;AAChB,aAAS,YAAY,KAAK,UAAU;AACpC;AAAA,EACF;AAEA,WAAS,YAAY,KAAK,IAAI;AAChC;AAEA,SAAS,sBAAsB,cAAsB,SAAyB;AAC5E,SAAOC,SAAQ,cAAc,UAAU,OAAO;AAChD;AAEA,eAAe,qBACb,UACA,cACA,SACA,WACA,UACA,WACkE;AAClE,MAAI;AACF,UAAM,QAAQ,MAAS,WAAM,QAAQ;AAErC,QAAI,CAAC,MAAM,eAAe,GAAG;AAC3B,aAAO;AAAA,IACT;AAAA,EACF,SAAS,OAAO;AACd,QAAK,MAAgC,SAAS,UAAU;AACtD,aAAO;AAAA,IACT;AAEA,UAAM;AAAA,EACR;AAEA,QAAM,aAAa,MAAS,cAAS,QAAQ;AAC7C,QAAM,wBAAwB,UAAU;AAExC,QAAM,mBAAmB,sBAAsB,cAAc,OAAO;AACpE,QAAM,gCAAgC,YAAY,gBAAgB;AAElE,QAAM,QAAsB;AAAA,IAC1B,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,IACR;AAAA,IACA,YAAY;AAAA,EACd;AAEA,WAAS,OAAO,OAAO,IAAI;AAC3B,SAAO,EAAE,OAAO,WAAW;AAC7B;AAEA,eAAe,mBACb,SACA,cACA,WAC0B;AAC1B,QAAM,UAAU,YAAY,SAAS;AACrC,QAAM,SAAS,MAAM,eAAe,EAAE,SAAS,aAAa,CAAC;AAC7D,QAAM,QAAQ,OAAO,KAAK,CAAC,UAAU,MAAM,OAAO,OAAO;AAEzD,MAAI,UAAU,QAAW;AACvB,UAAM,IAAI,MAAM,kBAAkB,SAAS,EAAE;AAAA,EAC/C;AAEA,MAAI,CAAC,MAAM,qBAAqB;AAC9B,UAAM,IAAI,MAAM,SAAS,MAAM,EAAE,wBAAwB,QAAQ,QAAQ,EAAE;AAAA,EAC7E;AAEA,SAAO;AACT;AAEA,eAAeC,YAAW,MAAgC;AACxD,MAAI;AACF,UAAS,WAAM,IAAI;AACnB,WAAO;AAAA,EACT,SAAS,OAAO;AACd,QAAK,MAAgC,SAAS,UAAU;AACtD,aAAO;AAAA,IACT;AAEA,UAAM;AAAA,EACR;AACF;AAEA,eAAsB,WACpB,SAC2B;AAC3B,QAAM,UAAU,QAAQ,WAAWC,SAAQ;AAC3C,QAAM,EAAE,cAAc,oBAAoB,IAAI,oBAAoB,OAAO;AACzE,QAAM,eAAe,QAAQ,gBAAgB;AAC7C,QAAM,aAAa,QAAQ,OAAO,oBAAI,KAAK,GAAG,YAAY;AAC1D,QAAM,WAAW,MAAM,aAAa,YAAY;AAChD,QAAM,UAAU,YAAY,QAAQ,KAAK;AACzC,QAAM,QAAQ,MAAM,mBAAmB,SAAS,cAAc,QAAQ,KAAK;AAC3E,QAAM,WAAWC,MAAK,MAAM,6BAA6B,OAAO;AAChE,QAAM,WAAW,SAAS,OAAO,OAAO,IACpC,SACA,MAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,EACF;AACJ,QAAM,QAAQ,SAAS,OAAO,OAAO,KAAK,UAAU;AAEpD,MAAI,UAAU,QAAW;AACvB,UAAM,IAAI,MAAM,4BAA4B,OAAO,EAAE;AAAA,EACvD;AAEA,QAAM,oBAAoB,SAAS,YAAY;AAAA,IAC7C,CAAC,UAAU,MAAM,YAAY,MAAM,MAAM,MAAM,YAAY,MAAM;AAAA,EACnE;AACA,QAAM,qBAAqB,mBAAmB,YAAY;AAC1D,QAAM,cAAc,iBAAiB,OAAO,SAAS;AACrD,WAAS,OAAO,MAAM,EAAE,IAAI;AAE5B,QAAM,qBACJ,aAAa,SAAY,MAAM,eAAe,QAAQ,IAAI;AAE5D,QAAM,mBAAmB,aAAa,SAClC,MAAM,uBAAuB,oBAAoB,MAAM,IAAI,IAC3D;AACJ,MACE,aAAa,UACb,CAAC,oBACA,MAAMF,YAAW,kBAAkB,GACpC;AACA,UAAM,IAAI,MAAM,4CAA4C,QAAQ,EAAE;AAAA,EACxE;AAEA,QAAM,cAAc,qBAChB,OACA,mBACE,MAAM,eAAe,kBAAkB,IACvC;AAEN,MAAI,gBAAgB,SAAS,mBAAmB,UAAU,WAAW;AACnE,WAAO;AAAA,MACL,SAAS;AAAA,MACT;AAAA,MACA,OAAO;AAAA,MACP,YAAY,qBAAqB;AAAA,MACjC;AAAA,MACA,QAAQ,GAAG,MAAM,EAAE,4BAA4B,MAAM,EAAE;AAAA;AAAA,IACzD;AAAA,EACF;AAEA,QAAM,aAAa,sBAAsB,MAAM,IAAI,MAAM,IAAI,UAAU,SAAS;AAChF,mBAAiB,UAAU,UAAU;AACrC,QAAM,cAAc,cAAc,QAAQ;AAE1C,SAAO;AAAA,IACL,SAAS;AAAA,IACT;AAAA,IACA,OAAO;AAAA,IACP;AAAA,IACA;AAAA,IACA,QAAQ,YAAY,MAAM,EAAE,QAAQ,MAAM,EAAE;AAAA;AAAA,EAC9C;AACF;;;AIjPA,YAAYG,UAAQ;AACpB,SAAS,WAAAC,gBAAe;AACxB,SAAS,QAAAC,aAAY;AAkCrB,SAASC,kBAAiB,OAAwB,WAAgC;AAChF,SAAO;AAAA,IACL,IAAI,MAAM;AAAA,IACV,MAAM,MAAM;AAAA,IACZ,MAAM,MAAM;AAAA,IACZ,WAAW,MAAM;AAAA,IACjB,WAAW,MAAM;AAAA,IACjB,YAAY;AAAA,EACd;AACF;AAEA,SAASC,uBACP,SACA,SACA,UACA,WACA,OACkB;AAClB,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW;AAAA,EACb;AACF;AAEA,SAASC,kBACP,UACA,YACM;AACN,QAAM,QAAQ,SAAS,YAAY;AAAA,IACjC,CAAC,UACC,MAAM,YAAY,WAAW,WAAW,MAAM,YAAY,WAAW;AAAA,EACzE;AAEA,MAAI,UAAU,IAAI;AAChB,aAAS,YAAY,KAAK,UAAU;AACpC;AAAA,EACF;AAEA,WAAS,YAAY,KAAK,IAAI;AAChC;AAEA,eAAeC,oBACb,SACA,cACA,WAC0B;AAC1B,QAAM,UAAU,YAAY,SAAS;AACrC,QAAM,SAAS,MAAM,eAAe,EAAE,SAAS,aAAa,CAAC;AAC7D,QAAM,QAAQ,OAAO,KAAK,CAAC,UAAU,MAAM,OAAO,OAAO;AAEzD,MAAI,UAAU,QAAW;AACvB,UAAM,IAAI,MAAM,kBAAkB,SAAS,EAAE;AAAA,EAC/C;AAEA,MAAI,CAAC,MAAM,qBAAqB;AAC9B,UAAM,IAAI,MAAM,SAAS,MAAM,EAAE,wBAAwB,QAAQ,QAAQ,EAAE;AAAA,EAC7E;AAEA,SAAO;AACT;AAEA,eAAsB,UACpB,SAC0B;AAC1B,QAAM,UAAU,QAAQ,WAAWC,SAAQ;AAC3C,QAAM,EAAE,cAAc,oBAAoB,IAAI,oBAAoB,OAAO;AACzE,QAAM,eAAe,QAAQ,gBAAgB;AAC7C,QAAM,aAAa,QAAQ,OAAO,oBAAI,KAAK,GAAG,YAAY;AAC1D,QAAM,WAAW,MAAM,aAAa,YAAY;AAChD,QAAM,UAAU,YAAY,QAAQ,KAAK;AACzC,QAAM,QAAQ,SAAS,OAAO,OAAO;AAErC,MAAI,UAAU,QAAW;AACvB,UAAM,IAAI,MAAM,4BAA4B,OAAO,EAAE;AAAA,EACvD;AAEA,QAAM,QAAQ,MAAMD,oBAAmB,SAAS,cAAc,QAAQ,KAAK;AAC3E,QAAM,WAAWE,MAAK,MAAM,6BAA6B,MAAM,EAAE;AACjE,QAAM,oBAAoB,SAAS,YAAY;AAAA,IAC7C,CAAC,UAAU,MAAM,YAAY,MAAM,MAAM,MAAM,YAAY,MAAM;AAAA,EACnE;AACA,QAAM,cAAcL,kBAAiB,OAAO,SAAS;AAErD,WAAS,OAAO,MAAM,EAAE,IAAI;AAC5B,QAAS,WAAM,MAAM,6BAA6B,EAAE,WAAW,KAAK,CAAC;AAErE,QAAM,qBAAqB,MAAM,uBAAuB,UAAU,MAAM,IAAI;AAC5E,QAAM,2BACJ,mBAAmB,UAAU,aAAa,kBAAkB,aAAa;AAE3E,MAAI,sBAAsB,0BAA0B;AAClD,WAAO;AAAA,MACL,SAAS;AAAA,MACT;AAAA,MACA,OAAO;AAAA,MACP,YAAY;AAAA,MACZ;AAAA,MACA,QAAQ,GAAG,MAAM,EAAE,2BAA2B,MAAM,EAAE;AAAA;AAAA,IACxD;AAAA,EACF;AAEA,QAAM,kBAAkB,UAAU,MAAM,IAAI;AAE5C,QAAM,aAAaC;AAAA,IACjB,MAAM;AAAA,IACN,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,EAAAC,kBAAiB,UAAU,UAAU;AACrC,QAAM,cAAc,cAAc,QAAQ;AAE1C,SAAO;AAAA,IACL,SAAS;AAAA,IACT;AAAA,IACA,OAAO;AAAA,IACP;AAAA,IACA;AAAA,IACA,QAAQ,WAAW,MAAM,EAAE,QAAQ,MAAM,EAAE;AAAA;AAAA,EAC7C;AACF;;;AChKA,SAAS,WAAAI,gBAAe;AACxB,SAAS,WAAAC,gBAAe;AAyBxB,SAASC,uBAAsB,cAAsB,SAAyB;AAC5E,SAAOC,SAAQ,cAAc,UAAU,OAAO;AAChD;AAEA,eAAsB,UACpB,SAC0B;AAC1B,QAAM,UAAU,QAAQ,WAAWC,SAAQ;AAC3C,QAAM,gBAAgB,oBAAoB,OAAO;AACjD,QAAM,eAAe,QAAQ,gBAAgB,cAAc;AAC3D,QAAM,aAAaD,SAAQ,QAAQ,UAAU;AAC7C,QAAM,UAAU,YAAY,QAAQ,SAAS;AAC7C,QAAM,cAAc,QAAQ,OAAO,oBAAI,KAAK,GAAG,YAAY;AAC3D,QAAM,WAAW,MAAM,aAAa,YAAY;AAChD,QAAM,mBAAmBD,uBAAsB,cAAc,OAAO;AAEpE,QAAM,wBAAwB,UAAU;AAExC,MAAI,SAAS,OAAO,OAAO,MAAM,QAAW;AAC1C,UAAM,IAAI,MAAM,oCAAoC,OAAO,EAAE;AAAA,EAC/D;AAEA,QAAM,gCAAgC,YAAY,gBAAgB;AAElE,QAAM,QAAsB;AAAA,IAC1B,IAAI;AAAA,IACJ,MAAM,QAAQ;AAAA,IACd,MAAM;AAAA,IACN,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,IACR;AAAA,IACA;AAAA,EACF;AAEA,WAAS,OAAO,OAAO,IAAI;AAC3B,QAAM,cAAc,cAAc,QAAQ;AAE1C,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,QAAQ,YAAY,OAAO,OAAO,gBAAgB;AAAA;AAAA,EACpD;AACF;;;ACrEA,SAAS,WAAAG,gBAAe;;;ACEjB,SAAS,YAAY,OAA0B;AACpD,MAAI,MAAM,SAAS,QAAW;AAC5B,WAAO,IAAI,MAAM,QAAQ,KAAK,MAAM,IAAI,KAAK,MAAM,OAAO;AAAA,EAC5D;AAEA,SAAO,IAAI,MAAM,QAAQ,KAAK,MAAM,IAAI,MAAM,MAAM,IAAI,KAAK,MAAM,OAAO;AAC5E;;;AD0BA,SAASC,kBACP,OACA,WACA,gBACa;AACb,QAAM,aAAa,MAAM,SAAS,YAAY,gBAAgB,cAAc;AAE5E,SAAO;AAAA,IACL,IAAI,MAAM;AAAA,IACV,MAAM,MAAM;AAAA,IACZ,MAAM,MAAM;AAAA,IACZ,WAAW,MAAM;AAAA,IACjB,WAAW,MAAM,UAAU,MAAM;AAAA,IACjC;AAAA,EACF;AACF;AAEA,SAAS,gBAAgB,QAAuC,MAAuB;AACrF,MAAI,MAAM;AACR,WAAO,UAAU;AAAA,MACf,UAAU,OAAO,SAAS;AAAA,MAC1B,QAAQ,OAAO,OAAO,IAAI,CAAC,WAAW;AAAA,QACpC,IAAI,MAAM;AAAA,QACV,MAAM,MAAM;AAAA,QACZ,MAAM,MAAM;AAAA,QACZ,QAAQ,MAAM;AAAA,QACd,qBAAqB,MAAM;AAAA,MAC7B,EAAE;AAAA,MACF,SAAS,OAAO;AAAA,IAClB,CAAC;AAAA,EACH;AAEA,MAAI,OAAO,QAAQ,WAAW,GAAG;AAC/B,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ;AAAA,IACZ,OAAO,QAAQ,IAAI,CAAC,WAAW;AAAA,MAC7B,OAAO,MAAM;AAAA,MACb,OAAO,MAAM;AAAA,MACb,MAAM,MAAM;AAAA,MACZ,MAAM,MAAM;AAAA,IACd,EAAE;AAAA,IACF;AAAA,MACE,EAAE,KAAK,SAAS,OAAO,QAAQ;AAAA,MAC/B,EAAE,KAAK,SAAS,OAAO,QAAQ;AAAA,MAC/B,EAAE,KAAK,QAAQ,OAAO,OAAO;AAAA,MAC7B,EAAE,KAAK,QAAQ,OAAO,OAAO;AAAA,IAC/B;AAAA,EACF;AAEA,MAAI,OAAO,OAAO,WAAW,GAAG;AAC9B,WAAO;AAAA,EACT;AAEA,SAAO,GAAG,KAAK;AAAA,EAAK,OAAO,OAAO,IAAI,WAAW,EAAE,KAAK,IAAI,CAAC;AAAA;AAC/D;AAEA,eAAsB,QAAQ,UAA0B,CAAC,GAA2B;AAClF,QAAM,UAAU,QAAQ,WAAWC,SAAQ;AAC3C,QAAM,gBAAgB,oBAAoB,OAAO;AACjD,QAAM,eAAe,QAAQ,gBAAgB,cAAc;AAC3D,QAAM,WAAW,MAAM,aAAa,YAAY;AAChD,QAAM,SAAS,MAAM,eAAe;AAAA,IAClC;AAAA,IACA,UAAU,QAAQ;AAAA,IAClB;AAAA,EACF,CAAC;AAED,QAAM,aAAa,QAAQ,OAAO,oBAAI,KAAK,GAAG,YAAY;AAC1D,QAAM,UAA+B,CAAC;AACtC,QAAM,SAAsB,CAAC;AAE7B,aAAW,SAAS,QAAQ;AAC1B,UAAM,eAAe,MAAM,gBAAgB,OAAO,YAAY;AAC9D,YAAQ,KAAK,GAAG,aAAa,OAAO;AACpC,WAAO,KAAK,GAAG,aAAa,MAAM;AAClC,aAAS,OAAO,MAAM,EAAE,IAAID;AAAA,MAC1B;AAAA,MACA;AAAA,MACA,SAAS,OAAO,MAAM,EAAE;AAAA,IAC1B;AAAA,EACF;AAEA,WAAS,WAAW;AAAA,IAClB,IAAI;AAAA,IACJ;AAAA,EACF;AAEA,QAAM,cAAc,cAAc,QAAQ;AAE1C,QAAM,sBAAsB;AAAA,IAC1B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,QAAQ,gBAAgB,qBAAqB,QAAQ,SAAS,IAAI;AAAA,EACpE;AACF;;;AEvHA,SAAS,iBAAiB,YAA2B;AACnD,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS,WAAW;AAAA,IACpB,QAAQ,WAAW;AAAA,EACrB;AACF;AAEA,SAAS,gBAAgB,YAA2B;AAClD,QAAM,SAAS,oBAAI,IAOjB;AAEF,aAAW,SAAS,WAAW,QAAQ;AACrC,WAAO,IAAI,MAAM,IAAI;AAAA,MACnB,SAAS,MAAM;AAAA,MACf,WAAW,MAAM;AAAA,MACjB,SAAS,CAAC;AAAA,IACZ,CAAC;AAAA,EACH;AAEA,aAAW,SAAS,WAAW,SAAS;AACtC,UAAM,UAAU,OAAO,IAAI,MAAM,OAAO,KAAK;AAAA,MAC3C,SAAS,MAAM;AAAA,MACf,WAAW,MAAM;AAAA,MACjB,SAAS,CAAC;AAAA,IACZ;AACA,YAAQ,QAAQ,KAAK,KAAK;AAC1B,WAAO,IAAI,MAAM,SAAS,OAAO;AAAA,EACnC;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ,CAAC,GAAG,OAAO,OAAO,CAAC,EAAE;AAAA,MAAK,CAAC,MAAM,UACvC,KAAK,QAAQ,cAAc,MAAM,OAAO;AAAA,IAC1C;AAAA,IACA,QAAQ,WAAW;AAAA,EACrB;AACF;AAEA,SAAS,gBAAgB,YAA2B;AAClD,QAAM,SAAS,oBAAI,IAMjB;AAEF,aAAW,SAAS,OAAO,OAAO,WAAW,SAAS,MAAM,GAAG;AAC7D,WAAO,IAAI,MAAM,IAAI;AAAA,MACnB,WAAW,MAAM;AAAA,MACjB,SAAS,CAAC;AAAA,IACZ,CAAC;AAAA,EACH;AAEA,aAAW,SAAS,WAAW,SAAS;AACtC,UAAM,UAAU,OAAO,IAAI,MAAM,SAAS,KAAK;AAAA,MAC7C,WAAW,MAAM;AAAA,MACjB,SAAS,CAAC;AAAA,IACZ;AACA,YAAQ,QAAQ,KAAK,KAAK;AAC1B,WAAO,IAAI,MAAM,WAAW,OAAO;AAAA,EACrC;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ,CAAC,GAAG,OAAO,OAAO,CAAC,EAAE;AAAA,MAAK,CAAC,MAAM,UACvC,KAAK,UAAU,cAAc,MAAM,SAAS;AAAA,IAC9C;AAAA,IACA,QAAQ,WAAW;AAAA,EACrB;AACF;AAEA,SAAS,cAAc,YAA2B,MAAyB;AACzE,MAAI,SAAS,UAAU;AACrB,WAAO,gBAAgB,UAAU;AAAA,EACnC;AAEA,MAAI,SAAS,UAAU;AACrB,WAAO,gBAAgB,UAAU;AAAA,EACnC;AAEA,SAAO,iBAAiB,UAAU;AACpC;AAEA,SAASE,kBAAiB,MAAe,MAAwB;AAC/D,MAAI,SAAS,UAAU;AACrB,UAAM,YAAa,KAAuF;AAC1G,WAAO;AAAA,MACL,UAAU,IAAI,CAAC,WAAW;AAAA,QACxB,OAAO,MAAM;AAAA,QACb,MAAM,MAAM;AAAA,QACZ,SAAS,OAAO,MAAM,QAAQ,MAAM;AAAA,MACtC,EAAE;AAAA,MACF;AAAA,QACE,EAAE,KAAK,SAAS,OAAO,QAAQ;AAAA,QAC/B,EAAE,KAAK,QAAQ,OAAO,OAAO;AAAA,QAC7B,EAAE,KAAK,WAAW,OAAO,UAAU;AAAA,MACrC;AAAA,IACF;AAAA,EACF;AAEA,MAAI,SAAS,UAAU;AACrB,UAAM,YAAa,KAAsE;AACzF,WAAO;AAAA,MACL,UAAU,IAAI,CAAC,WAAW;AAAA,QACxB,OAAO,MAAM;AAAA,QACb,SAAS,OAAO,MAAM,QAAQ,MAAM;AAAA,MACtC,EAAE;AAAA,MACF;AAAA,QACE,EAAE,KAAK,SAAS,OAAO,QAAQ;AAAA,QAC/B,EAAE,KAAK,WAAW,OAAO,UAAU;AAAA,MACrC;AAAA,IACF;AAAA,EACF;AAEA,QAAM,UAAW,KAAkF;AACnG,SAAO;AAAA,IACL,QAAQ,IAAI,CAAC,YAAY;AAAA,MACvB,OAAO,OAAO;AAAA,MACd,OAAO,OAAO;AAAA,MACd,MAAM,OAAO;AAAA,IACf,EAAE;AAAA,IACF;AAAA,MACE,EAAE,KAAK,SAAS,OAAO,QAAQ;AAAA,MAC/B,EAAE,KAAK,SAAS,OAAO,QAAQ;AAAA,MAC/B,EAAE,KAAK,QAAQ,OAAO,OAAO;AAAA,IAC/B;AAAA,EACF;AACF;AAEA,eAAsB,QAAQ,UAA0B,CAAC,GAA2B;AAClF,QAAM,OAAO,QAAQ,QAAQ;AAC7B,QAAM,SAAS,QAAQ,UAAU;AACjC,QAAM,aAAa,MAAM,QAAQ,OAAO;AACxC,QAAM,OAAO,cAAc,YAAY,IAAI;AAE3C,SAAO;AAAA,IACL;AAAA,IACA,QAAQ,WAAW,SAAS,UAAU,IAAI,IAAIA,kBAAiB,MAAM,IAAI;AAAA,EAC3E;AACF;;;A9BvJO,SAAS,WAAoB;AAClC,QAAM,UAAU,IAAI,QAAQ;AAC5B,UAAQ,KAAK,UAAU;AAEvB,UACG,QAAQ,MAAM,EACd,OAAO,UAAU,6BAA6B,EAC9C,OAAO,OAAO,YAAgC;AAC7C,UAAM,SAAS,MAAM,QAAQ,EAAE,MAAM,QAAQ,SAAS,KAAK,CAAC;AAC5D,YAAQ,OAAO,MAAM,OAAO,MAAM;AAAA,EACpC,CAAC;AAEH,UACG,QAAQ,QAAQ,EAChB,OAAO,UAAU,6BAA6B,EAC9C,OAAO,OAAO,YAAgC;AAC7C,UAAM,SAAS,MAAM,UAAU,EAAE,MAAM,QAAQ,SAAS,KAAK,CAAC;AAC9D,YAAQ,OAAO,MAAM,OAAO,MAAM;AAAA,EACpC,CAAC;AAEH,UACG,QAAQ,MAAM,EACd,OAAO,iBAAiB,0CAA0C,SAAS,EAC3E,OAAO,qBAAqB,+BAA+B,OAAO,EAClE,OAAO,OAAO,YAAmF;AAChG,UAAM,SAAS,MAAM,QAAQ;AAAA,MAC3B,MAAM,QAAQ;AAAA,MACd,QAAQ,QAAQ;AAAA,IAClB,CAAC;AACD,YAAQ,OAAO,MAAM,OAAO,MAAM;AAAA,EACpC,CAAC;AAEH,UACG,QAAQ,QAAQ,EAChB,eAAe,mBAAmB,8BAA8B,EAChE,eAAe,iBAAiB,oBAAoB,EACpD,OAAO,OAAO,YAA8C;AAC3D,UAAM,SAAS,MAAM,UAAU;AAAA,MAC7B,YAAY,QAAQ;AAAA,MACpB,WAAW,QAAQ;AAAA,IACrB,CAAC;AACD,YAAQ,OAAO,MAAM,OAAO,MAAM;AAAA,EACpC,CAAC;AAEH,UACG,QAAQ,QAAQ,EAChB,OAAO,UAAU,6BAA6B,EAC9C,OAAO,OAAO,YAAgC;AAC7C,UAAM,SAAS,MAAM,UAAU,EAAE,MAAM,QAAQ,SAAS,KAAK,CAAC;AAC9D,YAAQ,OAAO,MAAM,OAAO,MAAM;AAAA,EACpC,CAAC;AAEH,QAAM,gBAAgB,QAAQ,QAAQ,QAAQ;AAE9C,gBACG,OAAO,UAAU,6BAA6B,EAC9C,OAAO,OAAO,YAAgC;AAC7C,UAAM,SAAS,MAAM,UAAU,EAAE,MAAM,QAAQ,SAAS,KAAK,CAAC;AAC9D,YAAQ,OAAO,MAAM,OAAO,MAAM;AAAA,EACpC,CAAC;AAEH,gBACG,QAAQ,WAAW,EACnB,eAAe,aAAa,UAAU,EACtC,eAAe,iBAAiB,yBAAyB,EACzD,OAAO,mBAAmB,oDAAoD,QAAQ,EACtF,OAAO,iBAAiB,qBAAqB,EAC7C;AAAA,IACC;AAAA,IACA,uBAAuB,mBAAmB,KAAK,IAAI,CAAC;AAAA,IACpD,CAAC,OAAe,WAAqB,CAAC,MAAM,CAAC,GAAG,UAAU,KAAK;AAAA,IAC/D,CAAC;AAAA,EACH,EACC,OAAO,yBAAyB,+CAA+C,EAC/E,OAAO,UAAU,6BAA6B,EAC9C;AAAA,IACC,OAAO,YAQD;AACJ,YAAM,SAAS,MAAM,kBAAkB;AAAA,QACrC,IAAI,QAAQ;AAAA,QACZ,MAAM,QAAQ;AAAA,QACd,QAAQ,QAAQ;AAAA,QAChB,MAAM,QAAQ;AAAA,QACd,WAAW,QAAQ;AAAA,QACnB,mBAAmB,QAAQ,sBAAsB;AAAA,QACjD,MAAM,QAAQ,SAAS;AAAA,MACzB,CAAC;AACD,cAAQ,OAAO,MAAM,OAAO,MAAM;AAAA,IACpC;AAAA,EACF;AAEF,gBACG,QAAQ,cAAc,EACtB,eAAe,aAAa,UAAU,EACtC,OAAO,UAAU,6BAA6B,EAC9C,OAAO,OAAO,YAA4C;AACzD,UAAM,SAAS,MAAM,qBAAqB;AAAA,MACxC,IAAI,QAAQ;AAAA,MACZ,MAAM,QAAQ,SAAS;AAAA,IACzB,CAAC;AACD,YAAQ,OAAO,MAAM,OAAO,MAAM;AAAA,EACpC,CAAC;AAEH,UACG,QAAQ,QAAQ,EAChB,eAAe,mBAAmB,0BAA0B,EAC5D,eAAe,mBAAmB,iBAAiB,EACnD,OAAO,OAAO,YAA8C;AAC3D,UAAM,SAAS,MAAM,UAAU;AAAA,MAC7B,OAAO,QAAQ;AAAA,MACf,OAAO,QAAQ;AAAA,IACjB,CAAC;AACD,YAAQ,OAAO,MAAM,OAAO,MAAM;AAAA,EACpC,CAAC;AAEH,UACG,QAAQ,SAAS,EACjB,eAAe,mBAAmB,0BAA0B,EAC5D,eAAe,mBAAmB,iBAAiB,EACnD,OAAO,OAAO,YAA8C;AAC3D,UAAM,SAAS,MAAM,WAAW;AAAA,MAC9B,OAAO,QAAQ;AAAA,MACf,OAAO,QAAQ;AAAA,IACjB,CAAC;AACD,YAAQ,OAAO,MAAM,OAAO,MAAM;AAAA,EACpC,CAAC;AAEH,SAAO;AACT;","names":["fs","join","resolve","resolve","join","homedir","fs","buildTableOutput","homedir","homedir","normalizeAgentId","buildTableOutput","homedir","homedir","buildTableOutput","homedir","fs","homedir","join","fs","fs","resolve","fs","resolve","resolve","fs","join","resolve","z","z","fs","join","getManifestPath","join","resolve","formatValidationIssues","buildIssue","pathExists","join","buildTableOutput","homedir","fs","homedir","join","resolve","fs","dirname","join","resolve","join","dirname","resolve","fs","dirname","resolve","resolve","dirname","fs","resolve","pathExists","homedir","join","fs","homedir","join","buildAgentRecord","buildActivationRecord","upsertActivation","resolveTargetAgent","homedir","join","resolve","homedir","buildManagedSkillPath","resolve","homedir","homedir","buildAgentRecord","homedir","buildTableOutput"]}
1
+ {"version":3,"sources":["../src/index.ts","../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/load-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/agents.ts","../src/output/print-table.ts","../src/commands/config-add-agent.ts","../src/config/agent-override-validation.ts","../src/config/write-user-config.ts","../src/commands/config-remove-agent.ts","../src/commands/config-update-agent.ts","../src/commands/config.ts","../src/commands/doctor.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/list.ts","../src/commands/remove.ts"],"sourcesContent":["import { Command } from \"commander\";\r\nimport { supportedPlatforms } from \"./config/default-agent-rules\";\r\nimport { runAdopt } from \"./commands/adopt\";\r\nimport { runAgents } from \"./commands/agents\";\r\nimport { runConfigAddAgent } from \"./commands/config-add-agent\";\r\nimport { runConfigRemoveAgent } from \"./commands/config-remove-agent\";\r\nimport { runConfigUpdateAgent } from \"./commands/config-update-agent\";\r\nimport { runConfig } from \"./commands/config\";\r\nimport { runDoctor } from \"./commands/doctor\";\r\nimport { runDisable } from \"./commands/disable\";\r\nimport { runEnable } from \"./commands/enable\";\r\nimport { runImport } from \"./commands/import\";\r\nimport { runList } from \"./commands/list\";\r\nimport { runRemove } from \"./commands/remove\";\r\nimport { runScan } from \"./commands/scan\";\r\n\r\nfunction collectValues(value: string, previous: string[] = []): string[] {\r\n return [...previous, value];\r\n}\r\n\r\nfunction requireSingleValue(values: string[], label: string): string {\r\n if (values.length !== 1) {\r\n throw new Error(`Expected exactly one ${label}`);\r\n }\r\n\r\n return values[0] as string;\r\n}\r\n\r\nfunction requireAtLeastOneValue(values: string[], label: string): string[] {\r\n if (values.length === 0) {\r\n throw new Error(`Expected at least one ${label}`);\r\n }\r\n\r\n return values;\r\n}\r\n\r\nexport function buildCli(): Command {\r\n const program = new Command();\r\n program.name(\"skillmux\");\r\n\r\n program\r\n .command(\"adopt\")\r\n .requiredOption(\"--agent <agent>\", \"Source agent id\")\r\n .option(\"--skill <skill>\", \"Repeatable installed skill to adopt\", collectValues, [])\r\n .option(\"--json\", \"Emit structured JSON output\")\r\n .action(async (options: { agent: string; skill: string[]; json?: boolean }) => {\r\n const result = options.skill.length === 0\r\n ? await runAdopt({\r\n agent: options.agent,\r\n json: options.json === true\r\n })\r\n : options.skill.length === 1\r\n ? await runAdopt({\r\n agent: options.agent,\r\n skill: options.skill[0] as string,\r\n json: options.json === true\r\n })\r\n : await runAdopt({\r\n agent: options.agent,\r\n skills: options.skill,\r\n json: options.json === true\r\n });\r\n process.stdout.write(result.output);\r\n });\r\n\r\n program\r\n .command(\"scan\")\r\n .option(\"--json\", \"Emit structured JSON output\")\r\n .action(async (options: { json?: boolean }) => {\r\n const result = await runScan({ json: options.json === true });\r\n process.stdout.write(result.output);\r\n });\r\n\r\n program\r\n .command(\"agents\")\r\n .option(\"--json\", \"Emit structured JSON output\")\r\n .action(async (options: { json?: boolean }) => {\r\n const result = await runAgents({ json: options.json === true });\r\n process.stdout.write(result.output);\r\n });\r\n\r\n program\r\n .command(\"list\")\r\n .option(\"--view <view>\", \"Select records, agents, or skills view\", \"records\")\r\n .option(\"--format <format>\", \"Select table or json output\", \"table\")\r\n .action(async (options: { view?: \"records\" | \"agents\" | \"skills\"; format?: \"table\" | \"json\" }) => {\r\n const result = await runList({\r\n view: options.view,\r\n format: options.format\r\n });\r\n process.stdout.write(result.output);\r\n });\r\n\r\n program\r\n .command(\"import\")\r\n .requiredOption(\"--source <path>\", \"Local skill source directory\")\r\n .requiredOption(\"--name <name>\", \"Managed skill name\")\r\n .action(async (options: { source: string; name: string }) => {\r\n const result = await runImport({\r\n sourcePath: options.source,\r\n skillName: options.name\r\n });\r\n process.stdout.write(result.output);\r\n });\r\n\r\n program\r\n .command(\"doctor\")\r\n .option(\"--json\", \"Emit structured JSON output\")\r\n .action(async (options: { json?: boolean }) => {\r\n const result = await runDoctor({ json: options.json === true });\r\n process.stdout.write(result.output);\r\n });\r\n\r\n const configCommand = program.command(\"config\");\r\n\r\n configCommand\r\n .option(\"--json\", \"Emit structured JSON output\")\r\n .action(async (options: { json?: boolean }) => {\r\n const result = await runConfig({ json: options.json === true });\r\n process.stdout.write(result.output);\r\n });\r\n\r\n configCommand\r\n .command(\"add-agent\")\r\n .requiredOption(\"--id <id>\", \"Agent id\")\r\n .requiredOption(\"--root <path>\", \"Home-relative root path\")\r\n .option(\"--skills <path>\", \"Skills directory path relative to the agent root\", \"skills\")\r\n .option(\"--name <name>\", \"Stable display name\")\r\n .option(\r\n \"--platform <platform>\",\r\n `Supported platform (${supportedPlatforms.join(\", \")})`,\r\n (value: string, previous: string[] = []) => [...previous, value],\r\n []\r\n )\r\n .option(\"--disabled-by-default\", \"Mark this custom agent as disabled by default\")\r\n .option(\"--json\", \"Emit structured JSON output\")\r\n .action(\r\n async (options: {\r\n id: string;\r\n root: string;\r\n skills?: string;\r\n name?: string;\r\n platform?: string[];\r\n disabledByDefault?: boolean;\r\n json?: boolean;\r\n }) => {\r\n const result = await runConfigAddAgent({\r\n id: options.id,\r\n root: options.root,\r\n skills: options.skills,\r\n name: options.name,\r\n platforms: options.platform,\r\n disabledByDefault: options.disabledByDefault === true,\r\n json: options.json === true\r\n });\r\n process.stdout.write(result.output);\r\n }\r\n );\r\n\r\n configCommand\r\n .command(\"remove-agent\")\r\n .requiredOption(\"--id <id>\", \"Agent id\")\r\n .option(\"--json\", \"Emit structured JSON output\")\r\n .action(async (options: { id: string; json?: boolean }) => {\r\n const result = await runConfigRemoveAgent({\r\n id: options.id,\r\n json: options.json === true\r\n });\r\n process.stdout.write(result.output);\r\n });\r\n\r\n configCommand\r\n .command(\"update-agent\")\r\n .requiredOption(\"--id <id>\", \"Agent id\")\r\n .option(\"--root <path>\", \"Home-relative root path\")\r\n .option(\"--skills <path>\", \"Skills directory path relative to the agent root\")\r\n .option(\"--name <name>\", \"Stable display name\")\r\n .option(\r\n \"--platform <platform>\",\r\n `Supported platform (${supportedPlatforms.join(\", \")})`,\r\n (value: string, previous: string[] = []) => [...previous, value],\r\n []\r\n )\r\n .option(\"--enabled-by-default\", \"Mark this custom agent as enabled by default\")\r\n .option(\"--disabled-by-default\", \"Mark this custom agent as disabled by default\")\r\n .option(\"--json\", \"Emit structured JSON output\")\r\n .action(\r\n async (options: {\r\n id: string;\r\n root?: string;\r\n skills?: string;\r\n name?: string;\r\n platform?: string[];\r\n enabledByDefault?: boolean;\r\n disabledByDefault?: boolean;\r\n json?: boolean;\r\n }) => {\r\n const result = await runConfigUpdateAgent({\r\n id: options.id,\r\n root: options.root,\r\n skills: options.skills,\r\n name: options.name,\r\n platforms:\r\n options.platform !== undefined && options.platform.length > 0\r\n ? options.platform\r\n : undefined,\r\n enabledByDefault:\r\n options.enabledByDefault === true ? true : undefined,\r\n disabledByDefault: options.disabledByDefault === true,\r\n json: options.json === true\r\n });\r\n process.stdout.write(result.output);\r\n }\r\n );\r\n\r\n program\r\n .command(\"enable\")\r\n .requiredOption(\"--skill <skill>\", \"Managed skill name or id\", collectValues, [])\r\n .requiredOption(\"--agent <agent>\", \"Repeatable target agent\", collectValues, [])\r\n .action(async (options: { skill: string[]; agent: string[] }) => {\r\n const result = await runEnable({\r\n skill: requireSingleValue(options.skill, \"skill\"),\r\n agents: requireAtLeastOneValue(options.agent, \"agent\")\r\n });\r\n process.stdout.write(result.output);\r\n });\r\n\r\n program\r\n .command(\"disable\")\r\n .requiredOption(\"--skill <skill>\", \"Managed skill name or id\", collectValues, [])\r\n .requiredOption(\"--agent <agent>\", \"Repeatable target agent\", collectValues, [])\r\n .action(async (options: { skill: string[]; agent: string[] }) => {\r\n const result = await runDisable({\r\n skill: requireSingleValue(options.skill, \"skill\"),\r\n agents: requireAtLeastOneValue(options.agent, \"agent\")\r\n });\r\n process.stdout.write(result.output);\r\n });\r\n\r\n program\r\n .command(\"remove\")\r\n .requiredOption(\"--skill <skill>\", \"Repeatable managed skill name or id\", collectValues, [])\r\n .option(\"--json\", \"Emit structured JSON output\")\r\n .action(async (options: { skill: string[]; json?: boolean }) => {\r\n const skills = requireAtLeastOneValue(options.skill, \"skill\");\r\n const result = skills.length === 1\r\n ? await runRemove({\r\n skill: skills[0] as string,\r\n json: options.json === true\r\n })\r\n : await runRemove({\r\n skills,\r\n json: options.json === true\r\n });\r\n process.stdout.write(result.output);\r\n });\r\n\r\n return program;\r\n}\r\n","export const supportedPlatforms = [\"win32\", \"linux\", \"darwin\"] as const;\n\nexport type SupportedPlatform = (typeof supportedPlatforms)[number];\n\nexport const builtInAgentIds = [\n \"codex\",\n \"claude\",\n \"gemini\",\n \"agents\",\n \"openclaw\"\n] as const;\n\nexport type BuiltInAgentId = (typeof builtInAgentIds)[number];\n\nexport type AgentRule = {\n id: string;\n stableName: string;\n supportedPlatforms: SupportedPlatform[];\n homeRelativeRootPath: string;\n skillsDirectoryPath: string;\n enabledByDefault: boolean;\n discovery: \"builtin\" | \"custom\";\n};\n\nexport const defaultAgentRules: AgentRule[] = [\n {\n id: \"codex\",\n stableName: \"OpenAI Codex\",\n supportedPlatforms: [...supportedPlatforms],\n homeRelativeRootPath: \".codex\",\n skillsDirectoryPath: \"skills\",\n enabledByDefault: true,\n discovery: \"builtin\"\n },\n {\n id: \"claude\",\n stableName: \"Claude Code\",\n supportedPlatforms: [...supportedPlatforms],\n homeRelativeRootPath: \".claude\",\n skillsDirectoryPath: \"skills\",\n enabledByDefault: true,\n discovery: \"builtin\"\n },\n {\n id: \"gemini\",\n stableName: \"Gemini CLI\",\n supportedPlatforms: [...supportedPlatforms],\n homeRelativeRootPath: \".gemini\",\n skillsDirectoryPath: \"skills\",\n enabledByDefault: true,\n discovery: \"builtin\"\n },\n {\n id: \"agents\",\n stableName: \"Agents\",\n supportedPlatforms: [...supportedPlatforms],\n homeRelativeRootPath: \".agents\",\n skillsDirectoryPath: \"skills\",\n enabledByDefault: true,\n discovery: \"builtin\"\n },\n {\n id: \"openclaw\",\n stableName: \"OpenClaw\",\n supportedPlatforms: [...supportedPlatforms],\n homeRelativeRootPath: \".openclaw\",\n skillsDirectoryPath: \"skills\",\n enabledByDefault: true,\n discovery: \"builtin\"\n }\n];\n\nexport const defaultAgentRuleMap = Object.fromEntries(\n defaultAgentRules.map((rule) => [rule.id, rule])\n) as Record<BuiltInAgentId, AgentRule>;\n","import { 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 { loadUserConfig, type AgentOverride } from \"../config/load-user-config\";\nimport { resolveSkillmuxHome } from \"../config/resolve-skillmux-home\";\n\nexport type DiscoveredAgent = AgentRule & {\n absoluteRootPath: string;\n absoluteSkillsDirectoryPath: string;\n exists: boolean;\n supportedOnPlatform: boolean;\n};\n\nexport type DiscoverAgentsOptions = {\n homeDir: string;\n platform?: NodeJS.Platform;\n skillmuxHome?: string;\n};\n\nfunction mergeRule(rule: AgentRule, override?: AgentOverride): AgentRule {\n if (override === undefined) {\n return rule;\n }\n\n return {\n ...rule,\n ...override\n };\n}\n\nfunction buildCustomRule(id: string, override: AgentOverride): AgentRule {\n if (\n override.homeRelativeRootPath === undefined ||\n override.skillsDirectoryPath === undefined\n ) {\n throw new Error(\n `Custom agent override \"${id}\" must define homeRelativeRootPath and skillsDirectoryPath`\n );\n }\n\n return {\n id,\n stableName: override.stableName ?? id,\n supportedPlatforms: override.supportedPlatforms ?? [...supportedPlatforms],\n homeRelativeRootPath: override.homeRelativeRootPath,\n skillsDirectoryPath: override.skillsDirectoryPath,\n enabledByDefault: override.enabledByDefault ?? true,\n discovery: \"custom\"\n };\n}\n\nasync function pathExists(path: string): Promise<boolean> {\n try {\n await fs.access(path);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction resolveAgentRulePaths(homeDir: string, rule: AgentRule): {\n absoluteRootPath: string;\n absoluteSkillsDirectoryPath: string;\n} {\n const absoluteRootPath = resolve(homeDir, rule.homeRelativeRootPath);\n\n return {\n absoluteRootPath,\n absoluteSkillsDirectoryPath: join(\n absoluteRootPath,\n rule.skillsDirectoryPath\n )\n };\n}\n\nexport async function discoverAgents(\n options: DiscoverAgentsOptions\n): Promise<DiscoveredAgent[]> {\n const platform = options.platform ?? process.platform;\n const homeDir = resolve(options.homeDir);\n const skillmuxHome =\n options.skillmuxHome ?? resolveSkillmuxHome(homeDir).skillmuxHome;\n const userConfig = await loadUserConfig(skillmuxHome);\n\n const discoveredAgents: DiscoveredAgent[] = [];\n\n for (const agentId of builtInAgentIds) {\n const mergedRule = mergeRule(\n defaultAgentRuleMap[agentId as BuiltInAgentId],\n userConfig.agents[agentId]\n );\n const resolvedPaths = resolveAgentRulePaths(homeDir, mergedRule);\n\n discoveredAgents.push({\n ...mergedRule,\n ...resolvedPaths,\n exists: await pathExists(resolvedPaths.absoluteSkillsDirectoryPath),\n supportedOnPlatform: mergedRule.supportedPlatforms.some(\n (supportedPlatform) => supportedPlatform === platform\n )\n });\n }\n\n for (const [agentId, override] of Object.entries(userConfig.agents)) {\n if (Object.hasOwn(defaultAgentRuleMap, agentId)) {\n continue;\n }\n\n const customRule = buildCustomRule(agentId, override);\n const resolvedPaths = resolveAgentRulePaths(homeDir, customRule);\n\n discoveredAgents.push({\n ...customRule,\n ...resolvedPaths,\n exists: await pathExists(resolvedPaths.absoluteSkillsDirectoryPath),\n supportedOnPlatform: customRule.supportedPlatforms.some(\n (supportedPlatform) => supportedPlatform === platform\n )\n });\n }\n\n return discoveredAgents;\n}\n","import * as fs from \"node:fs/promises\";\r\nimport { z } from \"zod\";\r\nimport { UserConfigValidationError } from \"../core/errors\";\r\nimport {\r\n supportedPlatforms,\r\n type SupportedPlatform\r\n} from \"./default-agent-rules\";\r\nimport { buildConfigPath } from \"./resolve-skillmux-home\";\r\n\r\nconst supportedPlatformSchema = z.enum(supportedPlatforms);\r\n\r\nconst agentOverrideSchema = z\r\n .object({\r\n stableName: z.string().min(1).optional(),\r\n supportedPlatforms: z.array(supportedPlatformSchema).min(1).optional(),\r\n homeRelativeRootPath: z.string().min(1).optional(),\r\n skillsDirectoryPath: z.string().min(1).optional(),\r\n enabledByDefault: z.boolean().optional()\r\n })\r\n .strict();\r\n\r\nexport const userConfigSchema = z\r\n .object({\r\n version: z.literal(1),\r\n agents: z.record(z.string().min(1), agentOverrideSchema)\r\n })\r\n .strict();\r\n\r\nexport type AgentOverride = {\r\n stableName?: string;\r\n supportedPlatforms?: SupportedPlatform[];\r\n homeRelativeRootPath?: string;\r\n skillsDirectoryPath?: string;\r\n enabledByDefault?: boolean;\r\n};\r\n\r\nexport type UserConfig = {\r\n version: 1;\r\n agents: Record<string, AgentOverride>;\r\n};\r\n\r\nfunction createEmptyUserConfig(): UserConfig {\n return {\n version: 1,\n agents: {}\n };\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\";\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\";\nimport { join, resolve } from \"node:path\";\nimport { ManifestValidationError } from \"../core/errors\";\nimport type { Manifest } from \"../core/types\";\nimport { buildEmptyManifest } from \"./build-empty-manifest\";\nimport { manifestSchema } from \"./manifest-schema\";\nimport { writeManifest } from \"./write-manifest\";\n\nfunction getManifestPath(home: string): string {\n return join(home, \"manifest.json\");\n}\n\nfunction normalizeHomePath(home: string): string {\n const resolvedHome = resolve(home);\n return process.platform === \"win32\"\n ? resolvedHome.toLowerCase()\n : resolvedHome;\n}\n\nfunction formatValidationIssues(error: { issues: Array<{ path: (string | number)[]; message: string }> }): string {\n return error.issues\n .map((issue) => {\n const path = issue.path.length > 0 ? issue.path.join(\".\") : \"<root>\";\n return `${path}: ${issue.message}`;\n })\n .join(\"; \");\n}\n\nexport async function readManifest(home: string): Promise<Manifest> {\n const manifestPath = getManifestPath(home);\n\n try {\n const contents = await fs.readFile(manifestPath, \"utf8\");\n const parsedJson = JSON.parse(contents) as unknown;\n const parsedManifest = manifestSchema.safeParse(parsedJson);\n\n if (!parsedManifest.success) {\n throw new ManifestValidationError(\n `Invalid manifest at ${manifestPath}: ${formatValidationIssues(parsedManifest.error)}`\n );\n }\n\n if (\n normalizeHomePath(parsedManifest.data.skillmuxHome) !==\n normalizeHomePath(home)\n ) {\n throw new ManifestValidationError(\n `Invalid manifest at ${manifestPath}: skillmuxHome must match ${home}`\n );\n }\n\n return parsedManifest.data;\n } catch (error) {\n if (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n (error as NodeJS.ErrnoException).code === \"ENOENT\"\n ) {\n const emptyManifest = buildEmptyManifest(home);\n await writeManifest(home, emptyManifest);\n return emptyManifest;\n }\n\n if (error instanceof SyntaxError) {\n throw new ManifestValidationError(\n `Invalid manifest at ${manifestPath}: malformed JSON`\n );\n }\n\n throw error;\n }\n}\n","import type { Manifest } from \"../core/types\";\r\n\r\nexport function buildEmptyManifest(skillmuxHome: string): Manifest {\r\n return {\r\n version: 1,\r\n skillmuxHome,\r\n skills: {},\r\n agents: {},\r\n activations: [],\r\n lastScan: {\r\n at: null,\r\n issues: []\r\n }\r\n };\r\n}\r\n","import { z } from \"zod\";\r\nimport { isValidId } from \"../core/ids\";\r\nimport type {\r\n ActivationRecord,\r\n AgentRecord,\r\n ManagedSkill,\r\n Manifest,\r\n ScanIssue\r\n} from \"../core/types\";\r\n\r\nconst idSchema = z\r\n .string()\r\n .min(1)\r\n .refine(isValidId, \"Expected a canonical lowercase slug identifier\");\r\n\r\nexport const scanIssueSchema = z\r\n .object({\r\n code: z.string().min(1),\r\n severity: z.enum([\"info\", \"warning\", \"error\"]),\r\n message: z.string().min(1),\r\n path: z.string().min(1).optional()\r\n })\r\n .strict();\r\n\r\nexport const managedSkillSchema = z\r\n .object({\r\n id: idSchema,\r\n name: z.string().min(1),\r\n path: z.string().min(1),\r\n source: z\r\n .object({\r\n kind: z.enum([\"local\", \"imported\"]),\r\n path: z.string().min(1)\r\n })\r\n .strict(),\r\n importedAt: z.string().min(1)\r\n })\r\n .strict();\r\n\r\nexport const agentRecordSchema = z\r\n .object({\r\n id: idSchema,\r\n name: z.string().min(1),\r\n path: z.string().min(1),\r\n discovery: z.enum([\"builtin\", \"custom\"]),\r\n available: z.boolean(),\r\n lastSeenAt: z.string().min(1).nullable()\r\n })\r\n .strict();\r\n\r\nexport const activationRecordSchema = z\r\n .object({\r\n skillId: idSchema,\r\n agentId: idSchema,\r\n linkPath: z.string().min(1),\r\n state: z.enum([\"enabled\", \"disabled\"]),\r\n updatedAt: z.string().min(1)\r\n })\r\n .strict();\r\n\r\nexport const manifestSchema = z\r\n .object({\r\n version: z.literal(1),\r\n skillmuxHome: z.string().min(1),\r\n skills: z.record(z.string(), managedSkillSchema),\r\n agents: z.record(z.string(), agentRecordSchema),\r\n activations: z.array(activationRecordSchema),\r\n lastScan: z\r\n .object({\r\n at: z.string().min(1).nullable(),\r\n issues: z.array(scanIssueSchema)\r\n })\r\n .strict()\r\n })\r\n .strict()\r\n .superRefine((manifest, ctx) => {\r\n for (const [skillId, skill] of Object.entries(manifest.skills)) {\r\n if (!isValidId(skillId)) {\r\n ctx.addIssue({\r\n code: z.ZodIssueCode.custom,\r\n path: [\"skills\", skillId],\r\n message: `Invalid skill id key: ${skillId}`\r\n });\r\n }\r\n\r\n if (skill.id !== skillId) {\r\n ctx.addIssue({\r\n code: z.ZodIssueCode.custom,\r\n path: [\"skills\", skillId, \"id\"],\r\n message: `Skill id must match its record key: ${skillId}`\r\n });\r\n }\r\n }\r\n\r\n for (const [agentId, agent] of Object.entries(manifest.agents)) {\r\n if (!isValidId(agentId)) {\r\n ctx.addIssue({\r\n code: z.ZodIssueCode.custom,\r\n path: [\"agents\", agentId],\r\n message: `Invalid agent id key: ${agentId}`\r\n });\r\n }\r\n\r\n if (agent.id !== agentId) {\r\n ctx.addIssue({\r\n code: z.ZodIssueCode.custom,\r\n path: [\"agents\", agentId, \"id\"],\r\n message: `Agent id must match its record key: ${agentId}`\r\n });\r\n }\r\n }\r\n\r\n const activationPairs = new Set<string>();\r\n\r\n manifest.activations.forEach((activation, index) => {\r\n if (!(activation.skillId in manifest.skills)) {\r\n ctx.addIssue({\r\n code: z.ZodIssueCode.custom,\r\n path: [\"activations\", index, \"skillId\"],\r\n message: `Unknown skill reference: ${activation.skillId}`\r\n });\r\n }\r\n\r\n if (!(activation.agentId in manifest.agents)) {\r\n ctx.addIssue({\r\n code: z.ZodIssueCode.custom,\r\n path: [\"activations\", index, \"agentId\"],\r\n message: `Unknown agent reference: ${activation.agentId}`\r\n });\r\n }\r\n\r\n const pairKey = `${activation.skillId}:${activation.agentId}`;\r\n if (activationPairs.has(pairKey)) {\r\n ctx.addIssue({\r\n code: z.ZodIssueCode.custom,\r\n path: [\"activations\", index],\r\n message: `Duplicate activation for ${pairKey}`\r\n });\r\n return;\r\n }\r\n\r\n activationPairs.add(pairKey);\r\n });\r\n });\r\n\r\nexport type { ActivationRecord, AgentRecord, ManagedSkill, Manifest, ScanIssue };\r\n","import { 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\";\r\nimport { resolveSkillmuxHome } from \"../config/resolve-skillmux-home\";\r\nimport {\r\n discoverAgents,\r\n type DiscoveredAgent\r\n} from \"../discovery/discover-agents\";\r\nimport { printJson } from \"../output/print-json\";\r\nimport { printTable } from \"../output/print-table\";\r\n\r\nexport type RunAgentsOptions = {\r\n homeDir?: string;\r\n skillmuxHome?: string;\r\n platform?: NodeJS.Platform;\r\n json?: boolean;\r\n};\r\n\r\nexport type RunAgentsResult = {\r\n agents: DiscoveredAgent[];\r\n output: string;\r\n};\r\n\r\nfunction buildTableOutput(agents: DiscoveredAgent[]): string {\r\n return printTable(\r\n agents.map((agent) => ({\r\n id: agent.id,\r\n name: agent.stableName,\r\n path: agent.absoluteSkillsDirectoryPath,\r\n exists: String(agent.exists),\r\n supported: String(agent.supportedOnPlatform),\r\n discovery: agent.discovery\r\n })),\r\n [\r\n { key: \"id\", label: \"Agent\" },\r\n { key: \"name\", label: \"Name\" },\r\n { key: \"path\", label: \"Path\" },\r\n { key: \"exists\", label: \"Exists\" },\r\n { key: \"supported\", label: \"Supported\" },\r\n { key: \"discovery\", label: \"Discovery\" }\r\n ]\r\n );\r\n}\r\n\r\nexport async function runAgents(\r\n options: RunAgentsOptions = {}\r\n): Promise<RunAgentsResult> {\r\n const homeDir = options.homeDir ?? homedir();\r\n const resolvedPaths = resolveSkillmuxHome(homeDir);\r\n const skillmuxHome = options.skillmuxHome ?? resolvedPaths.skillmuxHome;\r\n const agents = await discoverAgents({\r\n homeDir,\r\n skillmuxHome,\r\n platform: options.platform\r\n });\r\n\r\n return {\r\n agents,\r\n output:\r\n options.json === true\r\n ? printJson(agents)\r\n : buildTableOutput(agents)\r\n };\r\n}\r\n","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 {\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","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 { 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 nextConfig: UserConfig = {\n ...config,\n agents: Object.fromEntries(\n Object.entries(config.agents).filter(([currentAgentId]) => currentAgentId !== agentId)\n )\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 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\";\nimport { buildConfigPath } from \"../config/resolve-skillmux-home\";\nimport { loadUserConfig, type UserConfig } from \"../config/load-user-config\";\nimport { resolveSkillmuxHome } from \"../config/resolve-skillmux-home\";\nimport { printJson } from \"../output/print-json\";\r\nimport { printTable } from \"../output/print-table\";\r\n\r\nexport type RunConfigOptions = {\r\n homeDir?: string;\r\n skillmuxHome?: string;\r\n json?: boolean;\r\n};\r\n\r\nexport type RunConfigResult = {\r\n skillmuxHome: string;\r\n configPath: string;\r\n config: UserConfig;\r\n output: string;\r\n};\r\n\r\nfunction buildTableOutput(result: Omit<RunConfigResult, \"output\">): string {\r\n const summary = printTable(\r\n [\r\n {\r\n skillmuxHome: result.skillmuxHome,\r\n configPath: result.configPath,\r\n overrides: String(Object.keys(result.config.agents).length)\r\n }\r\n ],\r\n [\r\n { key: \"skillmuxHome\", label: \"SkillMux Home\" },\r\n { key: \"configPath\", label: \"Config Path\" },\r\n { key: \"overrides\", label: \"Overrides\" }\r\n ]\r\n );\r\n\r\n const agentRows = Object.entries(result.config.agents)\r\n .sort(([left], [right]) => left.localeCompare(right))\r\n .map(([agentId, agent]) => ({\r\n agentId,\r\n stableName: agent.stableName ?? \"\",\r\n root: agent.homeRelativeRootPath ?? \"\",\r\n skills: agent.skillsDirectoryPath ?? \"\"\r\n }));\r\n\r\n if (agentRows.length === 0) {\r\n return `${summary}\\nNo user overrides configured.\\n`;\r\n }\r\n\r\n return `${summary}\\n${printTable(agentRows, [\r\n { key: \"agentId\", label: \"Agent\" },\r\n { key: \"stableName\", label: \"Name\" },\r\n { key: \"root\", label: \"Root\" },\r\n { key: \"skills\", label: \"Skills Dir\" }\r\n ])}`;\r\n}\r\n\r\nexport async function runConfig(\r\n options: RunConfigOptions = {}\r\n): Promise<RunConfigResult> {\r\n const homeDir = options.homeDir ?? homedir();\n const resolvedPaths = resolveSkillmuxHome(homeDir);\n const skillmuxHome = options.skillmuxHome ?? resolvedPaths.skillmuxHome;\n const config = await loadUserConfig(skillmuxHome);\n\r\n const resultWithoutOutput = {\r\n skillmuxHome,\n configPath: buildConfigPath(skillmuxHome),\n config\n };\n\r\n return {\r\n ...resultWithoutOutput,\r\n output:\r\n options.json === true\r\n ? printJson(resultWithoutOutput)\r\n : buildTableOutput(resultWithoutOutput)\r\n };\r\n}\r\n","import * as fs from \"node:fs/promises\";\r\nimport { homedir } from \"node:os\";\r\nimport { join } from \"node:path\";\r\nimport type { Manifest, ScanIssue } from \"../core/types\";\r\nimport { loadUserConfig, type UserConfig } from \"../config/load-user-config\";\r\nimport { resolveSkillmuxHome } from \"../config/resolve-skillmux-home\";\r\nimport {\r\n discoverAgents,\r\n type DiscoveredAgent\r\n} from \"../discovery/discover-agents\";\r\nimport {\r\n scanAgentSkills,\r\n type ScanAgentSkillsResult\r\n} from \"../discovery/scan-agent-skills\";\r\nimport { type ScannedSkillEntry } from \"../discovery/infer-skill-entry\";\r\nimport { normalizeAbsolutePath } from \"../fs/path-utils\";\r\nimport { readManifest } from \"../manifest/read-manifest\";\r\nimport { formatIssue } from \"../output/format-issue\";\r\nimport { printJson } from \"../output/print-json\";\r\nimport { printTable } from \"../output/print-table\";\r\n\r\nexport type RunDoctorOptions = {\r\n homeDir?: string;\r\n skillmuxHome?: string;\r\n platform?: NodeJS.Platform;\r\n json?: boolean;\r\n};\r\n\r\nexport type RunDoctorResult = {\r\n skillmuxHome: string;\r\n manifest: Manifest;\r\n config: UserConfig;\r\n agents: DiscoveredAgent[];\r\n entries: ScannedSkillEntry[];\r\n issues: ScanIssue[];\r\n output: string;\r\n};\r\n\r\nfunction buildIssue(\r\n code: string,\r\n severity: ScanIssue[\"severity\"],\r\n message: string,\r\n path?: string\r\n): ScanIssue {\r\n return path === undefined ? { code, severity, message } : { code, severity, message, path };\r\n}\r\n\r\nasync function pathExists(path: string): Promise<boolean> {\r\n try {\r\n await fs.access(path);\r\n return true;\r\n } catch (error) {\r\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\r\n return false;\r\n }\r\n\r\n throw error;\r\n }\r\n}\r\n\r\nasync function addUnmanagedDirectoryIssues(\r\n entries: ScannedSkillEntry[],\r\n issues: ScanIssue[]\r\n): Promise<void> {\r\n for (const entry of entries) {\r\n if (entry.kind !== \"unmanaged-directory\") {\r\n continue;\r\n }\r\n\r\n if (await pathExists(join(entry.path, \"SKILL.md\"))) {\r\n issues.push(\r\n buildIssue(\r\n \"unmanaged-skill-directory\",\r\n \"warning\",\r\n `Unmanaged skill directory is present for ${entry.agentId}/${entry.skillName}`,\r\n entry.path\r\n )\r\n );\r\n }\r\n }\r\n}\r\n\r\nasync function addMissingManagedSkillIssues(\r\n manifest: Manifest,\r\n issues: ScanIssue[]\r\n): Promise<void> {\r\n for (const skill of Object.values(manifest.skills)) {\r\n if (await pathExists(skill.path)) {\r\n continue;\r\n }\r\n\r\n issues.push(\r\n buildIssue(\r\n \"missing-managed-skill-path\",\r\n \"error\",\r\n `Managed skill path is missing for ${skill.id}`,\r\n skill.path\r\n )\r\n );\r\n }\r\n}\r\n\r\nfunction addConflictingAgentPathIssues(\r\n agents: DiscoveredAgent[],\r\n issues: ScanIssue[]\r\n): void {\r\n const pathToAgents = new Map<string, DiscoveredAgent[]>();\r\n\r\n for (const agent of agents) {\r\n const key = normalizeAbsolutePath(agent.absoluteSkillsDirectoryPath);\r\n const current = pathToAgents.get(key) ?? [];\r\n current.push(agent);\r\n pathToAgents.set(key, current);\r\n }\r\n\r\n for (const conflictedAgents of pathToAgents.values()) {\r\n if (conflictedAgents.length < 2) {\r\n continue;\r\n }\r\n\r\n const agentIds = conflictedAgents\r\n .map((agent) => agent.id)\r\n .sort((left, right) => left.localeCompare(right));\r\n\r\n issues.push(\r\n buildIssue(\r\n \"conflicting-agent-path\",\r\n \"warning\",\r\n `Multiple agents resolve to the same skills directory: ${agentIds.join(\", \")}`,\r\n conflictedAgents[0].absoluteSkillsDirectoryPath\r\n )\r\n );\r\n }\r\n}\r\n\r\nfunction buildTableOutput(issues: ScanIssue[]): string {\r\n if (issues.length === 0) {\r\n return \"No doctor issues found.\\n\";\r\n }\r\n\r\n return printTable(\r\n issues.map((issue) => ({\r\n severity: issue.severity,\r\n code: issue.code,\r\n path: issue.path ?? \"\",\r\n message: issue.message\r\n })),\r\n [\r\n { key: \"severity\", label: \"Severity\" },\r\n { key: \"code\", label: \"Code\" },\r\n { key: \"path\", label: \"Path\" },\r\n { key: \"message\", label: \"Message\" }\r\n ]\r\n );\r\n}\r\n\r\nfunction buildJsonOutput(result: Omit<RunDoctorResult, \"output\">): string {\r\n return printJson({\r\n skillmuxHome: result.skillmuxHome,\r\n issues: result.issues,\r\n agents: result.agents.map((agent) => ({\r\n id: agent.id,\r\n path: agent.absoluteSkillsDirectoryPath,\r\n supportedOnPlatform: agent.supportedOnPlatform\r\n })),\r\n entries: result.entries\r\n });\r\n}\r\n\r\nexport async function runDoctor(\r\n options: RunDoctorOptions = {}\r\n): Promise<RunDoctorResult> {\r\n const homeDir = options.homeDir ?? homedir();\r\n const resolvedPaths = resolveSkillmuxHome(homeDir);\r\n const skillmuxHome = options.skillmuxHome ?? resolvedPaths.skillmuxHome;\r\n const [manifest, config, agents] = await Promise.all([\r\n readManifest(skillmuxHome),\r\n loadUserConfig(skillmuxHome),\r\n discoverAgents({\r\n homeDir,\r\n skillmuxHome,\r\n platform: options.platform\r\n })\r\n ]);\r\n\r\n const entries: ScannedSkillEntry[] = [];\r\n const issues: ScanIssue[] = [];\r\n\r\n for (const agent of agents) {\r\n const scannedAgent: ScanAgentSkillsResult = await scanAgentSkills(agent, skillmuxHome);\r\n entries.push(...scannedAgent.entries);\r\n issues.push(...scannedAgent.issues);\r\n }\r\n\r\n await addUnmanagedDirectoryIssues(entries, issues);\r\n await addMissingManagedSkillIssues(manifest, issues);\r\n addConflictingAgentPathIssues(agents, issues);\r\n\r\n const dedupedIssues = [...issues].sort((left, right) => {\r\n const leftKey = `${left.severity}:${left.code}:${left.path ?? \"\"}:${left.message}`;\r\n const rightKey = `${right.severity}:${right.code}:${right.path ?? \"\"}:${right.message}`;\r\n return leftKey.localeCompare(rightKey);\r\n });\r\n\r\n const resultWithoutOutput = {\r\n skillmuxHome,\r\n manifest,\r\n config,\r\n agents,\r\n entries,\r\n issues: dedupedIssues\r\n };\r\n\r\n return {\r\n ...resultWithoutOutput,\r\n output:\r\n options.json === true\r\n ? buildJsonOutput(resultWithoutOutput)\r\n : buildTableOutput(dedupedIssues)\r\n };\r\n}\r\n","import * as fs from \"node:fs/promises\";\r\nimport { 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 { printJson } from \"../output/print-json\";\r\nimport { printTable } from \"../output/print-table\";\r\nimport { runScan, type RunScanOptions, type RunScanResult } from \"./scan\";\r\n\r\nexport type ListView = \"records\" | \"agents\" | \"skills\";\r\nexport type ListFormat = \"table\" | \"json\";\r\n\r\nexport type RunListOptions = Omit<RunScanOptions, \"json\"> & {\r\n view?: ListView;\r\n format?: ListFormat;\r\n};\r\n\r\nexport type RunListResult = {\r\n output: string;\r\n data: unknown;\r\n};\r\n\r\nfunction buildRecordsView(scanResult: RunScanResult) {\r\n return {\r\n view: \"records\" as const,\r\n records: scanResult.entries,\r\n issues: scanResult.issues\r\n };\r\n}\r\n\r\nfunction buildAgentsView(scanResult: RunScanResult) {\n const groups = new Map<\n string,\n {\r\n agentId: string;\r\n agentName: string;\r\n entries: RunScanResult[\"entries\"];\r\n }\n >();\n\n for (const agent of scanResult.agents) {\n groups.set(agent.id, {\n agentId: agent.id,\n agentName: agent.stableName,\n entries: []\n });\n }\n\n for (const entry of scanResult.entries) {\n const current = groups.get(entry.agentId) ?? {\n agentId: entry.agentId,\n agentName: entry.agentName,\r\n entries: []\r\n };\r\n current.entries.push(entry);\r\n groups.set(entry.agentId, current);\r\n }\r\n\r\n return {\r\n view: \"agents\" as const,\r\n agents: [...groups.values()].sort((left, right) =>\r\n left.agentId.localeCompare(right.agentId)\r\n ),\r\n issues: scanResult.issues\r\n };\r\n}\r\n\r\nfunction buildSkillsView(scanResult: RunScanResult) {\n const groups = new Map<\n string,\n {\r\n skillName: string;\r\n entries: RunScanResult[\"entries\"];\r\n }\n >();\n\n for (const skill of Object.values(scanResult.manifest.skills)) {\n groups.set(skill.id, {\n skillName: skill.id,\n entries: []\n });\n }\n\n for (const entry of scanResult.entries) {\n const current = groups.get(entry.skillName) ?? {\n skillName: entry.skillName,\n entries: []\r\n };\r\n current.entries.push(entry);\r\n groups.set(entry.skillName, current);\r\n }\r\n\r\n return {\r\n view: \"skills\" as const,\r\n skills: [...groups.values()].sort((left, right) =>\r\n left.skillName.localeCompare(right.skillName)\r\n ),\r\n issues: scanResult.issues\r\n };\r\n}\r\n\r\nfunction buildListData(scanResult: RunScanResult, view: ListView): unknown {\r\n if (view === \"agents\") {\r\n return buildAgentsView(scanResult);\r\n }\r\n\r\n if (view === \"skills\") {\r\n return buildSkillsView(scanResult);\r\n }\r\n\r\n return buildRecordsView(scanResult);\r\n}\r\n\r\nfunction buildTableOutput(data: unknown, view: ListView): string {\r\n if (view === \"agents\") {\r\n const agentRows = (data as { agents: Array<{ agentId: string; agentName: string; entries: unknown[] }> }).agents;\r\n return printTable(\r\n agentRows.map((agent) => ({\r\n agent: agent.agentId,\r\n name: agent.agentName,\r\n entries: String(agent.entries.length)\r\n })),\r\n [\r\n { key: \"agent\", label: \"Agent\" },\r\n { key: \"name\", label: \"Name\" },\r\n { key: \"entries\", label: \"Entries\" }\r\n ]\r\n );\r\n }\r\n\r\n if (view === \"skills\") {\r\n const skillRows = (data as { skills: Array<{ skillName: string; entries: unknown[] }> }).skills;\r\n return printTable(\r\n skillRows.map((skill) => ({\r\n skill: skill.skillName,\r\n entries: String(skill.entries.length)\r\n })),\r\n [\r\n { key: \"skill\", label: \"Skill\" },\r\n { key: \"entries\", label: \"Entries\" }\r\n ]\r\n );\r\n }\r\n\r\n const records = (data as { records: Array<{ agentId: string; skillName: string; kind: string }> }).records;\r\n return printTable(\r\n records.map((record) => ({\r\n agent: record.agentId,\r\n skill: record.skillName,\r\n kind: record.kind\r\n })),\r\n [\r\n { key: \"agent\", label: \"Agent\" },\r\n { key: \"skill\", label: \"Skill\" },\r\n { key: \"kind\", label: \"Kind\" }\r\n ]\r\n );\r\n}\r\n\r\nexport async function runList(options: RunListOptions = {}): Promise<RunListResult> {\r\n const view = options.view ?? \"records\";\r\n const format = options.format ?? \"table\";\r\n const scanResult = await runScan(options);\r\n const data = buildListData(scanResult, view);\r\n\r\n return {\r\n data,\r\n output: format === \"json\" ? printJson(data) : buildTableOutput(data, view)\r\n };\r\n}\r\n","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":["join","resolve","fs","join","resolve","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","join","homedir","homedir","homedir","fs","buildTableOutput","homedir","homedir","normalizeAgentId","buildTableOutput","homedir","homedir","buildTableOutput","homedir","homedir","buildTableOutput","homedir","fs","homedir","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","buildTableOutput","fs","homedir","resolve","buildManagedSkillPath","resolve","buildConfigPath","buildJsonOutput","pathExists","homedir"]}