skillspp 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/cli.ts", "../src/commands/add.ts", "../../../packages/core/src/sources/source-parser.ts", "../../../packages/core/src/sources/skills.ts", "../../../packages/core/src/runtime/agents.ts", "../../../packages/core/src/runtime/installer.ts", "../src/ui/screens.tsx", "../src/ui/format.ts", "../src/ui/colors.ts", "../src/ui/logo.ts", "../src/ui/selection-step.tsx", "../src/interactive.ts", "../src/policy-mode.ts", "../src/command-builder.ts", "../../../packages/core/src/runtime/telemetry.ts", "../../../packages/platform-node/src/background-runner.ts", "../src/runtime/background-runner.ts", "../src/commands/check.ts", "../../../packages/core/src/sources/git.ts", "../../../packages/core/src/providers/registry.ts", "../../../packages/core/src/providers/wellknown.ts", "../../../packages/core/src/providers/catalog.ts", "../../../packages/core/src/providers/index.ts", "../../../packages/core/src/application/experimental.ts", "../../../packages/core/src/sources/source-resolution.ts", "../../../packages/core/src/runtime/lockfile.ts", "../src/commands/find.ts", "../src/commands/init.ts", "../../../packages/core/src/runtime/agent-config-mapper.ts", "../../../packages/core/src/runtime/installer-scaffold.ts", "../src/commands/list.ts", "../src/commands/remove.ts", "../src/commands/update.ts", "../src/commands/validate.ts", "../../../packages/core/src/runtime/skill-installer.ts", "../../../packages/core/src/runtime/installer-security.ts", "../../../packages/core/src/runtime/policy.ts", "../src/telemetry.ts"],
4
+ "sourcesContent": ["import { Command, CommanderError } from \"commander\";\nimport { createRequire } from \"node:module\";\nimport { registerAddCommand } from \"./commands/add\";\nimport { registerCheckCommand } from \"./commands/check\";\nimport { registerFindCommand } from \"./commands/find\";\nimport { registerInitCommand } from \"./commands/init\";\nimport { isPromptCancelledError } from \"./interactive\";\nimport { registerListCommand } from \"./commands/list\";\nimport { registerRemoveCommand } from \"./commands/remove\";\nimport { registerUpdateCommand } from \"./commands/update\";\nimport { registerValidateCommand } from \"./commands/validate\";\nimport { createCliCommandContext } from \"./command-builder\";\nimport {\n emitLifecycleEvent,\n type TelemetryEmitter,\n} from \"@skillspp/core/telemetry\";\nimport { createCliTelemetryEmitter, parseTelemetrySink } from \"./telemetry\";\nimport picocolors from \"picocolors\";\nimport { finalizeUiSession } from \"./ui/screens\";\n\nconst require = createRequire(import.meta.url);\nconst packageJson = require(\"../package.json\") as { version?: unknown };\nconst CLI_VERSION =\n typeof packageJson.version === \"string\" ? packageJson.version : \"0.1.0\";\n\nfunction formatCliError(error: unknown): string {\n if (error && typeof error === \"object\" && \"code\" in error) {\n const code = String((error as { code?: unknown }).code);\n if (code === \"VALIDATION_MISSING_SOURCE\") {\n return \"validate requires <source> unless --ci is used\";\n }\n }\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction createProgram(\n emitter: TelemetryEmitter,\n experimental: boolean,\n): Command {\n const program = new Command()\n .name(\"skillspp\")\n .usage(\"<command> [options]\")\n .description(\"Skills++ CLI\")\n .option(\"--telemetry <sink>\", \"Emit lifecycle events (stdout-json)\")\n .option(\"--experimental\", \"Enable experimental features\")\n .version(CLI_VERSION, \"-v, --version\")\n .helpOption(\"-h, --help\", \"Show help\");\n\n const context = createCliCommandContext(emitter, { experimental });\n registerAddCommand(program, context);\n registerFindCommand(program, context);\n registerListCommand(program, context);\n registerInitCommand(program, context);\n registerRemoveCommand(program, context);\n registerCheckCommand(program, context);\n registerUpdateCommand(program, context);\n registerValidateCommand(program, context);\n\n applyExitOverride(program);\n return program;\n}\n\nfunction applyExitOverride(command: Command): void {\n command.exitOverride((error) => {\n throw error;\n });\n for (const subcommand of command.commands) {\n applyExitOverride(subcommand);\n }\n}\n\nfunction parseTelemetryFromArgv(argv: string[]): string | undefined {\n for (let i = 0; i < argv.length; i += 1) {\n if (argv[i] !== \"--telemetry\") {\n continue;\n }\n return argv[i + 1];\n }\n return undefined;\n}\n\nfunction inferCommandSource(argv: string[]): string {\n for (let i = 0; i < argv.length; i += 1) {\n const arg = argv[i];\n if (arg === \"--telemetry\") {\n i += 1;\n continue;\n }\n if (arg.startsWith(\"-\")) {\n continue;\n }\n return arg;\n }\n return \"cli\";\n}\n\nfunction emitCommanderParseErrorTelemetry(\n emitter: TelemetryEmitter,\n argv: string[],\n error: CommanderError,\n): void {\n const source = inferCommandSource(argv);\n emitLifecycleEvent(emitter, {\n eventType: `${source}_failed`,\n source,\n reason: \"commander_parse_error\",\n command: source,\n status: \"error\",\n error: error.message,\n metadata: {\n commanderCode: error.code,\n },\n });\n}\n\nexport async function runCli(argv: string[]): Promise<number> {\n const telemetrySink = parseTelemetrySink(parseTelemetryFromArgv(argv));\n const emitter = createCliTelemetryEmitter(telemetrySink);\n const experimental = argv.includes(\"--experimental\");\n const program = createProgram(emitter, experimental);\n\n if (argv.length === 0) {\n program.outputHelp();\n return 0;\n }\n\n try {\n await program.parseAsync(argv, { from: \"user\" });\n return 0;\n } catch (error) {\n if (\n error instanceof CommanderError &&\n (error.code === \"commander.helpDisplayed\" ||\n error.code === \"commander.version\")\n ) {\n return 0;\n }\n if (error instanceof CommanderError) {\n emitCommanderParseErrorTelemetry(emitter, argv, error);\n throw new Error(error.message);\n }\n throw error;\n }\n}\n\nrunCli(process.argv.slice(2)).then(\n async (code) => {\n await finalizeUiSession();\n process.exit(code);\n },\n (error: unknown) => {\n finalizeUiSession().finally(() => {\n if (isPromptCancelledError(error)) {\n process.stdout.write(picocolors.red(\"Cancelled.\\n\"));\n process.exit(0);\n }\n if (error instanceof CommanderError) {\n process.stderr.write(`${error.message}\\n`);\n process.exit(1);\n }\n\n process.stderr.write(`${formatCliError(error)}\\n`);\n process.exit(1);\n });\n },\n);\n", "import path from \"node:path\";\nimport { Command } from \"commander\";\nimport type {\n AddOptions,\n AgentType,\n ParsedSource,\n} from \"@skillspp/core/contracts/runtime-types\";\nimport { parseSource } from \"@skillspp/core/source-parser\";\nimport { resolveSourceLabel } from \"@skillspp/core/skills\";\nimport {\n AGENTS,\n getAgentSkillsDir,\n normalizeAgentSelectionInput,\n resolveAddAgentSelectionRows,\n type SelectionRow,\n} from \"@skillspp/core/agents\";\nimport {\n sanitizeSkillName,\n} from \"@skillspp/core/runtime/installer\";\nimport {\n completedStepsSection,\n completionSummarySection,\n failedStepsSection,\n flushUiFrame,\n installationSummarySection,\n manySelectionClosedSection,\n renderStaticScreen,\n hideLoader,\n showLoader,\n sourceSection,\n} from \"../ui/screens\";\nimport {\n type ManySelectionViewConfig,\n type SelectionKeyHint,\n runManySelectionStep,\n runOneSelectionStep,\n type SingleSelectionViewConfig,\n} from \"../ui/selection-step\";\nimport { singleSelectionClosedSection } from \"../ui/screens\";\nimport { type LockfileFormat } from \"@skillspp/core/lockfile\";\nimport { canUseInteractive } from \"../interactive\";\nimport { parsePolicyMode } from \"../policy-mode\";\nimport {\n parseStandaloneCommand,\n type CliCommandContext,\n} from \"../command-builder\";\nimport { runBackgroundTask } from \"../runtime/background-runner\";\nimport { shortenHomePath } from \"../ui/format\";\n\nconst SKILL_NAME_WIDTH = 32;\nconst SKILL_DESC_WIDTH = 40;\nconst AGENT_NAME_WIDTH = 26;\nconst AGENT_DESC_WIDTH = 40;\n\nconst ADD_SCOPE_KEY_HINTS: SelectionKeyHint[] = [\n { key: \"\u2191\u2193\", action: \"navigate\" },\n { key: \"enter\", action: \"confirm\" },\n];\n\nconst ADD_SKILLS_KEY_HINTS: SelectionKeyHint[] = [\n { key: \"space\", action: \"toggle\" },\n { key: \"ctrl+a\", action: \"all\" },\n { key: \"ctrl+l\", action: \"invert\" },\n { key: \"enter\", action: \"confirm\" },\n];\n\nconst ADD_AGENTS_KEY_HINTS: SelectionKeyHint[] = [\n { key: \"type\", action: \"filter\" },\n { key: \"space\", action: \"toggle\" },\n { key: \"enter\", action: \"confirm\" },\n];\n\nconst ADD_SKILLS_SELECTION_VIEW: ManySelectionViewConfig = {\n title: \"Choose Skills\",\n countLine: \"available\",\n instructionLine: \"Select skills (space to toggle)\",\n labelWidth: SKILL_NAME_WIDTH,\n descWidth: SKILL_DESC_WIDTH,\n minWidth: 74,\n defaultHints: ADD_SKILLS_KEY_HINTS,\n};\n\nconst ADD_AGENTS_SELECTION_VIEW: ManySelectionViewConfig = {\n title: \"Choose Agents\",\n countLine: \"available\",\n instructionLine: \"Select agents (space to toggle)\",\n labelWidth: AGENT_NAME_WIDTH,\n descWidth: AGENT_DESC_WIDTH,\n minWidth: 74,\n defaultHints: ADD_AGENTS_KEY_HINTS,\n};\n\nconst ADD_SCOPE_SELECTION_VIEW: SingleSelectionViewConfig = {\n title: \"Install Scope\",\n instructionLine: \"Choose installation scope\",\n minWidth: 74,\n};\n\nconst ADD_SCOPE_SELECTION_ROWS: SelectionRow[] = [\n {\n id: \"local\",\n label: \"Local (project)\",\n description: \"Install into project skills directories\",\n },\n {\n id: \"global\",\n label: \"Global\",\n description: \"Install into home-directory skills directories\",\n },\n];\n\ntype InstallationSummaryRow = {\n skillName: string;\n agentDisplayName: string;\n destinationPath: string;\n mode: \"copy\" | \"symlink\";\n};\n\nfunction buildAddSkillSelectionRows(\n skills: Array<{ name: string; description: string }>,\n): SelectionRow[] {\n return skills.map((skill) => ({\n id: skill.name,\n label: skill.name,\n description: skill.description,\n }));\n}\n\nfunction renderAddSkillsSection(options: {\n skills: Array<{ name: string; description: string }>;\n selectedNames: string[];\n}) {\n return manySelectionClosedSection(\n ADD_SKILLS_SELECTION_VIEW,\n buildAddSkillSelectionRows(options.skills),\n options.selectedNames,\n );\n}\n\nfunction renderAddAgentsSection(options: {\n rows: SelectionRow[];\n selectedAgents: AgentType[];\n}) {\n return manySelectionClosedSection(\n ADD_AGENTS_SELECTION_VIEW,\n options.rows,\n options.selectedAgents,\n );\n}\n\nfunction buildInstallationSummaryRows(options: {\n skillNames: string[];\n agents: AgentType[];\n mode: \"copy\" | \"symlink\";\n globalInstall: boolean;\n cwd: string;\n}): InstallationSummaryRow[] {\n const rows: InstallationSummaryRow[] = [];\n const canonicalAgent = options.agents[0];\n if (!canonicalAgent) {\n return rows;\n }\n const canonicalBase = getAgentSkillsDir(\n canonicalAgent,\n options.globalInstall,\n options.cwd,\n );\n\n for (const rawSkillName of options.skillNames) {\n const skillName = sanitizeSkillName(rawSkillName);\n const canonicalDir = path.join(canonicalBase, skillName);\n for (const agent of options.agents) {\n const agentDir = path.join(\n getAgentSkillsDir(agent, options.globalInstall, options.cwd),\n skillName,\n );\n const destinationPath =\n path.resolve(agentDir) === path.resolve(canonicalDir)\n ? canonicalDir\n : agentDir;\n rows.push({\n skillName,\n agentDisplayName: AGENTS[agent].displayName,\n destinationPath,\n mode: options.mode,\n });\n }\n }\n\n return rows.sort((a, b) => {\n const bySkill = a.skillName.localeCompare(b.skillName);\n if (bySkill !== 0) {\n return bySkill;\n }\n const byAgent = a.agentDisplayName.localeCompare(b.agentDisplayName);\n if (byAgent !== 0) {\n return byAgent;\n }\n return a.destinationPath.localeCompare(b.destinationPath);\n });\n}\n\nasync function printInstallationSummary(options: {\n skillNames: string[];\n agents: AgentType[];\n mode: \"copy\" | \"symlink\";\n globalInstall: boolean;\n cwd: string;\n}): Promise<void> {\n const rows = buildInstallationSummaryRows(options);\n if (rows.length === 0) {\n return;\n }\n await renderStaticScreen([\n installationSummarySection({\n mode: options.mode,\n scope: options.globalInstall ? \"global\" : \"current project\",\n skillCount: options.skillNames.length,\n agentCount: options.agents.length,\n targetCount: rows.length,\n targets: rows,\n }),\n ]);\n}\n\nasync function printAddListScreen(options: {\n sourceLabel: string;\n skills: Array<{ name: string; description: string }>;\n}): Promise<void> {\n await renderStaticScreen([\n sourceSection(shortenHomePath(options.sourceLabel)),\n renderAddSkillsSection({\n skills: options.skills,\n selectedNames: options.skills.map((skill) => skill.name),\n }),\n ]);\n}\n\nasync function resolveAddSkills<\n T extends { name: string; description: string },\n>(available: T[], merged: AddOptions, interactive: boolean): Promise<T[]> {\n const filterByRequestedName = (items: T[], requested?: string[]): T[] => {\n if (!requested || requested.length === 0) {\n return items;\n }\n\n if (requested.includes(\"*\")) {\n return items;\n }\n\n const wanted = new Set(requested.map((item) => item.toLowerCase()));\n return items.filter((item) => wanted.has(item.name.toLowerCase()));\n };\n\n if (merged.list) {\n return filterByRequestedName(available, merged.skill);\n }\n\n const skillRows = buildAddSkillSelectionRows(\n available.map((item) => ({\n name: item.name,\n description: item.description,\n })),\n );\n const renderClosed = (selectedNames: string[]) =>\n renderAddSkillsSection({\n skills: available.map((item) => ({\n name: item.name,\n description: item.description,\n })),\n selectedNames,\n });\n\n if (merged.skill) {\n const selected = filterByRequestedName(available, merged.skill);\n if (selected.length > 0) {\n await runManySelectionStep({\n interactive,\n rows: skillRows,\n selectedIds: selected.map((item) => item.name),\n shouldPrompt: false,\n prompt: {\n title: \"Choose Skills\",\n required: true,\n requiredMessage: \"At least one skill must be selected\",\n searchable: true,\n keyHints: ADD_SKILLS_KEY_HINTS,\n view: ADD_SKILLS_SELECTION_VIEW,\n },\n renderClosed,\n });\n }\n return selected;\n }\n\n if (available.length === 0) {\n throw new Error(\"No skills available\");\n }\n\n if (available.length === 1) {\n await runManySelectionStep({\n interactive,\n rows: skillRows,\n selectedIds: [available[0].name],\n shouldPrompt: false,\n prompt: {\n title: \"Choose Skills\",\n required: true,\n requiredMessage: \"At least one skill must be selected\",\n searchable: true,\n keyHints: ADD_SKILLS_KEY_HINTS,\n view: ADD_SKILLS_SELECTION_VIEW,\n },\n renderClosed,\n });\n return available;\n }\n\n if (!interactive) {\n throw new Error(\n \"Multiple skills found. Use --skill <name> or run in TTY without --non-interactive.\",\n );\n }\n\n const selectedNames = await runManySelectionStep({\n interactive,\n rows: skillRows,\n shouldPrompt: true,\n prompt: {\n title: \"Choose Skills\",\n required: true,\n requiredMessage: \"At least one skill must be selected\",\n searchable: true,\n keyHints: ADD_SKILLS_KEY_HINTS,\n view: ADD_SKILLS_SELECTION_VIEW,\n },\n renderClosed,\n });\n const wanted = new Set(selectedNames);\n return available.filter((item) => wanted.has(item.name));\n}\n\nasync function resolveAddAgents(\n merged: AddOptions,\n globalInstall: boolean,\n interactive: boolean,\n): Promise<AgentType[]> {\n const rows = resolveAddAgentSelectionRows(globalInstall ? \"global\" : \"local\");\n const allForScope = rows.map((row) => row.id as AgentType);\n const allowed = new Set(allForScope);\n const renderClosed = (selectedIds: string[]) =>\n renderAddAgentsSection({\n rows,\n selectedAgents: selectedIds as AgentType[],\n });\n\n const parseScopedAgents = (values: string[]): AgentType[] => {\n if (values.includes(\"*\")) {\n return allForScope;\n }\n\n const out: AgentType[] = [];\n for (const value of values) {\n if (!allowed.has(value as AgentType)) {\n throw new Error(\n `Unknown or unsupported agent for ${\n globalInstall ? \"global\" : \"local\"\n } scope: ${value}`,\n );\n }\n const typed = value as AgentType;\n if (!out.includes(typed)) {\n out.push(typed);\n }\n }\n return out;\n };\n\n if (merged.agent && merged.agent.length > 0) {\n const selectedAgents = parseScopedAgents(merged.agent);\n await runManySelectionStep({\n interactive,\n rows,\n selectedIds: selectedAgents,\n shouldPrompt: false,\n prompt: {\n title: \"Choose Agents\",\n required: true,\n requiredMessage: \"At least one agent must be selected\",\n searchable: true,\n keyHints: ADD_AGENTS_KEY_HINTS,\n view: ADD_AGENTS_SELECTION_VIEW,\n },\n renderClosed,\n });\n return selectedAgents;\n }\n\n if (!interactive) {\n throw new Error(\n \"Missing --agent in non-interactive mode. Provide at least one agent.\",\n );\n }\n\n if (allForScope.length === 1) {\n await runManySelectionStep({\n interactive,\n rows,\n selectedIds: allForScope,\n shouldPrompt: false,\n prompt: {\n title: \"Choose Agents\",\n required: true,\n requiredMessage: \"At least one agent must be selected\",\n searchable: true,\n keyHints: ADD_AGENTS_KEY_HINTS,\n view: ADD_AGENTS_SELECTION_VIEW,\n },\n renderClosed,\n });\n return allForScope;\n }\n\n const selected = await runManySelectionStep({\n interactive,\n rows,\n shouldPrompt: true,\n prompt: {\n title: \"Choose Agents\",\n required: true,\n requiredMessage: \"At least one agent must be selected\",\n searchable: true,\n keyHints: ADD_AGENTS_KEY_HINTS,\n view: ADD_AGENTS_SELECTION_VIEW,\n },\n renderClosed,\n });\n const wanted = new Set(selected);\n return allForScope.filter((agent) => wanted.has(agent));\n}\n\nasync function resolveAddGlobalInstall(\n merged: AddOptions,\n interactive: boolean,\n): Promise<boolean> {\n if (merged.globalFlagProvided) {\n return Boolean(merged.global);\n }\n\n if (!interactive) {\n return false;\n }\n\n const selected = await runOneSelectionStep({\n interactive,\n rows: ADD_SCOPE_SELECTION_ROWS,\n selectedId: \"local\",\n shouldPrompt: true,\n prompt: {\n title: \"Install Scope\",\n required: true,\n requiredMessage: \"Choose local or global scope\",\n searchable: false,\n keyHints: ADD_SCOPE_KEY_HINTS,\n view: ADD_SCOPE_SELECTION_VIEW,\n initialSelectedId: \"local\",\n },\n renderClosed: (selectedId) =>\n singleSelectionClosedSection(\n ADD_SCOPE_SELECTION_VIEW,\n selectedId === \"global\" ? \"Global\" : \"Local (project)\",\n ),\n });\n\n return selected === \"global\";\n}\n\nfunction resolveAddInstallMode(merged: AddOptions): \"copy\" | \"symlink\" {\n if (merged.symlinkFlagProvided) {\n return \"symlink\";\n }\n return \"copy\";\n}\n\ntype AddCommanderOptions = {\n agent?: string[];\n skill?: string[];\n list?: boolean;\n symlink?: boolean;\n yaml?: boolean;\n global?: boolean;\n trustWellKnown?: boolean;\n allowHost?: string[];\n denyHost?: string[];\n maxDownloadBytes?: string;\n policyMode?: string;\n lockFormat?: string;\n nonInteractive?: boolean;\n all?: boolean;\n};\n\ntype AddOptionPresence = {\n agentProvided?: boolean;\n globalProvided?: boolean;\n symlinkProvided?: boolean;\n};\n\nfunction parseLockFormatValue(value?: string): LockfileFormat | undefined {\n if (!value) {\n return undefined;\n }\n if (value !== \"json\" && value !== \"yaml\") {\n throw new Error(`Invalid --lock-format value: ${value}`);\n }\n return value;\n}\n\nfunction toAddOptions(\n options: AddCommanderOptions,\n presence: AddOptionPresence = {},\n): AddOptions {\n const maxDownloadBytes = options.maxDownloadBytes\n ? Number(options.maxDownloadBytes)\n : undefined;\n if (\n typeof maxDownloadBytes === \"number\" &&\n (!Number.isFinite(maxDownloadBytes) || maxDownloadBytes <= 0)\n ) {\n throw new Error(\n `Invalid --max-download-bytes value: ${options.maxDownloadBytes}`,\n );\n }\n\n const parsed: AddOptions = {\n global: Boolean(options.global),\n symlink: Boolean(options.symlink),\n yaml: Boolean(options.yaml),\n list: Boolean(options.list),\n all: Boolean(options.all),\n nonInteractive: Boolean(options.nonInteractive),\n trustWellKnown: Boolean(options.trustWellKnown),\n agent: normalizeAgentSelectionInput(options.agent),\n skill: options.skill,\n allowHost: options.allowHost?.map((item) => item.toLowerCase()),\n denyHost: options.denyHost?.map((item) => item.toLowerCase()),\n maxDownloadBytes,\n policyMode: parsePolicyMode(options.policyMode),\n lockFormat: parseLockFormatValue(options.lockFormat),\n experimental: false,\n };\n\n if (parsed.agent && parsed.agent.length > 0) {\n parsed.agentFlagProvided = true;\n }\n if (presence.agentProvided) {\n parsed.agentFlagProvided = true;\n }\n if (presence.globalProvided) {\n parsed.globalFlagProvided = true;\n }\n if (presence.symlinkProvided) {\n parsed.symlinkFlagProvided = true;\n }\n\n if (parsed.all) {\n parsed.skill = [\"*\"];\n parsed.agent = [\"*\"];\n }\n\n return parsed;\n}\n\nasync function executeAdd(\n sourceInput: string,\n merged: AddOptions,\n): Promise<void> {\n const interactive = canUseInteractive(merged.nonInteractive);\n try {\n showLoader(\"loading\");\n let parsedSource: ParsedSource;\n let sourceLabel: string;\n try {\n parsedSource = parseSource(sourceInput);\n sourceLabel = resolveSourceLabel(parsedSource);\n } catch (error) {\n hideLoader();\n await renderStaticScreen([\n failedStepsSection([\"failed to parse source\"]),\n ]);\n throw error;\n }\n hideLoader();\n await renderStaticScreen([completedStepsSection([\"source parsed\"])]);\n showLoader(\"loading\");\n await flushUiFrame();\n let discovered;\n try {\n discovered = await runBackgroundTask(\n {\n kind: \"add.fetchOrDiscover\",\n payload: {\n cwd: process.cwd(),\n sourceInput,\n options: merged,\n },\n },\n {\n onProgress: (label) => {\n showLoader(label);\n },\n },\n );\n } catch (error) {\n hideLoader();\n await renderStaticScreen([\n failedStepsSection([\"failed to fetch skill index\"]),\n ]);\n throw error;\n }\n hideLoader();\n await renderStaticScreen([\n completedStepsSection([\n \"skill index fetched\",\n \"interactive session ready\",\n ]),\n ]);\n\n if (!merged.list) {\n await renderStaticScreen([sourceSection(shortenHomePath(sourceLabel))]);\n }\n\n const selected = await resolveAddSkills(\n discovered.skills,\n merged,\n interactive,\n );\n\n if (selected.length === 0) {\n if (\n parsedSource.type === \"well-known\" ||\n parsedSource.type === \"catalog\"\n ) {\n throw new Error(\"No matching well-known skills found in source\");\n }\n throw new Error(\"No matching skills found in source\");\n }\n\n if (merged.list) {\n await printAddListScreen({\n sourceLabel,\n skills: selected.map((skill) => ({\n name: skill.name,\n description: skill.description,\n })),\n });\n return;\n }\n\n const globalInstall = await resolveAddGlobalInstall(merged, interactive);\n const installOptions: AddOptions = {\n ...merged,\n global: globalInstall,\n globalFlagProvided: true,\n };\n const agents = await resolveAddAgents(\n installOptions,\n globalInstall,\n interactive\n );\n const mode = resolveAddInstallMode(merged);\n\n await printInstallationSummary({\n skillNames: selected.map((item) => item.name),\n agents,\n mode,\n globalInstall,\n cwd: process.cwd(),\n });\n\n showLoader(\"installing skills\");\n await flushUiFrame();\n let installed;\n try {\n installed = await runBackgroundTask(\n {\n kind: \"add.install\",\n payload: {\n cwd: process.cwd(),\n sourceInput,\n options: installOptions,\n selectedSkillNames: selected.map((skill) => skill.name),\n agents,\n },\n },\n {\n onProgress: (label) => {\n showLoader(label);\n },\n },\n );\n } catch (error) {\n hideLoader();\n await renderStaticScreen([\n failedStepsSection([\"failed to install skills\"]),\n ]);\n throw error;\n }\n hideLoader();\n await renderStaticScreen([\n completedStepsSection([\n \"preparing installer artifacts\",\n \"validating dependencies\",\n \"applying hooks\",\n \"writing lock entries\",\n ]),\n completionSummarySection({\n skillCount: installed.installedSkillNames.length,\n agentCount: installed.agentCount,\n }),\n ]);\n } finally {\n hideLoader();\n }\n}\n\nfunction configureAddCommand(\n command: Command,\n action: (\n source: string,\n options: AddCommanderOptions,\n command: Command,\n ) => Promise<void>,\n): Command {\n return command\n .description(\"Install skills from local path or git source\")\n .argument(\"<source>\", \"Source path or URL\")\n .option(\"-a, --agent <agents...>\", \"Target agent(s) for installation\")\n .option(\"-s, --skill <skills...>\", \"Install only selected skill(s)\")\n .option(\"-l, --list\", \"List skills from source without installing\")\n .option(\"--symlink\", \"Install by symlinking files to all agents\")\n .option(\n \"--yaml\",\n \"Create skill-installer.yaml when scaffolding missing installer config\",\n )\n .option(\"-g, --global\", \"Install globally\")\n .option(\"--trust-well-known\", \"Allow hook commands for well-known source\")\n .option(\"--allow-host <hosts...>\", \"Restrict well-known hosts to allowlist\")\n .option(\"--deny-host <hosts...>\", \"Block specific well-known hosts\")\n .option(\"--max-download-bytes <n>\", \"Set well-known download budget\")\n .option(\"--policy-mode <mode>\", \"Policy mode (enforce|warn)\")\n .option(\"--lock-format <format>\", \"Lockfile format output (json|yaml)\")\n .option(\n \"--non-interactive\",\n \"Disable prompts and require explicit selection\",\n )\n .option(\"--all\", \"Install all skills and known agents\")\n .action(action);\n}\n\nexport function registerAddCommand(\n program: Command,\n ctx: CliCommandContext,\n): void {\n configureAddCommand(\n program.command(\"add\"),\n ctx.wrapAction(\n \"add\",\n async (\n source: string,\n options: AddCommanderOptions,\n command: Command,\n ) => {\n const presence: AddOptionPresence = {\n agentProvided: command.getOptionValueSource(\"agent\") === \"cli\",\n globalProvided: command.getOptionValueSource(\"global\") === \"cli\",\n symlinkProvided: command.getOptionValueSource(\"symlink\") === \"cli\",\n };\n await executeAdd(source, {\n ...toAddOptions(options, presence),\n experimental: ctx.experimental,\n });\n },\n ),\n );\n}\n\nexport async function runAdd(\n args: string[],\n forcedOptions: AddOptions = {},\n): Promise<void> {\n const command = configureAddCommand(\n new Command().name(\"add\"),\n async (source, options, cmd) => {\n const presence: AddOptionPresence = {\n agentProvided: cmd.getOptionValueSource(\"agent\") === \"cli\",\n globalProvided: cmd.getOptionValueSource(\"global\") === \"cli\",\n symlinkProvided: cmd.getOptionValueSource(\"symlink\") === \"cli\",\n };\n const merged: AddOptions = {\n ...toAddOptions(options, presence),\n ...forcedOptions,\n };\n if (Object.prototype.hasOwnProperty.call(forcedOptions, \"global\")) {\n merged.globalFlagProvided = true;\n }\n if (Object.prototype.hasOwnProperty.call(forcedOptions, \"symlink\")) {\n merged.symlinkFlagProvided = true;\n }\n await executeAdd(source, merged);\n },\n );\n await parseStandaloneCommand(command, args);\n}\n", "import path from \"node:path\";\nimport type { ParsedSource } from \"../contracts/runtime-types\";\n\nfunction isLocalPath(input: string): boolean {\n return (\n path.isAbsolute(input) ||\n input === \".\" ||\n input === \"..\" ||\n input.startsWith(\"./\") ||\n input.startsWith(\"../\") ||\n /^[a-zA-Z]:[\\\\/]/.test(input)\n );\n}\n\nexport function parseSource(input: string): ParsedSource {\n if (input.startsWith(\"catalog+https://\")) {\n return { type: \"catalog\", url: input.slice(\"catalog+\".length) };\n }\n\n if (isLocalPath(input)) {\n return { type: \"local\", localPath: path.resolve(input) };\n }\n\n const githubTreeWithPath = input.match(\n /github\\.com\\/([^/]+)\\/([^/]+)\\/tree\\/([^/]+)\\/(.+)/\n );\n if (githubTreeWithPath) {\n const [, owner, repo, ref, subpath] = githubTreeWithPath;\n return {\n type: \"github\",\n repoUrl: `https://github.com/${owner}/${repo.replace(/\\.git$/, \"\")}.git`,\n ref,\n subpath,\n };\n }\n\n const githubTree = input.match(\n /github\\.com\\/([^/]+)\\/([^/]+)\\/tree\\/([^/]+)$/\n );\n if (githubTree) {\n const [, owner, repo, ref] = githubTree;\n return {\n type: \"github\",\n repoUrl: `https://github.com/${owner}/${repo.replace(/\\.git$/, \"\")}.git`,\n ref,\n };\n }\n\n const githubRepo = input.match(/github\\.com\\/([^/]+)\\/([^/]+)/);\n if (githubRepo) {\n const [, owner, repo] = githubRepo;\n return {\n type: \"github\",\n repoUrl: `https://github.com/${owner}/${repo.replace(/\\.git$/, \"\")}.git`,\n };\n }\n\n const gitlabRepo = input.match(/gitlab\\.com\\/([^/]+)\\/([^/]+)/);\n if (gitlabRepo) {\n const [, owner, repo] = gitlabRepo;\n return {\n type: \"git\",\n repoUrl: `https://gitlab.com/${owner}/${repo.replace(/\\.git$/, \"\")}.git`,\n };\n }\n\n const shorthand = input.match(/^([^/]+)\\/([^/]+)(?:\\/(.+))?$/);\n if (shorthand && !input.includes(\":\") && !input.startsWith(\".\")) {\n const [, owner, repo, subpath] = shorthand;\n return {\n type: \"github\",\n repoUrl: `https://github.com/${owner}/${repo.replace(/\\.git$/, \"\")}.git`,\n subpath,\n };\n }\n\n if (input.startsWith(\"http://\") || input.startsWith(\"https://\")) {\n if (input.endsWith(\".git\")) {\n return { type: \"git\", repoUrl: input };\n }\n return { type: \"well-known\", url: input };\n }\n\n return { type: \"git\", repoUrl: input };\n}\n", "import fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport matter from \"gray-matter\";\nimport type { Skill, ParsedSource } from \"../contracts/runtime-types\";\n\nconst SKIP_DIRS = new Set([\n \".git\",\n \"node_modules\",\n \"dist\",\n \"build\",\n \"__pycache__\",\n]);\n\nexport function resolveSourceLabel(parsedSource: ParsedSource): string {\n switch (parsedSource.type) {\n case \"local\":\n return parsedSource.localPath;\n case \"github\":\n case \"git\":\n return parsedSource.repoUrl;\n case \"well-known\":\n case \"catalog\":\n return parsedSource.url;\n default:\n return \"\";\n }\n}\n\nexport type RemoteStagingResult = {\n path: string;\n cleanup: () => void;\n};\n\nexport function stageRemoteSkillFilesToTempDir(\n files: Map<string, string>,\n options?: { prefix?: string },\n): RemoteStagingResult {\n const tmp = fs.mkdtempSync(\n path.join(os.tmpdir(), options?.prefix || \"skillspp-remote-\"),\n );\n\n try {\n for (const [relativePath, content] of files.entries()) {\n const resolved = path.resolve(tmp, relativePath);\n const rel = path.relative(tmp, resolved);\n if (!rel || rel.startsWith(\"..\") || path.isAbsolute(rel)) {\n throw new Error(`Unsafe remote skill file path: ${relativePath}`);\n }\n\n fs.mkdirSync(path.dirname(resolved), { recursive: true });\n fs.writeFileSync(resolved, content, \"utf8\");\n }\n } catch (error) {\n fs.rmSync(tmp, { recursive: true, force: true });\n throw error;\n }\n\n return {\n path: tmp,\n cleanup: () => fs.rmSync(tmp, { recursive: true, force: true }),\n };\n}\n\nfunction hasSkillMd(dir: string): boolean {\n const skillPath = path.join(dir, \"SKILL.md\");\n return fs.existsSync(skillPath) && fs.statSync(skillPath).isFile();\n}\n\nasync function hasSkillMdAsync(dir: string): Promise<boolean> {\n const skillPath = path.join(dir, \"SKILL.md\");\n try {\n const stat = await fs.promises.stat(skillPath);\n return stat.isFile();\n } catch {\n return false;\n }\n}\n\nfunction parseSkillMd(skillMdPath: string): Skill | null {\n try {\n const raw = fs.readFileSync(skillMdPath, \"utf8\");\n const { data } = matter(raw);\n if (typeof data.name !== \"string\" || typeof data.description !== \"string\") {\n return null;\n }\n return {\n name: data.name,\n description: data.description,\n path: path.dirname(skillMdPath),\n };\n } catch {\n return null;\n }\n}\n\nasync function parseSkillMdAsync(skillMdPath: string): Promise<Skill | null> {\n try {\n const raw = await fs.promises.readFile(skillMdPath, \"utf8\");\n const { data } = matter(raw);\n if (typeof data.name !== \"string\" || typeof data.description !== \"string\") {\n return null;\n }\n return {\n name: data.name,\n description: data.description,\n path: path.dirname(skillMdPath),\n };\n } catch {\n return null;\n }\n}\n\nfunction findSkillDirsRecursive(\n dir: string,\n depth: number,\n maxDepth: number,\n out: string[]\n): void {\n if (depth > maxDepth) {\n return;\n }\n\n if (!fs.existsSync(dir) || !fs.statSync(dir).isDirectory()) {\n return;\n }\n\n if (hasSkillMd(dir)) {\n out.push(dir);\n }\n\n for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {\n if (!entry.isDirectory() || SKIP_DIRS.has(entry.name)) {\n continue;\n }\n findSkillDirsRecursive(\n path.join(dir, entry.name),\n depth + 1,\n maxDepth,\n out\n );\n }\n}\n\nasync function findSkillDirsRecursiveAsync(\n dir: string,\n depth: number,\n maxDepth: number,\n out: string[]\n): Promise<void> {\n if (depth > maxDepth) {\n return;\n }\n\n try {\n const stat = await fs.promises.stat(dir);\n if (!stat.isDirectory()) {\n return;\n }\n } catch {\n return;\n }\n\n if (await hasSkillMdAsync(dir)) {\n out.push(dir);\n }\n\n let entries: fs.Dirent[] = [];\n try {\n entries = await fs.promises.readdir(dir, { withFileTypes: true });\n } catch {\n return;\n }\n\n for (const entry of entries) {\n if (!entry.isDirectory() || SKIP_DIRS.has(entry.name)) {\n continue;\n }\n await findSkillDirsRecursiveAsync(\n path.join(dir, entry.name),\n depth + 1,\n maxDepth,\n out\n );\n }\n}\n\nexport function discoverSkills(basePath: string): Skill[] {\n const dirsToSearch = [\n basePath,\n path.join(basePath, \"skills\"),\n path.join(basePath, \"skills\", \".curated\"),\n path.join(basePath, \"skills\", \".experimental\"),\n path.join(basePath, \"skills\", \".system\"),\n path.join(basePath, \".agents\", \"skills\"),\n path.join(basePath, \".agent\", \"skills\"),\n ];\n\n const skillDirs: string[] = [];\n for (const dir of dirsToSearch) {\n if (!fs.existsSync(dir) || !fs.statSync(dir).isDirectory()) {\n continue;\n }\n for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {\n if (!entry.isDirectory()) {\n continue;\n }\n const candidate = path.join(dir, entry.name);\n if (hasSkillMd(candidate)) {\n skillDirs.push(candidate);\n }\n }\n }\n\n if (hasSkillMd(basePath)) {\n skillDirs.unshift(basePath);\n }\n\n if (skillDirs.length === 0) {\n findSkillDirsRecursive(basePath, 0, 5, skillDirs);\n }\n\n const seen = new Set<string>();\n const skills: Skill[] = [];\n for (const dir of skillDirs) {\n const parsed = parseSkillMd(path.join(dir, \"SKILL.md\"));\n if (!parsed) {\n continue;\n }\n if (seen.has(parsed.name)) {\n continue;\n }\n seen.add(parsed.name);\n skills.push(parsed);\n }\n\n return skills;\n}\n\nexport async function discoverSkillsAsync(basePath: string): Promise<Skill[]> {\n const dirsToSearch = [\n basePath,\n path.join(basePath, \"skills\"),\n path.join(basePath, \"skills\", \".curated\"),\n path.join(basePath, \"skills\", \".experimental\"),\n path.join(basePath, \"skills\", \".system\"),\n path.join(basePath, \".agents\", \"skills\"),\n path.join(basePath, \".agent\", \"skills\"),\n ];\n\n const skillDirs: string[] = [];\n for (const dir of dirsToSearch) {\n let stat: fs.Stats | undefined;\n try {\n stat = await fs.promises.stat(dir);\n } catch {\n stat = undefined;\n }\n if (!stat || !stat.isDirectory()) {\n continue;\n }\n\n let entries: fs.Dirent[] = [];\n try {\n entries = await fs.promises.readdir(dir, { withFileTypes: true });\n } catch {\n entries = [];\n }\n\n for (const entry of entries) {\n if (!entry.isDirectory()) {\n continue;\n }\n const candidate = path.join(dir, entry.name);\n if (await hasSkillMdAsync(candidate)) {\n skillDirs.push(candidate);\n }\n }\n }\n\n if (await hasSkillMdAsync(basePath)) {\n skillDirs.unshift(basePath);\n }\n\n if (skillDirs.length === 0) {\n await findSkillDirsRecursiveAsync(basePath, 0, 5, skillDirs);\n }\n\n const seen = new Set<string>();\n const skills: Skill[] = [];\n for (const dir of skillDirs) {\n const parsed = await parseSkillMdAsync(path.join(dir, \"SKILL.md\"));\n if (!parsed) {\n continue;\n }\n if (seen.has(parsed.name)) {\n continue;\n }\n seen.add(parsed.name);\n skills.push(parsed);\n }\n\n return skills;\n}\n\nexport function filterSkillsByName(\n skills: Skill[],\n requested?: string[]\n): Skill[] {\n if (!requested || requested.length === 0) {\n return skills;\n }\n\n if (requested.includes(\"*\")) {\n return skills;\n }\n\n const wanted = new Set(requested.map((item) => item.toLowerCase()));\n return skills.filter((skill) => wanted.has(skill.name.toLowerCase()));\n}\n", "import fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport type { AgentInfo, AgentType } from \"../contracts/runtime-types\";\n\nexport type ScopeAgentSelectionEntry = {\n agent: AgentType;\n label: string;\n skillsDir: string;\n};\n\nexport type SelectionRow = {\n id: string;\n label: string;\n description?: string;\n};\n\nexport const STANDARD_AGENTS = {\n universal: {\n displayName: \"Universal\",\n projectSkillsDir: \".agents/skills\",\n globalSkillsDir: \".agents/skills\",\n installMarkers: [\".agents\"],\n },\n adal: {\n displayName: \"AdaL\",\n projectSkillsDir: \".adal/skills\",\n globalSkillsDir: \".adal/skills\",\n installMarkers: [\".adal\"],\n },\n antigravity: {\n displayName: \"Antigravity\",\n projectSkillsDir: \".agent/skills\",\n globalSkillsDir: \".gemini/antigravity/skills\",\n installMarkers: [\".gemini/antigravity\"],\n },\n augment: {\n displayName: \"Augment\",\n projectSkillsDir: \".augment/skills\",\n globalSkillsDir: \".augment/skills\",\n installMarkers: [\".augment\"],\n },\n \"claude-code\": {\n displayName: \"Claude Code\",\n projectSkillsDir: \".claude/skills\",\n globalSkillsDir: \".claude/skills\",\n installMarkers: [\".claude\"],\n },\n \"cortex-code\": {\n displayName: \"Cortex Code\",\n projectSkillsDir: \".cortex/skills\",\n globalSkillsDir: \".cortex/skills\",\n installMarkers: [\".cortex\"],\n },\n crush: {\n displayName: \"Crush\",\n projectSkillsDir: \".crush/skills\",\n globalSkillsDir: \".crush/skills\",\n installMarkers: [\".crush\"],\n },\n droid: {\n displayName: \"Droid\",\n projectSkillsDir: \".factory/skills\",\n globalSkillsDir: \".factory/skills\",\n installMarkers: [\".factory\"],\n },\n goose: {\n displayName: \"Goose\",\n projectSkillsDir: \".goose/skills\",\n globalSkillsDir: \".config/goose/skills\",\n installMarkers: [\".config/goose\"],\n },\n \"iflow-cli\": {\n displayName: \"iFlow CLI\",\n projectSkillsDir: \".iflow/skills\",\n globalSkillsDir: \".iflow/skills\",\n installMarkers: [\".iflow\"],\n },\n junie: {\n displayName: \"Junie\",\n projectSkillsDir: \".junie/skills\",\n globalSkillsDir: \".junie/skills\",\n installMarkers: [\".junie\"],\n },\n \"kiro-cli\": {\n displayName: \"Kiro CLI\",\n projectSkillsDir: \".kiro/skills\",\n globalSkillsDir: \".kiro/skills\",\n installMarkers: [\".kiro\"],\n },\n kode: {\n displayName: \"Kode\",\n projectSkillsDir: \".kode/skills\",\n globalSkillsDir: \".kode/skills\",\n installMarkers: [\".kode\"],\n },\n openclaw: {\n displayName: \"OpenClaw\",\n projectSkillsDir: \"skills\",\n globalSkillsDir: \".openclaw/skills\",\n installMarkers: [\".openclaw\"],\n },\n openhands: {\n displayName: \"OpenHands\",\n projectSkillsDir: \".openhands/skills\",\n globalSkillsDir: \".openhands/skills\",\n installMarkers: [\".openhands\"],\n },\n \"mistral-vibe\": {\n displayName: \"Mistral Vibe\",\n projectSkillsDir: \".vibe/skills\",\n globalSkillsDir: \".vibe/skills\",\n installMarkers: [\".vibe\"],\n },\n neovate: {\n displayName: \"Neovate\",\n projectSkillsDir: \".neovate/skills\",\n globalSkillsDir: \".neovate/skills\",\n installMarkers: [\".neovate\"],\n },\n pochi: {\n displayName: \"Pochi\",\n projectSkillsDir: \".pochi/skills\",\n globalSkillsDir: \".pochi/skills\",\n installMarkers: [\".pochi\"],\n },\n qoder: {\n displayName: \"Qoder\",\n projectSkillsDir: \".qoder/skills\",\n globalSkillsDir: \".qoder/skills\",\n installMarkers: [\".qoder\"],\n },\n \"qwen-code\": {\n displayName: \"Qwen Code\",\n projectSkillsDir: \".qwen/skills\",\n globalSkillsDir: \".qwen/skills\",\n installMarkers: [\".qwen\"],\n },\n roo: {\n displayName: \"Roo Code\",\n projectSkillsDir: \".roo/skills\",\n globalSkillsDir: \".roo/skills\",\n installMarkers: [\".roo\"],\n },\n trae: {\n displayName: \"Trae\",\n projectSkillsDir: \".trae/skills\",\n globalSkillsDir: \".trae/skills\",\n installMarkers: [\".trae\"],\n },\n \"trae-cn\": {\n displayName: \"Trae CN\",\n projectSkillsDir: \".trae/skills\",\n globalSkillsDir: \".trae/skills\",\n installMarkers: [\".trae\"],\n },\n windsurf: {\n displayName: \"Windsurf\",\n projectSkillsDir: \".windsurf/skills\",\n globalSkillsDir: \".codeium/windsurf/skills\",\n installMarkers: [\".windsurf\", \".codeium/windsurf\"],\n },\n zencoder: {\n displayName: \"Zencoder\",\n projectSkillsDir: \".zencoder/skills\",\n globalSkillsDir: \".zencoder/skills\",\n installMarkers: [\".zencoder\"],\n },\n continue: {\n displayName: \"Continue\",\n projectSkillsDir: \".continue/skills\",\n globalSkillsDir: \".continue/skills\",\n installMarkers: [\".continue\"],\n },\n codebuddy: {\n displayName: \"CodeBuddy\",\n projectSkillsDir: \".codebuddy/skills\",\n globalSkillsDir: \".codebuddy/skills\",\n installMarkers: [\".codebuddy\"],\n },\n \"command-code\": {\n displayName: \"Command Code\",\n projectSkillsDir: \".commandcode/skills\",\n globalSkillsDir: \".commandcode/skills\",\n installMarkers: [\".commandcode\"],\n },\n kilo: {\n displayName: \"Kilo Code\",\n projectSkillsDir: \".kilocode/skills\",\n globalSkillsDir: \".kilocode/skills\",\n installMarkers: [\".kilocode\"],\n },\n mcpjam: {\n displayName: \"MCPJam\",\n projectSkillsDir: \".mcpjam/skills\",\n globalSkillsDir: \".mcpjam/skills\",\n installMarkers: [\".mcpjam\"],\n },\n mux: {\n displayName: \"Mux\",\n projectSkillsDir: \".mux/skills\",\n globalSkillsDir: \".mux/skills\",\n installMarkers: [\".mux\"],\n },\n pi: {\n displayName: \"Pi\",\n projectSkillsDir: \".pi/skills\",\n globalSkillsDir: \".pi/agent/skills\",\n installMarkers: [\".pi\"],\n },\n replit: {\n displayName: \"Replit\",\n projectSkillsDir: \".agents/skills\",\n globalSkillsDir: \".config/agents/skills\",\n installMarkers: [\".config/agents\"],\n },\n};\n\nexport const AGENTS: Record<AgentType, AgentInfo> = {\n ...STANDARD_AGENTS,\n codex: {\n displayName: \"Codex\",\n projectSkillsDir: \".agents/skills\",\n globalSkillsDir: \".codex/skills\",\n installMarkers: [\".codex\"],\n },\n cursor: {\n displayName: \"Cursor\",\n projectSkillsDir: \".agents/skills\",\n globalSkillsDir: \".cursor/skills\",\n installMarkers: [\".cursor\"],\n },\n \"gemini-cli\": {\n displayName: \"Gemini CLI\",\n projectSkillsDir: \".agents/skills\",\n globalSkillsDir: \".gemini/skills\",\n installMarkers: [\".gemini\"],\n },\n \"github-copilot\": {\n displayName: \"GitHub Copilot\",\n projectSkillsDir: \".agents/skills\",\n globalSkillsDir: \".copilot/skills\",\n installMarkers: [\".copilot\"],\n },\n amp: {\n displayName: \"Amp\",\n projectSkillsDir: \".agents/skills\",\n globalSkillsDir: \".config/agents/skills\",\n installMarkers: [\".config/agents\"],\n },\n opencode: {\n displayName: \"OpenCode\",\n projectSkillsDir: \".agents/skills\",\n globalSkillsDir: \".config/opencode/skills\",\n installMarkers: [\".config/opencode\"],\n },\n windsurf: {\n displayName: \"Windsurf\",\n projectSkillsDir: \".windsurf/skills\",\n globalSkillsDir: \".codeium/windsurf/skills\",\n installMarkers: [\".windsurf\", \".codeium/windsurf\"],\n },\n cline: {\n displayName: \"Cline\",\n projectSkillsDir: \".cline/skills\",\n globalSkillsDir: \".cline/skills\",\n installMarkers: [\".cline\"],\n },\n};\n\nexport const ALL_AGENTS = Object.keys(AGENTS) as AgentType[];\n\nexport function isAgent(value: string): value is AgentType {\n return Object.prototype.hasOwnProperty.call(AGENTS, value);\n}\n\nexport function resolveAddAgentSelectionRows(\n scope: \"local\" | \"global\",\n): SelectionRow[] {\n const dataset =\n scope === \"global\"\n ? Object.entries(AGENTS).map(([agent, info]) => ({\n agent: agent as AgentType,\n label: `${info.displayName} (global)`,\n skillsDir: info.globalSkillsDir,\n }))\n : Object.entries(STANDARD_AGENTS).map(([agent, info]) => ({\n agent: agent as AgentType,\n label: info.displayName,\n skillsDir: info.projectSkillsDir,\n }));\n\n return dataset.map((entry) => ({\n id: entry.agent,\n label: entry.label,\n description: entry.skillsDir,\n }));\n}\n\nexport function resolveAgents(input: string[] | undefined): AgentType[] {\n if (!input || input.length === 0) {\n const detected = detectInstalledAgents();\n return detected.length > 0 ? detected : [\"opencode\", \"codex\"];\n }\n\n if (input.includes(\"*\")) {\n const detected = detectInstalledAgents();\n return detected.length > 0 ? detected : ALL_AGENTS;\n }\n\n const out: AgentType[] = [];\n for (const value of input) {\n if (!isAgent(value)) {\n throw new Error(`Unknown agent: ${value}`);\n }\n if (!out.includes(value)) {\n out.push(value);\n }\n }\n return out;\n}\n\nexport function normalizeAgentSelectionInput(\n values: string[] | undefined,\n cwd: string = process.cwd(),\n): string[] | undefined {\n if (!values || values.length === 0) {\n return values;\n }\n\n if (values.includes(\"*\")) {\n return [\"*\"];\n }\n\n const valid = values.filter((value) => isAgent(value));\n const unknown = values.filter((value) => !isAgent(value));\n if (unknown.length === 0) {\n return values;\n }\n\n // If all unknown values are filesystem entries, this is likely shell\n // expansion from an unquoted `*`.\n const expandedFromGlob = unknown.every((value) =>\n fs.existsSync(path.resolve(cwd, value)),\n );\n if (!expandedFromGlob) {\n return values;\n }\n\n if (valid.length > 0) {\n return valid;\n }\n return [\"*\"];\n}\n\nexport function getAgentSkillsDir(\n agent: AgentType,\n globalInstall: boolean,\n cwd: string,\n): string {\n const relative = globalInstall\n ? AGENTS[agent].globalSkillsDir\n : AGENTS[agent].projectSkillsDir;\n const base = globalInstall ? os.homedir() : cwd;\n return path.join(base, relative);\n}\n\nexport function detectInstalledAgents(\n cwd: string = process.cwd(),\n): AgentType[] {\n const found: AgentType[] = [];\n for (const agent of Object.keys(AGENTS) as AgentType[]) {\n if (isAgentInstalled(agent, cwd)) {\n found.push(agent);\n }\n }\n return found;\n}\n\nexport function filterInstalledAgents(\n agents: AgentType[],\n cwd: string = process.cwd(),\n): AgentType[] {\n return agents.filter((agent) => isAgentInstalled(agent, cwd));\n}\n\nfunction isAgentInstalled(agent: AgentType, cwd: string): boolean {\n const info = AGENTS[agent];\n const home = os.homedir();\n\n if (info.installMarkers) {\n for (const marker of info.installMarkers) {\n if (fs.existsSync(path.join(home, marker))) {\n return true;\n }\n }\n }\n\n const projectSkillsDir = getAgentSkillsDir(agent, false, cwd);\n if (\n info.projectSkillsDir !== \".agents/skills\" &&\n fs.existsSync(projectSkillsDir)\n ) {\n return true;\n }\n\n const globalSkillsDir = getAgentSkillsDir(agent, true, cwd);\n if (\n info.globalSkillsDir !== \".config/agents/skills\" &&\n info.globalSkillsDir !== \".agents/skills\" &&\n fs.existsSync(globalSkillsDir)\n ) {\n return true;\n }\n\n return false;\n}\n", "import fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport type { AgentType, InstallMode, Skill } from \"../contracts/runtime-types\";\nimport { getAgentSkillsDir } from \"./agents\";\n\nexport type InstallOutcome = {\n skillName: string;\n canonicalDir: string;\n installedTo: Array<{ agent: AgentType; path: string; mode: InstallMode }>;\n};\n\nexport function sanitizeSkillName(name: string): string {\n const sanitized = name\n .toLowerCase()\n .replace(/[^a-z0-9._-]+/g, \"-\")\n .replace(/^[.-]+|[.-]+$/g, \"\");\n return sanitized || \"unnamed-skill\";\n}\n\nfunction ensureSafeInside(baseDir: string, target: string): void {\n const resolvedBase = path.resolve(baseDir);\n const resolvedTarget = path.resolve(target);\n if (\n !(\n resolvedTarget === resolvedBase ||\n resolvedTarget.startsWith(`${resolvedBase}${path.sep}`)\n )\n ) {\n throw new Error(`Unsafe path detected: ${target}`);\n }\n}\n\nexport function getCanonicalSkillsBaseDir(\n globalInstall: boolean,\n cwd: string\n): string {\n return globalInstall\n ? path.join(os.homedir(), \".config\", \"agents\", \"skills\")\n : path.join(cwd, \".agents\", \"skills\");\n}\n\nfunction symlinkRelative(target: string, linkPath: string): void {\n const parent = path.dirname(linkPath);\n const relative = path.relative(parent, target);\n const symlinkType: fs.symlink.Type | undefined =\n process.platform === \"win32\" ? \"junction\" : undefined;\n fs.symlinkSync(relative, linkPath, symlinkType);\n}\n\nfunction installToAgent(\n skillName: string,\n canonicalDir: string,\n agent: AgentType,\n mode: InstallMode,\n globalInstall: boolean,\n cwd: string\n): { agent: AgentType; path: string; mode: InstallMode } {\n const agentBase = getAgentSkillsDir(agent, globalInstall, cwd);\n const agentDir = path.join(agentBase, skillName);\n\n fs.mkdirSync(agentBase, { recursive: true });\n ensureSafeInside(agentBase, agentDir);\n\n if (path.resolve(agentDir) === path.resolve(canonicalDir)) {\n return { agent, path: canonicalDir, mode };\n }\n\n if (mode === \"copy\") {\n fs.rmSync(agentDir, { recursive: true, force: true });\n fs.cpSync(canonicalDir, agentDir, { recursive: true, force: true });\n return { agent, path: agentDir, mode };\n }\n\n try {\n fs.rmSync(agentDir, { recursive: true, force: true });\n symlinkRelative(canonicalDir, agentDir);\n return { agent, path: agentDir, mode: \"symlink\" };\n } catch {\n fs.rmSync(agentDir, { recursive: true, force: true });\n fs.cpSync(canonicalDir, agentDir, { recursive: true, force: true });\n return { agent, path: agentDir, mode: \"copy\" };\n }\n}\n\nexport function installSkill(\n skill: Skill,\n agents: AgentType[],\n options: { mode: InstallMode; globalInstall: boolean; cwd: string }\n): InstallOutcome {\n if (agents.length === 0) {\n throw new Error(\"At least one target agent is required for installation.\");\n }\n\n const uniqueAgents = Array.from(new Set(agents));\n const skillName = sanitizeSkillName(skill.name);\n const canonicalAgent = uniqueAgents[0];\n const canonicalBase = getAgentSkillsDir(\n canonicalAgent,\n options.globalInstall,\n options.cwd\n );\n const canonicalDir = path.join(canonicalBase, skillName);\n\n fs.mkdirSync(canonicalBase, { recursive: true });\n ensureSafeInside(canonicalBase, canonicalDir);\n\n fs.rmSync(canonicalDir, { recursive: true, force: true });\n fs.cpSync(skill.path, canonicalDir, { recursive: true, force: true });\n\n const installedTo = [\n { agent: canonicalAgent, path: canonicalDir, mode: options.mode },\n ...uniqueAgents.slice(1).map((agent) =>\n installToAgent(\n skillName,\n canonicalDir,\n agent,\n options.mode,\n options.globalInstall,\n options.cwd\n )\n ),\n ];\n\n return {\n skillName,\n canonicalDir,\n installedTo,\n };\n}\n", "import { stripVTControlCharacters } from \"node:util\";\nimport React, { type ReactNode, useEffect, useState } from \"react\";\nimport { Box, Text, render, useInput, useStdout } from \"ink\";\nimport type { Instance } from \"ink\";\nimport { compactAgentDisplayNames, shortenHomePath } from \"./format\";\nimport {\n type AnimatedLogo,\n getAnimatedLogoFrames,\n getBannerLogoLines,\n} from \"./logo\";\nimport { ANSI_RESET, bold, colorToken, dim } from \"./colors\";\nimport type { SelectionRow } from \"@skillspp/core/agents\";\n\nexport type PanelStyle = \"square\" | \"rounded\";\n\nexport type UiSection =\n | { type: \"banner\"; title: string; width?: number }\n | {\n type: \"panel\";\n title: string;\n lines: string[];\n style?: PanelStyle;\n minWidth?: number;\n indent?: string;\n }\n | { type: \"lines\"; lines: string[] }\n | { type: \"source\"; source: string }\n | { type: \"text\"; text: string };\n\nexport type ManySelectionViewConfig = {\n title: string;\n countLine: string;\n instructionLine: string;\n labelWidth: number;\n descWidth: number;\n minWidth?: number;\n defaultHints: Array<{ key: string; action: string }>;\n};\n\nexport type SingleSelectionViewConfig = {\n title: string;\n instructionLine: string;\n minWidth?: number;\n};\n\nexport type SelectionKeyHint = {\n key: string;\n action: string;\n};\n\nexport type StepStatus = \"completed\" | \"failed\";\n\nconst DEFAULT_BANNER_WIDTH = 78;\nconst DEFAULT_PANEL_MIN_WIDTH = 58;\nconst MIN_TERMINAL_WIDTH = 40;\nconst MIN_INNER_WIDTH = 16;\nconst FRAME_OVERHEAD = 4;\nconst SELECTION_ROW_OVERHEAD = 8;\nconst PINNED_LOGO_HEADER_WIDTH = 78;\nconst PINNED_LOGO_BOTTOM_MARGIN_LINES = 1;\n\nfunction singleLine(value: unknown): string {\n return String(value ?? \"\")\n .replace(/\\r\\n/g, \"\\n\")\n .replace(/\\n+/g, \" \")\n .replace(/\\s+/g, \" \")\n .trim();\n}\n\nfunction normalizeUiBlock(value: string): string {\n const normalized = value.replace(/\\r\\n/g, \"\\n\");\n const lines = normalized.split(\"\\n\");\n while (lines.length > 0 && lines[0]?.trim() === \"\") {\n lines.shift();\n }\n while (lines.length > 0 && lines[lines.length - 1]?.trim() === \"\") {\n lines.pop();\n }\n return lines.join(\"\\n\");\n}\n\nfunction finalizeUiBlock(value: string): string {\n const normalized = normalizeUiBlock(value);\n return normalized.length === 0 ? \"\" : `${normalized}\\n`;\n}\n\nfunction visibleLength(text: string): number {\n return stripVTControlCharacters(text).length;\n}\n\nfunction readAnsiSequence(text: string, index: number): string | null {\n if (text[index] !== \"\\x1b\") {\n return null;\n }\n const match = /^\\x1b\\[[0-9;]*m/.exec(text.slice(index));\n return match?.[0] ?? null;\n}\n\nfunction splitVisiblePrefix(\n text: string,\n visibleChars: number,\n): { head: string; tail: string } {\n const target = Math.max(0, Math.floor(visibleChars));\n if (target <= 0) {\n return { head: \"\", tail: text };\n }\n\n let index = 0;\n let visible = 0;\n let head = \"\";\n while (index < text.length && visible < target) {\n const ansi = readAnsiSequence(text, index);\n if (ansi) {\n head += ansi;\n index += ansi.length;\n continue;\n }\n head += text[index] ?? \"\";\n index += 1;\n visible += 1;\n }\n\n if (head.includes(\"\\x1b[\") && !head.endsWith(ANSI_RESET)) {\n head += ANSI_RESET;\n }\n\n return {\n head,\n tail: text.slice(index),\n };\n}\n\nfunction wrapVisibleLine(text: string, width: number): string[] {\n const normalized = singleLine(text);\n const target = Math.max(1, Math.floor(width));\n if (normalized.length === 0) {\n return [\"\"];\n }\n\n const out: string[] = [];\n let remaining = normalized;\n while (visibleLength(remaining) > target) {\n const { head, tail } = splitVisiblePrefix(remaining, target);\n out.push(head);\n remaining = tail;\n }\n out.push(remaining);\n return out;\n}\n\nfunction truncate(text: string, width: number): string {\n const target = Math.max(0, Math.floor(width));\n if (target <= 0) {\n return \"\";\n }\n const value = singleLine(text);\n if (value.length <= target) {\n return value;\n }\n if (target <= 3) {\n return value.slice(0, target);\n }\n return `${value.slice(0, target - 3)}...`;\n}\n\nfunction padRight(text: string, width: number): string {\n const target = Math.max(0, Math.floor(width));\n const value = singleLine(text);\n const valueVisibleLength = visibleLength(value);\n if (valueVisibleLength >= target) {\n return splitVisiblePrefix(value, target).head;\n }\n return `${value}${\" \".repeat(target - valueVisibleLength)}`;\n}\n\nfunction center(text: string, width: number): string {\n const target = Math.max(0, Math.floor(width));\n const value = String(text ?? \"\")\n .replace(/\\r\\n/g, \"\\n\")\n .replace(/\\n/g, \" \");\n const valueLength = visibleLength(value);\n if (valueLength >= target) {\n return value;\n }\n const left = Math.floor((target - valueLength) / 2);\n const right = target - valueLength - left;\n return `${\" \".repeat(left)}${value}${\" \".repeat(right)}`;\n}\n\nexport function selectionHintsText(hints: SelectionKeyHint[]): string {\n return hints\n .map((hint) => `${dim(hint.key)} ${hint.action}`.trim())\n .join(\" \");\n}\n\nfunction resolveTerminalColumns(): number {\n return Math.max(MIN_TERMINAL_WIDTH, process.stdout.columns || 80);\n}\n\nfunction resolveMaxInnerWidth(indent = \" \"): number {\n return Math.max(\n MIN_INNER_WIDTH,\n resolveTerminalColumns() - indent.length - FRAME_OVERHEAD,\n );\n}\n\nfunction clampToTerminalInnerWidth(\n idealWidth: number,\n minWidth: number,\n indent = \" \",\n): number {\n const maxInnerWidth = resolveMaxInnerWidth(indent);\n const lowerBound = Math.min(minWidth, maxInnerWidth);\n return Math.max(lowerBound, Math.min(idealWidth, maxInnerWidth));\n}\n\nfunction resolvePanelWidth(options: {\n title: string;\n lines: string[];\n minWidth?: number;\n}): number {\n const lineLengths = options.lines.map((line) =>\n visibleLength(singleLine(line)),\n );\n return Math.max(\n options.minWidth ?? DEFAULT_PANEL_MIN_WIDTH,\n singleLine(options.title).length + 4,\n ...lineLengths,\n );\n}\n\nexport function resolveSelectionColumnWidths(\n innerWidth: number,\n targetLabelWidth: number,\n targetDescWidth: number,\n): { labelWidth: number; descWidth: number } {\n const availableColumns = Math.max(8, innerWidth - SELECTION_ROW_OVERHEAD);\n const targetTotal = Math.max(\n 8,\n targetLabelWidth + Math.max(0, targetDescWidth),\n );\n if (availableColumns >= targetTotal) {\n return {\n labelWidth: targetLabelWidth,\n descWidth: targetDescWidth,\n };\n }\n\n let labelWidth = Math.max(8, Math.floor(availableColumns * 0.6));\n let descWidth = Math.max(0, availableColumns - labelWidth);\n if (descWidth < 6 && labelWidth > 8) {\n const shift = Math.min(6 - descWidth, labelWidth - 8);\n labelWidth -= shift;\n descWidth += shift;\n }\n\n return { labelWidth, descWidth };\n}\n\nfunction renderFramedPanel(options: {\n title: string;\n width: number;\n indent: string;\n lines: string[];\n style: PanelStyle;\n}): string {\n const title = singleLine(options.title);\n const width = Math.max(1, options.width);\n const topTail = Math.max(1, width - title.length - 1);\n const bottomWidth = width + 2;\n\n const topLeft = options.style === \"rounded\" ? \"\u256D\" : \"\u250C\";\n const topRight = options.style === \"rounded\" ? \"\u256E\" : \"\u2510\";\n const bottomLeft = options.style === \"rounded\" ? \"\u2570\" : \"\u2514\";\n const bottomRight = options.style === \"rounded\" ? \"\u256F\" : \"\u2518\";\n\n const out: string[] = [];\n out.push(\n `${options.indent}${dim(\n `${topLeft}\u2500 ${title} ${\"\u2500\".repeat(topTail)}${topRight}`,\n )}`,\n );\n for (const line of options.lines) {\n for (const wrappedLine of wrapVisibleLine(line, width)) {\n out.push(\n `${options.indent}${dim(\"\u2502\")} ${padRight(wrappedLine, width)} ${dim(\n \"\u2502\",\n )}`,\n );\n }\n }\n out.push(\n `${options.indent}${dim(\n `${bottomLeft}${\"\u2500\".repeat(bottomWidth)}${bottomRight}`,\n )}`,\n );\n return out.join(\"\\n\");\n}\n\nfunction toSelectedRows(\n rows: SelectionRow[],\n selectedIds: string[],\n): Array<{ label: string; description: string }> {\n const selected = new Set(selectedIds);\n return rows\n .filter((row) => selected.has(row.id))\n .map((row) => ({\n label: row.label,\n description: row.description || \"\",\n }));\n}\n\nexport function renderPanelText(options: {\n title: string;\n lines: string[];\n style?: PanelStyle;\n minWidth?: number;\n indent?: string;\n}): string {\n const indent = options.indent || \" \";\n const idealWidth = resolvePanelWidth({\n title: options.title,\n lines: options.lines,\n minWidth: options.minWidth,\n });\n const width = clampToTerminalInnerWidth(\n idealWidth,\n options.minWidth ?? DEFAULT_PANEL_MIN_WIDTH,\n indent,\n );\n\n return finalizeUiBlock(\n renderFramedPanel({\n title: options.title,\n width,\n indent,\n lines: options.lines,\n style: options.style || \"square\",\n }),\n );\n}\n\nexport function resolveSelectionPanelLayout(options: {\n title: string;\n staticLines: string[];\n minWidth?: number;\n labelWidth: number;\n descWidth: number;\n indent?: string;\n}): { width: number; labelWidth: number; descWidth: number } {\n const indent = options.indent || \" \";\n const idealWidth = Math.max(\n resolvePanelWidth({\n title: options.title,\n lines: options.staticLines,\n minWidth: options.minWidth,\n }),\n SELECTION_ROW_OVERHEAD + options.labelWidth + options.descWidth,\n );\n const width = clampToTerminalInnerWidth(\n idealWidth,\n options.minWidth ?? DEFAULT_PANEL_MIN_WIDTH,\n indent,\n );\n const columns = resolveSelectionColumnWidths(\n width,\n options.labelWidth,\n options.descWidth,\n );\n return {\n width,\n labelWidth: columns.labelWidth,\n descWidth: columns.descWidth,\n };\n}\n\nexport function formatSelectionDisplayLine(options: {\n prefix: string;\n marker?: string;\n label: string;\n description?: string;\n labelWidth: number;\n descWidth: number;\n}): string {\n const label = options.marker\n ? padRight(truncate(options.label, options.labelWidth), options.labelWidth)\n : truncate(options.label, options.labelWidth);\n const description = truncate(options.description || \"\", options.descWidth);\n\n if (!options.marker) {\n return options.description\n ? `${options.prefix}${label} ${description}`\n : `${options.prefix}${label}`;\n }\n\n return `${options.prefix}${options.marker} ${label} ${description}`;\n}\n\nfunction renderSectionToText(section: UiSection): string {\n switch (section.type) {\n case \"banner\": {\n const logoLines = getBannerLogoLines();\n const widestLogoLine = logoLines.reduce(\n (max, line) => Math.max(max, visibleLength(line)),\n 0,\n );\n const resolvedWidth = clampToTerminalInnerWidth(\n Math.max(\n section.width ?? DEFAULT_BANNER_WIDTH,\n singleLine(section.title).length,\n widestLogoLine,\n ),\n Math.max(singleLine(section.title).length, widestLogoLine),\n );\n const border = \"\u2500\".repeat(resolvedWidth);\n const bodyLines = [\n ...logoLines.map((line) => center(line, resolvedWidth)),\n ...(logoLines.length > 0 ? [center(\"\", resolvedWidth)] : []),\n center(section.title, resolvedWidth),\n ];\n return finalizeUiBlock(\n [\n dim(`\u256D${border}\u256E`),\n ...bodyLines.map((line) => `${dim(\"\u2502\")}${line}${dim(\"\u2502\")}`),\n dim(`\u2570${border}\u256F`),\n ].join(\"\\n\"),\n );\n }\n case \"panel\": {\n return renderPanelText(section);\n }\n case \"source\":\n return finalizeUiBlock(` Skills source: ${section.source}`);\n case \"lines\":\n return finalizeUiBlock(section.lines.join(\"\\n\"));\n case \"text\":\n return finalizeUiBlock(section.text);\n default:\n return \"\";\n }\n}\n\nexport function composeUiSections(sections: UiSection[]): string {\n const normalizedSections = sections\n .map((section) => normalizeUiBlock(renderSectionToText(section)))\n .filter((section) => section.length > 0);\n if (normalizedSections.length === 0) {\n return \"\";\n }\n return `${normalizedSections.join(\"\\n\\n\")}\\n`;\n}\n\ntype HistoryEntry = {\n id: number;\n sections: UiSection[];\n};\n\ntype SessionSnapshot = {\n history: HistoryEntry[];\n liveRenderer: ((resizeTick: number) => ReactNode) | null;\n loaderLabel: string | null;\n logoHeader: AnimatedLogo | null;\n};\n\nfunction HistoryText({ text }: { text: string }) {\n return <Text>{text.replace(/\\n$/, \"\")}</Text>;\n}\n\nfunction renderPinnedLogoHeaderText(lines: string[]): string {\n const widestLogoLine = lines.reduce(\n (max, line) => Math.max(max, visibleLength(line)),\n 0,\n );\n const resolvedWidth = clampToTerminalInnerWidth(\n Math.max(PINNED_LOGO_HEADER_WIDTH, widestLogoLine),\n Math.max(1, widestLogoLine),\n );\n const bodyLines = lines.map((line) => center(line, resolvedWidth));\n return finalizeUiBlock(bodyLines.join(\"\\n\"));\n}\n\nconst AnimatedLogoHeader = React.memo(function AnimatedLogoHeader(props: {\n logo: AnimatedLogo;\n}) {\n const [frameIndex, setFrameIndex] = useState(0);\n\n useEffect(() => {\n setFrameIndex(0);\n if (props.logo.frames.length <= 1) {\n return;\n }\n const frameDurationMs = Math.max(16, Math.floor(1000 / props.logo.fps));\n const timer = setInterval(() => {\n setFrameIndex((prev) => (prev + 1) % props.logo.frames.length);\n }, frameDurationMs);\n\n return () => {\n clearInterval(timer);\n };\n }, [props.logo]);\n\n const frameLines =\n props.logo.frames[frameIndex] ?? props.logo.frames[0] ?? [];\n return (\n <Box flexDirection=\"column\" marginBottom={PINNED_LOGO_BOTTOM_MARGIN_LINES}>\n <HistoryText text={renderPinnedLogoHeaderText(frameLines)} />\n </Box>\n );\n});\n\nfunction useResizeTick(): number {\n const { stdout } = useStdout();\n const [tick, setTick] = useState(0);\n\n useEffect(() => {\n const handleResize = () => {\n setTick((prev) => prev + 1);\n };\n\n stdout.on(\"resize\", handleResize);\n return () => {\n stdout.off(\"resize\", handleResize);\n };\n }, [stdout]);\n\n return tick;\n}\n\nfunction SessionScreen(props: SessionSnapshot) {\n const resizeTick = useResizeTick();\n\n return (\n <Box flexDirection=\"column\">\n {props.logoHeader ? <AnimatedLogoHeader logo={props.logoHeader} /> : null}\n {props.history.map((entry) => (\n <HistoryText key={entry.id} text={composeUiSections(entry.sections)} />\n ))}\n {props.loaderLabel ? <Spinner label={props.loaderLabel} /> : null}\n {props.liveRenderer ? props.liveRenderer(resizeTick) : null}\n </Box>\n );\n}\n\nclass InkSession {\n private instance: Instance | null = null;\n private history: HistoryEntry[] = [];\n private liveRenderer: ((resizeTick: number) => ReactNode) | null = null;\n private loaderLabel: string | null = null;\n private logoHeader: AnimatedLogo | null = null;\n private nextId = 1;\n\n private ensureMounted(): void {\n if (this.instance) {\n return;\n }\n this.maybeInitializeGlobalLogoHeader();\n this.instance = render(<SessionScreen {...this.snapshot()} />, {\n exitOnCtrlC: false,\n patchConsole: false,\n stdin: process.stdin,\n stdout: process.stdout,\n stderr: process.stderr,\n });\n }\n\n private maybeInitializeGlobalLogoHeader(): void {\n if (this.logoHeader) {\n return;\n }\n if (!process.stdout.isTTY || Boolean(process.env.CI)) {\n return;\n }\n const animated = getAnimatedLogoFrames();\n if (!animated || animated.frames.length === 0) {\n return;\n }\n this.logoHeader = animated;\n }\n\n private snapshot(): SessionSnapshot {\n return {\n history: [...this.history],\n liveRenderer: this.liveRenderer,\n loaderLabel: this.loaderLabel,\n logoHeader: this.logoHeader,\n };\n }\n\n private sync(): void {\n this.ensureMounted();\n this.instance?.rerender(<SessionScreen {...this.snapshot()} />);\n }\n\n appendSections(sections: UiSection[]): void {\n if (sections.length === 0) {\n return;\n }\n const text = composeUiSections(sections);\n if (!text.trim()) {\n return;\n }\n this.history = [\n ...this.history,\n {\n id: this.nextId++,\n sections: [...sections],\n },\n ];\n this.sync();\n }\n\n setLiveRenderer(renderer: ((resizeTick: number) => ReactNode) | null): void {\n this.liveRenderer = renderer;\n this.sync();\n }\n\n clearLiveRenderer(): void {\n this.liveRenderer = null;\n this.sync();\n }\n\n ensureUiStarted(): void {\n this.ensureMounted();\n }\n\n isGlobalLogoHeaderEnabled(): boolean {\n return this.logoHeader !== null;\n }\n\n showLoader(label: string): void {\n this.loaderLabel = label;\n this.sync();\n }\n\n hideLoader(): void {\n if (!this.loaderLabel) {\n return;\n }\n this.loaderLabel = null;\n this.sync();\n }\n\n async close(): Promise<void> {\n this.history = [];\n this.liveRenderer = null;\n this.loaderLabel = null;\n this.logoHeader = null;\n const current = this.instance;\n this.instance = null;\n current?.unmount();\n }\n}\n\nlet activeSession: InkSession | null = null;\n\nfunction waitForNextFrame(): Promise<void> {\n return new Promise((resolve) => {\n setTimeout(resolve, 0);\n });\n}\n\nfunction getSession(): InkSession {\n if (!activeSession) {\n activeSession = new InkSession();\n }\n return activeSession;\n}\n\nexport async function renderStaticScreen(sections: UiSection[]): Promise<void> {\n const session = getSession();\n session.ensureUiStarted();\n const headerEnabled = session.isGlobalLogoHeaderEnabled();\n session.appendSections(\n headerEnabled\n ? filterBannerSectionsForGlobalMode(sections)\n : freezeBannerSections(sections, getBannerLogoLines()),\n );\n await waitForNextFrame();\n}\n\nfunction renderSectionToTextWithLogoLines(\n section: UiSection,\n logoLinesOverride: string[] | null,\n): string {\n if (section.type !== \"banner\") {\n return renderSectionToText(section);\n }\n\n const logoLines = logoLinesOverride ?? getBannerLogoLines();\n const widestLogoLine = logoLines.reduce(\n (max, line) => Math.max(max, visibleLength(line)),\n 0,\n );\n const resolvedWidth = clampToTerminalInnerWidth(\n Math.max(\n section.width ?? DEFAULT_BANNER_WIDTH,\n singleLine(section.title).length,\n widestLogoLine,\n ),\n Math.max(singleLine(section.title).length, widestLogoLine),\n );\n const border = \"\u2500\".repeat(resolvedWidth);\n const bodyLines = [\n ...logoLines.map((line) => center(line, resolvedWidth)),\n ...(logoLines.length > 0 ? [center(\"\", resolvedWidth)] : []),\n center(section.title, resolvedWidth),\n ];\n return finalizeUiBlock(\n [\n `\u256D${border}\u256E`,\n ...bodyLines.map((line) => `\u2502${line}\u2502`),\n `\u2570${border}\u256F`,\n ].join(\"\\n\"),\n );\n}\n\nfunction freezeBannerSections(\n sections: UiSection[],\n logoLines: string[],\n): UiSection[] {\n return sections.map((section) => {\n if (section.type !== \"banner\") {\n return section;\n }\n return {\n type: \"text\",\n text: renderSectionToTextWithLogoLines(section, logoLines),\n };\n });\n}\n\nexport function filterBannerSectionsForGlobalMode(\n sections: UiSection[],\n): UiSection[] {\n return sections.filter((section) => section.type !== \"banner\");\n}\n\nexport function setLiveScreen(\n renderer: ((resizeTick: number) => ReactNode) | null,\n): void {\n getSession().setLiveRenderer(renderer);\n}\n\nexport function clearLiveScreen(): void {\n activeSession?.clearLiveRenderer();\n}\n\nexport function showLoader(label = \"loading\"): void {\n getSession().showLoader(label);\n}\n\nexport function hideLoader(): void {\n activeSession?.hideLoader();\n}\n\nexport async function flushUiFrame(): Promise<void> {\n await waitForNextFrame();\n}\n\nexport async function finalizeUiSession(): Promise<void> {\n if (!activeSession) {\n return;\n }\n await waitForNextFrame();\n const session = activeSession;\n activeSession = null;\n await session.close();\n}\n\nexport function bannerSection(title: string, width?: number): UiSection {\n return { type: \"banner\", title, width };\n}\n\nexport function panelSection(options: {\n title: string;\n lines: string[];\n style?: PanelStyle;\n minWidth?: number;\n indent?: string;\n}): UiSection {\n return { type: \"panel\", ...options };\n}\n\nexport function linesSection(lines: string[]): UiSection {\n return { type: \"lines\", lines };\n}\n\nexport function statusStepsSection(\n steps: Array<{ status: StepStatus; label: string }>,\n): UiSection {\n return linesSection(\n steps.map(({ status, label }) => {\n const marker =\n status === \"failed\"\n ? colorToken(\"x\", \"danger\")\n : colorToken(\"\u2713\", \"success\");\n return ` ${marker} ${singleLine(label)}`;\n }),\n );\n}\n\nexport function completedStepsSection(steps: string[]): UiSection {\n return statusStepsSection(\n steps.map((step) => ({ status: \"completed\" as const, label: step })),\n );\n}\n\nexport function failedStepsSection(steps: string[]): UiSection {\n return statusStepsSection(\n steps.map((step) => ({ status: \"failed\" as const, label: step })),\n );\n}\n\nexport function sourceSection(source: string): UiSection {\n return { type: \"source\", source };\n}\n\nexport function textSection(text: string): UiSection {\n return { type: \"text\", text };\n}\n\nexport function completionSummarySection(options: {\n skillCount: number;\n agentCount: number;\n}): UiSection {\n const skillLabel = options.skillCount === 1 ? \"skill\" : \"skills\";\n const agentLabel = options.agentCount === 1 ? \"agent\" : \"agents\";\n return linesSection([\n \"Done.\",\n `Installed ${options.skillCount} ${skillLabel} across ${options.agentCount} ${agentLabel}.`,\n ]);\n}\n\nexport function removeCompletionSummarySection(\n removedCount: number,\n): UiSection {\n return linesSection([\"Done.\", `Total removed: ${removedCount}`]);\n}\n\nexport function installationSummarySection(options: {\n mode: \"copy\" | \"symlink\";\n scope: string;\n skillCount: number;\n agentCount: number;\n targetCount: number;\n targets: Array<{\n skillName: string;\n agentDisplayName: string;\n destinationPath: string;\n mode: \"copy\" | \"symlink\";\n }>;\n}): UiSection {\n const lines: string[] = [\n `${bold(\"Mode:\")} ${dim(options.mode)} ${bold(\"Scope:\")} ${dim(\n options.scope,\n )} ${bold(\"Skills:\")} ${colorToken(\n options.skillCount.toString(),\n \"primary\",\n )} ${bold(\"Agents:\")} ${colorToken(\n options.agentCount.toString(),\n \"primary\",\n )} ${bold(\"Targets:\")} ${colorToken(\n options.targetCount.toString(),\n \"primary\",\n )}`,\n \"\",\n bold(\"Targets:\"),\n ];\n\n let activeSkill = \"\";\n for (const row of options.targets) {\n if (row.skillName !== activeSkill) {\n activeSkill = row.skillName;\n lines.push(\"\");\n lines.push(colorToken(` ${row.skillName}`, \"primary\"));\n }\n lines.push(\n ` - ${row.agentDisplayName.padEnd(16, \" \")} ${dim(\n shortenHomePath(row.destinationPath),\n )} ${dim(`[${row.mode}]`)}`,\n );\n }\n\n return panelSection({\n title: \"Installation Summary\",\n lines,\n style: \"rounded\",\n minWidth: 72,\n });\n}\n\nexport function uninstallSummarySection(options: {\n globalInstall: boolean;\n skillNames: string[];\n agentDisplayNames: string[];\n}): UiSection {\n return panelSection({\n title: \"Uninstall Summary\",\n lines: [\n `Scope: ${options.globalInstall ? \"global\" : \"current project\"}`,\n \"\",\n `Skills (${options.skillNames.length}):`,\n ...options.skillNames.map((name) => ` - ${name}`),\n \"\",\n `Agents (${options.agentDisplayNames.length}): ${compactAgentDisplayNames(\n [...options.agentDisplayNames].sort((a, b) => a.localeCompare(b)),\n 4,\n )}`,\n ],\n style: \"rounded\",\n minWidth: 74,\n });\n}\n\nexport function manySelectionClosedSection(\n config: Pick<\n ManySelectionViewConfig,\n \"title\" | \"labelWidth\" | \"descWidth\" | \"minWidth\"\n >,\n rows: SelectionRow[],\n selectedIds: string[],\n): UiSection {\n const selectedRows = toSelectedRows(rows, selectedIds);\n const layout = resolveSelectionPanelLayout({\n title: config.title,\n staticLines: [],\n minWidth: config.minWidth,\n labelWidth: config.labelWidth,\n descWidth: config.descWidth,\n });\n\n const lines: string[] = [];\n if (selectedRows.length === 0) {\n lines.push(\" \u25CB (none)\");\n } else {\n for (const row of selectedRows) {\n lines.push(\n formatSelectionDisplayLine({\n prefix: \" \",\n marker: colorToken(\"\u25CF\", \"primary\"),\n label: row.label,\n description: row.description,\n labelWidth: layout.labelWidth,\n descWidth: layout.descWidth,\n }),\n );\n }\n }\n\n return panelSection({\n title: config.title,\n lines,\n style: \"square\",\n minWidth: config.minWidth,\n });\n}\n\nexport function singleSelectionClosedSection(\n config: Pick<SingleSelectionViewConfig, \"title\" | \"minWidth\">,\n selectedLabel: string,\n): UiSection {\n return panelSection({\n title: config.title,\n lines: [` \u25B8 ${singleLine(selectedLabel)}`],\n style: \"square\",\n minWidth: config.minWidth,\n });\n}\n\nexport class PromptCancelledError extends Error {\n constructor(message = \"Interactive prompt cancelled by user\") {\n super(message);\n this.name = \"PromptCancelledError\";\n }\n}\n\nfunction TextInputScreen(props: {\n message: string;\n defaultValue?: string;\n onSubmit: (value: string) => void;\n onCancel: (error: Error) => void;\n}) {\n const [value, setValue] = useState(props.defaultValue || \"\");\n\n useInput((input, key) => {\n if (key.ctrl && input === \"c\") {\n props.onCancel(new PromptCancelledError());\n return;\n }\n if (key.escape) {\n props.onCancel(new PromptCancelledError());\n return;\n }\n if (key.return) {\n props.onSubmit(value);\n return;\n }\n if (key.backspace || key.delete) {\n setValue((prev) => [...prev].slice(0, -1).join(\"\"));\n return;\n }\n if (!key.ctrl && !key.meta && input) {\n setValue((prev) => `${prev}${input}`);\n }\n });\n\n return (\n <Box flexDirection=\"column\">\n <Text>{`${props.message}: ${value}`}</Text>\n <Text dimColor>enter confirm esc cancel</Text>\n </Box>\n );\n}\n\nexport async function runTextInputScreen(options: {\n message: string;\n defaultValue?: string;\n}): Promise<string> {\n return new Promise<string>((resolve, reject) => {\n setLiveScreen(() => (\n <TextInputScreen\n message={options.message}\n defaultValue={options.defaultValue}\n onSubmit={(value) => {\n clearLiveScreen();\n resolve(value);\n }}\n onCancel={(error) => {\n clearLiveScreen();\n reject(error);\n }}\n />\n ));\n });\n}\n\nexport function Spinner({ label }: { label: string }) {\n const frames = [\"\u280B\", \"\u2819\", \"\u2839\", \"\u2838\", \"\u283C\", \"\u2834\", \"\u2826\", \"\u2827\", \"\u2807\", \"\u280F\"];\n const [frameIndex, setFrameIndex] = useState(0);\n\n useEffect(() => {\n const timer = setInterval(() => {\n setFrameIndex((prev) => (prev + 1) % frames.length);\n }, 80);\n return () => clearInterval(timer);\n }, []);\n\n return (\n <Text>{` ${colorToken(frames[frameIndex], \"primary\")} ${label}`}</Text>\n );\n}\n", "import os from \"node:os\";\nimport path from \"node:path\";\nimport { colorToken } from \"./colors\";\n\nexport function shortenHomePath(value: string, homeDir: string = os.homedir()) {\n if (value === homeDir || value.startsWith(`${homeDir}${path.sep}`)) {\n return `~${value.slice(homeDir.length)}`;\n }\n return value;\n}\n\nexport function compactAgentDisplayNames(\n names: string[],\n maxVisible = 4,\n): string {\n if (names.length <= maxVisible) {\n return names.join(\", \");\n }\n return `${names.slice(0, maxVisible).join(\", \")} +${\n names.length - maxVisible\n } more`;\n}\n\nexport function formatDriftChips(options: {\n plusCount: number;\n minusCount: number;\n colorEnabled?: boolean;\n}): string {\n const plus = `+${Math.max(0, options.plusCount)}`;\n const minus = `-${Math.max(0, options.minusCount)}`;\n const colorEnabled = options.colorEnabled !== false;\n if (!colorEnabled) {\n return `${plus} ${minus}`;\n }\n return `${colorToken(plus, \"success\", colorEnabled)} ${colorToken(\n minus,\n \"danger\",\n colorEnabled,\n )}`;\n}\n", "export type ColorToken =\n | \"primary\"\n | \"success\"\n | \"danger\"\n | \"warning\"\n | \"accent\"\n | \"muted\"\n | \"info\";\n\nconst ANSI_ESCAPE = \"\\x1b[\";\nexport const ANSI_RESET = \"\\x1b[0m\";\n\nexport const COLOR_TOKENS: Record<ColorToken, string> = {\n primary: \"38;2;86;172;235\",\n success: \"32\",\n danger: \"31\",\n warning: \"33\",\n accent: \"35\",\n muted: \"90\",\n info: \"36\",\n};\n\nfunction isColorEnabled(explicit?: boolean): boolean {\n if (typeof explicit === \"boolean\") {\n return explicit;\n }\n return Boolean(process.stdout.isTTY) && !process.env.NO_COLOR;\n}\n\nexport function ansiStyle(\n text: string,\n code: string,\n colorEnabled?: boolean,\n): string {\n if (!isColorEnabled(colorEnabled)) {\n return text;\n }\n return `${ANSI_ESCAPE}${code}m${text}${ANSI_RESET}`;\n}\n\nexport function colorToken(\n text: string,\n token: ColorToken,\n colorEnabled?: boolean,\n): string {\n return ansiStyle(text, COLOR_TOKENS[token], colorEnabled);\n}\n\nexport function bold(text: string, colorEnabled?: boolean): string {\n return ansiStyle(text, \"1\", colorEnabled);\n}\n\nexport function dim(text: string, colorEnabled?: boolean): string {\n return ansiStyle(text, \"2\", colorEnabled);\n}\n", "import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\ntype LogoCell = {\n x: number;\n y: number;\n char: string;\n color?: string;\n bgColor?: string;\n};\n\ntype LogoFrame = {\n cells?: LogoCell[];\n};\n\ntype LogoSession = {\n canvas?: {\n width?: number;\n height?: number;\n };\n animation?: {\n frameRate?: number;\n };\n frames?: LogoFrame[];\n};\n\nexport type AnimatedLogo = {\n fps: number;\n frames: string[][];\n};\n\nconst DEFAULT_LOGO_FPS = 12;\nconst EMPTY_TEXT_ONLY_LOGO: string[] = [];\n\nlet animatedCache: AnimatedLogo | null | undefined;\nlet staticCache: string[] | null | undefined;\n\nfunction resolveLogoDir(): string {\n const dirname = path.dirname(fileURLToPath(import.meta.url));\n return path.resolve(dirname, \"../assets/ascii/logo\");\n}\n\nfunction resolveSessionPath(): string {\n const customPath = process.env.SKILLSPP_LOGO_SESSION_PATH;\n return (\n customPath || path.join(resolveLogoDir(), \"skillspp-logo.session.json\")\n );\n}\n\nfunction resolveStaticPath(): string {\n const customPath = process.env.SKILLSPP_LOGO_TEXT_PATH;\n return customPath || path.join(resolveLogoDir(), \"skillspp-logo.txt\");\n}\n\nfunction trimOuterEmptyRows(lines: string[]): string[] {\n let start = 0;\n let end = lines.length - 1;\n while (start <= end && lines[start]?.trim().length === 0) {\n start += 1;\n }\n while (end >= start && lines[end]?.trim().length === 0) {\n end -= 1;\n }\n return lines.slice(start, end + 1);\n}\n\nfunction parseTextLogo(rawText: string): string[] | null {\n const lines = rawText.replace(/\\r\\n/g, \"\\n\").split(\"\\n\");\n while (lines.length > 0 && lines[lines.length - 1] === \"\") {\n lines.pop();\n }\n const trimmed = trimOuterEmptyRows(lines);\n if (trimmed.length === 0) {\n return null;\n }\n return trimmed;\n}\n\nfunction parseSessionLogo(rawText: string): AnimatedLogo | null {\n const parsed = JSON.parse(rawText) as LogoSession;\n const width = Math.max(1, parsed.canvas?.width ?? 48);\n const height = Math.max(1, parsed.canvas?.height ?? 16);\n const fps = Math.max(1, parsed.animation?.frameRate ?? DEFAULT_LOGO_FPS);\n const sourceFrames = parsed.frames ?? [];\n if (sourceFrames.length === 0) {\n return null;\n }\n\n const renderedFrames: string[][] = [];\n for (const frame of sourceFrames) {\n const grid = Array.from({ length: height }, () => Array(width).fill(\" \"));\n for (const cell of frame.cells ?? []) {\n if (\n cell &&\n Number.isInteger(cell.x) &&\n Number.isInteger(cell.y) &&\n typeof cell.char === \"string\" &&\n cell.char.length > 0 &&\n cell.x >= 0 &&\n cell.x < width &&\n cell.y >= 0 &&\n cell.y < height\n ) {\n grid[cell.y][cell.x] = colorizeChar(\n normalizeLogoChar(cell.char[0] ?? \" \"),\n cell.color ?? null,\n );\n }\n }\n const lines = grid.map((row) => row.join(\"\"));\n const trimmed = trimOuterEmptyRows(lines);\n if (trimmed.length > 0) {\n renderedFrames.push(trimmed);\n }\n }\n\n if (renderedFrames.length === 0) {\n return null;\n }\n\n return { fps, frames: renderedFrames };\n}\n\nfunction normalizeLogoChar(char: string): string {\n // Prevent hash-style fallback logos by normalizing legacy glyphs to blocks.\n if (char === \"#\") {\n return \"\u2588\";\n }\n return char;\n}\n\nfunction colorizeChar(char: string, hexColor: string | null): string {\n if (!hexColor) {\n return char;\n }\n const rgb = parseHexColor(hexColor);\n if (!rgb) {\n return char;\n }\n return `\\x1b[38;2;${rgb.r};${rgb.g};${rgb.b}m${char}\\x1b[0m`;\n}\n\nfunction parseHexColor(\n color: string,\n): { r: number; g: number; b: number } | null {\n const value = color.trim();\n const short = /^#([0-9a-fA-F]{3})$/;\n const full = /^#([0-9a-fA-F]{6})$/;\n if (short.test(value)) {\n const raw = short.exec(value)?.[1];\n if (!raw) {\n return null;\n }\n return {\n r: Number.parseInt(`${raw[0]}${raw[0]}`, 16),\n g: Number.parseInt(`${raw[1]}${raw[1]}`, 16),\n b: Number.parseInt(`${raw[2]}${raw[2]}`, 16),\n };\n }\n if (full.test(value)) {\n const raw = full.exec(value)?.[1];\n if (!raw) {\n return null;\n }\n return {\n r: Number.parseInt(raw.slice(0, 2), 16),\n g: Number.parseInt(raw.slice(2, 4), 16),\n b: Number.parseInt(raw.slice(4, 6), 16),\n };\n }\n return null;\n}\n\nfunction readFileSafe(filePath: string): string | null {\n try {\n if (!fs.existsSync(filePath)) {\n return null;\n }\n return fs.readFileSync(filePath, \"utf8\");\n } catch {\n return null;\n }\n}\n\nexport function resetLogoCache(): void {\n animatedCache = undefined;\n staticCache = undefined;\n}\n\nexport function getAnimatedLogoFrames(): AnimatedLogo | null {\n if (animatedCache !== undefined) {\n return animatedCache;\n }\n\n const rawText = readFileSafe(resolveSessionPath());\n if (!rawText) {\n animatedCache = null;\n return animatedCache;\n }\n\n try {\n animatedCache = parseSessionLogo(rawText);\n } catch {\n animatedCache = null;\n }\n return animatedCache;\n}\n\nexport function getStaticLogoLines(): string[] | null {\n if (staticCache !== undefined) {\n return staticCache;\n }\n\n const rawText = readFileSafe(resolveStaticPath());\n if (!rawText) {\n staticCache = null;\n return staticCache;\n }\n\n staticCache = parseTextLogo(rawText);\n return staticCache;\n}\n\nexport function getBannerLogoLines(): string[] {\n const animated = getAnimatedLogoFrames();\n if (animated && animated.frames.length > 0) {\n return animated.frames[0] ?? EMPTY_TEXT_ONLY_LOGO;\n }\n return getStaticLogoLines() ?? EMPTY_TEXT_ONLY_LOGO;\n}\n", "import { useMemo, useState } from \"react\";\nimport { Box, Text, useInput } from \"ink\";\nimport {\n clearLiveScreen,\n PromptCancelledError,\n type ManySelectionViewConfig,\n type SelectionKeyHint,\n type SingleSelectionViewConfig,\n type UiSection,\n formatSelectionDisplayLine,\n renderPanelText,\n renderStaticScreen,\n resolveSelectionPanelLayout,\n selectionHintsText,\n setLiveScreen,\n} from \"./screens\";\nimport { colorToken, dim } from \"./colors\";\nimport type { SelectionRow } from \"@skillspp/core/agents\";\n\nexport type {\n ManySelectionViewConfig,\n SelectionKeyHint,\n SingleSelectionViewConfig,\n} from \"./screens\";\n\ntype StepPromptBase = {\n title: string;\n required?: boolean;\n requiredMessage?: string;\n searchable?: boolean;\n keyHints?: SelectionKeyHint[];\n};\n\ntype RunManySelectionStepOptions = {\n interactive: boolean;\n rows: SelectionRow[];\n selectedIds?: string[];\n shouldPrompt: boolean;\n prompt: StepPromptBase & {\n initialSelectedIds?: string[];\n view: ManySelectionViewConfig;\n };\n renderClosed: (selectedIds: string[]) => UiSection;\n};\n\ntype RunOneSelectionStepOptions = {\n interactive: boolean;\n rows: SelectionRow[];\n selectedId?: string;\n shouldPrompt: boolean;\n prompt: StepPromptBase & {\n initialSelectedId?: string;\n view: SingleSelectionViewConfig;\n };\n renderClosed: (selectedId: string) => UiSection;\n};\n\nexport type SelectableRowState = SelectionRow & {\n selected: boolean;\n};\n\ntype SelectionRenderModel = {\n title: string;\n rows: SelectionRow[];\n visibleRowIds: string[];\n activeVisibleIndex: number;\n selectedIds: string[];\n searchable: boolean;\n required: boolean;\n searchTerm: string;\n errorMessage?: string;\n keyHints: SelectionKeyHint[];\n};\n\ntype VisibleSelectionRow = {\n id: string;\n label: string;\n description: string;\n active: boolean;\n selected: boolean;\n};\n\nconst DEFAULT_REQUIRED_MESSAGE = \"At least one choice must be selected\";\n\nfunction assertPromptAllowed(\n shouldPrompt: boolean,\n interactive: boolean,\n): void {\n if (shouldPrompt && !interactive) {\n throw new Error(\"Selection prompt requested in non-interactive mode.\");\n }\n}\n\nexport function filterSelectionRowIndexes(\n rows: SelectableRowState[],\n searchTerm: string,\n): number[] {\n const normalized = searchTerm.trim().toLocaleLowerCase(\"en-US\");\n if (!normalized) {\n return rows.map((_, index) => index);\n }\n\n return rows.reduce<number[]>((acc, row, index) => {\n const haystack = `${row.label} ${row.description || \"\"}`.toLocaleLowerCase(\n \"en-US\",\n );\n if (haystack.includes(normalized)) {\n acc.push(index);\n }\n return acc;\n }, []);\n}\n\nexport function toggleSelectionAtVisibleIndex(\n rows: SelectableRowState[],\n visibleIndexes: number[],\n visibleIndex: number,\n): SelectableRowState[] {\n const targetIndex = visibleIndexes[visibleIndex];\n if (typeof targetIndex !== \"number\") {\n return rows;\n }\n\n return rows.map((row, index) =>\n index === targetIndex ? { ...row, selected: !row.selected } : row,\n );\n}\n\nexport function setAllRowsSelected(\n rows: SelectableRowState[],\n selected: boolean,\n): SelectableRowState[] {\n return rows.map((row) => ({ ...row, selected }));\n}\n\nexport function invertRowsSelection(\n rows: SelectableRowState[],\n): SelectableRowState[] {\n return rows.map((row) => ({ ...row, selected: !row.selected }));\n}\n\nexport function clampActiveVisibleIndex(\n activeVisibleIndex: number,\n visibleCount: number,\n): number {\n if (visibleCount <= 0) {\n return 0;\n }\n if (activeVisibleIndex < 0) {\n return 0;\n }\n if (activeVisibleIndex >= visibleCount) {\n return visibleCount - 1;\n }\n return activeVisibleIndex;\n}\n\nfunction selectedRowIds(rows: SelectableRowState[]): string[] {\n return rows.filter((row) => row.selected).map((row) => row.id);\n}\n\nfunction toVisibleRows(model: SelectionRenderModel): VisibleSelectionRow[] {\n const rows = new Map(model.rows.map((row) => [row.id, row]));\n const selected = new Set(model.selectedIds);\n return model.visibleRowIds.map((rowId, index) => {\n const row = rows.get(rowId) || { id: rowId, label: rowId, description: \"\" };\n return {\n id: row.id,\n label: row.label,\n description: row.description || \"\",\n active: index === model.activeVisibleIndex,\n selected: selected.has(row.id),\n };\n });\n}\n\nfunction buildRenderModel(options: {\n request: StepPromptBase;\n rows: SelectableRowState[];\n visibleIndexes: number[];\n activeVisibleIndex: number;\n searchTerm: string;\n errorMessage?: string;\n selectedIds?: string[];\n}): SelectionRenderModel {\n return {\n title: options.request.title,\n rows: options.rows.map((row) => ({\n id: row.id,\n label: row.label,\n description: row.description,\n })),\n visibleRowIds: options.visibleIndexes.map(\n (index) => options.rows[index].id,\n ),\n activeVisibleIndex: options.activeVisibleIndex,\n selectedIds: options.selectedIds ?? selectedRowIds(options.rows),\n searchable: Boolean(options.request.searchable),\n required: options.request.required !== false,\n searchTerm: options.searchTerm,\n errorMessage: options.errorMessage,\n keyHints: options.request.keyHints || [],\n };\n}\n\nfunction normalizeSearchTerm(next: string): string {\n return next.replace(/\\r\\n/g, \" \").replace(/[\\r\\n]/g, \" \");\n}\n\nfunction appendSearchChar(current: string, text: string): string {\n return normalizeSearchTerm(`${current}${text}`);\n}\n\nexport function renderManySelectionOpenPanel(\n config: ManySelectionViewConfig,\n model: SelectionRenderModel,\n): string {\n const visibleRows = toVisibleRows(model);\n const hintLine = selectionHintsText(\n model.keyHints.length > 0 ? model.keyHints : config.defaultHints,\n );\n const staticLines = [config.countLine, config.instructionLine, hintLine];\n if (model.searchable && model.searchTerm.trim().length > 0) {\n staticLines.push(`Search: ${model.searchTerm}`);\n }\n if (model.errorMessage) {\n staticLines.push(`! ${model.errorMessage}`);\n }\n\n const layout = resolveSelectionPanelLayout({\n title: config.title,\n staticLines,\n minWidth: config.minWidth,\n labelWidth: config.labelWidth,\n descWidth: config.descWidth,\n });\n\n const lines: string[] = [];\n lines.push(config.countLine);\n if (config.instructionLine) {\n lines.push(config.instructionLine);\n }\n lines.push(\"\");\n\n if (model.searchable && model.searchTerm !== \"\") {\n lines.push(`Search: ${model.searchTerm}`);\n lines.push(\"\");\n }\n\n if (visibleRows.length === 0) {\n lines.push(\" (no matches)\");\n } else {\n for (const row of visibleRows) {\n const prefix = ` ${row.active ? \"\u203A\" : \" \"} `;\n const marker = row.selected ? colorToken(\"\u25CF\", \"primary\") : \"\u25CB\";\n const content = formatSelectionDisplayLine({\n prefix: \"\",\n label: row.label,\n description: row.description,\n labelWidth: layout.labelWidth,\n descWidth: layout.descWidth,\n });\n const renderedRow = `${prefix}${marker} ${\n row.active || row.selected ? content : dim(content)\n }`;\n lines.push(renderedRow);\n }\n }\n\n lines.push(\"\");\n lines.push(` ${hintLine}`);\n if (model.errorMessage) {\n lines.push(` ! ${model.errorMessage}`);\n }\n\n return renderPanelText({\n title: config.title,\n lines,\n style: \"square\",\n minWidth: config.minWidth,\n });\n}\n\nexport function renderSingleSelectionOpenPanel(\n config: SingleSelectionViewConfig,\n model: SelectionRenderModel,\n): string {\n const visibleRows = toVisibleRows(model);\n const maxLabelWidth = visibleRows.reduce(\n (max, row) => Math.max(max, row.label.length),\n 8,\n );\n const maxDescWidth = visibleRows.reduce(\n (max, row) => Math.max(max, row.description.length),\n 0,\n );\n const layout = resolveSelectionPanelLayout({\n title: config.title,\n staticLines: [config.instructionLine, \"\u2191\u2193 navigate enter confirm\"],\n minWidth: config.minWidth,\n labelWidth: maxLabelWidth,\n descWidth: maxDescWidth,\n });\n\n const lines: string[] = [config.instructionLine, \"\"];\n for (const row of visibleRows) {\n const renderedRow = formatSelectionDisplayLine({\n prefix: ` ${row.active ? \"\u25B8\" : \" \"} `,\n label: row.label,\n description: row.description || undefined,\n labelWidth: layout.labelWidth,\n descWidth: layout.descWidth,\n });\n lines.push(row.active ? renderedRow : dim(renderedRow));\n }\n lines.push(\"\");\n lines.push(\" \u2191\u2193 navigate enter confirm\");\n if (model.errorMessage) {\n lines.push(` ! ${model.errorMessage}`);\n }\n\n return renderPanelText({\n title: config.title,\n lines,\n style: \"square\",\n minWidth: config.minWidth,\n });\n}\n\ntype SelectionRendererProps = {\n content: string;\n};\n\nfunction SelectionRenderer({ content }: SelectionRendererProps) {\n return (\n <Box flexDirection=\"column\">\n <Text>{content.replace(/\\n$/, \"\")}</Text>\n </Box>\n );\n}\n\nfunction MultiSelectPrompt(props: {\n options: RunManySelectionStepOptions[\"prompt\"];\n rows: SelectionRow[];\n selectedIds?: string[];\n onSubmit: (selectedIds: string[]) => void;\n onCancel: (error: Error) => void;\n}) {\n const initialSelectedIds = new Set(\n props.options.initialSelectedIds || props.selectedIds || [],\n );\n const [rows, setRows] = useState<SelectableRowState[]>(\n props.rows.map((row) => ({\n ...row,\n selected: initialSelectedIds.has(row.id),\n })),\n );\n const [searchTerm, setSearchTerm] = useState(\"\");\n const [activeVisibleIndex, setActiveVisibleIndex] = useState(0);\n const [errorMessage, setErrorMessage] = useState<string | undefined>();\n const visibleIndexes = useMemo(\n () =>\n filterSelectionRowIndexes(\n rows,\n props.options.searchable !== false ? searchTerm : \"\",\n ),\n [rows, searchTerm, props.options.searchable],\n );\n const clampedIndex = clampActiveVisibleIndex(\n activeVisibleIndex,\n visibleIndexes.length,\n );\n\n useInput((input, key) => {\n if (key.ctrl && input === \"c\") {\n props.onCancel(new PromptCancelledError());\n return;\n }\n if (key.escape) {\n props.onCancel(new PromptCancelledError());\n return;\n }\n if (key.upArrow) {\n if (visibleIndexes.length > 0) {\n setActiveVisibleIndex(\n (clampedIndex - 1 + visibleIndexes.length) % visibleIndexes.length,\n );\n }\n setErrorMessage(undefined);\n return;\n }\n if (key.downArrow) {\n if (visibleIndexes.length > 0) {\n setActiveVisibleIndex((clampedIndex + 1) % visibleIndexes.length);\n }\n setErrorMessage(undefined);\n return;\n }\n if (input === \" \") {\n setRows((prev) =>\n toggleSelectionAtVisibleIndex(prev, visibleIndexes, clampedIndex),\n );\n setErrorMessage(undefined);\n return;\n }\n if (key.ctrl && input === \"a\") {\n setRows((prev) => {\n const shouldSelectAll = prev.some((row) => !row.selected);\n return setAllRowsSelected(prev, shouldSelectAll);\n });\n setErrorMessage(undefined);\n return;\n }\n if (key.ctrl && input === \"l\") {\n setRows((prev) => invertRowsSelection(prev));\n setErrorMessage(undefined);\n return;\n }\n if (key.backspace || key.delete) {\n if (props.options.searchable !== false) {\n setSearchTerm((prev) => [...prev].slice(0, -1).join(\"\"));\n setActiveVisibleIndex(0);\n setErrorMessage(undefined);\n }\n return;\n }\n if (key.return) {\n const selectedIds = selectedRowIds(rows);\n if ((props.options.required ?? true) && selectedIds.length === 0) {\n setErrorMessage(\n props.options.requiredMessage || DEFAULT_REQUIRED_MESSAGE,\n );\n return;\n }\n props.onSubmit(selectedIds);\n return;\n }\n if (\n props.options.searchable !== false &&\n input &&\n !key.ctrl &&\n !key.meta &&\n input !== \" \"\n ) {\n setSearchTerm((prev) => appendSearchChar(prev, input));\n setActiveVisibleIndex(0);\n setErrorMessage(undefined);\n }\n });\n\n const model = buildRenderModel({\n request: props.options,\n rows,\n visibleIndexes,\n activeVisibleIndex: clampedIndex,\n searchTerm,\n errorMessage,\n });\n const content = renderManySelectionOpenPanel(\n {\n ...props.options.view,\n countLine: `${model.rows.length} ${props.options.view.countLine}`,\n },\n model,\n );\n\n return <SelectionRenderer content={content} />;\n}\n\nfunction SingleSelectPrompt(props: {\n options: RunOneSelectionStepOptions[\"prompt\"];\n rows: SelectionRow[];\n selectedId?: string;\n onSubmit: (selectedId: string) => void;\n onCancel: (error: Error) => void;\n}) {\n const initialSelectedId = props.options.initialSelectedId || props.selectedId;\n const initialIndex = Math.max(\n 0,\n props.rows.findIndex((row) => row.id === initialSelectedId),\n );\n const [activeVisibleIndex, setActiveVisibleIndex] = useState(initialIndex);\n const [errorMessage, setErrorMessage] = useState<string | undefined>();\n\n useInput((input, key) => {\n if (key.ctrl && input === \"c\") {\n props.onCancel(new PromptCancelledError());\n return;\n }\n if (key.escape) {\n props.onCancel(new PromptCancelledError());\n return;\n }\n if (key.upArrow) {\n setActiveVisibleIndex((prev) =>\n props.rows.length === 0\n ? 0\n : (prev - 1 + props.rows.length) % props.rows.length,\n );\n setErrorMessage(undefined);\n return;\n }\n if (key.downArrow) {\n setActiveVisibleIndex((prev) =>\n props.rows.length === 0 ? 0 : (prev + 1) % props.rows.length,\n );\n setErrorMessage(undefined);\n return;\n }\n if (key.return) {\n const selectedId = props.rows[activeVisibleIndex]?.id || \"\";\n if ((props.options.required ?? true) && !selectedId) {\n setErrorMessage(\n props.options.requiredMessage || DEFAULT_REQUIRED_MESSAGE,\n );\n return;\n }\n props.onSubmit(selectedId);\n }\n });\n\n const visibleIndexes = props.rows.map((_, index) => index);\n const selectedId = props.rows[activeVisibleIndex]?.id || \"\";\n const model = buildRenderModel({\n request: props.options,\n rows: props.rows.map((row) => ({\n ...row,\n selected: row.id === selectedId,\n })),\n visibleIndexes,\n activeVisibleIndex,\n searchTerm: \"\",\n errorMessage,\n selectedIds: selectedId ? [selectedId] : [],\n });\n const content = renderSingleSelectionOpenPanel(props.options.view, model);\n return <SelectionRenderer content={content} />;\n}\n\nexport async function runManySelectionStep(\n options: RunManySelectionStepOptions,\n): Promise<string[]> {\n assertPromptAllowed(options.shouldPrompt, options.interactive);\n\n let selectedIds = options.selectedIds || [];\n if (options.shouldPrompt) {\n selectedIds = await new Promise<string[]>((resolve, reject) => {\n setLiveScreen(() => (\n <MultiSelectPrompt\n options={options.prompt}\n rows={options.rows}\n selectedIds={selectedIds}\n onSubmit={(result) => {\n clearLiveScreen();\n resolve(result);\n }}\n onCancel={(error) => {\n clearLiveScreen();\n reject(error);\n }}\n />\n ));\n });\n }\n\n if (options.prompt.required !== false && selectedIds.length === 0) {\n throw new Error(options.prompt.requiredMessage || DEFAULT_REQUIRED_MESSAGE);\n }\n\n await renderStaticScreen([options.renderClosed(selectedIds)]);\n return selectedIds;\n}\n\nexport async function runOneSelectionStep(\n options: RunOneSelectionStepOptions,\n): Promise<string> {\n assertPromptAllowed(options.shouldPrompt, options.interactive);\n\n let selectedId = options.selectedId || \"\";\n if (options.shouldPrompt) {\n selectedId = await new Promise<string>((resolve, reject) => {\n setLiveScreen(() => (\n <SingleSelectPrompt\n options={options.prompt}\n rows={options.rows}\n selectedId={selectedId}\n onSubmit={(result) => {\n clearLiveScreen();\n resolve(result);\n }}\n onCancel={(error) => {\n clearLiveScreen();\n reject(error);\n }}\n />\n ));\n });\n }\n\n if (options.prompt.required !== false && !selectedId) {\n throw new Error(options.prompt.requiredMessage || DEFAULT_REQUIRED_MESSAGE);\n }\n\n await renderStaticScreen([options.renderClosed(selectedId)]);\n return selectedId;\n}\n", "import { runTextInputScreen, PromptCancelledError } from \"./ui/screens\";\n\nexport { PromptCancelledError };\n\nexport function isPromptCancelledError(error: unknown): boolean {\n return error instanceof PromptCancelledError;\n}\n\nexport function canUseInteractive(nonInteractive?: boolean): boolean {\n if (nonInteractive) {\n return false;\n }\n\n return Boolean(process.stdin.isTTY && process.stdout.isTTY);\n}\n\nfunction mapPromptError(error: unknown): never {\n if (error instanceof Error && error.name === \"ExitPromptError\") {\n throw new PromptCancelledError();\n }\n throw error;\n}\n\nexport async function askText(\n message: string,\n defaultValue?: string\n): Promise<string> {\n try {\n return await runTextInputScreen({\n message,\n defaultValue,\n });\n } catch (error) {\n mapPromptError(error);\n }\n}\n", "import type { PolicyMode } from \"@skillspp/core/policy\";\n\nexport function parsePolicyMode(value?: string): PolicyMode {\n if (!value) {\n return \"enforce\";\n }\n if (value === \"enforce\" || value === \"warn\") {\n return value;\n }\n throw new Error(`Invalid --policy-mode value: ${value}`);\n}\n", "import { Command, CommanderError } from \"commander\";\nimport {\n emitLifecycleEvent,\n type TelemetryEmitter,\n} from \"@skillspp/core/telemetry\";\n\nexport type CliCommandContext = {\n experimental: boolean;\n emitCommandEvent: (\n command: string,\n event: {\n eventType: string;\n reason: string;\n status: \"start\" | \"ok\" | \"error\" | \"warn\";\n error?: string;\n metadata?: Record<string, unknown>;\n source?: string;\n }\n ) => void;\n wrapAction: <TArgs extends unknown[]>(\n command: string,\n action: (...args: TArgs) => Promise<void>\n ) => (...args: TArgs) => Promise<void>;\n};\n\nexport function createCliCommandContext(\n emitter: TelemetryEmitter,\n options: { experimental: boolean }\n): CliCommandContext {\n const emitCommandEvent: CliCommandContext[\"emitCommandEvent\"] = (\n command,\n event\n ) => {\n emitLifecycleEvent(emitter, {\n eventType: event.eventType,\n source: event.source ?? command,\n reason: event.reason,\n command,\n status: event.status,\n error: event.error,\n metadata: event.metadata,\n });\n };\n\n return {\n experimental: options.experimental,\n emitCommandEvent,\n wrapAction:\n <TArgs extends unknown[]>(\n command: string,\n action: (...args: TArgs) => Promise<void>\n ) =>\n async (...args: TArgs): Promise<void> => {\n emitCommandEvent(command, {\n eventType: `${command}_started`,\n reason: `${command}_started`,\n status: \"start\",\n });\n\n try {\n await action(...args);\n emitCommandEvent(command, {\n eventType: `${command}_completed`,\n reason: \"complete\",\n status: \"ok\",\n });\n } catch (error) {\n emitCommandEvent(command, {\n eventType: `${command}_failed`,\n reason: `${command}_failed`,\n status: \"error\",\n error: error instanceof Error ? error.message : String(error),\n });\n throw error;\n }\n },\n };\n}\n\nexport async function parseStandaloneCommand(\n command: Command,\n args: string[]\n): Promise<void> {\n command.exitOverride((error) => {\n throw error;\n });\n\n try {\n await command.parseAsync(args, { from: \"user\" });\n } catch (error) {\n if (\n error instanceof CommanderError &&\n error.code === \"commander.helpDisplayed\"\n ) {\n return;\n }\n if (error instanceof CommanderError) {\n throw new Error(error.message);\n }\n throw error;\n }\n}\n", "import { randomUUID } from \"node:crypto\";\n\nexport type LifecycleEvent = {\n eventSchemaVersion: 1;\n eventType: string;\n source: string;\n reason: string;\n runId: string;\n timestamp: string;\n command: string;\n status: \"start\" | \"ok\" | \"error\" | \"warn\";\n error?: string;\n metadata?: Record<string, unknown>;\n};\n\nexport type TelemetryEmitter = {\n runId: string;\n publish: (event: LifecycleEvent) => void;\n subscribe: (listener: TelemetryListener) => () => void;\n};\n\nexport type TelemetryListener = (event: LifecycleEvent) => void;\n\nclass TelemetryBus {\n private listeners = new Set<TelemetryListener>();\n\n subscribe(listener: TelemetryListener): () => void {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n publish(event: LifecycleEvent): void {\n for (const listener of this.listeners) {\n listener(event);\n }\n }\n}\n\nexport function createTelemetryEmitter(): TelemetryEmitter {\n const bus = new TelemetryBus();\n\n return {\n runId: randomUUID(),\n publish: (event) => bus.publish(event),\n subscribe: (listener) => bus.subscribe(listener),\n };\n}\n\nexport function subscribeLifecycleEvents(\n emitter: TelemetryEmitter,\n listener: TelemetryListener\n): () => void {\n return emitter.subscribe(listener);\n}\n\nexport function emitLifecycleEvent(\n emitter: TelemetryEmitter,\n event: Omit<LifecycleEvent, \"eventSchemaVersion\" | \"runId\" | \"timestamp\">\n): void {\n const row: LifecycleEvent = {\n eventSchemaVersion: 1,\n runId: emitter.runId,\n timestamp: new Date().toISOString(),\n ...event,\n };\n\n emitter.publish(row);\n}\n", "import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { spawn, type ChildProcess } from \"node:child_process\";\nimport { fileURLToPath } from \"node:url\";\n\ntype TaskEvent =\n | { type: \"progress\"; label: string }\n | { type: \"result\"; result: unknown }\n | { type: \"error\"; message: string; stack?: string; code?: string };\n\ntype RunBackgroundTaskOptions = {\n onProgress?: (label: string) => void;\n executorModule: string;\n};\n\nconst activeChildren = new Set<ChildProcess>();\nlet cleanupHandlersInstalled = false;\n\nfunction cleanupActiveChildren(): void {\n for (const child of [...activeChildren]) {\n if (child.killed || child.exitCode !== null) {\n activeChildren.delete(child);\n continue;\n }\n child.kill(\"SIGTERM\");\n }\n}\n\nfunction installCleanupHandlers(): void {\n if (cleanupHandlersInstalled) {\n return;\n }\n cleanupHandlersInstalled = true;\n\n process.on(\"exit\", cleanupActiveChildren);\n\n for (const signal of [\"SIGINT\", \"SIGTERM\", \"SIGHUP\"] as NodeJS.Signals[]) {\n const handler = () => {\n cleanupActiveChildren();\n process.off(signal, handler);\n setImmediate(() => {\n process.kill(process.pid, signal);\n });\n };\n process.on(signal, handler);\n }\n}\n\nfunction resolveWorkerEntry(): string {\n const dir = path.dirname(fileURLToPath(import.meta.url));\n const tsPath = path.join(dir, \"background-worker.ts\");\n if (fs.existsSync(tsPath)) {\n return tsPath;\n }\n return path.join(dir, \"background-worker.js\");\n}\n\nfunction appendOutputChunk(chunks: string[], chunk: Buffer | string): void {\n const next = chunk.toString();\n chunks.push(next);\n const combined = chunks.join(\"\");\n if (combined.length <= 8000) {\n return;\n }\n const trimmed = combined.slice(-8000);\n chunks.splice(0, chunks.length, trimmed);\n}\n\nexport async function runBackgroundTask<TResult>(\n request: unknown,\n options: RunBackgroundTaskOptions,\n): Promise<TResult> {\n installCleanupHandlers();\n\n return new Promise<TResult>((resolve, reject) => {\n const childCwd =\n typeof request === \"object\" &&\n request !== null &&\n \"payload\" in (request as Record<string, unknown>) &&\n typeof (request as { payload?: { cwd?: unknown } }).payload?.cwd ===\n \"string\"\n ? (request as { payload: { cwd: string } }).payload.cwd\n : process.cwd();\n\n const child = spawn(\n process.execPath,\n [...process.execArgv, resolveWorkerEntry()],\n {\n cwd: childCwd,\n env: {\n ...process.env,\n SKILLSPP_BG_EXECUTOR: options.executorModule,\n },\n stdio: [\"ignore\", \"pipe\", \"pipe\", \"ipc\"],\n },\n );\n\n activeChildren.add(child);\n\n const stdoutChunks: string[] = [];\n const stderrChunks: string[] = [];\n let settled = false;\n\n const finish = (callback: () => void) => {\n if (settled) {\n return;\n }\n settled = true;\n activeChildren.delete(child);\n callback();\n };\n\n child.stdout?.on(\"data\", (chunk) => {\n appendOutputChunk(stdoutChunks, chunk);\n });\n\n child.stderr?.on(\"data\", (chunk) => {\n appendOutputChunk(stderrChunks, chunk);\n });\n\n child.on(\"error\", (error) => {\n finish(() => reject(error));\n });\n\n child.on(\"message\", (message: TaskEvent) => {\n if (!message || typeof message !== \"object\") {\n return;\n }\n\n if (message.type === \"progress\") {\n options.onProgress?.(message.label);\n return;\n }\n\n if (message.type === \"error\") {\n const taskError = new Error(message.message);\n if (message.stack) {\n taskError.stack = message.stack;\n }\n if (message.code) {\n (taskError as Error & { code?: string }).code = message.code;\n }\n finish(() => reject(taskError));\n return;\n }\n\n if (message.type === \"result\") {\n finish(() => resolve(message.result as TResult));\n }\n });\n\n child.on(\"close\", (code, signal) => {\n activeChildren.delete(child);\n if (settled) {\n return;\n }\n\n const stderr = stderrChunks.join(\"\").trim();\n const stdout = stdoutChunks.join(\"\").trim();\n const detail =\n stderr ||\n stdout ||\n (signal\n ? `background task exited via ${signal}`\n : `background task exited with code ${String(code)}`);\n settled = true;\n reject(new Error(detail));\n });\n\n child.once(\"spawn\", () => {\n child.send(request as any);\n });\n });\n}\n", "import { runBackgroundTask as runBackgroundTaskInPlatform } from \"@skillspp/platform-node\";\nimport type {\n BackgroundTaskKind,\n BackgroundTaskRequest,\n BackgroundTaskResult,\n} from \"./background-task-types\";\n\nexport type RunBackgroundTaskOptions = {\n onProgress?: (label: string) => void;\n};\n\nexport async function runBackgroundTask<TKind extends BackgroundTaskKind>(\n request: BackgroundTaskRequest<TKind>,\n options: RunBackgroundTaskOptions = {}\n): Promise<BackgroundTaskResult<TKind>> {\n return runBackgroundTaskInPlatform<BackgroundTaskResult<TKind>>(request, {\n onProgress: options.onProgress,\n executorModule: \"@skillspp/core/runtime/background-tasks\",\n });\n}\n", "import { Command } from \"commander\";\nimport type { DriftRecord } from \"@skillspp/core/contracts/results\";\nimport {\n assessLockEntries as assessLockEntriesCore,\n collectDrift as collectDriftCore,\n type CheckOptions,\n type SkillAssessment,\n} from \"@skillspp/core/runtime/check-analysis\";\nimport { parsePolicyMode } from \"../policy-mode\";\nimport {\n parseStandaloneCommand,\n type CliCommandContext,\n} from \"../command-builder\";\nimport { runBackgroundTask } from \"../runtime/background-runner\";\nimport {\n completedStepsSection,\n failedStepsSection,\n flushUiFrame,\n hideLoader,\n panelSection,\n renderStaticScreen,\n showLoader,\n sourceSection,\n} from \"../ui/screens\";\nimport { formatDriftChips, shortenHomePath } from \"../ui/format\";\n\nexport type { DriftRecord, CheckOptions, SkillAssessment };\nexport type DriftKind = DriftRecord[\"kind\"];\n\nconst DRIFT_KIND_ORDER: DriftKind[] = [\n \"migrate-required\",\n \"changed-source\",\n \"local-modified\",\n \"missing-source\",\n \"lock-missing\",\n];\n\nexport function buildCheckDriftSummaryLines(options: {\n checked: number;\n driftCount: number;\n grouped: Map<DriftKind, DriftRecord[]>;\n colorEnabled?: boolean;\n}): string[] {\n const plusCount = options.grouped.get(\"changed-source\")?.length ?? 0;\n const minusCount = options.grouped.get(\"local-modified\")?.length ?? 0;\n const summaryLines = [\n `${options.checked} tracked skill${\n options.checked === 1 ? \"\" : \"s\"\n } checked`,\n `${options.driftCount} drift case${\n options.driftCount === 1 ? \"\" : \"s\"\n } detected`,\n `Drift signal: ${formatDriftChips({\n plusCount,\n minusCount,\n colorEnabled: options.colorEnabled,\n })}`,\n ];\n\n for (const kind of DRIFT_KIND_ORDER) {\n const rows = options.grouped.get(kind);\n if (!rows || rows.length === 0) {\n continue;\n }\n summaryLines.push(\"\");\n summaryLines.push(` - ${kind}: ${rows.length}`);\n }\n return summaryLines;\n}\n\ntype CheckCommanderOptions = {\n global?: boolean;\n skill?: string[];\n allowHost?: string[];\n denyHost?: string[];\n maxDownloadBytes?: string;\n policyMode?: string;\n};\n\nfunction toCheckOptions(options: CheckCommanderOptions): CheckOptions {\n const maxDownloadBytes = options.maxDownloadBytes\n ? Number(options.maxDownloadBytes)\n : undefined;\n if (\n typeof maxDownloadBytes === \"number\" &&\n (!Number.isFinite(maxDownloadBytes) || maxDownloadBytes <= 0)\n ) {\n throw new Error(\n `Invalid --max-download-bytes value: ${options.maxDownloadBytes}`,\n );\n }\n\n return {\n global: Boolean(options.global),\n skill: options.skill,\n allowHost: options.allowHost?.map((item) => item.toLowerCase()),\n denyHost: options.denyHost?.map((item) => item.toLowerCase()),\n maxDownloadBytes,\n policyMode: parsePolicyMode(options.policyMode),\n experimental: false,\n };\n}\n\nexport async function assessLockEntries(\n options: CheckOptions,\n cwd: string,\n behavior: { keepResolved: boolean } = { keepResolved: false },\n): Promise<{\n drift: DriftRecord[];\n checked: number;\n assessments: SkillAssessment[];\n}> {\n return assessLockEntriesCore(options, cwd, behavior);\n}\n\nexport async function collectDrift(\n options: CheckOptions,\n cwd: string,\n): Promise<{ drift: DriftRecord[]; checked: number }> {\n return collectDriftCore(options, cwd);\n}\n\nasync function executeCheck(options: CheckOptions): Promise<void> {\n const cwd = process.cwd();\n let failedLabel = \"failed to assess drift\";\n showLoader(\"checking drift\");\n await flushUiFrame();\n try {\n const { drift, checked, conflicts, transitiveConflicts } =\n await runBackgroundTask(\n {\n kind: \"check.scan\",\n payload: {\n cwd,\n options,\n },\n },\n {\n onProgress: (label) => {\n if (label === \"checking local/global conflicts\") {\n failedLabel = \"failed to scan local/global conflicts\";\n } else if (label === \"checking transitive conflicts\") {\n failedLabel = \"failed to scan transitive conflicts\";\n } else {\n failedLabel = \"failed to assess drift\";\n }\n showLoader(label);\n },\n },\n );\n hideLoader();\n const grouped = new Map<DriftKind, DriftRecord[]>();\n for (const item of drift) {\n const list = grouped.get(item.kind) || [];\n list.push(item);\n grouped.set(item.kind, list);\n }\n const sections = [\n completedStepsSection([\n \"drift assessed\",\n \"local/global conflicts scanned\",\n \"transitive conflicts scanned\",\n ]),\n sourceSection(shortenHomePath(cwd)),\n panelSection({\n title: \"Check Scope\",\n lines: [\n `Scope: ${options.global ? \"global\" : \"current project\"}`,\n `Skill filter: ${\n !options.skill ||\n options.skill.length === 0 ||\n options.skill.includes(\"*\")\n ? \"all tracked skills\"\n : [...new Set(options.skill)]\n .sort((a, b) => a.localeCompare(b))\n .join(\", \")\n }`,\n ],\n style: \"square\",\n minWidth: 74,\n }),\n ];\n\n const cleanState =\n drift.length === 0 &&\n conflicts.length === 0 &&\n transitiveConflicts.length === 0;\n\n if (cleanState) {\n sections.push(\n panelSection({\n title: \"Check Summary\",\n lines: [\n `${checked} tracked skill${checked === 1 ? \"\" : \"s\"} checked`,\n \"No drift detected\",\n \"No conflicts detected\",\n ],\n style: \"square\",\n minWidth: 74,\n }),\n );\n await renderStaticScreen(sections);\n return;\n }\n\n if (drift.length > 0) {\n const summaryLines = buildCheckDriftSummaryLines({\n checked,\n driftCount: drift.length,\n grouped,\n colorEnabled: Boolean(process.stdout.isTTY) && !process.env.NO_COLOR,\n });\n sections.push(\n panelSection({\n title: \"Drift Summary\",\n lines: summaryLines,\n style: \"square\",\n minWidth: 74,\n }),\n );\n\n const detailLines: string[] = [];\n for (const kind of DRIFT_KIND_ORDER) {\n const rows = grouped.get(kind);\n if (!rows || rows.length === 0) {\n continue;\n }\n if (detailLines.length > 0) {\n detailLines.push(\"\");\n }\n detailLines.push(` ${kind}`);\n for (const row of [...rows].sort((a, b) =>\n a.skillName.localeCompare(b.skillName),\n )) {\n detailLines.push(` ${row.skillName}: ${row.detail}`);\n }\n }\n sections.push(\n panelSection({\n title: \"Drift Details\",\n lines: detailLines,\n style: \"square\",\n minWidth: 74,\n }),\n );\n }\n\n if (conflicts.length > 0 || transitiveConflicts.length > 0) {\n const conflictLines: string[] = [];\n if (conflicts.length > 0) {\n conflictLines.push(\"Local/global conflicts (local preferred):\");\n for (const conflict of conflicts) {\n conflictLines.push(\n ` ${conflict.skillName}: winner=${conflict.winner}`,\n );\n }\n }\n if (transitiveConflicts.length > 0) {\n if (conflictLines.length > 0) {\n conflictLines.push(\"\");\n }\n conflictLines.push(\"Transitive skill conflicts:\");\n for (const conflict of transitiveConflicts) {\n conflictLines.push(\n ` ${conflict.skillName}: winner=${conflict.winner.packageName}@${conflict.winner.packageVersion} depth=${conflict.winner.depth}`,\n );\n for (const loser of conflict.losers) {\n conflictLines.push(\n ` - loser=${loser.packageName}@${loser.packageVersion} depth=${loser.depth}`,\n );\n }\n }\n }\n sections.push(\n panelSection({\n title: \"Conflict Scan\",\n lines: conflictLines,\n style: \"square\",\n minWidth: 74,\n }),\n );\n }\n\n const updateSkillNames = [\n ...new Set(\n drift\n .filter(\n (item) =>\n item.kind === \"changed-source\" || item.kind === \"local-modified\",\n )\n .map((item) => item.skillName),\n ),\n ].sort((a, b) => a.localeCompare(b));\n const migrateSkillNames = [\n ...new Set(\n drift\n .filter((item) => item.kind === \"migrate-required\")\n .map((item) => item.skillName),\n ),\n ].sort((a, b) => a.localeCompare(b));\n\n if (migrateSkillNames.length > 0 || updateSkillNames.length > 0) {\n const lines: string[] = [];\n if (migrateSkillNames.length > 0) {\n lines.push(\"Migration required:\");\n for (const skillName of migrateSkillNames) {\n lines.push(\n `skillspp update ${skillName} --migrate <new-skill-source>`,\n );\n }\n }\n if (updateSkillNames.length > 0) {\n if (lines.length > 0) {\n lines.push(\"\");\n }\n lines.push(\n `skillspp update${\n options.global ? \" --global\" : \"\"\n } --skill ${updateSkillNames.join(\" \")}`,\n );\n }\n sections.push(\n panelSection({\n title: \"Suggested Next Step\",\n lines,\n style: \"square\",\n minWidth: 74,\n }),\n );\n }\n\n await renderStaticScreen(sections);\n } catch (error) {\n hideLoader();\n await renderStaticScreen([failedStepsSection([failedLabel])]);\n throw error;\n } finally {\n hideLoader();\n }\n}\n\nfunction configureCheckCommand(\n command: Command,\n action: (options: CheckCommanderOptions) => Promise<void>,\n): Command {\n return command\n .description(\"Detect source/install drift from lockfile\")\n .option(\"-g, --global\", \"Check global installs\")\n .option(\"-s, --skill <skills...>\", \"Check only selected skill(s)\")\n .option(\"--allow-host <hosts...>\", \"Restrict well-known hosts to allowlist\")\n .option(\"--deny-host <hosts...>\", \"Block specific well-known hosts\")\n .option(\"--max-download-bytes <n>\", \"Set well-known download budget\")\n .option(\"--policy-mode <mode>\", \"Policy mode (enforce|warn)\")\n .action(action);\n}\n\nexport function registerCheckCommand(\n program: Command,\n ctx: CliCommandContext,\n): void {\n configureCheckCommand(\n program.command(\"check\"),\n ctx.wrapAction(\"check\", async (options: CheckCommanderOptions) => {\n await executeCheck({\n ...toCheckOptions(options),\n experimental: ctx.experimental,\n });\n }),\n );\n}\n\nexport async function runCheck(args: string[]): Promise<void> {\n const command = configureCheckCommand(\n new Command().name(\"check\"),\n async (options) => {\n await executeCheck(toCheckOptions(options));\n },\n );\n await parseStandaloneCommand(command, args);\n}\n", "import fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { spawn, spawnSync } from \"node:child_process\";\nimport type { ParsedSource } from \"../contracts/runtime-types\";\ntype GitLikeSource = Exclude<ParsedSource, { type: \"well-known\" | \"catalog\" }>;\n\nfunction runGit(args: string[], cwd?: string): void {\n const result = spawnSync(\"git\", args, {\n cwd,\n encoding: \"utf8\",\n stdio: \"pipe\",\n });\n if (result.status !== 0) {\n const stderr = (result.stderr || \"\").trim();\n const stdout = (result.stdout || \"\").trim();\n const detail = stderr || stdout || \"git command failed\";\n throw new Error(`${detail}`);\n }\n}\n\nfunction runGitOutput(args: string[], cwd?: string): string {\n const result = spawnSync(\"git\", args, {\n cwd,\n encoding: \"utf8\",\n stdio: \"pipe\",\n });\n if (result.status !== 0) {\n const stderr = (result.stderr || \"\").trim();\n const stdout = (result.stdout || \"\").trim();\n const detail = stderr || stdout || \"git command failed\";\n throw new Error(`${detail}`);\n }\n return String(result.stdout || \"\").trim();\n}\n\nfunction runGitAsync(args: string[], cwd?: string): Promise<void> {\n return new Promise((resolve, reject) => {\n const child = spawn(\"git\", args, {\n cwd,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n\n let stdout = \"\";\n let stderr = \"\";\n\n child.stdout.on(\"data\", (chunk: Buffer | string) => {\n stdout += chunk.toString();\n });\n child.stderr.on(\"data\", (chunk: Buffer | string) => {\n stderr += chunk.toString();\n });\n\n child.on(\"error\", (error) => {\n reject(error);\n });\n\n child.on(\"close\", (code) => {\n if (code === 0) {\n resolve();\n return;\n }\n const detail = stderr.trim() || stdout.trim() || \"git command failed\";\n reject(new Error(detail));\n });\n });\n}\n\nfunction runGitOutputAsync(args: string[], cwd?: string): Promise<string> {\n return new Promise((resolve, reject) => {\n const child = spawn(\"git\", args, {\n cwd,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n\n let stdout = \"\";\n let stderr = \"\";\n\n child.stdout.on(\"data\", (chunk: Buffer | string) => {\n stdout += chunk.toString();\n });\n child.stderr.on(\"data\", (chunk: Buffer | string) => {\n stderr += chunk.toString();\n });\n\n child.on(\"error\", (error) => {\n reject(error);\n });\n\n child.on(\"close\", (code) => {\n if (code === 0) {\n resolve(stdout.trim());\n return;\n }\n const detail = stderr.trim() || stdout.trim() || \"git command failed\";\n reject(new Error(detail));\n });\n });\n}\n\nfunction applyCheckoutRefSync(repoDir: string, ref?: string): void {\n if (!ref) {\n return;\n }\n runGit([\"fetch\", \"--depth\", \"1\", \"origin\", ref], repoDir);\n runGit([\"checkout\", ref], repoDir);\n}\n\nasync function applyCheckoutRefAsync(repoDir: string, ref?: string): Promise<void> {\n if (!ref) {\n return;\n }\n await runGitAsync([\"fetch\", \"--depth\", \"1\", \"origin\", ref], repoDir);\n await runGitAsync([\"checkout\", ref], repoDir);\n}\n\nexport function prepareSourceDir(parsed: GitLikeSource): {\n basePath: string;\n cleanup?: () => void;\n} {\n if (parsed.type === \"local\") {\n if (!fs.existsSync(parsed.localPath)) {\n throw new Error(`Local source not found: ${parsed.localPath}`);\n }\n return { basePath: parsed.localPath };\n }\n\n const tmp = fs.mkdtempSync(path.join(os.tmpdir(), \"skillspp-cli-\"));\n runGit([\"clone\", \"--depth\", \"1\", parsed.repoUrl, tmp]);\n\n const ref = parsed.type === \"github\" ? parsed.ref : undefined;\n applyCheckoutRefSync(tmp, ref);\n\n const basePath =\n parsed.type === \"github\" && parsed.subpath\n ? path.join(tmp, parsed.subpath)\n : tmp;\n return {\n basePath,\n cleanup: () => {\n fs.rmSync(tmp, { recursive: true, force: true });\n },\n };\n}\n\nexport async function prepareSourceDirAsync(parsed: GitLikeSource): Promise<{\n basePath: string;\n cleanup?: () => void;\n}> {\n if (parsed.type === \"local\") {\n if (!fs.existsSync(parsed.localPath)) {\n throw new Error(`Local source not found: ${parsed.localPath}`);\n }\n return { basePath: parsed.localPath };\n }\n\n const tmp = fs.mkdtempSync(path.join(os.tmpdir(), \"skillspp-cli-\"));\n await runGitAsync([\"clone\", \"--depth\", \"1\", parsed.repoUrl, tmp]);\n\n const ref = parsed.type === \"github\" ? parsed.ref : undefined;\n await applyCheckoutRefAsync(tmp, ref);\n\n const basePath =\n parsed.type === \"github\" && parsed.subpath\n ? path.join(tmp, parsed.subpath)\n : tmp;\n return {\n basePath,\n cleanup: () => {\n fs.rmSync(tmp, { recursive: true, force: true });\n },\n };\n}\n\nexport function prepareSourceDirWithRef(\n parsed: GitLikeSource,\n options: { overrideRef?: string } = {},\n): {\n basePath: string;\n cleanup?: () => void;\n} {\n if (parsed.type === \"local\") {\n return prepareSourceDir(parsed);\n }\n const effectiveParsed =\n parsed.type === \"github\"\n ? { ...parsed, ref: options.overrideRef || parsed.ref }\n : parsed;\n const prepared = prepareSourceDir(effectiveParsed);\n if (parsed.type === \"git\" && options.overrideRef) {\n applyCheckoutRefSync(prepared.basePath, options.overrideRef);\n }\n return prepared;\n}\n\nexport async function prepareSourceDirAsyncWithRef(\n parsed: GitLikeSource,\n options: { overrideRef?: string } = {},\n): Promise<{\n basePath: string;\n cleanup?: () => void;\n}> {\n if (parsed.type === \"local\") {\n return prepareSourceDirAsync(parsed);\n }\n const effectiveParsed =\n parsed.type === \"github\"\n ? { ...parsed, ref: options.overrideRef || parsed.ref }\n : parsed;\n const prepared = await prepareSourceDirAsync(effectiveParsed);\n if (parsed.type === \"git\" && options.overrideRef) {\n await applyCheckoutRefAsync(prepared.basePath, options.overrideRef);\n }\n return prepared;\n}\n\nexport function resolveGitHeadRef(repoDir: string): string {\n return runGitOutput([\"rev-parse\", \"HEAD\"], repoDir);\n}\n\nexport async function resolveGitHeadRefAsync(repoDir: string): Promise<string> {\n return runGitOutputAsync([\"rev-parse\", \"HEAD\"], repoDir);\n}\n", "import type { HostProvider } from \"./types\";\n\nclass ProviderRegistry {\n private providers: HostProvider[] = [];\n\n register(provider: HostProvider): void {\n if (this.providers.some((item) => item.id === provider.id)) {\n throw new Error(`Provider with id '${provider.id}' already registered`);\n }\n this.providers.push(provider);\n }\n\n findProvider(url: string): HostProvider | null {\n for (const provider of this.providers) {\n if (provider.match(url).matches) {\n return provider;\n }\n }\n return null;\n }\n\n getProviders(): HostProvider[] {\n return [...this.providers];\n }\n\n getProviderById(id: string): HostProvider | null {\n return this.providers.find((item) => item.id === id) || null;\n }\n}\n\nexport const registry = new ProviderRegistry();\n\nexport function registerProvider(provider: HostProvider): void {\n registry.register(provider);\n}\n\nexport function findProvider(url: string): HostProvider | null {\n return registry.findProvider(url);\n}\n\nexport function getProviders(): HostProvider[] {\n return registry.getProviders();\n}\n\nexport function getProviderById(id: string): HostProvider | null {\n return registry.getProviderById(id);\n}\n", "import dns from \"node:dns/promises\";\nimport net from \"node:net\";\nimport type {\n ProviderMatch,\n RemoteSkill,\n WellKnownFetchOptions,\n WellKnownProvider,\n} from \"./types\";\n\ntype WellKnownIndexEntry = {\n name: string;\n description: string;\n files: string[];\n};\n\ntype WellKnownIndex = {\n skills: WellKnownIndexEntry[];\n};\n\ntype DownloadBudget = {\n remaining: number;\n};\n\ntype NormalizedOptions = Required<\n Omit<WellKnownFetchOptions, \"allowHosts\" | \"denyHosts\">\n> & {\n allowHosts: string[];\n denyHosts: string[];\n};\n\nconst DEFAULT_OPTIONS: Omit<NormalizedOptions, \"allowHosts\" | \"denyHosts\"> = {\n maxDownloadBytes: 5 * 1024 * 1024,\n timeoutMs: 10_000,\n maxRedirects: 3,\n maxFilesPerSkill: 128,\n maxSkillFileBytes: 512 * 1024,\n};\n\nconst EXCLUDED_HOSTS = new Set([\n \"github.com\",\n \"gitlab.com\",\n \"raw.githubusercontent.com\",\n]);\n\nexport class SecureWellKnownProvider implements WellKnownProvider {\n readonly id = \"well-known\";\n readonly displayName = \"Secure Well-Known Skills\";\n\n match(url: string): ProviderMatch {\n if (!url.startsWith(\"http://\") && !url.startsWith(\"https://\")) {\n return { matches: false };\n }\n\n try {\n const parsed = new URL(url);\n if (EXCLUDED_HOSTS.has(parsed.hostname.toLowerCase())) {\n return { matches: false };\n }\n return { matches: true, sourceIdentifier: this.getSourceIdentifier(url) };\n } catch {\n return { matches: false };\n }\n }\n\n getSourceIdentifier(url: string): string {\n const parsed = new URL(url);\n const path = parsed.pathname.replace(/\\/$/, \"\");\n return path && path !== \"/\"\n ? `wellknown/${parsed.hostname}${path}`\n : `wellknown/${parsed.hostname}`;\n }\n\n async fetchAllSkills(\n url: string,\n options: WellKnownFetchOptions = {}\n ): Promise<RemoteSkill[]> {\n const normalized = this.normalizeOptions(options);\n const budget: DownloadBudget = { remaining: normalized.maxDownloadBytes };\n\n const parsed = new URL(url);\n if (parsed.protocol !== \"https:\") {\n throw new Error(\"Well-known provider requires HTTPS URLs\");\n }\n\n await this.assertHostAllowed(parsed.hostname, normalized);\n\n const { index, resolvedBase } = await this.fetchIndex(\n parsed,\n normalized,\n budget\n );\n const skills: RemoteSkill[] = [];\n\n for (const entry of index.skills) {\n const skill = await this.fetchSkillByEntry(\n resolvedBase,\n entry,\n normalized,\n budget\n );\n if (skill) {\n skills.push(skill);\n }\n }\n\n return skills;\n }\n\n private normalizeOptions(options: WellKnownFetchOptions): NormalizedOptions {\n return {\n allowHosts: (options.allowHosts || [])\n .map((x) => x.trim().toLowerCase())\n .filter(Boolean),\n denyHosts: (options.denyHosts || [])\n .map((x) => x.trim().toLowerCase())\n .filter(Boolean),\n maxDownloadBytes:\n options.maxDownloadBytes ?? DEFAULT_OPTIONS.maxDownloadBytes,\n timeoutMs: options.timeoutMs ?? DEFAULT_OPTIONS.timeoutMs,\n maxRedirects: options.maxRedirects ?? DEFAULT_OPTIONS.maxRedirects,\n maxFilesPerSkill:\n options.maxFilesPerSkill ?? DEFAULT_OPTIONS.maxFilesPerSkill,\n maxSkillFileBytes:\n options.maxSkillFileBytes ?? DEFAULT_OPTIONS.maxSkillFileBytes,\n };\n }\n\n private async fetchIndex(\n parsedUrl: URL,\n options: NormalizedOptions,\n budget: DownloadBudget\n ): Promise<{ index: WellKnownIndex; resolvedBase: string }> {\n const candidates = this.buildBaseCandidates(parsedUrl);\n\n for (const base of candidates) {\n const indexUrl = `${base}/.well-known/skills/index.json`;\n try {\n const jsonText = await this.fetchTextWithLimit(\n indexUrl,\n options.maxDownloadBytes,\n options,\n budget\n );\n const parsed = JSON.parse(jsonText) as unknown;\n const validated = this.validateIndex(parsed, options.maxFilesPerSkill);\n return { index: validated, resolvedBase: base };\n } catch {\n continue;\n }\n }\n\n throw new Error(\n \"No valid well-known skills index found at /.well-known/skills/index.json\"\n );\n }\n\n private buildBaseCandidates(parsed: URL): string[] {\n const origin = parsed.origin;\n const pathname = parsed.pathname.replace(/\\/$/, \"\");\n const marker = \"/.well-known/skills\";\n\n const out: string[] = [];\n\n if (pathname.includes(marker)) {\n const prefix = pathname.slice(0, pathname.indexOf(marker));\n out.push(`${origin}${prefix}`.replace(/\\/$/, \"\"));\n if (prefix !== \"\") {\n out.push(origin);\n }\n } else {\n out.push(`${origin}${pathname}`.replace(/\\/$/, \"\"));\n if (pathname !== \"\") {\n out.push(origin);\n }\n }\n\n return [\n ...new Set(out.map((x) => (x.endsWith(\"/\") ? x.slice(0, -1) : x))),\n ].filter(Boolean);\n }\n\n private validateIndex(\n raw: unknown,\n maxFilesPerSkill: number\n ): WellKnownIndex {\n if (!raw || typeof raw !== \"object\") {\n throw new Error(\"Invalid well-known index: expected object\");\n }\n\n const data = raw as Record<string, unknown>;\n if (!Array.isArray(data.skills)) {\n throw new Error(\"Invalid well-known index: 'skills' must be an array\");\n }\n\n const skills: WellKnownIndexEntry[] = data.skills.map((item, idx) => {\n if (!item || typeof item !== \"object\") {\n throw new Error(`Invalid well-known index entry[${idx}]`);\n }\n const row = item as Record<string, unknown>;\n const name = String(row.name || \"\").trim();\n const description = String(row.description || \"\").trim();\n const files = Array.isArray(row.files)\n ? row.files.map((x) => String(x))\n : [];\n\n if (!name || !description || files.length === 0) {\n throw new Error(\n `Invalid well-known index entry[${idx}]: missing required fields`\n );\n }\n if (!/^[a-z0-9]([a-z0-9-]{0,62}[a-z0-9])?$/.test(name)) {\n throw new Error(`Invalid well-known skill name: ${name}`);\n }\n if (files.length > maxFilesPerSkill) {\n throw new Error(`Too many files in well-known skill '${name}'`);\n }\n if (!files.some((f) => f.toLowerCase() === \"skill.md\")) {\n throw new Error(`Well-known skill '${name}' is missing SKILL.md`);\n }\n\n for (const file of files) {\n this.assertSafeRelativePath(file);\n }\n\n return { name, description, files };\n });\n\n return { skills };\n }\n\n private assertSafeRelativePath(filePath: string): void {\n if (\n !filePath ||\n filePath.startsWith(\"/\") ||\n filePath.startsWith(\"\\\\\") ||\n filePath.includes(\"..\") ||\n filePath.includes(\"\\\\\")\n ) {\n throw new Error(`Unsafe well-known file path: ${filePath}`);\n }\n }\n\n private async fetchSkillByEntry(\n resolvedBase: string,\n entry: WellKnownIndexEntry,\n options: NormalizedOptions,\n budget: DownloadBudget\n ): Promise<RemoteSkill | null> {\n const baseUrl = `${resolvedBase}/.well-known/skills/${entry.name}`;\n const files = new Map<string, string>();\n\n for (const filePath of entry.files) {\n this.assertSafeRelativePath(filePath);\n const fileUrl = `${baseUrl}/${filePath}`;\n const text = await this.fetchTextWithLimit(\n fileUrl,\n options.maxSkillFileBytes,\n options,\n budget\n );\n if (text.includes(\"\\u0000\")) {\n throw new Error(\n `Binary content is not allowed in well-known file: ${filePath}`\n );\n }\n files.set(filePath, text);\n }\n\n const skillContent = files.get(\"SKILL.md\") || files.get(\"skill.md\");\n if (!skillContent) {\n return null;\n }\n\n return {\n name: entry.name,\n description: entry.description,\n installName: entry.name,\n sourceUrl: `${baseUrl}/SKILL.md`,\n sourceType: \"well-known\",\n files,\n };\n }\n\n private async fetchTextWithLimit(\n url: string,\n maxPerRequestBytes: number,\n options: NormalizedOptions,\n budget: DownloadBudget\n ): Promise<string> {\n let currentUrl = url;\n let redirects = 0;\n\n while (true) {\n const parsed = new URL(currentUrl);\n if (parsed.protocol !== \"https:\") {\n throw new Error(\"Well-known provider only allows HTTPS fetches\");\n }\n await this.assertHostAllowed(parsed.hostname, options);\n\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), options.timeoutMs);\n\n let response: Response;\n try {\n response = await fetch(currentUrl, {\n redirect: \"manual\",\n signal: controller.signal,\n });\n } finally {\n clearTimeout(timeout);\n }\n\n if (response.status >= 300 && response.status < 400) {\n const location = response.headers.get(\"location\");\n if (!location) {\n throw new Error(`Redirect without location for ${currentUrl}`);\n }\n redirects += 1;\n if (redirects > options.maxRedirects) {\n throw new Error(`Too many redirects for ${url}`);\n }\n currentUrl = new URL(location, currentUrl).toString();\n continue;\n }\n\n if (!response.ok) {\n throw new Error(\n `Fetch failed (${response.status} ${response.statusText}) for ${currentUrl}`\n );\n }\n\n const contentLengthHeader = response.headers.get(\"content-length\");\n if (contentLengthHeader) {\n const declared = Number(contentLengthHeader);\n if (Number.isFinite(declared) && declared > maxPerRequestBytes) {\n throw new Error(\n `Response exceeds per-file size limit for ${currentUrl}`\n );\n }\n if (Number.isFinite(declared) && declared > budget.remaining) {\n throw new Error(\n `Response exceeds remaining download budget for ${currentUrl}`\n );\n }\n }\n\n const reader = response.body?.getReader();\n if (!reader) {\n return \"\";\n }\n\n let received = 0;\n const chunks: Uint8Array[] = [];\n while (true) {\n const result = await reader.read();\n if (result.done) {\n break;\n }\n\n const chunk = result.value;\n received += chunk.byteLength;\n\n if (received > maxPerRequestBytes) {\n throw new Error(\n `Response exceeded per-file size limit for ${currentUrl}`\n );\n }\n if (received > budget.remaining) {\n throw new Error(\n `Response exceeded remaining download budget for ${currentUrl}`\n );\n }\n\n chunks.push(chunk);\n }\n\n budget.remaining -= received;\n const total = new Uint8Array(received);\n let offset = 0;\n for (const chunk of chunks) {\n total.set(chunk, offset);\n offset += chunk.byteLength;\n }\n\n return new TextDecoder(\"utf-8\", { fatal: false }).decode(total);\n }\n }\n\n private async assertHostAllowed(\n hostname: string,\n options: NormalizedOptions\n ): Promise<void> {\n const host = hostname.toLowerCase();\n\n if (options.denyHosts.includes(host)) {\n throw new Error(`Well-known host denied by policy: ${hostname}`);\n }\n\n if (options.allowHosts.length > 0 && !options.allowHosts.includes(host)) {\n throw new Error(`Well-known host is not in allowlist: ${hostname}`);\n }\n\n if (this.isLocalHostname(host)) {\n throw new Error(`Well-known host is not allowed: ${hostname}`);\n }\n\n const records = await this.resolveHostIps(host);\n for (const ip of records) {\n if (this.isPrivateOrLocalIp(ip)) {\n throw new Error(\n `Well-known host resolves to private/local address: ${hostname}`\n );\n }\n }\n }\n\n private isLocalHostname(host: string): boolean {\n return (\n host === \"localhost\" ||\n host.endsWith(\".local\") ||\n host.endsWith(\".internal\") ||\n host === \"0.0.0.0\"\n );\n }\n\n private async resolveHostIps(hostname: string): Promise<string[]> {\n const out = new Set<string>();\n try {\n const records = await dns.lookup(hostname, { all: true });\n for (const record of records) {\n out.add(record.address);\n }\n } catch {\n // keep empty; resolution failures will fail during fetch anyway\n }\n return [...out];\n }\n\n private isPrivateOrLocalIp(ip: string): boolean {\n if (!net.isIP(ip)) {\n return false;\n }\n\n if (net.isIPv4(ip)) {\n const parts = ip.split(\".\").map((x) => Number(x));\n const [a, b] = parts;\n if (a === 10 || a === 127 || a === 0) return true;\n if (a === 169 && b === 254) return true;\n if (a === 172 && b >= 16 && b <= 31) return true;\n if (a === 192 && b === 168) return true;\n if (a >= 224) return true;\n return false;\n }\n\n const value = ip.toLowerCase();\n return (\n value === \"::1\" ||\n value === \"::\" ||\n value.startsWith(\"fc\") ||\n value.startsWith(\"fd\") ||\n value.startsWith(\"fe80:\")\n );\n }\n}\n\nexport const wellKnownProvider = new SecureWellKnownProvider();\n", "import type {\n ProviderMatch,\n RemoteSkill,\n RemoteSkillsProvider,\n WellKnownFetchOptions,\n} from \"./types\";\n\ntype CatalogIndexEntry = {\n name: string;\n description: string;\n files: string[];\n};\n\ntype CatalogIndex = {\n skills: CatalogIndexEntry[];\n};\n\nconst DEFAULT_OPTIONS = {\n maxDownloadBytes: 5 * 1024 * 1024,\n timeoutMs: 10_000,\n maxFilesPerSkill: 128,\n maxSkillFileBytes: 512 * 1024,\n};\n\nexport class HttpCatalogProvider implements RemoteSkillsProvider {\n readonly id = \"catalog\";\n readonly displayName = \"HTTP Catalog Skills\";\n\n match(url: string): ProviderMatch {\n try {\n const parsed = new URL(url);\n if (parsed.protocol !== \"https:\") {\n return { matches: false };\n }\n return { matches: true, sourceIdentifier: this.getSourceIdentifier(url) };\n } catch {\n return { matches: false };\n }\n }\n\n getSourceIdentifier(url: string): string {\n const parsed = new URL(url);\n return `catalog/${parsed.host}${parsed.pathname.replace(/\\/+$/, \"\")}`;\n }\n\n async fetchAllSkills(\n url: string,\n options: WellKnownFetchOptions = {}\n ): Promise<RemoteSkill[]> {\n const parsed = new URL(url);\n if (parsed.protocol !== \"https:\") {\n throw new Error(\"Catalog provider requires HTTPS URLs\");\n }\n\n const maxDownloadBytes =\n options.maxDownloadBytes ?? DEFAULT_OPTIONS.maxDownloadBytes;\n const timeoutMs = options.timeoutMs ?? DEFAULT_OPTIONS.timeoutMs;\n const maxFilesPerSkill =\n options.maxFilesPerSkill ?? DEFAULT_OPTIONS.maxFilesPerSkill;\n const maxSkillFileBytes =\n options.maxSkillFileBytes ?? DEFAULT_OPTIONS.maxSkillFileBytes;\n\n const indexUrl = parsed.pathname.endsWith(\".json\")\n ? parsed.toString()\n : new URL(\n \"index.json\",\n parsed.toString().endsWith(\"/\")\n ? parsed.toString()\n : `${parsed.toString()}/`\n ).toString();\n const indexText = await this.fetchTextWithLimit(\n indexUrl,\n Math.min(maxDownloadBytes, maxSkillFileBytes),\n timeoutMs\n );\n const index = this.validateIndex(\n JSON.parse(indexText) as unknown,\n maxFilesPerSkill\n );\n\n const out: RemoteSkill[] = [];\n let remaining = maxDownloadBytes - indexText.length;\n const indexBase = indexUrl.slice(0, indexUrl.lastIndexOf(\"/\") + 1);\n for (const row of index.skills) {\n const files = new Map<string, string>();\n for (const rel of row.files) {\n this.assertSafeRelativePath(rel);\n const fileUrl = new URL(`${row.name}/${rel}`, indexBase).toString();\n if (remaining <= 0) {\n throw new Error(\"Catalog download budget exhausted\");\n }\n const text = await this.fetchTextWithLimit(\n fileUrl,\n Math.min(remaining, maxSkillFileBytes),\n timeoutMs\n );\n remaining -= text.length;\n files.set(rel, text);\n }\n out.push({\n name: row.name,\n description: row.description,\n installName: row.name,\n sourceUrl: new URL(`${row.name}/SKILL.md`, indexBase).toString(),\n sourceType: \"catalog\",\n files,\n });\n }\n return out;\n }\n\n private async fetchTextWithLimit(\n url: string,\n maxBytes: number,\n timeoutMs: number\n ): Promise<string> {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), timeoutMs);\n try {\n const response = await fetch(url, { signal: controller.signal });\n if (!response.ok) {\n throw new Error(\n `Catalog fetch failed (${response.status} ${response.statusText}) for ${url}`\n );\n }\n const bytes = new Uint8Array(await response.arrayBuffer());\n if (bytes.byteLength > maxBytes) {\n throw new Error(`Catalog file exceeds size limit for ${url}`);\n }\n return new TextDecoder(\"utf8\").decode(bytes);\n } finally {\n clearTimeout(timeout);\n }\n }\n\n private validateIndex(raw: unknown, maxFilesPerSkill: number): CatalogIndex {\n if (!raw || typeof raw !== \"object\") {\n throw new Error(\"Invalid catalog index: expected object\");\n }\n const data = raw as Record<string, unknown>;\n if (!Array.isArray(data.skills)) {\n throw new Error(\"Invalid catalog index: 'skills' must be an array\");\n }\n const skills: CatalogIndexEntry[] = data.skills.map((item, idx) => {\n if (!item || typeof item !== \"object\") {\n throw new Error(`Invalid catalog index entry[${idx}]`);\n }\n const row = item as Record<string, unknown>;\n const name = String(row.name || \"\").trim();\n const description = String(row.description || \"\").trim();\n const files = Array.isArray(row.files)\n ? row.files.map((x) => String(x))\n : [];\n if (!name || !description || files.length === 0) {\n throw new Error(\n `Invalid catalog index entry[${idx}]: missing required fields`\n );\n }\n if (files.length > maxFilesPerSkill) {\n throw new Error(`Too many files in catalog skill '${name}'`);\n }\n if (!files.some((f) => f.toLowerCase() === \"skill.md\")) {\n throw new Error(`Catalog skill '${name}' is missing SKILL.md`);\n }\n for (const file of files) {\n this.assertSafeRelativePath(file);\n }\n return { name, description, files };\n });\n return { skills };\n }\n\n private assertSafeRelativePath(filePath: string): void {\n if (\n !filePath ||\n filePath.startsWith(\"/\") ||\n filePath.startsWith(\"\\\\\") ||\n filePath.includes(\"..\") ||\n filePath.includes(\"\\\\\")\n ) {\n throw new Error(`Unsafe catalog file path: ${filePath}`);\n }\n }\n}\n\nexport const catalogProvider = new HttpCatalogProvider();\n", "export type {\n HostProvider,\n ProviderMatch,\n RemoteSkill,\n WellKnownFetchOptions,\n WellKnownProvider,\n RemoteSkillsProvider,\n} from \"./types\";\nexport {\n registry,\n registerProvider,\n findProvider,\n getProviders,\n getProviderById,\n} from \"./registry\";\nexport { SecureWellKnownProvider, wellKnownProvider } from \"./wellknown\";\nexport { HttpCatalogProvider, catalogProvider } from \"./catalog\";\n\nimport { registerProvider } from \"./registry\";\nimport { wellKnownProvider } from \"./wellknown\";\nimport { catalogProvider } from \"./catalog\";\n\nlet initialized = false;\n\nexport function initializeProviders(): void {\n if (initialized) {\n return;\n }\n registerProvider(wellKnownProvider);\n registerProvider(catalogProvider);\n initialized = true;\n}\n", "export type ExperimentalFeature = \"catalog\";\n\nexport function assertExperimentalFeatureEnabled(\n feature: ExperimentalFeature,\n enabled: boolean\n): void {\n if (enabled) {\n return;\n }\n\n if (feature === \"catalog\") {\n throw new Error(\n \"Catalog source is experimental and requires explicit experimental mode.\"\n );\n }\n}\n", "import path from \"node:path\";\nimport type {\n ParsedSource,\n Skill,\n AddOptions,\n} from \"../contracts/runtime-types\";\nimport { parseSource } from \"./source-parser\";\nimport { prepareSourceDir } from \"./git\";\nimport {\n discoverSkills,\n filterSkillsByName,\n stageRemoteSkillFilesToTempDir,\n} from \"./skills\";\nimport { getProviderById, initializeProviders } from \"../providers\";\nimport type { RemoteSkill, RemoteSkillsProvider } from \"../providers\";\n\nimport type { LockEntry } from \"../runtime/lockfile\";\nimport { assertExperimentalFeatureEnabled } from \"../application/experimental\";\n\nexport type SourceCandidate = {\n skill: Skill;\n sourceSkillPath?: string;\n wellKnownSourceUrl?: string;\n cleanup?: () => void;\n};\n\nexport async function resolveWellKnownSkills(\n sourceUrl: string,\n options: AddOptions,\n): Promise<RemoteSkill[]> {\n initializeProviders();\n const provider = getProviderById(\"well-known\");\n if (!provider) {\n throw new Error(\"Well-known provider is not registered\");\n }\n\n const wellKnown = provider as RemoteSkillsProvider;\n return wellKnown.fetchAllSkills(sourceUrl, {\n allowHosts: options.allowHost,\n denyHosts: options.denyHost,\n maxDownloadBytes: options.maxDownloadBytes,\n });\n}\n\nexport async function resolveCatalogSkills(\n sourceUrl: string,\n options: AddOptions,\n): Promise<RemoteSkill[]> {\n assertExperimentalFeatureEnabled(\"catalog\", Boolean(options.experimental));\n initializeProviders();\n const provider = getProviderById(\"catalog\");\n if (!provider) {\n throw new Error(\"Catalog provider is not registered\");\n }\n const catalog = provider as RemoteSkillsProvider;\n return catalog.fetchAllSkills(sourceUrl, {\n allowHosts: options.allowHost,\n denyHosts: options.denyHost,\n maxDownloadBytes: options.maxDownloadBytes,\n });\n}\n\nexport async function resolveSourceCandidates(\n sourceInput: string,\n options: AddOptions,\n requestedSkills?: string[],\n): Promise<SourceCandidate[]> {\n const parsed = parseSource(sourceInput);\n\n if (parsed.type === \"well-known\" || parsed.type === \"catalog\") {\n const remoteSkills =\n parsed.type === \"well-known\"\n ? await resolveWellKnownSkills(parsed.url, options)\n : await resolveCatalogSkills(parsed.url, options);\n const indexSkills: Skill[] = remoteSkills.map((remote) => ({\n name: remote.installName,\n description: remote.description,\n path: remote.sourceUrl,\n }));\n\n const selected = requestedSkills\n ? filterSkillsByName(indexSkills, requestedSkills)\n : indexSkills;\n const pickedNames = new Set(selected.map((item) => item.name));\n\n return remoteSkills\n .filter((remote) => pickedNames.has(remote.installName))\n .map((remote) => {\n const staged = stageRemoteSkillFilesToTempDir(remote.files);\n return {\n skill: {\n name: remote.installName,\n description: remote.description,\n path: staged.path,\n },\n wellKnownSourceUrl: remote.sourceUrl,\n cleanup: staged.cleanup,\n };\n });\n }\n\n const prepared = prepareSourceDir(\n parsed as Exclude<ParsedSource, { type: \"well-known\" | \"catalog\" }>,\n );\n try {\n const skills = discoverSkills(prepared.basePath);\n const selected = requestedSkills\n ? filterSkillsByName(skills, requestedSkills)\n : skills;\n\n return selected.map((skill) => ({\n skill,\n sourceSkillPath: path.relative(prepared.basePath, skill.path) || \".\",\n cleanup: prepared.cleanup,\n }));\n } catch (error) {\n if (prepared.cleanup) {\n prepared.cleanup();\n }\n throw error;\n }\n}\n\nexport async function resolveSkillFromLockEntry(\n entry: LockEntry,\n options: AddOptions,\n): Promise<SourceCandidate> {\n const parsed = parseSource(entry.source.input);\n\n if (parsed.type === \"well-known\" || parsed.type === \"catalog\") {\n const remoteSkills =\n parsed.type === \"well-known\"\n ? await resolveWellKnownSkills(parsed.url, options)\n : await resolveCatalogSkills(parsed.url, options);\n const matched = remoteSkills.find(\n (item) => item.installName === entry.source.selector.skillName,\n );\n if (!matched) {\n throw new Error(\n `Skill '${entry.source.selector.skillName}' not found in well-known source`,\n );\n }\n\n const staged = stageRemoteSkillFilesToTempDir(matched.files);\n return {\n skill: {\n name: matched.installName,\n description: matched.description,\n path: staged.path,\n },\n wellKnownSourceUrl: matched.sourceUrl,\n cleanup: staged.cleanup,\n };\n }\n\n const prepared = prepareSourceDir(\n parsed as Exclude<ParsedSource, { type: \"well-known\" | \"catalog\" }>,\n );\n\n try {\n let targetPath = prepared.basePath;\n if (entry.source.selector.relativePath) {\n targetPath = path.join(\n prepared.basePath,\n entry.source.selector.relativePath,\n );\n }\n\n const skills = discoverSkills(prepared.basePath);\n const byName = skills.find(\n (item) => item.name === entry.source.selector.skillName,\n );\n const byPath = skills.find(\n (item) => path.resolve(item.path) === path.resolve(targetPath),\n );\n const matched = byPath || byName;\n\n if (!matched) {\n throw new Error(\n `Skill '${entry.source.selector.skillName}' not found in source`,\n );\n }\n\n return {\n skill: matched,\n sourceSkillPath: path.relative(prepared.basePath, matched.path) || \".\",\n cleanup: prepared.cleanup,\n };\n } catch (error) {\n if (prepared.cleanup) {\n prepared.cleanup();\n }\n throw error;\n }\n}\n", "import fs from \"node:fs\";\nimport path from \"node:path\";\nimport YAML from \"yaml\";\nimport type {\n AgentType,\n InstallMode,\n ParsedSource,\n} from \"../contracts/runtime-types\";\nimport { parseSource } from \"../sources/source-parser\";\nimport { AGENTS, getAgentSkillsDir } from \"./agents\";\n\nexport type LockedSource = {\n input: string;\n type: ParsedSource[\"type\"];\n canonical?: string;\n pinnedRef?: string;\n resolvedPath?: string;\n isSymlinkSource?: boolean;\n selector: {\n skillName: string;\n relativePath?: string;\n wellKnownSourceUrl?: string;\n };\n};\n\nexport type LockEntry = {\n skillName: string;\n global: boolean;\n installMode: InstallMode;\n agents: AgentType[];\n canonicalDir: string;\n source: LockedSource;\n sourceHash: string;\n installedHash: string;\n updatedAt: string;\n};\n\nexport type SkillsLockfile = {\n version: 1;\n entries: LockEntry[];\n};\n\nexport type LockfileFormat = \"json\" | \"yaml\";\n\ntype SourceLoadIdentity = Pick<LockedSource, \"type\" | \"input\" | \"canonical\">;\n\nexport function resolveSourceLoadInput(source: SourceLoadIdentity): string {\n return source.type === \"local\" && source.canonical\n ? source.canonical\n : source.input;\n}\n\nexport function buildSourceIdentityCacheKey(parsed: ParsedSource): string {\n if (parsed.type === \"local\") {\n return `local:${parsed.localPath}`;\n }\n\n if (parsed.type === \"well-known\") {\n return `well-known:${parsed.url}`;\n }\n\n if (parsed.type === \"catalog\") {\n return `catalog:${parsed.url}`;\n }\n\n if (parsed.type === \"github\") {\n return `github:${parsed.repoUrl}:${parsed.ref || \"\"}:${parsed.subpath || \"\"}`;\n }\n\n return `git:${parsed.repoUrl}`;\n}\n\nexport function buildSourceLoadCacheKey(source: SourceLoadIdentity): string {\n return buildSourceIdentityCacheKey(parseSource(resolveSourceLoadInput(source)));\n}\n\nfunction perSkillLockfilePath(\n canonicalDir: string,\n format: LockfileFormat = \"json\",\n): string {\n if (format === \"yaml\") {\n return path.join(canonicalDir, \"skillspp-lock.yaml\");\n }\n return path.join(canonicalDir, \"skillspp-lock.json\");\n}\n\nfunction parseLockPayload(\n text: string,\n format: \"json\" | \"yaml\",\n): { version: 1; entry?: LockEntry; entries?: LockEntry[] } | null {\n const raw = (format === \"json\" ? JSON.parse(text) : YAML.parse(text)) as\n | { version: 1; entry?: LockEntry; entries?: LockEntry[] }\n | undefined;\n if (!raw || raw.version !== 1) {\n return null;\n }\n return raw;\n}\n\nfunction readPerSkillLockfile(canonicalDir: string): LockEntry | null {\n const jsonPath = perSkillLockfilePath(canonicalDir, \"json\");\n const yamlPath = perSkillLockfilePath(canonicalDir, \"yaml\");\n\n const raw = fs.existsSync(jsonPath)\n ? parseLockPayload(fs.readFileSync(jsonPath, \"utf8\"), \"json\")\n : fs.existsSync(yamlPath)\n ? parseLockPayload(fs.readFileSync(yamlPath, \"utf8\"), \"yaml\")\n : null;\n\n if (!raw) {\n return null;\n }\n\n if (raw.entry && typeof raw.entry.skillName === \"string\") {\n return raw.entry;\n }\n\n if (\n Array.isArray(raw.entries) &&\n raw.entries[0] &&\n typeof raw.entries[0].skillName === \"string\"\n ) {\n return raw.entries[0];\n }\n\n return null;\n}\n\nfunction writePerSkillLockfile(\n canonicalDir: string,\n entry: LockEntry,\n format: LockfileFormat,\n): void {\n const jsonPath = perSkillLockfilePath(canonicalDir, \"json\");\n const yamlPath = perSkillLockfilePath(canonicalDir, \"yaml\");\n fs.mkdirSync(canonicalDir, { recursive: true });\n if (format === \"yaml\") {\n fs.writeFileSync(yamlPath, YAML.stringify({ version: 1, entry }), \"utf8\");\n if (fs.existsSync(jsonPath)) {\n fs.rmSync(jsonPath, { force: true });\n }\n return;\n }\n\n fs.writeFileSync(\n jsonPath,\n `${JSON.stringify({ version: 1, entry }, null, 2)}\\n`,\n \"utf8\",\n );\n if (fs.existsSync(yamlPath)) {\n fs.rmSync(yamlPath, { force: true });\n }\n}\n\nfunction isSkillDirEntry(entry: fs.Dirent): boolean {\n return entry.isDirectory() || entry.isSymbolicLink();\n}\n\nfunction listInstalledSkillDirs(globalInstall: boolean, cwd: string): string[] {\n const out = new Set<string>();\n for (const agent of Object.keys(AGENTS) as AgentType[]) {\n const skillsRoot = getAgentSkillsDir(agent, globalInstall, cwd);\n if (!fs.existsSync(skillsRoot) || !fs.statSync(skillsRoot).isDirectory()) {\n continue;\n }\n for (const entry of fs.readdirSync(skillsRoot, { withFileTypes: true })) {\n if (!isSkillDirEntry(entry)) {\n continue;\n }\n out.add(path.join(skillsRoot, entry.name));\n }\n }\n\n return [...out];\n}\n\nfunction lockEntrySortTime(entry: LockEntry): number {\n const parsed = Date.parse(entry.updatedAt);\n return Number.isFinite(parsed) ? parsed : 0;\n}\n\nexport function readLockfile(\n globalInstall: boolean,\n cwd: string,\n): SkillsLockfile {\n const entriesBySkill = new Map<string, LockEntry>();\n for (const skillDir of listInstalledSkillDirs(globalInstall, cwd)) {\n const entry = readPerSkillLockfile(skillDir);\n if (!entry || typeof entry.skillName !== \"string\") {\n continue;\n }\n\n const existing = entriesBySkill.get(entry.skillName);\n if (\n !existing ||\n lockEntrySortTime(entry) > lockEntrySortTime(existing)\n ) {\n entriesBySkill.set(entry.skillName, entry);\n }\n }\n\n return {\n version: 1,\n entries: [...entriesBySkill.values()].sort((a, b) =>\n a.skillName.localeCompare(b.skillName),\n ),\n };\n}\n\nexport function writeLockfile(\n globalInstall: boolean,\n cwd: string,\n lockfile: SkillsLockfile,\n format: LockfileFormat = \"json\",\n): void {\n const normalized = [...lockfile.entries].sort((a, b) =>\n a.skillName.localeCompare(b.skillName),\n );\n\n for (const entry of normalized) {\n writePerSkillLockfile(entry.canonicalDir, entry, format);\n }\n}\n\nexport function upsertLockEntry(\n lockfile: SkillsLockfile,\n entry: LockEntry,\n): SkillsLockfile {\n const next = lockfile.entries.filter(\n (item) => item.skillName !== entry.skillName,\n );\n next.push(entry);\n return { version: 1, entries: next };\n}\n\nexport function removeLockEntry(\n lockfile: SkillsLockfile,\n skillName: string,\n): SkillsLockfile {\n return {\n version: 1,\n entries: lockfile.entries.filter((item) => item.skillName !== skillName),\n };\n}\n\nexport function listCanonicalSkillDirs(\n globalInstall: boolean,\n cwd: string,\n): string[] {\n return [...new Set(listInstalledSkillDirs(globalInstall, cwd).map((dir) => path.basename(dir)))]\n .sort((a, b) => a.localeCompare(b));\n}\n", "import { Command } from \"commander\";\nimport {\n parseStandaloneCommand,\n type CliCommandContext,\n} from \"../command-builder\";\nimport { runBackgroundTask } from \"../runtime/background-runner\";\nimport {\n completedStepsSection,\n failedStepsSection,\n flushUiFrame,\n hideLoader,\n linesSection,\n panelSection,\n renderStaticScreen,\n showLoader,\n sourceSection,\n} from \"../ui/screens\";\nimport { shortenHomePath } from \"../ui/format\";\n\nexport type FindOptions = {\n allowHost?: string[];\n denyHost?: string[];\n maxDownloadBytes?: number;\n experimental?: boolean;\n};\n\ntype FindCommanderOptions = {\n allowHost?: string[];\n denyHost?: string[];\n maxDownloadBytes?: string;\n};\n\nfunction toFindOptions(options: FindCommanderOptions): FindOptions {\n const maxDownloadBytes = options.maxDownloadBytes\n ? Number(options.maxDownloadBytes)\n : undefined;\n if (\n typeof maxDownloadBytes === \"number\" &&\n (!Number.isFinite(maxDownloadBytes) || maxDownloadBytes <= 0)\n ) {\n throw new Error(\n `Invalid --max-download-bytes value: ${options.maxDownloadBytes}`\n );\n }\n\n return {\n allowHost: options.allowHost?.map((item) => item.toLowerCase()),\n denyHost: options.denyHost?.map((item) => item.toLowerCase()),\n maxDownloadBytes,\n experimental: false,\n };\n}\n\ntype FindInventoryItem = {\n name: string;\n description: string;\n};\n\nfunction matchesQuery(\n name: string,\n description: string,\n query?: string\n): boolean {\n if (!query) {\n return true;\n }\n\n const q = query.trim().toLowerCase();\n if (!q) {\n return true;\n }\n\n return (\n name.toLowerCase().includes(q) || description.toLowerCase().includes(q)\n );\n}\n\nfunction resolveFindSourceTypeLabel(\n sourceType: \"local\" | \"github\" | \"git\" | \"well-known\" | \"catalog\"\n): string {\n switch (sourceType) {\n case \"local\":\n return \"local directory\";\n case \"github\":\n case \"git\":\n return \"git repository\";\n case \"well-known\":\n return \"well-known registry\";\n case \"catalog\":\n return \"catalog registry\";\n default:\n return \"\";\n }\n}\n\nasync function executeFind(\n source: string,\n query: string | undefined,\n options: FindOptions\n): Promise<void> {\n try {\n showLoader(\"loading\");\n await flushUiFrame();\n let failedLabel = \"failed to fetch skill inventory\";\n let inventory;\n try {\n inventory = await runBackgroundTask(\n {\n kind: \"find.fetchInventory\",\n payload: {\n cwd: process.cwd(),\n sourceInput: source,\n options,\n },\n },\n {\n onProgress: (label) => {\n if (label === \"parsing source\") {\n failedLabel = \"failed to parse source\";\n } else {\n failedLabel = \"failed to fetch skill inventory\";\n }\n showLoader(label);\n },\n }\n );\n } catch (error) {\n hideLoader();\n await renderStaticScreen([failedStepsSection([failedLabel])]);\n throw error;\n }\n hideLoader();\n\n showLoader(\"applying query filter\");\n await flushUiFrame();\n let filtered: FindInventoryItem[];\n try {\n filtered = inventory.skills\n .filter((item) => matchesQuery(item.name, item.description, query))\n .sort((a, b) => a.name.localeCompare(b.name));\n } catch (error) {\n hideLoader();\n await renderStaticScreen([\n failedStepsSection([\"failed to apply query filter\"]),\n ]);\n throw error;\n }\n hideLoader();\n\n const flowSections = [\n completedStepsSection([\n \"source parsed\",\n \"skill inventory fetched\",\n \"query filter applied\",\n ]),\n sourceSection(shortenHomePath(inventory.sourceLabel)),\n ];\n\n const queryTrimmed = query && query.trim().length > 0 ? query : \"\";\n\n if (queryTrimmed) {\n flowSections.push(\n panelSection({\n title: \"Query\",\n lines: [\n `Search term: ${queryTrimmed || \"(none)\"}`,\n \"Match against: skill name + description\",\n ],\n style: \"square\",\n minWidth: 74,\n })\n );\n }\n\n flowSections.push(\n panelSection({\n title: \"Source Context\",\n lines: [\n `Type: ${resolveFindSourceTypeLabel(inventory.sourceType)}`,\n \"Scope: all discovered SKILL.md entries\",\n ],\n style: \"square\",\n minWidth: 74,\n })\n );\n\n flowSections.push(\n panelSection({\n title: \"Match Summary\",\n lines: [\n `Found ${filtered.length} matching skill${\n filtered.length === 1 ? \"\" : \"s\"\n }`,\n \"Sorted by install name\",\n ],\n style: \"square\",\n minWidth: 74,\n })\n );\n\n if (filtered.length > 0) {\n const lines: string[] = [];\n for (const item of filtered) {\n lines.push(item.name);\n lines.push(` ${item.description}`);\n lines.push(\"\");\n }\n if (lines.length > 0 && lines[lines.length - 1] === \"\") {\n lines.pop();\n }\n flowSections.push(\n panelSection({\n title: \"Matching Skills\",\n lines,\n style: \"square\",\n minWidth: 74,\n })\n );\n\n const suggestedSkill = filtered[0].name;\n flowSections.push(\n panelSection({\n title: \"Suggested Next Step\",\n lines: [` skills add ${source} --skill ${suggestedSkill}`],\n style: \"square\",\n minWidth: 74,\n })\n );\n }\n\n const trailingLines: string[] = [\n ` Source: ${source}`,\n ` Found ${filtered.length} skill${filtered.length === 1 ? \"\" : \"s\"}`,\n \"\",\n ];\n if (filtered.length === 0) {\n trailingLines.push(\"No matching skills found.\");\n await renderStaticScreen([...flowSections, linesSection(trailingLines)]);\n return;\n }\n\n await renderStaticScreen([...flowSections, linesSection(trailingLines)]);\n } finally {\n hideLoader();\n }\n}\n\nfunction configureFindCommand(\n command: Command,\n action: (\n source: string,\n query: string | undefined,\n options: FindCommanderOptions\n ) => Promise<void>\n): Command {\n return command\n .description(\"Find skills in a source by optional query\")\n .argument(\"<source>\", \"Source path or URL\")\n .argument(\"[query]\", \"Optional search query\")\n .option(\"--allow-host <hosts...>\", \"Restrict well-known hosts to allowlist\")\n .option(\"--deny-host <hosts...>\", \"Block specific well-known hosts\")\n .option(\"--max-download-bytes <n>\", \"Set well-known download budget\")\n .action(action);\n}\n\nexport function registerFindCommand(\n program: Command,\n ctx: CliCommandContext\n): void {\n configureFindCommand(\n program.command(\"find\"),\n ctx.wrapAction(\n \"find\",\n async (\n source: string,\n query: string | undefined,\n options: FindCommanderOptions\n ) => {\n await executeFind(source, query, {\n ...toFindOptions(options),\n experimental: ctx.experimental,\n });\n }\n )\n );\n}\n\nexport async function runFind(args: string[]): Promise<void> {\n const command = configureFindCommand(\n new Command().name(\"find\"),\n async (source, query, options) => {\n await executeFind(source, query, toFindOptions(options));\n }\n );\n await parseStandaloneCommand(command, args);\n}\n", "import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { Command } from \"commander\";\nimport {\n AGENTS,\n ALL_AGENTS,\n normalizeAgentSelectionInput,\n resolveAgents,\n} from \"@skillspp/core/agents\";\nimport { askText, canUseInteractive } from \"../interactive\";\nimport { buildAgentConfigScaffoldPlan } from \"@skillspp/core/runtime/agent-config-mapper\";\nimport type { InstallerScaffoldFormat } from \"@skillspp/core/runtime/installer-scaffold\";\nimport { scaffoldInstallerConfigFile } from \"@skillspp/core/runtime/installer-scaffold\";\nimport {\n parseStandaloneCommand,\n type CliCommandContext,\n} from \"../command-builder\";\nimport type { AgentType } from \"@skillspp/core/contracts/runtime-types\";\nimport {\n completedStepsSection,\n failedStepsSection,\n linesSection,\n manySelectionClosedSection,\n panelSection,\n renderStaticScreen,\n singleSelectionClosedSection,\n} from \"../ui/screens\";\nimport { shortenHomePath } from \"../ui/format\";\nimport {\n type ManySelectionViewConfig,\n type SelectionKeyHint,\n runManySelectionStep,\n runOneSelectionStep,\n type SingleSelectionViewConfig,\n} from \"../ui/selection-step\";\nimport type { SelectionRow } from \"@skillspp/core/agents\";\n\ntype InitTemplate = \"general\" | \"framework\" | \"automation\";\n\ntype InitAnswers = {\n installerFormat: InstallerScaffoldFormat;\n name: string;\n description: string;\n template: InitTemplate;\n};\n\ntype InitQuestion<T extends keyof InitAnswers> = {\n id: T;\n when: (interactive: boolean) => boolean;\n ask: (defaults: InitAnswers) => Promise<InitAnswers[T]>;\n normalize: (value: InitAnswers[T], defaults: InitAnswers) => InitAnswers[T];\n};\n\ntype InitOptions = {\n nonInteractive?: boolean;\n nameArg?: string;\n yaml?: boolean;\n agent?: string[];\n};\n\ntype InitExecutionHooks = {\n emitCommandEvent?: (event: {\n eventType: string;\n reason: string;\n status: \"start\" | \"ok\" | \"error\" | \"warn\";\n error?: string;\n metadata?: Record<string, unknown>;\n }) => void;\n};\n\nconst INIT_ONE_KEY_HINTS: SelectionKeyHint[] = [\n { key: \"\u2191\u2193\", action: \"navigate\" },\n { key: \"enter\", action: \"confirm\" },\n];\n\nconst INIT_AGENTS_KEY_HINTS: SelectionKeyHint[] = [\n { key: \"\", action: \"type to filter\" },\n { key: \"space\", action: \"toggle\" },\n { key: \"enter\", action: \"confirm\" },\n];\n\nconst INIT_AGENTS_SELECTION_VIEW: ManySelectionViewConfig = {\n title: \"Choose Agents\",\n countLine: \"available agents\",\n instructionLine: \"Select agents (space to toggle)\",\n labelWidth: 30,\n descWidth: 40,\n minWidth: 74,\n defaultHints: INIT_AGENTS_KEY_HINTS,\n};\n\nconst INIT_ONE_SELECTION_VIEW: SingleSelectionViewConfig = {\n title: \"Select Option\",\n instructionLine: \"Choose one option\",\n minWidth: 74,\n};\n\nfunction buildInitAgentRows(agents: AgentType[]): SelectionRow[] {\n return agents.map((agent) => ({\n id: agent,\n label: AGENTS[agent].displayName,\n description: `~/${AGENTS[agent].globalSkillsDir.replace(/^\\/+/, \"\")}`,\n }));\n}\n\nfunction buildInitChoiceRows(\n choices: Array<{ id: string; label: string; description?: string }>,\n): SelectionRow[] {\n return choices.map((choice) => ({\n id: choice.id,\n label: choice.label,\n description: choice.description,\n }));\n}\n\nfunction renderInitAgentsClosedPanel(selectedIds: string[]) {\n return manySelectionClosedSection(\n INIT_AGENTS_SELECTION_VIEW,\n buildInitAgentRows(ALL_AGENTS),\n selectedIds,\n );\n}\n\nfunction defaultAnswers(cwd: string, options: InitOptions): InitAnswers {\n const nameArg = options.nameArg;\n const name = (nameArg || path.basename(cwd)).trim();\n return {\n installerFormat: options.yaml ? \"yaml\" : \"json\",\n name,\n description: \"A brief description of what this skill does\",\n template: \"general\",\n };\n}\n\nasync function chooseInitOne<T extends string>(options: {\n title: string;\n instruction: string;\n choices: Array<{ value: T; label: string; description?: string }>;\n defaultValue?: T;\n}): Promise<T> {\n const rows = buildInitChoiceRows(\n options.choices.map((choice) => ({\n id: choice.value,\n label: choice.label,\n description: choice.description,\n })),\n );\n\n const labelByValue = new Map(\n options.choices.map((choice) => [choice.value, choice.label]),\n );\n const selected = await runOneSelectionStep({\n interactive: true,\n rows,\n selectedId: options.defaultValue,\n shouldPrompt: true,\n prompt: {\n title: options.title,\n required: true,\n searchable: false,\n keyHints: INIT_ONE_KEY_HINTS,\n initialSelectedId: options.defaultValue,\n view: {\n ...INIT_ONE_SELECTION_VIEW,\n title: options.title,\n instructionLine: options.instruction,\n },\n },\n renderClosed: (selectedId) =>\n singleSelectionClosedSection(\n {\n ...INIT_ONE_SELECTION_VIEW,\n title: options.title,\n },\n labelByValue.get(selectedId as T) || selectedId,\n ),\n });\n\n return selected as T;\n}\n\nconst initQuestions: Array<InitQuestion<keyof InitAnswers>> = [\n {\n id: \"installerFormat\",\n when: (interactive) => interactive,\n ask: (defaults) =>\n chooseInitOne<InstallerScaffoldFormat>({\n title: \"Skill Installer Format\",\n instruction: \"Choose skill-installer config format\",\n choices: [\n {\n label: \"JSON (skill-installer.json)\",\n value: \"json\",\n },\n {\n label: \"YAML (skill-installer.yaml)\",\n value: \"yaml\",\n },\n ],\n defaultValue: defaults.installerFormat,\n }),\n normalize: (value) => (value || \"json\") as InstallerScaffoldFormat,\n },\n {\n id: \"name\",\n when: (interactive) => interactive,\n ask: (defaults) => askText(\"Skill name\", defaults.name),\n normalize: (value) => String(value || \"\").trim(),\n },\n {\n id: \"description\",\n when: (interactive) => interactive,\n ask: (defaults) => askText(\"Short description\", defaults.description),\n normalize: (value, defaults) => {\n const out = String(value || \"\").trim();\n return out || defaults.description;\n },\n },\n {\n id: \"template\",\n when: (interactive) => interactive,\n ask: (defaults) =>\n chooseInitOne<InitTemplate>({\n title: \"Template\",\n instruction: \"Select starter template\",\n choices: [\n { label: \"General\", value: \"general\" },\n { label: \"Framework\", value: \"framework\" },\n { label: \"Automation\", value: \"automation\" },\n ],\n defaultValue: defaults.template,\n }),\n normalize: (value) => (value || \"general\") as InitTemplate,\n },\n];\n\nfunction setAnswer<K extends keyof InitAnswers>(\n answers: InitAnswers,\n key: K,\n value: InitAnswers[K],\n): void {\n answers[key] = value;\n}\n\nasync function collectAnswers(options: InitOptions): Promise<InitAnswers> {\n const cwd = process.cwd();\n const defaults = defaultAnswers(cwd, options);\n const interactive = canUseInteractive(options.nonInteractive);\n\n const answers: InitAnswers = { ...defaults };\n for (const question of initQuestions) {\n if (!question.when(interactive)) {\n setAnswer(\n answers,\n question.id,\n question.normalize(answers[question.id], defaults),\n );\n continue;\n }\n\n const value = await question.ask(defaults);\n setAnswer(answers, question.id, question.normalize(value, defaults));\n }\n\n if (!answers.name) {\n throw new Error(\"Skill name cannot be empty\");\n }\n\n return answers;\n}\n\nasync function resolveInitAgents(options: InitOptions): Promise<AgentType[]> {\n const interactive = canUseInteractive(options.nonInteractive);\n const rows = buildInitAgentRows(ALL_AGENTS);\n const normalized = normalizeAgentSelectionInput(options.agent);\n if (normalized && normalized.length > 0) {\n const selected = normalized.includes(\"*\")\n ? ALL_AGENTS\n : resolveAgents(normalized);\n const selectedIds = await runManySelectionStep({\n interactive,\n rows,\n selectedIds: selected,\n shouldPrompt: false,\n prompt: {\n title: \"Choose Agents\",\n required: true,\n searchable: true,\n keyHints: INIT_AGENTS_KEY_HINTS,\n view: INIT_AGENTS_SELECTION_VIEW,\n },\n renderClosed: (selectedRowIds) =>\n renderInitAgentsClosedPanel(selectedRowIds),\n });\n return selectedIds as AgentType[];\n }\n\n if (!interactive) {\n throw new Error(\n \"Missing --agent in non-interactive mode. Provide at least one agent.\",\n );\n }\n\n const selected = await runManySelectionStep({\n interactive,\n rows,\n selectedIds: ALL_AGENTS,\n shouldPrompt: true,\n prompt: {\n title: \"Choose Agents\",\n required: true,\n searchable: true,\n keyHints: INIT_AGENTS_KEY_HINTS,\n initialSelectedIds: ALL_AGENTS,\n view: INIT_AGENTS_SELECTION_VIEW,\n },\n renderClosed: (selectedRowIds) =>\n renderInitAgentsClosedPanel(selectedRowIds),\n });\n if (selected.length === 0) {\n throw new Error(\"At least one agent must be selected\");\n }\n return selected as AgentType[];\n}\n\nfunction buildTemplateBody(template: InitTemplate): string {\n switch (template) {\n case \"framework\":\n return `## When to use\\n\\nUse this skill for framework-specific implementation and conventions.\\n\\n## Steps\\n\\n1. Confirm framework constraints and versions\\n2. Apply framework-safe patterns\\n3. Validate behavior with framework-focused checks\\n`;\n case \"automation\":\n return `## When to use\\n\\nUse this skill when automation, scripts, or repeatable operational tasks are needed.\\n\\n## Steps\\n\\n1. Confirm prerequisites and environment\\n2. Execute deterministic automation steps\\n3. Validate outputs and error handling\\n`;\n case \"general\":\n default:\n return `## When to use\\n\\nDescribe when this skill should be used.\\n\\n## Steps\\n\\n1. First step\\n2. Second step\\n3. Additional steps as needed\\n`;\n }\n}\n\nfunction renderSkillContent(answers: InitAnswers): string {\n return `---\\nname: ${answers.name}\\ndescription: ${\n answers.description\n }\\n---\\n\\n# ${\n answers.name\n }\\n\\nInstructions for the agent to follow when this skill is activated.\\n\\n${buildTemplateBody(\n answers.template,\n )}`;\n}\n\nfunction ensureInsideSkillDir(skillDir: string, relativePath: string): string {\n const destination = path.resolve(skillDir, relativePath);\n const relative = path.relative(skillDir, destination);\n if (!relative || relative.startsWith(\"..\") || path.isAbsolute(relative)) {\n throw new Error(`Unsafe agent config path: ${relativePath}`);\n }\n return destination;\n}\n\nexport async function runInit(args: string[]): Promise<void> {\n const command = configureInitCommand(\n new Command().name(\"init\"),\n async (name, options) => {\n await executeInit({\n nameArg: name,\n nonInteractive: Boolean(options.nonInteractive),\n yaml: Boolean(options.yaml),\n agent: options.agent,\n });\n },\n );\n await parseStandaloneCommand(command, args);\n}\n\nasync function executeInit(\n options: InitOptions,\n hooks?: InitExecutionHooks,\n): Promise<void> {\n const answers = await collectAnswers(options);\n const agents = await resolveInitAgents(options);\n const agentConfigPlan = buildAgentConfigScaffoldPlan(agents, {\n skillName: answers.name,\n description: answers.description,\n });\n\n const cwd = process.cwd();\n const requestedName = options.nameArg;\n const skillDir = requestedName ? path.join(cwd, answers.name) : cwd;\n const skillFile = path.join(skillDir, \"SKILL.md\");\n const summaryLines = [\n `Target directory: ${shortenHomePath(skillDir)}`,\n `Output file: ${shortenHomePath(skillFile)}`,\n `Installer format: ${answers.installerFormat.toUpperCase()}`,\n `Template: ${answers.template\n .charAt(0)\n .toUpperCase()}${answers.template.slice(1)}`,\n `Mapped agent configs: ${agentConfigPlan.mapped.length}`,\n ];\n if (agentConfigPlan.unmapped.length > 0) {\n summaryLines.push(\n `Unmapped agents (skipped): ${agentConfigPlan.unmapped.join(\n \", \",\n )} (no scaffold mapping)`,\n );\n }\n summaryLines.push(\"\");\n summaryLines.push(`name: ${answers.name}`);\n summaryLines.push(`description: ${answers.description}`);\n\n await renderStaticScreen([\n panelSection({\n title: \"Scaffold Summary\",\n lines: summaryLines,\n style: \"rounded\",\n minWidth: 74,\n }),\n ]);\n if (agentConfigPlan.unmapped.length > 0) {\n hooks?.emitCommandEvent?.({\n eventType: \"init_agent_scaffold_warning\",\n reason: \"unmapped_agent_scaffold\",\n status: \"warn\",\n metadata: {\n unmappedAgents: agentConfigPlan.unmapped,\n selectedAgentCount: agents.length,\n mappedConfigCount: agentConfigPlan.mapped.length,\n },\n });\n }\n\n const completedSteps: string[] = [];\n let failedLabel = \"failed to create directory\";\n\n try {\n const createDirectory = !fs.existsSync(skillDir);\n fs.mkdirSync(skillDir, { recursive: true });\n if (createDirectory) {\n completedSteps.push(\"directory created\");\n }\n\n failedLabel = \"failed to write SKILL.md\";\n if (fs.existsSync(skillFile)) {\n throw new Error(`SKILL.md already exists at: ${skillFile}`);\n }\n fs.writeFileSync(skillFile, `${renderSkillContent(answers)}\\n`, \"utf8\");\n completedSteps.push(\"SKILL.md written\");\n\n failedLabel = \"failed to scaffold installer config\";\n scaffoldInstallerConfigFile(skillDir, answers.installerFormat);\n completedSteps.push(\"installer config scaffolded\");\n\n failedLabel = \"failed to scaffold agent config\";\n for (const row of agentConfigPlan.mapped) {\n const destination = ensureInsideSkillDir(skillDir, row.path);\n if (fs.existsSync(destination)) {\n throw new Error(`Agent config already exists at: ${destination}`);\n }\n fs.mkdirSync(path.dirname(destination), { recursive: true });\n fs.writeFileSync(destination, row.content, \"utf8\");\n }\n if (agentConfigPlan.mapped.length > 0) {\n completedSteps.push(\"agent configs scaffolded\");\n }\n } catch (error) {\n await renderStaticScreen([failedStepsSection([failedLabel])]);\n throw error;\n }\n\n const sections = [];\n if (completedSteps.length > 0) {\n sections.push(completedStepsSection(completedSteps));\n }\n sections.push(linesSection([`Initialized skill: ${skillFile}`]));\n await renderStaticScreen(sections);\n}\n\ntype InitCommanderOptions = {\n nonInteractive?: boolean;\n yaml?: boolean;\n agent?: string[];\n};\n\nfunction configureInitCommand(\n command: Command,\n action: (\n name: string | undefined,\n options: InitCommanderOptions,\n ) => Promise<void>,\n): Command {\n return command\n .description(\"Create a new SKILL.md template\")\n .argument(\"[name]\", \"Optional skill directory/name\")\n .option(\"-a, --agent <agents...>\", \"Target agent(s) for config scaffolding\")\n .option(\n \"--yaml\",\n \"Create skill-installer.yaml when scaffolding installer config\",\n )\n .option(\"--non-interactive\", \"Disable prompts\")\n .action(action);\n}\n\nexport function registerInitCommand(\n program: Command,\n ctx: CliCommandContext,\n): void {\n configureInitCommand(\n program.command(\"init\"),\n ctx.wrapAction(\n \"init\",\n async (name: string | undefined, options: InitCommanderOptions) => {\n await executeInit({\n nameArg: name,\n nonInteractive: Boolean(options.nonInteractive),\n yaml: Boolean(options.yaml),\n agent: options.agent,\n }, {\n emitCommandEvent: (event) => ctx.emitCommandEvent(\"init\", event),\n });\n },\n ),\n );\n}\n", "import YAML from \"yaml\";\nimport type { AgentType } from \"../contracts/runtime-types\";\n\nexport type AgentConfigTemplateInput = {\n skillName: string;\n description: string;\n};\n\nexport type AgentConfigMapping = {\n path: string;\n renderContent: (input: AgentConfigTemplateInput) => string;\n};\n\nfunction normalizeDescription(text: string): string {\n return text.trim().replace(/\\.+$/, \"\");\n}\n\nfunction buildDefaultPrompt(input: AgentConfigTemplateInput): string {\n const desc = normalizeDescription(input.description) || \"execute this skill\";\n return `Use $${input.skillName} to ${desc}.`;\n}\n\nfunction renderOpenAiInterfaceYaml(input: AgentConfigTemplateInput): string {\n const payload = {\n interface: {\n display_name: input.skillName,\n short_description: normalizeDescription(input.description),\n default_prompt: buildDefaultPrompt(input),\n },\n };\n return YAML.stringify(payload);\n}\n\nexport const AGENT_INIT_CONFIG_MAPPINGS: Partial<\n Record<AgentType, AgentConfigMapping>\n> = {\n codex: {\n path: \"agents/openai.yaml\",\n renderContent: renderOpenAiInterfaceYaml,\n },\n};\n\nexport function resolveAgentInitConfigMapping(\n agent: AgentType\n): AgentConfigMapping | undefined {\n return AGENT_INIT_CONFIG_MAPPINGS[agent];\n}\n\nexport function buildAgentConfigScaffoldPlan(\n agents: AgentType[],\n input: AgentConfigTemplateInput\n): {\n mapped: Array<{ agent: AgentType; path: string; content: string }>;\n unmapped: AgentType[];\n} {\n const mapped: Array<{ agent: AgentType; path: string; content: string }> = [];\n const unmapped: AgentType[] = [];\n const seenPaths = new Set<string>();\n\n for (const agent of agents) {\n const mapping = resolveAgentInitConfigMapping(agent);\n if (!mapping) {\n unmapped.push(agent);\n continue;\n }\n\n if (seenPaths.has(mapping.path)) {\n continue;\n }\n seenPaths.add(mapping.path);\n\n mapped.push({\n agent,\n path: mapping.path,\n content: mapping.renderContent(input),\n });\n }\n\n return { mapped, unmapped };\n}\n", "import fs from \"node:fs\";\nimport path from \"node:path\";\nimport YAML from \"yaml\";\n\nexport type InstallerScaffoldFormat = \"json\" | \"yaml\";\n\ntype InstallerConfigState = {\n yamlPath: string;\n jsonPath: string;\n hasYaml: boolean;\n hasJson: boolean;\n missing: boolean;\n};\n\nfunction installerConfigSkeleton(): {\n schemaVersion: 1;\n dependencies: unknown[];\n \"pre-install\": string[];\n \"post-install\": string[];\n} {\n return {\n schemaVersion: 1,\n dependencies: [],\n \"pre-install\": [],\n \"post-install\": [],\n };\n}\n\nfunction isFile(filePath: string): boolean {\n return fs.existsSync(filePath) && fs.statSync(filePath).isFile();\n}\n\nexport function getInstallerConfigState(\n skillDir: string\n): InstallerConfigState {\n const yamlPath = path.join(skillDir, \"skill-installer.yaml\");\n const jsonPath = path.join(skillDir, \"skill-installer.json\");\n const hasYaml = isFile(yamlPath);\n const hasJson = isFile(jsonPath);\n\n if (hasYaml && hasJson) {\n throw new Error(\n \"Both skill-installer.yaml and skill-installer.json exist. Keep only one installer config file.\"\n );\n }\n\n return {\n yamlPath,\n jsonPath,\n hasYaml,\n hasJson,\n missing: !hasYaml && !hasJson,\n };\n}\n\nexport function listSkillsMissingInstallerConfig(\n skillDirs: string[]\n): string[] {\n return skillDirs.filter(\n (skillDir) => getInstallerConfigState(skillDir).missing\n );\n}\n\nexport function scaffoldInstallerConfigFile(\n skillDir: string,\n format: InstallerScaffoldFormat\n): { created: boolean; filePath?: string } {\n const state = getInstallerConfigState(skillDir);\n if (!state.missing) {\n return { created: false };\n }\n\n const content =\n format === \"yaml\"\n ? YAML.stringify(installerConfigSkeleton())\n : JSON.stringify(installerConfigSkeleton(), null, 2);\n const destinationPath = format === \"yaml\" ? state.yamlPath : state.jsonPath;\n fs.writeFileSync(destinationPath, `${content}\\n`, \"utf8\");\n return { created: true, filePath: destinationPath };\n}\n\nexport function scaffoldInstallerConfigForSkills(\n skillDirs: string[],\n format: InstallerScaffoldFormat\n): string[] {\n const created: string[] = [];\n for (const skillDir of skillDirs) {\n const result = scaffoldInstallerConfigFile(skillDir, format);\n if (result.created && result.filePath) {\n created.push(result.filePath);\n }\n }\n return created;\n}\n", "import { Command } from \"commander\";\nimport type {\n AgentType,\n ListOptions,\n} from \"@skillspp/core/contracts/runtime-types\";\nimport { AGENTS, normalizeAgentSelectionInput } from \"@skillspp/core/agents\";\nimport { canUseInteractive } from \"../interactive\";\nimport {\n parseStandaloneCommand,\n type CliCommandContext,\n} from \"../command-builder\";\nimport { runBackgroundTask } from \"../runtime/background-runner\";\nimport {\n type ManySelectionViewConfig,\n type SelectionKeyHint,\n runManySelectionStep,\n} from \"../ui/selection-step\";\nimport {\n flushUiFrame,\n hideLoader,\n manySelectionClosedSection,\n panelSection,\n renderStaticScreen,\n showLoader,\n} from \"../ui/screens\";\nimport type { SelectionRow } from \"@skillspp/core/agents\";\nimport { shortenHomePath } from \"../ui/format\";\nimport { bold, colorToken, dim } from \"../ui/colors\";\n\ntype ListCommanderOptions = {\n agent?: string[];\n global?: boolean;\n nonInteractive?: boolean;\n};\n\nfunction toListOptions(options: ListCommanderOptions): ListOptions {\n return {\n global: Boolean(options.global),\n agent: normalizeAgentSelectionInput(options.agent),\n agentFlagProvided: Boolean(options.agent && options.agent.length > 0),\n nonInteractive: Boolean(options.nonInteractive),\n };\n}\n\nconst AGENT_LABEL_WIDTH = 26;\nconst AGENT_DESC_WIDTH = 40;\n\nconst LIST_AGENTS_KEY_HINTS: SelectionKeyHint[] = [\n { key: \"\", action: \"type to filter\" },\n { key: \"space\", action: \"toggle\" },\n { key: \"enter\", action: \"confirm\" },\n];\n\nconst LIST_AGENTS_SELECTION_VIEW: ManySelectionViewConfig = {\n title: \"Choose Agents\",\n countLine: \"installed agents detected\",\n instructionLine: \"Select agents to list (space to toggle)\",\n labelWidth: AGENT_LABEL_WIDTH,\n descWidth: AGENT_DESC_WIDTH,\n minWidth: 74,\n defaultHints: LIST_AGENTS_KEY_HINTS,\n};\n\nfunction buildListAgentSelectionRows(agents: AgentType[]): SelectionRow[] {\n return agents.map((agent) => ({\n id: agent,\n label: AGENTS[agent].displayName,\n description: `~/${AGENTS[agent].globalSkillsDir.replace(/^\\/+/, \"\")}`,\n }));\n}\n\nfunction renderListAgentsPanel(options: {\n agents: AgentType[];\n selectedAgents: AgentType[];\n}) {\n return manySelectionClosedSection(\n LIST_AGENTS_SELECTION_VIEW,\n buildListAgentSelectionRows(options.agents),\n options.selectedAgents,\n );\n}\n\nfunction renderListScopePanel(options: {\n globalInstall: boolean;\n agentFilter: string;\n}) {\n return panelSection({\n title: \"List Scope\",\n lines: [\n `Scope: ${options.globalInstall ? \"global skills\" : \"project skills\"}`,\n `Agent filter: ${options.agentFilter}`,\n ],\n style: \"square\",\n minWidth: 74,\n });\n}\n\nfunction renderListInventorySummary(skillCount: number) {\n return panelSection({\n title: \"Inventory Summary\",\n lines: [\n `${skillCount} unique skills found`,\n \"Grouped by (skill name + resolved path)\",\n ],\n style: \"square\",\n minWidth: 74,\n });\n}\n\nfunction renderListInstalledSkillsPanel(\n rows: Array<{ name: string; resolvedPath: string; agents: string[] }>,\n) {\n const sortedRows = [...rows].sort((a, b) => {\n const byName = a.name.localeCompare(b.name);\n if (byName !== 0) {\n return byName;\n }\n return a.resolvedPath.localeCompare(b.resolvedPath);\n });\n const uniqueSkillCount = new Set(sortedRows.map((row) => row.name)).size;\n const targetCount = sortedRows.reduce(\n (count, row) => count + row.agents.length,\n 0,\n );\n\n const lines: string[] = [];\n lines.push(\n `${bold(\"Skills:\")} ${dim(uniqueSkillCount.toString())} ${bold(\n \"Entries:\",\n )} ${dim(sortedRows.length.toString())} ${bold(\"Targets:\")} ${dim(\n targetCount.toString(),\n )}`,\n );\n lines.push(\"\");\n lines.push(\"Targets\");\n\n let activeSkill = \"\";\n for (const row of sortedRows) {\n if (row.name !== activeSkill) {\n activeSkill = row.name;\n lines.push(\"\");\n lines.push(colorToken(` ${row.name}`, \"primary\"));\n }\n const agents = [...row.agents].sort((a, b) => a.localeCompare(b));\n for (const agent of agents) {\n lines.push(\n ` - ${agent.padEnd(16, \" \")} ${dim(\n shortenHomePath(row.resolvedPath),\n )}`,\n );\n }\n }\n\n return panelSection({\n title: \"Installed Skills\",\n lines,\n style: \"square\",\n minWidth: 74,\n });\n}\n\nasync function executeList(options: ListOptions): Promise<void> {\n const interactive = canUseInteractive(options.nonInteractive);\n\n try {\n showLoader(\"detecting installed agents\");\n await flushUiFrame();\n let agents = (\n await runBackgroundTask(\n {\n kind: \"list.detectAgents\",\n payload: {\n cwd: process.cwd(),\n options,\n },\n },\n {\n onProgress: (label) => {\n showLoader(label);\n },\n },\n )\n ).agents;\n hideLoader();\n\n if (agents.length === 0) {\n await renderStaticScreen([\n renderListScopePanel({\n globalInstall: Boolean(options.global),\n agentFilter: options.agentFlagProvided\n ? \"explicit selection\"\n : \"auto-detect installed agents\",\n }),\n panelSection({\n title: \"Installed Skills\",\n lines: [\"No installed skills found.\"],\n style: \"square\",\n minWidth: 74,\n }),\n ]);\n return;\n }\n\n agents = (await runManySelectionStep({\n interactive,\n rows: buildListAgentSelectionRows(agents),\n selectedIds: agents,\n shouldPrompt:\n !options.agentFlagProvided && agents.length > 1 && interactive,\n prompt: {\n title: \"Choose Agents\",\n required: true,\n requiredMessage: \"At least one agent must be selected\",\n searchable: true,\n keyHints: LIST_AGENTS_KEY_HINTS,\n view: LIST_AGENTS_SELECTION_VIEW,\n },\n renderClosed: (selectedIds) =>\n renderListAgentsPanel({\n agents,\n selectedAgents: selectedIds as typeof agents,\n }),\n })) as typeof agents;\n\n showLoader(\"scanning installed skills\");\n await flushUiFrame();\n const { rows } = await runBackgroundTask(\n {\n kind: \"list.scanInventory\",\n payload: {\n cwd: process.cwd(),\n globalInstall: Boolean(options.global),\n agents,\n },\n },\n {\n onProgress: (label) => {\n showLoader(label);\n },\n },\n );\n hideLoader();\n\n const agentFilter = options.agentFlagProvided\n ? options.agent?.includes(\"*\")\n ? \"all agents\"\n : agents.map((agent) => AGENTS[agent].displayName).join(\", \") || \"none\"\n : \"auto-detect installed agents\";\n\n if (rows.length === 0) {\n await renderStaticScreen([\n renderListScopePanel({\n globalInstall: Boolean(options.global),\n agentFilter,\n }),\n panelSection({\n title: \"Installed Skills\",\n lines: [\"No installed skills found.\"],\n style: \"square\",\n minWidth: 74,\n }),\n ]);\n return;\n }\n\n await renderStaticScreen([\n renderListScopePanel({\n globalInstall: Boolean(options.global),\n agentFilter,\n }),\n renderListInventorySummary(rows.length),\n renderListInstalledSkillsPanel(rows),\n ]);\n } finally {\n hideLoader();\n }\n}\n\nfunction configureListCommand(\n command: Command,\n action: (options: ListCommanderOptions) => Promise<void>,\n): Command {\n return command\n .description(\"List installed skills\")\n .option(\"-a, --agent <agents...>\", \"Filter by agent(s)\")\n .option(\"-g, --global\", \"List global installs\")\n .option(\"--non-interactive\", \"Disable prompts\")\n .action(action);\n}\n\nexport function registerListCommand(\n program: Command,\n ctx: CliCommandContext,\n): void {\n configureListCommand(\n program.command(\"list\").alias(\"ls\"),\n ctx.wrapAction(\"list\", async (options: ListCommanderOptions) => {\n await executeList(toListOptions(options));\n }),\n );\n}\n\nexport async function runList(args: string[]): Promise<void> {\n const command = configureListCommand(\n new Command().name(\"list\"),\n async (options) => {\n await executeList(toListOptions(options));\n },\n );\n await parseStandaloneCommand(command, args);\n}\n", "import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { Command } from \"commander\";\nimport type {\n AgentType,\n RemoveOptions,\n} from \"@skillspp/core/contracts/runtime-types\";\nimport {\n AGENTS,\n STANDARD_AGENTS,\n resolveAddAgentSelectionRows,\n resolveAgents,\n getAgentSkillsDir,\n normalizeAgentSelectionInput,\n} from \"@skillspp/core/agents\";\nimport { canUseInteractive } from \"../interactive\";\nimport {\n parseStandaloneCommand,\n type CliCommandContext,\n} from \"../command-builder\";\nimport {\n type ManySelectionViewConfig,\n type SelectionKeyHint,\n runManySelectionStep,\n runOneSelectionStep,\n type SingleSelectionViewConfig,\n} from \"../ui/selection-step\";\nimport {\n completedStepsSection,\n failedStepsSection,\n linesSection,\n manySelectionClosedSection,\n removeCompletionSummarySection,\n renderStaticScreen,\n singleSelectionClosedSection,\n sourceSection,\n uninstallSummarySection,\n} from \"../ui/screens\";\nimport { shortenHomePath } from \"../ui/format\";\nimport type { SelectionRow } from \"@skillspp/core/agents\";\n\ntype RemoveCommanderOptions = {\n agent?: string[];\n skill?: string[];\n all?: boolean;\n global?: boolean;\n nonInteractive?: boolean;\n};\n\nfunction toRemoveOptions(options: RemoveCommanderOptions): RemoveOptions {\n const parsed: RemoveOptions = {\n global: Boolean(options.global),\n agent: normalizeAgentSelectionInput(options.agent),\n agentFlagProvided: Boolean(options.agent && options.agent.length > 0),\n skill: options.skill,\n all: Boolean(options.all),\n nonInteractive: Boolean(options.nonInteractive),\n };\n return parsed;\n}\n\nconst SKILL_NAME_WIDTH = 38;\nconst SKILL_DESC_WIDTH = 1;\nconst AGENT_NAME_WIDTH = 26;\nconst AGENT_DESC_WIDTH = 40;\n\nconst REMOVE_SKILLS_KEY_HINTS: SelectionKeyHint[] = [\n { key: \"\", action: \"type to search\" },\n { key: \"space\", action: \"toggle\" },\n { key: \"ctrl+a\", action: \"all\" },\n { key: \"ctrl+l\", action: \"invert\" },\n { key: \"enter\", action: \"confirm\" },\n];\n\nconst REMOVE_AGENTS_KEY_HINTS: SelectionKeyHint[] = [\n { key: \"\", action: \"type to search\" },\n { key: \"space\", action: \"toggle\" },\n { key: \"ctrl+a\", action: \"all\" },\n { key: \"ctrl+l\", action: \"invert\" },\n { key: \"enter\", action: \"confirm\" },\n];\n\nconst REMOVE_CONFIRM_KEY_HINTS: SelectionKeyHint[] = [\n { key: \"\u2191\u2193\", action: \"navigate\" },\n { key: \"enter\", action: \"confirm\" },\n];\n\nconst REMOVE_SKILLS_SELECTION_VIEW: ManySelectionViewConfig = {\n title: \"Choose Skills\",\n countLine: \"installed\",\n instructionLine: \"Select skills to uninstall (space to toggle)\",\n labelWidth: SKILL_NAME_WIDTH,\n descWidth: SKILL_DESC_WIDTH,\n minWidth: 74,\n defaultHints: REMOVE_SKILLS_KEY_HINTS,\n};\n\nconst REMOVE_AGENTS_SELECTION_VIEW: ManySelectionViewConfig = {\n title: \"Choose Agents\",\n countLine: \"detected for selected skills\",\n instructionLine: \"Select agents to remove from (space to toggle)\",\n labelWidth: AGENT_NAME_WIDTH,\n descWidth: AGENT_DESC_WIDTH,\n minWidth: 74,\n defaultHints: REMOVE_AGENTS_KEY_HINTS,\n};\n\nconst REMOVE_CONFIRM_SELECTION_VIEW: SingleSelectionViewConfig = {\n title: \"Confirm Uninstall\",\n instructionLine: \"Confirm uninstall operation\",\n minWidth: 74,\n};\n\nasync function renderRemoveFlowHeader(): Promise<void> {}\n\nfunction buildRemoveSkillSelectionRows(skillNames: string[]): SelectionRow[] {\n return skillNames.map((name) => ({\n id: name,\n label: name,\n }));\n}\n\nfunction buildRemoveAgentSelectionRows(\n agents: AgentType[],\n scopedAgentRowsById: Map<AgentType, SelectionRow>,\n): SelectionRow[] {\n return agents.map((agent) => ({\n id: agent,\n label: scopedAgentRowsById.get(agent)?.label ?? AGENTS[agent].displayName,\n description: scopedAgentRowsById.get(agent)?.description,\n }));\n}\n\nfunction buildRemoveConfirmSelectionRows(): SelectionRow[] {\n return [\n { id: \"yes\", label: \"Yes\" },\n { id: \"no\", label: \"No\" },\n ];\n}\n\nfunction renderRemoveSkillsPanel(options: {\n skills: string[];\n selectedNames: string[];\n}) {\n return manySelectionClosedSection(\n REMOVE_SKILLS_SELECTION_VIEW,\n buildRemoveSkillSelectionRows(options.skills),\n options.selectedNames,\n );\n}\n\nfunction renderRemoveAgentsPanel(options: {\n agents: AgentType[];\n selectedAgents: AgentType[];\n scopedAgentRowsById: Map<AgentType, SelectionRow>;\n}) {\n return manySelectionClosedSection(\n REMOVE_AGENTS_SELECTION_VIEW,\n buildRemoveAgentSelectionRows(options.agents, options.scopedAgentRowsById),\n options.selectedAgents,\n );\n}\n\nfunction renderRemoveConfirmPanel(options: { selectedId: string }) {\n return singleSelectionClosedSection(\n REMOVE_CONFIRM_SELECTION_VIEW,\n options.selectedId === \"no\" ? \"No\" : \"Yes\",\n );\n}\n\nfunction renderRemoveUninstallSummaryBox(options: {\n globalInstall: boolean;\n skillNames: string[];\n agentDisplayNames: string[];\n}) {\n return uninstallSummarySection(options);\n}\n\ntype InstallIndex = {\n agentsBySkill: Map<string, Set<AgentType>>;\n skillsByAgent: Map<AgentType, Set<string>>;\n};\n\nfunction isSkillEntry(entry: fs.Dirent): boolean {\n return entry.isDirectory() || entry.isSymbolicLink();\n}\n\nfunction buildInstallIndex(globalInstall: boolean, cwd: string): InstallIndex {\n const agentsBySkill = new Map<string, Set<AgentType>>();\n const skillsByAgent = new Map<AgentType, Set<string>>();\n const allAgents = Object.keys(AGENTS) as AgentType[];\n\n for (const agent of allAgents) {\n const dir = getAgentSkillsDir(agent, globalInstall, cwd);\n if (!fs.existsSync(dir) || !fs.statSync(dir).isDirectory()) {\n continue;\n }\n\n const names = new Set<string>();\n for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {\n if (!isSkillEntry(entry)) {\n continue;\n }\n names.add(entry.name);\n const owners = agentsBySkill.get(entry.name) ?? new Set<AgentType>();\n owners.add(agent);\n agentsBySkill.set(entry.name, owners);\n }\n\n if (names.size > 0) {\n skillsByAgent.set(agent, names);\n }\n }\n\n return { agentsBySkill, skillsByAgent };\n}\n\nfunction uniqueSorted(values: Iterable<string>): string[] {\n return Array.from(new Set(values)).sort((a, b) => a.localeCompare(b));\n}\n\nfunction orderAgentsForDisplay(agents: AgentType[]): AgentType[] {\n return Array.from(new Set(agents)).sort((a, b) => {\n if (a === \"universal\" && b !== \"universal\") {\n return -1;\n }\n if (b === \"universal\" && a !== \"universal\") {\n return 1;\n }\n return a.localeCompare(b);\n });\n}\n\nfunction resolveCandidateAgentsForSkills(\n skillNames: string[],\n index: InstallIndex,\n): AgentType[] {\n return orderAgentsForDisplay(\n skillNames.flatMap((name) =>\n Array.from(index.agentsBySkill.get(name) ?? []),\n ),\n );\n}\n\nasync function executeRemove(\n positional: string[],\n options: RemoveOptions,\n): Promise<void> {\n const interactive = canUseInteractive(options.nonInteractive);\n await renderRemoveFlowHeader();\n const cwd = process.cwd();\n const globalInstall = Boolean(options.global);\n let index: InstallIndex;\n try {\n index = buildInstallIndex(globalInstall, cwd);\n } catch (error) {\n await renderStaticScreen([\n failedStepsSection([\"failed to index installed skills\"]),\n ]);\n throw error;\n }\n if (index.agentsBySkill.size === 0) {\n throw new Error(\"No installed skills found to remove.\");\n }\n\n const allSkillCandidates = uniqueSorted(index.agentsBySkill.keys());\n if (allSkillCandidates.length === 0) {\n throw new Error(\"No installed skills found to remove.\");\n }\n const scope = globalInstall ? \"global\" : \"local\";\n const scopedAgentRows = resolveAddAgentSelectionRows(scope);\n const scopedAgentRowsById = new Map<AgentType, SelectionRow>(\n scopedAgentRows.map((row) => [row.id as AgentType, row]),\n );\n const scopeAllowedAgents = new Set<AgentType>(\n scope === \"global\"\n ? (Object.keys(AGENTS) as AgentType[])\n : (Object.keys(STANDARD_AGENTS) as AgentType[]),\n );\n\n const explicitSkills = [...(options.skill || []), ...positional];\n let finalSkills = uniqueSorted(explicitSkills);\n let requiresInteractiveSkillSelection = false;\n if (!options.all && finalSkills.length === 0) {\n if (allSkillCandidates.length === 1) {\n finalSkills = [allSkillCandidates[0]];\n } else if (interactive) {\n requiresInteractiveSkillSelection = true;\n } else {\n throw new Error(\n \"Multiple installed skills found. Use --skill <name>... or run in TTY without --non-interactive.\",\n );\n }\n }\n\n let agents: AgentType[] = [];\n let candidateAgents: AgentType[] = [];\n try {\n if (options.agent && options.agent.length > 0) {\n if (options.agent.includes(\"*\")) {\n candidateAgents = orderAgentsForDisplay(\n Array.from(index.skillsByAgent.keys()),\n );\n agents = candidateAgents;\n } else {\n const resolved = resolveAgents(options.agent);\n const outOfScopeAgents = resolved.filter(\n (agent) => !scopeAllowedAgents.has(agent),\n );\n if (outOfScopeAgents.length > 0) {\n throw new Error(\n `Agent(s) not available in ${scope} scope: ${outOfScopeAgents.join(\n \", \",\n )}`,\n );\n }\n candidateAgents = resolved;\n agents = candidateAgents;\n }\n } else {\n candidateAgents = options.all\n ? orderAgentsForDisplay(Array.from(index.skillsByAgent.keys()))\n : finalSkills.length > 0\n ? resolveCandidateAgentsForSkills(finalSkills, index)\n : [];\n\n if (candidateAgents.length === 0 && !requiresInteractiveSkillSelection) {\n throw new Error(\"No installed skills found to remove.\");\n }\n if (candidateAgents.length === 1) {\n agents = candidateAgents;\n } else if (candidateAgents.length > 1 && !interactive) {\n throw new Error(\n \"Multiple agents found. Use --agent <name>... or run in TTY without --non-interactive.\",\n );\n }\n }\n candidateAgents = candidateAgents.filter((agent) =>\n scopeAllowedAgents.has(agent),\n );\n agents = agents.filter((agent) => scopeAllowedAgents.has(agent));\n candidateAgents = orderAgentsForDisplay(candidateAgents);\n agents = orderAgentsForDisplay(agents);\n } catch (error) {\n await renderStaticScreen([\n failedStepsSection([\"failed to resolve target candidates\"]),\n ]);\n throw error;\n }\n\n await renderStaticScreen([\n completedStepsSection([\n \"installed skills indexed\",\n \"target candidates resolved\",\n \"interactive session ready\",\n ]),\n sourceSection(shortenHomePath(cwd)),\n ]);\n\n let renderedSkillsPanel = false;\n if (!options.all) {\n finalSkills = await runManySelectionStep({\n interactive,\n rows: buildRemoveSkillSelectionRows(allSkillCandidates),\n selectedIds: finalSkills,\n shouldPrompt: requiresInteractiveSkillSelection,\n prompt: {\n title: \"Choose Skills\",\n required: true,\n requiredMessage: \"At least one skill must be selected\",\n searchable: true,\n keyHints: REMOVE_SKILLS_KEY_HINTS,\n view: REMOVE_SKILLS_SELECTION_VIEW,\n },\n renderClosed: (selectedIds) =>\n renderRemoveSkillsPanel({\n skills: allSkillCandidates,\n selectedNames: selectedIds,\n }),\n });\n renderedSkillsPanel = true;\n }\n\n if (!options.agent || options.agent.length === 0) {\n if (!options.all) {\n candidateAgents = resolveCandidateAgentsForSkills(finalSkills, index);\n candidateAgents = candidateAgents.filter((agent) =>\n scopeAllowedAgents.has(agent),\n );\n candidateAgents = orderAgentsForDisplay(candidateAgents);\n }\n\n if (candidateAgents.length === 0) {\n throw new Error(\"No installed skills found to remove.\");\n }\n\n if (agents.length === 0) {\n if (candidateAgents.length === 1) {\n agents = candidateAgents;\n }\n }\n }\n\n const shouldPromptAgents =\n interactive && (!options.agent || options.agent.length === 0);\n const visibleCandidateAgents = candidateAgents.filter((agent) =>\n scopeAllowedAgents.has(agent),\n );\n const selectedAgentIds = await runManySelectionStep({\n interactive,\n rows: buildRemoveAgentSelectionRows(\n visibleCandidateAgents,\n scopedAgentRowsById,\n ),\n selectedIds: agents,\n shouldPrompt: shouldPromptAgents,\n prompt: {\n title: \"Choose Agents\",\n required: true,\n requiredMessage: \"At least one agent must be selected\",\n searchable: true,\n keyHints: REMOVE_AGENTS_KEY_HINTS,\n view: REMOVE_AGENTS_SELECTION_VIEW,\n },\n renderClosed: (selectedIds) =>\n renderRemoveAgentsPanel({\n agents: visibleCandidateAgents,\n selectedAgents: selectedIds as AgentType[],\n scopedAgentRowsById,\n }),\n });\n const selectedAgentSet = new Set(selectedAgentIds);\n agents = visibleCandidateAgents.filter((agent) =>\n selectedAgentSet.has(agent),\n );\n\n if (options.all) {\n const all = new Set<string>();\n for (const agent of agents) {\n for (const name of index.skillsByAgent.get(agent) ?? []) {\n all.add(name);\n }\n }\n finalSkills = uniqueSorted(all);\n }\n\n if (!renderedSkillsPanel) {\n finalSkills = await runManySelectionStep({\n interactive,\n rows: buildRemoveSkillSelectionRows(allSkillCandidates),\n selectedIds: finalSkills,\n shouldPrompt: false,\n prompt: {\n title: \"Choose Skills\",\n required: true,\n requiredMessage: \"At least one skill must be selected\",\n searchable: true,\n keyHints: REMOVE_SKILLS_KEY_HINTS,\n view: REMOVE_SKILLS_SELECTION_VIEW,\n },\n renderClosed: (selectedIds) =>\n renderRemoveSkillsPanel({\n skills: allSkillCandidates,\n selectedNames: selectedIds,\n }),\n });\n }\n\n if (finalSkills.length === 0) {\n throw new Error(\"No installed skills found to remove.\");\n }\n\n const targetSkillNames = new Set<string>();\n const requestedSkills = new Set(finalSkills);\n for (const agent of agents) {\n for (const name of index.skillsByAgent.get(agent) ?? []) {\n if (requestedSkills.has(name)) {\n targetSkillNames.add(name);\n }\n }\n }\n if (targetSkillNames.size === 0) {\n throw new Error(\"No installed skills found to remove.\");\n }\n\n const targetSkillList = uniqueSorted(targetSkillNames);\n\n const confirmSelection = await runOneSelectionStep({\n interactive,\n rows: buildRemoveConfirmSelectionRows(),\n selectedId: \"yes\",\n shouldPrompt: interactive,\n prompt: {\n title: \"Confirm Uninstall\",\n required: true,\n requiredMessage: \"Select Yes or No\",\n searchable: false,\n keyHints: REMOVE_CONFIRM_KEY_HINTS,\n view: {\n ...REMOVE_CONFIRM_SELECTION_VIEW,\n instructionLine: `Are you sure you want to uninstall ${targetSkillList.length} skill(s)?`,\n },\n initialSelectedId: \"yes\",\n },\n renderClosed: (selectedId) =>\n renderRemoveConfirmPanel({\n selectedId,\n }),\n });\n const confirmed = confirmSelection === \"yes\";\n\n if (!confirmed) {\n await renderStaticScreen([linesSection([\"Uninstall cancelled.\"])]);\n return;\n }\n\n await renderStaticScreen([\n renderRemoveUninstallSummaryBox({\n globalInstall,\n skillNames: targetSkillList,\n agentDisplayNames: agents.map((agent) => AGENTS[agent].displayName),\n }),\n ]);\n\n const selectedSkillSet = targetSkillNames;\n let removedCount = 0;\n const completedRemovalSteps: string[] = [];\n let failedLabel = \"failed to remove selected skills\";\n\n try {\n for (const agent of agents) {\n const dir = getAgentSkillsDir(agent, globalInstall, cwd);\n if (!fs.existsSync(dir) || !fs.statSync(dir).isDirectory()) {\n continue;\n }\n\n for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {\n if (!entry.isDirectory() && !entry.isSymbolicLink()) {\n continue;\n }\n\n if (!selectedSkillSet.has(entry.name)) {\n continue;\n }\n\n const fullPath = path.join(dir, entry.name);\n failedLabel = `failed to remove ${entry.name} from ${agent}`;\n fs.rmSync(fullPath, { recursive: true, force: true });\n removedCount += 1;\n completedRemovalSteps.push(`removed ${entry.name} from ${agent}`);\n }\n }\n } catch (error) {\n await renderStaticScreen([failedStepsSection([failedLabel])]);\n throw error;\n }\n\n const completionSections = [];\n if (completedRemovalSteps.length > 0) {\n completionSections.push(completedStepsSection(completedRemovalSteps));\n }\n completionSections.push(removeCompletionSummarySection(removedCount));\n await renderStaticScreen(completionSections);\n}\n\nfunction configureRemoveCommand(\n command: Command,\n action: (skills: string[], options: RemoveCommanderOptions) => Promise<void>,\n): Command {\n return command\n .description(\"Remove installed skills\")\n .argument(\"[skills...]\", \"Skill names\")\n .option(\"-a, --agent <agents...>\", \"Target agent(s)\")\n .option(\"-s, --skill <skills...>\", \"Explicit skill names\")\n .option(\"--all\", \"Remove all skills from selected agents\")\n .option(\"-g, --global\", \"Remove global installs\")\n .option(\"--non-interactive\", \"Disable prompts\")\n .action(action);\n}\n\nexport function registerRemoveCommand(\n program: Command,\n ctx: CliCommandContext,\n): void {\n configureRemoveCommand(\n program.command(\"remove\").alias(\"rm\"),\n ctx.wrapAction(\n \"remove\",\n async (skills: string[], options: RemoveCommanderOptions) => {\n await executeRemove(skills, toRemoveOptions(options));\n },\n ),\n );\n}\n\nexport async function runRemove(args: string[]): Promise<void> {\n const command = configureRemoveCommand(\n new Command().name(\"remove\"),\n async (skills, options) => {\n await executeRemove(skills, toRemoveOptions(options));\n },\n );\n await parseStandaloneCommand(command, args);\n}\n", "import { Command } from \"commander\";\nimport { type CheckOptions, type SkillAssessment } from \"./check\";\nimport { readLockfile, type LockfileFormat } from \"@skillspp/core/lockfile\";\nimport { parsePolicyMode } from \"../policy-mode\";\nimport {\n parseStandaloneCommand,\n type CliCommandContext,\n} from \"../command-builder\";\nimport { runBackgroundTask } from \"../runtime/background-runner\";\nimport { canUseInteractive } from \"../interactive\";\nimport {\n type ManySelectionViewConfig,\n type SelectionKeyHint,\n runManySelectionStep,\n} from \"../ui/selection-step\";\nimport {\n completedStepsSection,\n failedStepsSection,\n flushUiFrame,\n hideLoader,\n linesSection,\n manySelectionClosedSection,\n panelSection,\n renderStaticScreen,\n showLoader,\n sourceSection,\n} from \"../ui/screens\";\nimport { formatDriftChips, shortenHomePath } from \"../ui/format\";\nimport type { SelectionRow } from \"@skillspp/core/agents\";\n\nexport type UpdateOptions = CheckOptions & {\n dryRun?: boolean;\n trustWellKnown?: boolean;\n nonInteractive?: boolean;\n policyMode?: \"enforce\" | \"warn\";\n lockFormat?: LockfileFormat;\n migrate?: string;\n};\n\ntype UpdateCommanderOptions = {\n global?: boolean;\n skill?: string[];\n dryRun?: boolean;\n trustWellKnown?: boolean;\n nonInteractive?: boolean;\n allowHost?: string[];\n denyHost?: string[];\n maxDownloadBytes?: string;\n policyMode?: string;\n lockFormat?: string;\n migrate?: string;\n};\n\nfunction toUpdateOptions(options: UpdateCommanderOptions): UpdateOptions {\n const maxDownloadBytes = options.maxDownloadBytes\n ? Number(options.maxDownloadBytes)\n : undefined;\n if (\n typeof maxDownloadBytes === \"number\" &&\n (!Number.isFinite(maxDownloadBytes) || maxDownloadBytes <= 0)\n ) {\n throw new Error(\n `Invalid --max-download-bytes value: ${options.maxDownloadBytes}`,\n );\n }\n\n const lockFormat = options.lockFormat;\n if (lockFormat && lockFormat !== \"json\" && lockFormat !== \"yaml\") {\n throw new Error(`Invalid --lock-format value: ${lockFormat}`);\n }\n\n return {\n global: Boolean(options.global),\n skill: options.skill,\n dryRun: Boolean(options.dryRun),\n trustWellKnown: Boolean(options.trustWellKnown),\n nonInteractive: Boolean(options.nonInteractive),\n allowHost: options.allowHost?.map((item) => item.toLowerCase()),\n denyHost: options.denyHost?.map((item) => item.toLowerCase()),\n maxDownloadBytes,\n policyMode: parsePolicyMode(options.policyMode),\n lockFormat: lockFormat as LockfileFormat | undefined,\n migrate: options.migrate,\n experimental: false,\n };\n}\n\nconst UPDATE_SKILLS_KEY_HINTS: SelectionKeyHint[] = [\n { key: \"\", action: \"type to filter\" },\n { key: \"space\", action: \"toggle\" },\n { key: \"ctrl+a\", action: \"all\" },\n { key: \"ctrl+l\", action: \"invert\" },\n { key: \"enter\", action: \"confirm\" },\n];\n\nconst UPDATE_SKILLS_SELECTION_VIEW: ManySelectionViewConfig = {\n title: \"Choose Skills To Update\",\n countLine: \"candidates\",\n instructionLine: \"Select skills (space to toggle)\",\n labelWidth: 32,\n descWidth: 28,\n minWidth: 74,\n defaultHints: UPDATE_SKILLS_KEY_HINTS,\n};\n\nfunction buildUpdateRows(assessments: SkillAssessment[]): SelectionRow[] {\n return assessments.map((assessment) => {\n const reason =\n assessment.drift.find((item) => item.kind === \"changed-source\")?.kind ||\n assessment.drift.find((item) => item.kind === \"local-modified\")?.kind ||\n \"changed-source\";\n return {\n id: assessment.entry.skillName,\n label: assessment.entry.skillName,\n description: reason,\n };\n });\n}\n\nfunction renderUpdateSkillsClosedPanel(\n rows: SelectionRow[],\n selectedIds: string[],\n) {\n return manySelectionClosedSection(\n UPDATE_SKILLS_SELECTION_VIEW,\n rows,\n selectedIds,\n );\n}\n\ntype UpdateAssessment = Pick<SkillAssessment, \"entry\" | \"drift\">;\n\nexport function buildUpdateDriftSummaryLines(options: {\n assessedCount: number;\n requiresUpdateCount: number;\n changedSourceCount: number;\n localModifiedCount: number;\n colorEnabled?: boolean;\n}): string[] {\n return [\n `${options.assessedCount} tracked skill${\n options.assessedCount === 1 ? \"\" : \"s\"\n } checked`,\n `${options.requiresUpdateCount} skill${\n options.requiresUpdateCount === 1 ? \"\" : \"s\"\n } require update`,\n `Drift signal: ${formatDriftChips({\n plusCount: options.changedSourceCount,\n minusCount: options.localModifiedCount,\n colorEnabled: options.colorEnabled,\n })}`,\n \"\",\n ` - changed-source: ${options.changedSourceCount}`,\n ` - local-modified: ${options.localModifiedCount}`,\n ];\n}\n\nfunction mergeSkillSelection(\n positionalSkill: string | undefined,\n optionSkills: string[] | undefined,\n): string[] | undefined {\n const merged = [...(optionSkills || [])];\n if (positionalSkill && positionalSkill.trim().length > 0) {\n merged.push(positionalSkill.trim());\n }\n if (merged.length === 0) {\n return undefined;\n }\n return [...new Set(merged)];\n}\n\nasync function executeMigrateUpdate(options: {\n cwd: string;\n lockFormat: LockfileFormat;\n updateOptions: UpdateOptions;\n skillName: string;\n}): Promise<void> {\n if (!options.updateOptions.migrate) {\n throw new Error(\"Missing migrate source.\");\n }\n\n if (options.updateOptions.dryRun) {\n await renderStaticScreen([\n panelSection({\n title: \"Migration Summary\",\n lines: [\n `Skill: ${options.skillName}`,\n `Source: ${options.updateOptions.migrate}`,\n \"\",\n \"Dry-run mode: no changes applied.\",\n ],\n style: \"square\",\n minWidth: 74,\n }),\n ]);\n return;\n }\n\n showLoader(\"migrating selected skill\");\n await flushUiFrame();\n let failedLabel = `failed to migrate ${options.skillName}`;\n try {\n await runBackgroundTask(\n {\n kind: \"update.migrate\",\n payload: {\n cwd: options.cwd,\n options: options.updateOptions,\n skillName: options.skillName,\n sourceInput: options.updateOptions.migrate,\n lockFormat: options.lockFormat,\n },\n },\n {\n onProgress: (label) => {\n if (label === \"writing lockfile\") {\n failedLabel = \"failed to write lockfile\";\n }\n showLoader(label);\n },\n },\n );\n } catch (error) {\n hideLoader();\n await renderStaticScreen([failedStepsSection([failedLabel])]);\n throw error;\n }\n hideLoader();\n await renderStaticScreen([\n completedStepsSection([\n `migrated ${options.skillName}`,\n \"lockfile written\",\n ]),\n linesSection([\"Migration complete.\", `Updated ${options.skillName}.`]),\n ]);\n}\n\nasync function executeUpdate(\n options: UpdateOptions,\n positionalSkill?: string,\n): Promise<void> {\n const interactive = canUseInteractive(options.nonInteractive);\n\n const cwd = process.cwd();\n const mergedSkills = mergeSkillSelection(positionalSkill, options.skill);\n const effectiveOptions: UpdateOptions = {\n ...options,\n skill: mergedSkills,\n };\n\n const requestedSkills = (effectiveOptions.skill || []).filter(\n (skill) => skill !== \"*\",\n );\n if (effectiveOptions.migrate) {\n if (requestedSkills.length !== 1) {\n throw new Error(\n \"Migration requires exactly one skill target: skillspp update <skill-name> --migrate <new-skill-source>\",\n );\n }\n }\n if (requestedSkills.length > 0) {\n const lock = readLockfile(Boolean(effectiveOptions.global), cwd);\n const known = new Set(lock.entries.map((entry) => entry.skillName));\n const unknown = [...new Set(requestedSkills)]\n .filter((skill) => !known.has(skill))\n .sort((a, b) => a.localeCompare(b));\n if (unknown.length > 0) {\n throw new Error(`Unknown skill(s) for update: ${unknown.join(\", \")}`);\n }\n }\n\n if (effectiveOptions.migrate) {\n await executeMigrateUpdate({\n cwd,\n lockFormat: effectiveOptions.lockFormat || \"json\",\n updateOptions: effectiveOptions,\n skillName: requestedSkills[0],\n });\n return;\n }\n\n try {\n showLoader(\"assessing drift\");\n await flushUiFrame();\n let assessed;\n try {\n assessed = await runBackgroundTask(\n {\n kind: \"update.assess\",\n payload: {\n cwd,\n options: effectiveOptions,\n },\n },\n {\n onProgress: (label) => {\n showLoader(label);\n },\n },\n );\n } catch (error) {\n hideLoader();\n await renderStaticScreen([\n failedStepsSection([\"failed to assess drift\"]),\n ]);\n throw error;\n }\n hideLoader();\n const assessments: UpdateAssessment[] = assessed.assessments;\n\n const candidateAssessments = assessments.filter((assessment) => {\n if (assessment.drift.some((item) => item.kind === \"migrate-required\")) {\n return false;\n }\n return assessment.drift.some(\n (item) =>\n item.kind === \"changed-source\" || item.kind === \"local-modified\",\n );\n });\n const migrateRequired = assessments\n .filter((assessment) =>\n assessment.drift.some((item) => item.kind === \"migrate-required\"),\n )\n .map((assessment) => assessment.entry.skillName)\n .sort((a, b) => a.localeCompare(b));\n let changedSourceCount = 0;\n let localModifiedCount = 0;\n for (const assessment of candidateAssessments) {\n for (const drift of assessment.drift) {\n if (drift.kind === \"changed-source\") {\n changedSourceCount += 1;\n }\n if (drift.kind === \"local-modified\") {\n localModifiedCount += 1;\n }\n }\n }\n\n await renderStaticScreen([\n completedStepsSection([\n \"drift assessed\",\n \"update candidates resolved\",\n \"interactive session ready\",\n ]),\n sourceSection(shortenHomePath(cwd)),\n panelSection({\n title: \"Drift Summary\",\n lines: buildUpdateDriftSummaryLines({\n assessedCount: assessments.length,\n requiresUpdateCount: candidateAssessments.length,\n changedSourceCount,\n localModifiedCount,\n colorEnabled: Boolean(process.stdout.isTTY) && !process.env.NO_COLOR,\n }),\n style: \"square\",\n minWidth: 74,\n }),\n ]);\n\n if (candidateAssessments.length === 0) {\n if (migrateRequired.length > 0) {\n await renderStaticScreen([\n panelSection({\n title: \"Migration Required\",\n lines: migrateRequired.map(\n (skillName) =>\n `skillspp update ${skillName} --migrate <new-skill-source>`,\n ),\n style: \"square\",\n minWidth: 74,\n }),\n ]);\n return;\n }\n await renderStaticScreen([linesSection([\"No updates required.\"])]);\n return;\n }\n\n const candidateRows = buildUpdateRows(candidateAssessments).sort((a, b) =>\n a.label.localeCompare(b.label),\n );\n const selectedSkillIds = await runManySelectionStep({\n interactive,\n rows: candidateRows,\n selectedIds: candidateRows.map((row) => row.id),\n shouldPrompt:\n interactive && !effectiveOptions.skill && candidateRows.length > 1,\n prompt: {\n title: \"Choose Skills To Update\",\n required: true,\n requiredMessage: \"At least one skill must be selected\",\n searchable: true,\n keyHints: UPDATE_SKILLS_KEY_HINTS,\n view: UPDATE_SKILLS_SELECTION_VIEW,\n },\n renderClosed: (selectedIds) =>\n renderUpdateSkillsClosedPanel(candidateRows, selectedIds),\n });\n\n const selectedSet = new Set(selectedSkillIds);\n const selectedAssessments = candidateAssessments.filter((assessment) =>\n selectedSet.has(assessment.entry.skillName),\n );\n if (selectedAssessments.length === 0) {\n throw new Error(\"No skills selected for update.\");\n }\n\n let lockFormat: LockfileFormat = options.lockFormat || \"json\";\n lockFormat = effectiveOptions.lockFormat || \"json\";\n\n await renderStaticScreen([\n panelSection({\n title: \"Update Summary\",\n lines: [\n `Scope: ${effectiveOptions.global ? \"global\" : \"current project\"}`,\n `Mode: ${effectiveOptions.dryRun ? \"dry-run\" : \"apply\"}`,\n \"\",\n `Skills to update (${selectedAssessments.length}):`,\n ...selectedAssessments\n .map((assessment) => ` - ${assessment.entry.skillName}`)\n .sort((a, b) => a.localeCompare(b)),\n \"\",\n \"Safety: automatic rollback on per-skill failure\",\n ],\n style: \"rounded\",\n minWidth: 74,\n }),\n ]);\n\n if (effectiveOptions.dryRun) {\n await renderStaticScreen([\n linesSection([\"Dry-run mode: no changes applied.\"]),\n ]);\n return;\n }\n\n showLoader(\"updating selected skills\");\n await flushUiFrame();\n let failedLabel = \"failed to assess selected skills\";\n let applied;\n try {\n applied = await runBackgroundTask(\n {\n kind: \"update.apply\",\n payload: {\n cwd,\n options: effectiveOptions,\n selectedSkillNames: selectedAssessments.map(\n (assessment) => assessment.entry.skillName,\n ),\n lockFormat,\n },\n },\n {\n onProgress: (label) => {\n if (label === \"writing lockfile\") {\n failedLabel = \"failed to write lockfile\";\n } else if (label.startsWith(\"updating \")) {\n failedLabel = `failed to update ${label.slice(\n \"updating \".length,\n )}`;\n } else {\n failedLabel = \"failed to assess selected skills\";\n }\n showLoader(label);\n },\n },\n );\n } catch (error) {\n hideLoader();\n await renderStaticScreen([failedStepsSection([failedLabel])]);\n throw error;\n }\n hideLoader();\n await renderStaticScreen([\n completedStepsSection([\n \"selected skills assessed\",\n ...applied.updatedSkillNames.map((skillName) => `updated ${skillName}`),\n \"lockfile written\",\n ]),\n linesSection([\n \"Update complete.\",\n `Updated ${applied.updatedSkillNames.length} skills.`,\n ]),\n ]);\n } finally {\n hideLoader();\n }\n}\n\nfunction configureUpdateCommand(\n command: Command,\n action: (\n skill: string | undefined,\n options: UpdateCommanderOptions,\n ) => Promise<void>,\n): Command {\n return command\n .description(\"Update drifted skills\")\n .argument(\"[skill]\", \"Single skill name target\")\n .option(\"-g, --global\", \"Update global installs\")\n .option(\"-s, --skill <skills...>\", \"Update only selected skill(s)\")\n .option(\"--migrate <source>\", \"Migrate selected skill to a new source\")\n .option(\"--dry-run\", \"Show updates without applying\")\n .option(\"--non-interactive\", \"Disable prompts\")\n .option(\"--trust-well-known\", \"Allow hook commands for well-known source\")\n .option(\"--allow-host <hosts...>\", \"Restrict well-known hosts to allowlist\")\n .option(\"--deny-host <hosts...>\", \"Block specific well-known hosts\")\n .option(\"--max-download-bytes <n>\", \"Set well-known download budget\")\n .option(\"--policy-mode <mode>\", \"Policy mode (enforce|warn)\")\n .option(\"--lock-format <format>\", \"Lockfile format output (json|yaml)\")\n .action(action);\n}\n\nexport function registerUpdateCommand(\n program: Command,\n ctx: CliCommandContext,\n): void {\n configureUpdateCommand(\n program.command(\"update\"),\n ctx.wrapAction(\n \"update\",\n async (skill: string | undefined, options: UpdateCommanderOptions) => {\n await executeUpdate(\n {\n ...toUpdateOptions(options),\n experimental: ctx.experimental,\n },\n skill,\n );\n },\n ),\n );\n}\n\nexport async function runUpdate(args: string[]): Promise<void> {\n const command = configureUpdateCommand(\n new Command().name(\"update\"),\n async (skill, options) => {\n await executeUpdate(toUpdateOptions(options), skill);\n },\n );\n await parseStandaloneCommand(command, args);\n}\n", "import fs from \"node:fs\";\nimport path from \"node:path\";\nimport os from \"node:os\";\nimport { Command } from \"commander\";\nimport matter from \"gray-matter\";\nimport { parseSource } from \"@skillspp/core/source-parser\";\nimport { prepareSourceDir } from \"@skillspp/core/sources/git\";\nimport { discoverSkills } from \"@skillspp/core/skills\";\nimport {\n classifyDependencySource,\n cleanupPreparedInstallerArtifacts,\n isInstallerPolicyError,\n isInstallerSecurityError,\n loadInstallerConfig,\n prepareInstallerArtifacts,\n} from \"@skillspp/core/runtime/skill-installer\";\nimport {\n evaluateInstallerLocalDependencyPolicy,\n type PolicyMode,\n} from \"@skillspp/core/policy\";\nimport {\n resolveCatalogSkills,\n resolveWellKnownSkills,\n} from \"@skillspp/core/source-resolution\";\nimport type { AddOptions } from \"@skillspp/core/contracts/runtime-types\";\nimport { parsePolicyMode } from \"../policy-mode\";\nimport {\n parseStandaloneCommand,\n type CliCommandContext,\n} from \"../command-builder\";\nimport { runBackgroundTask } from \"../runtime/background-runner\";\nimport {\n completedStepsSection,\n failedStepsSection,\n flushUiFrame,\n hideLoader,\n linesSection,\n panelSection,\n renderStaticScreen,\n showLoader,\n} from \"../ui/screens\";\nimport { bold, colorToken } from \"../ui/colors\";\n\ntype Severity = \"error\" | \"warning\";\n\nexport type ValidateDiagnostic = {\n severity: Severity;\n skill: string;\n file: string;\n rule: string;\n message: string;\n};\n\nexport type ValidateOptions = {\n source?: string;\n json?: boolean;\n strict?: boolean;\n ci?: boolean;\n roots?: string[];\n allowHost?: string[];\n denyHost?: string[];\n maxDownloadBytes?: number;\n maxLines?: number;\n maxDescriptionChars?: number;\n policyMode?: PolicyMode;\n experimental?: boolean;\n};\n\ntype RepoValidateConfig = {\n ciRoots?: string[];\n maxLines?: number;\n maxDescriptionChars?: number;\n};\n\ntype ValidateThresholds = {\n maxLines: number;\n maxDescriptionChars: number;\n};\n\nexport type ValidateRunResult = {\n diagnostics: ValidateDiagnostic[];\n};\n\ntype TypeRule = {\n id: string;\n when: (frontmatter: Record<string, unknown>) => boolean;\n validate: (ctx: {\n skillDir: string;\n skillName: string;\n diagnostics: ValidateDiagnostic[];\n }) => void;\n};\n\nconst DEFAULT_MAX_LINES = 500;\nconst DEFAULT_MAX_DESCRIPTION = 1024;\n\ntype ValidateCommanderOptions = {\n ci?: boolean;\n root?: string[];\n strict?: boolean;\n json?: boolean;\n maxLines?: string;\n maxDescriptionChars?: string;\n allowHost?: string[];\n denyHost?: string[];\n maxDownloadBytes?: string;\n policyMode?: string;\n};\n\nfunction toValidateOptions(\n source: string | undefined,\n options: ValidateCommanderOptions,\n): ValidateOptions {\n const maxLines = options.maxLines ? Number(options.maxLines) : undefined;\n if (\n typeof maxLines === \"number\" &&\n (!Number.isFinite(maxLines) || maxLines <= 0)\n ) {\n throw new Error(`Invalid --max-lines value: ${options.maxLines}`);\n }\n\n const maxDescriptionChars = options.maxDescriptionChars\n ? Number(options.maxDescriptionChars)\n : undefined;\n if (\n typeof maxDescriptionChars === \"number\" &&\n (!Number.isFinite(maxDescriptionChars) || maxDescriptionChars <= 0)\n ) {\n throw new Error(\n `Invalid --max-description-chars value: ${options.maxDescriptionChars}`,\n );\n }\n\n const maxDownloadBytes = options.maxDownloadBytes\n ? Number(options.maxDownloadBytes)\n : undefined;\n if (\n typeof maxDownloadBytes === \"number\" &&\n (!Number.isFinite(maxDownloadBytes) || maxDownloadBytes <= 0)\n ) {\n throw new Error(\n `Invalid --max-download-bytes value: ${options.maxDownloadBytes}`,\n );\n }\n\n return {\n source,\n json: Boolean(options.json),\n strict: Boolean(options.strict),\n ci: Boolean(options.ci),\n roots: options.root,\n allowHost: options.allowHost?.map((item) => item.toLowerCase()),\n denyHost: options.denyHost?.map((item) => item.toLowerCase()),\n maxDownloadBytes,\n maxLines,\n maxDescriptionChars,\n policyMode: parsePolicyMode(options.policyMode),\n experimental: false,\n };\n}\n\nfunction loadRepoValidateConfig(cwd: string): RepoValidateConfig {\n const configPath = path.join(cwd, \".skillspp-cli.json\");\n if (!fs.existsSync(configPath) || !fs.statSync(configPath).isFile()) {\n return {};\n }\n\n const parsed = JSON.parse(fs.readFileSync(configPath, \"utf8\")) as {\n validate?: RepoValidateConfig;\n };\n\n return parsed.validate || {};\n}\n\nfunction resolveThresholds(\n options: ValidateOptions,\n cwd: string,\n): ValidateThresholds {\n const config = loadRepoValidateConfig(cwd);\n return {\n maxLines: options.maxLines || config.maxLines || DEFAULT_MAX_LINES,\n maxDescriptionChars:\n options.maxDescriptionChars ||\n config.maxDescriptionChars ||\n DEFAULT_MAX_DESCRIPTION,\n };\n}\n\nfunction addDiagnostic(\n list: ValidateDiagnostic[],\n diagnostic: ValidateDiagnostic,\n): void {\n list.push(diagnostic);\n}\n\nfunction discoverMarkdownReferences(content: string): string[] {\n const refs = new Set<string>();\n\n const markdownLinkPattern = /\\[[^\\]]+\\]\\(([^)]+)\\)/g;\n let match: RegExpExecArray | null;\n while ((match = markdownLinkPattern.exec(content)) !== null) {\n const value = match[1].trim();\n if (\n !value ||\n value.startsWith(\"http://\") ||\n value.startsWith(\"https://\") ||\n value.startsWith(\"#\")\n ) {\n continue;\n }\n refs.add(value);\n }\n\n return [...refs];\n}\n\nconst typeRules: TypeRule[] = [\n {\n id: \"framework-references-dir\",\n when: (frontmatter) => frontmatter.type === \"framework\",\n validate: ({ skillDir, skillName, diagnostics }) => {\n const referencesDir = path.join(skillDir, \"references\");\n if (\n !fs.existsSync(referencesDir) ||\n !fs.statSync(referencesDir).isDirectory()\n ) {\n addDiagnostic(diagnostics, {\n severity: \"error\",\n skill: skillName,\n file: referencesDir,\n rule: \"framework-references-required\",\n message: \"framework skills must contain a references directory\",\n });\n }\n },\n },\n];\n\nasync function validateInstallerDependencies(\n skillDir: string,\n sourceRoot: string,\n diagnostics: ValidateDiagnostic[],\n skillName: string,\n): Promise<void> {\n const installerConfigPath = fs.existsSync(\n path.join(skillDir, \"skill-installer.yaml\"),\n )\n ? path.join(skillDir, \"skill-installer.yaml\")\n : path.join(skillDir, \"skill-installer.json\");\n\n try {\n const installer = loadInstallerConfig(skillDir);\n const fallbackRoots = Array.from(\n new Set([path.resolve(sourceRoot), path.resolve(process.cwd())]),\n );\n let hasSecurityViolation = false;\n\n for (const dep of installer.dependencies) {\n const source = typeof dep === \"string\" ? dep : dep.source;\n const kind = classifyDependencySource(source);\n if (kind !== \"local\") {\n continue;\n }\n\n let accepted = false;\n let securityViolation:\n | {\n rule: string;\n message: string;\n severity: \"error\" | \"warning\";\n blocking: boolean;\n }\n | undefined;\n for (const root of fallbackRoots) {\n const evaluated = evaluateInstallerLocalDependencyPolicy(\n {\n source,\n sourceRoot: root,\n },\n \"enforce\",\n );\n if (evaluated.ok) {\n accepted = true;\n break;\n } else {\n securityViolation =\n \"violation\" in evaluated ? evaluated.violation : undefined;\n }\n }\n\n if (!accepted && securityViolation) {\n hasSecurityViolation = true;\n addDiagnostic(diagnostics, {\n severity: securityViolation.severity,\n skill: skillName,\n file: installerConfigPath,\n rule: securityViolation.rule,\n message: securityViolation.message,\n });\n }\n }\n\n if (hasSecurityViolation) {\n return;\n }\n\n const tempSkillDir = fs.mkdtempSync(\n path.join(os.tmpdir(), \"skillspp-validate-installer-\"),\n );\n try {\n const filesToCopy = [\n \"SKILL.md\",\n \"skill-installer.yaml\",\n \"skill-installer.json\",\n ];\n for (const fileName of filesToCopy) {\n const src = path.join(skillDir, fileName);\n if (fs.existsSync(src) && fs.statSync(src).isFile()) {\n fs.copyFileSync(src, path.join(tempSkillDir, fileName));\n }\n }\n\n const agentsDir = path.join(skillDir, \"agents\");\n if (fs.existsSync(agentsDir) && fs.statSync(agentsDir).isDirectory()) {\n fs.cpSync(agentsDir, path.join(tempSkillDir, \"agents\"), {\n recursive: true,\n force: true,\n });\n }\n\n let preparedSuccess = false;\n let lastMissingSourceError: unknown;\n let securityError: unknown;\n\n for (const root of fallbackRoots) {\n try {\n const prepared = await prepareInstallerArtifacts(tempSkillDir, root, {\n sourceType: \"local\",\n allowHookCommands: false,\n policyMode: \"enforce\",\n });\n cleanupPreparedInstallerArtifacts(prepared);\n preparedSuccess = true;\n break;\n } catch (error) {\n if (isInstallerSecurityError(error)) {\n securityError = error;\n break;\n }\n if (isInstallerPolicyError(error)) {\n securityError = error;\n break;\n }\n const message =\n error instanceof Error ? error.message : String(error);\n if (message.includes(\"(local) source not found\")) {\n lastMissingSourceError = error;\n continue;\n }\n throw error;\n }\n }\n\n if (!preparedSuccess && securityError) {\n throw securityError;\n }\n if (!preparedSuccess && lastMissingSourceError) {\n throw lastMissingSourceError;\n }\n } finally {\n fs.rmSync(tempSkillDir, { recursive: true, force: true });\n }\n } catch (error) {\n if (isInstallerSecurityError(error)) {\n addDiagnostic(diagnostics, {\n severity: error.violation.severity,\n skill: skillName,\n file: installerConfigPath,\n rule: error.violation.rule,\n message: error.violation.message,\n });\n return;\n }\n if (isInstallerPolicyError(error)) {\n addDiagnostic(diagnostics, {\n severity: \"error\",\n skill: skillName,\n file: installerConfigPath,\n rule: error.violation.rule,\n message: error.violation.message,\n });\n return;\n }\n\n addDiagnostic(diagnostics, {\n severity: \"warning\",\n skill: skillName,\n file: installerConfigPath,\n rule: \"missing-installer-local-dependency\",\n message: error instanceof Error ? error.message : String(error),\n });\n }\n}\n\nasync function validateSkillDir(\n skillDir: string,\n sourceRoot: string,\n diagnostics: ValidateDiagnostic[],\n strict: boolean,\n thresholds: ValidateThresholds,\n): Promise<void> {\n const skillMd = path.join(skillDir, \"SKILL.md\");\n const skillName = path.basename(skillDir);\n\n if (!fs.existsSync(skillMd)) {\n addDiagnostic(diagnostics, {\n severity: \"error\",\n skill: skillName,\n file: skillMd,\n rule: \"missing-skill-md\",\n message: \"SKILL.md is required\",\n });\n return;\n }\n\n const content = fs.readFileSync(skillMd, \"utf8\");\n const lines = content.split(/\\r?\\n/);\n\n if (lines.length > thresholds.maxLines) {\n addDiagnostic(diagnostics, {\n severity: strict ? \"error\" : \"warning\",\n skill: skillName,\n file: skillMd,\n rule: \"line-budget\",\n message: `SKILL.md has ${lines.length} lines (limit ${thresholds.maxLines})`,\n });\n }\n\n let parsed;\n try {\n parsed = matter(content);\n } catch (error) {\n addDiagnostic(diagnostics, {\n severity: \"error\",\n skill: skillName,\n file: skillMd,\n rule: \"invalid-frontmatter\",\n message:\n error instanceof Error ? error.message : \"frontmatter parsing failed\",\n });\n return;\n }\n\n const data = (parsed.data || {}) as Record<string, unknown>;\n const name = data.name;\n const description = data.description;\n\n if (typeof name !== \"string\" || !name.trim()) {\n addDiagnostic(diagnostics, {\n severity: \"error\",\n skill: skillName,\n file: skillMd,\n rule: \"missing-name\",\n message: \"frontmatter field 'name' is required\",\n });\n }\n\n if (typeof description !== \"string\" || !description.trim()) {\n addDiagnostic(diagnostics, {\n severity: \"error\",\n skill: skillName,\n file: skillMd,\n rule: \"missing-description\",\n message: \"frontmatter field 'description' is required\",\n });\n } else if (description.length > thresholds.maxDescriptionChars) {\n addDiagnostic(diagnostics, {\n severity: strict ? \"error\" : \"warning\",\n skill: skillName,\n file: skillMd,\n rule: \"description-budget\",\n message: `description has ${description.length} chars (limit ${thresholds.maxDescriptionChars})`,\n });\n }\n\n if (typeof name === \"string\" && name.trim()) {\n const normalized = name\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9._-]+/g, \"-\")\n .replace(/^[.-]+|[.-]+$/g, \"\");\n if (normalized && normalized !== skillName.toLowerCase()) {\n addDiagnostic(diagnostics, {\n severity: \"error\",\n skill: skillName,\n file: skillMd,\n rule: \"name-path-mismatch\",\n message: `frontmatter name '${name}' does not match directory '${skillName}'`,\n });\n }\n }\n\n for (const ref of discoverMarkdownReferences(content)) {\n const resolved = path.resolve(skillDir, ref);\n const rel = path.relative(skillDir, resolved);\n if (!rel || rel.startsWith(\"..\") || path.isAbsolute(rel)) {\n continue;\n }\n if (!fs.existsSync(resolved)) {\n addDiagnostic(diagnostics, {\n severity: \"error\",\n skill: skillName,\n file: skillMd,\n rule: \"missing-reference\",\n message: `referenced path not found: ${ref}`,\n });\n }\n }\n\n for (const rule of typeRules) {\n if (rule.when(data)) {\n rule.validate({ skillDir, skillName, diagnostics });\n }\n }\n\n await validateInstallerDependencies(\n skillDir,\n sourceRoot,\n diagnostics,\n skillName,\n );\n}\n\nfunction discoverFallbackRoots(cwd: string): string[] {\n const candidates = [cwd, path.join(cwd, \"skills\")];\n const packagesDir = path.join(cwd, \"packages\");\n if (fs.existsSync(packagesDir) && fs.statSync(packagesDir).isDirectory()) {\n for (const entry of fs.readdirSync(packagesDir, { withFileTypes: true })) {\n if (!entry.isDirectory()) {\n continue;\n }\n candidates.push(path.join(packagesDir, entry.name, \"skills\"));\n }\n }\n\n const seen = new Set<string>();\n const out: string[] = [];\n for (const item of candidates) {\n if (!fs.existsSync(item)) {\n continue;\n }\n const resolved = path.resolve(item);\n if (seen.has(resolved)) {\n continue;\n }\n seen.add(resolved);\n out.push(item);\n }\n\n return out;\n}\n\nfunction discoverCiRoots(cwd: string): string[] {\n const config = loadRepoValidateConfig(cwd);\n if (config.ciRoots && config.ciRoots.length > 0) {\n const roots = config.ciRoots\n .map((item) => path.resolve(cwd, item))\n .filter((item) => fs.existsSync(item) && fs.statSync(item).isDirectory());\n if (roots.length > 0) {\n return roots;\n }\n }\n\n return discoverFallbackRoots(cwd);\n}\n\nasync function stageAndValidateLocalRoot(\n rootPath: string,\n dependencyRoot: string,\n seenSkillPaths: Set<string>,\n diagnostics: ValidateDiagnostic[],\n strict: boolean,\n thresholds: ValidateThresholds,\n emitProgress?: (label: string) => Promise<void> | void,\n): Promise<void> {\n const resolvedRoot = path.resolve(rootPath);\n if (\n !fs.existsSync(resolvedRoot) ||\n !fs.statSync(resolvedRoot).isDirectory()\n ) {\n addDiagnostic(diagnostics, {\n severity: \"error\",\n skill: path.basename(resolvedRoot),\n file: resolvedRoot,\n rule: \"missing-root\",\n message: \"validation root does not exist\",\n });\n return;\n }\n\n await emitProgress?.(\"discovering candidate skills\");\n const skills = discoverSkills(resolvedRoot);\n if (skills.length === 0) {\n addDiagnostic(diagnostics, {\n severity: \"error\",\n skill: path.basename(resolvedRoot),\n file: resolvedRoot,\n rule: \"no-skills-discovered\",\n message: \"no SKILL.md files discovered\",\n });\n return;\n }\n\n for (const skill of skills) {\n const resolvedSkillPath = path.resolve(skill.path);\n if (seenSkillPaths.has(resolvedSkillPath)) {\n continue;\n }\n seenSkillPaths.add(resolvedSkillPath);\n await emitProgress?.(`validating ${skill.name}`);\n await validateSkillDir(\n skill.path,\n dependencyRoot,\n diagnostics,\n strict,\n thresholds,\n );\n }\n}\n\nasync function stageAndValidateSource(\n options: ValidateOptions,\n diagnostics: ValidateDiagnostic[],\n thresholds: ValidateThresholds,\n emitProgress?: (label: string) => Promise<void> | void,\n): Promise<void> {\n if (!options.source) {\n throw new Error(\"validate requires <source> unless --ci is used\");\n }\n\n await emitProgress?.(\"parsing source\");\n const parsed = parseSource(options.source);\n if (parsed.type === \"well-known\" || parsed.type === \"catalog\") {\n await emitProgress?.(\"discovering candidate skills\");\n const remote =\n parsed.type === \"well-known\"\n ? await resolveWellKnownSkills(parsed.url, {\n allowHost: options.allowHost,\n denyHost: options.denyHost,\n maxDownloadBytes: options.maxDownloadBytes,\n experimental: options.experimental,\n } as AddOptions)\n : await resolveCatalogSkills(parsed.url, {\n allowHost: options.allowHost,\n denyHost: options.denyHost,\n maxDownloadBytes: options.maxDownloadBytes,\n experimental: options.experimental,\n } as AddOptions);\n\n if (remote.length === 0) {\n addDiagnostic(diagnostics, {\n severity: \"error\",\n skill: parsed.url,\n file: parsed.url,\n rule: \"no-skills-discovered\",\n message: \"no SKILL.md files discovered\",\n });\n return;\n }\n\n const tempRoots: string[] = [];\n try {\n for (const remoteSkill of remote) {\n const tmp = fs.mkdtempSync(\n path.join(os.tmpdir(), \"skillspp-validate-\"),\n );\n tempRoots.push(tmp);\n\n for (const [relativePath, content] of remoteSkill.files.entries()) {\n const target = path.join(tmp, relativePath);\n fs.mkdirSync(path.dirname(target), { recursive: true });\n fs.writeFileSync(target, content, \"utf8\");\n }\n\n await emitProgress?.(`validating ${remoteSkill.installName}`);\n await validateSkillDir(\n tmp,\n tmp,\n diagnostics,\n Boolean(options.strict),\n thresholds,\n );\n }\n } finally {\n for (const tmp of tempRoots) {\n fs.rmSync(tmp, { recursive: true, force: true });\n }\n }\n\n return;\n }\n\n const staged = prepareSourceDir(parsed);\n try {\n await emitProgress?.(\"staging source\");\n await stageAndValidateLocalRoot(\n staged.basePath,\n staged.basePath,\n new Set<string>(),\n diagnostics,\n Boolean(options.strict),\n thresholds,\n emitProgress,\n );\n } finally {\n if (staged.cleanup) {\n staged.cleanup();\n }\n }\n}\n\nexport async function runValidateAnalysis(\n options: ValidateOptions,\n emitProgress?: (label: string) => Promise<void> | void,\n): Promise<ValidateRunResult> {\n const diagnostics: ValidateDiagnostic[] = [];\n const thresholds = resolveThresholds(options, process.cwd());\n const seenSkillPaths = new Set<string>();\n\n if (options.ci) {\n await emitProgress?.(\"staging source\");\n const roots =\n options.roots && options.roots.length > 0\n ? options.roots\n : discoverCiRoots(process.cwd());\n if (roots.length === 0) {\n throw new Error(\"No CI roots found to validate\");\n }\n\n await emitProgress?.(\"discovering candidate skills\");\n for (const root of roots) {\n await stageAndValidateLocalRoot(\n root,\n process.cwd(),\n seenSkillPaths,\n diagnostics,\n Boolean(options.strict),\n thresholds,\n emitProgress,\n );\n }\n } else {\n await stageAndValidateSource(\n options,\n diagnostics,\n thresholds,\n emitProgress,\n );\n }\n\n await emitProgress?.(\"collecting diagnostics\");\n\n return { diagnostics };\n}\n\nfunction resolveValidateTargetLabel(options: ValidateOptions): string {\n if (!options.ci) {\n return options.source || \"(none)\";\n }\n if (options.roots && options.roots.length > 0) {\n return `CI roots (${options.roots.length})`;\n }\n return \"CI roots (auto-discovered)\";\n}\n\nfunction validateModeLabel(options: ValidateOptions): string {\n return options.ci ? \"CI roots\" : \"Single source\";\n}\n\nfunction validateSeverityLabel(options: ValidateOptions): string {\n return options.strict ? \"Strict\" : \"Standard\";\n}\n\nfunction formatDiagnosticLine(row: ValidateDiagnostic): string {\n return `${row.skill} \u00B7 ${row.rule}: ${row.message}`;\n}\n\nfunction buildDiagnosticsPanelLines(\n diagnostics: ValidateDiagnostic[],\n): string[] {\n if (diagnostics.length === 0) {\n return [colorToken(\"No diagnostics found.\", \"success\")];\n }\n\n const sorted = [...diagnostics].sort((a, b) =>\n `${a.severity}:${a.skill}:${a.rule}`.localeCompare(\n `${b.severity}:${b.skill}:${b.rule}`,\n ),\n );\n\n return sorted.map((row) => {\n const marker =\n row.severity === \"error\"\n ? colorToken(\"[error]\", \"danger\")\n : colorToken(\"[warning]\", \"warning\");\n return `${marker} ${formatDiagnosticLine(row)}`;\n });\n}\n\nasync function executeValidate(options: ValidateOptions): Promise<void> {\n const thresholds = resolveThresholds(options, process.cwd());\n if (options.json) {\n const { diagnostics } = await runValidateAnalysis(options);\n const errors = diagnostics.filter((item) => item.severity === \"error\");\n const warnings = diagnostics.filter((item) => item.severity === \"warning\");\n\n process.stdout.write(\n `${JSON.stringify(\n {\n ok: errors.length === 0,\n errors,\n warnings,\n },\n null,\n 2,\n )}\\n`,\n );\n\n if (errors.length > 0) {\n throw new Error(`Validation failed with ${errors.length} error(s)`);\n }\n return;\n }\n\n showLoader(\"loading\");\n await flushUiFrame();\n let failedLabel = \"failed to run validation\";\n const runtimeSteps = new Set<string>();\n let result: ValidateRunResult;\n try {\n result = await runBackgroundTask(\n {\n kind: \"validate.run\",\n payload: {\n cwd: process.cwd(),\n options,\n },\n },\n {\n onProgress: (label) => {\n if (label === \"parsing source\") {\n failedLabel = \"failed to parse source\";\n } else if (label === \"discovering candidate skills\") {\n failedLabel = \"failed to discover candidate skills\";\n } else {\n failedLabel = \"failed to run validation\";\n }\n if (label === \"staging source\" || label.startsWith(\"validating \")) {\n runtimeSteps.add(label);\n }\n showLoader(label);\n },\n },\n );\n } catch (error) {\n hideLoader();\n await renderStaticScreen([failedStepsSection([failedLabel])]);\n throw error;\n } finally {\n hideLoader();\n }\n\n const diagnostics = result.diagnostics;\n\n const errors = diagnostics.filter((item) => item.severity === \"error\");\n const warnings = diagnostics.filter((item) => item.severity === \"warning\");\n\n const validatingSteps = [...runtimeSteps]\n .filter((step) => step.startsWith(\"validating \"))\n .sort((a, b) => a.localeCompare(b));\n const runStepLines = [\n \"staging source\",\n ...validatingSteps,\n \"collecting diagnostics\",\n ];\n\n await renderStaticScreen([\n completedStepsSection([\n \"source parsed\",\n \"candidate skills discovered\",\n \"validation session ready\",\n ]),\n linesSection([\n ` Validation target: ${resolveValidateTargetLabel(options)}`,\n ]),\n panelSection({\n title: \"Checks Included\",\n lines: [\n ` ${colorToken(\n \"\u25CF\",\n \"primary\",\n )} SKILL.md exists + frontmatter parseability`,\n ` ${colorToken(\"\u25CF\", \"primary\")} required fields: name, description`,\n ` ${colorToken(\"\u25CF\", \"primary\")} name \u2194 directory consistency`,\n ` ${colorToken(\"\u25CF\", \"primary\")} markdown reference existence`,\n ` ${colorToken(\n \"\u25CF\",\n \"primary\",\n )} type-specific rules (framework references dir)`,\n ` ${colorToken(\n \"\u25CF\",\n \"primary\",\n )} installer dependency security + preflight`,\n ` ${colorToken(\"\u25CF\", \"primary\")} line/description budget thresholds`,\n ],\n style: \"square\",\n minWidth: 74,\n }),\n panelSection({\n title: \"Validation Summary\",\n lines: [\n `${bold(\"Validate Mode:\")} ${validateModeLabel(options)}`,\n `${bold(\"Severity Profile:\")} ${validateSeverityLabel(options)}`,\n `${bold(\"Scope:\")} ${validateModeLabel(options).toLowerCase()}`,\n `${bold(\"Profile:\")} ${validateSeverityLabel(options).toLowerCase()}`,\n `${bold(\"Output:\")} human-readable`,\n colorToken(`${bold(\"Errors:\")} ${errors.length}`, \"danger\"),\n colorToken(`${bold(\"Warnings:\")} ${warnings.length}`, \"warning\"),\n \"\",\n bold(\"Diagnostics:\"),\n ...buildDiagnosticsPanelLines(diagnostics),\n \"\",\n bold(\"Thresholds:\"),\n ` - max lines: ${thresholds.maxLines}`,\n ` - max description chars: ${thresholds.maxDescriptionChars}`,\n ],\n style: \"rounded\",\n minWidth: 74,\n }),\n completedStepsSection(runStepLines),\n ]);\n\n if (errors.length > 0) {\n throw new Error(`Validation failed with ${errors.length} error(s)`);\n }\n}\n\nfunction configureValidateCommand(\n command: Command,\n action: (\n source: string | undefined,\n options: ValidateCommanderOptions,\n ) => Promise<void>,\n): Command {\n return command\n .description(\"Validate skill source structure and references\")\n .argument(\"[source]\", \"Source path or URL\")\n .option(\"--ci\", \"Validate multiple local roots for CI\")\n .option(\"--root <paths...>\", \"Root paths for CI mode\")\n .option(\"--strict\", \"Escalate warnings to errors\")\n .option(\"--json\", \"Emit JSON output\")\n .option(\"--max-lines <n>\", \"SKILL.md line budget threshold\")\n .option(\n \"--max-description-chars <n>\",\n \"Description length budget threshold\",\n )\n .option(\"--allow-host <hosts...>\", \"Restrict well-known hosts to allowlist\")\n .option(\"--deny-host <hosts...>\", \"Block specific well-known hosts\")\n .option(\"--max-download-bytes <n>\", \"Set well-known download budget\")\n .option(\"--policy-mode <mode>\", \"Policy mode (enforce|warn)\")\n .action(action);\n}\n\nexport function registerValidateCommand(\n program: Command,\n ctx: CliCommandContext,\n): void {\n configureValidateCommand(\n program.command(\"validate\"),\n ctx.wrapAction(\n \"validate\",\n async (source: string | undefined, options: ValidateCommanderOptions) => {\n await executeValidate({\n ...toValidateOptions(source, options),\n experimental: ctx.experimental,\n });\n },\n ),\n );\n}\n\nexport async function runValidate(args: string[]): Promise<void> {\n const command = configureValidateCommand(\n new Command().name(\"validate\"),\n async (source, options) => {\n await executeValidate(toValidateOptions(source, options));\n },\n );\n await parseStandaloneCommand(command, args);\n}\n", "import { spawnSync } from \"node:child_process\";\nimport fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport YAML from \"yaml\";\nimport { z } from \"zod\";\nimport {\n type PolicyMode,\n evaluateHookTrustPolicy,\n evaluateInstallerLocalDependencyPolicy,\n} from \"./policy\";\nimport { type InstallerSecurityViolation } from \"./installer-security\";\n\ntype DependencyObject = {\n source: string;\n path: string;\n};\n\ntype Dependency = string | DependencyObject;\n\ntype InstallerConfig = {\n schemaVersion: 1;\n preInstall: string[];\n dependencies: Dependency[];\n postInstall: string[];\n};\n\nexport type InstallerRuntimeEvent = {\n level: \"info\" | \"warning\";\n message: string;\n};\n\ntype SkillInstallerRuntimeOptions = {\n sourceType?: \"local\" | \"github\" | \"git\" | \"well-known\" | \"catalog\";\n allowHookCommands?: boolean;\n policyMode?: PolicyMode;\n trustWellKnown?: boolean;\n};\n\ntype LocalPreparedDependency = {\n kind: \"local\";\n index: number;\n targetPath: string;\n sourcePath: string;\n sourceLabel: string;\n};\n\ntype RemotePreparedDependency = {\n kind: \"remote-bytes\";\n index: number;\n targetPath: string;\n remoteBufferPath: string;\n sourceLabel: string;\n};\n\ntype RepoPreparedDependency = {\n kind: \"repo-staged\";\n index: number;\n targetPath: string;\n repoStagePath: string;\n sourceLabel: string;\n};\n\ntype PreparedDependency =\n | LocalPreparedDependency\n | RemotePreparedDependency\n | RepoPreparedDependency;\n\nexport class InstallerSecurityError extends Error {\n violation: InstallerSecurityViolation;\n\n constructor(violation: InstallerSecurityViolation) {\n super(violation.message);\n this.name = \"InstallerSecurityError\";\n this.violation = violation;\n }\n}\n\nexport function isInstallerSecurityError(\n error: unknown,\n): error is InstallerSecurityError {\n return error instanceof InstallerSecurityError;\n}\n\nexport class InstallerPolicyError extends Error {\n violation: {\n rule: string;\n message: string;\n severity: \"error\" | \"warning\";\n blocking: boolean;\n };\n\n constructor(violation: {\n rule: string;\n message: string;\n severity: \"error\" | \"warning\";\n blocking: boolean;\n }) {\n super(violation.message);\n this.name = \"InstallerPolicyError\";\n this.violation = violation;\n }\n}\n\nexport function isInstallerPolicyError(\n error: unknown,\n): error is InstallerPolicyError {\n return error instanceof InstallerPolicyError;\n}\n\nexport type PreparedInstallerArtifacts = {\n preInstall: string[];\n postInstall: string[];\n preparedDependencies: PreparedDependency[];\n stagingDir: string;\n events: InstallerRuntimeEvent[];\n};\n\nconst dependencyObjectSchema = z\n .object({\n source: z.string().min(1),\n path: z.string().min(1),\n })\n .strict();\n\nconst installerConfigSchema = z\n .object({\n schemaVersion: z.literal(1),\n \"pre-install\": z.array(z.string().min(1)).optional().default([]),\n dependencies: z\n .array(z.union([z.string().min(1), dependencyObjectSchema]))\n .optional()\n .default([]),\n \"post-install\": z.array(z.string().min(1)).optional().default([]),\n })\n .strict();\n\nfunction ensureInsideRoot(rootDir: string, relativeTarget: string): string {\n const resolved = path.resolve(rootDir, relativeTarget);\n const relative = path.relative(rootDir, resolved);\n if (!relative || relative.startsWith(\"..\") || path.isAbsolute(relative)) {\n throw new Error(`Unsafe destination path: ${relativeTarget}`);\n }\n return resolved;\n}\n\nfunction sourceLooksLikeUrl(source: string): boolean {\n try {\n const parsed = new URL(source);\n return parsed.protocol === \"http:\" || parsed.protocol === \"https:\";\n } catch {\n return false;\n }\n}\n\nfunction sourceLooksLikeRepoShorthand(source: string): boolean {\n const trimmed = source.trim().replace(/^https?:\\/\\//, \"\");\n return /^(github\\.com|gitlab\\.com)\\/[^/]+\\/[^/]+(?:\\.git)?\\/?$/.test(trimmed);\n}\n\nfunction parseRepoSource(source: string): {\n repoUrl: string;\n repoName: string;\n} {\n const withoutProtocol = source\n .trim()\n .replace(/^https?:\\/\\//, \"\")\n .replace(/\\/+$/, \"\");\n const match = withoutProtocol.match(\n /^(github\\.com|gitlab\\.com)\\/([^/]+)\\/([^/]+?)(?:\\.git)?$/,\n );\n if (!match) {\n throw new Error(`Unsupported repository dependency source: ${source}`);\n }\n\n const host = match[1];\n const owner = match[2];\n const repo = match[3];\n return {\n repoUrl: `https://${host}/${owner}/${repo}.git`,\n repoName: repo,\n };\n}\n\nfunction deriveDestinationNameFromSource(source: string): string {\n if (sourceLooksLikeUrl(source)) {\n const parsed = new URL(source);\n const parts = parsed.pathname.split(\"/\").filter(Boolean);\n const leaf = parts[parts.length - 1];\n if (!leaf) {\n throw new Error(\n `Cannot derive dependency name from URL source: ${source}`,\n );\n }\n return leaf;\n }\n\n if (sourceLooksLikeRepoShorthand(source)) {\n return parseRepoSource(source).repoName;\n }\n\n const leaf = path.basename(source);\n if (!leaf || leaf === \".\" || leaf === path.sep) {\n throw new Error(`Cannot derive dependency name from source: ${source}`);\n }\n return leaf;\n}\n\nexport function classifyDependencySource(\n source: string,\n): \"url\" | \"repo\" | \"local\" {\n if (sourceLooksLikeUrl(source)) {\n return \"url\";\n }\n if (sourceLooksLikeRepoShorthand(source)) {\n return \"repo\";\n }\n return \"local\";\n}\n\nfunction parseConfigObject(raw: unknown): InstallerConfig {\n if (!raw || typeof raw !== \"object\" || Array.isArray(raw)) {\n throw new Error(\n \"Invalid skill-installer config: expected an object with top-level keys\",\n );\n }\n\n const parsed = raw as Record<string, unknown>;\n if (typeof parsed[\"skill-installer\"] !== \"undefined\") {\n throw new Error(\n \"Invalid skill-installer config: do not nest under 'skill-installer:'. Use top-level 'pre-install', 'dependencies', and 'post-install'.\",\n );\n }\n\n if (Array.isArray(parsed.dependencies)) {\n const hasLegacyDependency = parsed.dependencies.some((entry) => {\n if (!entry || typeof entry !== \"object\" || Array.isArray(entry)) {\n return false;\n }\n const row = entry as Record<string, unknown>;\n return (\n typeof row.type !== \"undefined\" ||\n typeof row.url !== \"undefined\" ||\n typeof row.name !== \"undefined\"\n );\n });\n\n if (hasLegacyDependency) {\n throw new Error(\n \"Invalid skill-installer config: legacy dependency format detected. Use schemaVersion: 1 and the lean dependencies format from docs/proposed-skill-format.md.\",\n );\n }\n }\n\n const validated = installerConfigSchema.safeParse(parsed);\n if (!validated.success) {\n const reason = validated.error.issues\n .map((issue) => issue.message)\n .join(\"; \");\n throw new Error(\n `Invalid skill-installer config: ${reason}. Use docs/proposed-skill-format.md as the source-of-truth for schemaVersion, dependencies, pre-install, and post-install.`,\n );\n }\n\n const normalized = validated.data;\n return {\n schemaVersion: 1,\n preInstall: normalized[\"pre-install\"],\n dependencies: normalized.dependencies.map((dep) =>\n typeof dep === \"string\" ? dep : { source: dep.source, path: dep.path },\n ),\n postInstall: normalized[\"post-install\"],\n };\n}\n\nfunction assertNoLegacyInstallerBlock(skillDir: string): void {\n const openAiYamlPath = path.join(skillDir, \"agents\", \"openai.yaml\");\n if (!fs.existsSync(openAiYamlPath) || !fs.statSync(openAiYamlPath).isFile()) {\n return;\n }\n\n const parsed = YAML.parse(fs.readFileSync(openAiYamlPath, \"utf8\")) as Record<\n string,\n unknown\n > | null;\n if (\n parsed &&\n typeof parsed === \"object\" &&\n typeof parsed[\"skill-installer\"] !== \"undefined\"\n ) {\n throw new Error(\n \"Legacy skill-installer config detected in agents/openai.yaml. Move it to skill-installer.yaml or skill-installer.json.\",\n );\n }\n}\n\nexport function loadInstallerConfig(skillDir: string): InstallerConfig {\n assertNoLegacyInstallerBlock(skillDir);\n\n const yamlPath = path.join(skillDir, \"skill-installer.yaml\");\n const jsonPath = path.join(skillDir, \"skill-installer.json\");\n const hasYaml = fs.existsSync(yamlPath) && fs.statSync(yamlPath).isFile();\n const hasJson = fs.existsSync(jsonPath) && fs.statSync(jsonPath).isFile();\n\n if (hasYaml && hasJson) {\n throw new Error(\n \"Both skill-installer.yaml and skill-installer.json exist. Keep only one installer config file.\",\n );\n }\n\n if (!hasYaml && !hasJson) {\n return {\n schemaVersion: 1,\n preInstall: [],\n dependencies: [],\n postInstall: [],\n };\n }\n\n if (hasYaml) {\n const parsed = YAML.parse(fs.readFileSync(yamlPath, \"utf8\"));\n return parseConfigObject(parsed);\n }\n\n const raw = JSON.parse(fs.readFileSync(jsonPath, \"utf8\")) as unknown;\n return parseConfigObject(raw);\n}\n\nfunction runHookPhase(\n phase: \"pre-install\" | \"post-install\",\n commands: string[],\n cwd: string,\n events: InstallerRuntimeEvent[],\n): void {\n for (const command of commands) {\n events.push({\n level: \"info\",\n message: `[skills] ${phase}: ${command}`,\n });\n const result = spawnSync(\"sh\", [\"-c\", command], {\n cwd,\n encoding: \"utf8\",\n stdio: \"pipe\",\n });\n\n if (result.status !== 0) {\n const message =\n (result.stderr || result.stdout || \"command failed\")\n .trim()\n .split(/\\r?\\n/)[0] || \"command failed\";\n throw new Error(`${phase} command failed: ${command} (${message})`);\n }\n }\n}\n\nfunction resolveDependencySourceAndTarget(dep: Dependency): {\n source: string;\n targetPath: string;\n} {\n if (typeof dep === \"string\") {\n return {\n source: dep,\n targetPath: deriveDestinationNameFromSource(dep),\n };\n }\n\n return {\n source: dep.source,\n targetPath: dep.path,\n };\n}\n\nfunction runGitClone(repoUrl: string, targetDir: string): void {\n const result = spawnSync(\n \"git\",\n [\"clone\", \"--depth\", \"1\", repoUrl, targetDir],\n {\n encoding: \"utf8\",\n stdio: \"pipe\",\n },\n );\n if (result.status !== 0) {\n const message =\n (result.stderr || result.stdout || \"git clone failed\")\n .trim()\n .split(/\\r?\\n/)[0] || \"git clone failed\";\n throw new Error(\n `Repository dependency clone failed: ${repoUrl} (${message})`,\n );\n }\n}\n\nasync function prepareDependency(\n source: string,\n targetPath: string,\n index: number,\n sourceCwd: string,\n stagingDir: string,\n policyMode: PolicyMode,\n events: InstallerRuntimeEvent[],\n): Promise<PreparedDependency> {\n const sourceKind = classifyDependencySource(source);\n\n if (sourceKind === \"local\") {\n const evaluation = evaluateInstallerLocalDependencyPolicy(\n {\n source,\n sourceRoot: sourceCwd,\n },\n policyMode,\n );\n if (!evaluation.ok) {\n const violation =\n \"violation\" in evaluation ? evaluation.violation : undefined;\n if (!violation) {\n throw new Error(\n `Dependency[${index}] policy evaluation failed for source: ${source}`,\n );\n }\n if (violation.blocking) {\n throw new InstallerSecurityError(violation);\n }\n events.push({\n level: \"warning\",\n message: `[skills] ${violation.message}`,\n });\n }\n const sourcePath = evaluation.ok\n ? evaluation.resolvedPath\n : path.resolve(sourceCwd, source);\n if (!fs.existsSync(sourcePath)) {\n throw new Error(\n `Dependency[${index}] (local) source not found: ${source}`,\n );\n }\n // Read access preflight; actual copy happens once during apply.\n fs.accessSync(sourcePath, fs.constants.R_OK);\n events.push({\n level: \"info\",\n message: `[skills] dependency[${index}] preflight-validated: ${source}`,\n });\n return {\n kind: \"local\",\n index,\n targetPath,\n sourcePath,\n sourceLabel: source,\n };\n }\n\n if (sourceKind === \"repo\") {\n const stagePath = ensureInsideRoot(\n stagingDir,\n `repo-${index}-${path\n .basename(targetPath)\n .replace(/[^a-zA-Z0-9._-]/g, \"_\")}`,\n );\n const { repoUrl } = parseRepoSource(source);\n runGitClone(repoUrl, stagePath);\n events.push({\n level: \"info\",\n message: `[skills] dependency[${index}] staged: ${source}`,\n });\n return {\n kind: \"repo-staged\",\n index,\n targetPath,\n repoStagePath: stagePath,\n sourceLabel: source,\n };\n }\n\n const target = new URL(source);\n if (target.protocol !== \"http:\" && target.protocol !== \"https:\") {\n throw new Error(\n `Dependency[${index}] (remote) unsupported protocol: ${target.protocol}`,\n );\n }\n\n const response = await fetch(target.toString());\n if (!response.ok) {\n throw new Error(\n `Dependency[${index}] (remote) download failed: ${response.status} ${response.statusText}`,\n );\n }\n\n const stagedFilePath = ensureInsideRoot(\n stagingDir,\n `remote-${index}-${path.basename(targetPath)}`,\n );\n fs.mkdirSync(path.dirname(stagedFilePath), { recursive: true });\n fs.writeFileSync(stagedFilePath, Buffer.from(await response.arrayBuffer()));\n events.push({\n level: \"info\",\n message: `[skills] dependency[${index}] staged: ${source}`,\n });\n return {\n kind: \"remote-bytes\",\n index,\n targetPath,\n remoteBufferPath: stagedFilePath,\n sourceLabel: source,\n };\n}\n\nexport async function prepareInstallerArtifacts(\n skillDir: string,\n sourceCwd: string,\n options: SkillInstallerRuntimeOptions = {},\n): Promise<PreparedInstallerArtifacts> {\n const config = loadInstallerConfig(skillDir);\n const sourceType = options.sourceType ?? \"local\";\n const allowHookCommands = options.allowHookCommands;\n const policyMode = options.policyMode ?? \"enforce\";\n\n const events: InstallerRuntimeEvent[] = [];\n if (config.preInstall.length > 0 || config.postInstall.length > 0) {\n if (allowHookCommands === false) {\n throw new Error(\n \"Blocked skill-installer hook commands by caller policy for pre/post install commands.\",\n );\n }\n const trustDecision = evaluateHookTrustPolicy({\n sourceType,\n trustWellKnown: Boolean(options.trustWellKnown),\n mode: policyMode,\n });\n if (!trustDecision.allowed && trustDecision.violation) {\n throw new InstallerPolicyError(trustDecision.violation);\n }\n if (\n trustDecision.allowed &&\n trustDecision.violation?.severity === \"warning\"\n ) {\n events.push({\n level: \"warning\",\n message: `[skills] ${trustDecision.violation.message}`,\n });\n }\n }\n\n if (\n config.preInstall.length === 0 &&\n config.dependencies.length === 0 &&\n config.postInstall.length === 0\n ) {\n return {\n preInstall: [],\n postInstall: [],\n preparedDependencies: [],\n stagingDir: \"\",\n events,\n };\n }\n\n const stagingDir = fs.mkdtempSync(\n path.join(os.tmpdir(), \"skillspp-installer-stage-\"),\n );\n const preparedDependencies: PreparedDependency[] = [];\n const seenTargetPaths = new Set<string>();\n\n try {\n for (let i = 0; i < config.dependencies.length; i += 1) {\n const dep = config.dependencies[i];\n const { source, targetPath } = resolveDependencySourceAndTarget(dep);\n\n const normalizedTarget = targetPath.replace(/\\\\/g, \"/\");\n if (seenTargetPaths.has(normalizedTarget)) {\n throw new Error(\n `Dependency[${i}] duplicate target path: ${targetPath}`,\n );\n }\n seenTargetPaths.add(normalizedTarget);\n\n const destinationInSkill = ensureInsideRoot(skillDir, targetPath);\n if (fs.existsSync(destinationInSkill)) {\n throw new Error(\n `Dependency[${i}] destination already exists: ${path.relative(\n skillDir,\n destinationInSkill,\n )}`,\n );\n }\n\n const preparedDep = await prepareDependency(\n source,\n targetPath,\n i,\n sourceCwd,\n stagingDir,\n policyMode,\n events,\n );\n preparedDependencies.push(preparedDep);\n }\n\n return {\n preInstall: config.preInstall,\n postInstall: config.postInstall,\n preparedDependencies,\n stagingDir,\n events,\n };\n } catch (error) {\n fs.rmSync(stagingDir, { recursive: true, force: true });\n throw error;\n }\n}\n\nexport function cleanupPreparedInstallerArtifacts(\n prepared: PreparedInstallerArtifacts,\n): void {\n if (prepared.stagingDir) {\n fs.rmSync(prepared.stagingDir, { recursive: true, force: true });\n }\n}\n\nexport async function applyInstallerArtifacts(\n installedSkillDir: string,\n prepared: PreparedInstallerArtifacts,\n): Promise<void> {\n if (\n prepared.preInstall.length === 0 &&\n prepared.postInstall.length === 0 &&\n prepared.preparedDependencies.length === 0\n ) {\n return;\n }\n\n runHookPhase(\n \"pre-install\",\n prepared.preInstall,\n installedSkillDir,\n prepared.events,\n );\n\n for (const dep of prepared.preparedDependencies) {\n const destinationPath = ensureInsideRoot(installedSkillDir, dep.targetPath);\n if (fs.existsSync(destinationPath)) {\n throw new Error(\n `Dependency[${dep.index}] destination already exists: ${path.relative(\n installedSkillDir,\n destinationPath,\n )}`,\n );\n }\n\n fs.mkdirSync(path.dirname(destinationPath), { recursive: true });\n if (dep.kind === \"local\") {\n const stat = fs.statSync(dep.sourcePath);\n if (stat.isDirectory()) {\n fs.cpSync(dep.sourcePath, destinationPath, {\n recursive: true,\n force: false,\n errorOnExist: true,\n });\n } else {\n fs.copyFileSync(dep.sourcePath, destinationPath);\n }\n } else if (dep.kind === \"remote-bytes\") {\n fs.copyFileSync(dep.remoteBufferPath, destinationPath);\n } else {\n try {\n fs.renameSync(dep.repoStagePath, destinationPath);\n } catch (error: unknown) {\n const code =\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n typeof (error as { code?: unknown }).code === \"string\"\n ? (error as { code: string }).code\n : \"\";\n if (code !== \"EXDEV\") {\n throw error;\n }\n fs.cpSync(dep.repoStagePath, destinationPath, {\n recursive: true,\n force: false,\n errorOnExist: true,\n });\n }\n }\n\n prepared.events.push({\n level: \"info\",\n message: `[skills] dependency[${dep.index}] installed: ${dep.targetPath}`,\n });\n }\n\n runHookPhase(\n \"post-install\",\n prepared.postInstall,\n installedSkillDir,\n prepared.events,\n );\n}\n\nexport async function runSkillInstaller(\n skillDir: string,\n sourceCwd: string,\n options: SkillInstallerRuntimeOptions = {},\n): Promise<void> {\n const prepared = await prepareInstallerArtifacts(\n skillDir,\n sourceCwd,\n options,\n );\n try {\n await applyInstallerArtifacts(skillDir, prepared);\n } finally {\n cleanupPreparedInstallerArtifacts(prepared);\n }\n}\n", "import fs from \"node:fs\";\nimport path from \"node:path\";\n\nexport type InstallerSecuritySeverity = \"error\" | \"warning\";\n\nexport type InstallerSecurityViolation = {\n rule:\n | \"installer-local-dependency-absolute-path\"\n | \"installer-local-dependency-path-escape\";\n message: string;\n severity: InstallerSecuritySeverity;\n blocking: boolean;\n};\n\nexport type InstallerSecurityEvaluationInput = {\n source: string;\n sourceRoot: string;\n};\n\nexport type InstallerSecurityEvaluationOptions = {\n // Reserved for Phase 6 policy controls.\n readonly policyMode?: \"fixed\";\n};\n\nexport type InstallerSecurityEvaluationResult =\n | {\n ok: true;\n resolvedPath: string;\n }\n | {\n ok: false;\n violation: InstallerSecurityViolation;\n };\n\nfunction isInsideRoot(rootDir: string, candidatePath: string): boolean {\n const relative = path.relative(rootDir, candidatePath);\n return (\n Boolean(relative) &&\n !relative.startsWith(\"..\") &&\n !path.isAbsolute(relative)\n );\n}\n\nfunction toEscapeViolation(source: string): InstallerSecurityViolation {\n return {\n rule: \"installer-local-dependency-path-escape\",\n message: `local dependency escapes source root: ${source}`,\n severity: \"error\",\n blocking: true,\n };\n}\n\nexport function evaluateInstallerLocalDependency(\n input: InstallerSecurityEvaluationInput,\n _options: InstallerSecurityEvaluationOptions = {}\n): InstallerSecurityEvaluationResult {\n if (path.isAbsolute(input.source)) {\n return {\n ok: false,\n violation: {\n rule: \"installer-local-dependency-absolute-path\",\n message: `absolute local dependency paths are not allowed: ${input.source}`,\n severity: \"error\",\n blocking: true,\n },\n };\n }\n\n const resolvedRoot = path.resolve(input.sourceRoot);\n const resolvedSourcePath = path.resolve(resolvedRoot, input.source);\n\n if (!isInsideRoot(resolvedRoot, resolvedSourcePath)) {\n return {\n ok: false,\n violation: toEscapeViolation(input.source),\n };\n }\n\n if (fs.existsSync(resolvedSourcePath)) {\n const realRoot = fs.realpathSync.native\n ? fs.realpathSync.native(resolvedRoot)\n : fs.realpathSync(resolvedRoot);\n const realSource = fs.realpathSync.native\n ? fs.realpathSync.native(resolvedSourcePath)\n : fs.realpathSync(resolvedSourcePath);\n if (!isInsideRoot(realRoot, realSource)) {\n return {\n ok: false,\n violation: toEscapeViolation(input.source),\n };\n }\n }\n\n return {\n ok: true,\n resolvedPath: resolvedSourcePath,\n };\n}\n", "import type { ParsedSource } from \"../contracts/runtime-types\";\nimport {\n evaluateInstallerLocalDependency as evaluateLocalDependencySecurity,\n type InstallerSecurityEvaluationResult,\n type InstallerSecurityViolation,\n} from \"./installer-security\";\n\nexport type PolicyMode = \"enforce\" | \"warn\";\n\nexport type PolicyViolation =\n | InstallerSecurityViolation\n | {\n rule: \"hook-trust-required\";\n message: string;\n severity: \"error\" | \"warning\";\n blocking: boolean;\n };\n\nexport type PolicyDecision = {\n allowed: boolean;\n violation?: PolicyViolation;\n};\n\nfunction applyMode(\n result: InstallerSecurityEvaluationResult,\n mode: PolicyMode\n): InstallerSecurityEvaluationResult {\n if (mode === \"enforce\" || result.ok) {\n return result;\n }\n const violation = \"violation\" in result ? result.violation : undefined;\n if (!violation) {\n return result;\n }\n return {\n ok: false,\n violation: {\n ...violation,\n severity: \"warning\",\n blocking: false,\n },\n };\n}\n\nexport function evaluateInstallerLocalDependencyPolicy(\n input: { source: string; sourceRoot: string },\n mode: PolicyMode\n): InstallerSecurityEvaluationResult {\n return applyMode(\n evaluateLocalDependencySecurity(input, { policyMode: \"fixed\" }),\n mode\n );\n}\n\nexport function evaluateHookTrustPolicy(input: {\n sourceType: ParsedSource[\"type\"];\n trustWellKnown: boolean;\n mode: PolicyMode;\n}): PolicyDecision {\n if (input.sourceType !== \"well-known\") {\n return { allowed: true };\n }\n\n if (input.trustWellKnown) {\n return { allowed: true };\n }\n\n if (input.mode === \"warn\") {\n return {\n allowed: true,\n violation: {\n rule: \"hook-trust-required\",\n message:\n \"Well-known hook commands are untrusted. Proceeding due to warning policy mode.\",\n severity: \"warning\",\n blocking: false,\n },\n };\n }\n\n return {\n allowed: false,\n violation: {\n rule: \"hook-trust-required\",\n message:\n \"Blocked skill-installer hook commands for well-known source. Trust this source explicitly or use warning policy mode.\",\n severity: \"error\",\n blocking: true,\n },\n };\n}\n", "import {\n createTelemetryEmitter,\n type TelemetryEmitter,\n} from \"@skillspp/core/telemetry\";\n\nexport type TelemetrySink = \"stdout-json\";\n\nexport function parseTelemetrySink(value?: string): TelemetrySink | undefined {\n if (!value) {\n return undefined;\n }\n if (value === \"stdout-json\") {\n return value;\n }\n throw new Error(`Invalid --telemetry value: ${value}`);\n}\n\nexport function createCliTelemetryEmitter(\n sink?: TelemetrySink\n): TelemetryEmitter {\n const emitter = createTelemetryEmitter();\n if (sink === \"stdout-json\") {\n emitter.subscribe((event) => {\n process.stdout.write(`${JSON.stringify(event)}\\n`);\n });\n }\n return emitter;\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["Command", "CommanderError", "path", "Command", "path", "path", "path", "path", "path", "fs", "path", "fs", "path", "os", "path", "os", "path", "fs", "path", "AnimatedLogoHeader", "useState", "Box", "Text", "useInput", "jsx", "Box", "Text", "useState", "useInput", "selectedId", "fs", "path", "fileURLToPath", "runBackgroundTask", "path", "wanted", "selectedNames", "runBackgroundTask", "Command", "fs", "os", "path", "spawn", "fs", "path", "os", "path", "DEFAULT_OPTIONS", "fs", "path", "path", "fs", "fs", "path", "runBackgroundTask", "Command", "runBackgroundTask", "fs", "path", "Command", "YAML", "fs", "path", "YAML", "YAML", "fs", "path", "selected", "selectedRowIds", "path", "fs", "Command", "AGENT_DESC_WIDTH", "runBackgroundTask", "fs", "path", "Command", "SKILL_NAME_WIDTH", "SKILL_DESC_WIDTH", "AGENT_NAME_WIDTH", "AGENT_DESC_WIDTH", "fs", "path", "Command", "runBackgroundTask", "fs", "path", "os", "Command", "matter", "spawnSync", "fs", "os", "path", "YAML", "fs", "path", "path", "leaf", "fs", "YAML", "spawnSync", "path", "fs", "os", "path", "fs", "os", "matter", "diagnostics", "errors", "warnings", "runBackgroundTask", "require", "Command", "CommanderError"]
7
+ }