@claude-collective/cli 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/cli/index.ts","../../src/cli/commands/compile.ts","../../src/cli/utils/logger.ts","../../src/cli/lib/plugin-finder.ts","../../src/cli/utils/fs.ts","../../src/cli/consts.ts","../../src/cli/lib/agent-fetcher.ts","../../src/cli/lib/source-fetcher.ts","../../src/cli/lib/config.ts","../../src/cli/lib/agent-recompiler.ts","../../src/cli/lib/loader.ts","../../src/cli/lib/resolver.ts","../../src/cli/lib/stack-plugin-compiler.ts","../../src/cli/lib/compiler.ts","../../src/cli/lib/plugin-manifest.ts","../../src/cli/lib/versioning.ts","../../src/cli/lib/exit-codes.ts","../../src/cli/commands/compile-plugins.ts","../../src/cli/lib/skill-plugin-compiler.ts","../../src/cli/commands/compile-stack.ts","../../src/cli/commands/generate-marketplace.ts","../../src/cli/lib/marketplace-generator.ts","../../src/cli/commands/init.ts","../../src/cli/lib/wizard.ts","../../src/cli/lib/matrix-resolver.ts","../../src/cli/lib/source-loader.ts","../../src/cli/lib/matrix-loader.ts","../../src/cli/lib/local-skill-loader.ts","../../src/cli/lib/skill-copier.ts","../../src/cli/lib/permission-checker.ts","../../src/cli/lib/stack-installer.ts","../../src/cli/utils/exec.ts","../../src/cli/lib/skill-agent-mappings.ts","../../src/cli/lib/config-generator.ts","../../src/cli/commands/edit.ts","../../src/cli/lib/plugin-version.ts","../../src/cli/commands/validate.ts","../../src/cli/lib/schema-validator.ts","../../src/cli/lib/plugin-validator.ts","../../src/cli/commands/list.ts","../../src/cli/lib/plugin-info.ts","../../src/cli/commands/config.ts","../../src/cli/commands/eject.ts","../../src/cli/commands/version.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport pc from \"picocolors\";\nimport { compileCommand } from \"./commands/compile\";\nimport { compilePluginsCommand } from \"./commands/compile-plugins\";\nimport { compileStackCommand } from \"./commands/compile-stack\";\nimport { generateMarketplaceCommand } from \"./commands/generate-marketplace\";\nimport { initCommand } from \"./commands/init\";\nimport { editCommand } from \"./commands/edit\";\nimport { validateCommand } from \"./commands/validate\";\nimport { listCommand } from \"./commands/list\";\nimport { configCommand } from \"./commands/config\";\nimport { ejectCommand } from \"./commands/eject\";\nimport { versionCommand } from \"./commands/version\";\nimport { EXIT_CODES } from \"./lib/exit-codes\";\n\nprocess.on(\"SIGINT\", () => {\n console.log(pc.yellow(\"\\nCancelled\"));\n process.exit(EXIT_CODES.CANCELLED);\n});\n\nasync function main() {\n const program = new Command();\n\n program\n .name(\"cc\")\n .description(\"Claude Collective CLI - Manage skills, plugins, and agents\")\n .version(\"0.1.0\")\n .option(\"--dry-run\", \"Preview operations without executing\")\n .configureOutput({\n writeErr: (str) => console.error(pc.red(str)),\n })\n .showHelpAfterError(true);\n\n program.addCommand(initCommand);\n program.addCommand(editCommand);\n program.addCommand(compileCommand);\n program.addCommand(compilePluginsCommand);\n program.addCommand(compileStackCommand);\n program.addCommand(generateMarketplaceCommand);\n program.addCommand(validateCommand);\n program.addCommand(listCommand);\n program.addCommand(configCommand);\n program.addCommand(ejectCommand);\n program.addCommand(versionCommand);\n\n await program.parseAsync(process.argv);\n}\n\nmain().catch((err) => {\n console.error(pc.red(\"Error:\"), err.message);\n process.exit(EXIT_CODES.ERROR);\n});\n","import { Command } from \"commander\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport path from \"path\";\nimport { parse as parseYaml } from \"yaml\";\nimport { setVerbose, verbose } from \"../utils/logger\";\nimport {\n getCollectivePluginDir,\n getPluginAgentsDir,\n getPluginManifestPath,\n getProjectPluginsDir,\n} from \"../lib/plugin-finder\";\nimport { getAgentDefinitions } from \"../lib/agent-fetcher\";\nimport { resolveSource } from \"../lib/config\";\nimport {\n directoryExists,\n ensureDir,\n glob,\n readFile,\n fileExists,\n listDirectories,\n} from \"../utils/fs\";\nimport { recompileAgents } from \"../lib/agent-recompiler\";\nimport { loadPluginSkills } from \"../lib/loader\";\nimport { LOCAL_SKILLS_PATH } from \"../consts\";\nimport { EXIT_CODES } from \"../lib/exit-codes\";\nimport type {\n AgentSourcePaths,\n PluginManifest,\n StackConfig,\n SkillDefinition,\n} from \"../types\";\n\nasync function loadSkillsFromDir(\n skillsDir: string,\n pathPrefix: string = \"\",\n): Promise<Record<string, SkillDefinition>> {\n const skills: Record<string, SkillDefinition> = {};\n\n if (!(await directoryExists(skillsDir))) {\n return skills;\n }\n\n const skillFiles = await glob(\"**/SKILL.md\", skillsDir);\n\n for (const skillFile of skillFiles) {\n const skillPath = path.join(skillsDir, skillFile);\n const skillDir = path.dirname(skillPath);\n const relativePath = path.relative(skillsDir, skillDir);\n\n try {\n const content = await readFile(skillPath);\n let metadata: Record<string, unknown> = {};\n\n if (content.startsWith(\"---\")) {\n const endIndex = content.indexOf(\"---\", 3);\n if (endIndex > 0) {\n const yamlContent = content.slice(3, endIndex).trim();\n const lines = yamlContent.split(\"\\n\");\n for (const line of lines) {\n const colonIndex = line.indexOf(\":\");\n if (colonIndex > 0) {\n const key = line.slice(0, colonIndex).trim();\n const value = line.slice(colonIndex + 1).trim();\n metadata[key] = value.replace(/^[\"']|[\"']$/g, \"\");\n }\n }\n }\n }\n\n const skillName = (metadata.name as string) || path.basename(skillDir);\n const canonicalId = skillName;\n\n const skill: SkillDefinition = {\n path: pathPrefix\n ? `${pathPrefix}/${relativePath}/`\n : `${relativePath}/`,\n name: skillName,\n description: (metadata.description as string) || \"\",\n canonicalId,\n };\n\n skills[canonicalId] = skill;\n verbose(` Loaded skill: ${canonicalId}`);\n } catch (error) {\n verbose(` Failed to load skill: ${skillFile} - ${error}`);\n }\n }\n\n return skills;\n}\n\nasync function discoverPluginSkills(\n projectDir: string,\n): Promise<Record<string, SkillDefinition>> {\n const allSkills: Record<string, SkillDefinition> = {};\n const pluginsDir = getProjectPluginsDir(projectDir);\n\n if (!(await directoryExists(pluginsDir))) {\n verbose(`No plugins directory found at ${pluginsDir}`);\n return allSkills;\n }\n\n const pluginDirs = await listDirectories(pluginsDir);\n\n for (const pluginName of pluginDirs) {\n const pluginDir = path.join(pluginsDir, pluginName);\n const pluginSkillsDir = path.join(pluginDir, \"skills\");\n\n if (await directoryExists(pluginSkillsDir)) {\n verbose(`Discovering skills from plugin: ${pluginName}`);\n const pluginSkills = await loadPluginSkills(pluginDir);\n\n for (const [id, skill] of Object.entries(pluginSkills)) {\n allSkills[id] = skill;\n }\n }\n }\n\n return allSkills;\n}\n\nasync function discoverLocalProjectSkills(\n projectDir: string,\n): Promise<Record<string, SkillDefinition>> {\n const localSkillsDir = path.join(projectDir, LOCAL_SKILLS_PATH);\n return loadSkillsFromDir(localSkillsDir, LOCAL_SKILLS_PATH);\n}\n\n/** Merge skills from multiple sources. Later sources take precedence. */\nfunction mergeSkills(\n ...skillSources: Record<string, SkillDefinition>[]\n): Record<string, SkillDefinition> {\n const merged: Record<string, SkillDefinition> = {};\n\n for (const source of skillSources) {\n for (const [id, skill] of Object.entries(source)) {\n merged[id] = skill;\n }\n }\n\n return merged;\n}\n\nexport const compileCommand = new Command(\"compile\")\n .description(\n \"Compile agents using local skills and fetched agent definitions\",\n )\n .option(\"-v, --verbose\", \"Enable verbose logging\", false)\n .option(\n \"--source <url>\",\n \"Skills marketplace source (default: github:claude-collective/skills)\",\n )\n .option(\n \"--agent-source <url>\",\n \"Remote agent partials source (default: local CLI)\",\n )\n .option(\"--refresh\", \"Force refresh from remote sources\", false)\n .option(\n \"-o, --output <dir>\",\n \"Output directory for compiled agents (skips plugin mode)\",\n )\n .configureOutput({\n writeErr: (str) => console.error(pc.red(str)),\n })\n .showHelpAfterError(true)\n .action(async (options, command) => {\n const dryRun = command.optsWithGlobals().dryRun ?? false;\n const s = p.spinner();\n setVerbose(options.verbose);\n\n if (options.output) {\n await runCustomOutputCompile(s, options, dryRun);\n } else {\n await runPluginModeCompile(s, options, dryRun);\n }\n });\n\nasync function readPluginManifest(\n pluginDir: string,\n): Promise<PluginManifest | null> {\n const manifestPath = getPluginManifestPath(pluginDir);\n\n if (!(await fileExists(manifestPath))) {\n return null;\n }\n\n try {\n const content = await readFile(manifestPath);\n return JSON.parse(content) as PluginManifest;\n } catch {\n return null;\n }\n}\n\nasync function runPluginModeCompile(\n s: ReturnType<typeof p.spinner>,\n options: {\n source?: string;\n agentSource?: string;\n refresh?: boolean;\n verbose?: boolean;\n },\n dryRun: boolean,\n): Promise<void> {\n console.log(`\\n${pc.cyan(\"Plugin Mode Compile\")}\\n`);\n\n // 1. Get the collective plugin directory (always ~/.claude/plugins/claude-collective/)\n const pluginDir = getCollectivePluginDir();\n s.start(\"Finding plugin...\");\n\n // Check if plugin exists\n if (!(await directoryExists(pluginDir))) {\n s.stop(\"No plugin found\");\n p.log.error(\"No plugin found.\");\n p.log.info(`Run ${pc.cyan(\"cc init\")} first to create a plugin.`);\n process.exit(EXIT_CODES.ERROR);\n }\n\n const manifest = await readPluginManifest(pluginDir);\n const pluginName = manifest?.name ?? \"claude-collective\";\n\n s.stop(`Found plugin: ${pluginName}`);\n verbose(` Path: ${pluginDir}`);\n\n const configPath = path.join(pluginDir, \"config.yaml\");\n const hasConfig = await fileExists(configPath);\n if (hasConfig) {\n try {\n const configContent = await readFile(configPath);\n const config = parseYaml(configContent) as StackConfig;\n const agentCount = config.agents?.length ?? 0;\n const configSkillCount = config.skills?.length ?? 0;\n p.log.info(\n `Using ${pc.cyan(\"config.yaml\")} (${agentCount} agents, ${configSkillCount} skills)`,\n );\n verbose(` Config: ${configPath}`);\n } catch {\n p.log.warn(`config.yaml found but could not be parsed - using defaults`);\n }\n } else {\n verbose(` No config.yaml found - using defaults`);\n }\n\n const projectDir = process.cwd();\n s.start(\"Discovering skills...\");\n\n const pluginSkills = await discoverPluginSkills(projectDir);\n const pluginSkillCount = Object.keys(pluginSkills).length;\n verbose(` Found ${pluginSkillCount} skills from installed plugins`);\n\n const localSkills = await discoverLocalProjectSkills(projectDir);\n const localSkillCount = Object.keys(localSkills).length;\n verbose(` Found ${localSkillCount} local skills from .claude/skills/`);\n\n const allSkills = mergeSkills(pluginSkills, localSkills);\n const totalSkillCount = Object.keys(allSkills).length;\n\n if (totalSkillCount === 0) {\n s.stop(\"No skills found\");\n p.log.warn(\n \"No skills found. Add skills with 'cc add <skill>' or create in .claude/skills/.\",\n );\n process.exit(EXIT_CODES.ERROR);\n }\n\n if (localSkillCount > 0 && pluginSkillCount > 0) {\n s.stop(\n `Discovered ${totalSkillCount} skills (${pluginSkillCount} from plugins, ${localSkillCount} local)`,\n );\n } else if (localSkillCount > 0) {\n s.stop(`Discovered ${localSkillCount} local skills`);\n } else {\n s.stop(`Discovered ${pluginSkillCount} skills from plugins`);\n }\n\n s.start(\"Resolving marketplace source...\");\n let sourceConfig;\n try {\n sourceConfig = await resolveSource(options.source);\n s.stop(`Source: ${sourceConfig.sourceOrigin}`);\n } catch (error) {\n s.stop(\"Failed to resolve source\");\n p.log.error(error instanceof Error ? error.message : String(error));\n process.exit(EXIT_CODES.ERROR);\n }\n\n s.start(\n options.agentSource\n ? \"Fetching agent partials...\"\n : \"Loading agent partials...\",\n );\n let agentDefs: AgentSourcePaths;\n try {\n agentDefs = await getAgentDefinitions(options.agentSource, {\n forceRefresh: options.refresh,\n });\n s.stop(\n options.agentSource ? \"Agent partials fetched\" : \"Agent partials loaded\",\n );\n verbose(` Agents: ${agentDefs.agentsDir}`);\n verbose(` Templates: ${agentDefs.templatesDir}`);\n } catch (error) {\n s.stop(\"Failed to load agent partials\");\n p.log.error(error instanceof Error ? error.message : String(error));\n process.exit(EXIT_CODES.ERROR);\n }\n\n if (dryRun) {\n console.log(\n pc.yellow(`\\n[dry-run] Would compile ${totalSkillCount} skills`),\n );\n console.log(\n pc.yellow(\n `[dry-run] Would use agent partials from: ${agentDefs.sourcePath}`,\n ),\n );\n console.log(\n pc.yellow(`[dry-run] Would output to: ${getPluginAgentsDir(pluginDir)}`),\n );\n p.outro(pc.green(\"[dry-run] Preview complete - no files were written\"));\n return;\n }\n\n s.start(\"Recompiling agents...\");\n try {\n const recompileResult = await recompileAgents({\n pluginDir,\n sourcePath: agentDefs.sourcePath,\n skills: allSkills,\n });\n\n if (recompileResult.failed.length > 0) {\n s.stop(\n `Recompiled ${recompileResult.compiled.length} agents (${recompileResult.failed.length} failed)`,\n );\n for (const warning of recompileResult.warnings) {\n p.log.warn(warning);\n }\n } else if (recompileResult.compiled.length > 0) {\n s.stop(`Recompiled ${recompileResult.compiled.length} agents`);\n } else {\n s.stop(\"No agents to recompile\");\n }\n\n if (recompileResult.compiled.length > 0) {\n verbose(` Compiled: ${recompileResult.compiled.join(\", \")}`);\n }\n } catch (error) {\n s.stop(\"Failed to recompile agents\");\n p.log.error(error instanceof Error ? error.message : String(error));\n process.exit(EXIT_CODES.ERROR);\n }\n\n p.outro(pc.green(\"Plugin compile complete!\"));\n}\n\nasync function runCustomOutputCompile(\n s: ReturnType<typeof p.spinner>,\n options: {\n source?: string;\n agentSource?: string;\n refresh?: boolean;\n verbose?: boolean;\n output: string;\n },\n dryRun: boolean,\n): Promise<void> {\n const outputDir = path.resolve(process.cwd(), options.output);\n console.log(`\\n${pc.cyan(\"Custom Output Compile\")}\\n`);\n console.log(`Output directory: ${pc.cyan(outputDir)}\\n`);\n\n const projectDir = process.cwd();\n s.start(\"Discovering skills...\");\n\n const pluginSkills = await discoverPluginSkills(projectDir);\n const pluginSkillCount = Object.keys(pluginSkills).length;\n verbose(` Found ${pluginSkillCount} skills from installed plugins`);\n\n const localSkills = await discoverLocalProjectSkills(projectDir);\n const localSkillCount = Object.keys(localSkills).length;\n verbose(` Found ${localSkillCount} local skills from .claude/skills/`);\n\n const allSkills = mergeSkills(pluginSkills, localSkills);\n const totalSkillCount = Object.keys(allSkills).length;\n\n if (totalSkillCount === 0) {\n s.stop(\"No skills found\");\n p.log.warn(\n \"No skills found. Add skills with 'cc add <skill>' or create in .claude/skills/.\",\n );\n process.exit(EXIT_CODES.ERROR);\n }\n\n if (localSkillCount > 0 && pluginSkillCount > 0) {\n s.stop(\n `Discovered ${totalSkillCount} skills (${pluginSkillCount} from plugins, ${localSkillCount} local)`,\n );\n } else if (localSkillCount > 0) {\n s.stop(`Discovered ${localSkillCount} local skills`);\n } else {\n s.stop(`Discovered ${pluginSkillCount} skills from plugins`);\n }\n\n s.start(\"Resolving source...\");\n let sourceConfig;\n try {\n sourceConfig = await resolveSource(options.source);\n s.stop(`Source: ${sourceConfig.sourceOrigin}`);\n } catch (error) {\n s.stop(\"Failed to resolve source\");\n p.log.error(error instanceof Error ? error.message : String(error));\n process.exit(EXIT_CODES.ERROR);\n }\n\n s.start(\n options.agentSource\n ? \"Fetching agent partials...\"\n : \"Loading agent partials...\",\n );\n let agentDefs: AgentSourcePaths;\n try {\n agentDefs = await getAgentDefinitions(options.agentSource, {\n forceRefresh: options.refresh,\n });\n s.stop(\n options.agentSource ? \"Agent partials fetched\" : \"Agent partials loaded\",\n );\n verbose(` Agents: ${agentDefs.agentsDir}`);\n verbose(` Templates: ${agentDefs.templatesDir}`);\n } catch (error) {\n s.stop(\"Failed to load agent partials\");\n p.log.error(error instanceof Error ? error.message : String(error));\n process.exit(EXIT_CODES.ERROR);\n }\n\n if (dryRun) {\n console.log(\n pc.yellow(\n `\\n[dry-run] Would compile agents with ${totalSkillCount} skills`,\n ),\n );\n console.log(\n pc.yellow(\n `[dry-run] Would use agent definitions from: ${agentDefs.sourcePath}`,\n ),\n );\n console.log(pc.yellow(`[dry-run] Would output to: ${outputDir}`));\n p.outro(pc.green(\"[dry-run] Preview complete - no files were written\"));\n return;\n }\n\n const pluginDir = getCollectivePluginDir();\n\n s.start(\"Compiling agents...\");\n try {\n await ensureDir(outputDir);\n\n const recompileResult = await recompileAgents({\n pluginDir,\n sourcePath: agentDefs.sourcePath,\n skills: allSkills,\n outputDir,\n });\n\n if (recompileResult.failed.length > 0) {\n s.stop(\n `Compiled ${recompileResult.compiled.length} agents (${recompileResult.failed.length} failed)`,\n );\n for (const warning of recompileResult.warnings) {\n p.log.warn(warning);\n }\n } else if (recompileResult.compiled.length > 0) {\n s.stop(`Compiled ${recompileResult.compiled.length} agents`);\n } else {\n s.stop(\"No agents to compile\");\n }\n\n if (recompileResult.compiled.length > 0) {\n verbose(` Compiled: ${recompileResult.compiled.join(\", \")}`);\n console.log(`\\n${pc.dim(\"Agents compiled to:\")}`);\n console.log(` ${pc.cyan(outputDir)}`);\n for (const agentName of recompileResult.compiled) {\n console.log(` ${pc.dim(`${agentName}.md`)}`);\n }\n }\n } catch (error) {\n s.stop(\"Failed to compile agents\");\n p.log.error(error instanceof Error ? error.message : String(error));\n process.exit(EXIT_CODES.ERROR);\n }\n\n p.outro(pc.green(\"Custom output compile complete!\"));\n}\n","import pc from \"picocolors\";\n\nlet verboseMode = false;\n\nexport function setVerbose(enabled: boolean): void {\n verboseMode = enabled;\n}\n\nexport function verbose(msg: string): void {\n if (verboseMode) {\n console.log(pc.dim(` ${msg}`));\n }\n}\n","import path from \"path\";\nimport os from \"os\";\nimport { fileExists, readFile, glob } from \"../utils/fs\";\nimport { verbose } from \"../utils/logger\";\nimport {\n CLAUDE_DIR,\n PLUGINS_SUBDIR,\n PLUGIN_MANIFEST_DIR,\n PLUGIN_MANIFEST_FILE,\n} from \"../consts\";\nimport type { PluginManifest } from \"../../types\";\nimport type { MergedSkillsMatrix } from \"../types-matrix\";\n\nexport function getUserPluginsDir(): string {\n return path.join(os.homedir(), CLAUDE_DIR, PLUGINS_SUBDIR);\n}\n\nexport function getCollectivePluginDir(projectDir?: string): string {\n const dir = projectDir ?? process.cwd();\n return path.join(dir, CLAUDE_DIR, PLUGINS_SUBDIR, \"claude-collective\");\n}\n\nexport function getProjectPluginsDir(projectDir?: string): string {\n const dir = projectDir ?? process.cwd();\n return path.join(dir, CLAUDE_DIR, PLUGINS_SUBDIR);\n}\n\nexport function getPluginSkillsDir(pluginDir: string): string {\n return path.join(pluginDir, \"skills\");\n}\n\nexport function getPluginAgentsDir(pluginDir: string): string {\n return path.join(pluginDir, \"agents\");\n}\n\nexport function getPluginManifestPath(pluginDir: string): string {\n return path.join(pluginDir, PLUGIN_MANIFEST_DIR, PLUGIN_MANIFEST_FILE);\n}\n\nexport async function readPluginManifest(\n pluginDir: string,\n): Promise<PluginManifest | null> {\n const manifestPath = getPluginManifestPath(pluginDir);\n\n if (!(await fileExists(manifestPath))) {\n verbose(` No manifest at ${manifestPath}`);\n return null;\n }\n\n try {\n const content = await readFile(manifestPath);\n const manifest = JSON.parse(content) as PluginManifest;\n\n if (!manifest.name || typeof manifest.name !== \"string\") {\n verbose(` Invalid manifest at ${manifestPath}: missing name`);\n return null;\n }\n\n return manifest;\n } catch (error) {\n verbose(` Failed to parse manifest at ${manifestPath}: ${error}`);\n return null;\n }\n}\n\nexport async function getPluginSkillIds(\n pluginSkillsDir: string,\n matrix: MergedSkillsMatrix,\n): Promise<string[]> {\n const skillFiles = await glob(\"**/SKILL.md\", pluginSkillsDir);\n const skillIds: string[] = [];\n\n const nameToId = new Map<string, string>();\n for (const [id, skill] of Object.entries(matrix.skills)) {\n nameToId.set(skill.name.toLowerCase(), id);\n if (skill.alias) {\n nameToId.set(skill.alias.toLowerCase(), id);\n }\n }\n\n const dirToId = new Map<string, string>();\n for (const [id, skill] of Object.entries(matrix.skills)) {\n const baseName = skill.name.toLowerCase().replace(/\\s+/g, \"-\");\n dirToId.set(baseName, id);\n\n const idParts = id.split(\"/\");\n const lastPart = idParts[idParts.length - 1];\n if (lastPart) {\n dirToId.set(lastPart.toLowerCase(), id);\n }\n }\n\n for (const skillFile of skillFiles) {\n const fullPath = path.join(pluginSkillsDir, skillFile);\n const content = await readFile(fullPath);\n\n const frontmatterMatch = content.match(/^---\\n([\\s\\S]*?)\\n---/);\n if (frontmatterMatch) {\n const frontmatter = frontmatterMatch[1];\n const nameMatch = frontmatter.match(/^name:\\s*[\"']?(.+?)[\"']?\\s*$/m);\n if (nameMatch) {\n const skillName = nameMatch[1].trim();\n const skillId = nameToId.get(skillName.toLowerCase());\n if (skillId) {\n skillIds.push(skillId);\n continue;\n }\n }\n }\n\n const dirPath = path.dirname(skillFile);\n const dirName = path.basename(dirPath);\n const skillId = dirToId.get(dirName.toLowerCase());\n if (skillId) {\n skillIds.push(skillId);\n }\n }\n\n return skillIds;\n}\n","import fs from \"fs-extra\";\nimport fg from \"fast-glob\";\nimport path from \"path\";\n\nexport async function readFile(filePath: string): Promise<string> {\n return fs.readFile(filePath, \"utf-8\");\n}\n\nexport async function readFileOptional(\n filePath: string,\n fallback = \"\",\n): Promise<string> {\n try {\n return await fs.readFile(filePath, \"utf-8\");\n } catch {\n return fallback;\n }\n}\n\nexport async function fileExists(filePath: string): Promise<boolean> {\n return fs.pathExists(filePath);\n}\n\nexport async function directoryExists(dirPath: string): Promise<boolean> {\n try {\n const stat = await fs.stat(dirPath);\n return stat.isDirectory();\n } catch {\n return false;\n }\n}\n\nexport async function listDirectories(dirPath: string): Promise<string[]> {\n try {\n const entries = await fs.readdir(dirPath, { withFileTypes: true });\n return entries.filter((e) => e.isDirectory()).map((e) => e.name);\n } catch {\n return [];\n }\n}\n\nexport async function glob(pattern: string, cwd: string): Promise<string[]> {\n return fg(pattern, { cwd, onlyFiles: true });\n}\n\nexport async function writeFile(\n filePath: string,\n content: string,\n): Promise<void> {\n await fs.ensureDir(path.dirname(filePath));\n await fs.writeFile(filePath, content, \"utf-8\");\n}\n\nexport async function ensureDir(dirPath: string): Promise<void> {\n await fs.ensureDir(dirPath);\n}\n\nexport async function remove(filePath: string): Promise<void> {\n await fs.remove(filePath);\n}\n\nexport async function copy(src: string, dest: string): Promise<void> {\n await fs.copy(src, dest);\n}\n","import path from \"path\";\nimport os from \"os\";\nimport { fileURLToPath } from \"url\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\nexport const CLI_ROOT = path.resolve(__dirname, \"..\");\nexport const PROJECT_ROOT = path.resolve(__dirname, \"../..\");\n\nexport const OUTPUT_DIR = \".claude\";\nexport const GITHUB_REPO = \"claude-collective/claude-collective\";\nexport const DEFAULT_MATRIX_PATH = \"src/config/skills-matrix.yaml\";\n\nexport const PLUGIN_NAME = \"claude-collective\";\n\nexport const CLAUDE_DIR = \".claude\";\nexport const PLUGINS_SUBDIR = \"plugins\";\nexport const PLUGIN_MANIFEST_DIR = \".claude-plugin\";\nexport const PLUGIN_MANIFEST_FILE = \"plugin.json\";\n\nexport const CACHE_DIR = path.join(os.homedir(), \".cache\", \"claude-collective\");\n\nexport const SKILLS_MATRIX_PATH = \"config/skills-matrix.yaml\";\nexport const SKILLS_DIR_PATH = \"src/skills\";\nexport const LOCAL_SKILLS_PATH = \".claude/skills\";\n\nexport const DIRS = {\n agents: \"src/agents\",\n skills: \"src/skills\",\n stacks: \"src/stacks\",\n templates: \"src/agents/_templates\",\n commands: \"src/commands\",\n} as const;\n\nexport const DEFAULT_VERSION = \"1.0.0\";\n\n/** Uses \"0.0.0\" to clearly indicate \"no version was explicitly set\" */\nexport const DEFAULT_DISPLAY_VERSION = \"0.0.0\";\n","import path from \"path\";\nimport { directoryExists } from \"../utils/fs\";\nimport { verbose } from \"../utils/logger\";\nimport { PROJECT_ROOT, DIRS } from \"../consts\";\nimport { fetchFromSource, type FetchOptions } from \"./source-fetcher\";\nimport type { AgentSourcePaths } from \"../../types\";\n\nexport async function getAgentDefinitions(\n remoteSource?: string,\n options: FetchOptions = {},\n): Promise<AgentSourcePaths> {\n if (remoteSource) {\n return fetchAgentDefinitionsFromRemote(remoteSource, options);\n }\n return getLocalAgentDefinitions();\n}\n\nexport async function getLocalAgentDefinitions(): Promise<AgentSourcePaths> {\n const agentsDir = path.join(PROJECT_ROOT, DIRS.agents);\n const templatesDir = path.join(PROJECT_ROOT, DIRS.templates);\n\n if (!(await directoryExists(agentsDir))) {\n throw new Error(\n `Agent partials not found at: ${agentsDir}. ` +\n `Ensure the CLI is properly installed.`,\n );\n }\n\n if (!(await directoryExists(templatesDir))) {\n verbose(`Templates directory not found: ${templatesDir}`);\n }\n\n verbose(`Agent partials loaded from CLI: ${agentsDir}`);\n\n return {\n agentsDir,\n templatesDir,\n sourcePath: PROJECT_ROOT,\n };\n}\n\nexport async function fetchAgentDefinitionsFromRemote(\n source: string,\n options: FetchOptions = {},\n): Promise<AgentSourcePaths> {\n verbose(`Fetching agent partials from remote: ${source}`);\n\n const result = await fetchFromSource(source, {\n forceRefresh: options.forceRefresh,\n subdir: \"\",\n });\n\n const agentsDir = path.join(result.path, \"src\", \"agents\");\n const templatesDir = path.join(agentsDir, \"_templates\");\n\n if (!(await directoryExists(agentsDir))) {\n throw new Error(`Agent partials not found at: ${agentsDir}`);\n }\n\n if (!(await directoryExists(templatesDir))) {\n verbose(`Templates directory not found: ${templatesDir}`);\n }\n\n verbose(`Agent partials fetched from: ${result.path}`);\n\n return {\n agentsDir,\n templatesDir,\n sourcePath: result.path,\n };\n}\n","import path from \"path\";\nimport { downloadTemplate } from \"giget\";\nimport { verbose } from \"../utils/logger\";\nimport { CACHE_DIR } from \"../consts\";\nimport { ensureDir, directoryExists, readFile } from \"../utils/fs\";\nimport { isLocalSource } from \"./config\";\nimport type { Marketplace, MarketplaceFetchResult } from \"../../types\";\n\nexport interface FetchOptions {\n forceRefresh?: boolean;\n subdir?: string;\n}\n\nexport interface FetchResult {\n path: string;\n fromCache: boolean;\n source: string;\n}\n\nexport function sanitizeSourceForCache(source: string): string {\n return source\n .replace(/:/g, \"-\")\n .replace(/[\\/]/g, \"-\")\n .replace(/--+/g, \"-\")\n .replace(/^-|-$/g, \"\");\n}\n\nfunction getCacheDir(source: string): string {\n const sanitized = sanitizeSourceForCache(source);\n return path.join(CACHE_DIR, \"sources\", sanitized);\n}\n\nexport async function fetchFromSource(\n source: string,\n options: FetchOptions = {},\n): Promise<FetchResult> {\n const { forceRefresh = false, subdir } = options;\n\n if (isLocalSource(source)) {\n return fetchFromLocalSource(source, subdir);\n }\n\n return fetchFromRemoteSource(source, { forceRefresh, subdir });\n}\n\nasync function fetchFromLocalSource(\n source: string,\n subdir?: string,\n): Promise<FetchResult> {\n const fullPath = subdir ? path.join(source, subdir) : source;\n const absolutePath = path.isAbsolute(fullPath)\n ? fullPath\n : path.resolve(process.cwd(), fullPath);\n\n if (!(await directoryExists(absolutePath))) {\n throw new Error(`Local source not found: ${absolutePath}`);\n }\n\n verbose(`Using local source: ${absolutePath}`);\n\n return {\n path: absolutePath,\n fromCache: false,\n source,\n };\n}\n\nasync function fetchFromRemoteSource(\n source: string,\n options: FetchOptions,\n): Promise<FetchResult> {\n const { forceRefresh = false, subdir } = options;\n const cacheDir = getCacheDir(source);\n\n const fullSource = subdir ? `${source}/${subdir}` : source;\n\n verbose(`Fetching from remote: ${fullSource}`);\n verbose(`Cache directory: ${cacheDir}`);\n\n await ensureDir(path.dirname(cacheDir));\n\n try {\n const result = await downloadTemplate(fullSource, {\n dir: cacheDir,\n force: forceRefresh,\n offline: false,\n preferOffline: !forceRefresh,\n });\n\n verbose(`Downloaded to: ${result.dir}`);\n\n return {\n path: result.dir,\n fromCache: false,\n source: fullSource,\n };\n } catch (error) {\n throw wrapGigetError(error, source);\n }\n}\n\nfunction wrapGigetError(error: unknown, source: string): Error {\n const message = error instanceof Error ? error.message : String(error);\n\n if (message.includes(\"404\") || message.includes(\"Not Found\")) {\n return new Error(\n `Repository not found: ${source}\\n\\n` +\n `This could mean:\\n` +\n ` - The repository doesn't exist\\n` +\n ` - The repository is private and you need to set authentication\\n` +\n ` - There's a typo in the URL\\n\\n` +\n `For private repositories, set the GIGET_AUTH environment variable:\\n` +\n ` export GIGET_AUTH=ghp_your_github_token`,\n );\n }\n\n if (message.includes(\"401\") || message.includes(\"Unauthorized\")) {\n return new Error(\n `Authentication required for: ${source}\\n\\n` +\n `Set the GIGET_AUTH environment variable with a GitHub token:\\n` +\n ` export GIGET_AUTH=ghp_your_github_token\\n\\n` +\n `Create a token at: https://github.com/settings/tokens\\n` +\n `Required scope: repo (for private repos) or public_repo (for public)`,\n );\n }\n\n if (message.includes(\"403\") || message.includes(\"Forbidden\")) {\n return new Error(\n `Access denied to: ${source}\\n\\n` +\n `Your token may not have sufficient permissions.\\n` +\n `Ensure your GIGET_AUTH token has the 'repo' scope for private repositories.`,\n );\n }\n\n if (\n message.includes(\"ENOTFOUND\") ||\n message.includes(\"ETIMEDOUT\") ||\n message.includes(\"network\")\n ) {\n return new Error(\n `Network error fetching: ${source}\\n\\n` +\n `Please check your internet connection.\\n` +\n `If you're behind a corporate proxy, you may need to set:\\n` +\n ` export HTTPS_PROXY=http://your-proxy:port\\n` +\n ` export FORCE_NODE_FETCH=true # Required for Node 20+`,\n );\n }\n\n return new Error(`Failed to fetch ${source}: ${message}`);\n}\n\nexport async function fetchMarketplace(\n source: string,\n options: FetchOptions = {},\n): Promise<MarketplaceFetchResult> {\n const result = await fetchFromSource(source, {\n forceRefresh: options.forceRefresh,\n subdir: \"\", // Root of repo\n });\n\n const marketplacePath = path.join(\n result.path,\n \".claude-plugin\",\n \"marketplace.json\",\n );\n\n if (!(await directoryExists(path.dirname(marketplacePath)))) {\n throw new Error(\n `Marketplace not found at: ${marketplacePath}\\n\\n` +\n `Expected .claude-plugin/marketplace.json in the source repository.`,\n );\n }\n\n const content = await readFile(marketplacePath);\n const marketplace = JSON.parse(content) as Marketplace;\n\n verbose(`Loaded marketplace: ${marketplace.name} v${marketplace.version}`);\n\n return {\n marketplace,\n sourcePath: result.path,\n fromCache: result.fromCache ?? false,\n cacheKey: sanitizeSourceForCache(source),\n };\n}\n","import path from \"path\";\nimport os from \"os\";\nimport { parse as parseYaml, stringify as stringifyYaml } from \"yaml\";\nimport { readFile, writeFile, fileExists, ensureDir } from \"../utils/fs\";\nimport { verbose } from \"../utils/logger\";\n\nconst PROJECT_CONFIG_DIR = \".claude-collective\";\n\nexport const DEFAULT_SOURCE = \"github:claude-collective/skills\";\nexport const SOURCE_ENV_VAR = \"CC_SOURCE\";\nexport const GLOBAL_CONFIG_DIR = path.join(os.homedir(), \".claude-collective\");\nexport const GLOBAL_CONFIG_FILE = \"config.yaml\";\nexport const PROJECT_CONFIG_FILE = \"config.yaml\";\n\nexport interface GlobalConfig {\n source?: string;\n author?: string;\n}\n\nexport interface ProjectConfig {\n source?: string;\n}\n\nexport interface ResolvedConfig {\n source: string;\n sourceOrigin: \"flag\" | \"env\" | \"project\" | \"global\" | \"default\";\n}\n\nfunction isValidGlobalConfig(obj: unknown): obj is GlobalConfig {\n if (typeof obj !== \"object\" || obj === null) return false;\n const config = obj as Record<string, unknown>;\n if (config.source !== undefined && typeof config.source !== \"string\")\n return false;\n if (config.author !== undefined && typeof config.author !== \"string\")\n return false;\n return true;\n}\n\nfunction isValidProjectConfig(obj: unknown): obj is ProjectConfig {\n if (typeof obj !== \"object\" || obj === null) return false;\n const config = obj as Record<string, unknown>;\n if (config.source !== undefined && typeof config.source !== \"string\")\n return false;\n return true;\n}\n\nexport function getGlobalConfigPath(): string {\n return path.join(GLOBAL_CONFIG_DIR, GLOBAL_CONFIG_FILE);\n}\n\nexport function getProjectConfigPath(projectDir: string): string {\n return path.join(projectDir, PROJECT_CONFIG_DIR, PROJECT_CONFIG_FILE);\n}\n\nexport async function loadGlobalConfig(): Promise<GlobalConfig | null> {\n const configPath = getGlobalConfigPath();\n\n if (!(await fileExists(configPath))) {\n verbose(`Global config not found at ${configPath}`);\n return null;\n }\n\n try {\n const content = await readFile(configPath);\n const parsed = parseYaml(content);\n if (!isValidGlobalConfig(parsed)) {\n verbose(`Invalid global config structure at ${configPath}`);\n return null;\n }\n verbose(`Loaded global config from ${configPath}`);\n return parsed;\n } catch (error) {\n verbose(`Failed to parse global config: ${error}`);\n return null;\n }\n}\n\nexport async function loadProjectConfig(\n projectDir: string,\n): Promise<ProjectConfig | null> {\n const configPath = getProjectConfigPath(projectDir);\n\n if (!(await fileExists(configPath))) {\n verbose(`Project config not found at ${configPath}`);\n return null;\n }\n\n try {\n const content = await readFile(configPath);\n const parsed = parseYaml(content);\n if (!isValidProjectConfig(parsed)) {\n verbose(`Invalid project config structure at ${configPath}`);\n return null;\n }\n verbose(`Loaded project config from ${configPath}`);\n return parsed;\n } catch (error) {\n verbose(`Failed to parse project config: ${error}`);\n return null;\n }\n}\n\nexport async function saveGlobalConfig(config: GlobalConfig): Promise<void> {\n const configPath = getGlobalConfigPath();\n await ensureDir(GLOBAL_CONFIG_DIR);\n const content = stringifyYaml(config, { lineWidth: 0 });\n await writeFile(configPath, content);\n verbose(`Saved global config to ${configPath}`);\n}\n\nexport async function saveProjectConfig(\n projectDir: string,\n config: ProjectConfig,\n): Promise<void> {\n const configPath = getProjectConfigPath(projectDir);\n await ensureDir(path.join(projectDir, PROJECT_CONFIG_DIR));\n const content = stringifyYaml(config, { lineWidth: 0 });\n await writeFile(configPath, content);\n verbose(`Saved project config to ${configPath}`);\n}\n\n/** Resolve source with precedence: flag > env > project > global > default */\nexport async function resolveSource(\n flagValue?: string,\n projectDir?: string,\n): Promise<ResolvedConfig> {\n if (flagValue !== undefined) {\n if (flagValue === \"\" || flagValue.trim() === \"\") {\n throw new Error(\"--source flag cannot be empty\");\n }\n verbose(`Source from --source flag: ${flagValue}`);\n return { source: flagValue, sourceOrigin: \"flag\" };\n }\n\n const envValue = process.env[SOURCE_ENV_VAR];\n if (envValue) {\n verbose(`Source from ${SOURCE_ENV_VAR} env var: ${envValue}`);\n return { source: envValue, sourceOrigin: \"env\" };\n }\n\n if (projectDir) {\n const projectConfig = await loadProjectConfig(projectDir);\n if (projectConfig?.source) {\n verbose(`Source from project config: ${projectConfig.source}`);\n return { source: projectConfig.source, sourceOrigin: \"project\" };\n }\n }\n\n const globalConfig = await loadGlobalConfig();\n if (globalConfig?.source) {\n verbose(`Source from global config: ${globalConfig.source}`);\n return { source: globalConfig.source, sourceOrigin: \"global\" };\n }\n\n verbose(`Using default source: ${DEFAULT_SOURCE}`);\n return { source: DEFAULT_SOURCE, sourceOrigin: \"default\" };\n}\n\nexport function formatSourceOrigin(\n origin: ResolvedConfig[\"sourceOrigin\"],\n): string {\n switch (origin) {\n case \"flag\":\n return \"--source flag\";\n case \"env\":\n return `${SOURCE_ENV_VAR} environment variable`;\n case \"project\":\n return \"project config (.claude-collective/config.yaml)\";\n case \"global\":\n return \"global config (~/.claude-collective/config.yaml)\";\n case \"default\":\n return \"default\";\n }\n}\n\nexport function isLocalSource(source: string): boolean {\n if (source.startsWith(\"/\") || source.startsWith(\".\")) {\n return true;\n }\n\n const remoteProtocols = [\n \"github:\",\n \"gh:\",\n \"gitlab:\",\n \"bitbucket:\",\n \"sourcehut:\",\n \"https://\",\n \"http://\",\n ];\n\n const hasRemoteProtocol = remoteProtocols.some((prefix) =>\n source.startsWith(prefix),\n );\n\n if (!hasRemoteProtocol) {\n if (source.includes(\"..\") || source.includes(\"~\")) {\n throw new Error(\n `Invalid source path: ${source}. Path traversal patterns are not allowed.`,\n );\n }\n }\n\n return !hasRemoteProtocol;\n}\n","import path from \"path\";\nimport { glob, writeFile, ensureDir, readFile, fileExists } from \"../utils/fs\";\nimport { verbose } from \"../utils/logger\";\nimport { loadAllAgents, loadPluginSkills } from \"./loader\";\nimport { resolveAgents, resolveStackSkills } from \"./resolver\";\nimport { compileAgentForPlugin } from \"./stack-plugin-compiler\";\nimport { getPluginAgentsDir } from \"./plugin-finder\";\nimport { createLiquidEngine } from \"./compiler\";\nimport { parse as parseYaml } from \"yaml\";\nimport type {\n CompileConfig,\n CompileAgentConfig,\n StackConfig,\n SkillReference,\n SkillDefinition,\n} from \"../../types\";\n\nexport interface RecompileAgentsOptions {\n pluginDir: string;\n sourcePath: string;\n agents?: string[];\n skills?: Record<string, SkillDefinition>;\n projectDir?: string;\n outputDir?: string;\n}\n\nexport interface RecompileAgentsResult {\n compiled: string[];\n failed: string[];\n warnings: string[];\n}\n\nasync function getExistingAgentNames(pluginDir: string): Promise<string[]> {\n const agentsDir = getPluginAgentsDir(pluginDir);\n const files = await glob(\"*.md\", agentsDir);\n return files.map((f) => path.basename(f, \".md\"));\n}\n\nasync function loadPluginConfig(\n pluginDir: string,\n): Promise<StackConfig | null> {\n const configPath = path.join(pluginDir, \"config.yaml\");\n if (!(await fileExists(configPath))) {\n verbose(`No config.yaml found at ${configPath}`);\n return null;\n }\n\n try {\n const content = await readFile(configPath);\n const config = parseYaml(content) as StackConfig;\n verbose(`Loaded config.yaml from ${configPath}`);\n return config;\n } catch (error) {\n verbose(`Failed to parse config.yaml: ${error}`);\n return null;\n }\n}\n\nexport async function recompileAgents(\n options: RecompileAgentsOptions,\n): Promise<RecompileAgentsResult> {\n const {\n pluginDir,\n sourcePath,\n agents: specifiedAgents,\n skills: providedSkills,\n projectDir,\n outputDir,\n } = options;\n\n const result: RecompileAgentsResult = {\n compiled: [],\n failed: [],\n warnings: [],\n };\n\n const pluginConfig = await loadPluginConfig(pluginDir);\n const allAgents = await loadAllAgents(sourcePath);\n\n let agentNames: string[];\n if (specifiedAgents) {\n agentNames = specifiedAgents;\n } else if (pluginConfig?.agents) {\n agentNames = pluginConfig.agents;\n verbose(`Using agents from config.yaml: ${agentNames.join(\", \")}`);\n } else if (outputDir) {\n agentNames = Object.keys(allAgents);\n verbose(`Using all available agents from source: ${agentNames.join(\", \")}`);\n } else {\n agentNames = await getExistingAgentNames(pluginDir);\n }\n\n if (agentNames.length === 0) {\n result.warnings.push(\"No agents found to recompile\");\n return result;\n }\n\n verbose(\n `Recompiling ${agentNames.length} agents in ${outputDir ?? pluginDir}`,\n );\n\n const pluginSkills = providedSkills ?? (await loadPluginSkills(pluginDir));\n\n const compileAgents: Record<string, CompileAgentConfig> = {};\n for (const agentName of agentNames) {\n if (allAgents[agentName]) {\n if (pluginConfig?.agent_skills?.[agentName]) {\n const skillRefs = resolveStackSkills(\n pluginConfig,\n agentName,\n pluginSkills,\n );\n compileAgents[agentName] = { skills: skillRefs };\n verbose(` Agent ${agentName}: ${skillRefs.length} skills from config`);\n } else if (pluginConfig?.skills) {\n // Fall back to all skills in the config\n const skillRefs: SkillReference[] = pluginConfig.skills.map((s) => ({\n id: s.id,\n usage: `when working with ${s.id.split(\" \")[0]}`,\n preloaded: s.preloaded ?? false,\n }));\n compileAgents[agentName] = { skills: skillRefs };\n verbose(` Agent ${agentName}: ${skillRefs.length} skills (all)`);\n } else {\n compileAgents[agentName] = {};\n }\n } else {\n result.warnings.push(\n `Agent \"${agentName}\" not found in source definitions`,\n );\n }\n }\n\n const compileConfig: CompileConfig = {\n name: pluginConfig?.name || path.basename(pluginDir),\n description: pluginConfig?.description || \"Recompiled plugin\",\n claude_md: \"\",\n agents: compileAgents,\n };\n\n const engine = await createLiquidEngine(projectDir);\n const resolvedAgents = await resolveAgents(\n allAgents,\n pluginSkills,\n compileConfig,\n sourcePath,\n );\n\n const agentsDir = outputDir ?? getPluginAgentsDir(pluginDir);\n await ensureDir(agentsDir);\n\n for (const [name, agent] of Object.entries(resolvedAgents)) {\n try {\n const output = await compileAgentForPlugin(\n name,\n agent,\n sourcePath,\n engine,\n );\n await writeFile(path.join(agentsDir, `${name}.md`), output);\n result.compiled.push(name);\n verbose(` Recompiled: ${name}`);\n } catch (error) {\n result.failed.push(name);\n result.warnings.push(\n `Failed to compile ${name}: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n\n return result;\n}\n","import { parse as parseYaml } from \"yaml\";\nimport path from \"path\";\nimport { glob, readFile, directoryExists } from \"../utils/fs\";\nimport { verbose } from \"../utils/logger\";\nimport { DIRS } from \"../consts\";\nimport type {\n AgentDefinition,\n AgentYamlConfig,\n SkillDefinition,\n SkillFrontmatter,\n StackConfig,\n} from \"../types\";\n\nexport type CompileMode = \"dev\";\n\nexport function getDirs(_mode: CompileMode) {\n return DIRS;\n}\n\nconst FRONTMATTER_REGEX = /^---\\n([\\s\\S]*?)\\n---/;\n\nexport function parseFrontmatter(content: string): SkillFrontmatter | null {\n const match = content.match(FRONTMATTER_REGEX);\n if (!match) return null;\n\n const yamlContent = match[1];\n const frontmatter = parseYaml(yamlContent) as SkillFrontmatter;\n\n if (!frontmatter.name || !frontmatter.description) return null;\n return frontmatter;\n}\n\nfunction extractDisplayName(skillId: string): string {\n const withoutCategory = skillId.split(\"/\").pop() || skillId;\n const withoutAuthor = withoutCategory.replace(/\\s*\\(@\\w+\\)$/, \"\").trim();\n return withoutAuthor\n .split(\"-\")\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(\" \");\n}\n\nexport async function loadAllAgents(\n projectRoot: string,\n): Promise<Record<string, AgentDefinition>> {\n const agents: Record<string, AgentDefinition> = {};\n const agentSourcesDir = path.join(projectRoot, DIRS.agents);\n\n const files = await glob(\"**/agent.yaml\", agentSourcesDir);\n\n for (const file of files) {\n const fullPath = path.join(agentSourcesDir, file);\n const content = await readFile(fullPath);\n const config = parseYaml(content) as AgentYamlConfig;\n const agentPath = path.dirname(file);\n\n agents[config.id] = {\n title: config.title,\n description: config.description,\n model: config.model,\n tools: config.tools,\n path: agentPath,\n };\n\n verbose(`Loaded agent: ${config.id} from ${file}`);\n }\n\n return agents;\n}\n\n/** @deprecated Use loadSkillsByIds instead - stacks no longer embed skills */\nexport async function loadStackSkills(\n stackId: string,\n projectRoot: string,\n _mode: CompileMode = \"dev\",\n): Promise<Record<string, SkillDefinition>> {\n const skills: Record<string, SkillDefinition> = {};\n const stackSkillsDir = path.join(projectRoot, DIRS.stacks, stackId, \"skills\");\n\n if (!(await directoryExists(stackSkillsDir))) {\n verbose(`No embedded skills directory for stack ${stackId}`);\n return skills;\n }\n\n const files = await glob(\"**/SKILL.md\", stackSkillsDir);\n\n for (const file of files) {\n const fullPath = path.join(stackSkillsDir, file);\n const content = await readFile(fullPath);\n\n const frontmatter = parseFrontmatter(content);\n if (!frontmatter) {\n console.warn(\n ` Warning: Skipping ${file}: Missing or invalid frontmatter`,\n );\n continue;\n }\n\n const folderPath = file.replace(\"/SKILL.md\", \"\");\n const skillPath = `src/stacks/${stackId}/skills/${folderPath}/`;\n const skillId = frontmatter.name;\n\n skills[skillId] = {\n path: skillPath,\n name: extractDisplayName(frontmatter.name),\n description: frontmatter.description,\n canonicalId: skillId,\n };\n\n verbose(`Loaded stack skill: ${skillId} from ${file}`);\n }\n\n return skills;\n}\n\nasync function buildIdToDirectoryPathMap(\n skillsDir: string,\n): Promise<Record<string, string>> {\n const map: Record<string, string> = {};\n const files = await glob(\"**/SKILL.md\", skillsDir);\n\n for (const file of files) {\n const fullPath = path.join(skillsDir, file);\n const content = await readFile(fullPath);\n const frontmatter = parseFrontmatter(content);\n\n if (frontmatter?.name) {\n const directoryPath = file.replace(\"/SKILL.md\", \"\");\n map[frontmatter.name] = directoryPath;\n map[directoryPath] = directoryPath;\n }\n }\n\n return map;\n}\n\nexport async function loadSkillsByIds(\n skillIds: Array<{ id: string }>,\n projectRoot: string,\n): Promise<Record<string, SkillDefinition>> {\n const skills: Record<string, SkillDefinition> = {};\n const skillsDir = path.join(projectRoot, DIRS.skills);\n\n const idToDirectoryPath = await buildIdToDirectoryPathMap(skillsDir);\n const allSkillIds = Object.keys(idToDirectoryPath);\n const expandedSkillIds: string[] = [];\n\n for (const { id: skillId } of skillIds) {\n if (idToDirectoryPath[skillId]) {\n expandedSkillIds.push(skillId);\n } else {\n const childSkills = allSkillIds.filter((id) => {\n const dirPath = idToDirectoryPath[id];\n return dirPath.startsWith(skillId + \"/\");\n });\n\n if (childSkills.length > 0) {\n expandedSkillIds.push(...childSkills);\n verbose(\n `Expanded directory '${skillId}' to ${childSkills.length} skills`,\n );\n } else {\n console.warn(` Warning: Unknown skill reference '${skillId}'`);\n }\n }\n }\n\n const uniqueSkillIds = [...new Set(expandedSkillIds)];\n\n for (const skillId of uniqueSkillIds) {\n const directoryPath = idToDirectoryPath[skillId];\n if (!directoryPath) {\n console.warn(\n ` Warning: Could not find skill ${skillId}: No matching skill found`,\n );\n continue;\n }\n\n const skillPath = path.join(skillsDir, directoryPath);\n const skillMdPath = path.join(skillPath, \"SKILL.md\");\n\n try {\n const content = await readFile(skillMdPath);\n const frontmatter = parseFrontmatter(content);\n\n if (!frontmatter) {\n console.warn(\n ` Warning: Skipping ${skillId}: Missing or invalid frontmatter`,\n );\n continue;\n }\n\n const canonicalId = frontmatter.name;\n const skillDef: SkillDefinition = {\n path: `${DIRS.skills}/${directoryPath}/`,\n name: extractDisplayName(frontmatter.name),\n description: frontmatter.description,\n canonicalId,\n };\n\n skills[canonicalId] = skillDef;\n\n if (directoryPath !== canonicalId) {\n skills[directoryPath] = skillDef;\n }\n\n verbose(`Loaded skill: ${canonicalId} (from ${directoryPath})`);\n } catch (error) {\n console.warn(` Warning: Could not load skill ${skillId}: ${error}`);\n }\n }\n\n return skills;\n}\n\nexport async function loadPluginSkills(\n pluginDir: string,\n): Promise<Record<string, SkillDefinition>> {\n const skills: Record<string, SkillDefinition> = {};\n const pluginSkillsDir = path.join(pluginDir, \"skills\");\n\n if (!(await directoryExists(pluginSkillsDir))) {\n return skills;\n }\n\n const files = await glob(\"**/SKILL.md\", pluginSkillsDir);\n\n for (const file of files) {\n const fullPath = path.join(pluginSkillsDir, file);\n const content = await readFile(fullPath);\n\n const frontmatter = parseFrontmatter(content);\n if (!frontmatter) {\n console.warn(\n ` Warning: Skipping ${file}: Missing or invalid frontmatter`,\n );\n continue;\n }\n\n const folderPath = file.replace(\"/SKILL.md\", \"\");\n const skillPath = `skills/${folderPath}/`;\n const skillId = frontmatter.name;\n\n skills[skillId] = {\n path: skillPath,\n name: extractDisplayName(frontmatter.name),\n description: frontmatter.description,\n canonicalId: skillId,\n };\n\n verbose(`Loaded plugin skill: ${skillId} from ${file}`);\n }\n\n return skills;\n}\n\nconst stackCache = new Map<string, StackConfig>();\n\nexport async function loadStack(\n stackId: string,\n projectRoot: string,\n mode: CompileMode = \"dev\",\n): Promise<StackConfig> {\n const cacheKey = `${mode}:${stackId}`;\n const cached = stackCache.get(cacheKey);\n if (cached) return cached;\n\n const dirs = getDirs(mode);\n const stackPath = path.join(projectRoot, dirs.stacks, stackId, \"config.yaml\");\n\n try {\n const content = await readFile(stackPath);\n const stack = parseYaml(content) as StackConfig;\n stackCache.set(cacheKey, stack);\n verbose(`Loaded stack: ${stack.name} (${stackId})`);\n return stack;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n throw new Error(\n `Failed to load stack '${stackId}': ${errorMessage}. Expected config at: ${stackPath}`,\n );\n }\n}\n","import path from \"path\";\nimport { fileExists } from \"../utils/fs\";\nimport { DIRS } from \"../consts\";\nimport { loadStack, getDirs, type CompileMode } from \"./loader\";\nimport type {\n AgentConfig,\n AgentDefinition,\n CompileAgentConfig,\n CompileConfig,\n Skill,\n SkillAssignment,\n SkillDefinition,\n SkillReference,\n StackConfig,\n} from \"../types\";\n\nexport async function resolveTemplate(\n projectRoot: string,\n stackId: string,\n mode: CompileMode = \"dev\",\n): Promise<string> {\n const dirs = getDirs(mode);\n const stackTemplate = path.join(\n projectRoot,\n dirs.stacks,\n stackId,\n \"agent.liquid\",\n );\n if (await fileExists(stackTemplate)) return stackTemplate;\n\n return path.join(projectRoot, dirs.templates, \"agent.liquid\");\n}\n\nexport async function resolveClaudeMd(\n projectRoot: string,\n stackId: string,\n mode: CompileMode = \"dev\",\n): Promise<string> {\n const dirs = getDirs(mode);\n const stackClaude = path.join(projectRoot, dirs.stacks, stackId, \"CLAUDE.md\");\n if (await fileExists(stackClaude)) return stackClaude;\n\n throw new Error(\n `Stack '${stackId}' is missing required CLAUDE.md file. Expected at: ${stackClaude}`,\n );\n}\n\nexport function resolveSkillReference(\n ref: SkillReference,\n skills: Record<string, SkillDefinition>,\n): Skill {\n const definition = skills[ref.id];\n if (!definition) {\n const availableSkills = Object.keys(skills);\n const skillList =\n availableSkills.length > 0\n ? `Available skills: ${availableSkills.slice(0, 5).join(\", \")}${availableSkills.length > 5 ? ` (and ${availableSkills.length - 5} more)` : \"\"}`\n : \"No skills found in scanned directories\";\n throw new Error(\n `Skill '${ref.id}' not found in scanned skills. ${skillList}`,\n );\n }\n return {\n id: ref.id,\n path: definition.path,\n name: definition.name,\n description: definition.description,\n usage: ref.usage,\n preloaded: ref.preloaded ?? false,\n };\n}\n\nexport function resolveSkillReferences(\n skillRefs: SkillReference[],\n skills: Record<string, SkillDefinition>,\n): Skill[] {\n return skillRefs.map((ref) => resolveSkillReference(ref, skills));\n}\n\nfunction getStackSkillIds(stackSkills: SkillAssignment[]): string[] {\n return stackSkills.map((s) => s.id);\n}\n\nfunction flattenAgentSkills(\n categorizedSkills: Record<string, SkillAssignment[]>,\n): SkillAssignment[] {\n const assignments: SkillAssignment[] = [];\n for (const category of Object.keys(categorizedSkills)) {\n assignments.push(...categorizedSkills[category]);\n }\n return assignments;\n}\n\nfunction expandSkillIdIfDirectory(\n skillId: string,\n skills: Record<string, SkillDefinition>,\n): string[] {\n if (skills[skillId]) {\n return [skillId];\n }\n\n // Use path as unique key to deduplicate (both frontmatter name and directory path map to same skill)\n const allSkillIds = Object.keys(skills);\n const seenPaths = new Set<string>();\n const matchingSkills: string[] = [];\n\n for (const id of allSkillIds) {\n const skillDef = skills[id];\n if (skillDef.path.startsWith(`src/skills/${skillId}/`)) {\n if (!seenPaths.has(skillDef.path)) {\n seenPaths.add(skillDef.path);\n matchingSkills.push(id);\n }\n }\n }\n\n if (matchingSkills.length > 0) {\n return matchingSkills;\n }\n\n return [skillId];\n}\n\nexport function resolveStackSkills(\n stack: StackConfig,\n agentName: string,\n skills: Record<string, SkillDefinition>,\n): SkillReference[] {\n const skillRefs: SkillReference[] = [];\n\n const agentSkillCategories = stack.agent_skills?.[agentName];\n const assignments: SkillAssignment[] = agentSkillCategories\n ? flattenAgentSkills(agentSkillCategories)\n : stack.skills;\n\n const validSkillIds = new Set<string>();\n for (const s of stack.skills) {\n const expandedIds = expandSkillIdIfDirectory(s.id, skills);\n for (const id of expandedIds) {\n validSkillIds.add(id);\n }\n }\n\n const addedSkills = new Set<string>();\n\n for (const assignment of assignments) {\n const skillId = assignment.id;\n const expandedSkillIds = expandSkillIdIfDirectory(skillId, skills);\n\n for (const expandedId of expandedSkillIds) {\n if (addedSkills.has(expandedId)) {\n continue;\n }\n\n if (!skills[expandedId]) {\n throw new Error(\n `Stack \"${stack.name}\" references skill \"${expandedId}\" for agent \"${agentName}\" not found in scanned skills`,\n );\n }\n\n if (agentSkillCategories && !validSkillIds.has(expandedId)) {\n throw new Error(\n `Stack \"${stack.name}\" agent_skills for \"${agentName}\" includes skill \"${expandedId}\" not in stack's skills array`,\n );\n }\n\n const skillDef = skills[expandedId];\n skillRefs.push({\n id: expandedId,\n usage: `when working with ${skillDef.name.toLowerCase()}`,\n preloaded: assignment.preloaded ?? false,\n });\n\n addedSkills.add(expandedId);\n }\n }\n\n return skillRefs;\n}\n\nexport async function getAgentSkills(\n agentName: string,\n agentConfig: CompileAgentConfig,\n compileConfig: CompileConfig,\n skills: Record<string, SkillDefinition>,\n projectRoot: string,\n): Promise<SkillReference[]> {\n if (agentConfig.skills && agentConfig.skills.length > 0) {\n return agentConfig.skills;\n }\n\n if (compileConfig.stack) {\n console.log(\n ` Resolving skills from stack \"${compileConfig.stack}\" for ${agentName}`,\n );\n const stack = await loadStack(compileConfig.stack, projectRoot);\n return resolveStackSkills(stack, agentName, skills);\n }\n\n return [];\n}\n\nexport async function resolveAgents(\n agents: Record<string, AgentDefinition>,\n skills: Record<string, SkillDefinition>,\n compileConfig: CompileConfig,\n projectRoot: string,\n): Promise<Record<string, AgentConfig>> {\n const resolved: Record<string, AgentConfig> = {};\n const agentNames = Object.keys(compileConfig.agents);\n\n for (const agentName of agentNames) {\n const definition = agents[agentName];\n if (!definition) {\n const availableAgents = Object.keys(agents);\n const agentList =\n availableAgents.length > 0\n ? `Available agents: ${availableAgents.slice(0, 5).join(\", \")}${availableAgents.length > 5 ? ` (and ${availableAgents.length - 5} more)` : \"\"}`\n : \"No agents found in scanned directories\";\n throw new Error(\n `Agent '${agentName}' referenced in compile config but not found in scanned agents. ${agentList}. Check that src/agents/${agentName}/agent.yaml exists.`,\n );\n }\n\n const agentConfig = compileConfig.agents[agentName];\n\n const skillRefs = await getAgentSkills(\n agentName,\n agentConfig,\n compileConfig,\n skills,\n projectRoot,\n );\n\n const resolvedSkills = resolveSkillReferences(skillRefs, skills);\n\n resolved[agentName] = {\n name: agentName,\n title: definition.title,\n description: definition.description,\n model: definition.model,\n tools: definition.tools,\n skills: resolvedSkills,\n path: definition.path,\n };\n }\n\n return resolved;\n}\n\nexport function stackToCompileConfig(\n stackId: string,\n stack: StackConfig,\n): CompileConfig {\n const agents: Record<string, CompileAgentConfig> = {};\n\n for (const agentId of stack.agents) {\n agents[agentId] = {};\n }\n\n return {\n name: stack.name,\n description: stack.description || \"\",\n claude_md: \"\",\n stack: stackId,\n agents,\n };\n}\n","import path from \"path\";\nimport { Liquid } from \"liquidjs\";\nimport {\n readFile,\n readFileOptional,\n writeFile,\n ensureDir,\n copy,\n fileExists,\n directoryExists,\n} from \"../utils/fs\";\nimport { verbose } from \"../utils/logger\";\nimport { DIRS, PROJECT_ROOT, DEFAULT_VERSION } from \"../consts\";\nimport { createLiquidEngine } from \"./compiler\";\nimport {\n generateStackPluginManifest,\n writePluginManifest,\n getPluginManifestPath,\n} from \"./plugin-manifest\";\nimport { loadStack, loadSkillsByIds, loadAllAgents } from \"./loader\";\nimport { resolveAgents, stackToCompileConfig } from \"./resolver\";\nimport { hashString, getCurrentDate } from \"./versioning\";\nimport type {\n PluginManifest,\n StackConfig,\n AgentConfig,\n CompileConfig,\n Skill,\n CompiledAgentData,\n AgentHookDefinition,\n} from \"../../types\";\n\nconst CONTENT_HASH_FILE = \".content-hash\";\n\nfunction parseMajorVersion(version: string): number {\n const match = version.match(/^(\\d+)\\./);\n return match ? parseInt(match[1], 10) : 1;\n}\n\nfunction bumpMajorVersion(version: string): string {\n const major = parseMajorVersion(version);\n return `${major + 1}.0.0`;\n}\n\nasync function readExistingManifest(\n pluginDir: string,\n): Promise<{ version: string; contentHash: string | undefined } | null> {\n const manifestPath = getPluginManifestPath(pluginDir);\n\n if (!(await fileExists(manifestPath))) {\n return null;\n }\n\n try {\n const content = await readFile(manifestPath);\n const manifest = JSON.parse(content) as PluginManifest;\n\n const hashFilePath = manifestPath.replace(\"plugin.json\", CONTENT_HASH_FILE);\n let contentHash: string | undefined;\n if (await fileExists(hashFilePath)) {\n contentHash = (await readFile(hashFilePath)).trim();\n }\n\n return {\n version: manifest.version ?? DEFAULT_VERSION,\n contentHash,\n };\n } catch {\n return null;\n }\n}\n\nfunction hashStackConfig(stack: StackConfig): string {\n const parts: string[] = [\n `name:${stack.name}`,\n `description:${stack.description ?? \"\"}`,\n `skills:${(stack.skills || [])\n .map((s) => s.id)\n .sort()\n .join(\",\")}`,\n `agents:${(stack.agents || []).sort().join(\",\")}`,\n ];\n return hashString(parts.join(\"\\n\"));\n}\n\nasync function determineStackVersion(\n stack: StackConfig,\n pluginDir: string,\n): Promise<{ version: string; contentHash: string }> {\n const newHash = hashStackConfig(stack);\n\n const existing = await readExistingManifest(pluginDir);\n\n if (!existing) {\n return {\n version: DEFAULT_VERSION,\n contentHash: newHash,\n };\n }\n\n if (existing.contentHash !== newHash) {\n return {\n version: bumpMajorVersion(existing.version),\n contentHash: newHash,\n };\n }\n\n return {\n version: existing.version,\n contentHash: newHash,\n };\n}\n\nexport interface StackPluginOptions {\n stackId: string;\n outputDir: string;\n projectRoot: string;\n agentSourcePath?: string;\n}\n\nexport interface CompiledStackPlugin {\n pluginPath: string;\n manifest: PluginManifest;\n stackName: string;\n agents: string[];\n skillPlugins: string[];\n hasHooks: boolean;\n}\n\nexport async function compileAgentForPlugin(\n name: string,\n agent: AgentConfig,\n projectRoot: string,\n engine: Liquid,\n): Promise<string> {\n verbose(`Compiling agent: ${name}`);\n\n const agentDir = path.join(projectRoot, DIRS.agents, agent.path || name);\n\n const intro = await readFile(path.join(agentDir, \"intro.md\"));\n const workflow = await readFile(path.join(agentDir, \"workflow.md\"));\n const examples = await readFileOptional(\n path.join(agentDir, \"examples.md\"),\n \"## Examples\\n\\n_No examples defined._\",\n );\n const criticalRequirementsTop = await readFileOptional(\n path.join(agentDir, \"critical-requirements.md\"),\n \"\",\n );\n const criticalReminders = await readFileOptional(\n path.join(agentDir, \"critical-reminders.md\"),\n \"\",\n );\n\n const agentPath = agent.path || name;\n const category = agentPath.split(\"/\")[0];\n const categoryDir = path.join(projectRoot, DIRS.agents, category);\n\n let outputFormat = await readFileOptional(\n path.join(agentDir, \"output-format.md\"),\n \"\",\n );\n if (!outputFormat) {\n outputFormat = await readFileOptional(\n path.join(categoryDir, \"output-format.md\"),\n \"\",\n );\n }\n\n const preloadedSkills = agent.skills.filter((s) => s.preloaded);\n const dynamicSkills = agent.skills.filter((s) => !s.preloaded);\n\n const preloadedSkillIds = preloadedSkills.map((s) => s.id);\n\n verbose(\n `Skills for ${name}: ${preloadedSkills.length} preloaded, ${dynamicSkills.length} dynamic`,\n );\n\n const data: CompiledAgentData = {\n agent,\n intro,\n workflow,\n examples,\n criticalRequirementsTop,\n criticalReminders,\n outputFormat,\n skills: agent.skills,\n preloadedSkills,\n dynamicSkills,\n preloadedSkillIds,\n };\n\n return engine.renderFile(\"agent\", data);\n}\n\nfunction generateStackReadme(\n stackId: string,\n stack: StackConfig,\n agents: string[],\n skillPlugins: string[],\n): string {\n const lines: string[] = [];\n\n lines.push(`# ${stack.name}`);\n lines.push(\"\");\n lines.push(stack.description || \"A Claude Code stack plugin.\");\n lines.push(\"\");\n\n if (stack.tags && stack.tags.length > 0) {\n lines.push(\"## Tags\");\n lines.push(\"\");\n lines.push(stack.tags.map((t) => `\\`${t}\\``).join(\" \"));\n lines.push(\"\");\n }\n\n lines.push(\"## Installation\");\n lines.push(\"\");\n lines.push(\"Add this plugin to your Claude Code configuration:\");\n lines.push(\"\");\n lines.push(\"```json\");\n lines.push(`{`);\n lines.push(` \"plugins\": [\"${stackId}\"]`);\n lines.push(`}`);\n lines.push(\"```\");\n lines.push(\"\");\n\n lines.push(\"## Agents\");\n lines.push(\"\");\n lines.push(\"This stack includes the following agents:\");\n lines.push(\"\");\n for (const agent of agents) {\n lines.push(`- \\`${agent}\\``);\n }\n lines.push(\"\");\n\n if (skillPlugins.length > 0) {\n lines.push(\"## Included Skills\");\n lines.push(\"\");\n lines.push(\"This stack includes the following skills:\");\n lines.push(\"\");\n const uniqueSkills = [...new Set(skillPlugins)].sort();\n for (const skill of uniqueSkills) {\n lines.push(`- \\`${skill}\\``);\n }\n lines.push(\"\");\n }\n\n if (stack.philosophy) {\n lines.push(\"## Philosophy\");\n lines.push(\"\");\n lines.push(stack.philosophy);\n lines.push(\"\");\n }\n\n if (stack.principles && stack.principles.length > 0) {\n lines.push(\"## Principles\");\n lines.push(\"\");\n for (const principle of stack.principles) {\n lines.push(`- ${principle}`);\n }\n lines.push(\"\");\n }\n\n lines.push(\"---\");\n lines.push(\"\");\n lines.push(\"*Generated by Claude Collective stack-plugin-compiler*\");\n lines.push(\"\");\n\n return lines.join(\"\\n\");\n}\n\ninterface HooksJsonOutput {\n hooks: Record<string, AgentHookDefinition[]>;\n}\n\nfunction stackHasHooks(stack: StackConfig): boolean {\n return stack.hooks !== undefined && Object.keys(stack.hooks).length > 0;\n}\n\nfunction generateHooksJson(\n hooks: Record<string, AgentHookDefinition[]>,\n): string {\n const output: HooksJsonOutput = { hooks };\n return JSON.stringify(output, null, 2);\n}\n\nexport async function compileStackPlugin(\n options: StackPluginOptions,\n): Promise<CompiledStackPlugin> {\n const { stackId, outputDir, projectRoot, agentSourcePath } = options;\n const agentRoot = agentSourcePath || projectRoot;\n\n verbose(`Compiling stack plugin: ${stackId}`);\n verbose(` Stack/skills source: ${projectRoot}`);\n verbose(` Agent partials source: ${agentRoot}`);\n\n const stack = await loadStack(stackId, projectRoot, \"dev\");\n\n const agents = await loadAllAgents(agentRoot);\n\n const skills = await loadSkillsByIds(stack.skills || [], projectRoot);\n\n const compileConfig: CompileConfig = stackToCompileConfig(stackId, stack);\n\n const resolvedAgents = await resolveAgents(\n agents,\n skills,\n compileConfig,\n agentRoot,\n );\n\n const pluginDir = path.join(outputDir, stackId);\n const agentsDir = path.join(pluginDir, \"agents\");\n\n await ensureDir(pluginDir);\n await ensureDir(agentsDir);\n\n const pluginSkillsDir = path.join(pluginDir, \"skills\");\n await ensureDir(pluginSkillsDir);\n\n const copiedSourcePaths = new Set<string>();\n\n for (const [, resolvedSkill] of Object.entries(skills)) {\n const sourceSkillDir = path.join(projectRoot, resolvedSkill.path);\n\n if (copiedSourcePaths.has(resolvedSkill.path)) {\n continue;\n }\n\n const destSkillDir = path.join(pluginSkillsDir, resolvedSkill.canonicalId);\n\n if (await directoryExists(sourceSkillDir)) {\n await copy(sourceSkillDir, destSkillDir);\n copiedSourcePaths.add(resolvedSkill.path);\n verbose(` Copied skill: ${resolvedSkill.canonicalId}`);\n } else {\n verbose(` Warning: Skill directory not found: ${sourceSkillDir}`);\n }\n }\n\n const engine = await createLiquidEngine();\n\n const compiledAgentNames: string[] = [];\n const allSkillPlugins: string[] = [];\n\n for (const [name, agent] of Object.entries(resolvedAgents)) {\n const output = await compileAgentForPlugin(name, agent, agentRoot, engine);\n await writeFile(path.join(agentsDir, `${name}.md`), output);\n compiledAgentNames.push(name);\n\n for (const skill of agent.skills) {\n allSkillPlugins.push(skill.id);\n }\n\n verbose(` Compiled agent: ${name}`);\n }\n\n const stackDir = path.join(projectRoot, DIRS.stacks, stackId);\n const claudeMdPath = path.join(stackDir, \"CLAUDE.md\");\n if (await fileExists(claudeMdPath)) {\n const claudeContent = await readFile(claudeMdPath);\n await writeFile(path.join(pluginDir, \"CLAUDE.md\"), claudeContent);\n verbose(` Copied CLAUDE.md`);\n }\n\n const hasHooks = stackHasHooks(stack);\n if (hasHooks && stack.hooks) {\n const hooksDir = path.join(pluginDir, \"hooks\");\n await ensureDir(hooksDir);\n const hooksJson = generateHooksJson(stack.hooks);\n await writeFile(path.join(hooksDir, \"hooks.json\"), hooksJson);\n verbose(` Generated hooks/hooks.json`);\n }\n\n const { version, contentHash } = await determineStackVersion(\n stack,\n pluginDir,\n );\n\n const uniqueSkillPlugins = [...new Set(allSkillPlugins)];\n const manifest = generateStackPluginManifest({\n stackName: stackId,\n description: stack.description,\n author: stack.author,\n version,\n keywords: stack.tags,\n hasAgents: true,\n hasHooks,\n hasSkills: true,\n });\n\n await writePluginManifest(pluginDir, manifest);\n\n const hashFilePath = getPluginManifestPath(pluginDir).replace(\n \"plugin.json\",\n CONTENT_HASH_FILE,\n );\n await writeFile(hashFilePath, contentHash);\n\n verbose(` Wrote plugin.json (v${version})`);\n\n const readme = generateStackReadme(\n stackId,\n stack,\n compiledAgentNames,\n uniqueSkillPlugins,\n );\n await writeFile(path.join(pluginDir, \"README.md\"), readme);\n verbose(` Generated README.md`);\n\n return {\n pluginPath: pluginDir,\n manifest,\n stackName: stack.name,\n agents: compiledAgentNames,\n skillPlugins: uniqueSkillPlugins,\n hasHooks,\n };\n}\n\nexport function printStackCompilationSummary(\n result: CompiledStackPlugin,\n): void {\n console.log(`\\nStack plugin compiled: ${result.stackName}`);\n console.log(` Path: ${result.pluginPath}`);\n console.log(` Agents: ${result.agents.length}`);\n for (const agent of result.agents) {\n console.log(` - ${agent}`);\n }\n if (result.skillPlugins.length > 0) {\n console.log(` Skills included: ${result.skillPlugins.length}`);\n for (const skill of result.skillPlugins) {\n console.log(` - ${skill}`);\n }\n }\n if (result.hasHooks) {\n console.log(` Hooks: enabled`);\n }\n}\n","import { Liquid } from \"liquidjs\";\nimport path from \"path\";\nimport {\n readFile,\n readFileOptional,\n writeFile,\n ensureDir,\n remove,\n copy,\n glob,\n fileExists,\n directoryExists,\n} from \"../utils/fs\";\nimport { verbose } from \"../utils/logger\";\nimport { DIRS, OUTPUT_DIR, PROJECT_ROOT } from \"../consts\";\nimport { resolveClaudeMd } from \"./resolver\";\nimport {\n validateCompiledAgent,\n printOutputValidationResult,\n} from \"./output-validator\";\nimport type {\n Skill,\n AgentConfig,\n CompiledAgentData,\n CompileConfig,\n CompileContext,\n} from \"../types\";\n\nasync function compileAgent(\n name: string,\n agent: AgentConfig,\n projectRoot: string,\n engine: Liquid,\n): Promise<string> {\n verbose(`Reading agent files for ${name}...`);\n\n const agentDir = path.join(projectRoot, DIRS.agents, agent.path || name);\n\n const intro = await readFile(path.join(agentDir, \"intro.md\"));\n const workflow = await readFile(path.join(agentDir, \"workflow.md\"));\n const examples = await readFileOptional(\n path.join(agentDir, \"examples.md\"),\n \"## Examples\\n\\n_No examples defined._\",\n );\n const criticalRequirementsTop = await readFileOptional(\n path.join(agentDir, \"critical-requirements.md\"),\n \"\",\n );\n const criticalReminders = await readFileOptional(\n path.join(agentDir, \"critical-reminders.md\"),\n \"\",\n );\n\n const agentPath = agent.path || name;\n const category = agentPath.split(\"/\")[0];\n const categoryDir = path.join(projectRoot, DIRS.agents, category);\n\n let outputFormat = await readFileOptional(\n path.join(agentDir, \"output-format.md\"),\n \"\",\n );\n if (!outputFormat) {\n outputFormat = await readFileOptional(\n path.join(categoryDir, \"output-format.md\"),\n \"\",\n );\n }\n\n const preloadedSkills = agent.skills.filter((s) => s.preloaded);\n const dynamicSkills = agent.skills.filter((s) => !s.preloaded);\n const preloadedSkillIds = preloadedSkills.map((s) => s.id);\n\n verbose(\n `Skills for ${name}: ${preloadedSkills.length} preloaded, ${dynamicSkills.length} dynamic`,\n );\n\n const data: CompiledAgentData = {\n agent,\n intro,\n workflow,\n examples,\n criticalRequirementsTop,\n criticalReminders,\n outputFormat,\n skills: agent.skills,\n preloadedSkills,\n dynamicSkills,\n preloadedSkillIds,\n };\n\n verbose(`Rendering template for ${name}...`);\n return engine.renderFile(\"agent\", data);\n}\n\nexport async function compileAllAgents(\n resolvedAgents: Record<string, AgentConfig>,\n config: CompileConfig,\n ctx: CompileContext,\n engine: Liquid,\n): Promise<void> {\n const outDir = path.join(ctx.outputDir, \"agents\");\n await ensureDir(outDir);\n\n let hasValidationIssues = false;\n\n for (const [name, agent] of Object.entries(resolvedAgents)) {\n try {\n const output = await compileAgent(name, agent, ctx.projectRoot, engine);\n await writeFile(path.join(outDir, `${name}.md`), output);\n console.log(` ✓ ${name}.md`);\n\n const validationResult = validateCompiledAgent(output);\n if (!validationResult.valid || validationResult.warnings.length > 0) {\n hasValidationIssues = true;\n printOutputValidationResult(name, validationResult);\n }\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n console.error(` ✗ ${name}.md - ${errorMessage}`);\n throw new Error(\n `Failed to compile agent '${name}': ${errorMessage}. Check that all required files exist in src/agents/${agent.path || name}/`,\n );\n }\n }\n\n if (hasValidationIssues) {\n console.log(\"\");\n }\n}\n\nexport async function compileAllSkills(\n resolvedAgents: Record<string, AgentConfig>,\n ctx: CompileContext,\n): Promise<void> {\n const allSkills = Object.values(resolvedAgents)\n .flatMap((a) => a.skills)\n .filter((s) => s.path);\n\n const uniqueSkills = [...new Map(allSkills.map((s) => [s.id, s])).values()];\n\n for (const skill of uniqueSkills) {\n const id = skill.id.replace(\"/\", \"-\");\n const outDir = path.join(ctx.outputDir, \"skills\", id);\n await ensureDir(outDir);\n\n const sourcePath = path.join(ctx.projectRoot, skill.path);\n const isFolder = skill.path.endsWith(\"/\");\n\n try {\n if (isFolder) {\n const mainContent = await readFile(path.join(sourcePath, \"SKILL.md\"));\n await writeFile(path.join(outDir, \"SKILL.md\"), mainContent);\n console.log(` ✓ skills/${id}/SKILL.md`);\n\n const referenceContent = await readFileOptional(\n path.join(sourcePath, \"reference.md\"),\n );\n if (referenceContent) {\n await writeFile(path.join(outDir, \"reference.md\"), referenceContent);\n console.log(` ✓ skills/${id}/reference.md`);\n }\n\n const examplesDir = path.join(sourcePath, \"examples\");\n if (await fileExists(examplesDir)) {\n await copy(examplesDir, path.join(outDir, \"examples\"));\n console.log(` ✓ skills/${id}/examples/`);\n }\n\n const scriptsDir = path.join(sourcePath, \"scripts\");\n if (await fileExists(scriptsDir)) {\n await copy(scriptsDir, path.join(outDir, \"scripts\"));\n console.log(` ✓ skills/${id}/scripts/`);\n }\n } else {\n const content = await readFile(sourcePath);\n await writeFile(path.join(outDir, \"SKILL.md\"), content);\n console.log(` ✓ skills/${id}/SKILL.md`);\n }\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n console.error(` ✗ skills/${id}/SKILL.md - ${errorMessage}`);\n throw new Error(\n `Failed to compile skill '${skill.id}': ${errorMessage}. Expected skill at: ${sourcePath}`,\n );\n }\n }\n}\n\nexport async function copyClaude(ctx: CompileContext): Promise<void> {\n const claudePath = await resolveClaudeMd(\n ctx.projectRoot,\n ctx.stackId,\n ctx.mode,\n );\n\n const content = await readFile(claudePath);\n const outputPath = path.join(ctx.outputDir, \"..\", \"CLAUDE.md\");\n await writeFile(outputPath, content);\n console.log(` ✓ CLAUDE.md (from stack)`);\n}\n\nexport async function compileAllCommands(ctx: CompileContext): Promise<void> {\n const commandsDir = path.join(ctx.projectRoot, DIRS.commands);\n const outDir = path.join(ctx.outputDir, \"commands\");\n\n if (!(await fileExists(commandsDir))) {\n console.log(\" - No commands directory found, skipping...\");\n return;\n }\n\n const files = await glob(\"*.md\", commandsDir);\n\n if (files.length === 0) {\n console.log(\" - No commands found, skipping...\");\n return;\n }\n\n await ensureDir(outDir);\n\n for (const file of files) {\n try {\n const content = await readFile(path.join(commandsDir, file));\n await writeFile(path.join(outDir, file), content);\n console.log(` ✓ ${file}`);\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n console.error(` ✗ ${file} - ${errorMessage}`);\n throw new Error(\n `Failed to compile command '${file}': ${errorMessage}. Expected at: ${path.join(commandsDir, file)}`,\n );\n }\n }\n}\n\nexport async function createLiquidEngine(projectDir?: string): Promise<Liquid> {\n const roots: string[] = [];\n\n if (projectDir) {\n const localTemplatesDir = path.join(projectDir, \".claude\", \"templates\");\n if (await directoryExists(localTemplatesDir)) {\n roots.push(localTemplatesDir);\n verbose(`Using local templates from: ${localTemplatesDir}`);\n }\n }\n\n roots.push(path.join(PROJECT_ROOT, DIRS.templates));\n\n return new Liquid({\n root: roots,\n extname: \".liquid\",\n strictVariables: false,\n strictFilters: true,\n });\n}\n\nexport async function cleanOutputDir(outputDir: string): Promise<void> {\n await remove(path.join(outputDir, \"agents\"));\n await remove(path.join(outputDir, \"skills\"));\n await remove(path.join(outputDir, \"commands\"));\n}\n","import path from \"path\";\nimport { ensureDir, writeFile } from \"../utils/fs\";\nimport { DEFAULT_VERSION } from \"../consts\";\nimport type { PluginManifest, PluginAuthor } from \"../../types\";\n\nconst DEFAULT_LICENSE = \"MIT\";\nconst PLUGIN_DIR_NAME = \".claude-plugin\";\nconst PLUGIN_MANIFEST_FILE = \"plugin.json\";\nconst SKILL_PLUGIN_PREFIX = \"skill-\";\n\nexport interface SkillPluginOptions {\n skillName: string;\n description?: string;\n author?: string;\n authorEmail?: string;\n version?: string;\n keywords?: string[];\n}\n\nexport interface StackPluginOptions {\n stackName: string;\n description?: string;\n author?: string;\n authorEmail?: string;\n version?: string;\n keywords?: string[];\n hasSkills?: boolean;\n hasAgents?: boolean;\n hasHooks?: boolean;\n}\n\nfunction buildAuthor(name?: string, email?: string): PluginAuthor | undefined {\n if (!name) {\n return undefined;\n }\n const author: PluginAuthor = { name };\n if (email) {\n author.email = email;\n }\n return author;\n}\n\nexport function generateSkillPluginManifest(\n options: SkillPluginOptions,\n): PluginManifest {\n const manifest: PluginManifest = {\n name: `${SKILL_PLUGIN_PREFIX}${options.skillName}`,\n version: options.version ?? DEFAULT_VERSION,\n license: DEFAULT_LICENSE,\n skills: \"./skills/\",\n };\n\n if (options.description) {\n manifest.description = options.description;\n }\n\n const author = buildAuthor(options.author, options.authorEmail);\n if (author) {\n manifest.author = author;\n }\n\n if (options.keywords && options.keywords.length > 0) {\n manifest.keywords = options.keywords;\n }\n\n return manifest;\n}\n\nexport function generateStackPluginManifest(\n options: StackPluginOptions,\n): PluginManifest {\n const manifest: PluginManifest = {\n name: options.stackName,\n version: options.version ?? DEFAULT_VERSION,\n license: DEFAULT_LICENSE,\n };\n\n if (options.hasSkills) {\n manifest.skills = \"./skills/\";\n }\n\n if (options.description) {\n manifest.description = options.description;\n }\n\n const author = buildAuthor(options.author, options.authorEmail);\n if (author) {\n manifest.author = author;\n }\n\n if (options.keywords && options.keywords.length > 0) {\n manifest.keywords = options.keywords;\n }\n\n if (options.hasAgents) {\n manifest.agents = \"./agents/\";\n }\n\n if (options.hasHooks) {\n manifest.hooks = \"./hooks/hooks.json\";\n }\n\n return manifest;\n}\n\nexport async function writePluginManifest(\n outputDir: string,\n manifest: PluginManifest,\n): Promise<string> {\n const pluginDir = path.join(outputDir, PLUGIN_DIR_NAME);\n const manifestPath = path.join(pluginDir, PLUGIN_MANIFEST_FILE);\n\n await ensureDir(pluginDir);\n\n const content = JSON.stringify(manifest, null, 2);\n await writeFile(manifestPath, content);\n\n return manifestPath;\n}\n\nexport function getPluginDir(outputDir: string): string {\n return path.join(outputDir, PLUGIN_DIR_NAME);\n}\n\nexport function getPluginManifestPath(outputDir: string): string {\n return path.join(outputDir, PLUGIN_DIR_NAME, PLUGIN_MANIFEST_FILE);\n}\n","import { createHash } from \"crypto\";\nimport path from \"path\";\nimport { stringify as stringifyYaml, parse as parseYaml } from \"yaml\";\nimport { readFile, writeFile, glob, fileExists } from \"../utils/fs\";\nimport { verbose } from \"../utils/logger\";\n\nconst HASH_PREFIX_LENGTH = 7;\n\nconst METADATA_FILE_NAME = \"metadata.yaml\";\n\nconst HASHABLE_FILES = [\"SKILL.md\", \"reference.md\"];\n\nconst HASHABLE_DIRS = [\"examples\", \"scripts\"];\n\ninterface VersionedMetadata {\n version: number;\n content_hash?: string;\n updated?: string;\n [key: string]: unknown;\n}\n\nexport interface VersionCheckResult {\n skillPath: string;\n previousVersion: number;\n newVersion: number;\n previousHash: string | undefined;\n newHash: string;\n changed: boolean;\n}\n\nexport function getCurrentDate(): string {\n return new Date().toISOString().split(\"T\")[0];\n}\n\nexport function hashString(content: string): string {\n const hash = createHash(\"sha256\");\n hash.update(content);\n return hash.digest(\"hex\").slice(0, HASH_PREFIX_LENGTH);\n}\n\nexport async function hashFile(filePath: string): Promise<string> {\n const content = await readFile(filePath);\n return hashString(content);\n}\n\nexport async function hashSkillFolder(skillPath: string): Promise<string> {\n const contents: string[] = [];\n\n for (const fileName of HASHABLE_FILES) {\n const filePath = path.join(skillPath, fileName);\n if (await fileExists(filePath)) {\n const content = await readFile(filePath);\n contents.push(`${fileName}:${content}`);\n }\n }\n\n for (const dirName of HASHABLE_DIRS) {\n const dirPath = path.join(skillPath, dirName);\n if (await fileExists(dirPath)) {\n const files = await glob(\"**/*\", dirPath);\n for (const file of files.sort()) {\n const filePath = path.join(dirPath, file);\n const content = await readFile(filePath);\n contents.push(`${dirName}/${file}:${content}`);\n }\n }\n }\n\n const combined = contents.join(\"\\n---\\n\");\n return hashString(combined);\n}\n\nasync function readMetadata(\n skillPath: string,\n): Promise<{ metadata: VersionedMetadata; schemaComment: string }> {\n const metadataPath = path.join(skillPath, METADATA_FILE_NAME);\n const rawContent = await readFile(metadataPath);\n\n const lines = rawContent.split(\"\\n\");\n let schemaComment = \"\";\n let yamlContent = rawContent;\n\n if (lines[0]?.startsWith(\"# yaml-language-server:\")) {\n schemaComment = lines[0] + \"\\n\";\n yamlContent = lines.slice(1).join(\"\\n\");\n }\n\n const metadata = parseYaml(yamlContent) as VersionedMetadata;\n return { metadata, schemaComment };\n}\n\nasync function writeMetadata(\n skillPath: string,\n metadata: VersionedMetadata,\n schemaComment: string,\n): Promise<void> {\n const metadataPath = path.join(skillPath, METADATA_FILE_NAME);\n const yamlContent = stringifyYaml(metadata, { lineWidth: 0 });\n await writeFile(metadataPath, schemaComment + yamlContent);\n}\n\nexport async function versionSkill(\n skillPath: string,\n): Promise<VersionCheckResult> {\n const newHash = await hashSkillFolder(skillPath);\n\n const { metadata, schemaComment } = await readMetadata(skillPath);\n const previousVersion = metadata.version;\n const previousHash = metadata.content_hash;\n\n const changed = previousHash !== newHash;\n\n if (changed) {\n metadata.version = previousVersion + 1;\n metadata.content_hash = newHash;\n metadata.updated = getCurrentDate();\n\n await writeMetadata(skillPath, metadata, schemaComment);\n\n verbose(\n ` Version bumped: ${skillPath} (v${previousVersion} -> v${metadata.version})`,\n );\n }\n\n return {\n skillPath,\n previousVersion,\n newVersion: changed ? previousVersion + 1 : previousVersion,\n previousHash,\n newHash,\n changed,\n };\n}\n\nexport async function versionAllSkills(\n skillsDir: string,\n): Promise<VersionCheckResult[]> {\n const results: VersionCheckResult[] = [];\n\n const metadataFiles = await glob(\"**/metadata.yaml\", skillsDir);\n\n for (const metadataFile of metadataFiles) {\n const skillPath = path.join(skillsDir, path.dirname(metadataFile));\n\n try {\n const result = await versionSkill(skillPath);\n results.push(result);\n } catch (error) {\n console.warn(\n ` Warning: Failed to version skill at ${skillPath}: ${error}`,\n );\n }\n }\n\n return results;\n}\n\nexport function printVersionResults(results: VersionCheckResult[]): void {\n const changed = results.filter((r) => r.changed);\n const unchanged = results.filter((r) => !r.changed);\n\n if (changed.length > 0) {\n console.log(`\\n Version Updates:`);\n for (const result of changed) {\n const skillName = path.basename(result.skillPath);\n console.log(\n ` ✓ ${skillName}: v${result.previousVersion} -> v${result.newVersion}`,\n );\n }\n }\n\n console.log(\n `\\n Summary: ${changed.length} updated, ${unchanged.length} unchanged`,\n );\n}\n","/**\n * CLI exit codes for standardized process termination.\n *\n * These follow Unix conventions where 0 = success, non-zero = error.\n * Use named constants instead of magic numbers for clarity and consistency.\n */\nexport const EXIT_CODES = {\n /** Operation completed successfully */\n SUCCESS: 0,\n /** General error - operation failed */\n ERROR: 1,\n /** Invalid command-line arguments or options */\n INVALID_ARGS: 2,\n /** Network request failed (connection, timeout, etc.) */\n NETWORK_ERROR: 3,\n /** User cancelled the operation (Ctrl+C or prompt cancel) */\n CANCELLED: 4,\n} as const;\n\nexport type ExitCode = (typeof EXIT_CODES)[keyof typeof EXIT_CODES];\n","import { Command } from \"commander\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport path from \"path\";\nimport { setVerbose } from \"../utils/logger\";\nimport { DIRS } from \"../consts\";\nimport {\n compileAllSkillPlugins,\n compileSkillPlugin,\n printCompilationSummary,\n} from \"../lib/skill-plugin-compiler\";\nimport { EXIT_CODES } from \"../lib/exit-codes\";\n\nconst DEFAULT_OUTPUT_DIR = \"dist/plugins\";\n\nexport const compilePluginsCommand = new Command(\"build:plugins\")\n .description(\"Build skills into standalone plugins (requires skills repo)\")\n .option(\"-s, --skills-dir <dir>\", \"Skills source directory\", DIRS.skills)\n .option(\"-o, --output-dir <dir>\", \"Output directory\", DEFAULT_OUTPUT_DIR)\n .option(\n \"--skill <name>\",\n \"Compile only a specific skill (path to skill directory)\",\n )\n .option(\"-v, --verbose\", \"Enable verbose logging\", false)\n .configureOutput({\n writeErr: (str) => console.error(pc.red(str)),\n })\n .showHelpAfterError(true)\n .action(async (options) => {\n const s = p.spinner();\n setVerbose(options.verbose);\n\n const projectRoot = process.cwd();\n const skillsDir = path.resolve(projectRoot, options.skillsDir);\n const outputDir = path.resolve(projectRoot, options.outputDir);\n\n console.log(`\\nCompiling skill plugins`);\n console.log(` Skills directory: ${pc.cyan(skillsDir)}`);\n console.log(` Output directory: ${pc.cyan(outputDir)}\\n`);\n\n try {\n if (options.skill) {\n const skillPath = path.resolve(skillsDir, options.skill);\n s.start(`Compiling skill at ${skillPath}...`);\n\n const result = await compileSkillPlugin({\n skillPath,\n outputDir,\n });\n\n s.stop(`Compiled skill-${result.skillName}`);\n console.log(` Plugin path: ${pc.cyan(result.pluginPath)}`);\n } else {\n s.start(\"Finding and compiling all skills...\");\n\n const results = await compileAllSkillPlugins(skillsDir, outputDir);\n\n s.stop(`Compiled ${results.length} skill plugins`);\n printCompilationSummary(results);\n }\n\n p.outro(pc.green(\"Plugin compilation complete!\"));\n } catch (error) {\n s.stop(\"Compilation failed\");\n p.log.error(String(error));\n process.exit(EXIT_CODES.ERROR);\n }\n });\n","import path from \"path\";\nimport { parse as parseYaml } from \"yaml\";\nimport {\n readFile,\n writeFile,\n ensureDir,\n glob,\n fileExists,\n copy,\n} from \"../utils/fs\";\nimport { verbose } from \"../utils/logger\";\nimport {\n generateSkillPluginManifest,\n writePluginManifest,\n getPluginManifestPath,\n} from \"./plugin-manifest\";\nimport { hashSkillFolder, getCurrentDate } from \"./versioning\";\nimport { DEFAULT_VERSION } from \"../consts\";\nimport type {\n PluginManifest,\n SkillFrontmatter,\n SkillMetadataConfig,\n} from \"../../types\";\n\nexport interface SkillPluginOptions {\n skillPath: string;\n outputDir: string;\n skillName?: string;\n}\n\nexport interface CompiledSkillPlugin {\n pluginPath: string;\n manifest: PluginManifest;\n skillName: string;\n}\n\nconst FRONTMATTER_REGEX = /^---\\n([\\s\\S]*?)\\n---/;\n\nconst SKILL_FILES = [\"SKILL.md\", \"reference.md\"] as const;\n\nconst SKILL_DIRS = [\"examples\", \"scripts\"] as const;\n\nfunction parseFrontmatter(content: string): SkillFrontmatter | null {\n const match = content.match(FRONTMATTER_REGEX);\n if (!match) return null;\n\n const yamlContent = match[1];\n const frontmatter = parseYaml(yamlContent) as SkillFrontmatter;\n\n if (!frontmatter.name || !frontmatter.description) return null;\n return frontmatter;\n}\n\nfunction sanitizeSkillName(name: string): string {\n return name.replace(/\\+/g, \"-\");\n}\n\nfunction parseMajorVersion(version: string): number {\n const match = version.match(/^(\\d+)\\./);\n return match ? parseInt(match[1], 10) : 1;\n}\n\nfunction bumpMajorVersion(version: string): string {\n const major = parseMajorVersion(version);\n return `${major + 1}.0.0`;\n}\n\nconst CONTENT_HASH_FILE = \".content-hash\";\n\nasync function readExistingManifest(\n pluginDir: string,\n): Promise<{ version: string; contentHash: string | undefined } | null> {\n const manifestPath = getPluginManifestPath(pluginDir);\n\n if (!(await fileExists(manifestPath))) {\n return null;\n }\n\n try {\n const content = await readFile(manifestPath);\n const manifest = JSON.parse(content) as PluginManifest;\n\n const hashFilePath = manifestPath.replace(\"plugin.json\", CONTENT_HASH_FILE);\n let contentHash: string | undefined;\n if (await fileExists(hashFilePath)) {\n contentHash = (await readFile(hashFilePath)).trim();\n }\n\n return {\n version: manifest.version ?? DEFAULT_VERSION,\n contentHash,\n };\n } catch {\n return null;\n }\n}\n\nasync function determineVersion(\n skillPath: string,\n pluginDir: string,\n): Promise<{ version: string; contentHash: string }> {\n const newHash = await hashSkillFolder(skillPath);\n\n const existing = await readExistingManifest(pluginDir);\n\n if (!existing) {\n return {\n version: DEFAULT_VERSION,\n contentHash: newHash,\n };\n }\n\n if (existing.contentHash !== newHash) {\n return {\n version: bumpMajorVersion(existing.version),\n contentHash: newHash,\n };\n }\n\n return {\n version: existing.version,\n contentHash: newHash,\n };\n}\n\nexport function extractSkillName(skillPath: string): string {\n const dirName = path.basename(skillPath);\n const withoutAuthor = dirName.replace(/\\s*\\(@\\w+\\)$/, \"\").trim();\n return sanitizeSkillName(withoutAuthor);\n}\n\nexport function extractCategory(\n skillPath: string,\n skillsRoot: string,\n): string | undefined {\n const relativePath = path.relative(skillsRoot, skillPath);\n const parts = relativePath.split(path.sep);\n return parts.length > 1 ? parts[0] : undefined;\n}\n\nexport function extractAuthor(skillPath: string): string | undefined {\n const dirName = path.basename(skillPath);\n const match = dirName.match(/\\(@(\\w+)\\)$/);\n return match ? match[1] : undefined;\n}\n\nasync function readSkillMetadata(\n skillPath: string,\n): Promise<SkillMetadataConfig | null> {\n const metadataPath = path.join(skillPath, \"metadata.yaml\");\n\n if (!(await fileExists(metadataPath))) {\n return null;\n }\n\n try {\n const content = await readFile(metadataPath);\n const lines = content.split(\"\\n\");\n const yamlContent = lines[0]?.startsWith(\"# yaml-language-server:\")\n ? lines.slice(1).join(\"\\n\")\n : content;\n\n return parseYaml(yamlContent) as SkillMetadataConfig;\n } catch {\n return null;\n }\n}\n\nfunction generateReadme(\n skillName: string,\n frontmatter: SkillFrontmatter,\n metadata: SkillMetadataConfig | null,\n): string {\n const lines: string[] = [];\n\n lines.push(`# ${skillName}`);\n lines.push(\"\");\n lines.push(frontmatter.description);\n lines.push(\"\");\n\n if (metadata?.tags && metadata.tags.length > 0) {\n lines.push(\"## Tags\");\n lines.push(\"\");\n lines.push(metadata.tags.map((t) => `\\`${t}\\``).join(\" \"));\n lines.push(\"\");\n }\n\n lines.push(\"## Installation\");\n lines.push(\"\");\n lines.push(\"Add this plugin to your Claude Code configuration:\");\n lines.push(\"\");\n lines.push(\"```json\");\n lines.push(`{`);\n lines.push(` \"plugins\": [\"skill-${skillName}\"]`);\n lines.push(`}`);\n lines.push(\"```\");\n lines.push(\"\");\n\n lines.push(\"## Usage\");\n lines.push(\"\");\n lines.push(`This skill is automatically available when installed.`);\n if (metadata?.requires && metadata.requires.length > 0) {\n lines.push(\"\");\n lines.push(\"**Requires:** \" + metadata.requires.join(\", \"));\n }\n lines.push(\"\");\n\n lines.push(\"---\");\n lines.push(\"\");\n lines.push(\"*Generated by Claude Collective skill-plugin-compiler*\");\n lines.push(\"\");\n\n return lines.join(\"\\n\");\n}\n\nexport async function compileSkillPlugin(\n options: SkillPluginOptions,\n): Promise<CompiledSkillPlugin> {\n const { skillPath, outputDir, skillName: overrideName } = options;\n\n const skillName = overrideName ?? extractSkillName(skillPath);\n const author = extractAuthor(skillPath);\n\n verbose(`Compiling skill plugin: ${skillName} from ${skillPath}`);\n\n const skillMdPath = path.join(skillPath, \"SKILL.md\");\n if (!(await fileExists(skillMdPath))) {\n throw new Error(\n `Skill '${skillName}' is missing required SKILL.md file. Expected at: ${skillMdPath}`,\n );\n }\n\n const skillMdContent = await readFile(skillMdPath);\n const frontmatter = parseFrontmatter(skillMdContent);\n\n if (!frontmatter) {\n throw new Error(\n `Skill '${skillName}' has invalid or missing YAML frontmatter in SKILL.md. ` +\n `Required fields: 'name' and 'description'. File: ${skillMdPath}`,\n );\n }\n\n const metadata = await readSkillMetadata(skillPath);\n\n const pluginDir = path.join(outputDir, `skill-${skillName}`);\n const skillsDir = path.join(pluginDir, \"skills\", skillName);\n\n await ensureDir(pluginDir);\n await ensureDir(skillsDir);\n\n const { version, contentHash } = await determineVersion(skillPath, pluginDir);\n\n const manifest = generateSkillPluginManifest({\n skillName,\n description: frontmatter.description,\n author: author ? `@${author}` : metadata?.author,\n version,\n keywords: metadata?.tags,\n });\n\n await writePluginManifest(pluginDir, manifest);\n\n const hashFilePath = getPluginManifestPath(pluginDir).replace(\n \"plugin.json\",\n CONTENT_HASH_FILE,\n );\n await writeFile(hashFilePath, contentHash);\n\n verbose(` Wrote plugin.json for ${skillName} (v${version})`);\n\n await writeFile(path.join(skillsDir, \"SKILL.md\"), skillMdContent);\n verbose(` Copied SKILL.md`);\n\n for (const fileName of SKILL_FILES) {\n if (fileName === \"SKILL.md\") continue;\n\n const sourcePath = path.join(skillPath, fileName);\n if (await fileExists(sourcePath)) {\n const content = await readFile(sourcePath);\n await writeFile(path.join(skillsDir, fileName), content);\n verbose(` Copied ${fileName}`);\n }\n }\n\n for (const dirName of SKILL_DIRS) {\n const sourceDir = path.join(skillPath, dirName);\n if (await fileExists(sourceDir)) {\n await copy(sourceDir, path.join(skillsDir, dirName));\n verbose(` Copied ${dirName}/`);\n }\n }\n\n const readme = generateReadme(skillName, frontmatter, metadata);\n await writeFile(path.join(pluginDir, \"README.md\"), readme);\n verbose(` Generated README.md`);\n\n return {\n pluginPath: pluginDir,\n manifest,\n skillName,\n };\n}\n\nexport async function compileAllSkillPlugins(\n skillsDir: string,\n outputDir: string,\n): Promise<CompiledSkillPlugin[]> {\n const results: CompiledSkillPlugin[] = [];\n\n const skillMdFiles = await glob(\"**/SKILL.md\", skillsDir);\n\n const skillNameMap = new Map<string, string[]>();\n for (const skillMdFile of skillMdFiles) {\n const skillPath = path.join(skillsDir, path.dirname(skillMdFile));\n const baseName = extractSkillName(skillPath);\n const existing = skillNameMap.get(baseName) ?? [];\n existing.push(skillPath);\n skillNameMap.set(baseName, existing);\n }\n\n const collidingNames = new Set<string>();\n for (const [name, paths] of skillNameMap.entries()) {\n if (paths.length > 1) {\n collidingNames.add(name);\n verbose(`Name collision detected for \"${name}\": ${paths.length} skills`);\n }\n }\n\n for (const skillMdFile of skillMdFiles) {\n const skillPath = path.join(skillsDir, path.dirname(skillMdFile));\n const baseName = extractSkillName(skillPath);\n\n let skillName = baseName;\n if (collidingNames.has(baseName)) {\n const category = extractCategory(skillPath, skillsDir);\n if (category) {\n skillName = `${category}-${baseName}`;\n }\n }\n\n try {\n const result = await compileSkillPlugin({\n skillPath,\n outputDir,\n skillName,\n });\n results.push(result);\n console.log(` [OK] skill-${result.skillName}`);\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n console.warn(\n ` [WARN] Failed to compile skill 'skill-${skillName}' from ${skillPath}: ${errorMessage}`,\n );\n }\n }\n\n return results;\n}\n\nexport function printCompilationSummary(results: CompiledSkillPlugin[]): void {\n console.log(`\\nCompiled ${results.length} skill plugins:`);\n for (const result of results) {\n console.log(` - skill-${result.skillName} (v${result.manifest.version})`);\n }\n}\n","import { Command } from \"commander\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport path from \"path\";\nimport { setVerbose } from \"../utils/logger\";\nimport { DIRS, PROJECT_ROOT } from \"../consts\";\nimport {\n compileStackPlugin,\n printStackCompilationSummary,\n} from \"../lib/stack-plugin-compiler\";\nimport { listDirectories } from \"../utils/fs\";\nimport { getAgentDefinitions } from \"../lib/agent-fetcher\";\nimport { EXIT_CODES } from \"../lib/exit-codes\";\n\nconst DEFAULT_OUTPUT_DIR = \"dist/stacks\";\n\nexport const compileStackCommand = new Command(\"build:stack\")\n .description(\"Build a stack into a standalone plugin (requires skills repo)\")\n .option(\n \"-s, --stack <id>\",\n \"Stack ID to compile (directory name in src/stacks/)\",\n )\n .option(\"-o, --output-dir <dir>\", \"Output directory\", DEFAULT_OUTPUT_DIR)\n .option(\"--agent-source <url>\", \"Agent partials source (default: local CLI)\")\n .option(\"--refresh\", \"Force refresh remote agent source\", false)\n .option(\"-v, --verbose\", \"Enable verbose logging\", false)\n .configureOutput({\n writeErr: (str) => console.error(pc.red(str)),\n })\n .showHelpAfterError(true)\n .action(async (options) => {\n const s = p.spinner();\n setVerbose(options.verbose);\n\n const projectRoot = process.cwd();\n const outputDir = path.resolve(projectRoot, options.outputDir);\n const stacksDir = path.join(projectRoot, DIRS.stacks);\n\n let stackId = options.stack;\n if (!stackId) {\n const availableStacks = await listDirectories(stacksDir);\n if (availableStacks.length === 0) {\n p.log.error(`No stacks found in ${stacksDir}`);\n process.exit(EXIT_CODES.ERROR);\n }\n\n const selected = await p.select({\n message: \"Select a stack to compile:\",\n options: availableStacks.map((name) => ({\n value: name,\n label: name,\n })),\n });\n\n if (p.isCancel(selected)) {\n p.log.warn(\"Cancelled\");\n process.exit(EXIT_CODES.CANCELLED);\n }\n\n stackId = selected as string;\n }\n\n console.log(`\\nCompiling stack plugin: ${pc.cyan(stackId)}`);\n console.log(` Output directory: ${pc.cyan(outputDir)}\\n`);\n\n let agentSourcePath: string;\n try {\n s.start(\n options.agentSource\n ? \"Fetching agent partials...\"\n : \"Loading agent partials...\",\n );\n const agentDefs = await getAgentDefinitions(options.agentSource, {\n forceRefresh: options.refresh,\n });\n agentSourcePath = agentDefs.sourcePath;\n s.stop(\n options.agentSource\n ? `Agent partials fetched from: ${options.agentSource}`\n : `Agent partials loaded from: ${PROJECT_ROOT}`,\n );\n } catch (error) {\n s.stop(\"Failed to load agent partials\");\n p.log.error(String(error));\n process.exit(EXIT_CODES.ERROR);\n }\n\n try {\n s.start(`Compiling stack \"${stackId}\"...`);\n\n const result = await compileStackPlugin({\n stackId,\n outputDir,\n projectRoot,\n agentSourcePath,\n });\n\n s.stop(`Compiled stack plugin: ${result.stackName}`);\n\n printStackCompilationSummary(result);\n\n p.outro(pc.green(\"Stack plugin compilation complete!\"));\n } catch (error) {\n s.stop(\"Compilation failed\");\n p.log.error(String(error));\n process.exit(EXIT_CODES.ERROR);\n }\n });\n","import { Command } from \"commander\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport path from \"path\";\nimport { setVerbose } from \"../utils/logger\";\nimport {\n generateMarketplace,\n writeMarketplace,\n getMarketplaceStats,\n} from \"../lib/marketplace-generator\";\nimport { EXIT_CODES } from \"../lib/exit-codes\";\nimport { DEFAULT_VERSION } from \"../consts\";\n\nconst DEFAULT_PLUGINS_DIR = \"dist/plugins\";\nconst DEFAULT_OUTPUT_FILE = \".claude-plugin/marketplace.json\";\nconst DEFAULT_NAME = \"claude-collective\";\nconst DEFAULT_DESCRIPTION = \"Community skills and stacks for Claude Code\";\nconst DEFAULT_OWNER_NAME = \"Claude Collective\";\nconst DEFAULT_OWNER_EMAIL = \"hello@claude-collective.com\";\n\nexport const generateMarketplaceCommand = new Command(\"build:marketplace\")\n .description(\n \"Generate marketplace.json from built plugins (requires skills repo)\",\n )\n .option(\"-p, --plugins-dir <dir>\", \"Plugins directory\", DEFAULT_PLUGINS_DIR)\n .option(\"-o, --output <file>\", \"Output file\", DEFAULT_OUTPUT_FILE)\n .option(\"--name <name>\", \"Marketplace name\", DEFAULT_NAME)\n .option(\"--version <version>\", \"Marketplace version\", DEFAULT_VERSION)\n .option(\n \"--description <desc>\",\n \"Marketplace description\",\n DEFAULT_DESCRIPTION,\n )\n .option(\"--owner-name <name>\", \"Owner name\", DEFAULT_OWNER_NAME)\n .option(\"--owner-email <email>\", \"Owner email\", DEFAULT_OWNER_EMAIL)\n .option(\"-v, --verbose\", \"Enable verbose logging\", false)\n .configureOutput({\n writeErr: (str) => console.error(pc.red(str)),\n })\n .showHelpAfterError(true)\n .action(async (options) => {\n const s = p.spinner();\n setVerbose(options.verbose);\n\n const projectRoot = process.cwd();\n const pluginsDir = path.resolve(projectRoot, options.pluginsDir);\n const outputPath = path.resolve(projectRoot, options.output);\n\n console.log(`\\nGenerating marketplace.json`);\n console.log(` Plugins directory: ${pc.cyan(pluginsDir)}`);\n console.log(` Output file: ${pc.cyan(outputPath)}\\n`);\n\n try {\n s.start(\"Scanning plugins...\");\n\n const marketplace = await generateMarketplace(pluginsDir, {\n name: options.name,\n version: options.version,\n description: options.description,\n ownerName: options.ownerName,\n ownerEmail: options.ownerEmail,\n pluginRoot: `./${options.pluginsDir}`,\n });\n\n const stats = getMarketplaceStats(marketplace);\n s.stop(`Found ${stats.total} plugins`);\n\n console.log(`\\nCategory breakdown:`);\n const sortedCategories = Object.entries(stats.byCategory).sort(\n ([, a], [, b]) => b - a,\n );\n for (const [category, count] of sortedCategories) {\n console.log(` ${pc.dim(category)}: ${count}`);\n }\n\n s.start(\"Writing marketplace.json...\");\n await writeMarketplace(outputPath, marketplace);\n s.stop(`Wrote ${outputPath}`);\n\n console.log(`\\nSample plugins:`);\n const sampleSize = 5;\n for (const plugin of marketplace.plugins.slice(0, sampleSize)) {\n const version = plugin.version ? pc.cyan(`v${plugin.version}`) : \"\";\n const category = plugin.category ? pc.dim(`[${plugin.category}]`) : \"\";\n console.log(` ${pc.green(plugin.name)} ${version} ${category}`);\n if (plugin.description) {\n console.log(` ${pc.dim(plugin.description)}`);\n }\n }\n if (marketplace.plugins.length > sampleSize) {\n console.log(\n ` ${pc.dim(`... and ${marketplace.plugins.length - sampleSize} more`)}`,\n );\n }\n\n p.outro(pc.green(`Marketplace generated with ${stats.total} plugins!`));\n } catch (error) {\n s.stop(\"Generation failed\");\n p.log.error(String(error));\n process.exit(EXIT_CODES.ERROR);\n }\n });\n","import path from \"path\";\nimport { readFile, writeFile, glob, ensureDir } from \"../utils/fs\";\nimport { verbose } from \"../utils/logger\";\nimport type {\n Marketplace,\n MarketplacePlugin,\n PluginManifest,\n} from \"../../types\";\n\nconst PLUGIN_MANIFEST_PATH = \".claude-plugin/plugin.json\";\nconst MARKETPLACE_SCHEMA_URL =\n \"https://anthropic.com/claude-code/marketplace.schema.json\";\n\nconst CATEGORY_PATTERNS: Array<{ pattern: RegExp; category: string }> = [\n { pattern: /^skill-setup-/, category: \"setup\" },\n { pattern: /^skill-backend-/, category: \"backend\" },\n { pattern: /^skill-frontend-/, category: \"frontend\" },\n { pattern: /^skill-cli-/, category: \"cli\" },\n // CLI-specific technologies\n {\n pattern: /^skill-(commander|clack|inquirer|ora|chalk|picocolors)/,\n category: \"cli\",\n },\n // These patterns match common backend technologies\n {\n pattern: /^skill-(express|fastify|hono|drizzle|prisma)/,\n category: \"backend\",\n },\n { pattern: /^skill-better-auth/, category: \"backend\" },\n // Frontend frameworks and libraries\n {\n pattern: /^skill-(react|vue|angular|solid|next|nuxt|remix)/,\n category: \"frontend\",\n },\n { pattern: /^skill-(tailwind|scss|cva|shadcn|radix)/, category: \"frontend\" },\n {\n pattern: /^skill-(framer-motion|css-animations|view-transitions)/,\n category: \"frontend\",\n },\n {\n pattern: /^skill-(zustand|mobx|redux|jotai|pinia|ngrx)/,\n category: \"frontend\",\n },\n // Testing\n {\n pattern: /^skill-(vitest|cypress|playwright|jest|testing)/,\n category: \"testing\",\n },\n { pattern: /^skill-(react-testing|vue-test|karma)/, category: \"testing\" },\n // API/Data\n {\n pattern: /^skill-(react-query|swr|trpc|graphql|msw|mocks)/,\n category: \"api\",\n },\n { pattern: /^skill-(websockets|socket-io|sse)/, category: \"api\" },\n // Observability\n { pattern: /^skill-(posthog|axiom|pino|sentry)/, category: \"observability\" },\n // Mobile\n { pattern: /^skill-(expo|react-native)/, category: \"mobile\" },\n // DevOps/CI\n { pattern: /^skill-github-actions/, category: \"devops\" },\n // Tooling\n { pattern: /^skill-(turborepo|storybook|tooling)/, category: \"tooling\" },\n // Security\n { pattern: /^skill-security/, category: \"security\" },\n { pattern: /^skill-(react-hook-form|vee-validate|zod)/, category: \"forms\" },\n { pattern: /^skill-(react-intl|next-intl|vue-i18n)/, category: \"i18n\" },\n];\n\nexport interface MarketplaceOptions {\n name: string;\n version?: string;\n description?: string;\n ownerName: string;\n ownerEmail?: string;\n pluginRoot: string;\n}\n\nfunction inferCategory(pluginName: string): string | undefined {\n for (const { pattern, category } of CATEGORY_PATTERNS) {\n if (pattern.test(pluginName)) {\n return category;\n }\n }\n return undefined;\n}\n\nasync function readPluginManifest(\n pluginDir: string,\n): Promise<PluginManifest | null> {\n const manifestPath = path.join(pluginDir, PLUGIN_MANIFEST_PATH);\n\n try {\n const content = await readFile(manifestPath);\n return JSON.parse(content) as PluginManifest;\n } catch {\n return null;\n }\n}\n\nfunction toMarketplacePlugin(\n manifest: PluginManifest,\n pluginRoot: string,\n pluginDirName: string,\n): MarketplacePlugin {\n const category = inferCategory(manifest.name);\n\n const plugin: MarketplacePlugin = {\n name: manifest.name,\n source: `./${pluginRoot}/${pluginDirName}`,\n description: manifest.description,\n version: manifest.version,\n author: manifest.author,\n keywords: manifest.keywords,\n };\n\n if (category) {\n plugin.category = category;\n }\n\n return plugin;\n}\n\nexport async function generateMarketplace(\n pluginsDir: string,\n options: MarketplaceOptions,\n): Promise<Marketplace> {\n verbose(`Scanning plugins directory: ${pluginsDir}`);\n\n const manifestFiles = await glob(`**/${PLUGIN_MANIFEST_PATH}`, pluginsDir);\n verbose(`Found ${manifestFiles.length} plugin manifests`);\n\n const plugins: MarketplacePlugin[] = [];\n\n for (const manifestFile of manifestFiles) {\n const pluginDirName = manifestFile.split(\"/\")[0];\n const pluginDir = path.join(pluginsDir, pluginDirName);\n\n const manifest = await readPluginManifest(pluginDir);\n if (!manifest) {\n verbose(` [WARN] Could not read manifest: ${manifestFile}`);\n continue;\n }\n\n const plugin = toMarketplacePlugin(\n manifest,\n options.pluginRoot.replace(/^\\.\\//, \"\"),\n pluginDirName,\n );\n plugins.push(plugin);\n verbose(` [OK] ${plugin.name}`);\n }\n\n plugins.sort((a, b) => a.name.localeCompare(b.name));\n\n const marketplace: Marketplace = {\n $schema: MARKETPLACE_SCHEMA_URL,\n name: options.name,\n version: options.version ?? \"1.0.0\",\n owner: {\n name: options.ownerName,\n },\n metadata: {\n pluginRoot: options.pluginRoot,\n },\n plugins,\n };\n\n if (options.description) {\n marketplace.description = options.description;\n }\n\n if (options.ownerEmail) {\n marketplace.owner.email = options.ownerEmail;\n }\n\n return marketplace;\n}\n\nexport async function writeMarketplace(\n outputPath: string,\n marketplace: Marketplace,\n): Promise<void> {\n await ensureDir(path.dirname(outputPath));\n const content = JSON.stringify(marketplace, null, 2) + \"\\n\";\n await writeFile(outputPath, content);\n}\n\nexport function getMarketplaceStats(marketplace: Marketplace): {\n total: number;\n byCategory: Record<string, number>;\n} {\n const byCategory: Record<string, number> = {};\n\n for (const plugin of marketplace.plugins) {\n const category = plugin.category ?? \"uncategorized\";\n byCategory[category] = (byCategory[category] ?? 0) + 1;\n }\n\n return {\n total: marketplace.plugins.length,\n byCategory,\n };\n}\n","import { Command } from \"commander\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport path from \"path\";\nimport { stringify as stringifyYaml } from \"yaml\";\nimport { LOCAL_SKILLS_PATH } from \"../consts\";\nimport { ensureDir, writeFile, directoryExists } from \"../utils/fs\";\nimport {\n runWizard,\n clearTerminal,\n renderSelectionsHeader,\n} from \"../lib/wizard\";\nimport {\n loadSkillsMatrixFromSource,\n type SourceLoadResult,\n} from \"../lib/source-loader\";\nimport { formatSourceOrigin } from \"../lib/config\";\nimport { copySkillsToLocalFlattened } from \"../lib/skill-copier\";\nimport { checkPermissions } from \"../lib/permission-checker\";\nimport { loadAllAgents, loadStack } from \"../lib/loader\";\nimport { resolveAgents, resolveStackSkills } from \"../lib/resolver\";\nimport { compileAgentForPlugin } from \"../lib/stack-plugin-compiler\";\nimport { installStackAsPlugin } from \"../lib/stack-installer\";\nimport { getCollectivePluginDir } from \"../lib/plugin-finder\";\nimport { createLiquidEngine } from \"../lib/compiler\";\nimport {\n generateConfigFromSkills,\n generateConfigFromStack,\n} from \"../lib/config-generator\";\nimport { EXIT_CODES } from \"../lib/exit-codes\";\nimport type {\n CompileConfig,\n CompileAgentConfig,\n StackConfig,\n} from \"../../types\";\n\nconst PLUGIN_NAME = \"claude-collective\";\n\nexport const initCommand = new Command(\"init\")\n .description(\"Initialize Claude Collective in this project\")\n .option(\n \"--source <url>\",\n \"Skills source URL (e.g., github:org/repo or local path)\",\n )\n .option(\"--refresh\", \"Force refresh from remote source\", false)\n .configureOutput({\n writeErr: (str) => console.error(pc.red(str)),\n })\n .showHelpAfterError(true)\n .action(async (options, command) => {\n const dryRun = command.optsWithGlobals().dryRun ?? false;\n const projectDir = process.cwd();\n\n p.intro(pc.cyan(\"Claude Collective Setup\"));\n\n if (dryRun) {\n p.log.info(\n pc.yellow(\"[dry-run] Preview mode - no files will be created\"),\n );\n }\n\n const s = p.spinner();\n\n const pluginDir = getCollectivePluginDir();\n const pluginExists = await directoryExists(pluginDir);\n\n if (pluginExists) {\n p.log.warn(\n `Claude Collective is already initialized at ${pc.cyan(pluginDir)}`,\n );\n p.log.info(`Use ${pc.cyan(\"cc edit\")} to modify skills.`);\n p.outro(pc.dim(\"No changes made.\"));\n return;\n }\n\n s.start(\"Loading skills matrix...\");\n\n let sourceResult: SourceLoadResult;\n try {\n sourceResult = await loadSkillsMatrixFromSource({\n sourceFlag: options.source,\n projectDir,\n forceRefresh: options.refresh,\n });\n\n const sourceInfo = sourceResult.isLocal\n ? \"local\"\n : formatSourceOrigin(sourceResult.sourceConfig.sourceOrigin);\n s.stop(\n `Loaded ${Object.keys(sourceResult.matrix.skills).length} skills (${sourceInfo})`,\n );\n } catch (error) {\n s.stop(\"Failed to load skills matrix\");\n p.log.error(\n error instanceof Error ? error.message : \"Unknown error occurred\",\n );\n process.exit(EXIT_CODES.ERROR);\n }\n\n const matrix = sourceResult.matrix;\n const result = await runWizard(matrix);\n\n if (!result) {\n p.cancel(\"Setup cancelled\");\n process.exit(EXIT_CODES.CANCELLED);\n }\n\n if (!result.validation.valid) {\n p.log.error(\"Selection has validation errors:\");\n for (const error of result.validation.errors) {\n p.log.error(` ${error.message}`);\n }\n process.exit(EXIT_CODES.ERROR);\n }\n\n clearTerminal();\n renderSelectionsHeader(result.selectedSkills, matrix);\n\n if (result.validation.warnings.length > 0) {\n console.log(pc.yellow(\"Warnings:\"));\n for (const warning of result.validation.warnings) {\n console.log(` ${pc.yellow(\"!\")} ${warning.message}`);\n }\n console.log(\"\");\n }\n\n p.log.info(\n `Install mode: ${pc.cyan(result.installMode === \"plugin\" ? \"Plugin (native install)\" : \"Local (copy to .claude/skills/)\")}`,\n );\n\n if (dryRun) {\n if (result.installMode === \"plugin\" && result.selectedStack) {\n // Plugin Mode with stack: install entire stack as ONE plugin\n p.log.info(\n pc.yellow(\n `[dry-run] Would install stack \"${result.selectedStack.id}\" as a native plugin`,\n ),\n );\n p.log.info(\n pc.yellow(\n `[dry-run] claude plugin install ./compiled-stack/${result.selectedStack.id} --scope project`,\n ),\n );\n p.log.info(\n pc.yellow(\n `[dry-run] Stack includes ${result.selectedSkills.length} skills and agents bundled together`,\n ),\n );\n } else {\n // Local Mode (or Plugin Mode fallback when no stack selected)\n if (result.installMode === \"plugin\") {\n p.log.info(\n pc.yellow(\n `[dry-run] Individual skill plugin installation not yet supported`,\n ),\n );\n p.log.info(pc.yellow(`[dry-run] Would fall back to Local Mode...`));\n }\n const localSkillsDir = path.join(projectDir, LOCAL_SKILLS_PATH);\n const localAgentsDir = path.join(projectDir, \".claude\", \"agents\");\n p.log.info(\n pc.yellow(\n `[dry-run] Would copy ${result.selectedSkills.length} skills to ${localSkillsDir}`,\n ),\n );\n p.log.info(\n pc.yellow(`[dry-run] Would compile agents to ${localAgentsDir}`),\n );\n p.log.info(\n pc.yellow(`[dry-run] Would save config to .claude/config.yaml`),\n );\n }\n p.outro(pc.green(\"[dry-run] Preview complete - no files were created\"));\n return;\n }\n\n if (result.installMode === \"plugin\") {\n // Plugin Mode: Install stack as ONE native plugin\n if (result.selectedStack) {\n s.start(\n `Compiling and installing stack \"${result.selectedStack.id}\"...`,\n );\n\n try {\n const installResult = await installStackAsPlugin({\n stackId: result.selectedStack.id,\n projectDir,\n sourcePath: sourceResult.sourcePath,\n agentSourcePath: sourceResult.sourcePath,\n });\n\n s.stop(`Installed stack plugin: ${installResult.pluginName}`);\n\n console.log(\"\");\n console.log(pc.green(\"Claude Collective initialized successfully!\"));\n console.log(\"\");\n console.log(\n `Stack ${pc.cyan(`\"${installResult.stackName}\"`)} installed as plugin`,\n );\n console.log(\"\");\n console.log(pc.dim(\"Agents included:\"));\n for (const agentName of installResult.agents) {\n console.log(` ${pc.cyan(agentName)}`);\n }\n console.log(\"\");\n console.log(pc.dim(`Skills bundled: ${installResult.skills.length}`));\n console.log(\"\");\n\n p.outro(pc.green(\"Claude Collective is ready to use!\"));\n\n await checkPermissions(projectDir);\n return;\n } catch (error) {\n s.stop(\"Installation failed\");\n p.log.error(error instanceof Error ? error.message : \"Unknown error\");\n process.exit(EXIT_CODES.ERROR);\n }\n } else {\n // No stack selected - individual skill installation not yet supported\n // TODO: Support installing individual skills as separate plugins\n p.log.warn(\n \"Individual skill plugin installation not yet supported in Plugin Mode.\",\n );\n p.log.info(\n `Falling back to Local Mode (copying to ${pc.cyan(\".claude/skills/\")})...`,\n );\n p.log.info(\n pc.dim(\n \"To use Plugin Mode, select a pre-built stack instead of individual skills.\",\n ),\n );\n console.log(\"\");\n // Fall through to Local Mode below\n }\n }\n\n const localSkillsDir = path.join(projectDir, LOCAL_SKILLS_PATH);\n const localAgentsDir = path.join(projectDir, \".claude\", \"agents\");\n const localConfigPath = path.join(projectDir, \".claude\", \"config.yaml\");\n\n s.start(\"Copying skills to local directory...\");\n try {\n await ensureDir(localSkillsDir);\n await ensureDir(localAgentsDir);\n\n const copiedSkills = await copySkillsToLocalFlattened(\n result.selectedSkills,\n localSkillsDir,\n matrix,\n sourceResult,\n );\n\n s.stop(`Copied ${copiedSkills.length} skills to .claude/skills/`);\n\n s.start(\"Generating configuration...\");\n\n const agents = await loadAllAgents(sourceResult.sourcePath);\n\n const localSkillsForResolution: Record<\n string,\n {\n id: string;\n name: string;\n description: string;\n canonicalId: string;\n path: string;\n content: string;\n }\n > = {};\n for (const copiedSkill of copiedSkills) {\n const skill = matrix.skills[copiedSkill.skillId];\n if (skill) {\n localSkillsForResolution[copiedSkill.skillId] = {\n id: copiedSkill.skillId,\n name: skill.name,\n description: skill.description || \"\",\n canonicalId: copiedSkill.skillId,\n path: copiedSkill.destPath,\n content: \"\", // Content not needed for skill references\n };\n }\n }\n\n let localConfig: StackConfig;\n if (result.selectedStack) {\n const loadedStackConfig = await loadStack(\n result.selectedStack.id,\n sourceResult.sourcePath,\n \"dev\",\n );\n localConfig = generateConfigFromStack(loadedStackConfig);\n } else {\n localConfig = generateConfigFromSkills(\n result.selectedSkills,\n sourceResult.matrix,\n );\n }\n\n const configYaml = stringifyYaml(localConfig, {\n indent: 2,\n lineWidth: 120,\n });\n await writeFile(localConfigPath, configYaml);\n\n s.stop(`Configuration saved (${localConfig.agents.length} agents)`);\n\n s.start(\"Compiling agents...\");\n\n const compileAgents: Record<string, CompileAgentConfig> = {};\n for (const agentId of localConfig.agents) {\n if (agents[agentId]) {\n if (localConfig.agent_skills?.[agentId]) {\n const skillRefs = resolveStackSkills(\n localConfig,\n agentId,\n localSkillsForResolution,\n );\n compileAgents[agentId] = { skills: skillRefs };\n } else {\n compileAgents[agentId] = {};\n }\n }\n }\n\n const compileConfig: CompileConfig = {\n name: PLUGIN_NAME,\n description:\n localConfig.description ||\n `Local setup with ${result.selectedSkills.length} skills`,\n claude_md: \"\",\n agents: compileAgents,\n };\n\n const engine = await createLiquidEngine(projectDir);\n const resolvedAgents = await resolveAgents(\n agents,\n localSkillsForResolution,\n compileConfig,\n sourceResult.sourcePath,\n );\n\n const compiledAgentNames: string[] = [];\n for (const [name, agent] of Object.entries(resolvedAgents)) {\n const output = await compileAgentForPlugin(\n name,\n agent,\n sourceResult.sourcePath,\n engine,\n );\n await writeFile(path.join(localAgentsDir, `${name}.md`), output);\n compiledAgentNames.push(name);\n }\n\n s.stop(`Compiled ${compiledAgentNames.length} agents to .claude/agents/`);\n\n console.log(\"\");\n console.log(pc.green(\"Claude Collective initialized successfully!\"));\n console.log(\"\");\n console.log(pc.dim(\"Skills copied to:\"));\n console.log(` ${pc.cyan(localSkillsDir)}`);\n for (const copiedSkill of copiedSkills) {\n const skill = matrix.skills[copiedSkill.skillId];\n const displayName = skill?.alias || copiedSkill.skillId;\n console.log(` ${pc.dim(displayName + \"/\")}`);\n }\n console.log(\"\");\n console.log(pc.dim(\"Agents compiled to:\"));\n console.log(` ${pc.cyan(localAgentsDir)}`);\n for (const agentName of compiledAgentNames) {\n console.log(` ${pc.dim(`${agentName}.md`)}`);\n }\n console.log(\"\");\n console.log(pc.dim(\"Configuration:\"));\n console.log(` ${pc.cyan(localConfigPath)}`);\n console.log(\"\");\n console.log(pc.dim(\"To customize agent-skill assignments:\"));\n console.log(` ${pc.cyan(\"1.\")} Edit ${pc.cyan(\".claude/config.yaml\")}`);\n console.log(\n ` ${pc.cyan(\"2.\")} Run ${pc.cyan(\"cc compile\")} to regenerate agents`,\n );\n console.log(\"\");\n\n p.outro(pc.green(\"Claude Collective is ready to use!\"));\n\n await checkPermissions(projectDir);\n } catch (error) {\n s.stop(\"Failed to initialize local mode\");\n p.log.error(`Error: ${error}`);\n process.exit(EXIT_CODES.ERROR);\n }\n });\n","import * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport type {\n MergedSkillsMatrix,\n ResolvedStack,\n SkillOption,\n SelectionValidation,\n} from \"../types-matrix\";\nimport {\n getTopLevelCategories,\n getSubcategories,\n getAvailableSkills,\n validateSelection,\n isCategoryAllDisabled,\n getDependentSkills,\n resolveAlias,\n type SkillCheckOptions,\n} from \"./matrix-resolver\";\n\nconst BACK_VALUE = \"__back__\";\nconst CONTINUE_VALUE = \"__continue__\";\nconst EXPERT_MODE_VALUE = \"__expert_mode__\";\nconst INSTALL_MODE_VALUE = \"__install_mode__\";\n\ntype WizardStep =\n | \"approach\"\n | \"stack\"\n | \"stack_review\"\n | \"category\"\n | \"subcategory\"\n | \"confirm\";\n\ninterface WizardState {\n currentStep: WizardStep;\n selectedSkills: string[];\n history: WizardStep[];\n currentTopCategory: string | null;\n currentSubcategory: string | null;\n visitedCategories: Set<string>;\n selectedStack: ResolvedStack | null;\n lastSelectedCategory: string | null;\n lastSelectedSubcategory: string | null;\n lastSelectedSkill: string | null;\n expertMode: boolean;\n installMode: \"plugin\" | \"local\";\n}\n\nexport interface WizardResult {\n selectedSkills: string[];\n selectedStack: ResolvedStack | null;\n validation: SelectionValidation;\n installMode: \"plugin\" | \"local\";\n}\n\ninterface WizardOptions {\n initialSkills?: string[];\n hasLocalSkills?: boolean;\n}\n\nfunction createInitialState(options: WizardOptions = {}): WizardState {\n const hasInitialSkills =\n options.initialSkills && options.initialSkills.length > 0;\n\n return {\n currentStep: hasInitialSkills ? \"category\" : \"approach\",\n selectedSkills: options.initialSkills ? [...options.initialSkills] : [],\n history: [],\n currentTopCategory: null,\n currentSubcategory: null,\n visitedCategories: new Set(),\n selectedStack: null,\n lastSelectedCategory: null,\n lastSelectedSubcategory: null,\n lastSelectedSkill: null,\n expertMode: options.hasLocalSkills ?? false,\n installMode: \"plugin\",\n };\n}\n\nfunction pushHistory(state: WizardState): void {\n state.history.push(state.currentStep);\n}\n\nfunction popHistory(state: WizardState): WizardStep | null {\n return state.history.pop() || null;\n}\n\nfunction collectAllDependents(\n skillId: string,\n currentSelections: string[],\n matrix: MergedSkillsMatrix,\n): string[] {\n const allDependents: string[] = [];\n const visited = new Set<string>();\n const queue = [skillId];\n\n while (queue.length > 0) {\n const current = queue.shift()!;\n if (visited.has(current)) continue;\n visited.add(current);\n\n const directDependents = getDependentSkills(\n current,\n currentSelections,\n matrix,\n );\n\n for (const dependent of directDependents) {\n if (!visited.has(dependent) && !allDependents.includes(dependent)) {\n allDependents.push(dependent);\n queue.push(dependent);\n }\n }\n }\n\n return allDependents;\n}\n\nexport function clearTerminal(): void {\n process.stdout.write(\"\\x1B[2J\\x1B[0f\");\n}\n\nexport function renderSelectionsHeader(\n selectedSkills: string[],\n matrix: MergedSkillsMatrix,\n): void {\n if (selectedSkills.length === 0) {\n return;\n }\n\n const byCategory: Record<string, string[]> = {};\n\n for (const skillId of selectedSkills) {\n const skill = matrix.skills[skillId];\n if (!skill) continue;\n\n const category = matrix.categories[skill.category];\n const topCategory = category?.parent || skill.category;\n const topCategoryDef = matrix.categories[topCategory];\n const categoryName = topCategoryDef?.name || topCategory;\n\n if (!byCategory[categoryName]) {\n byCategory[categoryName] = [];\n }\n byCategory[categoryName].push(skill.alias || skill.name);\n }\n\n console.log(\"\\n\" + pc.dim(\"─\".repeat(50)));\n console.log(pc.bold(\" Selected:\"));\n for (const [category, skills] of Object.entries(byCategory)) {\n console.log(` ${pc.cyan(category)}: ${skills.join(\", \")}`);\n }\n console.log(pc.dim(\"─\".repeat(50)) + \"\\n\");\n}\n\nfunction showSelectionsHeader(\n state: WizardState,\n matrix: MergedSkillsMatrix,\n): void {\n renderSelectionsHeader(state.selectedSkills, matrix);\n}\n\nfunction formatSkillOption(option: SkillOption): {\n value: string;\n label: string;\n hint?: string;\n} {\n let label = option.name;\n const hint: string | undefined = option.description;\n\n if (option.selected) {\n label = pc.green(`✓ ${option.name}`);\n } else if (option.disabled) {\n const shortReason =\n option.disabledReason?.split(\" (\")[0]?.toLowerCase() ||\n \"requirements not met\";\n label = pc.dim(`${option.name} (disabled, ${shortReason})`);\n } else if (option.discouraged) {\n label = `${option.name} (not recommended)`;\n } else if (option.recommended) {\n label = `${option.name} ${pc.green(\"(recommended)\")}`;\n }\n\n return {\n value: option.id,\n label,\n hint,\n };\n}\n\nfunction formatStackOption(stack: ResolvedStack): {\n value: string;\n label: string;\n hint: string;\n} {\n return {\n value: stack.id,\n label: stack.name,\n hint: stack.description,\n };\n}\n\nfunction formatExpertModeOption(expertMode: boolean): {\n value: string;\n label: string;\n hint: string;\n} {\n if (expertMode) {\n return {\n value: EXPERT_MODE_VALUE,\n label: pc.yellow(\"Expert Mode: ON\"),\n hint: \"click to disable - currently allowing any skill combination\",\n };\n }\n return {\n value: EXPERT_MODE_VALUE,\n label: pc.dim(\"Expert Mode: OFF\"),\n hint: \"click to enable - allows combining conflicting skills\",\n };\n}\n\nfunction formatInstallModeOption(installMode: \"plugin\" | \"local\"): {\n value: string;\n label: string;\n hint: string;\n} {\n if (installMode === \"plugin\") {\n return {\n value: INSTALL_MODE_VALUE,\n label: pc.cyan(\"Install Mode: Plugin\"),\n hint: \"click to switch - installs as native Claude plugins (recommended)\",\n };\n }\n return {\n value: INSTALL_MODE_VALUE,\n label: pc.dim(\"Install Mode: Local\"),\n hint: \"click to switch - copies skills to .claude/skills/ for customization\",\n };\n}\n\nasync function stepApproach(state: WizardState): Promise<string | symbol> {\n clearTerminal();\n\n const statusLines: string[] = [];\n if (state.expertMode) {\n statusLines.push(\n pc.yellow(\"Expert Mode is ON\") + pc.dim(\" - conflict checking disabled\"),\n );\n }\n statusLines.push(\n pc.cyan(\n `Install Mode: ${state.installMode === \"plugin\" ? \"Plugin\" : \"Local\"}`,\n ) +\n pc.dim(\n state.installMode === \"plugin\"\n ? \" - native Claude plugins\"\n : \" - copy to .claude/skills/\",\n ),\n );\n\n if (statusLines.length > 0) {\n console.log(\"\\n \" + statusLines.join(\"\\n \") + \"\\n\");\n }\n\n const result = await p.select({\n message: \"How would you like to set up your stack?\",\n options: [\n {\n value: \"stack\",\n label: \"Use a pre-built template\",\n hint: \"recommended - quickly get started with a curated selection\",\n },\n {\n value: \"scratch\",\n label: \"Start from scratch\",\n hint: \"choose each skill yourself\",\n },\n formatExpertModeOption(state.expertMode),\n formatInstallModeOption(state.installMode),\n ],\n });\n\n return result as string | symbol;\n}\n\nasync function stepSelectStack(\n state: WizardState,\n matrix: MergedSkillsMatrix,\n): Promise<string | symbol> {\n clearTerminal();\n showSelectionsHeader(state, matrix);\n const options = matrix.suggestedStacks.map(formatStackOption);\n\n const result = await p.select({\n message: \"Select a stack:\",\n options: [{ value: BACK_VALUE, label: pc.dim(\"Back\") }, ...options],\n });\n\n return result as string | symbol;\n}\n\nconst EDIT_VALUE = \"__edit__\";\nconst CONFIRM_VALUE = \"__confirm__\";\n\nasync function stepStackReview(\n state: WizardState,\n matrix: MergedSkillsMatrix,\n): Promise<string | symbol> {\n clearTerminal();\n showSelectionsHeader(state, matrix);\n\n const result = await p.select({\n message: \"What would you like to do?\",\n options: [\n { value: BACK_VALUE, label: pc.dim(\"Back\") },\n { value: EDIT_VALUE, label: \"Edit selections\" },\n {\n value: CONFIRM_VALUE,\n label: pc.green(\"Confirm and continue (recommended)\"),\n },\n ],\n });\n\n return result as string | symbol;\n}\n\nasync function stepSelectTopCategory(\n state: WizardState,\n matrix: MergedSkillsMatrix,\n): Promise<string | symbol> {\n clearTerminal();\n showSelectionsHeader(state, matrix);\n const topCategories = getTopLevelCategories(matrix);\n const unvisitedCategories = topCategories.filter(\n (catId) => !state.visitedCategories.has(catId),\n );\n\n const categoryOptions = topCategories.map((catId) => {\n const cat = matrix.categories[catId];\n return {\n value: catId,\n label: cat.name,\n };\n });\n\n const topNavOptions: Array<{\n value: string;\n label: string;\n hint?: string;\n }> = [{ value: BACK_VALUE, label: pc.dim(\"Back\") }];\n\n const bottomNavOptions: Array<{\n value: string;\n label: string;\n hint?: string;\n }> = [];\n\n if (state.selectedSkills.length > 0) {\n bottomNavOptions.push({\n value: CONTINUE_VALUE,\n label: pc.green(\"Continue\"),\n });\n }\n\n const result = await p.select({\n message: `Select a category to configure (${unvisitedCategories.length} remaining):`,\n options: [...topNavOptions, ...categoryOptions, ...bottomNavOptions],\n initialValue: state.lastSelectedCategory || undefined,\n });\n\n return result as string | symbol;\n}\n\nasync function stepSelectSubcategory(\n state: WizardState,\n matrix: MergedSkillsMatrix,\n): Promise<string | symbol> {\n clearTerminal();\n showSelectionsHeader(state, matrix);\n const topCategory = state.currentTopCategory;\n if (!topCategory) {\n return BACK_VALUE;\n }\n\n const subcategories = getSubcategories(topCategory, matrix);\n const topCat = matrix.categories[topCategory];\n const checkOptions: SkillCheckOptions = { expertMode: state.expertMode };\n\n const subcategoryOptions = subcategories.map((subId) => {\n const sub = matrix.categories[subId];\n const skills = getAvailableSkills(\n subId,\n state.selectedSkills,\n matrix,\n checkOptions,\n );\n const selectedInCategory = skills.filter((s) => s.selected);\n const hasSelection = selectedInCategory.length > 0;\n\n const categoryDisabled = isCategoryAllDisabled(\n subId,\n state.selectedSkills,\n matrix,\n checkOptions,\n );\n\n let label: string;\n if (hasSelection) {\n label = `${sub.name} ${pc.green(`(${selectedInCategory[0].name} selected)`)}`;\n } else if (categoryDisabled.disabled) {\n const shortReason =\n categoryDisabled.reason?.toLowerCase() || \"requirements not met\";\n label = pc.dim(`${sub.name} (disabled, ${shortReason})`);\n } else if (sub.required) {\n label = `${sub.name} ${pc.yellow(\"(required)\")}`;\n } else {\n label = sub.name;\n }\n\n return {\n value: subId,\n label,\n };\n });\n\n const navigationOptions: Array<{\n value: string;\n label: string;\n hint?: string;\n }> = [{ value: BACK_VALUE, label: pc.dim(\"Back\") }];\n\n const result = await p.select({\n message: `${topCat.name} - Select a subcategory:`,\n options: [...navigationOptions, ...subcategoryOptions],\n initialValue: state.lastSelectedSubcategory || undefined,\n });\n\n return result as string | symbol;\n}\n\nasync function stepSelectSkill(\n state: WizardState,\n matrix: MergedSkillsMatrix,\n): Promise<string | symbol> {\n clearTerminal();\n showSelectionsHeader(state, matrix);\n const subcategoryId = state.currentSubcategory;\n if (!subcategoryId) {\n return BACK_VALUE;\n }\n\n const subcategory = matrix.categories[subcategoryId];\n const checkOptions: SkillCheckOptions = { expertMode: state.expertMode };\n const skills = getAvailableSkills(\n subcategoryId,\n state.selectedSkills,\n matrix,\n checkOptions,\n );\n\n const skillOptions = skills.map(formatSkillOption);\n\n const navigationOptions: Array<{\n value: string;\n label: string;\n hint?: string;\n }> = [{ value: BACK_VALUE, label: pc.dim(\"Back\") }];\n\n const allOptions = [...navigationOptions, ...skillOptions];\n\n const result = await p.select({\n message: `${subcategory.name}:`,\n options: allOptions,\n initialValue: state.lastSelectedSkill || undefined,\n });\n\n return result as string | symbol;\n}\n\nasync function stepConfirm(\n state: WizardState,\n matrix: MergedSkillsMatrix,\n): Promise<string | symbol> {\n clearTerminal();\n\n console.log(\"\\n\" + pc.bold(\"Selected Skills:\"));\n\n if (state.selectedSkills.length === 0) {\n console.log(pc.dim(\" No skills selected\"));\n } else {\n for (const skillId of state.selectedSkills) {\n const skill = matrix.skills[skillId];\n if (skill) {\n const category = matrix.categories[skill.category];\n console.log(\n ` ${pc.green(\"+\")} ${skill.name} ${pc.dim(`(${category?.name || skill.category})`)}`,\n );\n }\n }\n }\n\n const validation = validateSelection(state.selectedSkills, matrix);\n\n if (validation.errors.length > 0) {\n console.log(\"\\n\" + pc.red(pc.bold(\"Errors:\")));\n for (const error of validation.errors) {\n console.log(` ${pc.red(\"x\")} ${error.message}`);\n }\n }\n\n if (validation.warnings.length > 0) {\n console.log(\"\\n\" + pc.yellow(pc.bold(\"Warnings:\")));\n for (const warning of validation.warnings) {\n console.log(` ${pc.yellow(\"!\")} ${warning.message}`);\n }\n }\n\n console.log(\"\");\n\n const result = await p.select({\n message: validation.valid\n ? \"Confirm your selection?\"\n : \"Selection has errors. What would you like to do?\",\n options: [\n { value: BACK_VALUE, label: pc.dim(\"Back\") },\n ...(validation.valid\n ? [{ value: \"confirm\", label: pc.green(\"Confirm and continue\") }]\n : []),\n ],\n });\n\n return result as string | symbol;\n}\n\nexport async function runWizard(\n matrix: MergedSkillsMatrix,\n options: WizardOptions = {},\n): Promise<WizardResult | null> {\n const hasLocalSkills = Object.values(matrix.skills).some(\n (skill) => skill.local === true,\n );\n\n const state = createInitialState({\n ...options,\n hasLocalSkills,\n });\n\n if (hasLocalSkills && state.expertMode) {\n console.log(\n pc.yellow(\"\\n Local skills detected\") +\n pc.dim(\" - Expert Mode enabled (dependency checking disabled)\\n\"),\n );\n }\n\n while (true) {\n switch (state.currentStep) {\n case \"approach\": {\n const result = await stepApproach(state);\n\n if (p.isCancel(result)) {\n return null;\n }\n\n if (result === EXPERT_MODE_VALUE) {\n state.expertMode = !state.expertMode;\n break;\n }\n\n if (result === INSTALL_MODE_VALUE) {\n state.installMode =\n state.installMode === \"plugin\" ? \"local\" : \"plugin\";\n break;\n }\n\n if (result === \"stack\") {\n pushHistory(state);\n state.currentStep = \"stack\";\n } else {\n pushHistory(state);\n state.currentStep = \"category\";\n }\n break;\n }\n\n case \"stack\": {\n const result = await stepSelectStack(state, matrix);\n\n if (p.isCancel(result)) {\n return null;\n }\n\n if (result === BACK_VALUE) {\n state.currentStep = popHistory(state) || \"approach\";\n break;\n }\n\n const stack = matrix.suggestedStacks.find((s) => s.id === result);\n if (stack) {\n state.selectedStack = stack;\n state.selectedSkills = [...stack.allSkillIds];\n\n pushHistory(state);\n state.currentStep = \"stack_review\";\n }\n break;\n }\n\n case \"stack_review\": {\n const result = await stepStackReview(state, matrix);\n\n if (p.isCancel(result)) {\n return null;\n }\n\n if (result === BACK_VALUE) {\n state.selectedStack = null;\n state.selectedSkills = [];\n state.currentStep = popHistory(state) || \"stack\";\n break;\n }\n\n if (result === EDIT_VALUE) {\n pushHistory(state);\n state.currentStep = \"category\";\n break;\n }\n\n if (result === CONFIRM_VALUE) {\n pushHistory(state);\n state.currentStep = \"confirm\";\n break;\n }\n break;\n }\n\n case \"category\": {\n const result = await stepSelectTopCategory(state, matrix);\n\n if (p.isCancel(result)) {\n return null;\n }\n\n if (result === BACK_VALUE) {\n state.currentStep = popHistory(state) || \"approach\";\n break;\n }\n\n if (result === CONTINUE_VALUE) {\n state.lastSelectedCategory = CONTINUE_VALUE;\n pushHistory(state);\n state.currentStep = \"confirm\";\n break;\n }\n\n state.lastSelectedCategory = result as string;\n\n const subcategories = getSubcategories(result as string, matrix);\n if (subcategories.length > 0) {\n pushHistory(state);\n state.currentTopCategory = result as string;\n state.currentStep = \"subcategory\";\n } else {\n p.log.info(\n `${matrix.categories[result as string]?.name || result} has no subcategories`,\n );\n }\n break;\n }\n\n case \"subcategory\": {\n const result = await stepSelectSubcategory(state, matrix);\n\n if (p.isCancel(result)) {\n return null;\n }\n\n if (result === BACK_VALUE) {\n if (state.currentTopCategory) {\n state.visitedCategories.add(state.currentTopCategory);\n }\n state.currentTopCategory = null;\n state.lastSelectedSubcategory = null;\n state.currentStep = popHistory(state) || \"category\";\n break;\n }\n\n state.lastSelectedSubcategory = result as string;\n state.currentSubcategory = result as string;\n\n while (true) {\n const skillResult = await stepSelectSkill(state, matrix);\n\n if (p.isCancel(skillResult)) {\n return null;\n }\n\n if (skillResult === BACK_VALUE) {\n state.currentSubcategory = null;\n state.lastSelectedSkill = null;\n break;\n }\n\n const selectedSkillId = skillResult as string;\n state.lastSelectedSkill = selectedSkillId;\n\n const skillOptions = getAvailableSkills(\n state.currentSubcategory!,\n state.selectedSkills,\n matrix,\n );\n const selectedOption = skillOptions.find(\n (s) => s.id === selectedSkillId,\n );\n\n if (selectedOption?.disabled) {\n continue;\n }\n\n const subcategory = matrix.categories[state.currentSubcategory!];\n const alreadySelected =\n state.selectedSkills.includes(selectedSkillId);\n\n if (alreadySelected) {\n const allDependents = collectAllDependents(\n selectedSkillId,\n state.selectedSkills,\n matrix,\n );\n\n if (allDependents.length > 0) {\n const dependentNames = allDependents\n .map((id) => matrix.skills[id]?.name || id)\n .join(\", \");\n const skillName =\n matrix.skills[resolveAlias(selectedSkillId, matrix)]?.name ||\n selectedSkillId;\n\n const shouldDeselect = await p.confirm({\n message: `Deselecting ${skillName} will also remove: ${dependentNames}. Continue?`,\n initialValue: false,\n });\n\n if (p.isCancel(shouldDeselect) || !shouldDeselect) {\n continue;\n }\n\n const toRemove = new Set([selectedSkillId, ...allDependents]);\n state.selectedSkills = state.selectedSkills.filter(\n (id) => !toRemove.has(id),\n );\n } else {\n const index = state.selectedSkills.indexOf(selectedSkillId);\n if (index > -1) {\n state.selectedSkills.splice(index, 1);\n }\n }\n } else {\n if (subcategory?.exclusive) {\n state.selectedSkills = state.selectedSkills.filter((id) => {\n const skill = matrix.skills[id];\n return skill?.category !== state.currentSubcategory;\n });\n }\n state.selectedSkills.push(selectedSkillId);\n }\n }\n break;\n }\n\n case \"confirm\": {\n const result = await stepConfirm(state, matrix);\n\n if (p.isCancel(result)) {\n return null;\n }\n\n if (result === BACK_VALUE) {\n state.currentStep = popHistory(state) || \"category\";\n break;\n }\n\n if (result === \"confirm\") {\n const validation = validateSelection(state.selectedSkills, matrix);\n return {\n selectedSkills: state.selectedSkills,\n selectedStack: state.selectedStack,\n validation,\n installMode: state.installMode,\n };\n }\n break;\n }\n }\n }\n}\n","import type {\n MergedSkillsMatrix,\n ResolvedSkill,\n SkillOption,\n SelectionValidation,\n ValidationError,\n ValidationWarning,\n} from \"../types-matrix\";\n\nexport function resolveAlias(\n aliasOrId: string,\n matrix: MergedSkillsMatrix,\n): string {\n return matrix.aliases[aliasOrId] || aliasOrId;\n}\n\nexport function getDependentSkills(\n skillId: string,\n currentSelections: string[],\n matrix: MergedSkillsMatrix,\n): string[] {\n const fullId = resolveAlias(skillId, matrix);\n const skill = matrix.skills[fullId];\n\n if (!skill) return [];\n\n const resolvedSelections = currentSelections.map((s) =>\n resolveAlias(s, matrix),\n );\n const dependents: string[] = [];\n\n for (const selectedId of resolvedSelections) {\n if (selectedId === fullId) continue;\n\n const selectedSkill = matrix.skills[selectedId];\n if (!selectedSkill) continue;\n\n for (const requirement of selectedSkill.requires) {\n if (requirement.needsAny) {\n const satisfiedReqs = requirement.skillIds.filter((reqId) =>\n resolvedSelections.includes(reqId),\n );\n if (satisfiedReqs.length === 1 && satisfiedReqs[0] === fullId) {\n dependents.push(selectedId);\n }\n } else {\n if (requirement.skillIds.includes(fullId)) {\n dependents.push(selectedId);\n }\n }\n }\n }\n\n return dependents;\n}\n\nexport interface SkillCheckOptions {\n expertMode?: boolean;\n}\n\nexport function isDisabled(\n skillId: string,\n currentSelections: string[],\n matrix: MergedSkillsMatrix,\n options?: SkillCheckOptions,\n): boolean {\n if (options?.expertMode) {\n return false;\n }\n\n const fullId = resolveAlias(skillId, matrix);\n const skill = matrix.skills[fullId];\n\n if (!skill) {\n return false;\n }\n\n for (const selectedId of currentSelections) {\n const selectedFullId = resolveAlias(selectedId, matrix);\n\n if (skill.conflictsWith.some((c) => c.skillId === selectedFullId)) {\n return true;\n }\n\n const selectedSkill = matrix.skills[selectedFullId];\n if (\n selectedSkill &&\n selectedSkill.conflictsWith.some((c) => c.skillId === fullId)\n ) {\n return true;\n }\n }\n\n const resolvedSelections = currentSelections.map((s) =>\n resolveAlias(s, matrix),\n );\n\n for (const requirement of skill.requires) {\n if (requirement.needsAny) {\n const hasAny = requirement.skillIds.some((reqId) =>\n resolvedSelections.includes(reqId),\n );\n if (!hasAny) {\n return true;\n }\n } else {\n const hasAll = requirement.skillIds.every((reqId) =>\n resolvedSelections.includes(reqId),\n );\n if (!hasAll) {\n return true;\n }\n }\n }\n\n return false;\n}\n\nexport function getDisableReason(\n skillId: string,\n currentSelections: string[],\n matrix: MergedSkillsMatrix,\n): string | undefined {\n const fullId = resolveAlias(skillId, matrix);\n const skill = matrix.skills[fullId];\n\n if (!skill) {\n return undefined;\n }\n\n const resolvedSelections = currentSelections.map((s) =>\n resolveAlias(s, matrix),\n );\n\n for (const selectedId of resolvedSelections) {\n const conflict = skill.conflictsWith.find((c) => c.skillId === selectedId);\n if (conflict) {\n const selectedSkill = matrix.skills[selectedId];\n const selectedName = selectedSkill?.name || selectedId;\n return `${conflict.reason} (conflicts with ${selectedName})`;\n }\n\n const selectedSkill = matrix.skills[selectedId];\n if (selectedSkill) {\n const reverseConflict = selectedSkill.conflictsWith.find(\n (c) => c.skillId === fullId,\n );\n if (reverseConflict) {\n const selectedName = selectedSkill.name;\n return `${reverseConflict.reason} (conflicts with ${selectedName})`;\n }\n }\n }\n\n for (const requirement of skill.requires) {\n if (requirement.needsAny) {\n const hasAny = requirement.skillIds.some((reqId) =>\n resolvedSelections.includes(reqId),\n );\n if (!hasAny) {\n const requiredNames = requirement.skillIds\n .map((id) => matrix.skills[id]?.name || id)\n .join(\" or \");\n return `${requirement.reason} (requires ${requiredNames})`;\n }\n } else {\n const missingIds = requirement.skillIds.filter(\n (reqId) => !resolvedSelections.includes(reqId),\n );\n if (missingIds.length > 0) {\n const missingNames = missingIds\n .map((id) => matrix.skills[id]?.name || id)\n .join(\", \");\n return `${requirement.reason} (requires ${missingNames})`;\n }\n }\n }\n\n return undefined;\n}\n\nexport function isDiscouraged(\n skillId: string,\n currentSelections: string[],\n matrix: MergedSkillsMatrix,\n): boolean {\n const fullId = resolveAlias(skillId, matrix);\n const skill = matrix.skills[fullId];\n\n if (!skill) {\n return false;\n }\n\n const resolvedSelections = currentSelections.map((s) =>\n resolveAlias(s, matrix),\n );\n\n for (const selectedId of resolvedSelections) {\n const selectedSkill = matrix.skills[selectedId];\n if (\n selectedSkill &&\n selectedSkill.discourages.some((d) => d.skillId === fullId)\n ) {\n return true;\n }\n\n if (skill.discourages.some((d) => d.skillId === selectedId)) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function getDiscourageReason(\n skillId: string,\n currentSelections: string[],\n matrix: MergedSkillsMatrix,\n): string | undefined {\n const fullId = resolveAlias(skillId, matrix);\n const skill = matrix.skills[fullId];\n\n if (!skill) {\n return undefined;\n }\n\n const resolvedSelections = currentSelections.map((s) =>\n resolveAlias(s, matrix),\n );\n\n for (const selectedId of resolvedSelections) {\n const selectedSkill = matrix.skills[selectedId];\n if (selectedSkill) {\n const discourage = selectedSkill.discourages.find(\n (d) => d.skillId === fullId,\n );\n if (discourage) {\n return discourage.reason;\n }\n }\n\n const reverseDiscourage = skill.discourages.find(\n (d) => d.skillId === selectedId,\n );\n if (reverseDiscourage) {\n return reverseDiscourage.reason;\n }\n }\n\n return undefined;\n}\n\nexport function isRecommended(\n skillId: string,\n currentSelections: string[],\n matrix: MergedSkillsMatrix,\n): boolean {\n const fullId = resolveAlias(skillId, matrix);\n const skill = matrix.skills[fullId];\n\n if (!skill) {\n return false;\n }\n\n const resolvedSelections = currentSelections.map((s) =>\n resolveAlias(s, matrix),\n );\n\n for (const selectedId of resolvedSelections) {\n const selectedSkill = matrix.skills[selectedId];\n if (\n selectedSkill &&\n selectedSkill.recommends.some((r) => r.skillId === fullId)\n ) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function getRecommendReason(\n skillId: string,\n currentSelections: string[],\n matrix: MergedSkillsMatrix,\n): string | undefined {\n const fullId = resolveAlias(skillId, matrix);\n const skill = matrix.skills[fullId];\n\n if (!skill) {\n return undefined;\n }\n\n const resolvedSelections = currentSelections.map((s) =>\n resolveAlias(s, matrix),\n );\n\n for (const selectedId of resolvedSelections) {\n const selectedSkill = matrix.skills[selectedId];\n if (selectedSkill) {\n const recommendation = selectedSkill.recommends.find(\n (r) => r.skillId === fullId,\n );\n if (recommendation) {\n return `${recommendation.reason} (recommended by ${selectedSkill.name})`;\n }\n }\n }\n\n return undefined;\n}\n\nexport function validateSelection(\n selections: string[],\n matrix: MergedSkillsMatrix,\n): SelectionValidation {\n const errors: ValidationError[] = [];\n const warnings: ValidationWarning[] = [];\n const resolvedSelections = selections.map((s) => resolveAlias(s, matrix));\n\n for (let i = 0; i < resolvedSelections.length; i++) {\n const skillA = matrix.skills[resolvedSelections[i]];\n if (!skillA) continue;\n\n for (let j = i + 1; j < resolvedSelections.length; j++) {\n const skillBId = resolvedSelections[j];\n const conflict = skillA.conflictsWith.find((c) => c.skillId === skillBId);\n if (conflict) {\n errors.push({\n type: \"conflict\",\n message: `${skillA.name} conflicts with ${matrix.skills[skillBId]?.name || skillBId}: ${conflict.reason}`,\n skills: [skillA.id, skillBId],\n });\n }\n }\n }\n\n for (const skillId of resolvedSelections) {\n const skill = matrix.skills[skillId];\n if (!skill) continue;\n\n for (const requirement of skill.requires) {\n if (requirement.needsAny) {\n const hasAny = requirement.skillIds.some((reqId) =>\n resolvedSelections.includes(reqId),\n );\n if (!hasAny) {\n errors.push({\n type: \"missing_requirement\",\n message: `${skill.name} requires one of: ${requirement.skillIds.map((id) => matrix.skills[id]?.name || id).join(\", \")}`,\n skills: [skillId, ...requirement.skillIds],\n });\n }\n } else {\n const missingIds = requirement.skillIds.filter(\n (reqId) => !resolvedSelections.includes(reqId),\n );\n if (missingIds.length > 0) {\n errors.push({\n type: \"missing_requirement\",\n message: `${skill.name} requires: ${missingIds.map((id) => matrix.skills[id]?.name || id).join(\", \")}`,\n skills: [skillId, ...missingIds],\n });\n }\n }\n }\n }\n\n const categorySelections = new Map<string, string[]>();\n for (const skillId of resolvedSelections) {\n const skill = matrix.skills[skillId];\n if (!skill) continue;\n\n const existing = categorySelections.get(skill.category) || [];\n existing.push(skillId);\n categorySelections.set(skill.category, existing);\n }\n\n for (const [categoryId, skillIds] of categorySelections.entries()) {\n if (skillIds.length > 1) {\n const category = matrix.categories[categoryId];\n if (category?.exclusive) {\n errors.push({\n type: \"category_exclusive\",\n message: `Category \"${category.name}\" only allows one selection, but multiple selected: ${skillIds.map((id) => matrix.skills[id]?.name || id).join(\", \")}`,\n skills: skillIds,\n });\n }\n }\n }\n\n for (const skillId of resolvedSelections) {\n const skill = matrix.skills[skillId];\n if (!skill) continue;\n\n for (const recommendation of skill.recommends) {\n if (!resolvedSelections.includes(recommendation.skillId)) {\n const recommendedSkill = matrix.skills[recommendation.skillId];\n if (recommendedSkill) {\n const hasConflict = recommendedSkill.conflictsWith.some((c) =>\n resolvedSelections.includes(c.skillId),\n );\n if (!hasConflict) {\n warnings.push({\n type: \"missing_recommendation\",\n message: `${skill.name} recommends ${recommendedSkill.name}: ${recommendation.reason}`,\n skills: [skillId, recommendation.skillId],\n });\n }\n }\n }\n }\n }\n\n for (const skillId of resolvedSelections) {\n const skill = matrix.skills[skillId];\n if (!skill || skill.providesSetupFor.length === 0) continue;\n\n const hasUsageSkill = skill.providesSetupFor.some((usageId) =>\n resolvedSelections.includes(usageId),\n );\n if (!hasUsageSkill) {\n warnings.push({\n type: \"unused_setup\",\n message: `Setup skill \"${skill.name}\" selected but no corresponding usage skills: ${skill.providesSetupFor.map((id) => matrix.skills[id]?.name || id).join(\", \")}`,\n skills: [skillId, ...skill.providesSetupFor],\n });\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings,\n };\n}\n\nexport function getAvailableSkills(\n categoryId: string,\n currentSelections: string[],\n matrix: MergedSkillsMatrix,\n options?: SkillCheckOptions,\n): SkillOption[] {\n const skillOptions: SkillOption[] = [];\n const resolvedSelections = currentSelections.map((s) =>\n resolveAlias(s, matrix),\n );\n\n for (const skill of Object.values(matrix.skills)) {\n if (skill.category !== categoryId) {\n continue;\n }\n\n const disabled = isDisabled(skill.id, currentSelections, matrix, options);\n const discouraged =\n !disabled && isDiscouraged(skill.id, currentSelections, matrix);\n const recommended =\n !disabled &&\n !discouraged &&\n isRecommended(skill.id, currentSelections, matrix);\n\n skillOptions.push({\n id: skill.id,\n alias: skill.alias,\n name: skill.name,\n description: skill.description,\n disabled,\n disabledReason: disabled\n ? getDisableReason(skill.id, currentSelections, matrix)\n : undefined,\n discouraged,\n discouragedReason: discouraged\n ? getDiscourageReason(skill.id, currentSelections, matrix)\n : undefined,\n recommended,\n recommendedReason: recommended\n ? getRecommendReason(skill.id, currentSelections, matrix)\n : undefined,\n selected: resolvedSelections.includes(skill.id),\n alternatives: skill.alternatives.map((a) => a.skillId),\n });\n }\n\n return skillOptions;\n}\n\nexport function getSkillsByCategory(\n categoryId: string,\n matrix: MergedSkillsMatrix,\n): ResolvedSkill[] {\n const skills: ResolvedSkill[] = [];\n\n for (const skill of Object.values(matrix.skills)) {\n if (skill.category === categoryId) {\n skills.push(skill);\n }\n }\n\n return skills;\n}\n\nexport function isCategoryAllDisabled(\n categoryId: string,\n currentSelections: string[],\n matrix: MergedSkillsMatrix,\n options?: SkillCheckOptions,\n): { disabled: boolean; reason?: string } {\n if (options?.expertMode) {\n return { disabled: false };\n }\n\n const skills = getSkillsByCategory(categoryId, matrix);\n\n if (skills.length === 0) {\n return { disabled: false };\n }\n\n const disabledSkills: Array<{ skillId: string; reason: string | undefined }> =\n [];\n\n for (const skill of skills) {\n if (isDisabled(skill.id, currentSelections, matrix, options)) {\n disabledSkills.push({\n skillId: skill.id,\n reason: getDisableReason(skill.id, currentSelections, matrix),\n });\n }\n }\n\n if (disabledSkills.length === skills.length) {\n const firstReason = disabledSkills[0]?.reason;\n const shortReason = firstReason?.split(\" (\")[0] || \"requirements not met\";\n return { disabled: true, reason: shortReason };\n }\n\n return { disabled: false };\n}\n\nexport function getSubcategories(\n parentCategoryId: string,\n matrix: MergedSkillsMatrix,\n): string[] {\n const subcategories: string[] = [];\n\n for (const category of Object.values(matrix.categories)) {\n if (category.parent === parentCategoryId) {\n subcategories.push(category.id);\n }\n }\n\n subcategories.sort((a, b) => {\n const catA = matrix.categories[a];\n const catB = matrix.categories[b];\n return (catA?.order ?? 0) - (catB?.order ?? 0);\n });\n\n return subcategories;\n}\n\nexport function getTopLevelCategories(matrix: MergedSkillsMatrix): string[] {\n const topLevel: string[] = [];\n\n for (const category of Object.values(matrix.categories)) {\n if (!category.parent) {\n topLevel.push(category.id);\n }\n }\n\n topLevel.sort((a, b) => {\n const catA = matrix.categories[a];\n const catB = matrix.categories[b];\n return (catA?.order ?? 0) - (catB?.order ?? 0);\n });\n\n return topLevel;\n}\n","import path from \"path\";\nimport { verbose } from \"../utils/logger\";\nimport { directoryExists } from \"../utils/fs\";\nimport { SKILLS_MATRIX_PATH, SKILLS_DIR_PATH, PROJECT_ROOT } from \"../consts\";\nimport { resolveSource, isLocalSource, type ResolvedConfig } from \"./config\";\nimport { fetchFromSource } from \"./source-fetcher\";\nimport {\n loadSkillsMatrix,\n extractAllSkills,\n mergeMatrixWithSkills,\n} from \"./matrix-loader\";\nimport {\n discoverLocalSkills,\n type LocalSkillDiscoveryResult,\n} from \"./local-skill-loader\";\nimport type {\n MergedSkillsMatrix,\n ResolvedSkill,\n CategoryDefinition,\n} from \"../types-matrix\";\n\nexport interface SourceLoadOptions {\n sourceFlag?: string;\n projectDir?: string;\n forceRefresh?: boolean;\n devMode?: boolean;\n}\n\nexport interface SourceLoadResult {\n matrix: MergedSkillsMatrix;\n sourceConfig: ResolvedConfig;\n sourcePath: string;\n isLocal: boolean;\n}\n\nexport async function loadSkillsMatrixFromSource(\n options: SourceLoadOptions = {},\n): Promise<SourceLoadResult> {\n const {\n sourceFlag,\n projectDir,\n forceRefresh = false,\n devMode = false,\n } = options;\n\n const sourceConfig = await resolveSource(sourceFlag, projectDir);\n const { source } = sourceConfig;\n\n verbose(`Loading skills from source: ${source}`);\n\n const isLocal = isLocalSource(source) || devMode === true;\n\n let result: SourceLoadResult;\n if (isLocal) {\n result = await loadFromLocal(source, sourceConfig);\n } else {\n result = await loadFromRemote(source, sourceConfig, forceRefresh);\n }\n\n const resolvedProjectDir = projectDir || process.cwd();\n const localSkillsResult = await discoverLocalSkills(resolvedProjectDir);\n\n if (localSkillsResult && localSkillsResult.skills.length > 0) {\n verbose(\n `Found ${localSkillsResult.skills.length} local skill(s) in ${localSkillsResult.localSkillsPath}`,\n );\n result.matrix = mergeLocalSkillsIntoMatrix(\n result.matrix,\n localSkillsResult,\n );\n }\n\n return result;\n}\n\nasync function loadFromLocal(\n source: string,\n sourceConfig: ResolvedConfig,\n): Promise<SourceLoadResult> {\n let skillsPath: string;\n\n if (isLocalSource(source)) {\n skillsPath = path.isAbsolute(source)\n ? source\n : path.resolve(process.cwd(), source);\n } else {\n skillsPath = PROJECT_ROOT;\n }\n\n verbose(`Loading skills from local path: ${skillsPath}`);\n\n const matrixPath = path.join(PROJECT_ROOT, SKILLS_MATRIX_PATH);\n const skillsDir = path.join(skillsPath, SKILLS_DIR_PATH);\n\n verbose(`Matrix from CLI: ${matrixPath}`);\n verbose(`Skills from source: ${skillsDir}`);\n\n const matrix = await loadSkillsMatrix(matrixPath);\n const skills = await extractAllSkills(skillsDir);\n const mergedMatrix = await mergeMatrixWithSkills(matrix, skills);\n\n return {\n matrix: mergedMatrix,\n sourceConfig,\n sourcePath: skillsPath,\n isLocal: true,\n };\n}\n\nasync function loadFromRemote(\n source: string,\n sourceConfig: ResolvedConfig,\n forceRefresh: boolean,\n): Promise<SourceLoadResult> {\n verbose(`Fetching skills from remote source: ${source}`);\n\n const fetchResult = await fetchFromSource(source, { forceRefresh });\n\n verbose(`Fetched to: ${fetchResult.path}`);\n\n const matrixPath = path.join(PROJECT_ROOT, SKILLS_MATRIX_PATH);\n const skillsDir = path.join(fetchResult.path, SKILLS_DIR_PATH);\n\n verbose(`Matrix from CLI: ${matrixPath}`);\n verbose(`Skills from source: ${skillsDir}`);\n\n const matrix = await loadSkillsMatrix(matrixPath);\n const skills = await extractAllSkills(skillsDir);\n const mergedMatrix = await mergeMatrixWithSkills(matrix, skills);\n\n return {\n matrix: mergedMatrix,\n sourceConfig,\n sourcePath: fetchResult.path,\n isLocal: false,\n };\n}\n\nconst LOCAL_CATEGORY_TOP: CategoryDefinition = {\n id: \"local\",\n name: \"Local Skills\",\n description: \"Project-specific skills from .claude/skills/\",\n exclusive: false,\n required: false,\n order: 0,\n};\n\nconst LOCAL_CATEGORY_CUSTOM: CategoryDefinition = {\n id: \"local/custom\",\n name: \"Custom\",\n description: \"Your project-specific skills\",\n exclusive: false,\n required: false,\n order: 0,\n parent: \"local\",\n};\n\nfunction mergeLocalSkillsIntoMatrix(\n matrix: MergedSkillsMatrix,\n localResult: LocalSkillDiscoveryResult,\n): MergedSkillsMatrix {\n if (!matrix.categories[\"local\"]) {\n matrix.categories[\"local\"] = LOCAL_CATEGORY_TOP;\n }\n if (!matrix.categories[\"local/custom\"]) {\n matrix.categories[\"local/custom\"] = LOCAL_CATEGORY_CUSTOM;\n }\n\n for (const metadata of localResult.skills) {\n const resolvedSkill: ResolvedSkill = {\n id: metadata.id,\n alias: undefined,\n name: metadata.name,\n description: metadata.description,\n usageGuidance: metadata.usageGuidance,\n\n category: \"local/custom\",\n categoryExclusive: false,\n tags: metadata.tags ?? [],\n\n author: \"@local\",\n\n conflictsWith: [],\n recommends: [],\n recommendedBy: [],\n requires: [],\n requiredBy: [],\n alternatives: [],\n discourages: [],\n\n requiresSetup: [],\n providesSetupFor: [],\n\n path: metadata.path,\n\n local: true,\n localPath: metadata.localPath,\n };\n\n matrix.skills[metadata.id] = resolvedSkill;\n verbose(`Added local skill: ${metadata.id}`);\n }\n\n return matrix;\n}\n","import { parse as parseYaml } from \"yaml\";\nimport path from \"path\";\nimport { glob, readFile, fileExists } from \"../utils/fs\";\nimport { verbose } from \"../utils/logger\";\nimport { DIRS } from \"../consts\";\nimport { parseFrontmatter } from \"./loader\";\nimport type {\n SkillsMatrixConfig,\n ExtractedSkillMetadata,\n MergedSkillsMatrix,\n ResolvedSkill,\n ResolvedStack,\n SkillRelation,\n SkillRequirement,\n SkillAlternative,\n} from \"../types-matrix\";\n\ninterface RawMetadata {\n category: string;\n category_exclusive?: boolean;\n author: string;\n version: string;\n cli_name?: string;\n cli_description?: string;\n usage_guidance?: string;\n tags?: string[];\n compatible_with?: string[];\n conflicts_with?: string[];\n requires?: string[];\n requires_setup?: string[];\n provides_setup_for?: string[];\n}\n\nexport async function loadSkillsMatrix(\n configPath: string,\n): Promise<SkillsMatrixConfig> {\n const content = await readFile(configPath);\n const config = parseYaml(content) as SkillsMatrixConfig;\n\n validateMatrixStructure(config, configPath);\n\n verbose(`Loaded skills matrix: ${configPath}`);\n return config;\n}\n\nfunction validateMatrixStructure(\n config: SkillsMatrixConfig,\n configPath: string,\n): void {\n const requiredFields = [\n \"version\",\n \"categories\",\n \"relationships\",\n \"suggested_stacks\",\n \"skill_aliases\",\n ];\n const missing = requiredFields.filter((field) => !(field in config));\n\n if (missing.length > 0) {\n throw new Error(\n `Skills matrix at ${configPath} is missing required fields: ${missing.join(\", \")}`,\n );\n }\n\n const relationshipFields = [\n \"conflicts\",\n \"recommends\",\n \"requires\",\n \"alternatives\",\n ];\n const missingRelationships = relationshipFields.filter(\n (field) => !config.relationships || !(field in config.relationships),\n );\n\n if (missingRelationships.length > 0) {\n throw new Error(\n `Skills matrix relationships missing required fields: ${missingRelationships.join(\", \")}`,\n );\n }\n\n for (const [categoryId, category] of Object.entries(config.categories)) {\n const requiredCategoryFields = [\n \"id\",\n \"name\",\n \"description\",\n \"exclusive\",\n \"required\",\n \"order\",\n ];\n const missingCategoryFields = requiredCategoryFields.filter(\n (field) => !(field in category),\n );\n\n if (missingCategoryFields.length > 0) {\n throw new Error(\n `Category \"${categoryId}\" missing required fields: ${missingCategoryFields.join(\", \")}`,\n );\n }\n }\n}\n\nexport async function extractAllSkills(\n skillsDir: string,\n): Promise<ExtractedSkillMetadata[]> {\n const skills: ExtractedSkillMetadata[] = [];\n const metadataFiles = await glob(\"**/metadata.yaml\", skillsDir);\n\n for (const metadataFile of metadataFiles) {\n const skillDir = path.dirname(metadataFile);\n const skillMdPath = path.join(skillsDir, skillDir, \"SKILL.md\");\n const metadataPath = path.join(skillsDir, metadataFile);\n\n if (!(await fileExists(skillMdPath))) {\n verbose(`Skipping ${metadataFile}: No SKILL.md found`);\n continue;\n }\n\n const metadataContent = await readFile(metadataPath);\n const metadata = parseYaml(metadataContent) as RawMetadata;\n const skillMdContent = await readFile(skillMdPath);\n const frontmatter = parseFrontmatter(skillMdContent);\n\n if (!frontmatter) {\n verbose(`Skipping ${metadataFile}: Invalid SKILL.md frontmatter`);\n continue;\n }\n\n if (!metadata.cli_name) {\n throw new Error(\n `Skill at ${metadataFile} is missing required 'cli_name' field in metadata.yaml`,\n );\n }\n\n const skillId = frontmatter.name;\n\n const extracted: ExtractedSkillMetadata = {\n id: skillId,\n directoryPath: skillDir,\n name: `${metadata.cli_name} ${metadata.author}`,\n description: metadata.cli_description || frontmatter.description,\n usageGuidance: metadata.usage_guidance,\n category: metadata.category,\n categoryExclusive: metadata.category_exclusive ?? true,\n author: metadata.author,\n tags: metadata.tags ?? [],\n compatibleWith: metadata.compatible_with ?? [],\n conflictsWith: metadata.conflicts_with ?? [],\n requires: metadata.requires ?? [],\n requiresSetup: metadata.requires_setup ?? [],\n providesSetupFor: metadata.provides_setup_for ?? [],\n path: `skills/${skillDir}/`,\n };\n\n skills.push(extracted);\n verbose(`Extracted skill: ${skillId}`);\n }\n\n return skills;\n}\n\nfunction buildReverseAliases(\n aliases: Record<string, string>,\n): Record<string, string> {\n const reverse: Record<string, string> = {};\n for (const [alias, fullId] of Object.entries(aliases)) {\n reverse[fullId] = alias;\n }\n return reverse;\n}\n\nfunction buildDirectoryPathToIdMap(\n skills: ExtractedSkillMetadata[],\n): Record<string, string> {\n const map: Record<string, string> = {};\n for (const skill of skills) {\n if (skill.directoryPath && skill.directoryPath !== skill.id) {\n map[skill.directoryPath] = skill.id;\n }\n }\n return map;\n}\n\nfunction resolveToCanonicalId(\n aliasOrId: string,\n aliases: Record<string, string>,\n directoryPathToId: Record<string, string> = {},\n): string {\n if (aliases[aliasOrId]) {\n return aliases[aliasOrId];\n }\n if (directoryPathToId[aliasOrId]) {\n return directoryPathToId[aliasOrId];\n }\n return aliasOrId;\n}\n\nexport async function mergeMatrixWithSkills(\n matrix: SkillsMatrixConfig,\n skills: ExtractedSkillMetadata[],\n): Promise<MergedSkillsMatrix> {\n const aliases = matrix.skill_aliases;\n const aliasesReverse = buildReverseAliases(aliases);\n const directoryPathToId = buildDirectoryPathToIdMap(skills);\n const resolvedSkills: Record<string, ResolvedSkill> = {};\n\n for (const skill of skills) {\n const resolved = buildResolvedSkill(\n skill,\n matrix,\n aliases,\n aliasesReverse,\n directoryPathToId,\n );\n resolvedSkills[skill.id] = resolved;\n }\n\n computeInverseRelationships(resolvedSkills);\n const suggestedStacks = resolveSuggestedStacks(matrix, aliases);\n\n const merged: MergedSkillsMatrix = {\n version: matrix.version,\n categories: matrix.categories,\n skills: resolvedSkills,\n suggestedStacks,\n aliases,\n aliasesReverse,\n generatedAt: new Date().toISOString(),\n };\n\n return merged;\n}\n\nfunction buildResolvedSkill(\n skill: ExtractedSkillMetadata,\n matrix: SkillsMatrixConfig,\n aliases: Record<string, string>,\n aliasesReverse: Record<string, string>,\n directoryPathToId: Record<string, string>,\n): ResolvedSkill {\n const conflictsWith: SkillRelation[] = [];\n const recommends: SkillRelation[] = [];\n const requires: SkillRequirement[] = [];\n const alternatives: SkillAlternative[] = [];\n const discourages: SkillRelation[] = [];\n\n for (const conflictRef of skill.conflictsWith) {\n const canonicalId = resolveToCanonicalId(\n conflictRef,\n aliases,\n directoryPathToId,\n );\n conflictsWith.push({\n skillId: canonicalId,\n reason: \"Defined in skill metadata\",\n });\n }\n\n for (const conflictRule of matrix.relationships.conflicts) {\n const resolvedSkills = conflictRule.skills.map((s) =>\n resolveToCanonicalId(s, aliases, directoryPathToId),\n );\n if (resolvedSkills.includes(skill.id)) {\n for (const otherSkill of resolvedSkills) {\n if (otherSkill !== skill.id) {\n if (!conflictsWith.some((c) => c.skillId === otherSkill)) {\n conflictsWith.push({\n skillId: otherSkill,\n reason: conflictRule.reason,\n });\n }\n }\n }\n }\n }\n\n for (const compatRef of skill.compatibleWith) {\n const canonicalId = resolveToCanonicalId(\n compatRef,\n aliases,\n directoryPathToId,\n );\n recommends.push({\n skillId: canonicalId,\n reason: \"Compatible with this skill\",\n });\n }\n\n for (const recommendRule of matrix.relationships.recommends) {\n const whenCanonicalId = resolveToCanonicalId(\n recommendRule.when,\n aliases,\n directoryPathToId,\n );\n if (whenCanonicalId === skill.id) {\n for (const suggested of recommendRule.suggest) {\n const canonicalId = resolveToCanonicalId(\n suggested,\n aliases,\n directoryPathToId,\n );\n if (!recommends.some((r) => r.skillId === canonicalId)) {\n recommends.push({\n skillId: canonicalId,\n reason: recommendRule.reason,\n });\n }\n }\n }\n }\n\n if (skill.requires.length > 0) {\n requires.push({\n skillIds: skill.requires.map((r) =>\n resolveToCanonicalId(r, aliases, directoryPathToId),\n ),\n needsAny: false,\n reason: \"Defined in skill metadata\",\n });\n }\n\n for (const requireRule of matrix.relationships.requires) {\n const skillCanonicalId = resolveToCanonicalId(\n requireRule.skill,\n aliases,\n directoryPathToId,\n );\n if (skillCanonicalId === skill.id) {\n requires.push({\n skillIds: requireRule.needs.map((n) =>\n resolveToCanonicalId(n, aliases, directoryPathToId),\n ),\n needsAny: requireRule.needs_any ?? false,\n reason: requireRule.reason,\n });\n }\n }\n\n for (const altGroup of matrix.relationships.alternatives) {\n const resolvedAlts = altGroup.skills.map((s) =>\n resolveToCanonicalId(s, aliases, directoryPathToId),\n );\n if (resolvedAlts.includes(skill.id)) {\n for (const altSkill of resolvedAlts) {\n if (altSkill !== skill.id) {\n alternatives.push({\n skillId: altSkill,\n purpose: altGroup.purpose,\n });\n }\n }\n }\n }\n\n if (matrix.relationships.discourages) {\n for (const discourageRule of matrix.relationships.discourages) {\n const resolvedSkills = discourageRule.skills.map((s) =>\n resolveToCanonicalId(s, aliases, directoryPathToId),\n );\n if (resolvedSkills.includes(skill.id)) {\n for (const otherSkill of resolvedSkills) {\n if (otherSkill !== skill.id) {\n if (!discourages.some((d) => d.skillId === otherSkill)) {\n discourages.push({\n skillId: otherSkill,\n reason: discourageRule.reason,\n });\n }\n }\n }\n }\n }\n }\n\n return {\n id: skill.id,\n alias: aliasesReverse[skill.id],\n name: skill.name,\n description: skill.description,\n usageGuidance: skill.usageGuidance,\n category: skill.category,\n categoryExclusive: skill.categoryExclusive,\n tags: skill.tags,\n author: skill.author,\n conflictsWith,\n recommends,\n recommendedBy: [],\n requires,\n requiredBy: [],\n alternatives,\n discourages,\n requiresSetup: skill.requiresSetup.map((s) =>\n resolveToCanonicalId(s, aliases, directoryPathToId),\n ),\n providesSetupFor: skill.providesSetupFor.map((s) =>\n resolveToCanonicalId(s, aliases, directoryPathToId),\n ),\n path: skill.path,\n };\n}\n\nfunction computeInverseRelationships(\n skills: Record<string, ResolvedSkill>,\n): void {\n for (const skill of Object.values(skills)) {\n for (const recommend of skill.recommends) {\n const targetSkill = skills[recommend.skillId];\n if (targetSkill) {\n targetSkill.recommendedBy.push({\n skillId: skill.id,\n reason: recommend.reason,\n });\n }\n }\n\n for (const requirement of skill.requires) {\n for (const requiredId of requirement.skillIds) {\n const targetSkill = skills[requiredId];\n if (targetSkill) {\n targetSkill.requiredBy.push({\n skillId: skill.id,\n reason: requirement.reason,\n });\n }\n }\n }\n }\n}\n\nfunction resolveSuggestedStacks(\n matrix: SkillsMatrixConfig,\n aliases: Record<string, string>,\n): ResolvedStack[] {\n return matrix.suggested_stacks.map((stack) => {\n const resolvedSkillsMap: Record<string, Record<string, string>> = {};\n const allSkillIds: string[] = [];\n\n for (const [category, subcategories] of Object.entries(stack.skills)) {\n resolvedSkillsMap[category] = {};\n for (const [subcategory, alias] of Object.entries(subcategories)) {\n const canonicalId = resolveToCanonicalId(alias, aliases);\n resolvedSkillsMap[category][subcategory] = canonicalId;\n allSkillIds.push(canonicalId);\n }\n }\n\n return {\n id: stack.id,\n name: stack.name,\n description: stack.description,\n audience: stack.audience,\n skills: resolvedSkillsMap,\n allSkillIds,\n philosophy: stack.philosophy,\n };\n });\n}\n\nexport async function loadAndMergeSkillsMatrix(\n matrixPath: string,\n projectRoot: string,\n): Promise<MergedSkillsMatrix> {\n const matrix = await loadSkillsMatrix(matrixPath);\n const skillsDir = path.join(projectRoot, DIRS.skills);\n const skills = await extractAllSkills(skillsDir);\n return mergeMatrixWithSkills(matrix, skills);\n}\n","import { parse as parseYaml } from \"yaml\";\nimport path from \"path\";\nimport {\n directoryExists,\n listDirectories,\n fileExists,\n readFile,\n} from \"../utils/fs\";\nimport { verbose } from \"../utils/logger\";\nimport { LOCAL_SKILLS_PATH } from \"../consts\";\nimport { parseFrontmatter } from \"./loader\";\nimport type { ExtractedSkillMetadata } from \"../types-matrix\";\n\nconst LOCAL_CATEGORY = \"local\";\nconst LOCAL_AUTHOR = \"@local\";\nconst TEST_SKILL_PREFIX = \"test-\";\n\ninterface LocalRawMetadata {\n cli_name: string;\n cli_description?: string;\n}\n\nexport interface LocalSkillDiscoveryResult {\n skills: ExtractedSkillMetadata[];\n localSkillsPath: string;\n}\n\nexport async function discoverLocalSkills(\n projectDir: string,\n): Promise<LocalSkillDiscoveryResult | null> {\n const localSkillsPath = path.join(projectDir, LOCAL_SKILLS_PATH);\n\n if (!(await directoryExists(localSkillsPath))) {\n verbose(`Local skills directory not found: ${localSkillsPath}`);\n return null;\n }\n\n const skills: ExtractedSkillMetadata[] = [];\n const skillDirs = await listDirectories(localSkillsPath);\n\n for (const skillDirName of skillDirs) {\n if (!skillDirName.startsWith(TEST_SKILL_PREFIX)) {\n verbose(\n `Skipping local skill '${skillDirName}': Does not have test- prefix (temporary filter)`,\n );\n continue;\n }\n\n const skill = await extractLocalSkill(localSkillsPath, skillDirName);\n if (skill) {\n skills.push(skill);\n }\n }\n\n verbose(`Discovered ${skills.length} local skills from ${localSkillsPath}`);\n\n return {\n skills,\n localSkillsPath,\n };\n}\n\nasync function extractLocalSkill(\n localSkillsPath: string,\n skillDirName: string,\n): Promise<ExtractedSkillMetadata | null> {\n const skillDir = path.join(localSkillsPath, skillDirName);\n const metadataPath = path.join(skillDir, \"metadata.yaml\");\n const skillMdPath = path.join(skillDir, \"SKILL.md\");\n\n if (!(await fileExists(metadataPath))) {\n verbose(`Skipping local skill '${skillDirName}': No metadata.yaml found`);\n return null;\n }\n\n if (!(await fileExists(skillMdPath))) {\n verbose(`Skipping local skill '${skillDirName}': No SKILL.md found`);\n return null;\n }\n\n const metadataContent = await readFile(metadataPath);\n const metadata = parseYaml(metadataContent) as LocalRawMetadata;\n\n if (!metadata.cli_name) {\n verbose(\n `Skipping local skill '${skillDirName}': Missing required 'cli_name' in metadata.yaml`,\n );\n return null;\n }\n\n const skillMdContent = await readFile(skillMdPath);\n const frontmatter = parseFrontmatter(skillMdContent);\n\n if (!frontmatter) {\n verbose(\n `Skipping local skill '${skillDirName}': Invalid SKILL.md frontmatter`,\n );\n return null;\n }\n\n const relativePath = `${LOCAL_SKILLS_PATH}/${skillDirName}/`;\n const skillId = frontmatter.name;\n\n const extracted: ExtractedSkillMetadata = {\n id: skillId,\n directoryPath: skillDirName,\n name: `${metadata.cli_name} ${LOCAL_AUTHOR}`,\n description: metadata.cli_description || frontmatter.description,\n usageGuidance: undefined,\n category: LOCAL_CATEGORY,\n categoryExclusive: false,\n author: LOCAL_AUTHOR,\n tags: [],\n compatibleWith: [],\n conflictsWith: [],\n requires: [],\n requiresSetup: [],\n providesSetupFor: [],\n path: relativePath,\n local: true,\n localPath: relativePath,\n };\n\n verbose(`Extracted local skill: ${skillId}`);\n return extracted;\n}\n","import path from \"path\";\nimport { stringify as stringifyYaml, parse as parseYaml } from \"yaml\";\nimport { copy, ensureDir, readFile, writeFile } from \"../utils/fs\";\nimport { hashFile } from \"./versioning\";\nimport type { MergedSkillsMatrix, ResolvedSkill } from \"../types-matrix\";\nimport type { SourceLoadResult } from \"./source-loader\";\n\ninterface ForkedFromMetadata {\n skill_id: string;\n content_hash: string;\n date: string;\n}\n\ninterface SkillMetadata {\n content_hash?: string;\n forked_from?: ForkedFromMetadata;\n [key: string]: unknown;\n}\n\nconst METADATA_FILE_NAME = \"metadata.yaml\";\n\nexport interface CopiedSkill {\n skillId: string;\n contentHash: string;\n sourcePath: string;\n destPath: string;\n local?: boolean;\n}\n\nfunction getSkillSourcePath(\n skill: ResolvedSkill,\n registryRoot: string,\n): string {\n return path.join(registryRoot, \"src\", skill.path);\n}\n\nfunction getSkillDestPath(skill: ResolvedSkill, stackDir: string): string {\n const skillRelativePath = skill.path.replace(/^skills\\//, \"\");\n return path.join(stackDir, \"skills\", skillRelativePath);\n}\n\nasync function generateSkillHash(skillSourcePath: string): Promise<string> {\n const skillMdPath = path.join(skillSourcePath, \"SKILL.md\");\n return hashFile(skillMdPath);\n}\n\nfunction getCurrentDate(): string {\n return new Date().toISOString().split(\"T\")[0];\n}\n\nasync function injectForkedFromMetadata(\n destPath: string,\n skillId: string,\n contentHash: string,\n): Promise<void> {\n const metadataPath = path.join(destPath, METADATA_FILE_NAME);\n const rawContent = await readFile(metadataPath);\n\n const lines = rawContent.split(\"\\n\");\n let yamlContent = rawContent;\n\n if (lines[0]?.startsWith(\"# yaml-language-server:\")) {\n yamlContent = lines.slice(1).join(\"\\n\");\n }\n\n const metadata = parseYaml(yamlContent) as SkillMetadata;\n\n metadata.forked_from = {\n skill_id: skillId,\n content_hash: contentHash,\n date: getCurrentDate(),\n };\n\n const newYamlContent = stringifyYaml(metadata, { lineWidth: 0 });\n await writeFile(metadataPath, newYamlContent);\n}\n\nexport async function copySkill(\n skill: ResolvedSkill,\n stackDir: string,\n registryRoot: string,\n): Promise<CopiedSkill> {\n const sourcePath = getSkillSourcePath(skill, registryRoot);\n const destPath = getSkillDestPath(skill, stackDir);\n\n const contentHash = await generateSkillHash(sourcePath);\n\n await ensureDir(path.dirname(destPath));\n await copy(sourcePath, destPath);\n\n await injectForkedFromMetadata(destPath, skill.id, contentHash);\n\n return {\n skillId: skill.id,\n contentHash,\n sourcePath,\n destPath,\n };\n}\n\nfunction getSkillSourcePathFromSource(\n skill: ResolvedSkill,\n sourceResult: SourceLoadResult,\n): string {\n return path.join(sourceResult.sourcePath, \"src\", skill.path);\n}\n\nexport async function copySkillFromSource(\n skill: ResolvedSkill,\n stackDir: string,\n sourceResult: SourceLoadResult,\n): Promise<CopiedSkill> {\n const sourcePath = getSkillSourcePathFromSource(skill, sourceResult);\n const destPath = getSkillDestPath(skill, stackDir);\n\n const contentHash = await generateSkillHash(sourcePath);\n\n await ensureDir(path.dirname(destPath));\n await copy(sourcePath, destPath);\n\n await injectForkedFromMetadata(destPath, skill.id, contentHash);\n\n return {\n skillId: skill.id,\n contentHash,\n sourcePath,\n destPath,\n };\n}\n\nexport async function copySkillsToPluginFromSource(\n selectedSkillIds: string[],\n pluginDir: string,\n matrix: MergedSkillsMatrix,\n sourceResult: SourceLoadResult,\n): Promise<CopiedSkill[]> {\n const copiedSkills: CopiedSkill[] = [];\n\n for (const skillId of selectedSkillIds) {\n const skill = matrix.skills[skillId];\n if (!skill) {\n console.warn(`Warning: Skill not found in matrix: ${skillId}`);\n continue;\n }\n\n if (skill.local && skill.localPath) {\n const localSkillPath = path.join(process.cwd(), skill.localPath);\n const contentHash = await generateSkillHash(localSkillPath);\n\n copiedSkills.push({\n skillId: skill.id,\n sourcePath: skill.localPath,\n destPath: skill.localPath,\n contentHash,\n local: true,\n });\n continue;\n }\n\n const copied = await copySkillFromSource(skill, pluginDir, sourceResult);\n copiedSkills.push(copied);\n }\n\n return copiedSkills;\n}\n\nfunction getFlattenedSkillDestPath(\n skill: ResolvedSkill,\n localSkillsDir: string,\n): string {\n const skillFolderName = skill.alias || extractSkillNameFromId(skill.id);\n return path.join(localSkillsDir, skillFolderName);\n}\n\nfunction extractSkillNameFromId(skillId: string): string {\n const withoutAuthor = skillId.replace(/\\s*\\(@\\w+\\)$/, \"\").trim();\n return withoutAuthor;\n}\n\nasync function copySkillToLocalFlattened(\n skill: ResolvedSkill,\n localSkillsDir: string,\n sourceResult: SourceLoadResult,\n): Promise<CopiedSkill> {\n const sourcePath = getSkillSourcePathFromSource(skill, sourceResult);\n const destPath = getFlattenedSkillDestPath(skill, localSkillsDir);\n\n const contentHash = await generateSkillHash(sourcePath);\n\n await ensureDir(path.dirname(destPath));\n await copy(sourcePath, destPath);\n\n await injectForkedFromMetadata(destPath, skill.id, contentHash);\n\n return {\n skillId: skill.id,\n contentHash,\n sourcePath,\n destPath,\n };\n}\n\nexport async function copySkillsToLocalFlattened(\n selectedSkillIds: string[],\n localSkillsDir: string,\n matrix: MergedSkillsMatrix,\n sourceResult: SourceLoadResult,\n): Promise<CopiedSkill[]> {\n const copiedSkills: CopiedSkill[] = [];\n\n for (const skillId of selectedSkillIds) {\n const skill = matrix.skills[skillId];\n if (!skill) {\n console.warn(`Warning: Skill not found in matrix: ${skillId}`);\n continue;\n }\n\n if (skill.local && skill.localPath) {\n const localSkillPath = path.join(process.cwd(), skill.localPath);\n const contentHash = await generateSkillHash(localSkillPath);\n\n copiedSkills.push({\n skillId: skill.id,\n sourcePath: skill.localPath,\n destPath: skill.localPath,\n contentHash,\n local: true,\n });\n continue;\n }\n\n const copied = await copySkillToLocalFlattened(\n skill,\n localSkillsDir,\n sourceResult,\n );\n copiedSkills.push(copied);\n }\n\n return copiedSkills;\n}\n","import path from \"path\";\nimport * as p from \"@clack/prompts\";\nimport { fileExists, readFile } from \"../utils/fs\";\n\ninterface PermissionConfig {\n allow?: string[];\n deny?: string[];\n}\n\ninterface SettingsFile {\n permissions?: PermissionConfig;\n}\n\nexport async function checkPermissions(projectRoot: string): Promise<void> {\n const settingsPath = path.join(projectRoot, \".claude\", \"settings.json\");\n const localSettingsPath = path.join(\n projectRoot,\n \".claude\",\n \"settings.local.json\",\n );\n\n let permissions: PermissionConfig | undefined;\n\n for (const filePath of [localSettingsPath, settingsPath]) {\n if (await fileExists(filePath)) {\n try {\n const content = await readFile(filePath);\n const parsed = JSON.parse(content) as SettingsFile;\n if (parsed.permissions) {\n permissions = parsed.permissions;\n break;\n }\n } catch {}\n }\n }\n\n if (!permissions) {\n p.note(\n `No permissions configured in .claude/settings.json\nAgents will prompt for approval on each tool use.\n\nFor autonomous operation, add to .claude/settings.json:\n\n{\n \"permissions\": {\n \"allow\": [\n \"Read(*)\",\n \"Bash(git *)\",\n \"Bash(bun *)\"\n ]\n }\n}`,\n \"Permission Notice\",\n );\n return;\n }\n\n const hasRestrictiveBash = permissions.deny?.some(\n (rule) => rule === \"Bash(*)\" || rule === \"Bash\",\n );\n const hasNoAllows = !permissions.allow || permissions.allow.length === 0;\n\n if (hasRestrictiveBash) {\n p.log.warn(\n `Bash is denied in permissions. Some agents require Bash for git, testing, and build commands.`,\n );\n }\n\n if (hasNoAllows) {\n p.log.warn(\n `No allow rules configured. Agents will prompt for each tool use.`,\n );\n }\n}\n","import os from \"os\";\nimport path from \"path\";\nimport { compileStackPlugin } from \"./stack-plugin-compiler\";\nimport { claudePluginInstall, isClaudeCLIAvailable } from \"../utils/exec\";\nimport { remove, ensureDir } from \"../utils/fs\";\nimport type { CompiledStackPlugin } from \"./stack-plugin-compiler\";\n\nexport interface StackInstallOptions {\n stackId: string;\n projectDir: string;\n sourcePath: string;\n agentSourcePath: string;\n}\n\nexport interface StackInstallResult {\n pluginName: string;\n stackName: string;\n agents: string[];\n skills: string[];\n pluginPath: string;\n}\n\n/**\n * Compile a stack to a temporary directory\n */\nexport async function compileStackToTemp(options: {\n stackId: string;\n projectRoot: string;\n agentSourcePath?: string;\n}): Promise<{ result: CompiledStackPlugin; cleanup: () => Promise<void> }> {\n const tempDir = path.join(os.tmpdir(), `cc-stack-${Date.now()}`);\n await ensureDir(tempDir);\n\n const result = await compileStackPlugin({\n stackId: options.stackId,\n outputDir: tempDir,\n projectRoot: options.projectRoot,\n agentSourcePath: options.agentSourcePath,\n });\n\n return {\n result,\n cleanup: async () => {\n await remove(tempDir);\n },\n };\n}\n\n/**\n * Install a stack as a single native plugin using `claude plugin install`\n *\n * Flow:\n * 1. Compile stack to temp directory\n * 2. Run `claude plugin install ./temp/stack-id --scope project`\n * 3. Clean up temp directory\n */\nexport async function installStackAsPlugin(\n options: StackInstallOptions,\n): Promise<StackInstallResult> {\n const { stackId, projectDir, sourcePath, agentSourcePath } = options;\n\n // Check if claude CLI is available\n const claudeAvailable = await isClaudeCLIAvailable();\n if (!claudeAvailable) {\n throw new Error(\n \"Claude CLI not found. Please install Claude Code first: https://claude.ai/code\",\n );\n }\n\n // Compile stack to temp directory\n const { result, cleanup } = await compileStackToTemp({\n stackId,\n projectRoot: sourcePath,\n agentSourcePath,\n });\n\n try {\n // Install using native claude plugin install\n await claudePluginInstall(result.pluginPath, \"project\", projectDir);\n\n return {\n pluginName: `stack-${stackId}`,\n stackName: result.stackName,\n agents: result.agents,\n skills: result.skillPlugins,\n pluginPath: result.pluginPath,\n };\n } finally {\n // Clean up temp directory\n await cleanup();\n }\n}\n","import { spawn } from \"child_process\";\n\nexport interface ExecResult {\n stdout: string;\n stderr: string;\n exitCode: number;\n}\n\n/**\n * Execute a command and return the result\n */\nexport async function execCommand(\n command: string,\n args: string[],\n options?: { cwd?: string; env?: NodeJS.ProcessEnv },\n): Promise<ExecResult> {\n return new Promise((resolve, reject) => {\n const proc = spawn(command, args, {\n cwd: options?.cwd,\n env: { ...process.env, ...options?.env },\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n\n let stdout = \"\";\n let stderr = \"\";\n\n proc.stdout.on(\"data\", (data) => {\n stdout += data.toString();\n });\n\n proc.stderr.on(\"data\", (data) => {\n stderr += data.toString();\n });\n\n proc.on(\"close\", (code) => {\n resolve({\n stdout,\n stderr,\n exitCode: code ?? 1,\n });\n });\n\n proc.on(\"error\", (err) => {\n reject(err);\n });\n });\n}\n\n/**\n * Install a plugin using the native claude CLI\n */\nexport async function claudePluginInstall(\n pluginPath: string,\n scope: \"project\" | \"user\",\n projectDir: string,\n): Promise<void> {\n const args = [\"plugin\", \"install\", pluginPath, \"--scope\", scope];\n const result = await execCommand(\"claude\", args, { cwd: projectDir });\n\n if (result.exitCode !== 0) {\n const errorMessage = result.stderr || result.stdout || \"Unknown error\";\n throw new Error(`Plugin installation failed: ${errorMessage.trim()}`);\n }\n}\n\n/**\n * Check if the claude CLI is available\n */\nexport async function isClaudeCLIAvailable(): Promise<boolean> {\n try {\n const result = await execCommand(\"claude\", [\"--version\"], {});\n return result.exitCode === 0;\n } catch {\n return false;\n }\n}\n","export const SKILL_TO_AGENTS: Record<string, string[]> = {\n \"frontend/*\": [\n \"web-developer\",\n \"web-reviewer\",\n \"web-researcher\",\n \"web-pm\",\n \"web-pattern-scout\",\n \"web-pattern-critique\",\n \"agent-summoner\",\n \"skill-summoner\",\n \"documentor\",\n ],\n\n \"backend/*\": [\n \"api-developer\",\n \"api-reviewer\",\n \"api-researcher\",\n \"web-architecture\",\n \"web-pm\",\n \"web-pattern-scout\",\n \"web-pattern-critique\",\n \"agent-summoner\",\n \"skill-summoner\",\n \"documentor\",\n ],\n\n \"mobile/*\": [\n \"web-developer\",\n \"web-reviewer\",\n \"web-researcher\",\n \"web-pm\",\n \"agent-summoner\",\n \"skill-summoner\",\n \"documentor\",\n ],\n\n \"setup/*\": [\n \"web-architecture\",\n \"web-developer\",\n \"api-developer\",\n \"agent-summoner\",\n \"skill-summoner\",\n \"documentor\",\n ],\n\n \"security/*\": [\n \"web-developer\",\n \"api-developer\",\n \"web-reviewer\",\n \"api-reviewer\",\n \"web-architecture\",\n \"web-pm\",\n \"agent-summoner\",\n \"skill-summoner\",\n \"documentor\",\n ],\n\n \"reviewing/*\": [\n \"web-reviewer\",\n \"api-reviewer\",\n \"cli-reviewer\",\n \"web-pattern-critique\",\n \"agent-summoner\",\n \"skill-summoner\",\n \"documentor\",\n ],\n\n \"cli/*\": [\n \"cli-developer\",\n \"cli-reviewer\",\n \"api-developer\",\n \"api-reviewer\",\n \"api-researcher\",\n \"web-architecture\",\n \"web-pm\",\n \"agent-summoner\",\n \"skill-summoner\",\n \"documentor\",\n ],\n\n \"research/*\": [\n \"web-researcher\",\n \"api-researcher\",\n \"web-pm\",\n \"web-pattern-scout\",\n \"web-pattern-critique\",\n \"documentor\",\n \"agent-summoner\",\n \"skill-summoner\",\n ],\n\n \"methodology/*\": [\n \"web-developer\",\n \"api-developer\",\n \"web-reviewer\",\n \"api-reviewer\",\n \"web-researcher\",\n \"api-researcher\",\n \"web-tester\",\n \"web-pm\",\n \"web-architecture\",\n \"web-pattern-scout\",\n \"web-pattern-critique\",\n \"agent-summoner\",\n \"skill-summoner\",\n \"documentor\",\n ],\n\n \"frontend/testing\": [\"web-tester\", \"web-developer\", \"web-reviewer\"],\n \"backend/testing\": [\"web-tester\", \"api-developer\", \"api-reviewer\"],\n\n \"frontend/mocks\": [\"web-tester\", \"web-developer\", \"web-reviewer\"],\n};\n\nexport const PRELOADED_SKILLS: Record<string, string[]> = {\n \"web-developer\": [\"framework\", \"styling\"],\n \"api-developer\": [\"api\", \"database\", \"cli\"],\n \"cli-developer\": [\"cli\"],\n \"web-reviewer\": [\"framework\", \"styling\", \"reviewing\"],\n \"api-reviewer\": [\"api\", \"database\", \"reviewing\"],\n \"cli-reviewer\": [\"cli\", \"reviewing\", \"cli-reviewing\"],\n \"web-researcher\": [\"framework\", \"research-methodology\"],\n \"api-researcher\": [\"api\", \"research-methodology\"],\n \"web-tester\": [\"testing\", \"mocks\"],\n \"web-architecture\": [\"monorepo\", \"turborepo\", \"cli\"],\n \"web-pm\": [\"research-methodology\"],\n \"web-pattern-scout\": [\"research-methodology\"],\n \"web-pattern-critique\": [\"research-methodology\", \"reviewing\"],\n documentor: [\"research-methodology\"],\n \"agent-summoner\": [],\n \"skill-summoner\": [],\n};\n\nexport const SUBCATEGORY_ALIASES: Record<string, string> = {\n framework: \"frontend/framework\",\n styling: \"frontend/styling\",\n api: \"backend/api\",\n database: \"backend/database\",\n mocks: \"frontend/mocks\",\n testing: \"testing\",\n reviewing: \"reviewing\",\n \"research-methodology\": \"research/research-methodology\",\n monorepo: \"setup/monorepo\",\n cli: \"cli\",\n};\n\nexport function getAgentsForSkill(\n skillPath: string,\n category: string,\n): string[] {\n const normalizedPath = skillPath.replace(/^skills\\//, \"\").replace(/\\/$/, \"\");\n\n if (SKILL_TO_AGENTS[category]) {\n return SKILL_TO_AGENTS[category];\n }\n\n for (const [pattern, agents] of Object.entries(SKILL_TO_AGENTS)) {\n if (\n normalizedPath === pattern ||\n normalizedPath.startsWith(`${pattern}/`)\n ) {\n return agents;\n }\n }\n\n for (const [pattern, agents] of Object.entries(SKILL_TO_AGENTS)) {\n if (pattern.endsWith(\"/*\")) {\n const prefix = pattern.slice(0, -2);\n if (normalizedPath.startsWith(prefix)) {\n return agents;\n }\n }\n }\n\n return [\"agent-summoner\", \"skill-summoner\", \"documentor\"];\n}\n\nexport function shouldPreloadSkill(\n skillPath: string,\n skillId: string,\n category: string,\n agentId: string,\n): boolean {\n const preloadedPatterns = PRELOADED_SKILLS[agentId];\n if (!preloadedPatterns || preloadedPatterns.length === 0) {\n return false;\n }\n\n const normalizedPath = skillPath.replace(/^skills\\//, \"\").replace(/\\/$/, \"\");\n\n for (const pattern of preloadedPatterns) {\n if (category === pattern) {\n return true;\n }\n\n if (normalizedPath.includes(pattern)) {\n return true;\n }\n\n if (skillId.toLowerCase().includes(pattern.toLowerCase())) {\n return true;\n }\n\n const aliasedPath = SUBCATEGORY_ALIASES[pattern];\n if (aliasedPath && normalizedPath.includes(aliasedPath)) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function extractCategoryKey(skillPath: string): string {\n const normalizedPath = skillPath.replace(/^skills\\//, \"\").replace(/\\/$/, \"\");\n const parts = normalizedPath.split(\"/\");\n return parts.length >= 2 ? parts[1] : parts[0];\n}\n","import type { StackConfig, SkillAssignment } from \"../../types\";\nimport type { ResolvedSkill, MergedSkillsMatrix } from \"../types-matrix\";\nimport {\n getAgentsForSkill,\n shouldPreloadSkill,\n extractCategoryKey,\n} from \"./skill-agent-mappings\";\nimport { DEFAULT_VERSION } from \"../consts\";\n\nconst PLUGIN_NAME = \"claude-collective\";\nconst DEFAULT_AUTHOR = \"@user\";\n\nexport function generateConfigFromSkills(\n selectedSkillIds: string[],\n matrix: MergedSkillsMatrix,\n): StackConfig {\n const agentSkills: Record<string, Record<string, SkillAssignment[]>> = {};\n const neededAgents = new Set<string>();\n\n for (const skillId of selectedSkillIds) {\n const skill = matrix.skills[skillId];\n if (!skill) {\n continue;\n }\n\n const skillPath = skill.path;\n const category = skill.category;\n const agents = getAgentsForSkill(skillPath, category);\n const categoryKey = extractCategoryKey(skillPath);\n\n for (const agentId of agents) {\n neededAgents.add(agentId);\n\n if (!agentSkills[agentId]) {\n agentSkills[agentId] = {};\n }\n\n if (!agentSkills[agentId][categoryKey]) {\n agentSkills[agentId][categoryKey] = [];\n }\n\n const isPreloaded = shouldPreloadSkill(\n skillPath,\n skillId,\n category,\n agentId,\n );\n\n const assignment: SkillAssignment = { id: skillId };\n if (isPreloaded) {\n assignment.preloaded = true;\n }\n\n agentSkills[agentId][categoryKey].push(assignment);\n }\n }\n\n const skills: SkillAssignment[] = selectedSkillIds.map((id) => {\n const skill = matrix.skills[id];\n if (skill?.local && skill?.localPath) {\n return {\n id,\n local: true,\n path: skill.localPath,\n };\n }\n return { id };\n });\n\n const config: StackConfig = {\n name: PLUGIN_NAME,\n version: DEFAULT_VERSION,\n author: DEFAULT_AUTHOR,\n description: `Custom plugin with ${selectedSkillIds.length} skills`,\n skills,\n agents: Array.from(neededAgents).sort(),\n agent_skills: agentSkills,\n };\n\n return config;\n}\n\nexport function generateConfigFromStack(stackConfig: StackConfig): StackConfig {\n return {\n name: PLUGIN_NAME,\n version: stackConfig.version || DEFAULT_VERSION,\n author: stackConfig.author || DEFAULT_AUTHOR,\n description: stackConfig.description,\n framework: stackConfig.framework,\n skills: stackConfig.skills,\n agents: stackConfig.agents,\n agent_skills: stackConfig.agent_skills,\n hooks: stackConfig.hooks,\n philosophy: stackConfig.philosophy,\n principles: stackConfig.principles,\n tags: stackConfig.tags,\n };\n}\n\nexport function mergeStackWithSkills(\n baseStackConfig: StackConfig,\n selectedSkillIds: string[],\n matrix: MergedSkillsMatrix,\n): StackConfig {\n const baseSkillIds = new Set(baseStackConfig.skills.map((s) => s.id));\n const selectedSet = new Set(selectedSkillIds);\n const addedSkills = selectedSkillIds.filter((id) => !baseSkillIds.has(id));\n const removedSkills = [...baseSkillIds].filter((id) => !selectedSet.has(id));\n\n if (addedSkills.length === 0 && removedSkills.length === 0) {\n return generateConfigFromStack(baseStackConfig);\n }\n\n const config = generateConfigFromStack(baseStackConfig);\n\n config.skills = selectedSkillIds.map((id) => {\n const skill = matrix.skills[id];\n if (skill?.local && skill?.localPath) {\n return {\n id,\n local: true,\n path: skill.localPath,\n };\n }\n return { id };\n });\n\n if (addedSkills.length > 0 && config.agent_skills) {\n for (const skillId of addedSkills) {\n const skill = matrix.skills[skillId];\n if (!skill) continue;\n\n const skillPath = skill.path;\n const category = skill.category;\n const categoryKey = extractCategoryKey(skillPath);\n const agents = getAgentsForSkill(skillPath, category);\n\n for (const agentId of agents) {\n if (!config.agent_skills[agentId]) {\n config.agent_skills[agentId] = {};\n }\n if (!config.agent_skills[agentId][categoryKey]) {\n config.agent_skills[agentId][categoryKey] = [];\n }\n\n const isPreloaded = shouldPreloadSkill(\n skillPath,\n skillId,\n category,\n agentId,\n );\n const assignment: SkillAssignment = { id: skillId };\n if (isPreloaded) {\n assignment.preloaded = true;\n }\n\n config.agent_skills[agentId][categoryKey].push(assignment);\n }\n }\n }\n\n if (removedSkills.length > 0 && config.agent_skills) {\n const removedSet = new Set(removedSkills);\n for (const agentId of Object.keys(config.agent_skills)) {\n for (const categoryKey of Object.keys(config.agent_skills[agentId])) {\n config.agent_skills[agentId][categoryKey] = config.agent_skills[\n agentId\n ][categoryKey].filter((s) => !removedSet.has(s.id));\n\n if (config.agent_skills[agentId][categoryKey].length === 0) {\n delete config.agent_skills[agentId][categoryKey];\n }\n }\n\n if (Object.keys(config.agent_skills[agentId]).length === 0) {\n delete config.agent_skills[agentId];\n }\n }\n }\n\n config.description = `Custom plugin based on ${baseStackConfig.name} with ${selectedSkillIds.length} skills`;\n\n return config;\n}\n","import { Command } from \"commander\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { directoryExists, ensureDir, remove } from \"../utils/fs\";\nimport {\n getCollectivePluginDir,\n getPluginSkillsDir,\n getPluginSkillIds,\n} from \"../lib/plugin-finder\";\nimport { resolveSource } from \"../lib/config\";\nimport { loadSkillsMatrixFromSource } from \"../lib/source-loader\";\nimport {\n runWizard,\n clearTerminal,\n renderSelectionsHeader,\n} from \"../lib/wizard\";\nimport { copySkillsToPluginFromSource } from \"../lib/skill-copier\";\nimport { recompileAgents } from \"../lib/agent-recompiler\";\nimport { bumpPluginVersion } from \"../lib/plugin-version\";\nimport { getAgentDefinitions } from \"../lib/agent-fetcher\";\nimport { EXIT_CODES } from \"../lib/exit-codes\";\n\nexport const editCommand = new Command(\"edit\")\n .description(\"Edit skills in the plugin\")\n .option(\n \"--source <url>\",\n \"Skills marketplace source (default: github:claude-collective/skills)\",\n )\n .option(\n \"--agent-source <url>\",\n \"Remote agent partials source (default: local CLI)\",\n )\n .option(\"--refresh\", \"Force refresh from remote sources\", false)\n .configureOutput({\n writeErr: (str) => console.error(pc.red(str)),\n })\n .showHelpAfterError(true)\n .action(async (options) => {\n const pluginDir = getCollectivePluginDir();\n const pluginSkillsDir = getPluginSkillsDir(pluginDir);\n\n if (!(await directoryExists(pluginDir))) {\n p.log.error(\"No plugin found. Run 'cc init' first to set up the plugin.\");\n process.exit(EXIT_CODES.ERROR);\n }\n\n p.intro(pc.cyan(\"Edit Plugin Skills\"));\n\n const s = p.spinner();\n\n s.start(\"Resolving marketplace source...\");\n let sourceConfig;\n try {\n sourceConfig = await resolveSource(options.source);\n s.stop(`Source: ${sourceConfig.sourceOrigin}`);\n } catch (error) {\n s.stop(\"Failed to resolve source\");\n p.log.error(error instanceof Error ? error.message : String(error));\n process.exit(EXIT_CODES.ERROR);\n }\n\n s.start(\"Loading skills matrix...\");\n let sourceResult;\n try {\n sourceResult = await loadSkillsMatrixFromSource({\n sourceFlag: options.source,\n projectDir: process.cwd(),\n forceRefresh: options.refresh,\n });\n s.stop(`Loaded ${Object.keys(sourceResult.matrix.skills).length} skills`);\n } catch (error) {\n s.stop(\"Failed to load skills matrix\");\n p.log.error(error instanceof Error ? error.message : String(error));\n process.exit(EXIT_CODES.ERROR);\n }\n\n s.start(\"Reading current skills...\");\n let currentSkillIds: string[];\n try {\n currentSkillIds = await getPluginSkillIds(\n pluginSkillsDir,\n sourceResult.matrix,\n );\n s.stop(`Current plugin has ${currentSkillIds.length} skills`);\n } catch (error) {\n s.stop(\"Failed to read current skills\");\n p.log.error(error instanceof Error ? error.message : String(error));\n process.exit(EXIT_CODES.ERROR);\n }\n\n const result = await runWizard(sourceResult.matrix, {\n initialSkills: currentSkillIds,\n });\n\n if (!result) {\n p.cancel(\"Edit cancelled\");\n process.exit(EXIT_CODES.CANCELLED);\n }\n\n if (!result.validation.valid) {\n p.log.error(\"Selection has validation errors:\");\n for (const error of result.validation.errors) {\n p.log.error(` ${error.message}`);\n }\n process.exit(EXIT_CODES.ERROR);\n }\n\n clearTerminal();\n renderSelectionsHeader(result.selectedSkills, sourceResult.matrix);\n\n if (result.validation.warnings.length > 0) {\n console.log(pc.yellow(\"Warnings:\"));\n for (const warning of result.validation.warnings) {\n console.log(` ${pc.yellow(\"!\")} ${warning.message}`);\n }\n console.log(\"\");\n }\n\n const addedSkills = result.selectedSkills.filter(\n (id) => !currentSkillIds.includes(id),\n );\n const removedSkills = currentSkillIds.filter(\n (id) => !result.selectedSkills.includes(id),\n );\n\n if (addedSkills.length === 0 && removedSkills.length === 0) {\n p.log.info(\"No changes made.\");\n p.outro(pc.dim(\"Plugin unchanged\"));\n return;\n }\n\n console.log(pc.bold(\"Changes:\"));\n for (const skillId of addedSkills) {\n const skill = sourceResult.matrix.skills[skillId];\n console.log(` ${pc.green(\"+\")} ${skill?.name || skillId}`);\n }\n for (const skillId of removedSkills) {\n const skill = sourceResult.matrix.skills[skillId];\n console.log(` ${pc.red(\"-\")} ${skill?.name || skillId}`);\n }\n console.log(\"\");\n\n s.start(\"Updating plugin skills...\");\n try {\n if (await directoryExists(pluginSkillsDir)) {\n await remove(pluginSkillsDir);\n }\n await ensureDir(pluginSkillsDir);\n\n await copySkillsToPluginFromSource(\n result.selectedSkills,\n pluginDir,\n sourceResult.matrix,\n sourceResult,\n );\n s.stop(`Plugin updated with ${result.selectedSkills.length} skills`);\n } catch (error) {\n s.stop(\"Failed to update plugin\");\n p.log.error(error instanceof Error ? error.message : String(error));\n process.exit(EXIT_CODES.ERROR);\n }\n\n let sourcePath: string;\n s.start(\n options.agentSource\n ? \"Fetching agent partials...\"\n : \"Loading agent partials...\",\n );\n try {\n const agentDefs = await getAgentDefinitions(options.agentSource, {\n forceRefresh: options.refresh,\n });\n sourcePath = agentDefs.sourcePath;\n s.stop(\n options.agentSource\n ? \"Agent partials fetched\"\n : \"Agent partials loaded\",\n );\n } catch (error) {\n s.stop(\"Failed to load agent partials\");\n p.log.error(error instanceof Error ? error.message : String(error));\n process.exit(EXIT_CODES.ERROR);\n }\n\n s.start(\"Recompiling agents...\");\n try {\n const recompileResult = await recompileAgents({\n pluginDir,\n sourcePath,\n });\n\n if (recompileResult.failed.length > 0) {\n s.stop(\n `Recompiled ${recompileResult.compiled.length} agents (${recompileResult.failed.length} failed)`,\n );\n for (const warning of recompileResult.warnings) {\n p.log.warn(warning);\n }\n } else if (recompileResult.compiled.length > 0) {\n s.stop(`Recompiled ${recompileResult.compiled.length} agents`);\n } else {\n s.stop(\"No agents to recompile\");\n }\n } catch (error) {\n s.stop(\"Failed to recompile agents\");\n p.log.warn(\n `Agent recompilation failed: ${error instanceof Error ? error.message : String(error)}`,\n );\n p.log.info(pc.dim(\"You can manually recompile with 'cc compile'.\"));\n }\n\n s.start(\"Updating plugin version...\");\n try {\n const newVersion = await bumpPluginVersion(pluginDir, \"patch\");\n s.stop(`Version bumped to ${newVersion}`);\n } catch (error) {\n s.stop(\"Failed to update version\");\n p.log.error(error instanceof Error ? error.message : String(error));\n }\n\n console.log(\"\");\n p.outro(\n pc.green(\n `Plugin updated! (${addedSkills.length} added, ${removedSkills.length} removed)`,\n ),\n );\n });\n","import path from \"path\";\nimport { readFile, writeFile } from \"../utils/fs\";\nimport {\n PLUGIN_MANIFEST_DIR,\n PLUGIN_MANIFEST_FILE,\n DEFAULT_VERSION,\n} from \"../consts\";\nimport type { PluginManifest } from \"../../types\";\n\nexport type VersionBumpType = \"major\" | \"minor\" | \"patch\";\n\nfunction parseVersion(version: string): [number, number, number] {\n const parts = version.split(\".\").map(Number);\n return [parts[0] || 1, parts[1] || 0, parts[2] || 0];\n}\n\nexport async function bumpPluginVersion(\n pluginDir: string,\n type: VersionBumpType,\n): Promise<string> {\n const manifestPath = path.join(\n pluginDir,\n PLUGIN_MANIFEST_DIR,\n PLUGIN_MANIFEST_FILE,\n );\n const content = await readFile(manifestPath);\n const manifest = JSON.parse(content) as PluginManifest;\n\n const [major, minor, patch] = parseVersion(\n manifest.version || DEFAULT_VERSION,\n );\n\n let newVersion: string;\n switch (type) {\n case \"major\":\n newVersion = `${major + 1}.0.0`;\n break;\n case \"minor\":\n newVersion = `${major}.${minor + 1}.0`;\n break;\n case \"patch\":\n newVersion = `${major}.${minor}.${patch + 1}`;\n break;\n }\n\n manifest.version = newVersion;\n await writeFile(manifestPath, JSON.stringify(manifest, null, 2));\n\n return newVersion;\n}\n\nexport async function getPluginVersion(pluginDir: string): Promise<string> {\n const manifestPath = path.join(\n pluginDir,\n PLUGIN_MANIFEST_DIR,\n PLUGIN_MANIFEST_FILE,\n );\n const content = await readFile(manifestPath);\n const manifest = JSON.parse(content) as PluginManifest;\n return manifest.version || DEFAULT_VERSION;\n}\n","import { Command } from \"commander\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport path from \"path\";\nimport { setVerbose } from \"../utils/logger\";\nimport {\n validateAllSchemas,\n printValidationResults,\n} from \"../lib/schema-validator\";\nimport {\n validatePlugin,\n validateAllPlugins,\n printPluginValidationResult,\n} from \"../lib/plugin-validator\";\nimport { EXIT_CODES } from \"../lib/exit-codes\";\n\nexport const validateCommand = new Command(\"validate\")\n .description(\n \"Validate YAML files against schemas, or validate compiled plugins\",\n )\n .argument(\"[path]\", \"Path to plugin or plugins directory to validate\")\n .option(\"-v, --verbose\", \"Enable verbose logging\", false)\n .option(\"-a, --all\", \"Validate all plugins in directory\", false)\n .option(\"-p, --plugins\", \"Validate plugins instead of schemas\", false)\n .configureOutput({\n writeErr: (str) => console.error(pc.red(str)),\n })\n .showHelpAfterError(true)\n .action(async (pluginPath, options) => {\n const s = p.spinner();\n\n setVerbose(options.verbose);\n\n if (pluginPath || options.plugins) {\n await validatePluginsAction(pluginPath, options, s);\n } else {\n await validateSchemasAction(options, s);\n }\n });\n\nasync function validateSchemasAction(\n options: { verbose: boolean },\n s: ReturnType<typeof p.spinner>,\n): Promise<void> {\n console.log(`\\n${pc.bold(\"Validating all schemas\")}\\n`);\n\n try {\n s.start(\"Validating...\");\n const result = await validateAllSchemas();\n s.stop(\n result.valid\n ? pc.green(\n `Done: ${result.summary.validFiles}/${result.summary.totalFiles} files valid`,\n )\n : pc.red(`Done: ${result.summary.invalidFiles} invalid files`),\n );\n\n printValidationResults(result);\n\n if (!result.valid) {\n process.exit(EXIT_CODES.ERROR);\n }\n } catch (error) {\n s.stop(pc.red(\"Validation failed\"));\n const message = error instanceof Error ? error.message : String(error);\n console.error(pc.red(`\\nError: ${message}\\n`));\n process.exit(EXIT_CODES.ERROR);\n }\n}\n\nasync function validatePluginsAction(\n pluginPath: string | undefined,\n options: { verbose: boolean; all: boolean },\n s: ReturnType<typeof p.spinner>,\n): Promise<void> {\n const targetPath = pluginPath ? path.resolve(pluginPath) : process.cwd();\n\n if (options.all) {\n console.log(`\\n${pc.bold(\"Validating all plugins in:\")} ${targetPath}\\n`);\n\n try {\n s.start(\"Validating plugins...\");\n const result = await validateAllPlugins(targetPath);\n s.stop(\n result.valid\n ? pc.green(\n `Done: ${result.summary.valid}/${result.summary.total} plugins valid`,\n )\n : pc.red(`Done: ${result.summary.invalid} invalid plugins`),\n );\n\n console.log(`\\n Plugin Validation Summary:`);\n console.log(` -------------------------`);\n console.log(` Total plugins: ${result.summary.total}`);\n console.log(` Valid: ${result.summary.valid}`);\n console.log(` Invalid: ${result.summary.invalid}`);\n console.log(` With warnings: ${result.summary.withWarnings}`);\n\n for (const { name, result: pluginResult } of result.results) {\n printPluginValidationResult(name, pluginResult, options.verbose);\n }\n\n if (result.valid) {\n console.log(`\\n ${pc.green(\"All plugins validated successfully\")}\\n`);\n } else {\n console.log(`\\n ${pc.red(\"Validation failed\")}\\n`);\n process.exit(EXIT_CODES.ERROR);\n }\n } catch (error) {\n s.stop(pc.red(\"Validation failed\"));\n const message = error instanceof Error ? error.message : String(error);\n console.error(pc.red(`\\nError: ${message}\\n`));\n process.exit(EXIT_CODES.ERROR);\n }\n } else {\n console.log(`\\n${pc.bold(\"Validating plugin:\")} ${targetPath}\\n`);\n\n try {\n s.start(\"Validating plugin...\");\n const result = await validatePlugin(targetPath);\n s.stop(\n result.valid\n ? pc.green(\"Done: Plugin is valid\")\n : pc.red(\"Done: Plugin has errors\"),\n );\n\n printPluginValidationResult(path.basename(targetPath), result, true);\n\n if (result.valid && result.warnings.length === 0) {\n console.log(`\\n ${pc.green(\"Plugin validated successfully\")}\\n`);\n } else if (result.valid) {\n console.log(`\\n ${pc.yellow(\"Plugin valid with warnings\")}\\n`);\n } else {\n console.log(`\\n ${pc.red(\"Validation failed\")}\\n`);\n process.exit(EXIT_CODES.ERROR);\n }\n } catch (error) {\n s.stop(pc.red(\"Validation failed\"));\n const message = error instanceof Error ? error.message : String(error);\n console.error(pc.red(`\\nError: ${message}\\n`));\n process.exit(EXIT_CODES.ERROR);\n }\n }\n}\n","import Ajv, { type ValidateFunction, type ErrorObject } from \"ajv\";\nimport addFormats from \"ajv-formats\";\nimport path from \"path\";\nimport { readFile, fileExists } from \"../utils/fs\";\nimport { parse as parseYaml } from \"yaml\";\nimport fg from \"fast-glob\";\nimport { PROJECT_ROOT } from \"../consts\";\n\nexport interface FileValidationError {\n file: string;\n errors: string[];\n}\n\nexport interface SchemaValidationResult {\n schemaName: string;\n valid: boolean;\n totalFiles: number;\n validFiles: number;\n invalidFiles: FileValidationError[];\n}\n\nexport interface FullValidationResult {\n valid: boolean;\n results: SchemaValidationResult[];\n summary: {\n totalSchemas: number;\n totalFiles: number;\n validFiles: number;\n invalidFiles: number;\n };\n}\n\ntype ContentExtractor = (content: string) => unknown | null;\n\ninterface ValidationTarget {\n name: string;\n schema: string;\n pattern: string;\n baseDir: string;\n extractor?: ContentExtractor;\n}\n\nfunction extractFrontmatter(content: string): unknown | null {\n const frontmatterRegex = /^---\\r?\\n([\\s\\S]*?)\\r?\\n---/;\n const match = content.match(frontmatterRegex);\n\n if (!match || !match[1]) {\n return null;\n }\n\n try {\n return parseYaml(match[1]);\n } catch {\n return null;\n }\n}\n\nconst VALIDATION_TARGETS: ValidationTarget[] = [\n {\n name: \"Skills Matrix\",\n schema: \"skills-matrix.schema.json\",\n pattern: \"skills-matrix.yaml\",\n baseDir: \"src/config\",\n },\n {\n name: \"Skill Metadata\",\n schema: \"metadata.schema.json\",\n pattern: \"**/metadata.yaml\",\n baseDir: \"src/skills\",\n },\n {\n name: \"Stack Skill Metadata\",\n schema: \"metadata.schema.json\",\n pattern: \"**/skills/**/metadata.yaml\",\n baseDir: \"src/stacks\",\n },\n {\n name: \"Stack Config\",\n schema: \"stack.schema.json\",\n pattern: \"*/config.yaml\",\n baseDir: \"src/stacks\",\n },\n {\n name: \"Agent Definition\",\n schema: \"agent.schema.json\",\n pattern: \"**/agent.yaml\",\n baseDir: \"src/agents\",\n },\n {\n name: \"Skill Frontmatter\",\n schema: \"skill-frontmatter.schema.json\",\n pattern: \"**/SKILL.md\",\n baseDir: \"src/skills\",\n extractor: extractFrontmatter,\n },\n {\n name: \"Stack Skill Frontmatter\",\n schema: \"skill-frontmatter.schema.json\",\n pattern: \"**/skills/**/SKILL.md\",\n baseDir: \"src/stacks\",\n extractor: extractFrontmatter,\n },\n];\n\nconst schemaCache = new Map<string, object>();\nconst validatorCache = new Map<string, ValidateFunction>();\n\nasync function loadSchema(\n schemaName: string,\n rootDir: string = process.cwd(),\n): Promise<object> {\n const cacheKey = `${rootDir}:${schemaName}`;\n if (schemaCache.has(cacheKey)) {\n return schemaCache.get(cacheKey)!;\n }\n\n // Try multiple locations for schema files:\n // 1. CLI repo's schemas (for agent schemas)\n // 2. Target directory's schemas (for stack/skill schemas in claude-subagents)\n const locations = [\n path.join(PROJECT_ROOT, \"src\", \"schemas\", schemaName),\n path.join(rootDir, \"src\", \"schemas\", schemaName),\n ];\n\n for (const schemaPath of locations) {\n if (await fileExists(schemaPath)) {\n const content = await readFile(schemaPath);\n const schema = JSON.parse(content);\n schemaCache.set(cacheKey, schema);\n return schema;\n }\n }\n\n throw new Error(\n `Schema not found: ${schemaName}. Searched: ${locations.join(\", \")}`,\n );\n}\n\nasync function getValidator(\n schemaName: string,\n rootDir: string = process.cwd(),\n): Promise<ValidateFunction> {\n const cacheKey = `${rootDir}:${schemaName}`;\n if (validatorCache.has(cacheKey)) {\n return validatorCache.get(cacheKey)!;\n }\n\n const ajv = new Ajv({ allErrors: true, strict: false });\n addFormats(ajv);\n const schema = await loadSchema(schemaName, rootDir);\n const validate = ajv.compile(schema);\n validatorCache.set(cacheKey, validate);\n return validate;\n}\n\nfunction formatAjvErrors(errors: ErrorObject[] | null | undefined): string[] {\n if (!errors) return [];\n\n return errors.map((err) => {\n const errorPath = err.instancePath\n ? err.instancePath.replace(/^\\//, \"\").replace(/\\//g, \".\")\n : \"\";\n const message = err.message || \"Unknown error\";\n\n if (err.keyword === \"additionalProperties\") {\n const prop = (err.params as { additionalProperty?: string })\n .additionalProperty;\n return `Unrecognized key: \"${prop}\"`;\n }\n\n if (err.keyword === \"enum\") {\n const allowed = (err.params as { allowedValues?: string[] })\n .allowedValues;\n return errorPath\n ? `${errorPath}: ${message}. Allowed: ${allowed?.join(\", \")}`\n : `${message}. Allowed: ${allowed?.join(\", \")}`;\n }\n\n return errorPath ? `${errorPath}: ${message}` : message;\n });\n}\n\nasync function validateFile(\n filePath: string,\n validate: ValidateFunction,\n extractor?: ContentExtractor,\n): Promise<{ valid: boolean; errors: string[] }> {\n try {\n if (!(await fileExists(filePath))) {\n return { valid: false, errors: [`File not found: ${filePath}`] };\n }\n\n const content = await readFile(filePath);\n\n let parsed: unknown;\n if (extractor) {\n parsed = extractor(content);\n if (parsed === null) {\n return {\n valid: false,\n errors: [\"Failed to extract content (no valid frontmatter found)\"],\n };\n }\n } else {\n parsed = parseYaml(content);\n }\n\n const isValid = validate(parsed);\n\n if (isValid) {\n return { valid: true, errors: [] };\n }\n\n return { valid: false, errors: formatAjvErrors(validate.errors) };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { valid: false, errors: [`Failed to parse content: ${message}`] };\n }\n}\n\nasync function validateTarget(\n target: ValidationTarget,\n rootDir: string = process.cwd(),\n): Promise<SchemaValidationResult> {\n const baseDir = path.join(rootDir, target.baseDir);\n const pattern = path.join(baseDir, target.pattern);\n const files = await fg(pattern, { absolute: true });\n\n const result: SchemaValidationResult = {\n schemaName: target.name,\n valid: true,\n totalFiles: files.length,\n validFiles: 0,\n invalidFiles: [],\n };\n\n if (files.length === 0) {\n return result;\n }\n\n const validate = await getValidator(target.schema, rootDir);\n\n for (const file of files) {\n const validation = await validateFile(file, validate, target.extractor);\n const relativePath = path.relative(rootDir, file);\n\n if (validation.valid) {\n result.validFiles++;\n } else {\n result.valid = false;\n result.invalidFiles.push({\n file: relativePath,\n errors: validation.errors,\n });\n }\n }\n\n return result;\n}\n\nexport async function validateAllSchemas(\n rootDir: string = process.cwd(),\n): Promise<FullValidationResult> {\n const results: SchemaValidationResult[] = [];\n\n for (const target of VALIDATION_TARGETS) {\n const result = await validateTarget(target, rootDir);\n results.push(result);\n }\n\n const summary = {\n totalSchemas: results.length,\n totalFiles: results.reduce((sum, r) => sum + r.totalFiles, 0),\n validFiles: results.reduce((sum, r) => sum + r.validFiles, 0),\n invalidFiles: results.reduce((sum, r) => sum + r.invalidFiles.length, 0),\n };\n\n return {\n valid: results.every((r) => r.valid),\n results,\n summary,\n };\n}\n\nexport function printValidationResults(result: FullValidationResult): void {\n console.log(`\\n Schema Validation Summary:`);\n console.log(` ─────────────────────────`);\n console.log(` Total schemas checked: ${result.summary.totalSchemas}`);\n console.log(` Total files: ${result.summary.totalFiles}`);\n console.log(` Valid: ${result.summary.validFiles}`);\n console.log(` Invalid: ${result.summary.invalidFiles}`);\n\n for (const schemaResult of result.results) {\n if (schemaResult.totalFiles === 0) continue;\n\n const status = schemaResult.valid ? \"✓\" : \"✗\";\n console.log(\n `\\n ${status} ${schemaResult.schemaName}: ${schemaResult.validFiles}/${schemaResult.totalFiles} valid`,\n );\n\n if (schemaResult.invalidFiles.length > 0) {\n for (const file of schemaResult.invalidFiles) {\n console.log(`\\n ${file.file}:`);\n file.errors.forEach((e) => console.log(` - ${e}`));\n }\n }\n }\n\n if (result.valid) {\n console.log(`\\n ✓ All schemas validated successfully\\n`);\n } else {\n console.log(`\\n ✗ Validation failed\\n`);\n }\n}\n","import Ajv, { type ValidateFunction, type ErrorObject } from \"ajv\";\nimport addFormats from \"ajv-formats\";\nimport path from \"path\";\nimport { parse as parseYaml } from \"yaml\";\nimport fg from \"fast-glob\";\nimport {\n fileExists,\n readFile,\n directoryExists,\n listDirectories,\n} from \"../utils/fs\";\nimport { PROJECT_ROOT } from \"../consts\";\nimport type { ValidationResult } from \"../../types\";\n\nconst PLUGIN_DIR = \".claude-plugin\";\nconst PLUGIN_MANIFEST = \"plugin.json\";\nconst SKILL_FILE = \"SKILL.md\";\nconst KEBAB_CASE_REGEX = /^[a-z][a-z0-9]*(-[a-z0-9]+)*$/;\nconst SEMVER_REGEX =\n /^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$/;\n\nconst schemaCache = new Map<string, object>();\nconst validatorCache = new Map<string, ValidateFunction>();\n\nasync function loadSchema(schemaName: string): Promise<object> {\n if (schemaCache.has(schemaName)) {\n return schemaCache.get(schemaName)!;\n }\n\n // Try multiple locations for schema files:\n // 1. CLI repo's schemas (for plugin, agent schemas)\n // 2. Current directory's schemas (for skill schemas in claude-subagents)\n const locations = [\n path.join(PROJECT_ROOT, \"src\", \"schemas\", schemaName),\n path.join(process.cwd(), \"src\", \"schemas\", schemaName),\n ];\n\n for (const schemaPath of locations) {\n if (await fileExists(schemaPath)) {\n const content = await readFile(schemaPath);\n const schema = JSON.parse(content);\n schemaCache.set(schemaName, schema);\n return schema;\n }\n }\n\n throw new Error(\n `Schema not found: ${schemaName}. Searched: ${locations.join(\", \")}`,\n );\n}\n\nasync function getValidator(schemaName: string): Promise<ValidateFunction> {\n if (validatorCache.has(schemaName)) {\n return validatorCache.get(schemaName)!;\n }\n\n const ajv = new Ajv({ allErrors: true, strict: false });\n addFormats(ajv);\n const schema = await loadSchema(schemaName);\n const validate = ajv.compile(schema);\n validatorCache.set(schemaName, validate);\n return validate;\n}\n\nfunction formatAjvErrors(errors: ErrorObject[] | null | undefined): string[] {\n if (!errors) return [];\n\n return errors.map((err) => {\n const errorPath = err.instancePath\n ? err.instancePath.replace(/^\\//, \"\").replace(/\\//g, \".\")\n : \"\";\n const message = err.message || \"Unknown error\";\n\n if (err.keyword === \"additionalProperties\") {\n const prop = (err.params as { additionalProperty?: string })\n .additionalProperty;\n return `Unrecognized key: \"${prop}\"`;\n }\n\n if (err.keyword === \"enum\") {\n const allowed = (err.params as { allowedValues?: string[] })\n .allowedValues;\n return errorPath\n ? `${errorPath}: ${message}. Allowed: ${allowed?.join(\", \")}`\n : `${message}. Allowed: ${allowed?.join(\", \")}`;\n }\n\n if (err.keyword === \"pattern\") {\n let hint = \"\";\n if (errorPath === \"name\") {\n hint = \" (must be kebab-case)\";\n } else if (errorPath === \"version\") {\n hint = \" (must be semver: x.y.z)\";\n }\n return errorPath\n ? `${errorPath}: ${message}${hint}`\n : `${message}${hint}`;\n }\n\n return errorPath ? `${errorPath}: ${message}` : message;\n });\n}\n\nfunction extractFrontmatter(content: string): unknown | null {\n const frontmatterRegex = /^---\\r?\\n([\\s\\S]*?)\\r?\\n---/;\n const match = content.match(frontmatterRegex);\n\n if (!match || !match[1]) {\n return null;\n }\n\n try {\n return parseYaml(match[1]);\n } catch {\n return null;\n }\n}\n\nfunction isKebabCase(str: string): boolean {\n return KEBAB_CASE_REGEX.test(str);\n}\n\nfunction isValidSemver(str: string): boolean {\n return SEMVER_REGEX.test(str);\n}\n\nexport async function validatePluginStructure(\n pluginPath: string,\n): Promise<ValidationResult> {\n const errors: string[] = [];\n const warnings: string[] = [];\n\n if (!(await directoryExists(pluginPath))) {\n return {\n valid: false,\n errors: [`Plugin directory does not exist: ${pluginPath}`],\n warnings: [],\n };\n }\n\n const pluginDir = path.join(pluginPath, PLUGIN_DIR);\n if (!(await directoryExists(pluginDir))) {\n errors.push(`Missing ${PLUGIN_DIR}/ directory`);\n }\n\n const manifestPath = path.join(pluginDir, PLUGIN_MANIFEST);\n if (!(await fileExists(manifestPath))) {\n errors.push(`Missing ${PLUGIN_DIR}/${PLUGIN_MANIFEST}`);\n }\n\n const readmePath = path.join(pluginPath, \"README.md\");\n if (!(await fileExists(readmePath))) {\n warnings.push(\"Missing README.md (recommended for documentation)\");\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings,\n };\n}\n\nexport async function validatePluginManifest(\n manifestPath: string,\n): Promise<ValidationResult> {\n const errors: string[] = [];\n const warnings: string[] = [];\n\n if (!(await fileExists(manifestPath))) {\n return {\n valid: false,\n errors: [`Manifest file not found: ${manifestPath}`],\n warnings: [],\n };\n }\n\n let manifest: Record<string, unknown>;\n try {\n const content = await readFile(manifestPath);\n manifest = JSON.parse(content);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n return {\n valid: false,\n errors: [`Invalid JSON in ${PLUGIN_MANIFEST}: ${message}`],\n warnings: [],\n };\n }\n\n const validate = await getValidator(\"plugin.schema.json\");\n const isValid = validate(manifest);\n\n if (!isValid) {\n errors.push(...formatAjvErrors(validate.errors));\n }\n\n if (manifest.name && typeof manifest.name === \"string\") {\n if (!isKebabCase(manifest.name)) {\n errors.push(`name must be kebab-case: \"${manifest.name}\"`);\n }\n }\n\n if (manifest.version && typeof manifest.version === \"string\") {\n if (!isValidSemver(manifest.version)) {\n warnings.push(\n `version \"${manifest.version}\" is not valid semver (expected: major.minor.patch)`,\n );\n }\n }\n\n if (!manifest.description) {\n warnings.push(\n \"Missing description field (recommended for discoverability)\",\n );\n }\n\n const pluginDir = path.dirname(path.dirname(manifestPath));\n\n if (manifest.skills && typeof manifest.skills === \"string\") {\n const skillsPath = path.join(pluginDir, manifest.skills);\n if (!(await directoryExists(skillsPath))) {\n errors.push(`Skills path does not exist: ${manifest.skills}`);\n }\n }\n\n if (manifest.agents && typeof manifest.agents === \"string\") {\n const agentsPath = path.join(pluginDir, manifest.agents);\n if (!(await directoryExists(agentsPath))) {\n errors.push(`Agents path does not exist: ${manifest.agents}`);\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings,\n };\n}\n\nexport async function validateSkillFrontmatter(\n skillPath: string,\n): Promise<ValidationResult> {\n const errors: string[] = [];\n const warnings: string[] = [];\n\n if (!(await fileExists(skillPath))) {\n return {\n valid: false,\n errors: [`Skill file not found: ${skillPath}`],\n warnings: [],\n };\n }\n\n const content = await readFile(skillPath);\n const frontmatter = extractFrontmatter(content);\n\n if (frontmatter === null) {\n return {\n valid: false,\n errors: [\"Missing or invalid YAML frontmatter\"],\n warnings: [],\n };\n }\n\n const validate = await getValidator(\"skill-frontmatter.schema.json\");\n const isValid = validate(frontmatter);\n\n if (!isValid) {\n errors.push(...formatAjvErrors(validate.errors));\n }\n\n const fm = frontmatter as Record<string, unknown>;\n\n if (fm.category) {\n warnings.push(\n 'Deprecated field: \"category\" - use metadata.yaml for category information',\n );\n }\n if (fm.author) {\n warnings.push(\n 'Deprecated field: \"author\" - use metadata.yaml for author information',\n );\n }\n if (fm.version) {\n warnings.push(\n 'Deprecated field: \"version\" - use metadata.yaml for version information',\n );\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings,\n };\n}\n\nexport async function validateAgentFrontmatter(\n agentPath: string,\n): Promise<ValidationResult> {\n const errors: string[] = [];\n const warnings: string[] = [];\n\n if (!(await fileExists(agentPath))) {\n return {\n valid: false,\n errors: [`Agent file not found: ${agentPath}`],\n warnings: [],\n };\n }\n\n const content = await readFile(agentPath);\n const frontmatter = extractFrontmatter(content);\n\n if (frontmatter === null) {\n return {\n valid: false,\n errors: [\"Missing or invalid YAML frontmatter\"],\n warnings: [],\n };\n }\n\n const validate = await getValidator(\"agent-frontmatter.schema.json\");\n const isValid = validate(frontmatter);\n\n if (!isValid) {\n errors.push(...formatAjvErrors(validate.errors));\n }\n\n const fm = frontmatter as Record<string, unknown>;\n\n if (fm.name && typeof fm.name === \"string\") {\n if (!isKebabCase(fm.name)) {\n errors.push(`name must be kebab-case: \"${fm.name}\"`);\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings,\n };\n}\n\nexport async function validatePlugin(\n pluginPath: string,\n): Promise<ValidationResult> {\n const errors: string[] = [];\n const warnings: string[] = [];\n\n const structureResult = await validatePluginStructure(pluginPath);\n errors.push(...structureResult.errors);\n warnings.push(...structureResult.warnings);\n\n if (!structureResult.valid) {\n return { valid: false, errors, warnings };\n }\n\n const manifestPath = path.join(pluginPath, PLUGIN_DIR, PLUGIN_MANIFEST);\n const manifestResult = await validatePluginManifest(manifestPath);\n errors.push(...manifestResult.errors);\n warnings.push(...manifestResult.warnings);\n\n let manifest: Record<string, unknown> | null = null;\n try {\n const content = await readFile(manifestPath);\n manifest = JSON.parse(content);\n } catch {}\n\n if (manifest) {\n if (manifest.skills && typeof manifest.skills === \"string\") {\n const skillsDir = path.join(pluginPath, manifest.skills);\n if (await directoryExists(skillsDir)) {\n const skillFiles = await fg(\"**/SKILL.md\", {\n cwd: skillsDir,\n absolute: true,\n });\n\n if (skillFiles.length === 0) {\n warnings.push(\n `Skills directory exists but contains no SKILL.md files: ${manifest.skills}`,\n );\n }\n\n for (const skillFile of skillFiles) {\n const relativePath = path.relative(pluginPath, skillFile);\n const skillResult = await validateSkillFrontmatter(skillFile);\n\n if (!skillResult.valid) {\n errors.push(\n ...skillResult.errors.map((e) => `${relativePath}: ${e}`),\n );\n }\n warnings.push(\n ...skillResult.warnings.map((w) => `${relativePath}: ${w}`),\n );\n }\n }\n }\n\n if (manifest.agents && typeof manifest.agents === \"string\") {\n const agentsDir = path.join(pluginPath, manifest.agents);\n if (await directoryExists(agentsDir)) {\n const agentFiles = await fg(\"*.md\", {\n cwd: agentsDir,\n absolute: true,\n });\n\n if (agentFiles.length === 0) {\n warnings.push(\n `Agents directory exists but contains no .md files: ${manifest.agents}`,\n );\n }\n\n for (const agentFile of agentFiles) {\n const relativePath = path.relative(pluginPath, agentFile);\n const agentResult = await validateAgentFrontmatter(agentFile);\n\n if (!agentResult.valid) {\n errors.push(\n ...agentResult.errors.map((e) => `${relativePath}: ${e}`),\n );\n }\n warnings.push(\n ...agentResult.warnings.map((w) => `${relativePath}: ${w}`),\n );\n }\n }\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings,\n };\n}\n\nexport async function validateAllPlugins(pluginsDir: string): Promise<{\n valid: boolean;\n results: Array<{ name: string; result: ValidationResult }>;\n summary: {\n total: number;\n valid: number;\n invalid: number;\n withWarnings: number;\n };\n}> {\n const results: Array<{ name: string; result: ValidationResult }> = [];\n\n if (!(await directoryExists(pluginsDir))) {\n return {\n valid: false,\n results: [\n {\n name: pluginsDir,\n result: {\n valid: false,\n errors: [`Directory does not exist: ${pluginsDir}`],\n warnings: [],\n },\n },\n ],\n summary: { total: 0, valid: 0, invalid: 1, withWarnings: 0 },\n };\n }\n\n const allDirs = await listDirectories(pluginsDir);\n const pluginDirs: string[] = [];\n\n for (const dirName of allDirs) {\n const potentialPluginDir = path.join(pluginsDir, dirName, PLUGIN_DIR);\n if (await directoryExists(potentialPluginDir)) {\n pluginDirs.push(dirName);\n }\n }\n\n if (pluginDirs.length === 0) {\n return {\n valid: false,\n results: [\n {\n name: pluginsDir,\n result: {\n valid: false,\n errors: [\n `No plugins found in directory: ${pluginsDir}. Plugins must contain a ${PLUGIN_DIR}/ directory.`,\n ],\n warnings: [],\n },\n },\n ],\n summary: { total: 0, valid: 0, invalid: 1, withWarnings: 0 },\n };\n }\n\n for (const pluginName of pluginDirs) {\n const pluginPath = path.join(pluginsDir, pluginName);\n const result = await validatePlugin(pluginPath);\n results.push({ name: pluginName, result });\n }\n\n const summary = {\n total: results.length,\n valid: results.filter((r) => r.result.valid).length,\n invalid: results.filter((r) => !r.result.valid).length,\n withWarnings: results.filter((r) => r.result.warnings.length > 0).length,\n };\n\n return {\n valid: summary.invalid === 0,\n results,\n summary,\n };\n}\n\nexport function printPluginValidationResult(\n name: string,\n result: ValidationResult,\n verbose = false,\n): void {\n const status = result.valid ? \"\\u2713\" : \"\\u2717\";\n\n if (result.valid && result.warnings.length === 0 && !verbose) {\n return;\n }\n\n console.log(`\\n ${status} ${name}`);\n\n if (result.errors.length > 0) {\n console.log(\" Errors:\");\n result.errors.forEach((e) => console.log(` - ${e}`));\n }\n\n if (result.warnings.length > 0) {\n console.log(\" Warnings:\");\n result.warnings.forEach((w) => console.log(` - ${w}`));\n }\n}\n","import { Command } from \"commander\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { getPluginInfo, formatPluginDisplay } from \"../lib/plugin-info\";\n\nexport const listCommand = new Command(\"list\")\n .alias(\"ls\")\n .description(\"Show plugin information\")\n .configureOutput({\n writeErr: (str) => console.error(pc.red(str)),\n })\n .showHelpAfterError(true)\n .action(async () => {\n const info = await getPluginInfo();\n\n if (!info) {\n p.log.warn(\"No plugin found.\");\n p.log.info(`Run ${pc.cyan(\"cc init\")} to create one.`);\n return;\n }\n\n console.log(\"\");\n p.log.info(formatPluginDisplay(info));\n console.log(\"\");\n });\n","import { readdir } from \"fs/promises\";\nimport {\n getCollectivePluginDir,\n getPluginSkillsDir,\n getPluginAgentsDir,\n readPluginManifest,\n} from \"./plugin-finder\";\nimport { directoryExists } from \"../utils/fs\";\nimport { DEFAULT_DISPLAY_VERSION } from \"../consts\";\n\nconst DEFAULT_NAME = \"claude-collective\";\n\nexport interface PluginInfo {\n name: string;\n version: string;\n skillCount: number;\n agentCount: number;\n path: string;\n}\n\nexport async function getPluginInfo(): Promise<PluginInfo | null> {\n const pluginDir = getCollectivePluginDir();\n\n if (!(await directoryExists(pluginDir))) {\n return null;\n }\n\n const manifest = await readPluginManifest(pluginDir);\n if (!manifest) {\n return null;\n }\n\n const skillsDir = getPluginSkillsDir(pluginDir);\n const agentsDir = getPluginAgentsDir(pluginDir);\n\n let skillCount = 0;\n let agentCount = 0;\n\n if (await directoryExists(skillsDir)) {\n const skills = await readdir(skillsDir, { withFileTypes: true });\n skillCount = skills.filter((s) => s.isDirectory()).length;\n }\n\n if (await directoryExists(agentsDir)) {\n const agents = await readdir(agentsDir, { withFileTypes: true });\n agentCount = agents.filter(\n (a) => a.isFile() && a.name.endsWith(\".md\"),\n ).length;\n }\n\n return {\n name: manifest.name || DEFAULT_NAME,\n version: manifest.version || DEFAULT_DISPLAY_VERSION,\n skillCount,\n agentCount,\n path: pluginDir,\n };\n}\n\nexport function formatPluginDisplay(info: PluginInfo): string {\n return `Plugin: ${info.name} v${info.version}\n Skills: ${info.skillCount}\n Agents: ${info.agentCount}\n Path: ${info.path}`;\n}\n","import { Command } from \"commander\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport {\n resolveSource,\n loadGlobalConfig,\n saveGlobalConfig,\n loadProjectConfig,\n saveProjectConfig,\n getGlobalConfigPath,\n getProjectConfigPath,\n formatSourceOrigin,\n DEFAULT_SOURCE,\n SOURCE_ENV_VAR,\n type GlobalConfig,\n type ProjectConfig,\n} from \"../lib/config\";\nimport { EXIT_CODES } from \"../lib/exit-codes\";\n\nexport const configCommand = new Command(\"config\")\n .description(\"Manage Claude Collective configuration\")\n .configureOutput({\n writeErr: (str) => console.error(pc.red(str)),\n })\n .showHelpAfterError(true);\n\nconfigCommand\n .command(\"show\")\n .description(\"Show current effective configuration\")\n .action(async () => {\n const projectDir = process.cwd();\n\n console.log(pc.cyan(\"\\nClaude Collective Configuration\\n\"));\n\n const resolved = await resolveSource(undefined, projectDir);\n\n console.log(pc.bold(\"Source:\"));\n console.log(` ${pc.green(resolved.source)}`);\n console.log(\n ` ${pc.dim(`(from ${formatSourceOrigin(resolved.sourceOrigin)})`)}`,\n );\n console.log(\"\");\n\n console.log(pc.bold(\"Configuration Layers:\"));\n console.log(\"\");\n\n const envValue = process.env[SOURCE_ENV_VAR];\n console.log(` ${pc.dim(\"1.\")} Environment (${SOURCE_ENV_VAR}):`);\n if (envValue) {\n console.log(` ${pc.green(envValue)}`);\n } else {\n console.log(` ${pc.dim(\"(not set)\")}`);\n }\n\n const projectConfig = await loadProjectConfig(projectDir);\n const projectConfigPath = getProjectConfigPath(projectDir);\n console.log(` ${pc.dim(\"2.\")} Project config:`);\n console.log(` ${pc.dim(projectConfigPath)}`);\n if (projectConfig?.source) {\n console.log(` source: ${pc.green(projectConfig.source)}`);\n } else {\n console.log(` ${pc.dim(\"(not configured)\")}`);\n }\n\n const globalConfig = await loadGlobalConfig();\n const globalConfigPath = getGlobalConfigPath();\n console.log(` ${pc.dim(\"3.\")} Global config:`);\n console.log(` ${pc.dim(globalConfigPath)}`);\n if (globalConfig?.source) {\n console.log(` source: ${pc.green(globalConfig.source)}`);\n } else {\n console.log(` ${pc.dim(\"(not configured)\")}`);\n }\n\n console.log(` ${pc.dim(\"4.\")} Default:`);\n console.log(` ${pc.dim(DEFAULT_SOURCE)}`);\n\n console.log(\"\");\n console.log(pc.dim(\"Precedence: flag > env > project > global > default\"));\n console.log(\"\");\n });\n\nconfigCommand\n .command(\"set\")\n .description(\"Set a global configuration value\")\n .argument(\"<key>\", \"Configuration key (source, author)\")\n .argument(\"<value>\", \"Configuration value\")\n .action(async (key: string, value: string) => {\n const validKeys = [\"source\", \"author\"];\n\n if (!validKeys.includes(key)) {\n p.log.error(`Unknown configuration key: ${key}`);\n p.log.info(`Valid keys: ${validKeys.join(\", \")}`);\n process.exit(EXIT_CODES.INVALID_ARGS);\n }\n\n const existingConfig = (await loadGlobalConfig()) || {};\n const newConfig: GlobalConfig = {\n ...existingConfig,\n [key]: value,\n };\n\n await saveGlobalConfig(newConfig);\n\n p.log.success(`Set ${key} = ${value}`);\n p.log.info(`Saved to ${getGlobalConfigPath()}`);\n });\n\nconfigCommand\n .command(\"get\")\n .description(\"Get a configuration value\")\n .argument(\"<key>\", \"Configuration key (source, author)\")\n .action(async (key: string) => {\n const projectDir = process.cwd();\n\n if (key === \"source\") {\n const resolved = await resolveSource(undefined, projectDir);\n console.log(resolved.source);\n } else if (key === \"author\") {\n const globalConfig = await loadGlobalConfig();\n console.log(globalConfig?.author || \"\");\n } else {\n p.log.error(`Unknown configuration key: ${key}`);\n p.log.info(`Valid keys: source, author`);\n process.exit(EXIT_CODES.INVALID_ARGS);\n }\n });\n\nconfigCommand\n .command(\"unset\")\n .description(\"Remove a global configuration value\")\n .argument(\"<key>\", \"Configuration key to remove\")\n .action(async (key: string) => {\n const validKeys = [\"source\", \"author\"];\n\n if (!validKeys.includes(key)) {\n p.log.error(`Unknown configuration key: ${key}`);\n p.log.info(`Valid keys: ${validKeys.join(\", \")}`);\n process.exit(EXIT_CODES.INVALID_ARGS);\n }\n\n const existingConfig = await loadGlobalConfig();\n if (!existingConfig) {\n p.log.info(\"No global configuration exists.\");\n return;\n }\n\n const newConfig: GlobalConfig = { ...existingConfig };\n delete newConfig[key as keyof GlobalConfig];\n\n await saveGlobalConfig(newConfig);\n\n p.log.success(`Removed ${key} from global configuration`);\n });\n\nconfigCommand\n .command(\"set-project\")\n .description(\"Set a project-level configuration value\")\n .argument(\"<key>\", \"Configuration key (source)\")\n .argument(\"<value>\", \"Configuration value\")\n .action(async (key: string, value: string) => {\n const projectDir = process.cwd();\n const validKeys = [\"source\"];\n\n if (!validKeys.includes(key)) {\n p.log.error(`Unknown configuration key: ${key}`);\n p.log.info(`Valid keys: ${validKeys.join(\", \")}`);\n process.exit(EXIT_CODES.INVALID_ARGS);\n }\n\n const existingConfig = (await loadProjectConfig(projectDir)) || {};\n\n const newConfig: ProjectConfig = {\n ...existingConfig,\n [key]: value,\n };\n\n await saveProjectConfig(projectDir, newConfig);\n\n p.log.success(`Set ${key} = ${value} (project-level)`);\n p.log.info(`Saved to ${getProjectConfigPath(projectDir)}`);\n });\n\nconfigCommand\n .command(\"unset-project\")\n .description(\"Remove a project-level configuration value\")\n .argument(\"<key>\", \"Configuration key to remove\")\n .action(async (key: string) => {\n const projectDir = process.cwd();\n const validKeys = [\"source\"];\n\n if (!validKeys.includes(key)) {\n p.log.error(`Unknown configuration key: ${key}`);\n p.log.info(`Valid keys: ${validKeys.join(\", \")}`);\n process.exit(EXIT_CODES.INVALID_ARGS);\n }\n\n const existingConfig = await loadProjectConfig(projectDir);\n\n if (!existingConfig) {\n p.log.info(\"No project configuration exists.\");\n return;\n }\n\n const newConfig: ProjectConfig = { ...existingConfig };\n delete newConfig[key as keyof ProjectConfig];\n\n await saveProjectConfig(projectDir, newConfig);\n\n p.log.success(`Removed ${key} from project configuration`);\n });\n\nconfigCommand\n .command(\"path\")\n .description(\"Show configuration file paths\")\n .action(async () => {\n const projectDir = process.cwd();\n\n console.log(pc.bold(\"\\nConfiguration File Paths:\\n\"));\n console.log(`Global: ${getGlobalConfigPath()}`);\n console.log(`Project: ${getProjectConfigPath(projectDir)}`);\n console.log(\"\");\n });\n","import { Command } from \"commander\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport path from \"path\";\nimport {\n copy,\n ensureDir,\n directoryExists,\n fileExists,\n writeFile,\n} from \"../utils/fs\";\nimport { DIRS, PROJECT_ROOT } from \"../consts\";\nimport { EXIT_CODES } from \"../lib/exit-codes\";\n\nconst EJECT_TYPES = [\"templates\", \"skills\", \"config\", \"all\"] as const;\ntype EjectType = (typeof EJECT_TYPES)[number];\n\nconst DEFAULT_CONFIG_CONTENT = `# Claude Collective Configuration\n# Agent-skill mappings for this project\n\nname: my-project\ndescription: Project description\n\n# Agents to compile\nagents:\n - web-developer\n - api-developer\n - web-tester\n - web-pm\n\n# Agent-specific skill assignments (optional)\n# If not specified, all available skills are given to all agents\nagent_skills:\n web-developer:\n - react\n - zustand\n - scss-modules\n api-developer:\n - hono\n - drizzle\n - better-auth\n`;\n\nconst DEFAULT_SKILL_MD_CONTENT = `---\nname: example-skill\ndescription: Short description of the skill\n---\n\n# Example Skill\n\n## Overview\nDescribe what this skill teaches the agent.\n\n## Instructions\nSpecific instructions for the agent.\n\n## Examples\n\\`\\`\\`typescript\n// Example code\n\\`\\`\\`\n`;\n\nconst DEFAULT_METADATA_CONTENT = `# yaml-language-server: $schema=../../schemas/metadata.schema.json\ncategory: custom\nauthor: \"@local\"\ncli_name: Example Skill\ncli_description: Short description for CLI\n`;\n\nexport const ejectCommand = new Command(\"eject\")\n .description(\"Eject bundled content for local customization\")\n .argument(\"[type]\", \"What to eject: templates, skills, config, all\")\n .option(\"-f, --force\", \"Overwrite existing files\", false)\n .configureOutput({\n writeErr: (str) => console.error(pc.red(str)),\n })\n .showHelpAfterError(true)\n .action(async (type: string | undefined, options: { force: boolean }) => {\n const projectDir = process.cwd();\n\n if (!type) {\n p.log.error(\n \"Please specify what to eject: templates, skills, config, or all\",\n );\n process.exit(EXIT_CODES.INVALID_ARGS);\n }\n\n if (!EJECT_TYPES.includes(type as EjectType)) {\n p.log.error(`Unknown eject type: ${type}`);\n p.log.info(`Valid types: ${EJECT_TYPES.join(\", \")}`);\n process.exit(EXIT_CODES.INVALID_ARGS);\n }\n\n p.intro(pc.cyan(\"Claude Collective Eject\"));\n\n const ejectType = type as EjectType;\n\n switch (ejectType) {\n case \"templates\":\n await ejectTemplates(projectDir, options.force);\n break;\n case \"skills\":\n await ejectSkills(projectDir, options.force);\n break;\n case \"config\":\n await ejectConfig(projectDir, options.force);\n break;\n case \"all\":\n await ejectTemplates(projectDir, options.force);\n await ejectSkills(projectDir, options.force);\n await ejectConfig(projectDir, options.force);\n break;\n }\n\n p.outro(pc.green(\"Eject complete!\"));\n });\n\nasync function ejectTemplates(\n projectDir: string,\n force: boolean,\n): Promise<void> {\n const sourceDir = path.join(PROJECT_ROOT, DIRS.templates);\n const destDir = path.join(projectDir, \".claude\", \"templates\");\n\n if ((await directoryExists(destDir)) && !force) {\n p.log.warn(\n `Templates already exist at ${destDir}. Use --force to overwrite.`,\n );\n return;\n }\n\n await ensureDir(destDir);\n await copy(sourceDir, destDir);\n\n p.log.success(`Templates ejected to ${pc.cyan(destDir)}`);\n p.log.info(\n pc.dim(\"You can now customize agent.liquid and partials locally.\"),\n );\n}\n\nasync function ejectSkills(projectDir: string, force: boolean): Promise<void> {\n const destDir = path.join(projectDir, \".claude\", \"skill-templates\");\n\n if ((await directoryExists(destDir)) && !force) {\n p.log.warn(\n `Skill templates already exist at ${destDir}. Use --force to overwrite.`,\n );\n return;\n }\n\n await ensureDir(destDir);\n\n const exampleSkillDir = path.join(destDir, \"example-skill\");\n await ensureDir(exampleSkillDir);\n\n await writeFile(\n path.join(exampleSkillDir, \"SKILL.md\"),\n DEFAULT_SKILL_MD_CONTENT,\n );\n\n await writeFile(\n path.join(exampleSkillDir, \"metadata.yaml\"),\n DEFAULT_METADATA_CONTENT,\n );\n\n p.log.success(`Skill templates ejected to ${pc.cyan(destDir)}`);\n p.log.info(pc.dim(\"Copy example-skill/ to .claude/skills/ and customize.\"));\n}\n\nasync function ejectConfig(projectDir: string, force: boolean): Promise<void> {\n const destPath = path.join(projectDir, \".claude\", \"config.yaml\");\n\n if ((await fileExists(destPath)) && !force) {\n p.log.warn(\n `Config already exists at ${destPath}. Use --force to overwrite.`,\n );\n return;\n }\n\n await ensureDir(path.dirname(destPath));\n await writeFile(destPath, DEFAULT_CONFIG_CONTENT);\n\n p.log.success(`Config template ejected to ${pc.cyan(destPath)}`);\n p.log.info(pc.dim(\"Customize agent-skill mappings for your project.\"));\n}\n","import { Command } from \"commander\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport path from \"path\";\nimport {\n PLUGIN_MANIFEST_DIR,\n PLUGIN_MANIFEST_FILE,\n DEFAULT_VERSION,\n} from \"../consts\";\nimport { readFile, writeFile, fileExists } from \"../utils/fs\";\nimport { EXIT_CODES } from \"../lib/exit-codes\";\nimport type { PluginManifest } from \"../../types\";\n\ntype VersionAction = \"patch\" | \"minor\" | \"major\" | \"set\";\n\ninterface SemverParts {\n major: number;\n minor: number;\n patch: number;\n}\n\nconst SEMVER_REGEX = /^(\\d+)\\.(\\d+)\\.(\\d+)$/;\n\nfunction parseSemver(version: string): SemverParts | null {\n const match = version.match(SEMVER_REGEX);\n if (!match) {\n return null;\n }\n return {\n major: parseInt(match[1], 10),\n minor: parseInt(match[2], 10),\n patch: parseInt(match[3], 10),\n };\n}\n\nfunction formatSemver(parts: SemverParts): string {\n return `${parts.major}.${parts.minor}.${parts.patch}`;\n}\n\nfunction incrementVersion(\n version: string,\n action: \"patch\" | \"minor\" | \"major\",\n): string {\n const parts = parseSemver(version);\n if (!parts) {\n return DEFAULT_VERSION;\n }\n\n switch (action) {\n case \"major\":\n return formatSemver({ major: parts.major + 1, minor: 0, patch: 0 });\n case \"minor\":\n return formatSemver({\n major: parts.major,\n minor: parts.minor + 1,\n patch: 0,\n });\n case \"patch\":\n return formatSemver({\n major: parts.major,\n minor: parts.minor,\n patch: parts.patch + 1,\n });\n }\n}\n\nasync function findPluginManifest(startDir: string): Promise<string | null> {\n let currentDir = startDir;\n const root = path.parse(currentDir).root;\n\n while (currentDir !== root) {\n const manifestPath = path.join(\n currentDir,\n PLUGIN_MANIFEST_DIR,\n PLUGIN_MANIFEST_FILE,\n );\n if (await fileExists(manifestPath)) {\n return manifestPath;\n }\n currentDir = path.dirname(currentDir);\n }\n\n return null;\n}\n\nasync function readPluginManifest(\n manifestPath: string,\n): Promise<PluginManifest> {\n const content = await readFile(manifestPath);\n return JSON.parse(content) as PluginManifest;\n}\n\nasync function writePluginManifestFile(\n manifestPath: string,\n manifest: PluginManifest,\n): Promise<void> {\n const content = JSON.stringify(manifest, null, 2);\n await writeFile(manifestPath, content);\n}\n\nexport const versionCommand = new Command(\"version\")\n .description(\"Manage plugin version\")\n .argument(\"<action>\", 'Version action: \"patch\", \"minor\", \"major\", or \"set\"')\n .argument(\"[version]\", 'Version to set (only for \"set\" action)')\n .configureOutput({\n writeErr: (str) => console.error(pc.red(str)),\n })\n .showHelpAfterError(true)\n .action(async (action: string, version?: string) => {\n const validActions: VersionAction[] = [\"patch\", \"minor\", \"major\", \"set\"];\n if (!validActions.includes(action as VersionAction)) {\n p.log.error(\n `Invalid action: \"${action}\". Must be one of: ${validActions.join(\", \")}`,\n );\n process.exit(EXIT_CODES.INVALID_ARGS);\n }\n\n const versionAction = action as VersionAction;\n\n if (versionAction === \"set\") {\n if (!version) {\n p.log.error('Version argument required for \"set\" action');\n p.log.info(\"Usage: cc version set <version>\");\n process.exit(EXIT_CODES.INVALID_ARGS);\n }\n\n if (!parseSemver(version)) {\n p.log.error(\n `Invalid version format: \"${version}\". Must be semantic version (e.g., 1.0.0)`,\n );\n process.exit(EXIT_CODES.INVALID_ARGS);\n }\n }\n\n const manifestPath = await findPluginManifest(process.cwd());\n if (!manifestPath) {\n p.log.error(\"No plugin.json found in current directory or parents\");\n p.log.info(\n `Expected location: ${PLUGIN_MANIFEST_DIR}/${PLUGIN_MANIFEST_FILE}`,\n );\n process.exit(EXIT_CODES.ERROR);\n }\n\n let manifest: PluginManifest;\n try {\n manifest = await readPluginManifest(manifestPath);\n } catch (error) {\n p.log.error(`Failed to read plugin manifest: ${error}`);\n process.exit(EXIT_CODES.ERROR);\n }\n\n const oldVersion = manifest.version || DEFAULT_VERSION;\n\n let newVersion: string;\n if (versionAction === \"set\") {\n newVersion = version!;\n } else {\n newVersion = incrementVersion(oldVersion, versionAction);\n }\n\n manifest.version = newVersion;\n\n try {\n await writePluginManifestFile(manifestPath, manifest);\n } catch (error) {\n p.log.error(`Failed to write plugin manifest: ${error}`);\n process.exit(EXIT_CODES.ERROR);\n }\n\n const pluginName = manifest.name || \"unknown\";\n console.log(\n `${pc.cyan(pluginName)}: ${pc.dim(oldVersion)} ${pc.yellow(\"->\")} ${pc.green(newVersion)}`,\n );\n });\n"],"mappings":"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","names":["Command","pc","pc","path","parseYaml","path","path","__filename","__dirname","path","path","skillId","path","path","path","os","path","os","path","path","path","parseYaml","path","parseYaml","path","path","parseYaml","path","path","path","path","PLUGIN_MANIFEST_FILE","path","getPluginManifestPath","path","PLUGIN_MANIFEST_FILE","path","stringifyYaml","parseYaml","path","getPluginManifestPath","path","intro","parseYaml","path","path","pc","readPluginManifest","parseYaml","Command","p","pc","path","path","parseYaml","FRONTMATTER_REGEX","parseFrontmatter","parseYaml","parseMajorVersion","bumpMajorVersion","CONTENT_HASH_FILE","readExistingManifest","getPluginManifestPath","path","Command","pc","path","Command","p","pc","path","DEFAULT_OUTPUT_DIR","Command","pc","path","Command","p","pc","path","path","readPluginManifest","path","Command","pc","path","Command","p","pc","path","stringifyYaml","p","pc","selectedSkill","pc","path","parseYaml","path","parseYaml","path","parseYaml","path","path","parseYaml","path","path","stringifyYaml","parseYaml","path","getCurrentDate","parseYaml","stringifyYaml","path","path","p","path","os","path","path","os","PLUGIN_NAME","Command","pc","localSkillsDir","path","localAgentsDir","stringifyYaml","Command","p","pc","path","path","Command","pc","Command","p","pc","path","path","parseYaml","fg","parseYaml","path","fg","Ajv","addFormats","path","parseYaml","fg","schemaCache","validatorCache","loadSchema","path","getValidator","Ajv","addFormats","formatAjvErrors","extractFrontmatter","parseYaml","fg","verbose","Command","pc","path","Command","p","pc","DEFAULT_NAME","Command","pc","Command","p","pc","Command","pc","Command","p","pc","path","Command","pc","path","Command","p","pc","path","SEMVER_REGEX","path","readPluginManifest","Command","pc","pc","Command"]}