@claude-collective/cli 0.26.0 → 0.26.1

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.
Files changed (58) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/dist/{chunk-7UPXT32F.js → chunk-2OW7FCIF.js} +2 -2
  3. package/dist/{chunk-TDZE4TDG.js → chunk-2YMMJP4Z.js} +2 -2
  4. package/dist/{chunk-ZDREFYD2.js → chunk-324DM2L6.js} +12 -2
  5. package/dist/chunk-324DM2L6.js.map +1 -0
  6. package/dist/{chunk-ETQ3BPGU.js → chunk-CQ7657GA.js} +18 -7
  7. package/dist/{chunk-ETQ3BPGU.js.map → chunk-CQ7657GA.js.map} +1 -1
  8. package/dist/{chunk-I3YYG5IO.js → chunk-CZBNDP5B.js} +2 -2
  9. package/dist/{chunk-4357L7VK.js → chunk-G35SYE6Z.js} +3 -3
  10. package/dist/{chunk-R7B63JAP.js → chunk-HIQGK5XJ.js} +5 -5
  11. package/dist/{chunk-R5KJVI54.js → chunk-NT4K647L.js} +3 -3
  12. package/dist/commands/build/marketplace.js +1 -1
  13. package/dist/commands/build/plugins.js +3 -3
  14. package/dist/commands/build/stack.js +3 -3
  15. package/dist/commands/compile.js +3 -3
  16. package/dist/commands/config/get.js +2 -2
  17. package/dist/commands/config/index.js +3 -3
  18. package/dist/commands/config/path.js +2 -2
  19. package/dist/commands/config/set-project.js +2 -2
  20. package/dist/commands/config/show.js +3 -3
  21. package/dist/commands/config/unset-project.js +2 -2
  22. package/dist/commands/diff.js +2 -2
  23. package/dist/commands/doctor.js +2 -2
  24. package/dist/commands/edit.js +7 -7
  25. package/dist/commands/eject.js +2 -2
  26. package/dist/commands/import/skill.js +2 -2
  27. package/dist/commands/info.js +2 -2
  28. package/dist/commands/init.js +6 -6
  29. package/dist/commands/list.js +2 -2
  30. package/dist/commands/new/agent.js +2 -2
  31. package/dist/commands/new/skill.js +2 -2
  32. package/dist/commands/outdated.js +2 -2
  33. package/dist/commands/search.js +2 -2
  34. package/dist/commands/uninstall.js +2 -2
  35. package/dist/commands/update.js +3 -3
  36. package/dist/commands/validate.js +2 -2
  37. package/dist/commands/version/bump.js +2 -2
  38. package/dist/commands/version/index.js +2 -2
  39. package/dist/commands/version/set.js +2 -2
  40. package/dist/commands/version/show.js +2 -2
  41. package/dist/components/wizard/step-build.js +3 -3
  42. package/dist/components/wizard/step-build.test.js +3 -3
  43. package/dist/components/wizard/step-settings.js +3 -3
  44. package/dist/components/wizard/step-settings.test.js +6 -6
  45. package/dist/components/wizard/step-sources.js +3 -3
  46. package/dist/components/wizard/step-sources.test.js +3 -3
  47. package/dist/components/wizard/wizard.js +6 -6
  48. package/dist/hooks/init.js +2 -2
  49. package/dist/{source-manager-EYO3F2DV.js → source-manager-VWIIDTK5.js} +3 -3
  50. package/package.json +1 -1
  51. package/dist/chunk-ZDREFYD2.js.map +0 -1
  52. /package/dist/{chunk-7UPXT32F.js.map → chunk-2OW7FCIF.js.map} +0 -0
  53. /package/dist/{chunk-TDZE4TDG.js.map → chunk-2YMMJP4Z.js.map} +0 -0
  54. /package/dist/{chunk-I3YYG5IO.js.map → chunk-CZBNDP5B.js.map} +0 -0
  55. /package/dist/{chunk-4357L7VK.js.map → chunk-G35SYE6Z.js.map} +0 -0
  56. /package/dist/{chunk-R7B63JAP.js.map → chunk-HIQGK5XJ.js.map} +0 -0
  57. /package/dist/{chunk-R5KJVI54.js.map → chunk-NT4K647L.js.map} +0 -0
  58. /package/dist/{source-manager-EYO3F2DV.js.map → source-manager-VWIIDTK5.js.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli/lib/configuration/source-manager.ts","../src/cli/lib/configuration/config.ts","../src/cli/lib/loading/source-fetcher.ts","../src/cli/lib/configuration/index.ts","../src/cli/lib/configuration/config-generator.ts","../src/cli/lib/skills/index.ts","../src/cli/lib/skills/skill-metadata.ts","../src/cli/lib/versioning.ts","../src/cli/lib/skills/skill-copier.ts","../src/cli/lib/skills/skill-agent-mappings.ts","../src/cli/lib/loading/index.ts","../src/cli/lib/loading/loader.ts","../src/cli/lib/loading/source-loader.ts","../src/cli/lib/matrix/index.ts","../src/cli/lib/matrix/matrix-loader.ts","../src/cli/lib/matrix/matrix-resolver.ts","../src/cli/lib/matrix/matrix-health-check.ts","../src/cli/lib/loading/multi-source-loader.ts","../src/cli/lib/plugins/index.ts","../src/cli/lib/plugins/plugin-manifest.ts","../src/cli/lib/plugins/plugin-manifest-finder.ts","../src/cli/lib/plugins/plugin-finder.ts","../src/cli/lib/plugins/plugin-info.ts","../src/cli/lib/installation/index.ts","../src/cli/lib/installation/installation.ts","../src/cli/lib/installation/local-installer.ts","../src/cli/lib/stacks/index.ts","../src/cli/lib/stacks/stacks-loader.ts","../src/cli/lib/stacks/stack-installer.ts","../src/cli/lib/stacks/stack-plugin-compiler.ts","../src/cli/lib/compiler.ts","../src/cli/lib/resolver.ts","../src/cli/utils/frontmatter.ts","../src/cli/utils/exec.ts","../src/cli/lib/plugins/plugin-version.ts","../src/cli/lib/plugins/plugin-validator.ts","../src/cli/lib/loading/defaults-loader.ts","../src/cli/lib/skills/skill-plugin-compiler.ts","../src/cli/lib/skills/local-skill-loader.ts","../src/cli/lib/skills/source-switcher.ts","../src/cli/lib/configuration/config-merger.ts","../src/cli/lib/configuration/project-config.ts","../src/cli/lib/configuration/config-saver.ts"],"sourcesContent":["import type { SourceEntry } from \"./config\";\nimport { loadProjectSourceConfig, saveProjectConfig, DEFAULT_SOURCE } from \"./config\";\nimport { fetchMarketplace } from \"../loading/source-fetcher\";\nimport { discoverLocalSkills } from \"../skills/local-skill-loader\";\nimport {\n getPluginSkillIds,\n getCollectivePluginDir,\n getPluginSkillsDir,\n} from \"../plugins/plugin-finder\";\nimport { verbose } from \"../../utils/logger\";\nimport type { MergedSkillsMatrix } from \"../../types\";\n\nconst DEFAULT_SOURCE_NAME = \"public\";\n\nexport type SourceSummary = {\n sources: Array<SourceEntry & { enabled: boolean }>;\n localSkillCount: number;\n pluginSkillCount: number;\n};\n\n/**\n * Add a new source to the project configuration.\n * Validates the URL by fetching the marketplace.\n */\nexport async function addSource(\n projectDir: string,\n url: string,\n): Promise<{ name: string; skillCount: number }> {\n const result = await fetchMarketplace(url, { forceRefresh: true });\n const name = result.marketplace.name;\n const skillCount = result.marketplace.plugins.length;\n\n const config = (await loadProjectSourceConfig(projectDir)) ?? {};\n const sources = config.sources ?? [];\n\n // Check for duplicate names\n const exists = sources.some((s) => s.name === name);\n if (exists) {\n throw new Error(`Source \"${name}\" already exists`);\n }\n\n sources.push({ name, url });\n config.sources = sources;\n await saveProjectConfig(projectDir, config);\n\n verbose(`Added source \"${name}\" with ${skillCount} skills`);\n return { name, skillCount };\n}\n\n/**\n * Remove a source by name. Cannot remove \"public\" (the default).\n */\nexport async function removeSource(projectDir: string, name: string): Promise<void> {\n if (name === DEFAULT_SOURCE_NAME) {\n throw new Error(`Cannot remove the \"${DEFAULT_SOURCE_NAME}\" source`);\n }\n\n const config = (await loadProjectSourceConfig(projectDir)) ?? {};\n const sources = config.sources ?? [];\n\n const filtered = sources.filter((s) => s.name !== name);\n if (filtered.length === sources.length) {\n throw new Error(`Source \"${name}\" not found`);\n }\n\n config.sources = filtered;\n await saveProjectConfig(projectDir, config);\n\n verbose(`Removed source \"${name}\"`);\n}\n\n/**\n * Get summary of all configured sources and local/plugin counts.\n */\nexport async function getSourceSummary(\n projectDir: string,\n matrix?: MergedSkillsMatrix,\n): Promise<SourceSummary> {\n const config = (await loadProjectSourceConfig(projectDir)) ?? {};\n\n // Build sources list, always including the default \"public\" source\n const sources: Array<SourceEntry & { enabled: boolean }> = [\n {\n name: DEFAULT_SOURCE_NAME,\n url: config.source ?? DEFAULT_SOURCE,\n enabled: true,\n },\n ];\n\n if (config.sources) {\n for (const source of config.sources) {\n sources.push({ ...source, enabled: true });\n }\n }\n\n // Count local skills\n let localSkillCount = 0;\n try {\n const localResult = await discoverLocalSkills(projectDir);\n if (localResult) {\n localSkillCount = localResult.skills.length;\n }\n } catch {\n verbose(\"Failed to discover local skills for source summary\");\n }\n\n // Count plugin skills\n let pluginSkillCount = 0;\n if (matrix) {\n try {\n const pluginDir = getCollectivePluginDir(projectDir);\n const pluginSkillsDir = getPluginSkillsDir(pluginDir);\n const skillIds = await getPluginSkillIds(pluginSkillsDir, matrix);\n pluginSkillCount = skillIds.length;\n } catch {\n verbose(\"Failed to count plugin skills for source summary\");\n }\n }\n\n return { sources, localSkillCount, pluginSkillCount };\n}\n","import path from \"path\";\nimport { parse as parseYaml, stringify as stringifyYaml } from \"yaml\";\nimport { readFile, writeFile, fileExists, ensureDir } from \"../../utils/fs\";\nimport { verbose, warn } from \"../../utils/logger\";\nimport { CLAUDE_DIR, CLAUDE_SRC_DIR } from \"../../consts\";\nimport { projectSourceConfigSchema } from \"../schemas\";\nimport type { BoundSkill } from \"../../types\";\n\nexport const DEFAULT_SOURCE = \"github:claude-collective/skills\";\nexport const SOURCE_ENV_VAR = \"CC_SOURCE\";\nexport const PROJECT_CONFIG_FILE = \"config.yaml\";\n\nexport type SourceEntry = {\n name: string;\n url: string;\n description?: string;\n ref?: string;\n};\n\nexport type ProjectSourceConfig = {\n source?: string;\n author?: string;\n marketplace?: string;\n agents_source?: string;\n sources?: SourceEntry[];\n boundSkills?: BoundSkill[];\n};\n\nexport type ResolvedConfig = {\n source: string;\n sourceOrigin: \"flag\" | \"env\" | \"project\" | \"default\";\n marketplace?: string;\n};\n\nexport function getProjectConfigPath(projectDir: string): string {\n return path.join(projectDir, CLAUDE_SRC_DIR, PROJECT_CONFIG_FILE);\n}\n\nexport async function loadProjectSourceConfig(\n projectDir: string,\n): Promise<ProjectSourceConfig | null> {\n // Check .claude-src/config.yaml first (new location)\n const srcConfigPath = getProjectConfigPath(projectDir);\n // Fall back to .claude/config.yaml (legacy location)\n const legacyConfigPath = path.join(projectDir, CLAUDE_DIR, \"config.yaml\");\n\n let configPath = srcConfigPath;\n if (!(await fileExists(srcConfigPath))) {\n if (await fileExists(legacyConfigPath)) {\n configPath = legacyConfigPath;\n verbose(`Using legacy config location: ${legacyConfigPath}`);\n } else {\n verbose(`Project config not found at ${srcConfigPath} or ${legacyConfigPath}`);\n return null;\n }\n }\n\n try {\n const content = await readFile(configPath);\n const parsed = parseYaml(content);\n const result = projectSourceConfigSchema.safeParse(parsed);\n if (!result.success) {\n warn(`Invalid project config at ${configPath}: ${result.error.message}`);\n return null;\n }\n verbose(`Loaded project config from ${configPath}`);\n return result.data as ProjectSourceConfig;\n } catch (error) {\n warn(`Failed to parse project config at ${configPath}: ${error}`);\n return null;\n }\n}\n\nexport async function saveProjectConfig(\n projectDir: string,\n config: ProjectSourceConfig,\n): Promise<void> {\n const configPath = getProjectConfigPath(projectDir);\n await ensureDir(path.join(projectDir, CLAUDE_SRC_DIR));\n const content = stringifyYaml(config, { lineWidth: 0 });\n await writeFile(configPath, content);\n verbose(`Saved project config to ${configPath}`);\n}\n\n// Precedence: flag > env > project > default\nexport async function resolveSource(\n flagValue?: string,\n projectDir?: string,\n): Promise<ResolvedConfig> {\n const projectConfig = projectDir ? await loadProjectSourceConfig(projectDir) : null;\n const marketplace = projectConfig?.marketplace;\n\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\", marketplace };\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\", marketplace };\n }\n\n if (projectConfig?.source) {\n verbose(`Source from project config: ${projectConfig.source}`);\n return {\n source: projectConfig.source,\n sourceOrigin: \"project\",\n marketplace,\n };\n }\n\n verbose(`Using default source: ${DEFAULT_SOURCE}`);\n return { source: DEFAULT_SOURCE, sourceOrigin: \"default\", marketplace };\n}\n\nexport type AgentsSourceOrigin = \"flag\" | \"project\" | \"default\";\n\nexport type ResolvedAgentsSource = {\n agentsSource?: string;\n agentsSourceOrigin: AgentsSourceOrigin;\n};\n\n// Precedence: flag > project > default (undefined)\nexport async function resolveAgentsSource(\n flagValue?: string,\n projectDir?: string,\n): Promise<ResolvedAgentsSource> {\n if (flagValue !== undefined) {\n if (flagValue === \"\" || flagValue.trim() === \"\") {\n throw new Error(\"--agent-source flag cannot be empty\");\n }\n verbose(`Agents source from --agent-source flag: ${flagValue}`);\n return { agentsSource: flagValue, agentsSourceOrigin: \"flag\" };\n }\n\n const projectConfig = projectDir ? await loadProjectSourceConfig(projectDir) : null;\n if (projectConfig?.agents_source) {\n verbose(`Agents source from project config: ${projectConfig.agents_source}`);\n return {\n agentsSource: projectConfig.agents_source,\n agentsSourceOrigin: \"project\",\n };\n }\n\n verbose(\"Using default agents source (local CLI)\");\n return { agentsSource: undefined, agentsSourceOrigin: \"default\" };\n}\n\nconst PROJECT_ORIGIN_LABEL = \"project config (.claude-src/config.yaml)\";\n\nexport function formatOrigin(\n type: \"source\" | \"agents\",\n origin: ResolvedConfig[\"sourceOrigin\"] | AgentsSourceOrigin,\n): string {\n if (origin === \"project\") return PROJECT_ORIGIN_LABEL;\n\n if (type === \"source\") {\n switch (origin) {\n case \"flag\":\n return \"--source flag\";\n case \"env\":\n return `${SOURCE_ENV_VAR} environment variable`;\n case \"default\":\n return \"default\";\n }\n }\n\n // type === \"agents\"\n switch (origin) {\n case \"flag\":\n return \"--agent-source flag\";\n case \"default\":\n return \"default (local CLI)\";\n }\n\n return origin;\n}\n\nexport async function resolveAuthor(projectDir?: string): Promise<string | undefined> {\n const projectConfig = projectDir ? await loadProjectSourceConfig(projectDir) : null;\n return projectConfig?.author;\n}\n\nexport async function resolveAllSources(\n projectDir?: string,\n): Promise<{ primary: SourceEntry; extras: SourceEntry[] }> {\n const projectConfig = projectDir ? await loadProjectSourceConfig(projectDir) : null;\n\n // Get primary source\n const resolvedConfig = await resolveSource(undefined, projectDir);\n const primary: SourceEntry = {\n name: \"marketplace\",\n url: resolvedConfig.source,\n description: \"Primary skills marketplace\",\n };\n\n // Collect extra sources from project config\n const extras: SourceEntry[] = [];\n const seenNames = new Set<string>();\n\n if (projectConfig?.sources) {\n for (const source of projectConfig.sources) {\n if (!seenNames.has(source.name)) {\n seenNames.add(source.name);\n extras.push(source);\n }\n }\n }\n\n return { primary, extras };\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) => source.startsWith(prefix));\n\n if (!hasRemoteProtocol) {\n if (source.includes(\"..\") || source.includes(\"~\")) {\n throw new Error(`Invalid source path: ${source}. Path traversal patterns are not allowed.`);\n }\n }\n\n return !hasRemoteProtocol;\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 \"../configuration\";\nimport { marketplaceSchema } from \"../schemas\";\nimport type { MarketplaceFetchResult } from \"../../types\";\n\nexport type FetchOptions = {\n forceRefresh?: boolean;\n subdir?: string;\n};\n\nexport type FetchResult = {\n path: string;\n fromCache: boolean;\n source: string;\n};\n\nexport function sanitizeSourceForCache(source: string): string {\n return source.replace(/:/g, \"-\").replace(/[\\/]/g, \"-\").replace(/--+/g, \"-\").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(source: string, subdir?: string): Promise<FetchResult> {\n const fullPath = subdir ? path.join(source, subdir) : source;\n const absolutePath = path.isAbsolute(fullPath) ? fullPath : 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(source: string, options: FetchOptions): 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 // If cache exists and not forcing refresh, use it directly\n if (!forceRefresh && (await directoryExists(cacheDir))) {\n verbose(`Using cached source: ${cacheDir}`);\n return {\n path: cacheDir,\n fromCache: true,\n source: fullSource,\n };\n }\n\n await ensureDir(path.dirname(cacheDir));\n\n try {\n const result = await downloadTemplate(fullSource, {\n dir: cacheDir,\n force: true, // Always force when downloading to avoid \"already exists\" error\n offline: false,\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(result.path, \".claude-plugin\", \"marketplace.json\");\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 parsed = JSON.parse(content);\n const validation = marketplaceSchema.safeParse(parsed);\n\n if (!validation.success) {\n throw new Error(\n `Invalid marketplace.json at: ${marketplacePath}\\n\\n` +\n `Validation errors: ${validation.error.issues.map((i) => `${i.path.join(\".\")}: ${i.message}`).join(\"; \")}`,\n );\n }\n\n const marketplace = validation.data;\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 };\n}\n","export {\n DEFAULT_SOURCE,\n SOURCE_ENV_VAR,\n PROJECT_CONFIG_FILE,\n type SourceEntry,\n type ProjectSourceConfig,\n type ResolvedConfig,\n type AgentsSourceOrigin,\n type ResolvedAgentsSource,\n getProjectConfigPath,\n loadProjectSourceConfig,\n saveProjectConfig,\n resolveSource,\n resolveAgentsSource,\n formatOrigin,\n resolveAuthor,\n resolveAllSources,\n isLocalSource,\n} from \"./config\";\n\nexport {\n type ProjectConfigOptions,\n generateProjectConfigFromSkills,\n buildStackProperty,\n} from \"./config-generator\";\n\nexport { type MergeContext, type MergeResult, mergeWithExistingConfig } from \"./config-merger\";\n\nexport { saveSourceToProjectConfig } from \"./config-saver\";\n\nexport {\n type LoadedProjectConfig,\n loadProjectConfig,\n validateProjectConfig,\n} from \"./project-config\";\n\nexport { type SourceSummary, addSource, removeSource, getSourceSummary } from \"./source-manager\";\n","import type {\n AgentName,\n CategoryPath,\n MergedSkillsMatrix,\n ProjectConfig,\n ResolvedSubcategorySkills,\n SkillDisplayName,\n SkillId,\n Stack,\n StackAgentConfig,\n Subcategory,\n} from \"../../types\";\nimport { typedEntries } from \"../../utils/typed-object\";\nimport { getAgentsForSkill } from \"../skills\";\n\nexport type ProjectConfigOptions = {\n description?: string;\n author?: string;\n};\n\nfunction extractSubcategory(categoryPath: CategoryPath): Subcategory | undefined {\n if (categoryPath === \"local\") return undefined;\n const parts = categoryPath.split(\"/\");\n // Boundary cast: the last segment of a CategoryPath is always a valid Subcategory\n return (parts.length >= 2 ? parts[1] : parts[0]) as Subcategory;\n}\n\nexport function generateProjectConfigFromSkills(\n name: string,\n selectedSkillIds: SkillId[],\n matrix: MergedSkillsMatrix,\n options?: ProjectConfigOptions,\n): ProjectConfig {\n const neededAgents = new Set<AgentName>();\n const stackProperty: Record<string, ResolvedSubcategorySkills> = {};\n\n // Derive agents from skills and build stack property\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 subcategory = extractSubcategory(category);\n\n for (const agentId of agents) {\n neededAgents.add(agentId);\n\n // Build stack: agent -> subcategory -> skillId\n if (subcategory) {\n if (!stackProperty[agentId]) {\n stackProperty[agentId] = {};\n }\n stackProperty[agentId][subcategory] = skillId;\n }\n }\n }\n\n // Build minimal config\n const config: ProjectConfig = {\n name,\n agents: Array.from(neededAgents).sort(),\n skills: [...selectedSkillIds],\n };\n\n // Only include stack if there are any mappings\n if (Object.keys(stackProperty).length > 0) {\n config.stack = stackProperty;\n }\n\n // Add optional fields only if provided\n if (options?.description) {\n config.description = options.description;\n }\n\n if (options?.author) {\n config.author = options.author;\n }\n\n return config;\n}\n\n// Resolves display names in stack.agents to full skill IDs using skill_aliases\nexport function buildStackProperty(\n stack: Stack,\n displayNameToId: Partial<Record<SkillDisplayName, SkillId>>,\n): Partial<Record<AgentName, ResolvedSubcategorySkills>> {\n const result: Partial<Record<AgentName, ResolvedSubcategorySkills>> = {};\n\n for (const [agentId, agentConfig] of typedEntries<AgentName, StackAgentConfig>(stack.agents)) {\n // Skip agents with empty config\n if (!agentConfig || Object.keys(agentConfig).length === 0) {\n continue;\n }\n\n const resolvedMappings: ResolvedSubcategorySkills = {};\n\n for (const [subcategoryId, displayName] of typedEntries<Subcategory, SkillDisplayName>(\n agentConfig,\n )) {\n if (!displayName) continue;\n // Resolve display name to full skill ID using skill_aliases from matrix\n const skillId = displayNameToId[displayName];\n if (skillId) {\n resolvedMappings[subcategoryId] = skillId;\n } else {\n // Boundary cast: display name not found in lookup, assumed to be a full skill ID already\n resolvedMappings[subcategoryId] = displayName as unknown as SkillId;\n }\n }\n\n // Only add agent if it has resolved mappings\n if (Object.keys(resolvedMappings).length > 0) {\n result[agentId] = resolvedMappings;\n }\n }\n\n return result;\n}\n","export { type FetchSkillsOptions, fetchSkills } from \"./skill-fetcher\";\n\nexport {\n type ForkedFromMetadata,\n type LocalSkillMetadata,\n type SkillComparisonResult,\n readForkedFromMetadata,\n getLocalSkillsWithMetadata,\n computeSourceHash,\n compareSkills,\n injectForkedFromMetadata,\n} from \"./skill-metadata\";\n\nexport {\n type CopiedSkill,\n copySkill,\n copySkillFromSource,\n copySkillsToPluginFromSource,\n copySkillsToLocalFlattened,\n} from \"./skill-copier\";\n\nexport { SKILL_TO_AGENTS, getAgentsForSkill } from \"./skill-agent-mappings\";\n\nexport {\n type SkillPluginOptions,\n type CompiledSkillPlugin,\n compileSkillPlugin,\n compileAllSkillPlugins,\n printCompilationSummary,\n} from \"./skill-plugin-compiler\";\n\nexport { type LocalSkillDiscoveryResult, discoverLocalSkills } from \"./local-skill-loader\";\n\nexport { archiveLocalSkill, restoreArchivedSkill, hasArchivedSkill } from \"./source-switcher\";\n","import path from \"path\";\nimport { parse as parseYaml, stringify as stringifyYaml } from \"yaml\";\nimport { sortBy } from \"remeda\";\nimport { fileExists, readFile, writeFile, listDirectories } from \"../../utils/fs\";\nimport { hashFile } from \"../versioning\";\nimport { getCurrentDate } from \"../versioning\";\nimport { LOCAL_SKILLS_PATH } from \"../../consts\";\nimport type { SkillId } from \"../../types\";\nimport { localSkillMetadataSchema } from \"../schemas\";\nimport { warn } from \"../../utils/logger\";\n\nexport type ForkedFromMetadata = {\n skill_id: SkillId;\n content_hash: string;\n date: string;\n};\n\nexport type LocalSkillMetadata = {\n forked_from?: ForkedFromMetadata;\n [key: string]: unknown;\n};\n\nexport type SkillComparisonResult = {\n id: SkillId;\n localHash: string | null;\n sourceHash: string | null;\n status: \"current\" | \"outdated\" | \"local-only\";\n dirName: string;\n sourcePath?: string;\n};\n\nexport async function readForkedFromMetadata(skillDir: string): Promise<ForkedFromMetadata | null> {\n const metadataPath = path.join(skillDir, \"metadata.yaml\");\n\n if (!(await fileExists(metadataPath))) {\n return null;\n }\n\n const content = await readFile(metadataPath);\n const result = localSkillMetadataSchema.safeParse(parseYaml(content));\n\n if (!result.success) {\n warn(\n `Invalid metadata.yaml at ${metadataPath}: ${result.error.issues.map((i) => `${i.path.join(\".\")}: ${i.message}`).join(\"; \")}`,\n );\n return null;\n }\n\n return (result.data as LocalSkillMetadata).forked_from ?? null;\n}\n\nexport async function getLocalSkillsWithMetadata(\n projectDir: string,\n): Promise<Map<string, { dirName: string; forkedFrom: ForkedFromMetadata | null }>> {\n const localSkillsPath = path.join(projectDir, LOCAL_SKILLS_PATH);\n const result = new Map<string, { dirName: string; forkedFrom: ForkedFromMetadata | null }>();\n\n if (!(await fileExists(localSkillsPath))) {\n return result;\n }\n\n const skillDirs = await listDirectories(localSkillsPath);\n\n for (const dirName of skillDirs) {\n const skillDir = path.join(localSkillsPath, dirName);\n const forkedFrom = await readForkedFromMetadata(skillDir);\n\n // Use the skill_id from forked_from if available, otherwise use directory name\n const skillId = forkedFrom?.skill_id ?? dirName;\n\n result.set(skillId, { dirName, forkedFrom });\n }\n\n return result;\n}\n\nexport async function computeSourceHash(\n sourcePath: string,\n skillPath: string,\n): Promise<string | null> {\n const skillMdPath = path.join(sourcePath, \"src\", skillPath, \"SKILL.md\");\n\n if (!(await fileExists(skillMdPath))) {\n return null;\n }\n\n return hashFile(skillMdPath);\n}\n\nexport async function compareSkills(\n projectDir: string,\n sourcePath: string,\n sourceSkills: Record<string, { path: string }>,\n): Promise<SkillComparisonResult[]> {\n const results: SkillComparisonResult[] = [];\n const localSkills = await getLocalSkillsWithMetadata(projectDir);\n\n for (const [skillId, { dirName, forkedFrom }] of localSkills) {\n if (!forkedFrom) {\n // Local-only skill (no forked_from metadata)\n // Boundary cast: skillId comes from Map<string, ...> keys (directory names or forkedFrom.skill_id)\n results.push({\n id: skillId as SkillId,\n localHash: null,\n sourceHash: null,\n status: \"local-only\",\n dirName,\n });\n continue;\n }\n\n const localHash = forkedFrom.content_hash;\n const sourceSkill = sourceSkills[forkedFrom.skill_id];\n\n if (!sourceSkill) {\n // Skill was forked from a source that no longer exists\n results.push({\n id: forkedFrom.skill_id,\n localHash,\n sourceHash: null,\n status: \"local-only\",\n dirName,\n });\n continue;\n }\n\n const sourceHash = await computeSourceHash(sourcePath, sourceSkill.path);\n\n if (sourceHash === null) {\n results.push({\n id: forkedFrom.skill_id,\n localHash,\n sourceHash: null,\n status: \"local-only\",\n dirName,\n });\n continue;\n }\n\n const status = localHash === sourceHash ? \"current\" : \"outdated\";\n\n results.push({\n id: forkedFrom.skill_id,\n localHash,\n sourceHash,\n status,\n dirName,\n sourcePath: sourceSkill.path,\n });\n }\n\n // Sort results by skill ID\n return sortBy(results, (r) => r.id);\n}\n\nexport async function injectForkedFromMetadata(\n destPath: string,\n skillId: SkillId,\n contentHash: string,\n): Promise<void> {\n const metadataPath = path.join(destPath, \"metadata.yaml\");\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 parseResult = localSkillMetadataSchema.safeParse(parseYaml(yamlContent));\n if (!parseResult.success) {\n warn(`Malformed metadata.yaml at ${metadataPath} — existing fields may be lost`);\n }\n const metadata: LocalSkillMetadata = parseResult.success\n ? (parseResult.data as LocalSkillMetadata)\n : { forked_from: undefined };\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","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\";\nimport { DEFAULT_VERSION } from \"../consts\";\nimport { pluginManifestSchema, versionedMetadataSchema } from \"./schemas\";\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\ntype VersionedMetadata = {\n version: number;\n content_hash?: string;\n updated?: string;\n [key: string]: unknown;\n};\n\nexport type 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 let raw: unknown;\n try {\n raw = parseYaml(yamlContent);\n } catch (error) {\n throw new Error(\n `Failed to parse metadata.yaml at ${skillPath}: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n\n const result = versionedMetadataSchema.safeParse(raw);\n\n if (!result.success) {\n throw new Error(\n `Invalid metadata.yaml at ${skillPath}: ${result.error.issues.map((i) => `${i.path.join(\".\")}: ${i.message}`).join(\"; \")}`,\n );\n }\n\n const metadata = result.data 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(skillPath: string): 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(` Version bumped: ${skillPath} (v${previousVersion} -> v${metadata.version})`);\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(skillsDir: string): 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(` Warning: Failed to version skill at ${skillPath}: ${error}`);\n }\n }\n\n return results;\n}\n\n/**\n * Plugin versioning utilities shared by skill, agent, and stack plugin compilers.\n * Reads existing plugin.json + .content-hash, bumps semver major on content change.\n */\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\nexport async function readExistingPluginManifest(\n pluginDir: string,\n getManifestPath: (dir: string) => string,\n): Promise<{ version: string; contentHash: string | undefined } | null> {\n const manifestPath = getManifestPath(pluginDir);\n\n if (!(await fileExists(manifestPath))) {\n return null;\n }\n\n try {\n const content = await readFile(manifestPath);\n const manifest = pluginManifestSchema.parse(JSON.parse(content));\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\nexport async function determinePluginVersion(\n newHash: string,\n pluginDir: string,\n getManifestPath: (dir: string) => string,\n): Promise<{ version: string; contentHash: string }> {\n const existing = await readExistingPluginManifest(pluginDir, getManifestPath);\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 async function writeContentHash(\n pluginDir: string,\n contentHash: string,\n getManifestPath: (dir: string) => string,\n): Promise<void> {\n const hashFilePath = getManifestPath(pluginDir).replace(\"plugin.json\", CONTENT_HASH_FILE);\n await writeFile(hashFilePath, contentHash);\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(` ✓ ${skillName}: v${result.previousVersion} -> v${result.newVersion}`);\n }\n }\n\n console.log(`\\n Summary: ${changed.length} updated, ${unchanged.length} unchanged`);\n}\n","import path from \"path\";\nimport { copy, ensureDir } from \"../../utils/fs\";\nimport { hashFile } from \"../versioning\";\nimport type { MergedSkillsMatrix, ResolvedSkill, SkillId } from \"../../types\";\nimport type { SourceLoadResult } from \"../loading\";\nimport { injectForkedFromMetadata } from \"./skill-metadata\";\n\nexport type CopiedSkill = {\n skillId: SkillId;\n contentHash: string;\n sourcePath: string;\n destPath: string;\n local?: boolean;\n};\n\nfunction getSkillSourcePath(skill: ResolvedSkill, registryRoot: string): 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\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: SkillId[],\n pluginDir: string,\n matrix: MergedSkillsMatrix,\n sourceResult: SourceLoadResult,\n sourceSelections?: Partial<Record<SkillId, string>>,\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 const selectedSource = sourceSelections?.[skillId];\n const userSelectedRemote = selectedSource && selectedSource !== \"local\";\n\n if (skill.local && skill.localPath && !userSelectedRemote) {\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\n// Uses the skill ID as the folder name (flattened, not nested)\nfunction getFlattenedSkillDestPath(skill: ResolvedSkill, localSkillsDir: string): string {\n return path.join(localSkillsDir, skill.id);\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: SkillId[],\n localSkillsDir: string,\n matrix: MergedSkillsMatrix,\n sourceResult: SourceLoadResult,\n sourceSelections?: Partial<Record<SkillId, string>>,\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 const selectedSource = sourceSelections?.[skillId];\n const userSelectedRemote = selectedSource && selectedSource !== \"local\";\n\n if (skill.local && skill.localPath && !userSelectedRemote) {\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(skill, localSkillsDir, sourceResult);\n copiedSkills.push(copied);\n }\n\n return copiedSkills;\n}\n","/**\n * @deprecated This module is deprecated. Skills are now defined directly in agent YAMLs.\n * Use agent's `skills` field in agent.yaml instead of these mappings.\n * See: src/cli/lib/resolver.ts -> resolveAgentSkills()\n *\n * This file is kept for backwards compatibility with:\n * - config-generator.ts (wizard flow for generating configs from skills)\n * - Legacy stack-based configurations\n *\n * Will be removed in a future version once config-generator is updated\n * to use the new agent-centric approach.\n */\n\nimport type { AgentName, CategoryPath, ProjectConfig } from \"../../types\";\nimport { getCachedDefaults } from \"../loading\";\n\n// Hardcoded fallback defaults — used when YAML defaults cannot be loaded\n\n// Boundary cast: literal strings are valid AgentName values at this data definition boundary\nexport const SKILL_TO_AGENTS: Record<string, AgentName[]> = {\n \"web/*\": [\n \"web-developer\",\n \"web-reviewer\",\n \"web-researcher\",\n \"web-pm\",\n \"pattern-scout\",\n \"web-pattern-critique\",\n \"agent-summoner\",\n \"skill-summoner\",\n \"documentor\",\n ],\n\n \"api/*\": [\n \"api-developer\",\n \"api-reviewer\",\n \"api-researcher\",\n \"web-architecture\",\n \"web-pm\",\n \"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 \"infra/*\": [\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 \"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 \"pattern-scout\",\n \"web-pattern-critique\",\n \"agent-summoner\",\n \"skill-summoner\",\n \"documentor\",\n ],\n\n \"web/testing\": [\"web-tester\", \"web-developer\", \"web-reviewer\"],\n \"api/testing\": [\"web-tester\", \"api-developer\", \"api-reviewer\"],\n\n \"web/mocks\": [\"web-tester\", \"web-developer\", \"web-reviewer\"],\n};\n\n// Boundary cast: literal strings are valid AgentName values\nconst DEFAULT_AGENTS: AgentName[] = [\"agent-summoner\", \"skill-summoner\", \"documentor\"];\n\n// Priority: YAML defaults (if loaded) > hardcoded fallback\nfunction getEffectiveSkillToAgents(): Record<string, AgentName[]> {\n const defaults = getCachedDefaults();\n if (defaults?.skill_to_agents) {\n // Boundary cast: YAML-loaded mappings contain valid AgentName values\n return defaults.skill_to_agents as Record<string, AgentName[]>;\n }\n return SKILL_TO_AGENTS;\n}\n\nexport function getAgentsForSkill(\n skillPath: string,\n category: CategoryPath,\n projectConfig?: ProjectConfig,\n): AgentName[] {\n const normalizedPath = skillPath.replace(/^skills\\//, \"\").replace(/\\/$/, \"\");\n\n const skillToAgents = getEffectiveSkillToAgents();\n\n if (skillToAgents[category]) {\n return skillToAgents[category];\n }\n\n for (const [pattern, agents] of Object.entries(skillToAgents)) {\n if (normalizedPath === pattern || normalizedPath.startsWith(`${pattern}/`)) {\n return agents;\n }\n }\n\n for (const [pattern, agents] of Object.entries(skillToAgents)) {\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 DEFAULT_AGENTS;\n}\n","export {\n parseFrontmatter,\n loadAllAgents,\n loadProjectAgents,\n loadSkillsByIds,\n loadPluginSkills,\n} from \"./loader\";\n\nexport {\n type SourceLoadOptions,\n type SourceLoadResult,\n loadSkillsMatrixFromSource,\n} from \"./source-loader\";\n\nexport {\n type FetchOptions,\n type FetchResult,\n sanitizeSourceForCache,\n fetchFromSource,\n fetchMarketplace,\n} from \"./source-fetcher\";\n\nexport {\n type DefaultMappings,\n loadDefaultMappings,\n getCachedDefaults,\n clearDefaultsCache,\n} from \"./defaults-loader\";\n\nexport { loadSkillsFromAllSources } from \"./multi-source-loader\";\n","import { parse as parseYaml } from \"yaml\";\nimport path from \"path\";\nimport { unique } from \"remeda\";\nimport { glob, readFile, directoryExists } from \"../../utils/fs\";\nimport { verbose, warn } from \"../../utils/logger\";\nimport { CLAUDE_SRC_DIR, DIRS } from \"../../consts\";\nimport type { AgentDefinition, SkillDefinition, SkillFrontmatter, SkillId } from \"../../types\";\nimport { skillFrontmatterLoaderSchema, agentYamlConfigSchema } from \"../schemas\";\n\nconst FRONTMATTER_REGEX = /^---\\n([\\s\\S]*?)\\n---/;\n\nexport function parseFrontmatter(content: string, filePath?: string): SkillFrontmatter | null {\n const match = content.match(FRONTMATTER_REGEX);\n if (!match) return null;\n\n const yamlContent = match[1];\n const parsed = skillFrontmatterLoaderSchema.safeParse(parseYaml(yamlContent));\n\n if (!parsed.success) {\n const location = filePath ?? \"unknown file\";\n warn(\n `Invalid SKILL.md frontmatter in ${location}: ${parsed.error.issues.map((i) => `${i.path.join(\".\")}: ${i.message}`).join(\"; \")}`,\n );\n return null;\n }\n // Boundary cast: YAML name field may not match strict SkillId pattern (e.g., local skills)\n return parsed.data as SkillFrontmatter;\n}\n\nexport async function loadAllAgents(projectRoot: string): 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 try {\n const content = await readFile(fullPath);\n const config = agentYamlConfigSchema.parse(parseYaml(content));\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 sourceRoot: projectRoot,\n };\n\n verbose(`Loaded agent: ${config.id} from ${file}`);\n } catch (error) {\n warn(\n `Skipping invalid agent.yaml at ${fullPath}: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n\n return agents;\n}\n\nexport async function loadProjectAgents(\n projectRoot: string,\n): Promise<Record<string, AgentDefinition>> {\n const agents: Record<string, AgentDefinition> = {};\n const projectAgentsDir = path.join(projectRoot, CLAUDE_SRC_DIR, \"agents\");\n\n if (!(await directoryExists(projectAgentsDir))) {\n verbose(`No project agents directory at ${projectAgentsDir}`);\n return agents;\n }\n\n const files = await glob(\"**/agent.yaml\", projectAgentsDir);\n\n for (const file of files) {\n const fullPath = path.join(projectAgentsDir, file);\n try {\n const content = await readFile(fullPath);\n const config = agentYamlConfigSchema.parse(parseYaml(content));\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 sourceRoot: projectRoot,\n agentBaseDir: `${CLAUDE_SRC_DIR}/agents`, // Project agents are in .claude-src/agents/\n };\n\n verbose(`Loaded project agent: ${config.id} from ${file}`);\n } catch (error) {\n warn(\n `Skipping invalid agent.yaml at ${fullPath}: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n\n return agents;\n}\n\nasync function buildIdToDirectoryPathMap(skillsDir: string): 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, fullPath);\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: SkillId }>,\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: SkillId[] = [];\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 // Boundary cast: keys from buildIdToDirectoryPathMap are SkillId values from frontmatter\n expandedSkillIds.push(...(childSkills as SkillId[]));\n verbose(`Expanded directory '${skillId}' to ${childSkills.length} skills`);\n } else {\n console.warn(` Warning: Unknown skill reference '${skillId}'`);\n }\n }\n }\n\n const uniqueSkillIds = unique(expandedSkillIds);\n\n for (const skillId of uniqueSkillIds) {\n const directoryPath = idToDirectoryPath[skillId];\n if (!directoryPath) {\n console.warn(` Warning: Could not find skill ${skillId}: No matching skill found`);\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, skillMdPath);\n\n if (!frontmatter) {\n warn(`Skipping ${skillId}: Missing or invalid frontmatter`);\n continue;\n }\n\n const canonicalId = frontmatter.name;\n const skillDef: SkillDefinition = {\n id: canonicalId,\n path: `${DIRS.skills}/${directoryPath}/`,\n description: frontmatter.description,\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, fullPath);\n if (!frontmatter) {\n warn(`Skipping ${file}: Missing or invalid frontmatter`);\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 id: skillId,\n path: skillPath,\n description: frontmatter.description,\n };\n\n verbose(`Loaded plugin skill: ${skillId} from ${file}`);\n }\n\n return skills;\n}\n","import path from \"path\";\nimport { PROJECT_ROOT, SKILLS_DIR_PATH, SKILLS_MATRIX_PATH } from \"../../consts\";\nimport type {\n AgentName,\n MergedSkillsMatrix,\n ResolvedSkill,\n ResolvedStack,\n SkillDisplayName,\n SkillId,\n Stack,\n} from \"../../types\";\nimport { fileExists } from \"../../utils/fs\";\nimport { verbose } from \"../../utils/logger\";\nimport { typedKeys } from \"../../utils/typed-object\";\nimport { isLocalSource, resolveSource, type ResolvedConfig } from \"../configuration\";\nimport { discoverLocalSkills, type LocalSkillDiscoveryResult } from \"../skills\";\nimport {\n checkMatrixHealth,\n extractAllSkills,\n loadSkillsMatrix,\n mergeMatrixWithSkills,\n} from \"../matrix\";\nimport { fetchFromSource } from \"./source-fetcher\";\nimport { loadSkillsFromAllSources } from \"./multi-source-loader\";\nimport { loadStacks, resolveAgentConfigToSkills } from \"../stacks\";\n\nexport type SourceLoadOptions = {\n sourceFlag?: string;\n projectDir?: string;\n forceRefresh?: boolean;\n devMode?: boolean;\n};\n\nexport type SourceLoadResult = {\n matrix: MergedSkillsMatrix;\n sourceConfig: ResolvedConfig;\n sourcePath: string;\n isLocal: boolean;\n marketplace?: string;\n};\n\nexport async function loadSkillsMatrixFromSource(\n options: SourceLoadOptions = {},\n): Promise<SourceLoadResult> {\n const { sourceFlag, projectDir, forceRefresh = false, devMode = false } = 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(result.matrix, localSkillsResult);\n }\n\n // Annotate skills with available sources (public, local, plugin, private)\n await loadSkillsFromAllSources(result.matrix, sourceConfig, resolvedProjectDir);\n\n // Run matrix health check to surface referential integrity issues\n checkMatrixHealth(result.matrix);\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) ? source : path.resolve(process.cwd(), source);\n } else {\n skillsPath = PROJECT_ROOT;\n }\n\n verbose(`Loading skills from local path: ${skillsPath}`);\n\n // Check if source has its own matrix, otherwise fallback to CLI matrix\n const sourceMatrixPath = path.join(skillsPath, SKILLS_MATRIX_PATH);\n const cliMatrixPath = path.join(PROJECT_ROOT, SKILLS_MATRIX_PATH);\n\n let matrixPath: string;\n if (await fileExists(sourceMatrixPath)) {\n matrixPath = sourceMatrixPath;\n verbose(`Matrix from source: ${matrixPath}`);\n } else {\n matrixPath = cliMatrixPath;\n verbose(`Matrix from CLI (source has no matrix): ${matrixPath}`);\n }\n\n const skillsDir = path.join(skillsPath, SKILLS_DIR_PATH);\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 // Load stacks from source first, fall back to CLI's config/stacks.yaml\n const sourceStacks = await loadStacks(skillsPath);\n const stacks = sourceStacks.length > 0 ? sourceStacks : await loadStacks(PROJECT_ROOT);\n if (stacks.length > 0) {\n mergedMatrix.suggestedStacks = stacks.map((stack) =>\n stackToResolvedStack(stack, mergedMatrix.displayNameToId),\n );\n const stackSource = sourceStacks.length > 0 ? \"source\" : \"CLI\";\n verbose(`Loaded ${stacks.length} stacks from ${stackSource}`);\n }\n\n return {\n matrix: mergedMatrix,\n sourceConfig,\n sourcePath: skillsPath,\n isLocal: true,\n marketplace: sourceConfig.marketplace,\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 // Check if source has its own matrix, otherwise fallback to CLI matrix\n const sourceMatrixPath = path.join(fetchResult.path, SKILLS_MATRIX_PATH);\n const cliMatrixPath = path.join(PROJECT_ROOT, SKILLS_MATRIX_PATH);\n\n let matrixPath: string;\n if (await fileExists(sourceMatrixPath)) {\n matrixPath = sourceMatrixPath;\n verbose(`Matrix from source: ${matrixPath}`);\n } else {\n matrixPath = cliMatrixPath;\n verbose(`Matrix from CLI (source has no matrix): ${matrixPath}`);\n }\n\n const skillsDir = path.join(fetchResult.path, SKILLS_DIR_PATH);\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 // Load stacks from source first, fall back to CLI's config/stacks.yaml\n const sourceStacks = await loadStacks(fetchResult.path);\n const stacks = sourceStacks.length > 0 ? sourceStacks : await loadStacks(PROJECT_ROOT);\n if (stacks.length > 0) {\n mergedMatrix.suggestedStacks = stacks.map((stack) =>\n stackToResolvedStack(stack, mergedMatrix.displayNameToId),\n );\n const stackSource = sourceStacks.length > 0 ? \"source\" : \"CLI\";\n verbose(`Loaded ${stacks.length} stacks from ${stackSource}`);\n }\n\n return {\n matrix: mergedMatrix,\n sourceConfig,\n sourcePath: fetchResult.path,\n isLocal: false,\n marketplace: sourceConfig.marketplace,\n };\n}\n\n// Convert a Stack to ResolvedStack for wizard compatibility.\n// Resolves technology aliases to full skill IDs via displayNameToId.\nfunction stackToResolvedStack(\n stack: Stack,\n displayNameToId: Partial<Record<SkillDisplayName, SkillId>>,\n): ResolvedStack {\n // Collect all unique skill IDs from agent configs in this stack\n const allSkillIds: SkillId[] = [];\n const seenSkillIds = new Set<SkillId>();\n\n for (const agentId of typedKeys<AgentName>(stack.agents)) {\n const agentConfig = stack.agents[agentId];\n if (!agentConfig) continue;\n\n // Resolve this agent's technology selections to skill IDs\n const skillRefs = resolveAgentConfigToSkills(agentConfig, displayNameToId);\n\n for (const ref of skillRefs) {\n if (!seenSkillIds.has(ref.id)) {\n seenSkillIds.add(ref.id);\n allSkillIds.push(ref.id);\n }\n }\n }\n\n const agentCount = typedKeys<AgentName>(stack.agents).length;\n verbose(`Stack '${stack.id}' has ${allSkillIds.length} skills from ${agentCount} agents`);\n\n return {\n id: stack.id,\n name: stack.name,\n description: stack.description,\n audience: [], // Not used in new format\n skills: {} as ResolvedStack[\"skills\"], // Skills come from stack agent configs, resolved at runtime\n allSkillIds,\n philosophy: stack.philosophy || \"\",\n };\n}\n\nfunction mergeLocalSkillsIntoMatrix(\n matrix: MergedSkillsMatrix,\n localResult: LocalSkillDiscoveryResult,\n): MergedSkillsMatrix {\n for (const metadata of localResult.skills) {\n // Preserve alias and category from existing matrix entry (if skill was in source)\n const existingSkill = matrix.skills[metadata.id];\n\n // If overwriting an existing remote skill, inherit its category unconditionally.\n // Otherwise, use whatever the local skill declared in its metadata.yaml.\n const category = existingSkill?.category ?? metadata.category;\n const displayName = existingSkill?.displayName ?? matrix.displayNames[metadata.id];\n\n const resolvedSkill: ResolvedSkill = {\n id: metadata.id,\n displayName,\n description: metadata.description,\n usageGuidance: metadata.usageGuidance,\n\n category,\n categoryExclusive: metadata.categoryExclusive,\n tags: metadata.tags ?? [],\n\n author: \"@local\",\n\n conflictsWith: existingSkill?.conflictsWith ?? [],\n recommends: existingSkill?.recommends ?? [],\n requires: existingSkill?.requires ?? [],\n alternatives: existingSkill?.alternatives ?? [],\n discourages: existingSkill?.discourages ?? [],\n compatibleWith: existingSkill?.compatibleWith ?? [],\n\n requiresSetup: existingSkill?.requiresSetup ?? [],\n providesSetupFor: existingSkill?.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} (category: ${category})`);\n }\n\n return matrix;\n}\n","export {\n loadSkillsMatrix,\n extractAllSkills,\n mergeMatrixWithSkills,\n loadAndMergeSkillsMatrix,\n} from \"./matrix-loader\";\n\nexport {\n resolveAlias,\n getDependentSkills,\n type SkillCheckOptions,\n isDisabled,\n getDisableReason,\n isDiscouraged,\n getDiscourageReason,\n isRecommended,\n getRecommendReason,\n validateSelection,\n getAvailableSkills,\n getSkillsByCategory,\n isCategoryAllDisabled,\n} from \"./matrix-resolver\";\n\nexport { type MatrixHealthIssue, checkMatrixHealth } from \"./matrix-health-check\";\n","import { parse as parseYaml } from \"yaml\";\nimport path from \"path\";\nimport { z } from \"zod\";\nimport { glob, readFile, fileExists } from \"../../utils/fs\";\nimport { verbose, warn } from \"../../utils/logger\";\nimport { DIRS } from \"../../consts\";\nimport { parseFrontmatter } from \"../loading\";\nimport {\n skillsMatrixConfigSchema,\n categoryPathSchema,\n skillDisplayNameSchema,\n skillIdSchema,\n} from \"../schemas\";\nimport type {\n ExtractedSkillMetadata,\n MergedSkillsMatrix,\n ResolvedSkill,\n ResolvedStack,\n SkillAlternative,\n SkillDisplayName,\n SkillId,\n SkillRelation,\n SkillRequirement,\n SkillsMatrixConfig,\n} from \"../../types\";\n\nconst rawMetadataSchema = z.object({\n category: categoryPathSchema,\n category_exclusive: z.boolean().optional(),\n author: z.string(),\n version: z.coerce.string(),\n cli_name: z.string().optional(),\n cli_description: z.string().optional(),\n usage_guidance: z.string().optional(),\n tags: z.array(z.string()).optional(),\n // Lenient: accepts display names and skill IDs from YAML, resolved to canonical IDs during matrix merge\n compatible_with: z.array(z.string() as z.ZodType<SkillId>).optional(),\n conflicts_with: z.array(z.string() as z.ZodType<SkillId>).optional(),\n requires: z.array(z.string() as z.ZodType<SkillId>).optional(),\n requires_setup: z.array(z.string() as z.ZodType<SkillId>).optional(),\n provides_setup_for: z.array(z.string() as z.ZodType<SkillId>).optional(),\n});\n\ntype RawMetadata = z.infer<typeof rawMetadataSchema>;\n\nexport async function loadSkillsMatrix(configPath: string): Promise<SkillsMatrixConfig> {\n const content = await readFile(configPath);\n const raw = parseYaml(content);\n const result = skillsMatrixConfigSchema.safeParse(raw);\n\n if (!result.success) {\n throw new Error(\n `Invalid skills matrix at ${configPath}: ${result.error.issues.map((i) => `${i.path.join(\".\")}: ${i.message}`).join(\"; \")}`,\n );\n }\n\n verbose(`Loaded skills matrix: ${configPath}`);\n return result.data;\n}\n\nexport async function extractAllSkills(skillsDir: string): 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 rawMetadata = parseYaml(metadataContent);\n const metadataResult = rawMetadataSchema.safeParse(rawMetadata);\n\n if (!metadataResult.success) {\n warn(\n `Skipping ${metadataFile}: Invalid metadata.yaml — ${metadataResult.error.issues.map((i) => `${i.path.join(\".\")}: ${i.message}`).join(\"; \")}`,\n );\n continue;\n }\n\n const metadata = metadataResult.data;\n const skillMdContent = await readFile(skillMdPath);\n const frontmatter = parseFrontmatter(skillMdContent, skillMdPath);\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 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 buildReverseDisplayNames(\n displayNameToId: Partial<Record<SkillDisplayName, SkillId>>,\n): Partial<Record<SkillId, SkillDisplayName>> {\n const reverse: Partial<Record<SkillId, SkillDisplayName>> = {};\n // Object.entries returns [string, SkillId | undefined][] — validate with Zod at boundary\n for (const [name, fullId] of Object.entries(displayNameToId)) {\n const nameResult = skillDisplayNameSchema.safeParse(name);\n const idResult = skillIdSchema.safeParse(fullId);\n if (nameResult.success && idResult.success) {\n reverse[idResult.data] = nameResult.data;\n } else {\n warn(\n `Invalid skill alias mapping: '${name}' -> '${fullId}'${!nameResult.success ? ` (invalid display name: ${nameResult.error.message})` : \"\"}${!idResult.success ? ` (invalid skill ID: ${idResult.error.message})` : \"\"}`,\n );\n }\n }\n return reverse;\n}\n\n// Maps short names, directory paths, and old alias targets to canonical skill IDs\nfunction buildAliasTargetToSkillIdMap(\n displayNameToId: Partial<Record<SkillDisplayName, SkillId>>,\n skills: ExtractedSkillMetadata[],\n): Record<string, SkillId> {\n const map: Record<string, SkillId> = {};\n\n for (const skill of skills) {\n // Extract the short form: last path segment\n // e.g., \"web-framework-react\" -> short form for lookup\n const parts = skill.id.split(\"/\");\n const shortForm = parts[parts.length - 1];\n\n if (shortForm && shortForm !== skill.id) {\n map[shortForm] = skill.id;\n }\n\n // Also map directory path to skill ID if different\n // e.g., directory path -> normalized skill ID\n if (skill.directoryPath && skill.directoryPath !== skill.id) {\n map[skill.directoryPath] = skill.id;\n }\n }\n\n // Also include any old-style alias targets that might still be referenced\n const aliasTargets = new Set(Object.values(displayNameToId));\n for (const skill of skills) {\n for (const aliasTarget of aliasTargets) {\n if (\n aliasTarget !== skill.id &&\n (skill.id.endsWith(`/${aliasTarget}`) || skill.id === aliasTarget)\n ) {\n map[aliasTarget] = skill.id;\n }\n }\n }\n\n return map;\n}\n\nfunction buildDirectoryPathToIdMap(skills: ExtractedSkillMetadata[]): Record<string, SkillId> {\n const map: Record<string, SkillId> = {};\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 nameOrId: SkillId,\n displayNameToId: Partial<Record<SkillDisplayName, SkillId>>,\n directoryPathToId: Record<string, SkillId> = {},\n aliasTargetToSkillId: Record<string, SkillId> = {},\n context?: string,\n): SkillId {\n // Boundary cast: nameOrId may contain a display name from YAML — narrow to SkillDisplayName for lookup\n const displayNameResult = displayNameToId[nameOrId as unknown as SkillDisplayName];\n if (displayNameResult) {\n return displayNameResult;\n }\n if (directoryPathToId[nameOrId]) {\n return directoryPathToId[nameOrId];\n }\n // Handle \"short author\" format like \"react (@vince)\" that maps to full ID\n if (aliasTargetToSkillId[nameOrId]) {\n return aliasTargetToSkillId[nameOrId];\n }\n if (context) {\n verbose(`Unresolved ID '${nameOrId}' in ${context} — passing through as-is`);\n }\n // Not found in display names — treat as SkillId pass-through\n return nameOrId;\n}\n\nexport async function mergeMatrixWithSkills(\n matrix: SkillsMatrixConfig,\n skills: ExtractedSkillMetadata[],\n): Promise<MergedSkillsMatrix> {\n const displayNameToId = matrix.skill_aliases;\n const displayNames = buildReverseDisplayNames(displayNameToId);\n const directoryPathToId = buildDirectoryPathToIdMap(skills);\n const aliasTargetToSkillId = buildAliasTargetToSkillIdMap(displayNameToId, skills);\n const resolvedSkills: Partial<Record<SkillId, ResolvedSkill>> = {};\n\n for (const skill of skills) {\n const resolved = buildResolvedSkill(\n skill,\n matrix,\n displayNameToId,\n displayNames,\n directoryPathToId,\n aliasTargetToSkillId,\n );\n resolvedSkills[skill.id] = resolved;\n }\n\n const suggestedStacks = resolveSuggestedStacks();\n\n const merged: MergedSkillsMatrix = {\n version: matrix.version,\n categories: matrix.categories,\n skills: resolvedSkills,\n suggestedStacks,\n displayNameToId,\n displayNames,\n generatedAt: new Date().toISOString(),\n };\n\n return merged;\n}\n\nfunction buildResolvedSkill(\n skill: ExtractedSkillMetadata,\n matrix: SkillsMatrixConfig,\n displayNameToId: Partial<Record<SkillDisplayName, SkillId>>,\n displayNames: Partial<Record<SkillId, SkillDisplayName>>,\n directoryPathToId: Record<string, SkillId>,\n aliasTargetToSkillId: Record<string, SkillId>,\n): ResolvedSkill {\n const conflictsWith: SkillRelation[] = [];\n const recommends: SkillRelation[] = [];\n const requires: SkillRequirement[] = [];\n const alternatives: SkillAlternative[] = [];\n const discourages: SkillRelation[] = [];\n\n // Helper to resolve with all maps, with context for diagnostics.\n // All canonical IDs follow the SkillId format (prefix-subcategory-name).\n const resolve = (id: SkillId, relationContext?: string): SkillId =>\n resolveToCanonicalId(\n id,\n displayNameToId,\n directoryPathToId,\n aliasTargetToSkillId,\n relationContext ? `${skill.id} ${relationContext}` : undefined,\n );\n\n for (const conflictRef of skill.conflictsWith) {\n const canonicalId = resolve(conflictRef, \"conflictsWith\");\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((id) => resolve(id, \"conflicts\"));\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 = resolve(compatRef, \"compatibleWith\");\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 = resolve(recommendRule.when, \"recommends.when\");\n if (whenCanonicalId === skill.id) {\n for (const suggested of recommendRule.suggest) {\n const canonicalId = resolve(suggested, \"recommends.suggest\");\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((id) => resolve(id, \"requires\")),\n needsAny: false,\n reason: \"Defined in skill metadata\",\n });\n }\n\n for (const requireRule of matrix.relationships.requires) {\n const skillCanonicalId = resolve(requireRule.skill, \"requires.skill\");\n if (skillCanonicalId === skill.id) {\n requires.push({\n skillIds: requireRule.needs.map((id) => resolve(id, \"requires.needs\")),\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((id) => resolve(id, \"alternatives\"));\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((id) => resolve(id, \"discourages\"));\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 // Preserve compatibleWith as resolved skill IDs for framework-first filtering\n const compatibleWith = skill.compatibleWith.map((id) => resolve(id, \"compatibleWith\"));\n\n return {\n id: skill.id,\n displayName: displayNames[skill.id],\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 requires,\n alternatives,\n discourages,\n compatibleWith,\n requiresSetup: skill.requiresSetup.map((id) => resolve(id, \"requiresSetup\")),\n providesSetupFor: skill.providesSetupFor.map((id) => resolve(id, \"providesSetupFor\")),\n path: skill.path,\n };\n}\n\nfunction resolveSuggestedStacks(): ResolvedStack[] {\n return [];\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 { groupBy } from \"remeda\";\nimport type {\n CategoryPath,\n MergedSkillsMatrix,\n ResolvedSkill,\n SelectionValidation,\n SkillDisplayName,\n SkillId,\n SkillOption,\n Subcategory,\n ValidationError,\n ValidationWarning,\n} from \"../../types\";\nimport { typedEntries } from \"../../utils/typed-object\";\n\nfunction getLabel(\n skill: { displayName?: string; id: string } | undefined,\n fallback: string,\n): string {\n return skill?.displayName || skill?.id || fallback;\n}\n\nexport function resolveAlias(aliasOrId: SkillId, matrix: MergedSkillsMatrix): SkillId {\n // Boundary cast: aliasOrId may contain a display name from legacy contexts — try display name lookup first, fall back to SkillId\n return matrix.displayNameToId[aliasOrId as unknown as SkillDisplayName] || aliasOrId;\n}\n\nexport function getDependentSkills(\n skillId: SkillId,\n currentSelections: SkillId[],\n matrix: MergedSkillsMatrix,\n): SkillId[] {\n const fullId = resolveAlias(skillId, matrix);\n const skill = matrix.skills[fullId];\n\n if (!skill) return [];\n\n const resolvedSelections = currentSelections.map((s) => resolveAlias(s, matrix));\n const dependents: SkillId[] = [];\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 type SkillCheckOptions = {\n expertMode?: boolean;\n};\n\nexport function isDisabled(\n skillId: SkillId,\n currentSelections: SkillId[],\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 (selectedSkill && selectedSkill.conflictsWith.some((c) => c.skillId === fullId)) {\n return true;\n }\n }\n\n const resolvedSelections = currentSelections.map((s) => resolveAlias(s, matrix));\n\n for (const requirement of skill.requires) {\n if (requirement.needsAny) {\n const hasAny = requirement.skillIds.some((reqId) => resolvedSelections.includes(reqId));\n if (!hasAny) {\n return true;\n }\n } else {\n const hasAll = requirement.skillIds.every((reqId) => resolvedSelections.includes(reqId));\n if (!hasAll) {\n return true;\n }\n }\n }\n\n return false;\n}\n\nexport function getDisableReason(\n skillId: SkillId,\n currentSelections: SkillId[],\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) => resolveAlias(s, matrix));\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 return `${conflict.reason} (conflicts with ${getLabel(selectedSkill, selectedId)})`;\n }\n\n const selectedSkill = matrix.skills[selectedId];\n if (selectedSkill) {\n const reverseConflict = selectedSkill.conflictsWith.find((c) => c.skillId === fullId);\n if (reverseConflict) {\n return `${reverseConflict.reason} (conflicts with ${getLabel(selectedSkill, selectedId)})`;\n }\n }\n }\n\n for (const requirement of skill.requires) {\n if (requirement.needsAny) {\n const hasAny = requirement.skillIds.some((reqId) => resolvedSelections.includes(reqId));\n if (!hasAny) {\n const requiredNames = requirement.skillIds\n .map((id) => getLabel(matrix.skills[id], 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.map((id) => getLabel(matrix.skills[id], id)).join(\", \");\n return `${requirement.reason} (requires ${missingNames})`;\n }\n }\n }\n\n return undefined;\n}\n\nexport function isDiscouraged(\n skillId: SkillId,\n currentSelections: SkillId[],\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) => resolveAlias(s, matrix));\n\n for (const selectedId of resolvedSelections) {\n const selectedSkill = matrix.skills[selectedId];\n if (selectedSkill && selectedSkill.discourages.some((d) => d.skillId === fullId)) {\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: SkillId,\n currentSelections: SkillId[],\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) => resolveAlias(s, matrix));\n\n for (const selectedId of resolvedSelections) {\n const selectedSkill = matrix.skills[selectedId];\n if (selectedSkill) {\n const discourage = selectedSkill.discourages.find((d) => d.skillId === fullId);\n if (discourage) {\n return discourage.reason;\n }\n }\n\n const reverseDiscourage = skill.discourages.find((d) => d.skillId === selectedId);\n if (reverseDiscourage) {\n return reverseDiscourage.reason;\n }\n }\n\n return undefined;\n}\n\nexport function isRecommended(\n skillId: SkillId,\n currentSelections: SkillId[],\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) => resolveAlias(s, matrix));\n\n for (const selectedId of resolvedSelections) {\n const selectedSkill = matrix.skills[selectedId];\n if (selectedSkill && selectedSkill.recommends.some((r) => r.skillId === fullId)) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function getRecommendReason(\n skillId: SkillId,\n currentSelections: SkillId[],\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) => resolveAlias(s, matrix));\n\n for (const selectedId of resolvedSelections) {\n const selectedSkill = matrix.skills[selectedId];\n if (selectedSkill) {\n const recommendation = selectedSkill.recommends.find((r) => r.skillId === fullId);\n if (recommendation) {\n return `${recommendation.reason} (recommended by ${getLabel(selectedSkill, selectedId)})`;\n }\n }\n }\n\n return undefined;\n}\n\nexport function validateSelection(\n selections: SkillId[],\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: `${getLabel(skillA, skillA.id)} conflicts with ${getLabel(matrix.skills[skillBId], 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) => resolvedSelections.includes(reqId));\n if (!hasAny) {\n errors.push({\n type: \"missing_requirement\",\n message: `${getLabel(skill, skillId)} requires one of: ${requirement.skillIds.map((id) => getLabel(matrix.skills[id], 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: `${getLabel(skill, skillId)} requires: ${missingIds.map((id) => getLabel(matrix.skills[id], id)).join(\", \")}`,\n skills: [skillId, ...missingIds],\n });\n }\n }\n }\n }\n\n const validSkills = resolvedSelections\n .map((skillId) => ({ skillId, skill: matrix.skills[skillId] }))\n .filter((entry): entry is { skillId: SkillId; skill: ResolvedSkill } => entry.skill != null);\n const categorySelections = groupBy(validSkills, (entry) => entry.skill.category);\n\n for (const [categoryId, entries] of typedEntries(categorySelections)) {\n if (entries.length > 1) {\n const skillIds = entries.map((e) => e.skillId);\n // CategoryPath → Subcategory: categories lookup uses bare subcategory names\n const category = matrix.categories[categoryId as Subcategory];\n if (category?.exclusive) {\n errors.push({\n type: \"category_exclusive\",\n message: `Category \"${category.displayName}\" only allows one selection, but multiple selected: ${skillIds.map((id) => getLabel(matrix.skills[id], 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: `${getLabel(skill, skillId)} recommends ${getLabel(recommendedSkill, recommendation.skillId)}: ${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 \"${getLabel(skill, skillId)}\" selected but no corresponding usage skills: ${skill.providesSetupFor.map((id) => getLabel(matrix.skills[id], 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: CategoryPath,\n currentSelections: SkillId[],\n matrix: MergedSkillsMatrix,\n options?: SkillCheckOptions,\n): SkillOption[] {\n const skillOptions: SkillOption[] = [];\n const resolvedSelections = currentSelections.map((s) => resolveAlias(s, matrix));\n\n for (const skill of Object.values(matrix.skills)) {\n if (!skill) continue;\n if (skill.category !== categoryId) {\n continue;\n }\n\n const disabled = isDisabled(skill.id, currentSelections, matrix, options);\n const discouraged = !disabled && isDiscouraged(skill.id, currentSelections, matrix);\n const recommended =\n !disabled && !discouraged && isRecommended(skill.id, currentSelections, matrix);\n\n skillOptions.push({\n id: skill.id,\n displayName: skill.displayName,\n description: skill.description,\n disabled,\n disabledReason: disabled ? getDisableReason(skill.id, currentSelections, matrix) : 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: CategoryPath,\n matrix: MergedSkillsMatrix,\n): ResolvedSkill[] {\n const skills: ResolvedSkill[] = [];\n\n for (const skill of Object.values(matrix.skills)) {\n if (!skill) continue;\n if (skill.category === categoryId) {\n skills.push(skill);\n }\n }\n\n return skills;\n}\n\nexport function isCategoryAllDisabled(\n categoryId: CategoryPath,\n currentSelections: SkillId[],\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: SkillId; reason: string | undefined }> = [];\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","import { warn } from \"../../utils/logger\";\nimport type {\n CategoryDefinition,\n MergedSkillsMatrix,\n ResolvedSkill,\n SkillId,\n Subcategory,\n} from \"../../types\";\nimport { typedEntries, typedKeys } from \"../../utils/typed-object\";\n\nexport type MatrixHealthIssue = {\n severity: \"warning\" | \"error\";\n finding: string;\n details: string;\n};\n\nexport function checkMatrixHealth(matrix: MergedSkillsMatrix): MatrixHealthIssue[] {\n const issues: MatrixHealthIssue[] = [];\n const skillIds = new Set(typedKeys<SkillId>(matrix.skills));\n\n checkRelationshipTargets(matrix, skillIds, issues);\n checkSubcategoryDomains(matrix, issues);\n checkSkillCategories(matrix, issues);\n checkCompatibleWithTargets(matrix, skillIds, issues);\n checkStackSkillIds(matrix, skillIds, issues);\n\n for (const issue of issues) {\n warn(`[matrix] ${issue.details}`);\n }\n\n return issues;\n}\n\nfunction checkRelationshipTargets(\n matrix: MergedSkillsMatrix,\n skillIds: Set<SkillId>,\n issues: MatrixHealthIssue[],\n): void {\n for (const [skillId, skill] of typedEntries<SkillId, ResolvedSkill>(matrix.skills)) {\n if (!skill) continue;\n for (const conflict of skill.conflictsWith) {\n if (!skillIds.has(conflict.skillId)) {\n issues.push({\n severity: \"warning\",\n finding: \"ghost-relationship-target\",\n details: `Skill '${skillId}' conflicts with '${conflict.skillId}' which does not exist in the matrix`,\n });\n }\n }\n\n for (const recommend of skill.recommends) {\n if (!skillIds.has(recommend.skillId)) {\n issues.push({\n severity: \"warning\",\n finding: \"ghost-relationship-target\",\n details: `Skill '${skillId}' recommends '${recommend.skillId}' which does not exist in the matrix`,\n });\n }\n }\n\n for (const requirement of skill.requires) {\n for (const reqId of requirement.skillIds) {\n if (!skillIds.has(reqId)) {\n issues.push({\n severity: \"error\",\n finding: \"ghost-requirement-target\",\n details: `Skill '${skillId}' requires '${reqId}' which does not exist in the matrix`,\n });\n }\n }\n }\n\n for (const alt of skill.alternatives) {\n if (!skillIds.has(alt.skillId)) {\n issues.push({\n severity: \"warning\",\n finding: \"ghost-alternative-target\",\n details: `Skill '${skillId}' lists alternative '${alt.skillId}' which does not exist in the matrix`,\n });\n }\n }\n\n for (const discourage of skill.discourages) {\n if (!skillIds.has(discourage.skillId)) {\n issues.push({\n severity: \"warning\",\n finding: \"ghost-relationship-target\",\n details: `Skill '${skillId}' discourages '${discourage.skillId}' which does not exist in the matrix`,\n });\n }\n }\n\n for (const setupId of skill.requiresSetup) {\n if (!skillIds.has(setupId)) {\n issues.push({\n severity: \"warning\",\n finding: \"ghost-setup-target\",\n details: `Skill '${skillId}' requiresSetup '${setupId}' which does not exist in the matrix`,\n });\n }\n }\n\n for (const providesId of skill.providesSetupFor) {\n if (!skillIds.has(providesId)) {\n issues.push({\n severity: \"warning\",\n finding: \"ghost-setup-target\",\n details: `Skill '${skillId}' providesSetupFor '${providesId}' which does not exist in the matrix`,\n });\n }\n }\n }\n}\n\n// Categories without a domain won't appear in any wizard domain view\nfunction checkSubcategoryDomains(matrix: MergedSkillsMatrix, issues: MatrixHealthIssue[]): void {\n for (const [catId, cat] of typedEntries<Subcategory, CategoryDefinition>(matrix.categories)) {\n if (!cat) continue;\n if (!cat.domain) {\n issues.push({\n severity: \"warning\",\n finding: \"category-missing-domain\",\n details: `Category '${catId}' has no domain — it won't appear in any wizard domain view`,\n });\n }\n }\n}\n\nfunction checkSkillCategories(matrix: MergedSkillsMatrix, issues: MatrixHealthIssue[]): void {\n for (const [skillId, skill] of typedEntries<SkillId, ResolvedSkill>(matrix.skills)) {\n if (!skill) continue;\n // Narrowing cast: skill.category is CategoryPath which includes Subcategory | \"local\" | prefixed forms\n if (!matrix.categories[skill.category as Subcategory]) {\n issues.push({\n severity: \"warning\",\n finding: \"skill-unknown-category\",\n details: `Skill '${skillId}' references category '${skill.category}' which does not exist in the matrix`,\n });\n }\n }\n}\n\nfunction checkCompatibleWithTargets(\n matrix: MergedSkillsMatrix,\n skillIds: Set<SkillId>,\n issues: MatrixHealthIssue[],\n): void {\n for (const [skillId, skill] of typedEntries<SkillId, ResolvedSkill>(matrix.skills)) {\n if (!skill) continue;\n for (const compatId of skill.compatibleWith) {\n if (!skillIds.has(compatId)) {\n issues.push({\n severity: \"warning\",\n finding: \"ghost-compatible-with-target\",\n details: `Skill '${skillId}' has compatibleWith '${compatId}' which does not exist in the matrix`,\n });\n }\n }\n }\n}\n\nfunction checkStackSkillIds(\n matrix: MergedSkillsMatrix,\n skillIds: Set<SkillId>,\n issues: MatrixHealthIssue[],\n): void {\n for (const stack of matrix.suggestedStacks) {\n for (const stackSkillId of stack.allSkillIds) {\n if (!skillIds.has(stackSkillId)) {\n issues.push({\n severity: \"warning\",\n finding: \"stack-ghost-skill\",\n details: `Stack '${stack.id}' references skill '${stackSkillId}' which does not exist in the matrix`,\n });\n }\n }\n }\n}\n","import type {\n BoundSkillCandidate,\n MergedSkillsMatrix,\n SkillAlias,\n SkillId,\n SkillSource,\n} from \"../../types\";\nimport { verbose, warn } from \"../../utils/logger\";\nimport { typedEntries } from \"../../utils/typed-object\";\nimport { resolveAllSources, type ResolvedConfig, type SourceEntry } from \"../configuration\";\nimport { extractAllSkills } from \"../matrix\";\nimport { fetchFromSource } from \"./source-fetcher\";\nimport { SKILLS_DIR_PATH } from \"../../consts\";\nimport path from \"path\";\nimport { getCollectivePluginDir, getPluginSkillIds, getPluginSkillsDir } from \"../plugins\";\nimport { directoryExists } from \"../../utils/fs\";\n\nconst PUBLIC_SOURCE_NAME = \"public\";\n\n/**\n * Loads skill source metadata from all configured sources and annotates\n * each skill in the matrix with its available sources and active source.\n */\nexport async function loadSkillsFromAllSources(\n primaryMatrix: MergedSkillsMatrix,\n sourceConfig: ResolvedConfig,\n projectDir: string,\n): Promise<void> {\n // 1. Tag all primary source skills with \"public\" source\n tagPrimarySourceSkills(primaryMatrix);\n\n // 2. Tag local skills\n tagLocalSkills(primaryMatrix);\n\n // 3. Tag plugin-installed skills\n await tagPluginSkills(primaryMatrix, projectDir);\n\n // 4. Load and tag extra sources\n await tagExtraSources(primaryMatrix, projectDir);\n\n // 5. Set activeSource on each skill\n setActiveSources(primaryMatrix);\n}\n\n/** Tag all skills in the primary matrix as \"public\" source */\nfunction tagPrimarySourceSkills(matrix: MergedSkillsMatrix): void {\n for (const [, skill] of typedEntries<SkillId, NonNullable<(typeof matrix.skills)[SkillId]>>(\n matrix.skills as Record<SkillId, NonNullable<(typeof matrix.skills)[SkillId]>>,\n )) {\n if (!skill) continue;\n\n const source: SkillSource = {\n name: PUBLIC_SOURCE_NAME,\n type: \"public\",\n version: skill.version,\n installed: false,\n };\n\n skill.availableSources = skill.availableSources ?? [];\n skill.availableSources.push(source);\n }\n}\n\n/** Tag local skills with \"local\" source and mark as installed */\nfunction tagLocalSkills(matrix: MergedSkillsMatrix): void {\n let count = 0;\n for (const [, skill] of typedEntries<SkillId, NonNullable<(typeof matrix.skills)[SkillId]>>(\n matrix.skills as Record<SkillId, NonNullable<(typeof matrix.skills)[SkillId]>>,\n )) {\n if (!skill) continue;\n if (!skill.local) continue;\n\n const source: SkillSource = {\n name: \"local\",\n type: \"local\",\n installed: true,\n installMode: \"local\",\n };\n\n skill.availableSources = skill.availableSources ?? [];\n skill.availableSources.push(source);\n count++;\n }\n\n verbose(`Tagged ${count} local skills with local source`);\n}\n\n/** Detect plugin-installed skills and tag them */\nasync function tagPluginSkills(matrix: MergedSkillsMatrix, projectDir: string): Promise<void> {\n const pluginDir = getCollectivePluginDir(projectDir);\n\n if (!(await directoryExists(pluginDir))) {\n verbose(\"No plugin directory found, skipping plugin skill tagging\");\n return;\n }\n\n const pluginSkillsDir = getPluginSkillsDir(pluginDir);\n\n if (!(await directoryExists(pluginSkillsDir))) {\n verbose(\"No plugin skills directory found, skipping plugin skill tagging\");\n return;\n }\n\n try {\n const pluginSkillIds = await getPluginSkillIds(pluginSkillsDir, matrix);\n\n for (const skillId of pluginSkillIds) {\n const skill = matrix.skills[skillId];\n if (!skill) continue;\n\n skill.availableSources = skill.availableSources ?? [];\n\n // Mark the existing source as installed via plugin\n const existingSource = skill.availableSources.find((s) => s.type === \"public\");\n if (existingSource && !existingSource.installMode) {\n existingSource.installed = true;\n existingSource.installMode = \"plugin\";\n } else if (!skill.availableSources.some((s) => s.installMode === \"plugin\")) {\n // No existing source to mark — add a public source with plugin install mode\n skill.availableSources.push({\n name: PUBLIC_SOURCE_NAME,\n type: \"public\",\n version: skill.version,\n installed: true,\n installMode: \"plugin\",\n });\n }\n }\n\n verbose(`Tagged ${pluginSkillIds.length} plugin-installed skills`);\n } catch (error) {\n verbose(`Failed to detect plugin skills: ${error}`);\n }\n}\n\n/** Load extra sources from project config and tag matching skills */\nasync function tagExtraSources(matrix: MergedSkillsMatrix, projectDir: string): Promise<void> {\n let allSources;\n try {\n allSources = await resolveAllSources(projectDir);\n } catch (error) {\n verbose(`Failed to resolve extra sources: ${error}`);\n return;\n }\n\n if (allSources.extras.length === 0) {\n verbose(\"No extra sources configured\");\n return;\n }\n\n for (const extraSource of allSources.extras) {\n verbose(`Loading extra source: ${extraSource.name} (${extraSource.url})`);\n\n try {\n const fetchResult = await fetchFromSource(extraSource.url, { forceRefresh: false });\n const skillsDir = path.join(fetchResult.path, SKILLS_DIR_PATH);\n const skills = await extractAllSkills(skillsDir);\n\n let matchCount = 0;\n for (const extractedSkill of skills) {\n const matrixSkill = matrix.skills[extractedSkill.id];\n if (!matrixSkill) continue;\n\n const source: SkillSource = {\n name: extraSource.name,\n type: \"private\",\n url: extraSource.url,\n installed: false,\n };\n\n matrixSkill.availableSources = matrixSkill.availableSources ?? [];\n matrixSkill.availableSources.push(source);\n matchCount++;\n }\n\n verbose(\n `Extra source '${extraSource.name}': ${skills.length} skills found, ${matchCount} matching`,\n );\n } catch (error) {\n warn(`Failed to load extra source '${extraSource.name}' (${extraSource.url}): ${error}`);\n }\n }\n}\n\n/** Set activeSource on each skill to the installed variant, or \"public\" as default */\nfunction setActiveSources(matrix: MergedSkillsMatrix): void {\n for (const [, skill] of typedEntries<SkillId, NonNullable<(typeof matrix.skills)[SkillId]>>(\n matrix.skills as Record<SkillId, NonNullable<(typeof matrix.skills)[SkillId]>>,\n )) {\n if (!skill) continue;\n if (!skill.availableSources || skill.availableSources.length === 0) continue;\n\n // Prefer installed source, then fall back to first available\n const installedSource = skill.availableSources.find((s) => s.installed);\n skill.activeSource = installedSource ?? skill.availableSources[0];\n }\n}\n\n/**\n * Search configured extra sources for skills matching a given alias.\n * Returns candidates with source name, skill ID, and description.\n * Errors per-source are warned and skipped (never throws).\n */\nexport async function searchExtraSources(\n alias: SkillAlias,\n configuredSources: SourceEntry[],\n): Promise<BoundSkillCandidate[]> {\n const candidates: BoundSkillCandidate[] = [];\n\n if (configuredSources.length === 0) {\n return candidates;\n }\n\n const lowerAlias = alias.toLowerCase();\n\n for (const source of configuredSources) {\n try {\n const fetchResult = await fetchFromSource(source.url, { forceRefresh: false });\n const skillsDir = path.join(fetchResult.path, SKILLS_DIR_PATH);\n const skills = await extractAllSkills(skillsDir);\n\n for (const skill of skills) {\n // Match by last segment of directory path (the alias/display-name convention)\n const segments = skill.directoryPath.split(\"/\");\n const lastSegment = segments[segments.length - 1]?.toLowerCase();\n\n if (lastSegment === lowerAlias) {\n candidates.push({\n id: skill.id,\n sourceUrl: source.url,\n sourceName: source.name,\n alias,\n description: skill.description,\n });\n }\n }\n } catch (error) {\n warn(`Failed to search extra source '${source.name}' (${source.url}): ${error}`);\n }\n }\n\n return candidates;\n}\n","export {\n type SkillManifestOptions,\n type AgentManifestOptions,\n type StackManifestOptions,\n generateSkillPluginManifest,\n generateAgentPluginManifest,\n generateStackPluginManifest,\n writePluginManifest,\n getPluginDir,\n} from \"./plugin-manifest\";\n\nexport { findPluginManifest } from \"./plugin-manifest-finder\";\n\nexport {\n getUserPluginsDir,\n getCollectivePluginDir,\n getProjectPluginsDir,\n getPluginSkillsDir,\n getPluginAgentsDir,\n getPluginManifestPath,\n readPluginManifest,\n getPluginSkillIds,\n} from \"./plugin-finder\";\n\nexport {\n type PluginInfo,\n type InstallationInfo,\n getPluginInfo,\n formatPluginDisplay,\n getInstallationInfo,\n formatInstallationDisplay,\n} from \"./plugin-info\";\n\nexport { type VersionBumpType, bumpPluginVersion, getPluginVersion } from \"./plugin-version\";\n\nexport {\n validatePluginStructure,\n validatePluginManifest,\n validateSkillFrontmatter,\n validateAgentFrontmatter,\n validatePlugin,\n validateAllPlugins,\n printPluginValidationResult,\n} from \"./plugin-validator\";\n","import path from \"path\";\nimport { ensureDir, writeFile } from \"../../utils/fs\";\nimport { DEFAULT_VERSION } from \"../../consts\";\nimport type { PluginAuthor, PluginManifest } from \"../../types\";\n\nconst PLUGIN_DIR_NAME = \".claude-plugin\";\nconst PLUGIN_MANIFEST_FILE = \"plugin.json\";\nconst SKILL_PLUGIN_PREFIX = \"\";\nconst AGENT_PLUGIN_PREFIX = \"agent-\";\n\nexport type SkillManifestOptions = {\n skillName: string;\n description?: string;\n author?: string;\n authorEmail?: string;\n version?: string;\n keywords?: string[];\n};\n\nexport type AgentManifestOptions = {\n agentName: string;\n description?: string;\n version?: string;\n};\n\nexport type StackManifestOptions = {\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(options: SkillManifestOptions): PluginManifest {\n const manifest: PluginManifest = {\n name: `${SKILL_PLUGIN_PREFIX}${options.skillName}`,\n version: options.version ?? DEFAULT_VERSION,\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 generateAgentPluginManifest(options: AgentManifestOptions): PluginManifest {\n const manifest: PluginManifest = {\n name: `${AGENT_PLUGIN_PREFIX}${options.agentName}`,\n version: options.version ?? DEFAULT_VERSION,\n agents: \"./agents/\",\n };\n\n if (options.description) {\n manifest.description = options.description;\n }\n\n return manifest;\n}\n\nexport function generateStackPluginManifest(options: StackManifestOptions): PluginManifest {\n const manifest: PluginManifest = {\n name: options.stackName,\n version: options.version ?? DEFAULT_VERSION,\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 // Note: Claude Code plugins don't support agents field in manifest\n // Agents are discovered from ./agents/ directory automatically\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 path from \"path\";\nimport { PLUGIN_MANIFEST_DIR, PLUGIN_MANIFEST_FILE } from \"../../consts\";\nimport { fileExists } from \"../../utils/fs\";\n\n// Walks up from startDir looking for the plugin manifest file.\nexport async 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(currentDir, PLUGIN_MANIFEST_DIR, PLUGIN_MANIFEST_FILE);\n if (await fileExists(manifestPath)) {\n return manifestPath;\n }\n currentDir = path.dirname(currentDir);\n }\n\n return null;\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 { MergedSkillsMatrix, PluginManifest, SkillId } from \"../../types\";\nimport { pluginManifestSchema } from \"../schemas\";\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(pluginDir: string): 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 = pluginManifestSchema.parse(JSON.parse(content));\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<SkillId[]> {\n const skillFiles = await glob(\"**/SKILL.md\", pluginSkillsDir);\n const skillIds: SkillId[] = [];\n\n // Boundary cast: Object.entries keys are SkillId\n const aliasToId = new Map<string, SkillId>();\n for (const [id, skill] of Object.entries(matrix.skills)) {\n if (!skill) continue;\n if (skill.displayName) {\n aliasToId.set(skill.displayName.toLowerCase(), id as SkillId);\n }\n }\n\n const dirToId = new Map<string, SkillId>();\n for (const [id] of Object.entries(matrix.skills)) {\n const idParts = id.split(\"/\");\n const lastPart = idParts[idParts.length - 1];\n if (lastPart) {\n dirToId.set(lastPart.toLowerCase(), id as SkillId);\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 if (matrix.skills[skillName as SkillId]) {\n skillIds.push(skillName as SkillId);\n continue;\n }\n const skillId = aliasToId.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 { readdir } from \"fs/promises\";\nimport {\n getCollectivePluginDir,\n getPluginSkillsDir,\n getPluginAgentsDir,\n readPluginManifest,\n} from \"./plugin-finder\";\nimport { countBy } from \"remeda\";\nimport { directoryExists } from \"../../utils/fs\";\nimport { DEFAULT_DISPLAY_VERSION } from \"../../consts\";\nimport { detectInstallation, type InstallMode } from \"../installation\";\nimport { loadProjectConfig } from \"../configuration\";\n\nconst DEFAULT_NAME = \"claude-collective\";\n\nexport type PluginInfo = {\n name: string;\n version: string;\n skillCount: number;\n agentCount: number;\n path: string;\n};\n\nexport type InstallationInfo = {\n mode: InstallMode;\n name: string;\n version: string;\n skillCount: number;\n agentCount: number;\n configPath: string;\n agentsDir: string;\n skillsDir: 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 = countBy(skills, (s) => String(s.isDirectory()))[\"true\"] ?? 0;\n }\n\n if (await directoryExists(agentsDir)) {\n const agents = await readdir(agentsDir, { withFileTypes: true });\n agentCount = agents.filter((a) => a.isFile() && a.name.endsWith(\".md\")).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\nexport async function getInstallationInfo(): Promise<InstallationInfo | null> {\n const installation = await detectInstallation();\n\n if (!installation) {\n return null;\n }\n\n let skillCount = 0;\n let agentCount = 0;\n let name = DEFAULT_NAME;\n let version = DEFAULT_DISPLAY_VERSION;\n\n if (await directoryExists(installation.skillsDir)) {\n try {\n const skills = await readdir(installation.skillsDir, {\n withFileTypes: true,\n });\n skillCount = skills.filter((s) => s.isDirectory()).length;\n } catch {\n // Ignore errors\n }\n }\n\n if (await directoryExists(installation.agentsDir)) {\n try {\n const agents = await readdir(installation.agentsDir, {\n withFileTypes: true,\n });\n agentCount = agents.filter((a) => a.isFile() && a.name.endsWith(\".md\")).length;\n } catch {\n // Ignore errors\n }\n }\n\n if (installation.mode === \"local\") {\n const loaded = await loadProjectConfig(installation.projectDir);\n if (loaded?.config) {\n name = loaded.config.name || DEFAULT_NAME;\n version = \"local\";\n }\n } else {\n const pluginDir = getCollectivePluginDir(installation.projectDir);\n const manifest = await readPluginManifest(pluginDir);\n if (manifest) {\n name = manifest.name || DEFAULT_NAME;\n version = manifest.version || DEFAULT_DISPLAY_VERSION;\n }\n }\n\n return {\n mode: installation.mode,\n name,\n version,\n skillCount,\n agentCount,\n configPath: installation.configPath,\n agentsDir: installation.agentsDir,\n skillsDir: installation.skillsDir,\n };\n}\n\nexport function formatInstallationDisplay(info: InstallationInfo): string {\n const modeLabel = info.mode === \"local\" ? \"Local\" : \"Plugin\";\n const versionDisplay = info.mode === \"local\" ? \"(local mode)\" : `v${info.version}`;\n\n return `Installation: ${info.name} ${versionDisplay}\n Mode: ${modeLabel}\n Skills: ${info.skillCount}\n Agents: ${info.agentCount}\n Config: ${info.configPath}\n Agents: ${info.agentsDir}`;\n}\n","export {\n type InstallMode,\n type Installation,\n detectInstallation,\n getInstallationOrThrow,\n} from \"./installation\";\n\nexport { type LocalInstallOptions, type LocalInstallResult, installLocal } from \"./local-installer\";\n","import path from \"path\";\nimport { directoryExists, fileExists } from \"../../utils/fs\";\nimport { loadProjectConfig } from \"../configuration\";\nimport { getCollectivePluginDir } from \"../plugins\";\nimport { CLAUDE_DIR, CLAUDE_SRC_DIR } from \"../../consts\";\n\nexport type InstallMode = \"local\" | \"plugin\";\n\nexport type Installation = {\n mode: InstallMode;\n configPath: string;\n agentsDir: string;\n skillsDir: string;\n projectDir: string;\n};\n\n// Priority: Local (.claude-src/config.yaml) > Plugin (.claude/plugins/claude-collective/)\nexport async function detectInstallation(\n projectDir: string = process.cwd(),\n): Promise<Installation | null> {\n // 1. Check for local installation first\n // Check .claude-src/config.yaml first (new location)\n const srcConfigPath = path.join(projectDir, CLAUDE_SRC_DIR, \"config.yaml\");\n // Fall back to .claude/config.yaml (legacy location)\n const legacyConfigPath = path.join(projectDir, CLAUDE_DIR, \"config.yaml\");\n\n const localConfigPath = (await fileExists(srcConfigPath))\n ? srcConfigPath\n : (await fileExists(legacyConfigPath))\n ? legacyConfigPath\n : null;\n\n if (localConfigPath) {\n const loaded = await loadProjectConfig(projectDir);\n\n // If config exists and has installMode: local (or no installMode, defaults to local)\n // treat it as local mode\n const mode: InstallMode = loaded?.config?.installMode ?? \"local\";\n\n if (mode === \"local\") {\n return {\n mode: \"local\",\n configPath: localConfigPath,\n agentsDir: path.join(projectDir, CLAUDE_DIR, \"agents\"),\n skillsDir: path.join(projectDir, CLAUDE_DIR, \"skills\"),\n projectDir,\n };\n }\n }\n\n // 2. Check for plugin installation\n const pluginDir = getCollectivePluginDir(projectDir);\n const pluginConfigPath = path.join(pluginDir, \"config.yaml\");\n\n if (await directoryExists(pluginDir)) {\n return {\n mode: \"plugin\",\n configPath: pluginConfigPath,\n agentsDir: path.join(pluginDir, \"agents\"),\n skillsDir: path.join(pluginDir, \"skills\"),\n projectDir,\n };\n }\n\n // No installation found\n return null;\n}\n\nexport async function getInstallationOrThrow(\n projectDir: string = process.cwd(),\n): Promise<Installation> {\n const installation = await detectInstallation(projectDir);\n\n if (!installation) {\n throw new Error(\"No Claude Collective installation found.\\n\" + \"Run 'cc init' to create one.\");\n }\n\n return installation;\n}\n","import path from \"path\";\nimport { stringify as stringifyYaml } from \"yaml\";\nimport type {\n AgentConfig,\n AgentDefinition,\n AgentName,\n CompileAgentConfig,\n CompileConfig,\n MergedSkillsMatrix,\n ProjectConfig,\n SkillDefinition,\n SkillId,\n Stack,\n} from \"../../types\";\nimport type { WizardResultV2 } from \"../../components/wizard/wizard\";\nimport { type CopiedSkill, copySkillsToLocalFlattened, archiveLocalSkill } from \"../skills\";\nimport { mergeWithExistingConfig } from \"../configuration\";\nimport { loadAllAgents, type SourceLoadResult } from \"../loading\";\nimport { loadStackById, compileAgentForPlugin } from \"../stacks\";\nimport { resolveAgents, buildSkillRefsFromConfig } from \"../resolver\";\nimport { createLiquidEngine } from \"../compiler\";\nimport { generateProjectConfigFromSkills } from \"../configuration\";\nimport { ensureDir, writeFile } from \"../../utils/fs\";\nimport { verbose } from \"../../utils/logger\";\nimport { typedEntries, typedKeys } from \"../../utils/typed-object\";\nimport { CLAUDE_DIR, CLAUDE_SRC_DIR, LOCAL_SKILLS_PATH, PROJECT_ROOT } from \"../../consts\";\n\nconst PLUGIN_NAME = \"claude-collective\";\n\nconst YAML_INDENT = 2;\nconst YAML_LINE_WIDTH = 120;\n\ntype LocalResolvedSkill = SkillDefinition & {\n content: string;\n};\n\nexport type LocalInstallOptions = {\n wizardResult: WizardResultV2;\n sourceResult: SourceLoadResult;\n projectDir: string;\n sourceFlag?: string;\n};\n\nexport type LocalInstallResult = {\n copiedSkills: CopiedSkill[];\n config: ProjectConfig;\n configPath: string;\n compiledAgents: AgentName[];\n wasMerged: boolean;\n mergedConfigPath?: string;\n skillsDir: string;\n agentsDir: string;\n};\n\nfunction buildLocalSkillsMap(\n copiedSkills: CopiedSkill[],\n matrix: MergedSkillsMatrix,\n): Record<SkillId, LocalResolvedSkill> {\n const localSkillsForResolution: Record<SkillId, LocalResolvedSkill> = {} as Record<\n SkillId,\n LocalResolvedSkill\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 description: skill.description || \"\",\n path: copiedSkill.destPath,\n content: \"\", // Content not needed for skill references\n };\n }\n }\n return localSkillsForResolution;\n}\n\nasync function buildLocalConfig(\n wizardResult: WizardResultV2,\n sourceResult: SourceLoadResult,\n): Promise<{ config: ProjectConfig; loadedStack: Stack | null }> {\n // Try loading stack from source first, fall back to CLI\n let loadedStack: Stack | null = null;\n if (wizardResult.selectedStackId) {\n loadedStack = await loadStackById(wizardResult.selectedStackId, sourceResult.sourcePath);\n if (!loadedStack) {\n loadedStack = await loadStackById(wizardResult.selectedStackId, PROJECT_ROOT);\n }\n }\n\n let localConfig: ProjectConfig;\n\n if (wizardResult.selectedStackId) {\n if (loadedStack) {\n // Generate config from the user's actual skill selections (which may differ\n // from the original stack if the user customized). This ensures the stack\n // property reflects customizations (e.g., swapping commander for oclif).\n localConfig = generateProjectConfigFromSkills(\n PLUGIN_NAME,\n wizardResult.selectedSkills,\n sourceResult.matrix,\n );\n\n // Preserve the stack description and ensure all stack agents are included\n localConfig.description = loadedStack.description;\n const stackAgentIds = typedKeys<AgentName>(loadedStack.agents);\n for (const agentId of stackAgentIds) {\n if (!localConfig.agents.includes(agentId)) {\n localConfig.agents.push(agentId);\n }\n }\n localConfig.agents.sort();\n } else {\n // Stack not found in CLI's config/stacks.yaml\n throw new Error(\n `Stack '${wizardResult.selectedStackId}' not found in config/stacks.yaml. ` +\n `Available stacks are defined in the CLI's config/stacks.yaml file.`,\n );\n }\n } else {\n localConfig = generateProjectConfigFromSkills(\n PLUGIN_NAME,\n wizardResult.selectedSkills,\n sourceResult.matrix,\n );\n }\n\n return { config: localConfig, loadedStack };\n}\n\nfunction setConfigMetadata(\n config: ProjectConfig,\n wizardResult: WizardResultV2,\n sourceResult: SourceLoadResult,\n sourceFlag?: string,\n): void {\n config.installMode = wizardResult.installMode;\n\n // Flag overrides resolved source\n if (sourceFlag) {\n config.source = sourceFlag;\n } else if (sourceResult.sourceConfig.source) {\n config.source = sourceResult.sourceConfig.source;\n }\n\n if (sourceResult.marketplace) {\n config.marketplace = sourceResult.marketplace;\n }\n}\n\nfunction buildCompileAgents(\n config: ProjectConfig,\n agents: Record<AgentName, AgentDefinition>,\n): Record<AgentName, CompileAgentConfig> {\n const compileAgents: Record<AgentName, CompileAgentConfig> = {} as Record<\n AgentName,\n CompileAgentConfig\n >;\n for (const agentId of config.agents) {\n if (agents[agentId]) {\n const agentStack = config.stack?.[agentId];\n compileAgents[agentId] = agentStack ? { skills: buildSkillRefsFromConfig(agentStack) } : {};\n }\n }\n return compileAgents;\n}\n\nasync function compileAndWriteAgents(\n compileConfig: CompileConfig,\n agents: Record<AgentName, AgentDefinition>,\n localSkills: Record<SkillId, LocalResolvedSkill>,\n sourceResult: SourceLoadResult,\n projectDir: string,\n agentsDir: string,\n installMode?: \"plugin\" | \"local\",\n): Promise<AgentName[]> {\n const engine = await createLiquidEngine(projectDir);\n const resolvedAgents = await resolveAgents(\n agents,\n localSkills,\n compileConfig,\n sourceResult.sourcePath,\n );\n\n const compiledAgentNames: AgentName[] = [];\n for (const [name, agent] of typedEntries<AgentName, AgentConfig>(resolvedAgents)) {\n const output = await compileAgentForPlugin(\n name,\n agent,\n sourceResult.sourcePath,\n engine,\n installMode,\n );\n await writeFile(path.join(agentsDir, `${name}.md`), output);\n compiledAgentNames.push(name);\n }\n\n return compiledAgentNames;\n}\n\nexport async function installLocal(options: LocalInstallOptions): Promise<LocalInstallResult> {\n const { wizardResult, sourceResult, projectDir, sourceFlag } = options;\n const matrix = sourceResult.matrix;\n const localSkillsDir = path.join(projectDir, LOCAL_SKILLS_PATH);\n const localAgentsDir = path.join(projectDir, CLAUDE_DIR, \"agents\");\n const localConfigPath = path.join(projectDir, CLAUDE_SRC_DIR, \"config.yaml\");\n\n // 1. Create directories\n await ensureDir(localSkillsDir);\n await ensureDir(localAgentsDir);\n await ensureDir(path.dirname(localConfigPath));\n\n // 2. Archive local skills that are switching to a different source\n for (const skillId of wizardResult.selectedSkills) {\n const selectedSource = wizardResult.sourceSelections?.[skillId];\n if (selectedSource && selectedSource !== \"public\") {\n verbose(`Using alternate source '${selectedSource}' for ${skillId}`);\n await archiveLocalSkill(projectDir, skillId);\n }\n }\n\n // 3. Copy selected skills\n const copiedSkills = await copySkillsToLocalFlattened(\n wizardResult.selectedSkills,\n localSkillsDir,\n matrix,\n sourceResult,\n );\n\n // 4. Build local skills map for resolution\n const localSkillsForResolution = buildLocalSkillsMap(copiedSkills, matrix);\n // 5. Load agents from both CLI and source, with source taking precedence\n const cliAgents = await loadAllAgents(PROJECT_ROOT);\n const localAgents = await loadAllAgents(sourceResult.sourcePath);\n // Boundary cast: loadAllAgents returns Record<string, AgentDefinition>, agent dirs are AgentName by convention\n const agents = { ...cliAgents, ...localAgents } as Record<AgentName, AgentDefinition>;\n\n // 6. Build config\n const { config: builtConfig } = await buildLocalConfig(wizardResult, sourceResult);\n\n // 7. Set metadata\n setConfigMetadata(builtConfig, wizardResult, sourceResult, sourceFlag);\n\n // 8. Merge with existing config\n const mergeResult = await mergeWithExistingConfig(builtConfig, { projectDir });\n const finalConfig = mergeResult.config;\n\n // 9. Write config\n const configYaml = stringifyYaml(finalConfig, {\n indent: YAML_INDENT,\n lineWidth: YAML_LINE_WIDTH,\n });\n await writeFile(localConfigPath, configYaml);\n\n // 10. Build compile agents config\n const compileAgentsConfig = buildCompileAgents(finalConfig, agents);\n\n const compileConfig: CompileConfig = {\n name: PLUGIN_NAME,\n description:\n finalConfig.description || `Local setup with ${wizardResult.selectedSkills.length} skills`,\n agents: compileAgentsConfig,\n };\n\n // 11. Compile and write agents\n const compiledAgentNames = await compileAndWriteAgents(\n compileConfig,\n agents,\n localSkillsForResolution,\n sourceResult,\n projectDir,\n localAgentsDir,\n wizardResult.installMode,\n );\n\n return {\n copiedSkills,\n config: finalConfig,\n configPath: localConfigPath,\n compiledAgents: compiledAgentNames,\n wasMerged: mergeResult.merged,\n mergedConfigPath: mergeResult.existingConfigPath,\n skillsDir: localSkillsDir,\n agentsDir: localAgentsDir,\n };\n}\n","export {\n loadStacks,\n loadStackById,\n resolveAgentConfigToSkills,\n resolveStackSkillsFromDisplayNames,\n} from \"./stacks-loader\";\n\nexport {\n type StackInstallOptions,\n type StackInstallResult,\n compileStackToTemp,\n installStackAsPlugin,\n} from \"./stack-installer\";\n\nexport {\n type StackPluginOptions,\n type CompiledStackPlugin,\n compileAgentForPlugin,\n compileStackPlugin,\n printStackCompilationSummary,\n} from \"./stack-plugin-compiler\";\n","import { parse as parseYaml } from \"yaml\";\nimport path from \"path\";\nimport { mapValues } from \"remeda\";\nimport { readFile, fileExists } from \"../../utils/fs\";\nimport { verbose, warn } from \"../../utils/logger\";\nimport type { SkillId, SkillReference, Stack, StackAgentConfig, Subcategory } from \"../../types\";\nimport { stacksConfigSchema } from \"../schemas\";\nimport { KEY_SUBCATEGORIES } from \"../../consts\";\n\nconst STACKS_FILE = \"config/stacks.yaml\";\n\nconst stacksCache = new Map<string, Stack[]>();\n\nexport async function loadStacks(configDir: string): Promise<Stack[]> {\n const cacheKey = configDir;\n const cached = stacksCache.get(cacheKey);\n if (cached) return cached;\n\n const stacksPath = path.join(configDir, STACKS_FILE);\n\n if (!(await fileExists(stacksPath))) {\n verbose(`No stacks file found at ${stacksPath}`);\n return [];\n }\n\n try {\n const content = await readFile(stacksPath);\n const result = stacksConfigSchema.safeParse(parseYaml(content));\n\n if (!result.success) {\n throw new Error(\n `Invalid stacks.yaml at ${stacksPath}: ${result.error.issues.map((i) => `${i.path.join(\".\")}: ${i.message}`).join(\"; \")}`,\n );\n }\n\n const config = result.data;\n\n stacksCache.set(cacheKey, config.stacks);\n verbose(`Loaded ${config.stacks.length} stacks from ${stacksPath}`);\n\n return config.stacks;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n throw new Error(`Failed to load stacks from '${stacksPath}': ${errorMessage}`);\n }\n}\n\nexport async function loadStackById(stackId: string, configDir: string): Promise<Stack | null> {\n const stacks = await loadStacks(configDir);\n const stack = stacks.find((s) => s.id === stackId);\n\n if (!stack) {\n verbose(`Stack '${stackId}' not found`);\n return null;\n }\n\n verbose(`Found stack: ${stack.name} (${stackId})`);\n return stack;\n}\n\n// Resolves each technology display name in the agent config to a full skill ID\nexport function resolveAgentConfigToSkills(\n agentConfig: StackAgentConfig,\n displayNameToId: Partial<Record<string, SkillId>>,\n): SkillReference[] {\n const skillRefs: SkillReference[] = [];\n\n for (const [subcategory, technologyDisplayName] of Object.entries(agentConfig)) {\n const fullSkillId = displayNameToId[technologyDisplayName];\n\n if (!fullSkillId) {\n warn(\n `No skill found for display name '${technologyDisplayName}' (subcategory: ${subcategory}) in stack config. Skipping.`,\n );\n continue;\n }\n\n // Boundary cast: Object.entries() loses StackAgentConfig key type\n const isKeySkill = KEY_SUBCATEGORIES.has(subcategory as Subcategory);\n\n skillRefs.push({\n id: fullSkillId,\n usage: `when working with ${subcategory}`,\n preloaded: isKeySkill,\n });\n }\n\n return skillRefs;\n}\n\nexport function resolveStackSkillsFromDisplayNames(\n stack: Stack,\n displayNameToId: Partial<Record<string, SkillId>>,\n): Record<string, SkillReference[]> {\n const result = mapValues(stack.agents, (agentConfig) =>\n resolveAgentConfigToSkills(agentConfig, displayNameToId),\n );\n\n verbose(`Resolved skills for ${Object.keys(result).length} agents in stack '${stack.id}'`);\n\n return result;\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 { verbose } from \"../../utils/logger\";\nimport type { CompiledStackPlugin } from \"./stack-plugin-compiler\";\nimport type { AgentName, SkillId } from \"../../types\";\n\nexport type StackInstallOptions = {\n stackId: string;\n projectDir: string;\n sourcePath: string;\n agentSourcePath: string;\n marketplace?: string;\n};\n\nexport type StackInstallResult = {\n pluginName: string;\n stackName: string;\n agents: AgentName[];\n skills: SkillId[];\n pluginPath: string;\n fromMarketplace: boolean;\n};\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\nexport async function installStackAsPlugin(\n options: StackInstallOptions,\n): Promise<StackInstallResult> {\n const { stackId, projectDir, sourcePath, agentSourcePath, marketplace } = options;\n\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 if (marketplace) {\n verbose(`Installing from marketplace: ${stackId}@${marketplace}`);\n const pluginRef = `${stackId}@${marketplace}`;\n\n await claudePluginInstall(pluginRef, \"project\", projectDir);\n\n return {\n pluginName: stackId,\n stackName: stackId,\n agents: [],\n skills: [],\n pluginPath: pluginRef,\n fromMarketplace: true,\n };\n }\n\n verbose(`Compiling stack locally: ${stackId}`);\n const { result, cleanup } = await compileStackToTemp({\n stackId,\n projectRoot: sourcePath,\n agentSourcePath,\n });\n\n try {\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 fromMarketplace: false,\n };\n } finally {\n await cleanup();\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, SKILLS_MATRIX_PATH } from \"../../consts\";\nimport { createLiquidEngine } from \"../compiler\";\nimport {\n generateStackPluginManifest,\n writePluginManifest,\n getPluginManifestPath,\n} from \"../plugins\";\nimport { loadSkillsByIds, loadAllAgents } from \"../loading\";\nimport { loadStackById, resolveAgentConfigToSkills } from \"./stacks-loader\";\nimport { loadSkillsMatrix } from \"../matrix\";\nimport { resolveAgents, stackToCompileConfig } from \"../resolver\";\nimport { buildStackProperty } from \"../configuration\";\nimport type {\n AgentConfig,\n AgentDefinition,\n AgentName,\n CompileConfig,\n CompiledAgentData,\n PluginManifest,\n ProjectConfig,\n SkillDefinition,\n SkillId,\n Stack,\n} from \"../../types\";\nimport { hashString, determinePluginVersion, writeContentHash } from \"../versioning\";\nimport { unique } from \"remeda\";\nimport { typedEntries, typedKeys } from \"../../utils/typed-object\";\n\nfunction hashStackConfig(stack: ProjectConfig): string {\n const stackSkillIds = stack.stack\n ? [...new Set(Object.values(stack.stack).flatMap((a) => Object.values(a)))].sort()\n : [];\n const parts: string[] = [\n `name:${stack.name}`,\n `description:${stack.description ?? \"\"}`,\n `skills:${stackSkillIds.join(\",\")}`,\n `agents:${(stack.agents || []).sort().join(\",\")}`,\n ];\n return hashString(parts.join(\"\\n\"));\n}\n\nexport type StackPluginOptions = {\n stackId: string;\n outputDir: string;\n projectRoot: string;\n agentSourcePath?: string;\n /** Optional stack configuration - if provided, bypasses loading from config/stacks.yaml */\n stack?: Stack;\n};\n\nexport type CompiledStackPlugin = {\n pluginPath: string;\n manifest: PluginManifest;\n stackName: string;\n agents: AgentName[];\n skillPlugins: SkillId[];\n hasHooks: boolean;\n};\n\nexport async function compileAgentForPlugin(\n name: AgentName,\n agent: AgentConfig,\n fallbackRoot: string,\n engine: Liquid,\n installMode?: \"plugin\" | \"local\",\n): Promise<string> {\n verbose(`Compiling agent: ${name}`);\n\n // Use agent's sourceRoot if available (for multi-source loading), otherwise fallback\n const agentSourceRoot = agent.sourceRoot || fallbackRoot;\n // Use agent's agentBaseDir if available (for project agents in .claude-src/agents/)\n const agentBaseDir = agent.agentBaseDir || DIRS.agents;\n const agentDir = path.join(agentSourceRoot, agentBaseDir, 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(agentSourceRoot, agentBaseDir, category);\n\n let outputFormat = await readFileOptional(path.join(agentDir, \"output-format.md\"), \"\");\n if (!outputFormat) {\n outputFormat = await readFileOptional(path.join(categoryDir, \"output-format.md\"), \"\");\n }\n\n // In plugin mode, skills are installed as individual plugins — use pluginRef format.\n // Create new skill objects to avoid mutating the caller's data.\n const skills =\n installMode === \"plugin\"\n ? agent.skills.map((s) => ({ ...s, pluginRef: `${s.id}:${s.id}` as const }))\n : agent.skills;\n\n const preloadedSkills = skills.filter((s) => s.preloaded);\n const dynamicSkills = skills.filter((s) => !s.preloaded);\n const preloadedSkillIds = preloadedSkills.map((s) => s.pluginRef ?? 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,\n preloadedSkills,\n dynamicSkills,\n preloadedSkillIds,\n };\n\n return engine.renderFile(\"agent\", data);\n}\n\nfunction generateStackReadme(\n stackId: string,\n stack: ProjectConfig,\n agents: AgentName[],\n skillPlugins: SkillId[],\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 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 = unique(skillPlugins).sort();\n for (const skill of uniqueSkills) {\n lines.push(`- \\`${skill}\\``);\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\nexport async function compileStackPlugin(\n options: StackPluginOptions,\n): Promise<CompiledStackPlugin> {\n const { stackId, outputDir, projectRoot, agentSourcePath } = options;\n const localAgentRoot = agentSourcePath || projectRoot;\n\n verbose(`Compiling stack plugin: ${stackId}`);\n verbose(` Stack/skills source: ${projectRoot}`);\n verbose(` Local agent source: ${localAgentRoot}`);\n verbose(` CLI agent source: ${PROJECT_ROOT}`);\n\n // Load agents from both local project and CLI, with local taking precedence\n const cliAgents = await loadAllAgents(PROJECT_ROOT);\n const localAgents = await loadAllAgents(localAgentRoot);\n // Boundary cast: loadAllAgents returns Record<string, AgentDefinition>, agent dirs are AgentName by convention\n const agents = { ...cliAgents, ...localAgents } as Record<AgentName, AgentDefinition>;\n\n verbose(\n ` Loaded ${Object.keys(localAgents).length} local agents, ${Object.keys(cliAgents).length} CLI agents`,\n );\n\n // Use provided stack or load from CLI's config/stacks.yaml\n const newStack = options.stack || (await loadStackById(stackId, PROJECT_ROOT));\n\n // Load skill aliases from the matrix to resolve technology aliases to skill IDs\n // This is needed for Phase 7 skill resolution in resolveAgents\n const matrixPath = path.join(PROJECT_ROOT, SKILLS_MATRIX_PATH);\n const matrix = await loadSkillsMatrix(matrixPath);\n const skillAliases = matrix.skill_aliases || {};\n\n let stack: ProjectConfig;\n if (newStack) {\n verbose(` Found stack: ${newStack.name}`);\n\n // Extract skills from stack's agent configurations (Phase 7: skills in stacks, not agents)\n const agentSkillIds = new Set<SkillId>();\n for (const agentName of typedKeys<AgentName>(newStack.agents)) {\n const agentConfig = newStack.agents[agentName];\n if (!agentConfig) continue;\n const skillRefs = resolveAgentConfigToSkills(agentConfig, skillAliases);\n for (const ref of skillRefs) {\n agentSkillIds.add(ref.id);\n }\n }\n\n // Build ProjectConfig for rest of function\n stack = {\n name: newStack.name,\n description: newStack.description,\n agents: typedKeys<AgentName>(newStack.agents),\n skills: [...agentSkillIds],\n stack: buildStackProperty(newStack, skillAliases) as ProjectConfig[\"stack\"],\n };\n } else {\n throw new Error(`Stack '${stackId}' not found in config/stacks.yaml`);\n }\n\n // Collect unique skill IDs from stack property for loading\n const stackSkillIds = stack.stack\n ? [...new Set(Object.values(stack.stack).flatMap((a) => Object.values(a)))]\n : [];\n // Boundary cast: loadSkillsByIds returns Record<string, SkillDefinition>, keys are SkillId by construction\n const skills = (await loadSkillsByIds(\n stackSkillIds.map((id) => ({ id })),\n projectRoot,\n )) as Record<SkillId, SkillDefinition>;\n\n const compileConfig: CompileConfig = stackToCompileConfig(stackId, stack);\n\n // Pass newStack and skillAliases for Phase 7 skill resolution\n const resolvedAgents = await resolveAgents(\n agents,\n skills,\n compileConfig,\n projectRoot,\n newStack,\n skillAliases,\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.values(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.id);\n\n if (await directoryExists(sourceSkillDir)) {\n await copy(sourceSkillDir, destSkillDir);\n copiedSourcePaths.add(resolvedSkill.path);\n verbose(` Copied skill: ${resolvedSkill.id}`);\n } else {\n verbose(` Warning: Skill directory not found: ${sourceSkillDir}`);\n }\n }\n\n const engine = await createLiquidEngine();\n\n const compiledAgentNames: AgentName[] = [];\n const allSkillPlugins: SkillId[] = [];\n\n for (const [name, agent] of typedEntries<AgentName, AgentConfig>(resolvedAgents)) {\n const output = await compileAgentForPlugin(name, agent, PROJECT_ROOT, 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 newHash = hashStackConfig(stack);\n const { version, contentHash } = await determinePluginVersion(\n newHash,\n pluginDir,\n getPluginManifestPath,\n );\n\n const uniqueSkillPlugins = unique(allSkillPlugins);\n const manifest = generateStackPluginManifest({\n stackName: stackId,\n description: stack.description,\n author: stack.author,\n version,\n keywords: undefined,\n hasAgents: true,\n hasHooks: false,\n hasSkills: true,\n });\n\n await writePluginManifest(pluginDir, manifest);\n\n await writeContentHash(pluginDir, contentHash, getPluginManifestPath);\n\n verbose(` Wrote plugin.json (v${version})`);\n\n const readme = generateStackReadme(stackId, stack, compiledAgentNames, uniqueSkillPlugins);\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: false,\n };\n}\n\nexport function printStackCompilationSummary(result: CompiledStackPlugin): 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 { pipe, flatMap, filter, uniqueBy } from \"remeda\";\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 { CLAUDE_DIR, CLAUDE_SRC_DIR, DIRS, PROJECT_ROOT } from \"../consts\";\nimport { resolveClaudeMd } from \"./resolver\";\nimport { validateCompiledAgent, printOutputValidationResult } from \"./output-validator\";\nimport type { AgentConfig, AgentName, CompiledAgentData, CompileContext } from \"../types\";\nimport { typedEntries } from \"../utils/typed-object\";\n\nasync function compileAgent(\n name: AgentName,\n agent: AgentConfig,\n projectRoot: string,\n engine: Liquid,\n): Promise<string> {\n verbose(`Reading agent files for ${name}...`);\n\n // Use agent's sourceRoot and agentBaseDir if available (for project agents in .claude-src/agents/)\n const agentSourceRoot = agent.sourceRoot || projectRoot;\n const agentBaseDir = agent.agentBaseDir || DIRS.agents;\n const agentDir = path.join(agentSourceRoot, agentBaseDir, 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(agentSourceRoot, agentBaseDir, category);\n\n let outputFormat = await readFileOptional(path.join(agentDir, \"output-format.md\"), \"\");\n if (!outputFormat) {\n outputFormat = await readFileOptional(path.join(categoryDir, \"output-format.md\"), \"\");\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 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 typedEntries<AgentName, AgentConfig>(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 = 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 = pipe(\n Object.values(resolvedAgents),\n flatMap((a) => a.skills),\n filter((s) => Boolean(s.path)),\n );\n\n const uniqueSkills = uniqueBy(allSkills, (s) => s.id);\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(path.join(sourcePath, \"reference.md\"));\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 = 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(ctx.projectRoot, ctx.stackId);\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 = 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 // Check .claude-src/agents/_templates/ FIRST (new location)\n const srcTemplatesDir = path.join(projectDir, CLAUDE_SRC_DIR, \"agents\", \"_templates\");\n if (await directoryExists(srcTemplatesDir)) {\n roots.push(srcTemplatesDir);\n verbose(`Using local templates from: ${srcTemplatesDir}`);\n }\n\n // Then check .claude/templates/ as fallback (legacy location)\n const legacyTemplatesDir = path.join(projectDir, CLAUDE_DIR, \"templates\");\n if (await directoryExists(legacyTemplatesDir)) {\n roots.push(legacyTemplatesDir);\n verbose(`Using legacy templates from: ${legacyTemplatesDir}`);\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 { fileExists } from \"../utils/fs\";\nimport { DIRS, KEY_SUBCATEGORIES } from \"../consts\";\nimport { verbose } from \"../utils/logger\";\nimport type {\n AgentConfig,\n AgentDefinition,\n AgentName,\n CompileAgentConfig,\n CompileConfig,\n ProjectConfig,\n Skill,\n SkillDefinition,\n SkillDisplayName,\n SkillId,\n SkillReference,\n Stack,\n Subcategory,\n} from \"../types\";\nimport { typedEntries, typedKeys } from \"../utils/typed-object\";\n\nexport async function resolveTemplate(projectRoot: string, stackId: string): Promise<string> {\n const stackTemplate = path.join(projectRoot, DIRS.stacks, stackId, \"agent.liquid\");\n if (await fileExists(stackTemplate)) return stackTemplate;\n\n return path.join(projectRoot, DIRS.templates, \"agent.liquid\");\n}\n\nexport async function resolveClaudeMd(projectRoot: string, stackId: string): Promise<string> {\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<SkillId, SkillDefinition>,\n): Skill | null {\n const definition = skills[ref.id];\n if (!definition) {\n verbose(`Skill '${ref.id}' not found in available skills, skipping`);\n return null;\n }\n return {\n ...definition,\n usage: ref.usage,\n preloaded: ref.preloaded ?? false,\n };\n}\n\nexport function resolveSkillReferences(\n skillRefs: SkillReference[],\n skills: Record<SkillId, SkillDefinition>,\n): Skill[] {\n return skillRefs\n .map((ref) => resolveSkillReference(ref, skills))\n .filter((skill): skill is Skill => skill !== null);\n}\n\n// Resolve skills for an agent from a Stack definition using display-name-to-ID mappings.\nexport function buildSkillRefsFromConfig(\n agentStack: Partial<Record<Subcategory, SkillId>>,\n): SkillReference[] {\n const skillRefs: SkillReference[] = [];\n for (const [subcategory, skillId] of typedEntries<Subcategory, SkillId>(agentStack)) {\n skillRefs.push({\n id: skillId,\n usage: `when working with ${subcategory}`,\n preloaded: KEY_SUBCATEGORIES.has(subcategory),\n });\n }\n return skillRefs;\n}\n\nexport function resolveAgentSkillsFromStack(\n agentName: AgentName,\n stack: Stack,\n displayNameToId: Partial<Record<SkillDisplayName, SkillId>>,\n): SkillReference[] {\n const agentConfig = stack.agents[agentName];\n\n // Agent not in this stack\n if (!agentConfig) {\n verbose(`Agent '${agentName}' not found in stack '${stack.id}'`);\n return [];\n }\n\n // Empty config {} means agent has no technology-specific skills\n if (typedKeys<Subcategory>(agentConfig).length === 0) {\n verbose(`Agent '${agentName}' has no technology config in stack '${stack.id}'`);\n return [];\n }\n\n const skillRefs: SkillReference[] = [];\n\n for (const [subcategory, technologyDisplayName] of typedEntries<Subcategory, SkillDisplayName>(\n agentConfig,\n )) {\n const fullSkillId = displayNameToId[technologyDisplayName];\n\n if (!fullSkillId) {\n verbose(\n `Warning: No skill found for display name '${technologyDisplayName}' (agent: ${agentName}, subcategory: ${subcategory}). Skipping.`,\n );\n continue;\n }\n\n const isKeySkill = KEY_SUBCATEGORIES.has(subcategory);\n\n skillRefs.push({\n id: fullSkillId,\n usage: `when working with ${subcategory}`,\n preloaded: isKeySkill,\n });\n }\n\n verbose(`Resolved ${skillRefs.length} skills for agent '${agentName}' from stack '${stack.id}'`);\n\n return skillRefs;\n}\n\n// Priority: explicit agentConfig.skills > stack-based skills\nexport async function getAgentSkills(\n agentName: AgentName,\n agentConfig: CompileAgentConfig,\n stack?: Stack,\n displayNameToId?: Partial<Record<SkillDisplayName, SkillId>>,\n): Promise<SkillReference[]> {\n // Priority 1: Explicit skills in compile config\n if (agentConfig.skills && agentConfig.skills.length > 0) {\n return agentConfig.skills;\n }\n\n // Priority 2: Stack-based skills (Phase 7)\n if (stack && displayNameToId) {\n const stackSkills = resolveAgentSkillsFromStack(agentName, stack, displayNameToId);\n if (stackSkills.length > 0) {\n verbose(`Resolved ${stackSkills.length} skills from stack for ${agentName}`);\n return stackSkills;\n }\n }\n\n // No skills defined for this agent\n return [];\n}\n\nexport async function resolveAgents(\n agents: Record<AgentName, AgentDefinition>,\n skills: Record<SkillId, SkillDefinition>,\n compileConfig: CompileConfig,\n _projectRoot: string,\n stack?: Stack,\n displayNameToId?: Partial<Record<SkillDisplayName, SkillId>>,\n): Promise<Record<AgentName, AgentConfig>> {\n const resolved: Record<AgentName, AgentConfig> = {} as Record<AgentName, AgentConfig>;\n const agentNames = typedKeys<AgentName>(compileConfig.agents);\n\n for (const agentName of agentNames) {\n const definition = agents[agentName];\n if (!definition) {\n const availableAgents = typedKeys<AgentName>(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(agentName, agentConfig, stack, displayNameToId);\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 sourceRoot: definition.sourceRoot,\n agentBaseDir: definition.agentBaseDir,\n };\n }\n\n return resolved;\n}\n\nexport function stackToCompileConfig(stackId: string, stack: ProjectConfig): CompileConfig {\n const agents: Record<AgentName, CompileAgentConfig> = {} as Record<AgentName, 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 stack: stackId,\n agents,\n };\n}\n","import { parse as parseYaml } from \"yaml\";\n\n// Extract and parse YAML frontmatter from a markdown string.\n// Returns the parsed YAML object, or null if no valid frontmatter found.\nexport function 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","import { spawn } from \"child_process\";\nimport { warn } from \"./logger\";\n\nexport type ExecResult = {\n stdout: string;\n stderr: string;\n exitCode: number;\n};\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\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\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\nexport type MarketplaceInfo = {\n name: string;\n source: string;\n repo?: string;\n path?: string;\n};\n\nexport async function claudePluginMarketplaceList(): Promise<MarketplaceInfo[]> {\n try {\n const result = await execCommand(\"claude\", [\"plugin\", \"marketplace\", \"list\", \"--json\"], {});\n\n if (result.exitCode !== 0) {\n return [];\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(result.stdout);\n } catch {\n warn(\"Failed to parse marketplace list output as JSON\");\n return [];\n }\n\n if (!Array.isArray(parsed)) {\n warn(\"Unexpected marketplace list format — expected an array\");\n return [];\n }\n\n return parsed as MarketplaceInfo[];\n } catch {\n return [];\n }\n}\n\nexport async function claudePluginMarketplaceExists(name: string): Promise<boolean> {\n const marketplaces = await claudePluginMarketplaceList();\n return marketplaces.some((m) => m.name === name);\n}\n\nexport async function claudePluginMarketplaceAdd(githubRepo: string, name: string): Promise<void> {\n const args = [\"plugin\", \"marketplace\", \"add\", githubRepo, \"--name\", name];\n let result;\n try {\n result = await execCommand(\"claude\", args, {});\n } catch (err) {\n throw new Error(\n `Failed to add marketplace: ${err instanceof Error ? err.message : \"Unknown error\"}`,\n );\n }\n\n if (result.exitCode !== 0) {\n const errorMessage = result.stderr || result.stdout || \"Unknown error\";\n if (errorMessage.includes(\"already installed\")) {\n return;\n }\n throw new Error(`Failed to add marketplace: ${errorMessage.trim()}`);\n }\n}\n\nexport async function claudePluginUninstall(\n pluginName: string,\n scope: \"project\" | \"user\",\n projectDir: string,\n): Promise<void> {\n const args = [\"plugin\", \"uninstall\", pluginName, \"--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 // Ignore \"not installed\" errors - plugin may already be removed\n if (errorMessage.includes(\"not installed\") || errorMessage.includes(\"not found\")) {\n return;\n }\n throw new Error(`Plugin uninstall failed: ${errorMessage.trim()}`);\n }\n}\n","import path from \"path\";\nimport { readFile, writeFile } from \"../../utils/fs\";\nimport { PLUGIN_MANIFEST_DIR, PLUGIN_MANIFEST_FILE, DEFAULT_VERSION } from \"../../consts\";\nimport { pluginManifestSchema } from \"../schemas\";\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(pluginDir: string, type: VersionBumpType): Promise<string> {\n const manifestPath = path.join(pluginDir, PLUGIN_MANIFEST_DIR, PLUGIN_MANIFEST_FILE);\n const content = await readFile(manifestPath);\n const manifest = pluginManifestSchema.parse(JSON.parse(content));\n\n const [major, minor, patch] = parseVersion(manifest.version || DEFAULT_VERSION);\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(pluginDir, PLUGIN_MANIFEST_DIR, PLUGIN_MANIFEST_FILE);\n const content = await readFile(manifestPath);\n const manifest = pluginManifestSchema.parse(JSON.parse(content));\n return manifest.version || DEFAULT_VERSION;\n}\n","import { z } from \"zod\";\nimport path from \"path\";\nimport fg from \"fast-glob\";\nimport { fileExists, readFile, directoryExists, listDirectories } from \"../../utils/fs\";\nimport type { ValidationResult } from \"../../types\";\nimport { countBy } from \"remeda\";\nimport { extractFrontmatter } from \"../../utils/frontmatter\";\nimport {\n pluginAuthorSchema,\n hooksRecordSchema,\n skillFrontmatterValidationSchema,\n agentFrontmatterValidationSchema,\n} from \"../schemas\";\n\nconst PLUGIN_DIR = \".claude-plugin\";\nconst PLUGIN_MANIFEST = \"plugin.json\";\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\n// Strict schema that rejects unrecognized keys (loader schema in schemas.ts uses .passthrough())\nconst pluginManifestValidationSchema = z\n .object({\n name: z.string(),\n version: z.string().optional(),\n description: z.string().optional(),\n author: pluginAuthorSchema.optional(),\n keywords: z.array(z.string()).optional(),\n commands: z.union([z.string(), z.array(z.string())]).optional(),\n agents: z.union([z.string(), z.array(z.string())]).optional(),\n skills: z.union([z.string(), z.array(z.string())]).optional(),\n hooks: z.union([z.string(), hooksRecordSchema]).optional(),\n })\n .strict();\n\nfunction formatZodErrors(error: z.ZodError): string[] {\n return error.issues.map((issue) => {\n const path = issue.path.join(\".\");\n if (issue.code === \"unrecognized_keys\") {\n return `Unrecognized key: \"${issue.keys.join('\", \"')}\"`;\n }\n return path ? `${path}: ${issue.message}` : issue.message;\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(pluginPath: string): 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(manifestPath: string): 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 result = pluginManifestValidationSchema.safeParse(manifest);\n\n if (!result.success) {\n errors.push(...formatZodErrors(result.error));\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 errors.push(\n `version \"${manifest.version}\" is not valid semver (expected: major.minor.patch)`,\n );\n }\n }\n\n if (!manifest.description) {\n warnings.push(\"Missing description field (recommended for discoverability)\");\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(skillPath: string): 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 result = skillFrontmatterValidationSchema.safeParse(frontmatter);\n\n if (!result.success) {\n errors.push(...formatZodErrors(result.error));\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings,\n };\n}\n\nexport async function validateAgentFrontmatter(agentPath: string): 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 result = agentFrontmatterValidationSchema.safeParse(frontmatter);\n\n if (!result.success) {\n errors.push(...formatZodErrors(result.error));\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(pluginPath: string): 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(...skillResult.errors.map((e) => `${relativePath}: ${e}`));\n }\n warnings.push(...skillResult.warnings.map((w) => `${relativePath}: ${w}`));\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(`Agents directory exists but contains no .md files: ${manifest.agents}`);\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(...agentResult.errors.map((e) => `${relativePath}: ${e}`));\n }\n warnings.push(...agentResult.warnings.map((w) => `${relativePath}: ${w}`));\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: countBy(results, (r) => String(r.result.valid))[\"true\"] ?? 0,\n invalid: countBy(results, (r) => String(r.result.valid))[\"false\"] ?? 0,\n withWarnings: countBy(results, (r) => String(r.result.warnings.length > 0))[\"true\"] ?? 0,\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 path from \"path\";\nimport { fileURLToPath } from \"url\";\nimport { parse as parseYaml } from \"yaml\";\nimport { readFile, fileExists } from \"../../utils/fs\";\nimport { verbose, warn } from \"../../utils/logger\";\nimport { defaultMappingsSchema } from \"../schemas\";\n\nexport type DefaultMappings = {\n skill_to_agents: Record<string, string[]>;\n preloaded_skills: Record<string, string[]>;\n subcategory_aliases: Record<string, string>;\n};\n\n// Cached defaults (loaded once per process)\nlet cachedDefaults: DefaultMappings | null = null;\n\nfunction getDefaultsPath(): string {\n const currentDir = path.dirname(fileURLToPath(import.meta.url));\n\n // Navigate from lib/loading/ to defaults/\n return path.join(currentDir, \"../..\", \"defaults\", \"agent-mappings.yaml\");\n}\n\nexport async function loadDefaultMappings(): Promise<DefaultMappings | null> {\n if (cachedDefaults !== null) {\n return cachedDefaults;\n }\n\n const defaultsPath = getDefaultsPath();\n\n if (!(await fileExists(defaultsPath))) {\n verbose(`Default mappings file not found at ${defaultsPath}`);\n return null;\n }\n\n try {\n const content = await readFile(defaultsPath);\n const parsed = parseYaml(content);\n const result = defaultMappingsSchema.safeParse(parsed);\n\n if (!result.success) {\n warn(`Invalid default mappings at ${defaultsPath}: ${result.error.message}`);\n return null;\n }\n\n verbose(`Loaded default mappings from ${defaultsPath}`);\n cachedDefaults = result.data;\n return cachedDefaults;\n } catch (error) {\n verbose(`Failed to parse default mappings: ${error}`);\n return null;\n }\n}\n\n// Returns null if loadDefaultMappings() hasn't been called yet\nexport function getCachedDefaults(): DefaultMappings | null {\n return cachedDefaults;\n}\n\nexport function clearDefaultsCache(): void {\n cachedDefaults = null;\n}\n","import path from \"path\";\nimport { parse as parseYaml } from \"yaml\";\nimport { readFile, writeFile, ensureDir, glob, fileExists, copy } from \"../../utils/fs\";\nimport { verbose, warn } from \"../../utils/logger\";\nimport {\n generateSkillPluginManifest,\n writePluginManifest,\n getPluginManifestPath,\n} from \"../plugins\";\nimport { parseFrontmatter } from \"../loading\";\nimport { hashSkillFolder, determinePluginVersion, writeContentHash } from \"../versioning\";\nimport type { PluginManifest, SkillFrontmatter, SkillMetadataConfig } from \"../../types\";\nimport { skillMetadataConfigSchema } from \"../schemas\";\n\nexport type SkillPluginOptions = {\n skillPath: string;\n outputDir: string;\n skillName?: string;\n};\n\nexport type CompiledSkillPlugin = {\n pluginPath: string;\n manifest: PluginManifest;\n skillName: string;\n};\n\nconst SKILL_FILES = [\"SKILL.md\", \"reference.md\"] as const;\n\nconst SKILL_DIRS = [\"examples\", \"scripts\"] as const;\n\nfunction sanitizeSkillName(name: string): string {\n return name.replace(/\\+/g, \"-\");\n}\n\nasync function readSkillMetadata(skillPath: string): 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 const result = skillMetadataConfigSchema.safeParse(parseYaml(yamlContent));\n if (!result.success) {\n warn(\n `Invalid metadata.yaml at ${skillPath}: ${result.error.issues.map((i) => `${i.path.join(\".\")}: ${i.message}`).join(\"; \")}`,\n );\n return null;\n }\n return result.data;\n } catch (error) {\n warn(`Failed to read metadata.yaml at ${skillPath}: ${error}`);\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\": [\"${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 // Use directory basename for initial error messages before frontmatter is parsed\n const dirBasename = path.basename(skillPath);\n\n const skillMdPath = path.join(skillPath, \"SKILL.md\");\n if (!(await fileExists(skillMdPath))) {\n throw new Error(\n `Skill '${dirBasename}' is missing required SKILL.md file. Expected at: ${skillMdPath}`,\n );\n }\n\n const skillMdContent = await readFile(skillMdPath);\n const frontmatter = parseFrontmatter(skillMdContent, skillMdPath);\n\n if (!frontmatter) {\n throw new Error(\n `Skill '${dirBasename}' has invalid or missing YAML frontmatter in SKILL.md. ` +\n `Required fields: 'name' and 'description'. File: ${skillMdPath}`,\n );\n }\n\n // Use frontmatter.name as the canonical skill name (source of truth)\n // Override name takes precedence if explicitly provided\n const skillName = overrideName ?? sanitizeSkillName(frontmatter.name);\n\n verbose(`Compiling skill plugin: ${skillName} from ${skillPath}`);\n\n const metadata = await readSkillMetadata(skillPath);\n\n const pluginDir = path.join(outputDir, skillName);\n const skillsDir = path.join(pluginDir, \"skills\", skillName);\n\n await ensureDir(pluginDir);\n await ensureDir(skillsDir);\n\n const newHash = await hashSkillFolder(skillPath);\n const { version, contentHash } = await determinePluginVersion(\n newHash,\n pluginDir,\n getPluginManifestPath,\n );\n\n const manifest = generateSkillPluginManifest({\n skillName,\n description: frontmatter.description,\n author: metadata?.author,\n version,\n keywords: metadata?.tags,\n });\n\n await writePluginManifest(pluginDir, manifest);\n\n await writeContentHash(pluginDir, contentHash, getPluginManifestPath);\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 for (const skillMdFile of skillMdFiles) {\n const skillPath = path.join(skillsDir, path.dirname(skillMdFile));\n\n try {\n // compileSkillPlugin uses frontmatter.name as the canonical skill name\n const result = await compileSkillPlugin({\n skillPath,\n outputDir,\n });\n results.push(result);\n console.log(` [OK] ${result.skillName}`);\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n const dirBasename = path.basename(skillPath);\n console.warn(` [WARN] Failed to compile skill from ${dirBasename}: ${errorMessage}`);\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(` - ${result.skillName} (v${result.manifest.version})`);\n }\n}\n","import { parse as parseYaml } from \"yaml\";\nimport path from \"path\";\nimport { directoryExists, listDirectories, fileExists, readFile } from \"../../utils/fs\";\nimport { verbose, warn } from \"../../utils/logger\";\nimport { LOCAL_SKILLS_PATH } from \"../../consts\";\nimport { parseFrontmatter } from \"../loading\";\nimport type { CategoryPath, ExtractedSkillMetadata, SkillId } from \"../../types\";\nimport { localRawMetadataSchema } from \"../schemas\";\n\nconst LOCAL_CATEGORY: CategoryPath = \"local\";\nconst LOCAL_AUTHOR = \"@local\";\n\ntype LocalRawMetadata = {\n cli_name: string;\n cli_description?: string;\n /** Original skill category from source (e.g., \"framework\", \"styling\", \"api\") */\n category?: CategoryPath;\n category_exclusive?: boolean;\n usage_guidance?: string;\n tags?: string[];\n compatible_with?: SkillId[];\n conflicts_with?: SkillId[];\n requires?: SkillId[];\n requires_setup?: SkillId[];\n provides_setup_for?: SkillId[];\n};\n\nexport type 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 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 parsed = localRawMetadataSchema.safeParse(parseYaml(metadataContent));\n\n if (!parsed.success) {\n warn(\n `Skipping local skill '${skillDirName}': Invalid metadata.yaml — ${parsed.error.issues.map((i) => `${i.path.join(\".\")}: ${i.message}`).join(\"; \")}`,\n );\n return null;\n }\n\n const metadata = parsed.data as LocalRawMetadata;\n\n if (!metadata.cli_name) {\n warn(`Skipping local skill '${skillDirName}': Missing required 'cli_name' in metadata.yaml`);\n return null;\n }\n\n const skillMdContent = await readFile(skillMdPath);\n const frontmatter = parseFrontmatter(skillMdContent, skillMdPath);\n\n if (!frontmatter) {\n warn(`Skipping local skill '${skillDirName}': Invalid SKILL.md frontmatter`);\n return null;\n }\n\n const relativePath = `${LOCAL_SKILLS_PATH}/${skillDirName}/`;\n const skillId = frontmatter.name;\n\n // Use category from metadata.yaml if available (preserved from source skill),\n // otherwise fall back to generic \"local\" category\n const category = metadata.category || LOCAL_CATEGORY;\n\n if (!metadata.category) {\n warn(\n `Local skill '${skillDirName}' has no category in metadata.yaml — defaulting to '${LOCAL_CATEGORY}' (will not appear in wizard domain views)`,\n );\n }\n\n const extracted: ExtractedSkillMetadata = {\n id: skillId,\n directoryPath: skillDirName,\n description: metadata.cli_description || frontmatter.description,\n usageGuidance: metadata.usage_guidance,\n category,\n categoryExclusive: metadata.category_exclusive ?? false,\n author: LOCAL_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: 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 { copy, directoryExists, ensureDir, remove } from \"../../utils/fs\";\nimport { verbose, warn } from \"../../utils/logger\";\nimport { LOCAL_SKILLS_PATH, ARCHIVED_SKILLS_DIR_NAME } from \"../../consts\";\nimport type { SkillId } from \"../../types\";\n\n/**\n * Archive a local skill to .claude/skills/_archived/{skill-id}/\n * Preserves user's work before switching to a different source.\n */\nexport async function archiveLocalSkill(projectDir: string, skillId: SkillId): Promise<void> {\n const skillPath = path.join(projectDir, LOCAL_SKILLS_PATH, skillId);\n const archivedDir = path.join(projectDir, LOCAL_SKILLS_PATH, ARCHIVED_SKILLS_DIR_NAME);\n const archivedSkillPath = path.join(archivedDir, skillId);\n\n if (!(await directoryExists(skillPath))) {\n warn(`Skill directory not found for archiving: ${skillPath}`);\n return;\n }\n\n await ensureDir(archivedDir);\n await copy(skillPath, archivedSkillPath);\n await remove(skillPath);\n\n verbose(`Archived local skill '${skillId}' to ${ARCHIVED_SKILLS_DIR_NAME}/`);\n}\n\n/**\n * Restore a previously archived skill from .claude/skills/_archived/{skill-id}/\n * Returns true if found and restored, false if no archive exists.\n */\nexport async function restoreArchivedSkill(projectDir: string, skillId: SkillId): Promise<boolean> {\n const skillPath = path.join(projectDir, LOCAL_SKILLS_PATH, skillId);\n const archivedSkillPath = path.join(\n projectDir,\n LOCAL_SKILLS_PATH,\n ARCHIVED_SKILLS_DIR_NAME,\n skillId,\n );\n\n if (!(await directoryExists(archivedSkillPath))) {\n return false;\n }\n\n await copy(archivedSkillPath, skillPath);\n await remove(archivedSkillPath);\n\n verbose(`Restored archived skill '${skillId}' from ${ARCHIVED_SKILLS_DIR_NAME}/`);\n return true;\n}\n\n/**\n * Check if an archived version of a skill exists.\n */\nexport async function hasArchivedSkill(projectDir: string, skillId: SkillId): Promise<boolean> {\n const archivedSkillPath = path.join(\n projectDir,\n LOCAL_SKILLS_PATH,\n ARCHIVED_SKILLS_DIR_NAME,\n skillId,\n );\n\n return directoryExists(archivedSkillPath);\n}\n","import { difference } from \"remeda\";\nimport type { ProjectConfig } from \"../../types\";\nimport { loadProjectConfig } from \"./project-config\";\nimport { loadProjectSourceConfig } from \"./config\";\n\nexport type MergeContext = {\n projectDir: string;\n};\n\nexport type MergeResult = {\n config: ProjectConfig;\n merged: boolean;\n existingConfigPath?: string;\n};\n\n// Existing values take precedence for identity fields; arrays are unioned; stack is deep-merged\nexport async function mergeWithExistingConfig(\n newConfig: ProjectConfig,\n context: MergeContext,\n): Promise<MergeResult> {\n // Clone to avoid mutating the input\n const localConfig = { ...newConfig };\n\n const existingFullConfig = await loadProjectConfig(context.projectDir);\n if (existingFullConfig) {\n const existingConfig = existingFullConfig.config;\n\n // Keep existing name if present\n if (existingConfig.name) {\n localConfig.name = existingConfig.name;\n }\n\n // Keep existing description if present\n if (existingConfig.description) {\n localConfig.description = existingConfig.description;\n }\n\n // Keep existing source if present (don't overwrite user's source)\n if (existingConfig.source) {\n localConfig.source = existingConfig.source;\n }\n\n // Merge agents arrays (union of existing + new)\n if (existingConfig.agents && existingConfig.agents.length > 0) {\n const newAgentIds = difference(localConfig.agents, existingConfig.agents);\n localConfig.agents = [...existingConfig.agents, ...newAgentIds];\n }\n\n // Deep merge stack (existing agent configs take precedence)\n if (existingConfig.stack) {\n const mergedStack = { ...localConfig.stack };\n for (const [agentId, agentConfig] of Object.entries(existingConfig.stack)) {\n mergedStack[agentId] = { ...mergedStack[agentId], ...agentConfig };\n }\n localConfig.stack = mergedStack;\n }\n\n // Keep existing author if present\n if (existingConfig.author) {\n localConfig.author = existingConfig.author;\n }\n\n // Keep existing agents_source if present\n if (existingConfig.agents_source) {\n localConfig.agents_source = existingConfig.agents_source;\n }\n\n // Keep existing marketplace if present\n if (existingConfig.marketplace) {\n localConfig.marketplace = existingConfig.marketplace;\n }\n\n return {\n config: localConfig,\n merged: true,\n existingConfigPath: existingFullConfig.configPath,\n };\n }\n\n // No existing full config, try simple project source config for author/agents_source\n const existingProjectConfig = await loadProjectSourceConfig(context.projectDir);\n if (existingProjectConfig?.author) {\n localConfig.author = existingProjectConfig.author;\n }\n if (existingProjectConfig?.agents_source) {\n localConfig.agents_source = existingProjectConfig.agents_source;\n }\n\n return { config: localConfig, merged: false };\n}\n","import path from \"path\";\nimport { parse as parseYaml } from \"yaml\";\nimport { readFile, fileExists } from \"../../utils/fs\";\nimport { verbose, warn } from \"../../utils/logger\";\nimport { CLAUDE_DIR, CLAUDE_SRC_DIR } from \"../../consts\";\nimport type { ProjectConfig, ValidationResult } from \"../../types\";\nimport { projectConfigLoaderSchema } from \"../schemas\";\n\nconst CONFIG_PATH = `${CLAUDE_SRC_DIR}/config.yaml`;\nconst LEGACY_CONFIG_PATH = `${CLAUDE_DIR}/config.yaml`;\n\nexport type LoadedProjectConfig = {\n config: ProjectConfig;\n configPath: string;\n};\n\nexport async function loadProjectConfig(projectDir: string): Promise<LoadedProjectConfig | null> {\n // Check .claude-src/config.yaml first (new location)\n const srcConfigPath = path.join(projectDir, CONFIG_PATH);\n // Fall back to .claude/config.yaml (legacy location)\n const legacyConfigPath = path.join(projectDir, LEGACY_CONFIG_PATH);\n\n let configPath = srcConfigPath;\n if (!(await fileExists(srcConfigPath))) {\n if (await fileExists(legacyConfigPath)) {\n configPath = legacyConfigPath;\n verbose(`Using legacy config location: ${legacyConfigPath}`);\n } else {\n verbose(`Project config not found at ${srcConfigPath} or ${legacyConfigPath}`);\n return null;\n }\n }\n\n try {\n const content = await readFile(configPath);\n const parsed = parseYaml(content);\n\n if (!parsed || typeof parsed !== \"object\") {\n warn(`Invalid project config structure at ${configPath}`);\n return null;\n }\n\n const result = projectConfigLoaderSchema.safeParse(parsed);\n if (!result.success) {\n warn(`Invalid project config at ${configPath}: ${result.error.message}`);\n return null;\n }\n\n const config = result.data as ProjectConfig;\n if (!config.name) {\n warn(\n `Project config at ${configPath} is missing required 'name' field — defaulting to directory name`,\n );\n config.name = path.basename(projectDir);\n }\n if (!config.skills) {\n warn(`Project config at ${configPath} is missing 'skills' array — defaulting to empty`);\n config.skills = [];\n }\n\n verbose(`Loaded project config from ${configPath}`);\n return {\n config,\n configPath,\n };\n } catch (error) {\n warn(`Failed to parse project config at ${configPath}: ${error}`);\n return null;\n }\n}\n\nexport function validateProjectConfig(config: unknown): ValidationResult {\n const errors: string[] = [];\n const warnings: string[] = [];\n\n if (!config || typeof config !== \"object\") {\n return { valid: false, errors: [\"Config must be an object\"], warnings: [] };\n }\n\n const c = config as Record<string, unknown>;\n\n // Required: name\n if (!c.name || typeof c.name !== \"string\") {\n errors.push(\"name is required and must be a string\");\n }\n\n // Required: agents (for compilation)\n if (!c.agents || !Array.isArray(c.agents)) {\n errors.push(\"agents is required and must be an array\");\n } else {\n for (const agent of c.agents) {\n if (typeof agent !== \"string\") {\n errors.push(`agents must contain strings, found: ${typeof agent}`);\n }\n }\n }\n\n // Optional: version\n if (c.version !== undefined && c.version !== \"1\") {\n errors.push('version must be \"1\" (or omitted for default)');\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings,\n };\n}\n","import path from \"path\";\nimport { parse as parseYaml, stringify as stringifyYaml } from \"yaml\";\nimport { fileExists, readFile, writeFile, ensureDir } from \"../../utils/fs\";\nimport { warn } from \"../../utils/logger\";\nimport { CLAUDE_SRC_DIR } from \"../../consts\";\nimport { projectSourceConfigSchema } from \"../schemas\";\n\nconst YAML_INDENT = 2;\n\nexport async function saveSourceToProjectConfig(projectDir: string, source: string): Promise<void> {\n const configPath = path.join(projectDir, CLAUDE_SRC_DIR, \"config.yaml\");\n\n let config: Record<string, unknown> = {};\n if (await fileExists(configPath)) {\n const content = await readFile(configPath);\n try {\n const parsed = parseYaml(content);\n const result = projectSourceConfigSchema.safeParse(parsed);\n config = result.success ? (result.data as Record<string, unknown>) : {};\n if (!result.success) {\n warn(\n `Invalid config at ${configPath}: ${result.error.issues.map((i) => i.message).join(\", \")}. Starting with empty config.`,\n );\n }\n } catch (error) {\n warn(\n `Failed to parse existing config at ${configPath}: ${error instanceof Error ? error.message : String(error)}. Starting with empty config.`,\n );\n }\n }\n\n config.source = source;\n\n await ensureDir(path.join(projectDir, CLAUDE_SRC_DIR));\n const configYaml = stringifyYaml(config, { indent: YAML_INDENT });\n await writeFile(configPath, configYaml);\n}\n"],"mappings":"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","names":["path","path","parseYaml","stringifyYaml","path","stringifyYaml","parseYaml","path","path","parseYaml","stringifyYaml","path","path","path","parseYaml","path","parseYaml","path","path","parseYaml","path","parseYaml","path","selectedSkill","path","path","PLUGIN_MANIFEST_FILE","path","path","path","path","path","skillId","path","path","path","stringifyYaml","parseYaml","path","path","parseYaml","path","path","path","parseYaml","path","unique","path","unique","path","path","stringifyYaml","path","path","z","path","countBy","z","path","countBy","verbose","path","path","parseYaml","path","parseYaml","path","parseYaml","parseYaml","path","path","parseYaml","path","path","path","parseYaml","path","parseYaml","path","parseYaml","stringifyYaml","YAML_INDENT","path","parseYaml","stringifyYaml","path"]}
1
+ {"version":3,"sources":["../src/cli/lib/configuration/source-manager.ts","../src/cli/lib/configuration/config.ts","../src/cli/lib/loading/source-fetcher.ts","../src/cli/lib/configuration/index.ts","../src/cli/lib/configuration/config-generator.ts","../src/cli/lib/skills/index.ts","../src/cli/lib/skills/skill-metadata.ts","../src/cli/lib/versioning.ts","../src/cli/lib/skills/skill-copier.ts","../src/cli/lib/skills/skill-agent-mappings.ts","../src/cli/lib/loading/index.ts","../src/cli/lib/loading/loader.ts","../src/cli/lib/loading/source-loader.ts","../src/cli/lib/matrix/index.ts","../src/cli/lib/matrix/matrix-loader.ts","../src/cli/lib/matrix/matrix-resolver.ts","../src/cli/lib/matrix/matrix-health-check.ts","../src/cli/lib/loading/multi-source-loader.ts","../src/cli/lib/plugins/index.ts","../src/cli/lib/plugins/plugin-manifest.ts","../src/cli/lib/plugins/plugin-manifest-finder.ts","../src/cli/lib/plugins/plugin-finder.ts","../src/cli/lib/plugins/plugin-info.ts","../src/cli/lib/installation/index.ts","../src/cli/lib/installation/installation.ts","../src/cli/lib/installation/local-installer.ts","../src/cli/lib/stacks/index.ts","../src/cli/lib/stacks/stacks-loader.ts","../src/cli/lib/stacks/stack-installer.ts","../src/cli/lib/stacks/stack-plugin-compiler.ts","../src/cli/lib/compiler.ts","../src/cli/lib/resolver.ts","../src/cli/utils/frontmatter.ts","../src/cli/utils/exec.ts","../src/cli/lib/plugins/plugin-version.ts","../src/cli/lib/plugins/plugin-validator.ts","../src/cli/lib/loading/defaults-loader.ts","../src/cli/lib/skills/skill-plugin-compiler.ts","../src/cli/lib/skills/local-skill-loader.ts","../src/cli/lib/skills/source-switcher.ts","../src/cli/lib/configuration/config-merger.ts","../src/cli/lib/configuration/project-config.ts","../src/cli/lib/configuration/config-saver.ts"],"sourcesContent":["import type { SourceEntry } from \"./config\";\nimport { loadProjectSourceConfig, saveProjectConfig, DEFAULT_SOURCE } from \"./config\";\nimport { fetchMarketplace } from \"../loading/source-fetcher\";\nimport { discoverLocalSkills } from \"../skills/local-skill-loader\";\nimport {\n getPluginSkillIds,\n getCollectivePluginDir,\n getPluginSkillsDir,\n} from \"../plugins/plugin-finder\";\nimport { verbose } from \"../../utils/logger\";\nimport type { MergedSkillsMatrix } from \"../../types\";\n\nconst DEFAULT_SOURCE_NAME = \"public\";\n\nexport type SourceSummary = {\n sources: Array<SourceEntry & { enabled: boolean }>;\n localSkillCount: number;\n pluginSkillCount: number;\n};\n\n/**\n * Add a new source to the project configuration.\n * Validates the URL by fetching the marketplace.\n */\nexport async function addSource(\n projectDir: string,\n url: string,\n): Promise<{ name: string; skillCount: number }> {\n const result = await fetchMarketplace(url, { forceRefresh: true });\n const name = result.marketplace.name;\n const skillCount = result.marketplace.plugins.length;\n\n const config = (await loadProjectSourceConfig(projectDir)) ?? {};\n const sources = config.sources ?? [];\n\n // Check for duplicate names\n const exists = sources.some((s) => s.name === name);\n if (exists) {\n throw new Error(`Source \"${name}\" already exists`);\n }\n\n sources.push({ name, url });\n config.sources = sources;\n await saveProjectConfig(projectDir, config);\n\n verbose(`Added source \"${name}\" with ${skillCount} skills`);\n return { name, skillCount };\n}\n\n/**\n * Remove a source by name. Cannot remove \"public\" (the default).\n */\nexport async function removeSource(projectDir: string, name: string): Promise<void> {\n if (name === DEFAULT_SOURCE_NAME) {\n throw new Error(`Cannot remove the \"${DEFAULT_SOURCE_NAME}\" source`);\n }\n\n const config = (await loadProjectSourceConfig(projectDir)) ?? {};\n const sources = config.sources ?? [];\n\n const filtered = sources.filter((s) => s.name !== name);\n if (filtered.length === sources.length) {\n throw new Error(`Source \"${name}\" not found`);\n }\n\n config.sources = filtered;\n await saveProjectConfig(projectDir, config);\n\n verbose(`Removed source \"${name}\"`);\n}\n\n/**\n * Get summary of all configured sources and local/plugin counts.\n */\nexport async function getSourceSummary(\n projectDir: string,\n matrix?: MergedSkillsMatrix,\n): Promise<SourceSummary> {\n const config = (await loadProjectSourceConfig(projectDir)) ?? {};\n\n // Build sources list, always including the default \"public\" source\n const sources: Array<SourceEntry & { enabled: boolean }> = [\n {\n name: DEFAULT_SOURCE_NAME,\n url: config.source ?? DEFAULT_SOURCE,\n enabled: true,\n },\n ];\n\n if (config.sources) {\n for (const source of config.sources) {\n sources.push({ ...source, enabled: true });\n }\n }\n\n // Count local skills\n let localSkillCount = 0;\n try {\n const localResult = await discoverLocalSkills(projectDir);\n if (localResult) {\n localSkillCount = localResult.skills.length;\n }\n } catch {\n verbose(\"Failed to discover local skills for source summary\");\n }\n\n // Count plugin skills\n let pluginSkillCount = 0;\n if (matrix) {\n try {\n const pluginDir = getCollectivePluginDir(projectDir);\n const pluginSkillsDir = getPluginSkillsDir(pluginDir);\n const skillIds = await getPluginSkillIds(pluginSkillsDir, matrix);\n pluginSkillCount = skillIds.length;\n } catch {\n verbose(\"Failed to count plugin skills for source summary\");\n }\n }\n\n return { sources, localSkillCount, pluginSkillCount };\n}\n","import path from \"path\";\nimport { parse as parseYaml, stringify as stringifyYaml } from \"yaml\";\nimport { readFile, writeFile, fileExists, ensureDir } from \"../../utils/fs\";\nimport { verbose, warn } from \"../../utils/logger\";\nimport { CLAUDE_DIR, CLAUDE_SRC_DIR } from \"../../consts\";\nimport { projectSourceConfigSchema } from \"../schemas\";\nimport type { BoundSkill } from \"../../types\";\n\nexport const DEFAULT_SOURCE = \"github:claude-collective/skills\";\nexport const SOURCE_ENV_VAR = \"CC_SOURCE\";\nexport const PROJECT_CONFIG_FILE = \"config.yaml\";\n\nexport type SourceEntry = {\n name: string;\n url: string;\n description?: string;\n ref?: string;\n};\n\nexport type ProjectSourceConfig = {\n source?: string;\n author?: string;\n marketplace?: string;\n agents_source?: string;\n sources?: SourceEntry[];\n boundSkills?: BoundSkill[];\n};\n\nexport type ResolvedConfig = {\n source: string;\n sourceOrigin: \"flag\" | \"env\" | \"project\" | \"default\";\n marketplace?: string;\n};\n\nexport function getProjectConfigPath(projectDir: string): string {\n return path.join(projectDir, CLAUDE_SRC_DIR, PROJECT_CONFIG_FILE);\n}\n\nexport async function loadProjectSourceConfig(\n projectDir: string,\n): Promise<ProjectSourceConfig | null> {\n // Check .claude-src/config.yaml first (new location)\n const srcConfigPath = getProjectConfigPath(projectDir);\n // Fall back to .claude/config.yaml (legacy location)\n const legacyConfigPath = path.join(projectDir, CLAUDE_DIR, \"config.yaml\");\n\n let configPath = srcConfigPath;\n if (!(await fileExists(srcConfigPath))) {\n if (await fileExists(legacyConfigPath)) {\n configPath = legacyConfigPath;\n verbose(`Using legacy config location: ${legacyConfigPath}`);\n } else {\n verbose(`Project config not found at ${srcConfigPath} or ${legacyConfigPath}`);\n return null;\n }\n }\n\n try {\n const content = await readFile(configPath);\n const parsed = parseYaml(content);\n const result = projectSourceConfigSchema.safeParse(parsed);\n if (!result.success) {\n warn(`Invalid project config at ${configPath}: ${result.error.message}`);\n return null;\n }\n verbose(`Loaded project config from ${configPath}`);\n return result.data as ProjectSourceConfig;\n } catch (error) {\n warn(`Failed to parse project config at ${configPath}: ${error}`);\n return null;\n }\n}\n\nexport async function saveProjectConfig(\n projectDir: string,\n config: ProjectSourceConfig,\n): Promise<void> {\n const configPath = getProjectConfigPath(projectDir);\n await ensureDir(path.join(projectDir, CLAUDE_SRC_DIR));\n const content = stringifyYaml(config, { lineWidth: 0 });\n await writeFile(configPath, content);\n verbose(`Saved project config to ${configPath}`);\n}\n\n// Precedence: flag > env > project > default\nexport async function resolveSource(\n flagValue?: string,\n projectDir?: string,\n): Promise<ResolvedConfig> {\n const projectConfig = projectDir ? await loadProjectSourceConfig(projectDir) : null;\n const marketplace = projectConfig?.marketplace;\n\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\", marketplace };\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\", marketplace };\n }\n\n if (projectConfig?.source) {\n verbose(`Source from project config: ${projectConfig.source}`);\n return {\n source: projectConfig.source,\n sourceOrigin: \"project\",\n marketplace,\n };\n }\n\n verbose(`Using default source: ${DEFAULT_SOURCE}`);\n return { source: DEFAULT_SOURCE, sourceOrigin: \"default\", marketplace };\n}\n\nexport type AgentsSourceOrigin = \"flag\" | \"project\" | \"default\";\n\nexport type ResolvedAgentsSource = {\n agentsSource?: string;\n agentsSourceOrigin: AgentsSourceOrigin;\n};\n\n// Precedence: flag > project > default (undefined)\nexport async function resolveAgentsSource(\n flagValue?: string,\n projectDir?: string,\n): Promise<ResolvedAgentsSource> {\n if (flagValue !== undefined) {\n if (flagValue === \"\" || flagValue.trim() === \"\") {\n throw new Error(\"--agent-source flag cannot be empty\");\n }\n verbose(`Agents source from --agent-source flag: ${flagValue}`);\n return { agentsSource: flagValue, agentsSourceOrigin: \"flag\" };\n }\n\n const projectConfig = projectDir ? await loadProjectSourceConfig(projectDir) : null;\n if (projectConfig?.agents_source) {\n verbose(`Agents source from project config: ${projectConfig.agents_source}`);\n return {\n agentsSource: projectConfig.agents_source,\n agentsSourceOrigin: \"project\",\n };\n }\n\n verbose(\"Using default agents source (local CLI)\");\n return { agentsSource: undefined, agentsSourceOrigin: \"default\" };\n}\n\nconst PROJECT_ORIGIN_LABEL = \"project config (.claude-src/config.yaml)\";\n\nexport function formatOrigin(\n type: \"source\" | \"agents\",\n origin: ResolvedConfig[\"sourceOrigin\"] | AgentsSourceOrigin,\n): string {\n if (origin === \"project\") return PROJECT_ORIGIN_LABEL;\n\n if (type === \"source\") {\n switch (origin) {\n case \"flag\":\n return \"--source flag\";\n case \"env\":\n return `${SOURCE_ENV_VAR} environment variable`;\n case \"default\":\n return \"default\";\n }\n }\n\n // type === \"agents\"\n switch (origin) {\n case \"flag\":\n return \"--agent-source flag\";\n case \"default\":\n return \"default (local CLI)\";\n }\n\n return origin;\n}\n\nexport async function resolveAuthor(projectDir?: string): Promise<string | undefined> {\n const projectConfig = projectDir ? await loadProjectSourceConfig(projectDir) : null;\n return projectConfig?.author;\n}\n\nexport async function resolveAllSources(\n projectDir?: string,\n): Promise<{ primary: SourceEntry; extras: SourceEntry[] }> {\n const projectConfig = projectDir ? await loadProjectSourceConfig(projectDir) : null;\n\n // Get primary source\n const resolvedConfig = await resolveSource(undefined, projectDir);\n const primary: SourceEntry = {\n name: \"marketplace\",\n url: resolvedConfig.source,\n description: \"Primary skills marketplace\",\n };\n\n // Collect extra sources from project config\n const extras: SourceEntry[] = [];\n const seenNames = new Set<string>();\n\n if (projectConfig?.sources) {\n for (const source of projectConfig.sources) {\n if (!seenNames.has(source.name)) {\n seenNames.add(source.name);\n extras.push(source);\n }\n }\n }\n\n return { primary, extras };\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) => source.startsWith(prefix));\n\n if (!hasRemoteProtocol) {\n if (source.includes(\"..\") || source.includes(\"~\")) {\n throw new Error(`Invalid source path: ${source}. Path traversal patterns are not allowed.`);\n }\n }\n\n return !hasRemoteProtocol;\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 \"../configuration\";\nimport { marketplaceSchema } from \"../schemas\";\nimport type { MarketplaceFetchResult } from \"../../types\";\n\nexport type FetchOptions = {\n forceRefresh?: boolean;\n subdir?: string;\n};\n\nexport type FetchResult = {\n path: string;\n fromCache: boolean;\n source: string;\n};\n\nexport function sanitizeSourceForCache(source: string): string {\n return source.replace(/:/g, \"-\").replace(/[\\/]/g, \"-\").replace(/--+/g, \"-\").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(source: string, subdir?: string): Promise<FetchResult> {\n const fullPath = subdir ? path.join(source, subdir) : source;\n const absolutePath = path.isAbsolute(fullPath) ? fullPath : 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(source: string, options: FetchOptions): 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 // If cache exists and not forcing refresh, use it directly\n if (!forceRefresh && (await directoryExists(cacheDir))) {\n verbose(`Using cached source: ${cacheDir}`);\n return {\n path: cacheDir,\n fromCache: true,\n source: fullSource,\n };\n }\n\n await ensureDir(path.dirname(cacheDir));\n\n try {\n const result = await downloadTemplate(fullSource, {\n dir: cacheDir,\n force: true, // Always force when downloading to avoid \"already exists\" error\n offline: false,\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(result.path, \".claude-plugin\", \"marketplace.json\");\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 parsed = JSON.parse(content);\n const validation = marketplaceSchema.safeParse(parsed);\n\n if (!validation.success) {\n throw new Error(\n `Invalid marketplace.json at: ${marketplacePath}\\n\\n` +\n `Validation errors: ${validation.error.issues.map((i) => `${i.path.join(\".\")}: ${i.message}`).join(\"; \")}`,\n );\n }\n\n const marketplace = validation.data;\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 };\n}\n","export {\n DEFAULT_SOURCE,\n SOURCE_ENV_VAR,\n PROJECT_CONFIG_FILE,\n type SourceEntry,\n type ProjectSourceConfig,\n type ResolvedConfig,\n type AgentsSourceOrigin,\n type ResolvedAgentsSource,\n getProjectConfigPath,\n loadProjectSourceConfig,\n saveProjectConfig,\n resolveSource,\n resolveAgentsSource,\n formatOrigin,\n resolveAuthor,\n resolveAllSources,\n isLocalSource,\n} from \"./config\";\n\nexport {\n type ProjectConfigOptions,\n generateProjectConfigFromSkills,\n buildStackProperty,\n} from \"./config-generator\";\n\nexport { type MergeContext, type MergeResult, mergeWithExistingConfig } from \"./config-merger\";\n\nexport { saveSourceToProjectConfig } from \"./config-saver\";\n\nexport {\n type LoadedProjectConfig,\n loadProjectConfig,\n validateProjectConfig,\n} from \"./project-config\";\n\nexport { type SourceSummary, addSource, removeSource, getSourceSummary } from \"./source-manager\";\n","import type {\n AgentName,\n CategoryPath,\n MergedSkillsMatrix,\n ProjectConfig,\n ResolvedSubcategorySkills,\n SkillDisplayName,\n SkillId,\n Stack,\n StackAgentConfig,\n Subcategory,\n} from \"../../types\";\nimport { typedEntries } from \"../../utils/typed-object\";\nimport { getAgentsForSkill } from \"../skills\";\n\nexport type ProjectConfigOptions = {\n description?: string;\n author?: string;\n};\n\nfunction extractSubcategory(categoryPath: CategoryPath): Subcategory | undefined {\n if (categoryPath === \"local\") return undefined;\n const parts = categoryPath.split(\"/\");\n // Boundary cast: the last segment of a CategoryPath is always a valid Subcategory\n return (parts.length >= 2 ? parts[1] : parts[0]) as Subcategory;\n}\n\nexport function generateProjectConfigFromSkills(\n name: string,\n selectedSkillIds: SkillId[],\n matrix: MergedSkillsMatrix,\n options?: ProjectConfigOptions,\n): ProjectConfig {\n const neededAgents = new Set<AgentName>();\n const stackProperty: Record<string, ResolvedSubcategorySkills> = {};\n\n // Derive agents from skills and build stack property\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 subcategory = extractSubcategory(category);\n\n for (const agentId of agents) {\n neededAgents.add(agentId);\n\n // Build stack: agent -> subcategory -> skillId\n if (subcategory) {\n if (!stackProperty[agentId]) {\n stackProperty[agentId] = {};\n }\n stackProperty[agentId][subcategory] = skillId;\n }\n }\n }\n\n // Build minimal config\n const config: ProjectConfig = {\n name,\n agents: Array.from(neededAgents).sort(),\n skills: [...selectedSkillIds],\n };\n\n // Only include stack if there are any mappings\n if (Object.keys(stackProperty).length > 0) {\n config.stack = stackProperty;\n }\n\n // Add optional fields only if provided\n if (options?.description) {\n config.description = options.description;\n }\n\n if (options?.author) {\n config.author = options.author;\n }\n\n return config;\n}\n\n// Resolves display names in stack.agents to full skill IDs using skill_aliases\nexport function buildStackProperty(\n stack: Stack,\n displayNameToId: Partial<Record<SkillDisplayName, SkillId>>,\n): Partial<Record<AgentName, ResolvedSubcategorySkills>> {\n const result: Partial<Record<AgentName, ResolvedSubcategorySkills>> = {};\n\n for (const [agentId, agentConfig] of typedEntries<AgentName, StackAgentConfig>(stack.agents)) {\n // Skip agents with empty config\n if (!agentConfig || Object.keys(agentConfig).length === 0) {\n continue;\n }\n\n const resolvedMappings: ResolvedSubcategorySkills = {};\n\n for (const [subcategoryId, displayName] of typedEntries<Subcategory, SkillDisplayName>(\n agentConfig,\n )) {\n if (!displayName) continue;\n // Resolve display name to full skill ID using skill_aliases from matrix\n const skillId = displayNameToId[displayName];\n if (skillId) {\n resolvedMappings[subcategoryId] = skillId;\n } else {\n // Boundary cast: display name not found in lookup, assumed to be a full skill ID already\n resolvedMappings[subcategoryId] = displayName as unknown as SkillId;\n }\n }\n\n // Only add agent if it has resolved mappings\n if (Object.keys(resolvedMappings).length > 0) {\n result[agentId] = resolvedMappings;\n }\n }\n\n return result;\n}\n","export { type FetchSkillsOptions, fetchSkills } from \"./skill-fetcher\";\n\nexport {\n type ForkedFromMetadata,\n type LocalSkillMetadata,\n type SkillComparisonResult,\n readForkedFromMetadata,\n getLocalSkillsWithMetadata,\n computeSourceHash,\n compareSkills,\n injectForkedFromMetadata,\n} from \"./skill-metadata\";\n\nexport {\n type CopiedSkill,\n copySkill,\n copySkillFromSource,\n copySkillsToPluginFromSource,\n copySkillsToLocalFlattened,\n} from \"./skill-copier\";\n\nexport { SKILL_TO_AGENTS, getAgentsForSkill } from \"./skill-agent-mappings\";\n\nexport {\n type SkillPluginOptions,\n type CompiledSkillPlugin,\n compileSkillPlugin,\n compileAllSkillPlugins,\n printCompilationSummary,\n} from \"./skill-plugin-compiler\";\n\nexport { type LocalSkillDiscoveryResult, discoverLocalSkills } from \"./local-skill-loader\";\n\nexport { archiveLocalSkill, restoreArchivedSkill, hasArchivedSkill } from \"./source-switcher\";\n","import path from \"path\";\nimport { parse as parseYaml, stringify as stringifyYaml } from \"yaml\";\nimport { sortBy } from \"remeda\";\nimport { fileExists, readFile, writeFile, listDirectories } from \"../../utils/fs\";\nimport { hashFile } from \"../versioning\";\nimport { getCurrentDate } from \"../versioning\";\nimport { LOCAL_SKILLS_PATH } from \"../../consts\";\nimport type { SkillId } from \"../../types\";\nimport { localSkillMetadataSchema } from \"../schemas\";\nimport { warn } from \"../../utils/logger\";\n\nexport type ForkedFromMetadata = {\n skill_id: SkillId;\n content_hash: string;\n date: string;\n};\n\nexport type LocalSkillMetadata = {\n forked_from?: ForkedFromMetadata;\n [key: string]: unknown;\n};\n\nexport type SkillComparisonResult = {\n id: SkillId;\n localHash: string | null;\n sourceHash: string | null;\n status: \"current\" | \"outdated\" | \"local-only\";\n dirName: string;\n sourcePath?: string;\n};\n\nexport async function readForkedFromMetadata(skillDir: string): Promise<ForkedFromMetadata | null> {\n const metadataPath = path.join(skillDir, \"metadata.yaml\");\n\n if (!(await fileExists(metadataPath))) {\n return null;\n }\n\n const content = await readFile(metadataPath);\n const result = localSkillMetadataSchema.safeParse(parseYaml(content));\n\n if (!result.success) {\n warn(\n `Invalid metadata.yaml at ${metadataPath}: ${result.error.issues.map((i) => `${i.path.join(\".\")}: ${i.message}`).join(\"; \")}`,\n );\n return null;\n }\n\n return (result.data as LocalSkillMetadata).forked_from ?? null;\n}\n\nexport async function getLocalSkillsWithMetadata(\n projectDir: string,\n): Promise<Map<string, { dirName: string; forkedFrom: ForkedFromMetadata | null }>> {\n const localSkillsPath = path.join(projectDir, LOCAL_SKILLS_PATH);\n const result = new Map<string, { dirName: string; forkedFrom: ForkedFromMetadata | null }>();\n\n if (!(await fileExists(localSkillsPath))) {\n return result;\n }\n\n const skillDirs = await listDirectories(localSkillsPath);\n\n for (const dirName of skillDirs) {\n const skillDir = path.join(localSkillsPath, dirName);\n const forkedFrom = await readForkedFromMetadata(skillDir);\n\n // Use the skill_id from forked_from if available, otherwise use directory name\n const skillId = forkedFrom?.skill_id ?? dirName;\n\n result.set(skillId, { dirName, forkedFrom });\n }\n\n return result;\n}\n\nexport async function computeSourceHash(\n sourcePath: string,\n skillPath: string,\n): Promise<string | null> {\n const skillMdPath = path.join(sourcePath, \"src\", skillPath, \"SKILL.md\");\n\n if (!(await fileExists(skillMdPath))) {\n return null;\n }\n\n return hashFile(skillMdPath);\n}\n\nexport async function compareSkills(\n projectDir: string,\n sourcePath: string,\n sourceSkills: Record<string, { path: string }>,\n): Promise<SkillComparisonResult[]> {\n const results: SkillComparisonResult[] = [];\n const localSkills = await getLocalSkillsWithMetadata(projectDir);\n\n for (const [skillId, { dirName, forkedFrom }] of localSkills) {\n if (!forkedFrom) {\n // Local-only skill (no forked_from metadata)\n // Boundary cast: skillId comes from Map<string, ...> keys (directory names or forkedFrom.skill_id)\n results.push({\n id: skillId as SkillId,\n localHash: null,\n sourceHash: null,\n status: \"local-only\",\n dirName,\n });\n continue;\n }\n\n const localHash = forkedFrom.content_hash;\n const sourceSkill = sourceSkills[forkedFrom.skill_id];\n\n if (!sourceSkill) {\n // Skill was forked from a source that no longer exists\n results.push({\n id: forkedFrom.skill_id,\n localHash,\n sourceHash: null,\n status: \"local-only\",\n dirName,\n });\n continue;\n }\n\n const sourceHash = await computeSourceHash(sourcePath, sourceSkill.path);\n\n if (sourceHash === null) {\n results.push({\n id: forkedFrom.skill_id,\n localHash,\n sourceHash: null,\n status: \"local-only\",\n dirName,\n });\n continue;\n }\n\n const status = localHash === sourceHash ? \"current\" : \"outdated\";\n\n results.push({\n id: forkedFrom.skill_id,\n localHash,\n sourceHash,\n status,\n dirName,\n sourcePath: sourceSkill.path,\n });\n }\n\n // Sort results by skill ID\n return sortBy(results, (r) => r.id);\n}\n\nexport async function injectForkedFromMetadata(\n destPath: string,\n skillId: SkillId,\n contentHash: string,\n): Promise<void> {\n const metadataPath = path.join(destPath, \"metadata.yaml\");\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 parseResult = localSkillMetadataSchema.safeParse(parseYaml(yamlContent));\n if (!parseResult.success) {\n warn(`Malformed metadata.yaml at ${metadataPath} — existing fields may be lost`);\n }\n const metadata: LocalSkillMetadata = parseResult.success\n ? (parseResult.data as LocalSkillMetadata)\n : { forked_from: undefined };\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","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\";\nimport { DEFAULT_VERSION } from \"../consts\";\nimport { pluginManifestSchema, versionedMetadataSchema } from \"./schemas\";\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\ntype VersionedMetadata = {\n version: number;\n content_hash?: string;\n updated?: string;\n [key: string]: unknown;\n};\n\nexport type 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 let raw: unknown;\n try {\n raw = parseYaml(yamlContent);\n } catch (error) {\n throw new Error(\n `Failed to parse metadata.yaml at ${skillPath}: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n\n const result = versionedMetadataSchema.safeParse(raw);\n\n if (!result.success) {\n throw new Error(\n `Invalid metadata.yaml at ${skillPath}: ${result.error.issues.map((i) => `${i.path.join(\".\")}: ${i.message}`).join(\"; \")}`,\n );\n }\n\n const metadata = result.data 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(skillPath: string): 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(` Version bumped: ${skillPath} (v${previousVersion} -> v${metadata.version})`);\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(skillsDir: string): 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(` Warning: Failed to version skill at ${skillPath}: ${error}`);\n }\n }\n\n return results;\n}\n\n/**\n * Plugin versioning utilities shared by skill, agent, and stack plugin compilers.\n * Reads existing plugin.json + .content-hash, bumps semver major on content change.\n */\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\nexport async function readExistingPluginManifest(\n pluginDir: string,\n getManifestPath: (dir: string) => string,\n): Promise<{ version: string; contentHash: string | undefined } | null> {\n const manifestPath = getManifestPath(pluginDir);\n\n if (!(await fileExists(manifestPath))) {\n return null;\n }\n\n try {\n const content = await readFile(manifestPath);\n const manifest = pluginManifestSchema.parse(JSON.parse(content));\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\nexport async function determinePluginVersion(\n newHash: string,\n pluginDir: string,\n getManifestPath: (dir: string) => string,\n): Promise<{ version: string; contentHash: string }> {\n const existing = await readExistingPluginManifest(pluginDir, getManifestPath);\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 async function writeContentHash(\n pluginDir: string,\n contentHash: string,\n getManifestPath: (dir: string) => string,\n): Promise<void> {\n const hashFilePath = getManifestPath(pluginDir).replace(\"plugin.json\", CONTENT_HASH_FILE);\n await writeFile(hashFilePath, contentHash);\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(` ✓ ${skillName}: v${result.previousVersion} -> v${result.newVersion}`);\n }\n }\n\n console.log(`\\n Summary: ${changed.length} updated, ${unchanged.length} unchanged`);\n}\n","import path from \"path\";\nimport { copy, ensureDir } from \"../../utils/fs\";\nimport { hashFile } from \"../versioning\";\nimport type { MergedSkillsMatrix, ResolvedSkill, SkillId } from \"../../types\";\nimport type { SourceLoadResult } from \"../loading\";\nimport { injectForkedFromMetadata } from \"./skill-metadata\";\n\nexport type CopiedSkill = {\n skillId: SkillId;\n contentHash: string;\n sourcePath: string;\n destPath: string;\n local?: boolean;\n};\n\nfunction getSkillSourcePath(skill: ResolvedSkill, registryRoot: string): 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\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: SkillId[],\n pluginDir: string,\n matrix: MergedSkillsMatrix,\n sourceResult: SourceLoadResult,\n sourceSelections?: Partial<Record<SkillId, string>>,\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 const selectedSource = sourceSelections?.[skillId];\n const userSelectedRemote = selectedSource && selectedSource !== \"local\";\n\n if (skill.local && skill.localPath && !userSelectedRemote) {\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\n// Uses the skill ID as the folder name (flattened, not nested)\nfunction getFlattenedSkillDestPath(skill: ResolvedSkill, localSkillsDir: string): string {\n return path.join(localSkillsDir, skill.id);\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: SkillId[],\n localSkillsDir: string,\n matrix: MergedSkillsMatrix,\n sourceResult: SourceLoadResult,\n sourceSelections?: Partial<Record<SkillId, string>>,\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 const selectedSource = sourceSelections?.[skillId];\n const userSelectedRemote = selectedSource && selectedSource !== \"local\";\n\n if (skill.local && skill.localPath && !userSelectedRemote) {\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(skill, localSkillsDir, sourceResult);\n copiedSkills.push(copied);\n }\n\n return copiedSkills;\n}\n","/**\n * @deprecated This module is deprecated. Skills are now defined directly in agent YAMLs.\n * Use agent's `skills` field in agent.yaml instead of these mappings.\n * See: src/cli/lib/resolver.ts -> resolveAgentSkills()\n *\n * This file is kept for backwards compatibility with:\n * - config-generator.ts (wizard flow for generating configs from skills)\n * - Legacy stack-based configurations\n *\n * Will be removed in a future version once config-generator is updated\n * to use the new agent-centric approach.\n */\n\nimport type { AgentName, CategoryPath, ProjectConfig } from \"../../types\";\nimport { getCachedDefaults } from \"../loading\";\n\n// Hardcoded fallback defaults — used when YAML defaults cannot be loaded\n\n// Boundary cast: literal strings are valid AgentName values at this data definition boundary\nexport const SKILL_TO_AGENTS: Record<string, AgentName[]> = {\n \"web/*\": [\n \"web-developer\",\n \"web-reviewer\",\n \"web-researcher\",\n \"web-pm\",\n \"pattern-scout\",\n \"web-pattern-critique\",\n \"agent-summoner\",\n \"skill-summoner\",\n \"documentor\",\n ],\n\n \"api/*\": [\n \"api-developer\",\n \"api-reviewer\",\n \"api-researcher\",\n \"web-architecture\",\n \"web-pm\",\n \"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 \"infra/*\": [\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 \"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 \"pattern-scout\",\n \"web-pattern-critique\",\n \"agent-summoner\",\n \"skill-summoner\",\n \"documentor\",\n ],\n\n \"web/testing\": [\"web-tester\", \"web-developer\", \"web-reviewer\"],\n \"api/testing\": [\"web-tester\", \"api-developer\", \"api-reviewer\"],\n\n \"web/mocks\": [\"web-tester\", \"web-developer\", \"web-reviewer\"],\n};\n\n// Boundary cast: literal strings are valid AgentName values\nconst DEFAULT_AGENTS: AgentName[] = [\"agent-summoner\", \"skill-summoner\", \"documentor\"];\n\n// Priority: YAML defaults (if loaded) > hardcoded fallback\nfunction getEffectiveSkillToAgents(): Record<string, AgentName[]> {\n const defaults = getCachedDefaults();\n if (defaults?.skill_to_agents) {\n // Boundary cast: YAML-loaded mappings contain valid AgentName values\n return defaults.skill_to_agents as Record<string, AgentName[]>;\n }\n return SKILL_TO_AGENTS;\n}\n\nexport function getAgentsForSkill(\n skillPath: string,\n category: CategoryPath,\n projectConfig?: ProjectConfig,\n): AgentName[] {\n const normalizedPath = skillPath.replace(/^skills\\//, \"\").replace(/\\/$/, \"\");\n\n const skillToAgents = getEffectiveSkillToAgents();\n\n if (skillToAgents[category]) {\n return skillToAgents[category];\n }\n\n for (const [pattern, agents] of Object.entries(skillToAgents)) {\n if (normalizedPath === pattern || normalizedPath.startsWith(`${pattern}/`)) {\n return agents;\n }\n }\n\n for (const [pattern, agents] of Object.entries(skillToAgents)) {\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 DEFAULT_AGENTS;\n}\n","export {\n parseFrontmatter,\n loadAllAgents,\n loadProjectAgents,\n loadSkillsByIds,\n loadPluginSkills,\n} from \"./loader\";\n\nexport {\n type SourceLoadOptions,\n type SourceLoadResult,\n loadSkillsMatrixFromSource,\n} from \"./source-loader\";\n\nexport {\n type FetchOptions,\n type FetchResult,\n sanitizeSourceForCache,\n fetchFromSource,\n fetchMarketplace,\n} from \"./source-fetcher\";\n\nexport {\n type DefaultMappings,\n loadDefaultMappings,\n getCachedDefaults,\n clearDefaultsCache,\n} from \"./defaults-loader\";\n\nexport { loadSkillsFromAllSources } from \"./multi-source-loader\";\n","import { parse as parseYaml } from \"yaml\";\nimport path from \"path\";\nimport { unique } from \"remeda\";\nimport { glob, readFile, directoryExists } from \"../../utils/fs\";\nimport { verbose, warn } from \"../../utils/logger\";\nimport { CLAUDE_SRC_DIR, DIRS } from \"../../consts\";\nimport type { AgentDefinition, SkillDefinition, SkillFrontmatter, SkillId } from \"../../types\";\nimport { skillFrontmatterLoaderSchema, agentYamlConfigSchema } from \"../schemas\";\n\nconst FRONTMATTER_REGEX = /^---\\n([\\s\\S]*?)\\n---/;\n\nexport function parseFrontmatter(content: string, filePath?: string): SkillFrontmatter | null {\n const match = content.match(FRONTMATTER_REGEX);\n if (!match) return null;\n\n const yamlContent = match[1];\n const parsed = skillFrontmatterLoaderSchema.safeParse(parseYaml(yamlContent));\n\n if (!parsed.success) {\n const location = filePath ?? \"unknown file\";\n warn(\n `Invalid SKILL.md frontmatter in ${location}: ${parsed.error.issues.map((i) => `${i.path.join(\".\")}: ${i.message}`).join(\"; \")}`,\n );\n return null;\n }\n // Boundary cast: YAML name field may not match strict SkillId pattern (e.g., local skills)\n return parsed.data as SkillFrontmatter;\n}\n\nexport async function loadAllAgents(projectRoot: string): 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 try {\n const content = await readFile(fullPath);\n const config = agentYamlConfigSchema.parse(parseYaml(content));\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 sourceRoot: projectRoot,\n };\n\n verbose(`Loaded agent: ${config.id} from ${file}`);\n } catch (error) {\n warn(\n `Skipping invalid agent.yaml at ${fullPath}: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n\n return agents;\n}\n\nexport async function loadProjectAgents(\n projectRoot: string,\n): Promise<Record<string, AgentDefinition>> {\n const agents: Record<string, AgentDefinition> = {};\n const projectAgentsDir = path.join(projectRoot, CLAUDE_SRC_DIR, \"agents\");\n\n if (!(await directoryExists(projectAgentsDir))) {\n verbose(`No project agents directory at ${projectAgentsDir}`);\n return agents;\n }\n\n const files = await glob(\"**/agent.yaml\", projectAgentsDir);\n\n for (const file of files) {\n const fullPath = path.join(projectAgentsDir, file);\n try {\n const content = await readFile(fullPath);\n const config = agentYamlConfigSchema.parse(parseYaml(content));\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 sourceRoot: projectRoot,\n agentBaseDir: `${CLAUDE_SRC_DIR}/agents`, // Project agents are in .claude-src/agents/\n };\n\n verbose(`Loaded project agent: ${config.id} from ${file}`);\n } catch (error) {\n warn(\n `Skipping invalid agent.yaml at ${fullPath}: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n\n return agents;\n}\n\nasync function buildIdToDirectoryPathMap(skillsDir: string): 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, fullPath);\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: SkillId }>,\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: SkillId[] = [];\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 // Boundary cast: keys from buildIdToDirectoryPathMap are SkillId values from frontmatter\n expandedSkillIds.push(...(childSkills as SkillId[]));\n verbose(`Expanded directory '${skillId}' to ${childSkills.length} skills`);\n } else {\n console.warn(` Warning: Unknown skill reference '${skillId}'`);\n }\n }\n }\n\n const uniqueSkillIds = unique(expandedSkillIds);\n\n for (const skillId of uniqueSkillIds) {\n const directoryPath = idToDirectoryPath[skillId];\n if (!directoryPath) {\n console.warn(` Warning: Could not find skill ${skillId}: No matching skill found`);\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, skillMdPath);\n\n if (!frontmatter) {\n warn(`Skipping ${skillId}: Missing or invalid frontmatter`);\n continue;\n }\n\n const canonicalId = frontmatter.name;\n const skillDef: SkillDefinition = {\n id: canonicalId,\n path: `${DIRS.skills}/${directoryPath}/`,\n description: frontmatter.description,\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, fullPath);\n if (!frontmatter) {\n warn(`Skipping ${file}: Missing or invalid frontmatter`);\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 id: skillId,\n path: skillPath,\n description: frontmatter.description,\n };\n\n verbose(`Loaded plugin skill: ${skillId} from ${file}`);\n }\n\n return skills;\n}\n","import path from \"path\";\nimport { PROJECT_ROOT, SKILLS_DIR_PATH, SKILLS_MATRIX_PATH } from \"../../consts\";\nimport type {\n AgentName,\n MergedSkillsMatrix,\n ResolvedSkill,\n ResolvedStack,\n SkillDisplayName,\n SkillId,\n Stack,\n} from \"../../types\";\nimport { fileExists } from \"../../utils/fs\";\nimport { verbose } from \"../../utils/logger\";\nimport { typedKeys } from \"../../utils/typed-object\";\nimport { isLocalSource, resolveSource, type ResolvedConfig } from \"../configuration\";\nimport { discoverLocalSkills, type LocalSkillDiscoveryResult } from \"../skills\";\nimport {\n checkMatrixHealth,\n extractAllSkills,\n loadSkillsMatrix,\n mergeMatrixWithSkills,\n} from \"../matrix\";\nimport { fetchFromSource } from \"./source-fetcher\";\nimport { loadSkillsFromAllSources } from \"./multi-source-loader\";\nimport { loadStacks, resolveAgentConfigToSkills } from \"../stacks\";\n\nexport type SourceLoadOptions = {\n sourceFlag?: string;\n projectDir?: string;\n forceRefresh?: boolean;\n devMode?: boolean;\n};\n\nexport type SourceLoadResult = {\n matrix: MergedSkillsMatrix;\n sourceConfig: ResolvedConfig;\n sourcePath: string;\n isLocal: boolean;\n marketplace?: string;\n};\n\nexport async function loadSkillsMatrixFromSource(\n options: SourceLoadOptions = {},\n): Promise<SourceLoadResult> {\n const { sourceFlag, projectDir, forceRefresh = false, devMode = false } = 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(result.matrix, localSkillsResult);\n }\n\n // Annotate skills with available sources (public, local, plugin, private)\n await loadSkillsFromAllSources(result.matrix, sourceConfig, resolvedProjectDir);\n\n // Run matrix health check to surface referential integrity issues\n checkMatrixHealth(result.matrix);\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) ? source : path.resolve(process.cwd(), source);\n } else {\n skillsPath = PROJECT_ROOT;\n }\n\n verbose(`Loading skills from local path: ${skillsPath}`);\n\n // Check if source has its own matrix, otherwise fallback to CLI matrix\n const sourceMatrixPath = path.join(skillsPath, SKILLS_MATRIX_PATH);\n const cliMatrixPath = path.join(PROJECT_ROOT, SKILLS_MATRIX_PATH);\n\n let matrixPath: string;\n if (await fileExists(sourceMatrixPath)) {\n matrixPath = sourceMatrixPath;\n verbose(`Matrix from source: ${matrixPath}`);\n } else {\n matrixPath = cliMatrixPath;\n verbose(`Matrix from CLI (source has no matrix): ${matrixPath}`);\n }\n\n const skillsDir = path.join(skillsPath, SKILLS_DIR_PATH);\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 // Load stacks from source first, fall back to CLI's config/stacks.yaml\n const sourceStacks = await loadStacks(skillsPath);\n const stacks = sourceStacks.length > 0 ? sourceStacks : await loadStacks(PROJECT_ROOT);\n if (stacks.length > 0) {\n mergedMatrix.suggestedStacks = stacks.map((stack) =>\n stackToResolvedStack(stack, mergedMatrix.displayNameToId),\n );\n const stackSource = sourceStacks.length > 0 ? \"source\" : \"CLI\";\n verbose(`Loaded ${stacks.length} stacks from ${stackSource}`);\n }\n\n return {\n matrix: mergedMatrix,\n sourceConfig,\n sourcePath: skillsPath,\n isLocal: true,\n marketplace: sourceConfig.marketplace,\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 // Check if source has its own matrix, otherwise fallback to CLI matrix\n const sourceMatrixPath = path.join(fetchResult.path, SKILLS_MATRIX_PATH);\n const cliMatrixPath = path.join(PROJECT_ROOT, SKILLS_MATRIX_PATH);\n\n let matrixPath: string;\n if (await fileExists(sourceMatrixPath)) {\n matrixPath = sourceMatrixPath;\n verbose(`Matrix from source: ${matrixPath}`);\n } else {\n matrixPath = cliMatrixPath;\n verbose(`Matrix from CLI (source has no matrix): ${matrixPath}`);\n }\n\n const skillsDir = path.join(fetchResult.path, SKILLS_DIR_PATH);\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 // Load stacks from source first, fall back to CLI's config/stacks.yaml\n const sourceStacks = await loadStacks(fetchResult.path);\n const stacks = sourceStacks.length > 0 ? sourceStacks : await loadStacks(PROJECT_ROOT);\n if (stacks.length > 0) {\n mergedMatrix.suggestedStacks = stacks.map((stack) =>\n stackToResolvedStack(stack, mergedMatrix.displayNameToId),\n );\n const stackSource = sourceStacks.length > 0 ? \"source\" : \"CLI\";\n verbose(`Loaded ${stacks.length} stacks from ${stackSource}`);\n }\n\n return {\n matrix: mergedMatrix,\n sourceConfig,\n sourcePath: fetchResult.path,\n isLocal: false,\n marketplace: sourceConfig.marketplace,\n };\n}\n\n// Convert a Stack to ResolvedStack for wizard compatibility.\n// Resolves technology aliases to full skill IDs via displayNameToId.\nfunction stackToResolvedStack(\n stack: Stack,\n displayNameToId: Partial<Record<SkillDisplayName, SkillId>>,\n): ResolvedStack {\n // Collect all unique skill IDs from agent configs in this stack\n const allSkillIds: SkillId[] = [];\n const seenSkillIds = new Set<SkillId>();\n\n for (const agentId of typedKeys<AgentName>(stack.agents)) {\n const agentConfig = stack.agents[agentId];\n if (!agentConfig) continue;\n\n // Resolve this agent's technology selections to skill IDs\n const skillRefs = resolveAgentConfigToSkills(agentConfig, displayNameToId);\n\n for (const ref of skillRefs) {\n if (!seenSkillIds.has(ref.id)) {\n seenSkillIds.add(ref.id);\n allSkillIds.push(ref.id);\n }\n }\n }\n\n const agentCount = typedKeys<AgentName>(stack.agents).length;\n verbose(`Stack '${stack.id}' has ${allSkillIds.length} skills from ${agentCount} agents`);\n\n return {\n id: stack.id,\n name: stack.name,\n description: stack.description,\n audience: [], // Not used in new format\n skills: {} as ResolvedStack[\"skills\"], // Skills come from stack agent configs, resolved at runtime\n allSkillIds,\n philosophy: stack.philosophy || \"\",\n };\n}\n\nfunction mergeLocalSkillsIntoMatrix(\n matrix: MergedSkillsMatrix,\n localResult: LocalSkillDiscoveryResult,\n): MergedSkillsMatrix {\n for (const metadata of localResult.skills) {\n // Preserve alias and category from existing matrix entry (if skill was in source)\n const existingSkill = matrix.skills[metadata.id];\n\n // If overwriting an existing remote skill, inherit its category unconditionally.\n // Otherwise, use whatever the local skill declared in its metadata.yaml.\n const category = existingSkill?.category ?? metadata.category;\n const displayName = existingSkill?.displayName ?? matrix.displayNames[metadata.id];\n\n const resolvedSkill: ResolvedSkill = {\n id: metadata.id,\n displayName,\n description: metadata.description,\n usageGuidance: metadata.usageGuidance,\n\n category,\n categoryExclusive: metadata.categoryExclusive,\n tags: metadata.tags ?? [],\n\n author: \"@local\",\n\n conflictsWith: existingSkill?.conflictsWith ?? [],\n recommends: existingSkill?.recommends ?? [],\n requires: existingSkill?.requires ?? [],\n alternatives: existingSkill?.alternatives ?? [],\n discourages: existingSkill?.discourages ?? [],\n compatibleWith: existingSkill?.compatibleWith ?? [],\n\n requiresSetup: existingSkill?.requiresSetup ?? [],\n providesSetupFor: existingSkill?.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} (category: ${category})`);\n }\n\n return matrix;\n}\n","export {\n loadSkillsMatrix,\n extractAllSkills,\n mergeMatrixWithSkills,\n loadAndMergeSkillsMatrix,\n} from \"./matrix-loader\";\n\nexport {\n resolveAlias,\n getDependentSkills,\n type SkillCheckOptions,\n isDisabled,\n getDisableReason,\n isDiscouraged,\n getDiscourageReason,\n isRecommended,\n getRecommendReason,\n validateSelection,\n getAvailableSkills,\n getSkillsByCategory,\n isCategoryAllDisabled,\n} from \"./matrix-resolver\";\n\nexport { type MatrixHealthIssue, checkMatrixHealth } from \"./matrix-health-check\";\n","import { parse as parseYaml } from \"yaml\";\nimport path from \"path\";\nimport { z } from \"zod\";\nimport { glob, readFile, fileExists } from \"../../utils/fs\";\nimport { verbose, warn } from \"../../utils/logger\";\nimport { DIRS } from \"../../consts\";\nimport { parseFrontmatter } from \"../loading\";\nimport {\n skillsMatrixConfigSchema,\n categoryPathSchema,\n skillDisplayNameSchema,\n skillIdSchema,\n} from \"../schemas\";\nimport type {\n ExtractedSkillMetadata,\n MergedSkillsMatrix,\n ResolvedSkill,\n ResolvedStack,\n SkillAlternative,\n SkillDisplayName,\n SkillId,\n SkillRelation,\n SkillRequirement,\n SkillsMatrixConfig,\n} from \"../../types\";\n\nconst rawMetadataSchema = z.object({\n category: categoryPathSchema,\n category_exclusive: z.boolean().optional(),\n author: z.string(),\n version: z.coerce.string(),\n cli_name: z.string().optional(),\n cli_description: z.string().optional(),\n usage_guidance: z.string().optional(),\n tags: z.array(z.string()).optional(),\n // Lenient: accepts display names and skill IDs from YAML, resolved to canonical IDs during matrix merge\n compatible_with: z.array(z.string() as z.ZodType<SkillId>).optional(),\n conflicts_with: z.array(z.string() as z.ZodType<SkillId>).optional(),\n requires: z.array(z.string() as z.ZodType<SkillId>).optional(),\n requires_setup: z.array(z.string() as z.ZodType<SkillId>).optional(),\n provides_setup_for: z.array(z.string() as z.ZodType<SkillId>).optional(),\n});\n\ntype RawMetadata = z.infer<typeof rawMetadataSchema>;\n\nexport async function loadSkillsMatrix(configPath: string): Promise<SkillsMatrixConfig> {\n const content = await readFile(configPath);\n const raw = parseYaml(content);\n const result = skillsMatrixConfigSchema.safeParse(raw);\n\n if (!result.success) {\n throw new Error(\n `Invalid skills matrix at ${configPath}: ${result.error.issues.map((i) => `${i.path.join(\".\")}: ${i.message}`).join(\"; \")}`,\n );\n }\n\n verbose(`Loaded skills matrix: ${configPath}`);\n return result.data;\n}\n\nexport async function extractAllSkills(skillsDir: string): 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 rawMetadata = parseYaml(metadataContent);\n const metadataResult = rawMetadataSchema.safeParse(rawMetadata);\n\n if (!metadataResult.success) {\n warn(\n `Skipping ${metadataFile}: Invalid metadata.yaml — ${metadataResult.error.issues.map((i) => `${i.path.join(\".\")}: ${i.message}`).join(\"; \")}`,\n );\n continue;\n }\n\n const metadata = metadataResult.data;\n const skillMdContent = await readFile(skillMdPath);\n const frontmatter = parseFrontmatter(skillMdContent, skillMdPath);\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 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 buildReverseDisplayNames(\n displayNameToId: Partial<Record<SkillDisplayName, SkillId>>,\n): Partial<Record<SkillId, SkillDisplayName>> {\n const reverse: Partial<Record<SkillId, SkillDisplayName>> = {};\n // Object.entries returns [string, SkillId | undefined][] — validate with Zod at boundary\n for (const [name, fullId] of Object.entries(displayNameToId)) {\n const nameResult = skillDisplayNameSchema.safeParse(name);\n const idResult = skillIdSchema.safeParse(fullId);\n if (nameResult.success && idResult.success) {\n reverse[idResult.data] = nameResult.data;\n } else {\n warn(\n `Invalid skill alias mapping: '${name}' -> '${fullId}'${!nameResult.success ? ` (invalid display name: ${nameResult.error.message})` : \"\"}${!idResult.success ? ` (invalid skill ID: ${idResult.error.message})` : \"\"}`,\n );\n }\n }\n return reverse;\n}\n\n// Maps short names, directory paths, and old alias targets to canonical skill IDs\nfunction buildAliasTargetToSkillIdMap(\n displayNameToId: Partial<Record<SkillDisplayName, SkillId>>,\n skills: ExtractedSkillMetadata[],\n): Record<string, SkillId> {\n const map: Record<string, SkillId> = {};\n\n for (const skill of skills) {\n // Extract the short form: last path segment\n // e.g., \"web-framework-react\" -> short form for lookup\n const parts = skill.id.split(\"/\");\n const shortForm = parts[parts.length - 1];\n\n if (shortForm && shortForm !== skill.id) {\n map[shortForm] = skill.id;\n }\n\n // Also map directory path to skill ID if different\n // e.g., directory path -> normalized skill ID\n if (skill.directoryPath && skill.directoryPath !== skill.id) {\n map[skill.directoryPath] = skill.id;\n }\n }\n\n // Also include any old-style alias targets that might still be referenced\n const aliasTargets = new Set(Object.values(displayNameToId));\n for (const skill of skills) {\n for (const aliasTarget of aliasTargets) {\n if (\n aliasTarget !== skill.id &&\n (skill.id.endsWith(`/${aliasTarget}`) || skill.id === aliasTarget)\n ) {\n map[aliasTarget] = skill.id;\n }\n }\n }\n\n return map;\n}\n\nfunction buildDirectoryPathToIdMap(skills: ExtractedSkillMetadata[]): Record<string, SkillId> {\n const map: Record<string, SkillId> = {};\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 nameOrId: SkillId,\n displayNameToId: Partial<Record<SkillDisplayName, SkillId>>,\n directoryPathToId: Record<string, SkillId> = {},\n aliasTargetToSkillId: Record<string, SkillId> = {},\n context?: string,\n): SkillId {\n // Boundary cast: nameOrId may contain a display name from YAML — narrow to SkillDisplayName for lookup\n const displayNameResult = displayNameToId[nameOrId as unknown as SkillDisplayName];\n if (displayNameResult) {\n return displayNameResult;\n }\n if (directoryPathToId[nameOrId]) {\n return directoryPathToId[nameOrId];\n }\n // Handle \"short author\" format like \"react (@vince)\" that maps to full ID\n if (aliasTargetToSkillId[nameOrId]) {\n return aliasTargetToSkillId[nameOrId];\n }\n if (context) {\n verbose(`Unresolved ID '${nameOrId}' in ${context} — passing through as-is`);\n }\n // Not found in display names — treat as SkillId pass-through\n return nameOrId;\n}\n\nexport async function mergeMatrixWithSkills(\n matrix: SkillsMatrixConfig,\n skills: ExtractedSkillMetadata[],\n): Promise<MergedSkillsMatrix> {\n const displayNameToId = matrix.skill_aliases;\n const displayNames = buildReverseDisplayNames(displayNameToId);\n const directoryPathToId = buildDirectoryPathToIdMap(skills);\n const aliasTargetToSkillId = buildAliasTargetToSkillIdMap(displayNameToId, skills);\n const resolvedSkills: Partial<Record<SkillId, ResolvedSkill>> = {};\n\n for (const skill of skills) {\n const resolved = buildResolvedSkill(\n skill,\n matrix,\n displayNameToId,\n displayNames,\n directoryPathToId,\n aliasTargetToSkillId,\n );\n resolvedSkills[skill.id] = resolved;\n }\n\n const suggestedStacks = resolveSuggestedStacks();\n\n const merged: MergedSkillsMatrix = {\n version: matrix.version,\n categories: matrix.categories,\n skills: resolvedSkills,\n suggestedStacks,\n displayNameToId,\n displayNames,\n generatedAt: new Date().toISOString(),\n };\n\n return merged;\n}\n\nfunction buildResolvedSkill(\n skill: ExtractedSkillMetadata,\n matrix: SkillsMatrixConfig,\n displayNameToId: Partial<Record<SkillDisplayName, SkillId>>,\n displayNames: Partial<Record<SkillId, SkillDisplayName>>,\n directoryPathToId: Record<string, SkillId>,\n aliasTargetToSkillId: Record<string, SkillId>,\n): ResolvedSkill {\n const conflictsWith: SkillRelation[] = [];\n const recommends: SkillRelation[] = [];\n const requires: SkillRequirement[] = [];\n const alternatives: SkillAlternative[] = [];\n const discourages: SkillRelation[] = [];\n\n // Helper to resolve with all maps, with context for diagnostics.\n // All canonical IDs follow the SkillId format (prefix-subcategory-name).\n const resolve = (id: SkillId, relationContext?: string): SkillId =>\n resolveToCanonicalId(\n id,\n displayNameToId,\n directoryPathToId,\n aliasTargetToSkillId,\n relationContext ? `${skill.id} ${relationContext}` : undefined,\n );\n\n for (const conflictRef of skill.conflictsWith) {\n const canonicalId = resolve(conflictRef, \"conflictsWith\");\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((id) => resolve(id, \"conflicts\"));\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 = resolve(compatRef, \"compatibleWith\");\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 = resolve(recommendRule.when, \"recommends.when\");\n if (whenCanonicalId === skill.id) {\n for (const suggested of recommendRule.suggest) {\n const canonicalId = resolve(suggested, \"recommends.suggest\");\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((id) => resolve(id, \"requires\")),\n needsAny: false,\n reason: \"Defined in skill metadata\",\n });\n }\n\n for (const requireRule of matrix.relationships.requires) {\n const skillCanonicalId = resolve(requireRule.skill, \"requires.skill\");\n if (skillCanonicalId === skill.id) {\n requires.push({\n skillIds: requireRule.needs.map((id) => resolve(id, \"requires.needs\")),\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((id) => resolve(id, \"alternatives\"));\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((id) => resolve(id, \"discourages\"));\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 // Preserve compatibleWith as resolved skill IDs for framework-first filtering\n const compatibleWith = skill.compatibleWith.map((id) => resolve(id, \"compatibleWith\"));\n\n return {\n id: skill.id,\n displayName: displayNames[skill.id],\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 requires,\n alternatives,\n discourages,\n compatibleWith,\n requiresSetup: skill.requiresSetup.map((id) => resolve(id, \"requiresSetup\")),\n providesSetupFor: skill.providesSetupFor.map((id) => resolve(id, \"providesSetupFor\")),\n path: skill.path,\n };\n}\n\nfunction resolveSuggestedStacks(): ResolvedStack[] {\n return [];\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 { groupBy } from \"remeda\";\nimport type {\n CategoryPath,\n MergedSkillsMatrix,\n ResolvedSkill,\n SelectionValidation,\n SkillDisplayName,\n SkillId,\n SkillOption,\n Subcategory,\n ValidationError,\n ValidationWarning,\n} from \"../../types\";\nimport { typedEntries } from \"../../utils/typed-object\";\n\nfunction getLabel(\n skill: { displayName?: string; id: string } | undefined,\n fallback: string,\n): string {\n return skill?.displayName || skill?.id || fallback;\n}\n\nexport function resolveAlias(aliasOrId: SkillId, matrix: MergedSkillsMatrix): SkillId {\n // Boundary cast: aliasOrId may contain a display name from legacy contexts — try display name lookup first, fall back to SkillId\n return matrix.displayNameToId[aliasOrId as unknown as SkillDisplayName] || aliasOrId;\n}\n\nexport function getDependentSkills(\n skillId: SkillId,\n currentSelections: SkillId[],\n matrix: MergedSkillsMatrix,\n): SkillId[] {\n const fullId = resolveAlias(skillId, matrix);\n const skill = matrix.skills[fullId];\n\n if (!skill) return [];\n\n const resolvedSelections = currentSelections.map((s) => resolveAlias(s, matrix));\n const dependents: SkillId[] = [];\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 type SkillCheckOptions = {\n expertMode?: boolean;\n};\n\nexport function isDisabled(\n skillId: SkillId,\n currentSelections: SkillId[],\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 (selectedSkill && selectedSkill.conflictsWith.some((c) => c.skillId === fullId)) {\n return true;\n }\n }\n\n const resolvedSelections = currentSelections.map((s) => resolveAlias(s, matrix));\n\n for (const requirement of skill.requires) {\n if (requirement.needsAny) {\n const hasAny = requirement.skillIds.some((reqId) => resolvedSelections.includes(reqId));\n if (!hasAny) {\n return true;\n }\n } else {\n const hasAll = requirement.skillIds.every((reqId) => resolvedSelections.includes(reqId));\n if (!hasAll) {\n return true;\n }\n }\n }\n\n return false;\n}\n\nexport function getDisableReason(\n skillId: SkillId,\n currentSelections: SkillId[],\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) => resolveAlias(s, matrix));\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 return `${conflict.reason} (conflicts with ${getLabel(selectedSkill, selectedId)})`;\n }\n\n const selectedSkill = matrix.skills[selectedId];\n if (selectedSkill) {\n const reverseConflict = selectedSkill.conflictsWith.find((c) => c.skillId === fullId);\n if (reverseConflict) {\n return `${reverseConflict.reason} (conflicts with ${getLabel(selectedSkill, selectedId)})`;\n }\n }\n }\n\n for (const requirement of skill.requires) {\n if (requirement.needsAny) {\n const hasAny = requirement.skillIds.some((reqId) => resolvedSelections.includes(reqId));\n if (!hasAny) {\n const requiredNames = requirement.skillIds\n .map((id) => getLabel(matrix.skills[id], 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.map((id) => getLabel(matrix.skills[id], id)).join(\", \");\n return `${requirement.reason} (requires ${missingNames})`;\n }\n }\n }\n\n return undefined;\n}\n\nexport function isDiscouraged(\n skillId: SkillId,\n currentSelections: SkillId[],\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) => resolveAlias(s, matrix));\n\n for (const selectedId of resolvedSelections) {\n const selectedSkill = matrix.skills[selectedId];\n if (selectedSkill && selectedSkill.discourages.some((d) => d.skillId === fullId)) {\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: SkillId,\n currentSelections: SkillId[],\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) => resolveAlias(s, matrix));\n\n for (const selectedId of resolvedSelections) {\n const selectedSkill = matrix.skills[selectedId];\n if (selectedSkill) {\n const discourage = selectedSkill.discourages.find((d) => d.skillId === fullId);\n if (discourage) {\n return discourage.reason;\n }\n }\n\n const reverseDiscourage = skill.discourages.find((d) => d.skillId === selectedId);\n if (reverseDiscourage) {\n return reverseDiscourage.reason;\n }\n }\n\n return undefined;\n}\n\nexport function isRecommended(\n skillId: SkillId,\n currentSelections: SkillId[],\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) => resolveAlias(s, matrix));\n\n for (const selectedId of resolvedSelections) {\n const selectedSkill = matrix.skills[selectedId];\n if (selectedSkill && selectedSkill.recommends.some((r) => r.skillId === fullId)) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function getRecommendReason(\n skillId: SkillId,\n currentSelections: SkillId[],\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) => resolveAlias(s, matrix));\n\n for (const selectedId of resolvedSelections) {\n const selectedSkill = matrix.skills[selectedId];\n if (selectedSkill) {\n const recommendation = selectedSkill.recommends.find((r) => r.skillId === fullId);\n if (recommendation) {\n return `${recommendation.reason} (recommended by ${getLabel(selectedSkill, selectedId)})`;\n }\n }\n }\n\n return undefined;\n}\n\nexport function validateSelection(\n selections: SkillId[],\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: `${getLabel(skillA, skillA.id)} conflicts with ${getLabel(matrix.skills[skillBId], 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) => resolvedSelections.includes(reqId));\n if (!hasAny) {\n errors.push({\n type: \"missing_requirement\",\n message: `${getLabel(skill, skillId)} requires one of: ${requirement.skillIds.map((id) => getLabel(matrix.skills[id], 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: `${getLabel(skill, skillId)} requires: ${missingIds.map((id) => getLabel(matrix.skills[id], id)).join(\", \")}`,\n skills: [skillId, ...missingIds],\n });\n }\n }\n }\n }\n\n const validSkills = resolvedSelections\n .map((skillId) => ({ skillId, skill: matrix.skills[skillId] }))\n .filter((entry): entry is { skillId: SkillId; skill: ResolvedSkill } => entry.skill != null);\n const categorySelections = groupBy(validSkills, (entry) => entry.skill.category);\n\n for (const [categoryId, entries] of typedEntries(categorySelections)) {\n if (entries.length > 1) {\n const skillIds = entries.map((e) => e.skillId);\n // CategoryPath → Subcategory: categories lookup uses bare subcategory names\n const category = matrix.categories[categoryId as Subcategory];\n if (category?.exclusive) {\n errors.push({\n type: \"category_exclusive\",\n message: `Category \"${category.displayName}\" only allows one selection, but multiple selected: ${skillIds.map((id) => getLabel(matrix.skills[id], 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: `${getLabel(skill, skillId)} recommends ${getLabel(recommendedSkill, recommendation.skillId)}: ${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 \"${getLabel(skill, skillId)}\" selected but no corresponding usage skills: ${skill.providesSetupFor.map((id) => getLabel(matrix.skills[id], 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: CategoryPath,\n currentSelections: SkillId[],\n matrix: MergedSkillsMatrix,\n options?: SkillCheckOptions,\n): SkillOption[] {\n const skillOptions: SkillOption[] = [];\n const resolvedSelections = currentSelections.map((s) => resolveAlias(s, matrix));\n\n for (const skill of Object.values(matrix.skills)) {\n if (!skill) continue;\n if (skill.category !== categoryId) {\n continue;\n }\n\n const disabled = isDisabled(skill.id, currentSelections, matrix, options);\n const discouraged = !disabled && isDiscouraged(skill.id, currentSelections, matrix);\n const recommended =\n !disabled && !discouraged && isRecommended(skill.id, currentSelections, matrix);\n\n skillOptions.push({\n id: skill.id,\n displayName: skill.displayName,\n description: skill.description,\n disabled,\n disabledReason: disabled ? getDisableReason(skill.id, currentSelections, matrix) : 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: CategoryPath,\n matrix: MergedSkillsMatrix,\n): ResolvedSkill[] {\n const skills: ResolvedSkill[] = [];\n\n for (const skill of Object.values(matrix.skills)) {\n if (!skill) continue;\n if (skill.category === categoryId) {\n skills.push(skill);\n }\n }\n\n return skills;\n}\n\nexport function isCategoryAllDisabled(\n categoryId: CategoryPath,\n currentSelections: SkillId[],\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: SkillId; reason: string | undefined }> = [];\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","import { warn } from \"../../utils/logger\";\nimport type {\n CategoryDefinition,\n MergedSkillsMatrix,\n ResolvedSkill,\n SkillId,\n Subcategory,\n} from \"../../types\";\nimport { typedEntries, typedKeys } from \"../../utils/typed-object\";\n\nexport type MatrixHealthIssue = {\n severity: \"warning\" | \"error\";\n finding: string;\n details: string;\n};\n\nexport function checkMatrixHealth(matrix: MergedSkillsMatrix): MatrixHealthIssue[] {\n const issues: MatrixHealthIssue[] = [];\n const skillIds = new Set(typedKeys<SkillId>(matrix.skills));\n\n checkRelationshipTargets(matrix, skillIds, issues);\n checkSubcategoryDomains(matrix, issues);\n checkSkillCategories(matrix, issues);\n checkCompatibleWithTargets(matrix, skillIds, issues);\n checkStackSkillIds(matrix, skillIds, issues);\n\n for (const issue of issues) {\n warn(`[matrix] ${issue.details}`);\n }\n\n return issues;\n}\n\nfunction checkRelationshipTargets(\n matrix: MergedSkillsMatrix,\n skillIds: Set<SkillId>,\n issues: MatrixHealthIssue[],\n): void {\n for (const [skillId, skill] of typedEntries<SkillId, ResolvedSkill>(matrix.skills)) {\n if (!skill) continue;\n for (const conflict of skill.conflictsWith) {\n if (!skillIds.has(conflict.skillId)) {\n issues.push({\n severity: \"warning\",\n finding: \"ghost-relationship-target\",\n details: `Skill '${skillId}' conflicts with '${conflict.skillId}' which does not exist in the matrix`,\n });\n }\n }\n\n for (const recommend of skill.recommends) {\n if (!skillIds.has(recommend.skillId)) {\n issues.push({\n severity: \"warning\",\n finding: \"ghost-relationship-target\",\n details: `Skill '${skillId}' recommends '${recommend.skillId}' which does not exist in the matrix`,\n });\n }\n }\n\n for (const requirement of skill.requires) {\n for (const reqId of requirement.skillIds) {\n if (!skillIds.has(reqId)) {\n issues.push({\n severity: \"error\",\n finding: \"ghost-requirement-target\",\n details: `Skill '${skillId}' requires '${reqId}' which does not exist in the matrix`,\n });\n }\n }\n }\n\n for (const alt of skill.alternatives) {\n if (!skillIds.has(alt.skillId)) {\n issues.push({\n severity: \"warning\",\n finding: \"ghost-alternative-target\",\n details: `Skill '${skillId}' lists alternative '${alt.skillId}' which does not exist in the matrix`,\n });\n }\n }\n\n for (const discourage of skill.discourages) {\n if (!skillIds.has(discourage.skillId)) {\n issues.push({\n severity: \"warning\",\n finding: \"ghost-relationship-target\",\n details: `Skill '${skillId}' discourages '${discourage.skillId}' which does not exist in the matrix`,\n });\n }\n }\n\n for (const setupId of skill.requiresSetup) {\n if (!skillIds.has(setupId)) {\n issues.push({\n severity: \"warning\",\n finding: \"ghost-setup-target\",\n details: `Skill '${skillId}' requiresSetup '${setupId}' which does not exist in the matrix`,\n });\n }\n }\n\n for (const providesId of skill.providesSetupFor) {\n if (!skillIds.has(providesId)) {\n issues.push({\n severity: \"warning\",\n finding: \"ghost-setup-target\",\n details: `Skill '${skillId}' providesSetupFor '${providesId}' which does not exist in the matrix`,\n });\n }\n }\n }\n}\n\n// Categories without a domain won't appear in any wizard domain view\nfunction checkSubcategoryDomains(matrix: MergedSkillsMatrix, issues: MatrixHealthIssue[]): void {\n for (const [catId, cat] of typedEntries<Subcategory, CategoryDefinition>(matrix.categories)) {\n if (!cat) continue;\n if (!cat.domain) {\n issues.push({\n severity: \"warning\",\n finding: \"category-missing-domain\",\n details: `Category '${catId}' has no domain — it won't appear in any wizard domain view`,\n });\n }\n }\n}\n\nfunction checkSkillCategories(matrix: MergedSkillsMatrix, issues: MatrixHealthIssue[]): void {\n for (const [skillId, skill] of typedEntries<SkillId, ResolvedSkill>(matrix.skills)) {\n if (!skill) continue;\n // Narrowing cast: skill.category is CategoryPath which includes Subcategory | \"local\" | prefixed forms\n if (!matrix.categories[skill.category as Subcategory]) {\n issues.push({\n severity: \"warning\",\n finding: \"skill-unknown-category\",\n details: `Skill '${skillId}' references category '${skill.category}' which does not exist in the matrix`,\n });\n }\n }\n}\n\nfunction checkCompatibleWithTargets(\n matrix: MergedSkillsMatrix,\n skillIds: Set<SkillId>,\n issues: MatrixHealthIssue[],\n): void {\n for (const [skillId, skill] of typedEntries<SkillId, ResolvedSkill>(matrix.skills)) {\n if (!skill) continue;\n for (const compatId of skill.compatibleWith) {\n if (!skillIds.has(compatId)) {\n issues.push({\n severity: \"warning\",\n finding: \"ghost-compatible-with-target\",\n details: `Skill '${skillId}' has compatibleWith '${compatId}' which does not exist in the matrix`,\n });\n }\n }\n }\n}\n\nfunction checkStackSkillIds(\n matrix: MergedSkillsMatrix,\n skillIds: Set<SkillId>,\n issues: MatrixHealthIssue[],\n): void {\n for (const stack of matrix.suggestedStacks) {\n for (const stackSkillId of stack.allSkillIds) {\n if (!skillIds.has(stackSkillId)) {\n issues.push({\n severity: \"warning\",\n finding: \"stack-ghost-skill\",\n details: `Stack '${stack.id}' references skill '${stackSkillId}' which does not exist in the matrix`,\n });\n }\n }\n }\n}\n","import type {\n BoundSkillCandidate,\n MergedSkillsMatrix,\n SkillAlias,\n SkillId,\n SkillSource,\n} from \"../../types\";\nimport { verbose, warn } from \"../../utils/logger\";\nimport { typedEntries } from \"../../utils/typed-object\";\nimport { resolveAllSources, type ResolvedConfig, type SourceEntry } from \"../configuration\";\nimport { extractAllSkills } from \"../matrix\";\nimport { fetchFromSource } from \"./source-fetcher\";\nimport { SKILLS_DIR_PATH } from \"../../consts\";\nimport path from \"path\";\nimport { getCollectivePluginDir, getPluginSkillIds, getPluginSkillsDir } from \"../plugins\";\nimport { directoryExists } from \"../../utils/fs\";\n\nconst PUBLIC_SOURCE_NAME = \"public\";\n\n/**\n * Loads skill source metadata from all configured sources and annotates\n * each skill in the matrix with its available sources and active source.\n */\nexport async function loadSkillsFromAllSources(\n primaryMatrix: MergedSkillsMatrix,\n sourceConfig: ResolvedConfig,\n projectDir: string,\n): Promise<void> {\n // 1. Tag all primary source skills with \"public\" source\n tagPrimarySourceSkills(primaryMatrix);\n\n // 2. Tag local skills\n tagLocalSkills(primaryMatrix);\n\n // 3. Tag plugin-installed skills\n await tagPluginSkills(primaryMatrix, projectDir);\n\n // 4. Load and tag extra sources\n await tagExtraSources(primaryMatrix, projectDir);\n\n // 5. Set activeSource on each skill\n setActiveSources(primaryMatrix);\n}\n\n/** Tag all skills in the primary matrix as \"public\" source */\nfunction tagPrimarySourceSkills(matrix: MergedSkillsMatrix): void {\n for (const [, skill] of typedEntries<SkillId, NonNullable<(typeof matrix.skills)[SkillId]>>(\n matrix.skills as Record<SkillId, NonNullable<(typeof matrix.skills)[SkillId]>>,\n )) {\n if (!skill) continue;\n\n const source: SkillSource = {\n name: PUBLIC_SOURCE_NAME,\n type: \"public\",\n version: skill.version,\n installed: false,\n };\n\n skill.availableSources = skill.availableSources ?? [];\n skill.availableSources.push(source);\n }\n}\n\n/** Tag local skills with \"local\" source and mark as installed */\nfunction tagLocalSkills(matrix: MergedSkillsMatrix): void {\n let count = 0;\n for (const [, skill] of typedEntries<SkillId, NonNullable<(typeof matrix.skills)[SkillId]>>(\n matrix.skills as Record<SkillId, NonNullable<(typeof matrix.skills)[SkillId]>>,\n )) {\n if (!skill) continue;\n if (!skill.local) continue;\n\n const source: SkillSource = {\n name: \"local\",\n type: \"local\",\n installed: true,\n installMode: \"local\",\n };\n\n skill.availableSources = skill.availableSources ?? [];\n skill.availableSources.push(source);\n count++;\n }\n\n verbose(`Tagged ${count} local skills with local source`);\n}\n\n/** Detect plugin-installed skills and tag them */\nasync function tagPluginSkills(matrix: MergedSkillsMatrix, projectDir: string): Promise<void> {\n const pluginDir = getCollectivePluginDir(projectDir);\n\n if (!(await directoryExists(pluginDir))) {\n verbose(\"No plugin directory found, skipping plugin skill tagging\");\n return;\n }\n\n const pluginSkillsDir = getPluginSkillsDir(pluginDir);\n\n if (!(await directoryExists(pluginSkillsDir))) {\n verbose(\"No plugin skills directory found, skipping plugin skill tagging\");\n return;\n }\n\n try {\n const pluginSkillIds = await getPluginSkillIds(pluginSkillsDir, matrix);\n\n for (const skillId of pluginSkillIds) {\n const skill = matrix.skills[skillId];\n if (!skill) continue;\n\n skill.availableSources = skill.availableSources ?? [];\n\n // Mark the existing source as installed via plugin\n const existingSource = skill.availableSources.find((s) => s.type === \"public\");\n if (existingSource && !existingSource.installMode) {\n existingSource.installed = true;\n existingSource.installMode = \"plugin\";\n } else if (!skill.availableSources.some((s) => s.installMode === \"plugin\")) {\n // No existing source to mark — add a public source with plugin install mode\n skill.availableSources.push({\n name: PUBLIC_SOURCE_NAME,\n type: \"public\",\n version: skill.version,\n installed: true,\n installMode: \"plugin\",\n });\n }\n }\n\n verbose(`Tagged ${pluginSkillIds.length} plugin-installed skills`);\n } catch (error) {\n verbose(`Failed to detect plugin skills: ${error}`);\n }\n}\n\n/** Load extra sources from project config and tag matching skills */\nasync function tagExtraSources(matrix: MergedSkillsMatrix, projectDir: string): Promise<void> {\n let allSources;\n try {\n allSources = await resolveAllSources(projectDir);\n } catch (error) {\n verbose(`Failed to resolve extra sources: ${error}`);\n return;\n }\n\n if (allSources.extras.length === 0) {\n verbose(\"No extra sources configured\");\n return;\n }\n\n for (const extraSource of allSources.extras) {\n verbose(`Loading extra source: ${extraSource.name} (${extraSource.url})`);\n\n try {\n const fetchResult = await fetchFromSource(extraSource.url, { forceRefresh: false });\n const skillsDir = path.join(fetchResult.path, SKILLS_DIR_PATH);\n const skills = await extractAllSkills(skillsDir);\n\n let matchCount = 0;\n for (const extractedSkill of skills) {\n const matrixSkill = matrix.skills[extractedSkill.id];\n if (!matrixSkill) continue;\n\n const source: SkillSource = {\n name: extraSource.name,\n type: \"private\",\n url: extraSource.url,\n installed: false,\n };\n\n matrixSkill.availableSources = matrixSkill.availableSources ?? [];\n matrixSkill.availableSources.push(source);\n matchCount++;\n }\n\n verbose(\n `Extra source '${extraSource.name}': ${skills.length} skills found, ${matchCount} matching`,\n );\n } catch (error) {\n warn(`Failed to load extra source '${extraSource.name}' (${extraSource.url}): ${error}`);\n }\n }\n}\n\n/** Set activeSource on each skill to the installed variant, or \"public\" as default */\nfunction setActiveSources(matrix: MergedSkillsMatrix): void {\n for (const [, skill] of typedEntries<SkillId, NonNullable<(typeof matrix.skills)[SkillId]>>(\n matrix.skills as Record<SkillId, NonNullable<(typeof matrix.skills)[SkillId]>>,\n )) {\n if (!skill) continue;\n if (!skill.availableSources || skill.availableSources.length === 0) continue;\n\n // Prefer installed source, then fall back to first available\n const installedSource = skill.availableSources.find((s) => s.installed);\n skill.activeSource = installedSource ?? skill.availableSources[0];\n }\n}\n\n/**\n * Search configured extra sources for skills matching a given alias.\n * Returns candidates with source name, skill ID, and description.\n * Errors per-source are warned and skipped (never throws).\n */\nexport async function searchExtraSources(\n alias: SkillAlias,\n configuredSources: SourceEntry[],\n): Promise<BoundSkillCandidate[]> {\n const candidates: BoundSkillCandidate[] = [];\n\n if (configuredSources.length === 0) {\n return candidates;\n }\n\n const lowerAlias = alias.toLowerCase();\n\n for (const source of configuredSources) {\n try {\n const fetchResult = await fetchFromSource(source.url, { forceRefresh: false });\n const skillsDir = path.join(fetchResult.path, SKILLS_DIR_PATH);\n const skills = await extractAllSkills(skillsDir);\n\n for (const skill of skills) {\n // Match by last segment of directory path (the alias/display-name convention)\n const segments = skill.directoryPath.split(\"/\");\n const lastSegment = segments[segments.length - 1]?.toLowerCase();\n\n if (lastSegment === lowerAlias) {\n candidates.push({\n id: skill.id,\n sourceUrl: source.url,\n sourceName: source.name,\n alias,\n description: skill.description,\n });\n }\n }\n } catch (error) {\n warn(`Failed to search extra source '${source.name}' (${source.url}): ${error}`);\n }\n }\n\n return candidates;\n}\n","export {\n type SkillManifestOptions,\n type AgentManifestOptions,\n type StackManifestOptions,\n generateSkillPluginManifest,\n generateAgentPluginManifest,\n generateStackPluginManifest,\n writePluginManifest,\n getPluginDir,\n} from \"./plugin-manifest\";\n\nexport { findPluginManifest } from \"./plugin-manifest-finder\";\n\nexport {\n getUserPluginsDir,\n getCollectivePluginDir,\n getProjectPluginsDir,\n getPluginSkillsDir,\n getPluginAgentsDir,\n getPluginManifestPath,\n readPluginManifest,\n getPluginSkillIds,\n} from \"./plugin-finder\";\n\nexport {\n type PluginInfo,\n type InstallationInfo,\n getPluginInfo,\n formatPluginDisplay,\n getInstallationInfo,\n formatInstallationDisplay,\n} from \"./plugin-info\";\n\nexport { type VersionBumpType, bumpPluginVersion, getPluginVersion } from \"./plugin-version\";\n\nexport {\n validatePluginStructure,\n validatePluginManifest,\n validateSkillFrontmatter,\n validateAgentFrontmatter,\n validatePlugin,\n validateAllPlugins,\n printPluginValidationResult,\n} from \"./plugin-validator\";\n","import path from \"path\";\nimport { ensureDir, writeFile } from \"../../utils/fs\";\nimport { DEFAULT_VERSION } from \"../../consts\";\nimport type { PluginAuthor, PluginManifest } from \"../../types\";\n\nconst PLUGIN_DIR_NAME = \".claude-plugin\";\nconst PLUGIN_MANIFEST_FILE = \"plugin.json\";\nconst SKILL_PLUGIN_PREFIX = \"\";\nconst AGENT_PLUGIN_PREFIX = \"agent-\";\n\nexport type SkillManifestOptions = {\n skillName: string;\n description?: string;\n author?: string;\n authorEmail?: string;\n version?: string;\n keywords?: string[];\n};\n\nexport type AgentManifestOptions = {\n agentName: string;\n description?: string;\n version?: string;\n};\n\nexport type StackManifestOptions = {\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(options: SkillManifestOptions): PluginManifest {\n const manifest: PluginManifest = {\n name: `${SKILL_PLUGIN_PREFIX}${options.skillName}`,\n version: options.version ?? DEFAULT_VERSION,\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 generateAgentPluginManifest(options: AgentManifestOptions): PluginManifest {\n const manifest: PluginManifest = {\n name: `${AGENT_PLUGIN_PREFIX}${options.agentName}`,\n version: options.version ?? DEFAULT_VERSION,\n agents: \"./agents/\",\n };\n\n if (options.description) {\n manifest.description = options.description;\n }\n\n return manifest;\n}\n\nexport function generateStackPluginManifest(options: StackManifestOptions): PluginManifest {\n const manifest: PluginManifest = {\n name: options.stackName,\n version: options.version ?? DEFAULT_VERSION,\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 // Note: Claude Code plugins don't support agents field in manifest\n // Agents are discovered from ./agents/ directory automatically\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 path from \"path\";\nimport { PLUGIN_MANIFEST_DIR, PLUGIN_MANIFEST_FILE } from \"../../consts\";\nimport { fileExists } from \"../../utils/fs\";\n\n// Walks up from startDir looking for the plugin manifest file.\nexport async 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(currentDir, PLUGIN_MANIFEST_DIR, PLUGIN_MANIFEST_FILE);\n if (await fileExists(manifestPath)) {\n return manifestPath;\n }\n currentDir = path.dirname(currentDir);\n }\n\n return null;\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 { MergedSkillsMatrix, PluginManifest, SkillId } from \"../../types\";\nimport { pluginManifestSchema } from \"../schemas\";\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(pluginDir: string): 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 = pluginManifestSchema.parse(JSON.parse(content));\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<SkillId[]> {\n const skillFiles = await glob(\"**/SKILL.md\", pluginSkillsDir);\n const skillIds: SkillId[] = [];\n\n // Boundary cast: Object.entries keys are SkillId\n const aliasToId = new Map<string, SkillId>();\n for (const [id, skill] of Object.entries(matrix.skills)) {\n if (!skill) continue;\n if (skill.displayName) {\n aliasToId.set(skill.displayName.toLowerCase(), id as SkillId);\n }\n }\n\n const dirToId = new Map<string, SkillId>();\n for (const [id] of Object.entries(matrix.skills)) {\n const idParts = id.split(\"/\");\n const lastPart = idParts[idParts.length - 1];\n if (lastPart) {\n dirToId.set(lastPart.toLowerCase(), id as SkillId);\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 if (matrix.skills[skillName as SkillId]) {\n skillIds.push(skillName as SkillId);\n continue;\n }\n const skillId = aliasToId.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 { readdir } from \"fs/promises\";\nimport {\n getCollectivePluginDir,\n getPluginSkillsDir,\n getPluginAgentsDir,\n readPluginManifest,\n} from \"./plugin-finder\";\nimport { countBy } from \"remeda\";\nimport { directoryExists } from \"../../utils/fs\";\nimport { DEFAULT_DISPLAY_VERSION } from \"../../consts\";\nimport { detectInstallation, type InstallMode } from \"../installation\";\nimport { loadProjectConfig } from \"../configuration\";\n\nconst DEFAULT_NAME = \"claude-collective\";\n\nexport type PluginInfo = {\n name: string;\n version: string;\n skillCount: number;\n agentCount: number;\n path: string;\n};\n\nexport type InstallationInfo = {\n mode: InstallMode;\n name: string;\n version: string;\n skillCount: number;\n agentCount: number;\n configPath: string;\n agentsDir: string;\n skillsDir: 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 = countBy(skills, (s) => String(s.isDirectory()))[\"true\"] ?? 0;\n }\n\n if (await directoryExists(agentsDir)) {\n const agents = await readdir(agentsDir, { withFileTypes: true });\n agentCount = agents.filter((a) => a.isFile() && a.name.endsWith(\".md\")).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\nexport async function getInstallationInfo(): Promise<InstallationInfo | null> {\n const installation = await detectInstallation();\n\n if (!installation) {\n return null;\n }\n\n let skillCount = 0;\n let agentCount = 0;\n let name = DEFAULT_NAME;\n let version = DEFAULT_DISPLAY_VERSION;\n\n if (await directoryExists(installation.skillsDir)) {\n try {\n const skills = await readdir(installation.skillsDir, {\n withFileTypes: true,\n });\n skillCount = skills.filter((s) => s.isDirectory()).length;\n } catch {\n // Ignore errors\n }\n }\n\n if (await directoryExists(installation.agentsDir)) {\n try {\n const agents = await readdir(installation.agentsDir, {\n withFileTypes: true,\n });\n agentCount = agents.filter((a) => a.isFile() && a.name.endsWith(\".md\")).length;\n } catch {\n // Ignore errors\n }\n }\n\n if (installation.mode === \"local\") {\n const loaded = await loadProjectConfig(installation.projectDir);\n if (loaded?.config) {\n name = loaded.config.name || DEFAULT_NAME;\n version = \"local\";\n }\n } else {\n const pluginDir = getCollectivePluginDir(installation.projectDir);\n const manifest = await readPluginManifest(pluginDir);\n if (manifest) {\n name = manifest.name || DEFAULT_NAME;\n version = manifest.version || DEFAULT_DISPLAY_VERSION;\n }\n }\n\n return {\n mode: installation.mode,\n name,\n version,\n skillCount,\n agentCount,\n configPath: installation.configPath,\n agentsDir: installation.agentsDir,\n skillsDir: installation.skillsDir,\n };\n}\n\nexport function formatInstallationDisplay(info: InstallationInfo): string {\n const modeLabel = info.mode === \"local\" ? \"Local\" : \"Plugin\";\n const versionDisplay = info.mode === \"local\" ? \"(local mode)\" : `v${info.version}`;\n\n return `Installation: ${info.name} ${versionDisplay}\n Mode: ${modeLabel}\n Skills: ${info.skillCount}\n Agents: ${info.agentCount}\n Config: ${info.configPath}\n Agents: ${info.agentsDir}`;\n}\n","export {\n type InstallMode,\n type Installation,\n detectInstallation,\n getInstallationOrThrow,\n} from \"./installation\";\n\nexport { type LocalInstallOptions, type LocalInstallResult, installLocal } from \"./local-installer\";\n","import path from \"path\";\nimport { directoryExists, fileExists } from \"../../utils/fs\";\nimport { loadProjectConfig } from \"../configuration\";\nimport { getCollectivePluginDir } from \"../plugins\";\nimport { CLAUDE_DIR, CLAUDE_SRC_DIR } from \"../../consts\";\n\nexport type InstallMode = \"local\" | \"plugin\";\n\nexport type Installation = {\n mode: InstallMode;\n configPath: string;\n agentsDir: string;\n skillsDir: string;\n projectDir: string;\n};\n\n// Priority: Local (.claude-src/config.yaml) > Plugin (.claude/plugins/claude-collective/)\nexport async function detectInstallation(\n projectDir: string = process.cwd(),\n): Promise<Installation | null> {\n // 1. Check for local installation first\n // Check .claude-src/config.yaml first (new location)\n const srcConfigPath = path.join(projectDir, CLAUDE_SRC_DIR, \"config.yaml\");\n // Fall back to .claude/config.yaml (legacy location)\n const legacyConfigPath = path.join(projectDir, CLAUDE_DIR, \"config.yaml\");\n\n const localConfigPath = (await fileExists(srcConfigPath))\n ? srcConfigPath\n : (await fileExists(legacyConfigPath))\n ? legacyConfigPath\n : null;\n\n if (localConfigPath) {\n const loaded = await loadProjectConfig(projectDir);\n\n // If config exists and has installMode: local (or no installMode, defaults to local)\n // treat it as local mode\n const mode: InstallMode = loaded?.config?.installMode ?? \"local\";\n\n if (mode === \"local\") {\n return {\n mode: \"local\",\n configPath: localConfigPath,\n agentsDir: path.join(projectDir, CLAUDE_DIR, \"agents\"),\n skillsDir: path.join(projectDir, CLAUDE_DIR, \"skills\"),\n projectDir,\n };\n }\n }\n\n // 2. Check for plugin installation\n const pluginDir = getCollectivePluginDir(projectDir);\n const pluginConfigPath = path.join(pluginDir, \"config.yaml\");\n\n if (await directoryExists(pluginDir)) {\n return {\n mode: \"plugin\",\n configPath: pluginConfigPath,\n agentsDir: path.join(pluginDir, \"agents\"),\n skillsDir: path.join(pluginDir, \"skills\"),\n projectDir,\n };\n }\n\n // No installation found\n return null;\n}\n\nexport async function getInstallationOrThrow(\n projectDir: string = process.cwd(),\n): Promise<Installation> {\n const installation = await detectInstallation(projectDir);\n\n if (!installation) {\n throw new Error(\"No Claude Collective installation found.\\n\" + \"Run 'cc init' to create one.\");\n }\n\n return installation;\n}\n","import path from \"path\";\nimport { stringify as stringifyYaml } from \"yaml\";\nimport type {\n AgentConfig,\n AgentDefinition,\n AgentName,\n CompileAgentConfig,\n CompileConfig,\n MergedSkillsMatrix,\n ProjectConfig,\n SkillDefinition,\n SkillId,\n Stack,\n} from \"../../types\";\nimport type { WizardResultV2 } from \"../../components/wizard/wizard\";\nimport { type CopiedSkill, copySkillsToLocalFlattened, archiveLocalSkill } from \"../skills\";\nimport { mergeWithExistingConfig } from \"../configuration\";\nimport { loadAllAgents, type SourceLoadResult } from \"../loading\";\nimport { loadStackById, compileAgentForPlugin } from \"../stacks\";\nimport { resolveAgents, buildSkillRefsFromConfig } from \"../resolver\";\nimport { createLiquidEngine } from \"../compiler\";\nimport { generateProjectConfigFromSkills } from \"../configuration\";\nimport { ensureDir, writeFile } from \"../../utils/fs\";\nimport { verbose } from \"../../utils/logger\";\nimport { typedEntries, typedKeys } from \"../../utils/typed-object\";\nimport { CLAUDE_DIR, CLAUDE_SRC_DIR, LOCAL_SKILLS_PATH, PROJECT_ROOT } from \"../../consts\";\n\nconst PLUGIN_NAME = \"claude-collective\";\n\nconst YAML_INDENT = 2;\nconst YAML_LINE_WIDTH = 120;\n\ntype LocalResolvedSkill = SkillDefinition & {\n content: string;\n};\n\nexport type LocalInstallOptions = {\n wizardResult: WizardResultV2;\n sourceResult: SourceLoadResult;\n projectDir: string;\n sourceFlag?: string;\n};\n\nexport type LocalInstallResult = {\n copiedSkills: CopiedSkill[];\n config: ProjectConfig;\n configPath: string;\n compiledAgents: AgentName[];\n wasMerged: boolean;\n mergedConfigPath?: string;\n skillsDir: string;\n agentsDir: string;\n};\n\nfunction buildLocalSkillsMap(\n copiedSkills: CopiedSkill[],\n matrix: MergedSkillsMatrix,\n): Record<SkillId, LocalResolvedSkill> {\n const localSkillsForResolution: Record<SkillId, LocalResolvedSkill> = {} as Record<\n SkillId,\n LocalResolvedSkill\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 description: skill.description || \"\",\n path: copiedSkill.destPath,\n content: \"\", // Content not needed for skill references\n };\n }\n }\n return localSkillsForResolution;\n}\n\nasync function buildLocalConfig(\n wizardResult: WizardResultV2,\n sourceResult: SourceLoadResult,\n): Promise<{ config: ProjectConfig; loadedStack: Stack | null }> {\n // Try loading stack from source first, fall back to CLI\n let loadedStack: Stack | null = null;\n if (wizardResult.selectedStackId) {\n loadedStack = await loadStackById(wizardResult.selectedStackId, sourceResult.sourcePath);\n if (!loadedStack) {\n loadedStack = await loadStackById(wizardResult.selectedStackId, PROJECT_ROOT);\n }\n }\n\n let localConfig: ProjectConfig;\n\n if (wizardResult.selectedStackId) {\n if (loadedStack) {\n // Generate config from the user's actual skill selections (which may differ\n // from the original stack if the user customized). This ensures the stack\n // property reflects customizations (e.g., swapping commander for oclif).\n localConfig = generateProjectConfigFromSkills(\n PLUGIN_NAME,\n wizardResult.selectedSkills,\n sourceResult.matrix,\n );\n\n // Preserve the stack description and ensure all stack agents are included\n localConfig.description = loadedStack.description;\n const stackAgentIds = typedKeys<AgentName>(loadedStack.agents);\n for (const agentId of stackAgentIds) {\n if (!localConfig.agents.includes(agentId)) {\n localConfig.agents.push(agentId);\n }\n }\n localConfig.agents.sort();\n } else {\n // Stack not found in CLI's config/stacks.yaml\n throw new Error(\n `Stack '${wizardResult.selectedStackId}' not found in config/stacks.yaml. ` +\n `Available stacks are defined in the CLI's config/stacks.yaml file.`,\n );\n }\n } else {\n localConfig = generateProjectConfigFromSkills(\n PLUGIN_NAME,\n wizardResult.selectedSkills,\n sourceResult.matrix,\n );\n }\n\n return { config: localConfig, loadedStack };\n}\n\nfunction setConfigMetadata(\n config: ProjectConfig,\n wizardResult: WizardResultV2,\n sourceResult: SourceLoadResult,\n sourceFlag?: string,\n): void {\n config.installMode = wizardResult.installMode;\n\n // Flag overrides resolved source\n if (sourceFlag) {\n config.source = sourceFlag;\n } else if (sourceResult.sourceConfig.source) {\n config.source = sourceResult.sourceConfig.source;\n }\n\n if (sourceResult.marketplace) {\n config.marketplace = sourceResult.marketplace;\n }\n}\n\nfunction buildCompileAgents(\n config: ProjectConfig,\n agents: Record<AgentName, AgentDefinition>,\n): Record<AgentName, CompileAgentConfig> {\n const compileAgents: Record<AgentName, CompileAgentConfig> = {} as Record<\n AgentName,\n CompileAgentConfig\n >;\n for (const agentId of config.agents) {\n if (agents[agentId]) {\n const agentStack = config.stack?.[agentId];\n compileAgents[agentId] = agentStack ? { skills: buildSkillRefsFromConfig(agentStack) } : {};\n }\n }\n return compileAgents;\n}\n\nasync function compileAndWriteAgents(\n compileConfig: CompileConfig,\n agents: Record<AgentName, AgentDefinition>,\n localSkills: Record<SkillId, LocalResolvedSkill>,\n sourceResult: SourceLoadResult,\n projectDir: string,\n agentsDir: string,\n installMode?: \"plugin\" | \"local\",\n): Promise<AgentName[]> {\n const engine = await createLiquidEngine(projectDir);\n const resolvedAgents = await resolveAgents(\n agents,\n localSkills,\n compileConfig,\n sourceResult.sourcePath,\n );\n\n const compiledAgentNames: AgentName[] = [];\n for (const [name, agent] of typedEntries<AgentName, AgentConfig>(resolvedAgents)) {\n const output = await compileAgentForPlugin(\n name,\n agent,\n sourceResult.sourcePath,\n engine,\n installMode,\n );\n await writeFile(path.join(agentsDir, `${name}.md`), output);\n compiledAgentNames.push(name);\n }\n\n return compiledAgentNames;\n}\n\nexport async function installLocal(options: LocalInstallOptions): Promise<LocalInstallResult> {\n const { wizardResult, sourceResult, projectDir, sourceFlag } = options;\n const matrix = sourceResult.matrix;\n const localSkillsDir = path.join(projectDir, LOCAL_SKILLS_PATH);\n const localAgentsDir = path.join(projectDir, CLAUDE_DIR, \"agents\");\n const localConfigPath = path.join(projectDir, CLAUDE_SRC_DIR, \"config.yaml\");\n\n // 1. Create directories\n await ensureDir(localSkillsDir);\n await ensureDir(localAgentsDir);\n await ensureDir(path.dirname(localConfigPath));\n\n // 2. Archive local skills that are switching to a different source\n for (const skillId of wizardResult.selectedSkills) {\n const selectedSource = wizardResult.sourceSelections?.[skillId];\n if (selectedSource && selectedSource !== \"public\") {\n verbose(`Using alternate source '${selectedSource}' for ${skillId}`);\n await archiveLocalSkill(projectDir, skillId);\n }\n }\n\n // 3. Copy selected skills\n const copiedSkills = await copySkillsToLocalFlattened(\n wizardResult.selectedSkills,\n localSkillsDir,\n matrix,\n sourceResult,\n );\n\n // 4. Build local skills map for resolution\n const localSkillsForResolution = buildLocalSkillsMap(copiedSkills, matrix);\n // 5. Load agents from both CLI and source, with source taking precedence\n const cliAgents = await loadAllAgents(PROJECT_ROOT);\n const localAgents = await loadAllAgents(sourceResult.sourcePath);\n // Boundary cast: loadAllAgents returns Record<string, AgentDefinition>, agent dirs are AgentName by convention\n const agents = { ...cliAgents, ...localAgents } as Record<AgentName, AgentDefinition>;\n\n // 6. Build config\n const { config: builtConfig } = await buildLocalConfig(wizardResult, sourceResult);\n\n // 7. Set metadata\n setConfigMetadata(builtConfig, wizardResult, sourceResult, sourceFlag);\n\n // 8. Merge with existing config\n const mergeResult = await mergeWithExistingConfig(builtConfig, { projectDir });\n const finalConfig = mergeResult.config;\n\n // 9. Write config\n const configYaml = stringifyYaml(finalConfig, {\n indent: YAML_INDENT,\n lineWidth: YAML_LINE_WIDTH,\n });\n await writeFile(localConfigPath, configYaml);\n\n // 10. Build compile agents config\n const compileAgentsConfig = buildCompileAgents(finalConfig, agents);\n\n const compileConfig: CompileConfig = {\n name: PLUGIN_NAME,\n description:\n finalConfig.description || `Local setup with ${wizardResult.selectedSkills.length} skills`,\n agents: compileAgentsConfig,\n };\n\n // 11. Compile and write agents\n const compiledAgentNames = await compileAndWriteAgents(\n compileConfig,\n agents,\n localSkillsForResolution,\n sourceResult,\n projectDir,\n localAgentsDir,\n wizardResult.installMode,\n );\n\n return {\n copiedSkills,\n config: finalConfig,\n configPath: localConfigPath,\n compiledAgents: compiledAgentNames,\n wasMerged: mergeResult.merged,\n mergedConfigPath: mergeResult.existingConfigPath,\n skillsDir: localSkillsDir,\n agentsDir: localAgentsDir,\n };\n}\n","export {\n loadStacks,\n loadStackById,\n resolveAgentConfigToSkills,\n resolveStackSkillsFromDisplayNames,\n} from \"./stacks-loader\";\n\nexport {\n type StackInstallOptions,\n type StackInstallResult,\n compileStackToTemp,\n installStackAsPlugin,\n} from \"./stack-installer\";\n\nexport {\n type StackPluginOptions,\n type CompiledStackPlugin,\n compileAgentForPlugin,\n compileStackPlugin,\n printStackCompilationSummary,\n} from \"./stack-plugin-compiler\";\n","import { parse as parseYaml } from \"yaml\";\nimport path from \"path\";\nimport { mapValues } from \"remeda\";\nimport { readFile, fileExists } from \"../../utils/fs\";\nimport { verbose, warn } from \"../../utils/logger\";\nimport type { SkillId, SkillReference, Stack, StackAgentConfig, Subcategory } from \"../../types\";\nimport { stacksConfigSchema } from \"../schemas\";\nimport { KEY_SUBCATEGORIES } from \"../../consts\";\n\nconst STACKS_FILE = \"config/stacks.yaml\";\n\nconst stacksCache = new Map<string, Stack[]>();\n\nexport async function loadStacks(configDir: string): Promise<Stack[]> {\n const cacheKey = configDir;\n const cached = stacksCache.get(cacheKey);\n if (cached) return cached;\n\n const stacksPath = path.join(configDir, STACKS_FILE);\n\n if (!(await fileExists(stacksPath))) {\n verbose(`No stacks file found at ${stacksPath}`);\n return [];\n }\n\n try {\n const content = await readFile(stacksPath);\n const result = stacksConfigSchema.safeParse(parseYaml(content));\n\n if (!result.success) {\n throw new Error(\n `Invalid stacks.yaml at ${stacksPath}: ${result.error.issues.map((i) => `${i.path.join(\".\")}: ${i.message}`).join(\"; \")}`,\n );\n }\n\n const config = result.data;\n\n stacksCache.set(cacheKey, config.stacks);\n verbose(`Loaded ${config.stacks.length} stacks from ${stacksPath}`);\n\n return config.stacks;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n throw new Error(`Failed to load stacks from '${stacksPath}': ${errorMessage}`);\n }\n}\n\nexport async function loadStackById(stackId: string, configDir: string): Promise<Stack | null> {\n const stacks = await loadStacks(configDir);\n const stack = stacks.find((s) => s.id === stackId);\n\n if (!stack) {\n verbose(`Stack '${stackId}' not found`);\n return null;\n }\n\n verbose(`Found stack: ${stack.name} (${stackId})`);\n return stack;\n}\n\n// Resolves each technology display name in the agent config to a full skill ID\nexport function resolveAgentConfigToSkills(\n agentConfig: StackAgentConfig,\n displayNameToId: Partial<Record<string, SkillId>>,\n): SkillReference[] {\n const skillRefs: SkillReference[] = [];\n\n for (const [subcategory, technologyDisplayName] of Object.entries(agentConfig)) {\n const fullSkillId = displayNameToId[technologyDisplayName];\n\n if (!fullSkillId) {\n warn(\n `No skill found for display name '${technologyDisplayName}' (subcategory: ${subcategory}) in stack config. Skipping.`,\n );\n continue;\n }\n\n // Boundary cast: Object.entries() loses StackAgentConfig key type\n const isKeySkill = KEY_SUBCATEGORIES.has(subcategory as Subcategory);\n\n skillRefs.push({\n id: fullSkillId,\n usage: `when working with ${subcategory}`,\n preloaded: isKeySkill,\n });\n }\n\n return skillRefs;\n}\n\nexport function resolveStackSkillsFromDisplayNames(\n stack: Stack,\n displayNameToId: Partial<Record<string, SkillId>>,\n): Record<string, SkillReference[]> {\n const result = mapValues(stack.agents, (agentConfig) =>\n resolveAgentConfigToSkills(agentConfig, displayNameToId),\n );\n\n verbose(`Resolved skills for ${Object.keys(result).length} agents in stack '${stack.id}'`);\n\n return result;\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 { verbose } from \"../../utils/logger\";\nimport type { CompiledStackPlugin } from \"./stack-plugin-compiler\";\nimport type { AgentName, SkillId } from \"../../types\";\n\nexport type StackInstallOptions = {\n stackId: string;\n projectDir: string;\n sourcePath: string;\n agentSourcePath: string;\n marketplace?: string;\n};\n\nexport type StackInstallResult = {\n pluginName: string;\n stackName: string;\n agents: AgentName[];\n skills: SkillId[];\n pluginPath: string;\n fromMarketplace: boolean;\n};\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\nexport async function installStackAsPlugin(\n options: StackInstallOptions,\n): Promise<StackInstallResult> {\n const { stackId, projectDir, sourcePath, agentSourcePath, marketplace } = options;\n\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 if (marketplace) {\n verbose(`Installing from marketplace: ${stackId}@${marketplace}`);\n const pluginRef = `${stackId}@${marketplace}`;\n\n await claudePluginInstall(pluginRef, \"project\", projectDir);\n\n return {\n pluginName: stackId,\n stackName: stackId,\n agents: [],\n skills: [],\n pluginPath: pluginRef,\n fromMarketplace: true,\n };\n }\n\n verbose(`Compiling stack locally: ${stackId}`);\n const { result, cleanup } = await compileStackToTemp({\n stackId,\n projectRoot: sourcePath,\n agentSourcePath,\n });\n\n try {\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 fromMarketplace: false,\n };\n } finally {\n await cleanup();\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, SKILLS_MATRIX_PATH } from \"../../consts\";\nimport { createLiquidEngine } from \"../compiler\";\nimport {\n generateStackPluginManifest,\n writePluginManifest,\n getPluginManifestPath,\n} from \"../plugins\";\nimport { loadSkillsByIds, loadAllAgents } from \"../loading\";\nimport { loadStackById, resolveAgentConfigToSkills } from \"./stacks-loader\";\nimport { loadSkillsMatrix } from \"../matrix\";\nimport { resolveAgents, stackToCompileConfig } from \"../resolver\";\nimport { buildStackProperty } from \"../configuration\";\nimport type {\n AgentConfig,\n AgentDefinition,\n AgentName,\n CompileConfig,\n CompiledAgentData,\n PluginManifest,\n ProjectConfig,\n SkillDefinition,\n SkillId,\n Stack,\n} from \"../../types\";\nimport { hashString, determinePluginVersion, writeContentHash } from \"../versioning\";\nimport { unique } from \"remeda\";\nimport { typedEntries, typedKeys } from \"../../utils/typed-object\";\n\nfunction hashStackConfig(stack: ProjectConfig): string {\n const stackSkillIds = stack.stack\n ? [...new Set(Object.values(stack.stack).flatMap((a) => Object.values(a)))].sort()\n : [];\n const parts: string[] = [\n `name:${stack.name}`,\n `description:${stack.description ?? \"\"}`,\n `skills:${stackSkillIds.join(\",\")}`,\n `agents:${(stack.agents || []).sort().join(\",\")}`,\n ];\n return hashString(parts.join(\"\\n\"));\n}\n\nexport type StackPluginOptions = {\n stackId: string;\n outputDir: string;\n projectRoot: string;\n agentSourcePath?: string;\n /** Optional stack configuration - if provided, bypasses loading from config/stacks.yaml */\n stack?: Stack;\n};\n\nexport type CompiledStackPlugin = {\n pluginPath: string;\n manifest: PluginManifest;\n stackName: string;\n agents: AgentName[];\n skillPlugins: SkillId[];\n hasHooks: boolean;\n};\n\nexport async function compileAgentForPlugin(\n name: AgentName,\n agent: AgentConfig,\n fallbackRoot: string,\n engine: Liquid,\n installMode?: \"plugin\" | \"local\",\n): Promise<string> {\n verbose(`Compiling agent: ${name}`);\n\n // Use agent's sourceRoot if available (for multi-source loading), otherwise fallback\n const agentSourceRoot = agent.sourceRoot || fallbackRoot;\n // Use agent's agentBaseDir if available (for project agents in .claude-src/agents/)\n const agentBaseDir = agent.agentBaseDir || DIRS.agents;\n const agentDir = path.join(agentSourceRoot, agentBaseDir, 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(agentSourceRoot, agentBaseDir, category);\n\n let outputFormat = await readFileOptional(path.join(agentDir, \"output-format.md\"), \"\");\n if (!outputFormat) {\n outputFormat = await readFileOptional(path.join(categoryDir, \"output-format.md\"), \"\");\n }\n\n // In plugin mode, skills are installed as individual plugins — use pluginRef format.\n // Create new skill objects to avoid mutating the caller's data.\n const skills =\n installMode === \"plugin\"\n ? agent.skills.map((s) => ({ ...s, pluginRef: `${s.id}:${s.id}` as const }))\n : agent.skills;\n\n const preloadedSkills = skills.filter((s) => s.preloaded);\n const dynamicSkills = skills.filter((s) => !s.preloaded);\n const preloadedSkillIds = preloadedSkills.map((s) => s.pluginRef ?? 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,\n preloadedSkills,\n dynamicSkills,\n preloadedSkillIds,\n };\n\n return engine.renderFile(\"agent\", data);\n}\n\nfunction generateStackReadme(\n stackId: string,\n stack: ProjectConfig,\n agents: AgentName[],\n skillPlugins: SkillId[],\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 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 = unique(skillPlugins).sort();\n for (const skill of uniqueSkills) {\n lines.push(`- \\`${skill}\\``);\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\nexport async function compileStackPlugin(\n options: StackPluginOptions,\n): Promise<CompiledStackPlugin> {\n const { stackId, outputDir, projectRoot, agentSourcePath } = options;\n const localAgentRoot = agentSourcePath || projectRoot;\n\n verbose(`Compiling stack plugin: ${stackId}`);\n verbose(` Stack/skills source: ${projectRoot}`);\n verbose(` Local agent source: ${localAgentRoot}`);\n verbose(` CLI agent source: ${PROJECT_ROOT}`);\n\n // Load agents from both local project and CLI, with local taking precedence\n const cliAgents = await loadAllAgents(PROJECT_ROOT);\n const localAgents = await loadAllAgents(localAgentRoot);\n // Boundary cast: loadAllAgents returns Record<string, AgentDefinition>, agent dirs are AgentName by convention\n const agents = { ...cliAgents, ...localAgents } as Record<AgentName, AgentDefinition>;\n\n verbose(\n ` Loaded ${Object.keys(localAgents).length} local agents, ${Object.keys(cliAgents).length} CLI agents`,\n );\n\n // Use provided stack or load from source's config/stacks.yaml, falling back to CLI\n let newStack = options.stack || (await loadStackById(stackId, projectRoot));\n if (!newStack) {\n newStack = await loadStackById(stackId, PROJECT_ROOT);\n }\n\n // Load skill aliases from the matrix to resolve technology aliases to skill IDs\n // This is needed for Phase 7 skill resolution in resolveAgents\n // Try source's matrix first, fall back to CLI matrix if missing or invalid\n const sourceMatrixPath = path.join(projectRoot, SKILLS_MATRIX_PATH);\n const cliMatrixPath = path.join(PROJECT_ROOT, SKILLS_MATRIX_PATH);\n let matrix: Awaited<ReturnType<typeof loadSkillsMatrix>>;\n try {\n matrix = await loadSkillsMatrix(\n (await fileExists(sourceMatrixPath)) ? sourceMatrixPath : cliMatrixPath,\n );\n } catch {\n matrix = await loadSkillsMatrix(cliMatrixPath);\n }\n const skillAliases = matrix.skill_aliases || {};\n\n let stack: ProjectConfig;\n if (newStack) {\n verbose(` Found stack: ${newStack.name}`);\n\n // Extract skills from stack's agent configurations (Phase 7: skills in stacks, not agents)\n const agentSkillIds = new Set<SkillId>();\n for (const agentName of typedKeys<AgentName>(newStack.agents)) {\n const agentConfig = newStack.agents[agentName];\n if (!agentConfig) continue;\n const skillRefs = resolveAgentConfigToSkills(agentConfig, skillAliases);\n for (const ref of skillRefs) {\n agentSkillIds.add(ref.id);\n }\n }\n\n // Build ProjectConfig for rest of function\n stack = {\n name: newStack.name,\n description: newStack.description,\n agents: typedKeys<AgentName>(newStack.agents),\n skills: [...agentSkillIds],\n stack: buildStackProperty(newStack, skillAliases) as ProjectConfig[\"stack\"],\n };\n } else {\n throw new Error(`Stack '${stackId}' not found in config/stacks.yaml`);\n }\n\n // Collect unique skill IDs from stack property for loading\n const stackSkillIds = stack.stack\n ? [...new Set(Object.values(stack.stack).flatMap((a) => Object.values(a)))]\n : [];\n // Boundary cast: loadSkillsByIds returns Record<string, SkillDefinition>, keys are SkillId by construction\n const skills = (await loadSkillsByIds(\n stackSkillIds.map((id) => ({ id })),\n projectRoot,\n )) as Record<SkillId, SkillDefinition>;\n\n const compileConfig: CompileConfig = stackToCompileConfig(stackId, stack);\n\n // Pass newStack and skillAliases for Phase 7 skill resolution\n const resolvedAgents = await resolveAgents(\n agents,\n skills,\n compileConfig,\n projectRoot,\n newStack,\n skillAliases,\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.values(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.id);\n\n if (await directoryExists(sourceSkillDir)) {\n await copy(sourceSkillDir, destSkillDir);\n copiedSourcePaths.add(resolvedSkill.path);\n verbose(` Copied skill: ${resolvedSkill.id}`);\n } else {\n verbose(` Warning: Skill directory not found: ${sourceSkillDir}`);\n }\n }\n\n const engine = await createLiquidEngine();\n\n const compiledAgentNames: AgentName[] = [];\n const allSkillPlugins: SkillId[] = [];\n\n for (const [name, agent] of typedEntries<AgentName, AgentConfig>(resolvedAgents)) {\n const output = await compileAgentForPlugin(name, agent, PROJECT_ROOT, 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 newHash = hashStackConfig(stack);\n const { version, contentHash } = await determinePluginVersion(\n newHash,\n pluginDir,\n getPluginManifestPath,\n );\n\n const uniqueSkillPlugins = unique(allSkillPlugins);\n const manifest = generateStackPluginManifest({\n stackName: stackId,\n description: stack.description,\n author: stack.author,\n version,\n keywords: undefined,\n hasAgents: true,\n hasHooks: false,\n hasSkills: true,\n });\n\n await writePluginManifest(pluginDir, manifest);\n\n await writeContentHash(pluginDir, contentHash, getPluginManifestPath);\n\n verbose(` Wrote plugin.json (v${version})`);\n\n const readme = generateStackReadme(stackId, stack, compiledAgentNames, uniqueSkillPlugins);\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: false,\n };\n}\n\nexport function printStackCompilationSummary(result: CompiledStackPlugin): 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 { pipe, flatMap, filter, uniqueBy } from \"remeda\";\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 { CLAUDE_DIR, CLAUDE_SRC_DIR, DIRS, PROJECT_ROOT } from \"../consts\";\nimport { resolveClaudeMd } from \"./resolver\";\nimport { validateCompiledAgent, printOutputValidationResult } from \"./output-validator\";\nimport type { AgentConfig, AgentName, CompiledAgentData, CompileContext } from \"../types\";\nimport { typedEntries } from \"../utils/typed-object\";\n\nasync function compileAgent(\n name: AgentName,\n agent: AgentConfig,\n projectRoot: string,\n engine: Liquid,\n): Promise<string> {\n verbose(`Reading agent files for ${name}...`);\n\n // Use agent's sourceRoot and agentBaseDir if available (for project agents in .claude-src/agents/)\n const agentSourceRoot = agent.sourceRoot || projectRoot;\n const agentBaseDir = agent.agentBaseDir || DIRS.agents;\n const agentDir = path.join(agentSourceRoot, agentBaseDir, 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(agentSourceRoot, agentBaseDir, category);\n\n let outputFormat = await readFileOptional(path.join(agentDir, \"output-format.md\"), \"\");\n if (!outputFormat) {\n outputFormat = await readFileOptional(path.join(categoryDir, \"output-format.md\"), \"\");\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 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 typedEntries<AgentName, AgentConfig>(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 = 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 = pipe(\n Object.values(resolvedAgents),\n flatMap((a) => a.skills),\n filter((s) => Boolean(s.path)),\n );\n\n const uniqueSkills = uniqueBy(allSkills, (s) => s.id);\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(path.join(sourcePath, \"reference.md\"));\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 = 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(ctx.projectRoot, ctx.stackId);\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 = 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 // Check .claude-src/agents/_templates/ FIRST (new location)\n const srcTemplatesDir = path.join(projectDir, CLAUDE_SRC_DIR, \"agents\", \"_templates\");\n if (await directoryExists(srcTemplatesDir)) {\n roots.push(srcTemplatesDir);\n verbose(`Using local templates from: ${srcTemplatesDir}`);\n }\n\n // Then check .claude/templates/ as fallback (legacy location)\n const legacyTemplatesDir = path.join(projectDir, CLAUDE_DIR, \"templates\");\n if (await directoryExists(legacyTemplatesDir)) {\n roots.push(legacyTemplatesDir);\n verbose(`Using legacy templates from: ${legacyTemplatesDir}`);\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 { fileExists } from \"../utils/fs\";\nimport { DIRS, KEY_SUBCATEGORIES } from \"../consts\";\nimport { verbose } from \"../utils/logger\";\nimport type {\n AgentConfig,\n AgentDefinition,\n AgentName,\n CompileAgentConfig,\n CompileConfig,\n ProjectConfig,\n Skill,\n SkillDefinition,\n SkillDisplayName,\n SkillId,\n SkillReference,\n Stack,\n Subcategory,\n} from \"../types\";\nimport { typedEntries, typedKeys } from \"../utils/typed-object\";\n\nexport async function resolveTemplate(projectRoot: string, stackId: string): Promise<string> {\n const stackTemplate = path.join(projectRoot, DIRS.stacks, stackId, \"agent.liquid\");\n if (await fileExists(stackTemplate)) return stackTemplate;\n\n return path.join(projectRoot, DIRS.templates, \"agent.liquid\");\n}\n\nexport async function resolveClaudeMd(projectRoot: string, stackId: string): Promise<string> {\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<SkillId, SkillDefinition>,\n): Skill | null {\n const definition = skills[ref.id];\n if (!definition) {\n verbose(`Skill '${ref.id}' not found in available skills, skipping`);\n return null;\n }\n return {\n ...definition,\n usage: ref.usage,\n preloaded: ref.preloaded ?? false,\n };\n}\n\nexport function resolveSkillReferences(\n skillRefs: SkillReference[],\n skills: Record<SkillId, SkillDefinition>,\n): Skill[] {\n return skillRefs\n .map((ref) => resolveSkillReference(ref, skills))\n .filter((skill): skill is Skill => skill !== null);\n}\n\n// Resolve skills for an agent from a Stack definition using display-name-to-ID mappings.\nexport function buildSkillRefsFromConfig(\n agentStack: Partial<Record<Subcategory, SkillId>>,\n): SkillReference[] {\n const skillRefs: SkillReference[] = [];\n for (const [subcategory, skillId] of typedEntries<Subcategory, SkillId>(agentStack)) {\n skillRefs.push({\n id: skillId,\n usage: `when working with ${subcategory}`,\n preloaded: KEY_SUBCATEGORIES.has(subcategory),\n });\n }\n return skillRefs;\n}\n\nexport function resolveAgentSkillsFromStack(\n agentName: AgentName,\n stack: Stack,\n displayNameToId: Partial<Record<SkillDisplayName, SkillId>>,\n): SkillReference[] {\n const agentConfig = stack.agents[agentName];\n\n // Agent not in this stack\n if (!agentConfig) {\n verbose(`Agent '${agentName}' not found in stack '${stack.id}'`);\n return [];\n }\n\n // Empty config {} means agent has no technology-specific skills\n if (typedKeys<Subcategory>(agentConfig).length === 0) {\n verbose(`Agent '${agentName}' has no technology config in stack '${stack.id}'`);\n return [];\n }\n\n const skillRefs: SkillReference[] = [];\n\n for (const [subcategory, technologyDisplayName] of typedEntries<Subcategory, SkillDisplayName>(\n agentConfig,\n )) {\n const fullSkillId = displayNameToId[technologyDisplayName];\n\n if (!fullSkillId) {\n verbose(\n `Warning: No skill found for display name '${technologyDisplayName}' (agent: ${agentName}, subcategory: ${subcategory}). Skipping.`,\n );\n continue;\n }\n\n const isKeySkill = KEY_SUBCATEGORIES.has(subcategory);\n\n skillRefs.push({\n id: fullSkillId,\n usage: `when working with ${subcategory}`,\n preloaded: isKeySkill,\n });\n }\n\n verbose(`Resolved ${skillRefs.length} skills for agent '${agentName}' from stack '${stack.id}'`);\n\n return skillRefs;\n}\n\n// Priority: explicit agentConfig.skills > stack-based skills\nexport async function getAgentSkills(\n agentName: AgentName,\n agentConfig: CompileAgentConfig,\n stack?: Stack,\n displayNameToId?: Partial<Record<SkillDisplayName, SkillId>>,\n): Promise<SkillReference[]> {\n // Priority 1: Explicit skills in compile config\n if (agentConfig.skills && agentConfig.skills.length > 0) {\n return agentConfig.skills;\n }\n\n // Priority 2: Stack-based skills (Phase 7)\n if (stack && displayNameToId) {\n const stackSkills = resolveAgentSkillsFromStack(agentName, stack, displayNameToId);\n if (stackSkills.length > 0) {\n verbose(`Resolved ${stackSkills.length} skills from stack for ${agentName}`);\n return stackSkills;\n }\n }\n\n // No skills defined for this agent\n return [];\n}\n\nexport async function resolveAgents(\n agents: Record<AgentName, AgentDefinition>,\n skills: Record<SkillId, SkillDefinition>,\n compileConfig: CompileConfig,\n _projectRoot: string,\n stack?: Stack,\n displayNameToId?: Partial<Record<SkillDisplayName, SkillId>>,\n): Promise<Record<AgentName, AgentConfig>> {\n const resolved: Record<AgentName, AgentConfig> = {} as Record<AgentName, AgentConfig>;\n const agentNames = typedKeys<AgentName>(compileConfig.agents);\n\n for (const agentName of agentNames) {\n const definition = agents[agentName];\n if (!definition) {\n const availableAgents = typedKeys<AgentName>(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(agentName, agentConfig, stack, displayNameToId);\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 sourceRoot: definition.sourceRoot,\n agentBaseDir: definition.agentBaseDir,\n };\n }\n\n return resolved;\n}\n\nexport function stackToCompileConfig(stackId: string, stack: ProjectConfig): CompileConfig {\n const agents: Record<AgentName, CompileAgentConfig> = {} as Record<AgentName, 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 stack: stackId,\n agents,\n };\n}\n","import { parse as parseYaml } from \"yaml\";\n\n// Extract and parse YAML frontmatter from a markdown string.\n// Returns the parsed YAML object, or null if no valid frontmatter found.\nexport function 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","import { spawn } from \"child_process\";\nimport { warn } from \"./logger\";\n\nexport type ExecResult = {\n stdout: string;\n stderr: string;\n exitCode: number;\n};\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\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\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\nexport type MarketplaceInfo = {\n name: string;\n source: string;\n repo?: string;\n path?: string;\n};\n\nexport async function claudePluginMarketplaceList(): Promise<MarketplaceInfo[]> {\n try {\n const result = await execCommand(\"claude\", [\"plugin\", \"marketplace\", \"list\", \"--json\"], {});\n\n if (result.exitCode !== 0) {\n return [];\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(result.stdout);\n } catch {\n warn(\"Failed to parse marketplace list output as JSON\");\n return [];\n }\n\n if (!Array.isArray(parsed)) {\n warn(\"Unexpected marketplace list format — expected an array\");\n return [];\n }\n\n return parsed as MarketplaceInfo[];\n } catch {\n return [];\n }\n}\n\nexport async function claudePluginMarketplaceExists(name: string): Promise<boolean> {\n const marketplaces = await claudePluginMarketplaceList();\n return marketplaces.some((m) => m.name === name);\n}\n\nexport async function claudePluginMarketplaceAdd(githubRepo: string, name: string): Promise<void> {\n const args = [\"plugin\", \"marketplace\", \"add\", githubRepo, \"--name\", name];\n let result;\n try {\n result = await execCommand(\"claude\", args, {});\n } catch (err) {\n throw new Error(\n `Failed to add marketplace: ${err instanceof Error ? err.message : \"Unknown error\"}`,\n );\n }\n\n if (result.exitCode !== 0) {\n const errorMessage = result.stderr || result.stdout || \"Unknown error\";\n if (errorMessage.includes(\"already installed\")) {\n return;\n }\n throw new Error(`Failed to add marketplace: ${errorMessage.trim()}`);\n }\n}\n\nexport async function claudePluginUninstall(\n pluginName: string,\n scope: \"project\" | \"user\",\n projectDir: string,\n): Promise<void> {\n const args = [\"plugin\", \"uninstall\", pluginName, \"--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 // Ignore \"not installed\" errors - plugin may already be removed\n if (errorMessage.includes(\"not installed\") || errorMessage.includes(\"not found\")) {\n return;\n }\n throw new Error(`Plugin uninstall failed: ${errorMessage.trim()}`);\n }\n}\n","import path from \"path\";\nimport { readFile, writeFile } from \"../../utils/fs\";\nimport { PLUGIN_MANIFEST_DIR, PLUGIN_MANIFEST_FILE, DEFAULT_VERSION } from \"../../consts\";\nimport { pluginManifestSchema } from \"../schemas\";\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(pluginDir: string, type: VersionBumpType): Promise<string> {\n const manifestPath = path.join(pluginDir, PLUGIN_MANIFEST_DIR, PLUGIN_MANIFEST_FILE);\n const content = await readFile(manifestPath);\n const manifest = pluginManifestSchema.parse(JSON.parse(content));\n\n const [major, minor, patch] = parseVersion(manifest.version || DEFAULT_VERSION);\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(pluginDir, PLUGIN_MANIFEST_DIR, PLUGIN_MANIFEST_FILE);\n const content = await readFile(manifestPath);\n const manifest = pluginManifestSchema.parse(JSON.parse(content));\n return manifest.version || DEFAULT_VERSION;\n}\n","import { z } from \"zod\";\nimport path from \"path\";\nimport fg from \"fast-glob\";\nimport { fileExists, readFile, directoryExists, listDirectories } from \"../../utils/fs\";\nimport type { ValidationResult } from \"../../types\";\nimport { countBy } from \"remeda\";\nimport { extractFrontmatter } from \"../../utils/frontmatter\";\nimport {\n pluginAuthorSchema,\n hooksRecordSchema,\n skillFrontmatterValidationSchema,\n agentFrontmatterValidationSchema,\n} from \"../schemas\";\n\nconst PLUGIN_DIR = \".claude-plugin\";\nconst PLUGIN_MANIFEST = \"plugin.json\";\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\n// Strict schema that rejects unrecognized keys (loader schema in schemas.ts uses .passthrough())\nconst pluginManifestValidationSchema = z\n .object({\n name: z.string(),\n version: z.string().optional(),\n description: z.string().optional(),\n author: pluginAuthorSchema.optional(),\n keywords: z.array(z.string()).optional(),\n commands: z.union([z.string(), z.array(z.string())]).optional(),\n agents: z.union([z.string(), z.array(z.string())]).optional(),\n skills: z.union([z.string(), z.array(z.string())]).optional(),\n hooks: z.union([z.string(), hooksRecordSchema]).optional(),\n })\n .strict();\n\nfunction formatZodErrors(error: z.ZodError): string[] {\n return error.issues.map((issue) => {\n const path = issue.path.join(\".\");\n if (issue.code === \"unrecognized_keys\") {\n return `Unrecognized key: \"${issue.keys.join('\", \"')}\"`;\n }\n return path ? `${path}: ${issue.message}` : issue.message;\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(pluginPath: string): 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(manifestPath: string): 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 result = pluginManifestValidationSchema.safeParse(manifest);\n\n if (!result.success) {\n errors.push(...formatZodErrors(result.error));\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 errors.push(\n `version \"${manifest.version}\" is not valid semver (expected: major.minor.patch)`,\n );\n }\n }\n\n if (!manifest.description) {\n warnings.push(\"Missing description field (recommended for discoverability)\");\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(skillPath: string): 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 result = skillFrontmatterValidationSchema.safeParse(frontmatter);\n\n if (!result.success) {\n errors.push(...formatZodErrors(result.error));\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings,\n };\n}\n\nexport async function validateAgentFrontmatter(agentPath: string): 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 result = agentFrontmatterValidationSchema.safeParse(frontmatter);\n\n if (!result.success) {\n errors.push(...formatZodErrors(result.error));\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(pluginPath: string): 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(...skillResult.errors.map((e) => `${relativePath}: ${e}`));\n }\n warnings.push(...skillResult.warnings.map((w) => `${relativePath}: ${w}`));\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(`Agents directory exists but contains no .md files: ${manifest.agents}`);\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(...agentResult.errors.map((e) => `${relativePath}: ${e}`));\n }\n warnings.push(...agentResult.warnings.map((w) => `${relativePath}: ${w}`));\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: countBy(results, (r) => String(r.result.valid))[\"true\"] ?? 0,\n invalid: countBy(results, (r) => String(r.result.valid))[\"false\"] ?? 0,\n withWarnings: countBy(results, (r) => String(r.result.warnings.length > 0))[\"true\"] ?? 0,\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 path from \"path\";\nimport { fileURLToPath } from \"url\";\nimport { parse as parseYaml } from \"yaml\";\nimport { readFile, fileExists } from \"../../utils/fs\";\nimport { verbose, warn } from \"../../utils/logger\";\nimport { defaultMappingsSchema } from \"../schemas\";\n\nexport type DefaultMappings = {\n skill_to_agents: Record<string, string[]>;\n preloaded_skills: Record<string, string[]>;\n subcategory_aliases: Record<string, string>;\n};\n\n// Cached defaults (loaded once per process)\nlet cachedDefaults: DefaultMappings | null = null;\n\nfunction getDefaultsPath(): string {\n const currentDir = path.dirname(fileURLToPath(import.meta.url));\n\n // Navigate from lib/loading/ to defaults/\n return path.join(currentDir, \"../..\", \"defaults\", \"agent-mappings.yaml\");\n}\n\nexport async function loadDefaultMappings(): Promise<DefaultMappings | null> {\n if (cachedDefaults !== null) {\n return cachedDefaults;\n }\n\n const defaultsPath = getDefaultsPath();\n\n if (!(await fileExists(defaultsPath))) {\n verbose(`Default mappings file not found at ${defaultsPath}`);\n return null;\n }\n\n try {\n const content = await readFile(defaultsPath);\n const parsed = parseYaml(content);\n const result = defaultMappingsSchema.safeParse(parsed);\n\n if (!result.success) {\n warn(`Invalid default mappings at ${defaultsPath}: ${result.error.message}`);\n return null;\n }\n\n verbose(`Loaded default mappings from ${defaultsPath}`);\n cachedDefaults = result.data;\n return cachedDefaults;\n } catch (error) {\n verbose(`Failed to parse default mappings: ${error}`);\n return null;\n }\n}\n\n// Returns null if loadDefaultMappings() hasn't been called yet\nexport function getCachedDefaults(): DefaultMappings | null {\n return cachedDefaults;\n}\n\nexport function clearDefaultsCache(): void {\n cachedDefaults = null;\n}\n","import path from \"path\";\nimport { parse as parseYaml } from \"yaml\";\nimport { readFile, writeFile, ensureDir, glob, fileExists, copy } from \"../../utils/fs\";\nimport { verbose, warn } from \"../../utils/logger\";\nimport {\n generateSkillPluginManifest,\n writePluginManifest,\n getPluginManifestPath,\n} from \"../plugins\";\nimport { parseFrontmatter } from \"../loading\";\nimport { hashSkillFolder, determinePluginVersion, writeContentHash } from \"../versioning\";\nimport type { PluginManifest, SkillFrontmatter, SkillMetadataConfig } from \"../../types\";\nimport { skillMetadataLoaderSchema } from \"../schemas\";\n\nexport type SkillPluginOptions = {\n skillPath: string;\n outputDir: string;\n skillName?: string;\n};\n\nexport type CompiledSkillPlugin = {\n pluginPath: string;\n manifest: PluginManifest;\n skillName: string;\n};\n\nconst SKILL_FILES = [\"SKILL.md\", \"reference.md\"] as const;\n\nconst SKILL_DIRS = [\"examples\", \"scripts\"] as const;\n\nfunction sanitizeSkillName(name: string): string {\n return name.replace(/\\+/g, \"-\");\n}\n\nasync function readSkillMetadata(skillPath: string): 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 const result = skillMetadataLoaderSchema.safeParse(parseYaml(yamlContent));\n if (!result.success) {\n warn(\n `Invalid metadata.yaml at ${skillPath}: ${result.error.issues.map((i) => `${i.path.join(\".\")}: ${i.message}`).join(\"; \")}`,\n );\n return null;\n }\n return result.data;\n } catch (error) {\n warn(`Failed to read metadata.yaml at ${skillPath}: ${error}`);\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\": [\"${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 // Use directory basename for initial error messages before frontmatter is parsed\n const dirBasename = path.basename(skillPath);\n\n const skillMdPath = path.join(skillPath, \"SKILL.md\");\n if (!(await fileExists(skillMdPath))) {\n throw new Error(\n `Skill '${dirBasename}' is missing required SKILL.md file. Expected at: ${skillMdPath}`,\n );\n }\n\n const skillMdContent = await readFile(skillMdPath);\n const frontmatter = parseFrontmatter(skillMdContent, skillMdPath);\n\n if (!frontmatter) {\n throw new Error(\n `Skill '${dirBasename}' has invalid or missing YAML frontmatter in SKILL.md. ` +\n `Required fields: 'name' and 'description'. File: ${skillMdPath}`,\n );\n }\n\n // Use frontmatter.name as the canonical skill name (source of truth)\n // Override name takes precedence if explicitly provided\n const skillName = overrideName ?? sanitizeSkillName(frontmatter.name);\n\n verbose(`Compiling skill plugin: ${skillName} from ${skillPath}`);\n\n const metadata = await readSkillMetadata(skillPath);\n\n const pluginDir = path.join(outputDir, skillName);\n const skillsDir = path.join(pluginDir, \"skills\", skillName);\n\n await ensureDir(pluginDir);\n await ensureDir(skillsDir);\n\n const newHash = await hashSkillFolder(skillPath);\n const { version, contentHash } = await determinePluginVersion(\n newHash,\n pluginDir,\n getPluginManifestPath,\n );\n\n const manifest = generateSkillPluginManifest({\n skillName,\n description: frontmatter.description,\n author: metadata?.author,\n version,\n keywords: metadata?.tags,\n });\n\n await writePluginManifest(pluginDir, manifest);\n\n await writeContentHash(pluginDir, contentHash, getPluginManifestPath);\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 for (const skillMdFile of skillMdFiles) {\n const skillPath = path.join(skillsDir, path.dirname(skillMdFile));\n\n try {\n // compileSkillPlugin uses frontmatter.name as the canonical skill name\n const result = await compileSkillPlugin({\n skillPath,\n outputDir,\n });\n results.push(result);\n console.log(` [OK] ${result.skillName}`);\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n const dirBasename = path.basename(skillPath);\n console.warn(` [WARN] Failed to compile skill from ${dirBasename}: ${errorMessage}`);\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(` - ${result.skillName} (v${result.manifest.version})`);\n }\n}\n","import { parse as parseYaml } from \"yaml\";\nimport path from \"path\";\nimport { directoryExists, listDirectories, fileExists, readFile } from \"../../utils/fs\";\nimport { verbose, warn } from \"../../utils/logger\";\nimport { LOCAL_SKILLS_PATH } from \"../../consts\";\nimport { parseFrontmatter } from \"../loading\";\nimport type { CategoryPath, ExtractedSkillMetadata, SkillId } from \"../../types\";\nimport { localRawMetadataSchema } from \"../schemas\";\n\nconst LOCAL_CATEGORY: CategoryPath = \"local\";\nconst LOCAL_AUTHOR = \"@local\";\n\ntype LocalRawMetadata = {\n cli_name: string;\n cli_description?: string;\n /** Original skill category from source (e.g., \"framework\", \"styling\", \"api\") */\n category?: CategoryPath;\n category_exclusive?: boolean;\n usage_guidance?: string;\n tags?: string[];\n compatible_with?: SkillId[];\n conflicts_with?: SkillId[];\n requires?: SkillId[];\n requires_setup?: SkillId[];\n provides_setup_for?: SkillId[];\n};\n\nexport type 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 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 parsed = localRawMetadataSchema.safeParse(parseYaml(metadataContent));\n\n if (!parsed.success) {\n warn(\n `Skipping local skill '${skillDirName}': Invalid metadata.yaml — ${parsed.error.issues.map((i) => `${i.path.join(\".\")}: ${i.message}`).join(\"; \")}`,\n );\n return null;\n }\n\n const metadata = parsed.data as LocalRawMetadata;\n\n if (!metadata.cli_name) {\n warn(`Skipping local skill '${skillDirName}': Missing required 'cli_name' in metadata.yaml`);\n return null;\n }\n\n const skillMdContent = await readFile(skillMdPath);\n const frontmatter = parseFrontmatter(skillMdContent, skillMdPath);\n\n if (!frontmatter) {\n warn(`Skipping local skill '${skillDirName}': Invalid SKILL.md frontmatter`);\n return null;\n }\n\n const relativePath = `${LOCAL_SKILLS_PATH}/${skillDirName}/`;\n const skillId = frontmatter.name;\n\n // Use category from metadata.yaml if available (preserved from source skill),\n // otherwise fall back to generic \"local\" category\n const category = metadata.category || LOCAL_CATEGORY;\n\n if (!metadata.category) {\n warn(\n `Local skill '${skillDirName}' has no category in metadata.yaml — defaulting to '${LOCAL_CATEGORY}' (will not appear in wizard domain views)`,\n );\n }\n\n const extracted: ExtractedSkillMetadata = {\n id: skillId,\n directoryPath: skillDirName,\n description: metadata.cli_description || frontmatter.description,\n usageGuidance: metadata.usage_guidance,\n category,\n categoryExclusive: metadata.category_exclusive ?? false,\n author: LOCAL_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: 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 { copy, directoryExists, ensureDir, remove } from \"../../utils/fs\";\nimport { verbose, warn } from \"../../utils/logger\";\nimport { LOCAL_SKILLS_PATH, ARCHIVED_SKILLS_DIR_NAME } from \"../../consts\";\nimport type { SkillId } from \"../../types\";\n\n/**\n * Archive a local skill to .claude/skills/_archived/{skill-id}/\n * Preserves user's work before switching to a different source.\n */\nexport async function archiveLocalSkill(projectDir: string, skillId: SkillId): Promise<void> {\n const skillPath = path.join(projectDir, LOCAL_SKILLS_PATH, skillId);\n const archivedDir = path.join(projectDir, LOCAL_SKILLS_PATH, ARCHIVED_SKILLS_DIR_NAME);\n const archivedSkillPath = path.join(archivedDir, skillId);\n\n if (!(await directoryExists(skillPath))) {\n warn(`Skill directory not found for archiving: ${skillPath}`);\n return;\n }\n\n await ensureDir(archivedDir);\n await copy(skillPath, archivedSkillPath);\n await remove(skillPath);\n\n verbose(`Archived local skill '${skillId}' to ${ARCHIVED_SKILLS_DIR_NAME}/`);\n}\n\n/**\n * Restore a previously archived skill from .claude/skills/_archived/{skill-id}/\n * Returns true if found and restored, false if no archive exists.\n */\nexport async function restoreArchivedSkill(projectDir: string, skillId: SkillId): Promise<boolean> {\n const skillPath = path.join(projectDir, LOCAL_SKILLS_PATH, skillId);\n const archivedSkillPath = path.join(\n projectDir,\n LOCAL_SKILLS_PATH,\n ARCHIVED_SKILLS_DIR_NAME,\n skillId,\n );\n\n if (!(await directoryExists(archivedSkillPath))) {\n return false;\n }\n\n await copy(archivedSkillPath, skillPath);\n await remove(archivedSkillPath);\n\n verbose(`Restored archived skill '${skillId}' from ${ARCHIVED_SKILLS_DIR_NAME}/`);\n return true;\n}\n\n/**\n * Check if an archived version of a skill exists.\n */\nexport async function hasArchivedSkill(projectDir: string, skillId: SkillId): Promise<boolean> {\n const archivedSkillPath = path.join(\n projectDir,\n LOCAL_SKILLS_PATH,\n ARCHIVED_SKILLS_DIR_NAME,\n skillId,\n );\n\n return directoryExists(archivedSkillPath);\n}\n","import { difference } from \"remeda\";\nimport type { ProjectConfig } from \"../../types\";\nimport { loadProjectConfig } from \"./project-config\";\nimport { loadProjectSourceConfig } from \"./config\";\n\nexport type MergeContext = {\n projectDir: string;\n};\n\nexport type MergeResult = {\n config: ProjectConfig;\n merged: boolean;\n existingConfigPath?: string;\n};\n\n// Existing values take precedence for identity fields; arrays are unioned; stack is deep-merged\nexport async function mergeWithExistingConfig(\n newConfig: ProjectConfig,\n context: MergeContext,\n): Promise<MergeResult> {\n // Clone to avoid mutating the input\n const localConfig = { ...newConfig };\n\n const existingFullConfig = await loadProjectConfig(context.projectDir);\n if (existingFullConfig) {\n const existingConfig = existingFullConfig.config;\n\n // Keep existing name if present\n if (existingConfig.name) {\n localConfig.name = existingConfig.name;\n }\n\n // Keep existing description if present\n if (existingConfig.description) {\n localConfig.description = existingConfig.description;\n }\n\n // Keep existing source if present (don't overwrite user's source)\n if (existingConfig.source) {\n localConfig.source = existingConfig.source;\n }\n\n // Merge agents arrays (union of existing + new)\n if (existingConfig.agents && existingConfig.agents.length > 0) {\n const newAgentIds = difference(localConfig.agents, existingConfig.agents);\n localConfig.agents = [...existingConfig.agents, ...newAgentIds];\n }\n\n // Deep merge stack (existing agent configs take precedence)\n if (existingConfig.stack) {\n const mergedStack = { ...localConfig.stack };\n for (const [agentId, agentConfig] of Object.entries(existingConfig.stack)) {\n mergedStack[agentId] = { ...mergedStack[agentId], ...agentConfig };\n }\n localConfig.stack = mergedStack;\n }\n\n // Keep existing author if present\n if (existingConfig.author) {\n localConfig.author = existingConfig.author;\n }\n\n // Keep existing agents_source if present\n if (existingConfig.agents_source) {\n localConfig.agents_source = existingConfig.agents_source;\n }\n\n // Keep existing marketplace if present\n if (existingConfig.marketplace) {\n localConfig.marketplace = existingConfig.marketplace;\n }\n\n return {\n config: localConfig,\n merged: true,\n existingConfigPath: existingFullConfig.configPath,\n };\n }\n\n // No existing full config, try simple project source config for author/agents_source\n const existingProjectConfig = await loadProjectSourceConfig(context.projectDir);\n if (existingProjectConfig?.author) {\n localConfig.author = existingProjectConfig.author;\n }\n if (existingProjectConfig?.agents_source) {\n localConfig.agents_source = existingProjectConfig.agents_source;\n }\n\n return { config: localConfig, merged: false };\n}\n","import path from \"path\";\nimport { parse as parseYaml } from \"yaml\";\nimport { readFile, fileExists } from \"../../utils/fs\";\nimport { verbose, warn } from \"../../utils/logger\";\nimport { CLAUDE_DIR, CLAUDE_SRC_DIR } from \"../../consts\";\nimport type { ProjectConfig, ValidationResult } from \"../../types\";\nimport { projectConfigLoaderSchema } from \"../schemas\";\n\nconst CONFIG_PATH = `${CLAUDE_SRC_DIR}/config.yaml`;\nconst LEGACY_CONFIG_PATH = `${CLAUDE_DIR}/config.yaml`;\n\nexport type LoadedProjectConfig = {\n config: ProjectConfig;\n configPath: string;\n};\n\nexport async function loadProjectConfig(projectDir: string): Promise<LoadedProjectConfig | null> {\n // Check .claude-src/config.yaml first (new location)\n const srcConfigPath = path.join(projectDir, CONFIG_PATH);\n // Fall back to .claude/config.yaml (legacy location)\n const legacyConfigPath = path.join(projectDir, LEGACY_CONFIG_PATH);\n\n let configPath = srcConfigPath;\n if (!(await fileExists(srcConfigPath))) {\n if (await fileExists(legacyConfigPath)) {\n configPath = legacyConfigPath;\n verbose(`Using legacy config location: ${legacyConfigPath}`);\n } else {\n verbose(`Project config not found at ${srcConfigPath} or ${legacyConfigPath}`);\n return null;\n }\n }\n\n try {\n const content = await readFile(configPath);\n const parsed = parseYaml(content);\n\n if (!parsed || typeof parsed !== \"object\") {\n warn(`Invalid project config structure at ${configPath}`);\n return null;\n }\n\n const result = projectConfigLoaderSchema.safeParse(parsed);\n if (!result.success) {\n warn(`Invalid project config at ${configPath}: ${result.error.message}`);\n return null;\n }\n\n const config = result.data as ProjectConfig;\n if (!config.name) {\n warn(\n `Project config at ${configPath} is missing required 'name' field — defaulting to directory name`,\n );\n config.name = path.basename(projectDir);\n }\n if (!config.skills) {\n warn(`Project config at ${configPath} is missing 'skills' array — defaulting to empty`);\n config.skills = [];\n }\n\n verbose(`Loaded project config from ${configPath}`);\n return {\n config,\n configPath,\n };\n } catch (error) {\n warn(`Failed to parse project config at ${configPath}: ${error}`);\n return null;\n }\n}\n\nexport function validateProjectConfig(config: unknown): ValidationResult {\n const errors: string[] = [];\n const warnings: string[] = [];\n\n if (!config || typeof config !== \"object\") {\n return { valid: false, errors: [\"Config must be an object\"], warnings: [] };\n }\n\n const c = config as Record<string, unknown>;\n\n // Required: name\n if (!c.name || typeof c.name !== \"string\") {\n errors.push(\"name is required and must be a string\");\n }\n\n // Required: agents (for compilation)\n if (!c.agents || !Array.isArray(c.agents)) {\n errors.push(\"agents is required and must be an array\");\n } else {\n for (const agent of c.agents) {\n if (typeof agent !== \"string\") {\n errors.push(`agents must contain strings, found: ${typeof agent}`);\n }\n }\n }\n\n // Optional: version\n if (c.version !== undefined && c.version !== \"1\") {\n errors.push('version must be \"1\" (or omitted for default)');\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings,\n };\n}\n","import path from \"path\";\nimport { parse as parseYaml, stringify as stringifyYaml } from \"yaml\";\nimport { fileExists, readFile, writeFile, ensureDir } from \"../../utils/fs\";\nimport { warn } from \"../../utils/logger\";\nimport { CLAUDE_SRC_DIR } from \"../../consts\";\nimport { projectSourceConfigSchema } from \"../schemas\";\n\nconst YAML_INDENT = 2;\n\nexport async function saveSourceToProjectConfig(projectDir: string, source: string): Promise<void> {\n const configPath = path.join(projectDir, CLAUDE_SRC_DIR, \"config.yaml\");\n\n let config: Record<string, unknown> = {};\n if (await fileExists(configPath)) {\n const content = await readFile(configPath);\n try {\n const parsed = parseYaml(content);\n const result = projectSourceConfigSchema.safeParse(parsed);\n config = result.success ? (result.data as Record<string, unknown>) : {};\n if (!result.success) {\n warn(\n `Invalid config at ${configPath}: ${result.error.issues.map((i) => i.message).join(\", \")}. Starting with empty config.`,\n );\n }\n } catch (error) {\n warn(\n `Failed to parse existing config at ${configPath}: ${error instanceof Error ? error.message : String(error)}. Starting with empty config.`,\n );\n }\n }\n\n config.source = source;\n\n await ensureDir(path.join(projectDir, CLAUDE_SRC_DIR));\n const configYaml = stringifyYaml(config, { indent: YAML_INDENT });\n await writeFile(configPath, configYaml);\n}\n"],"mappings":"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","names":["path","path","parseYaml","stringifyYaml","path","stringifyYaml","parseYaml","path","path","parseYaml","stringifyYaml","path","path","path","parseYaml","path","parseYaml","path","path","parseYaml","path","parseYaml","path","selectedSkill","path","path","PLUGIN_MANIFEST_FILE","path","path","path","path","path","skillId","path","path","path","stringifyYaml","parseYaml","path","path","parseYaml","path","path","path","parseYaml","path","unique","path","unique","path","path","stringifyYaml","path","path","z","path","countBy","z","path","countBy","verbose","path","path","parseYaml","path","parseYaml","path","parseYaml","parseYaml","path","path","parseYaml","path","path","path","parseYaml","path","parseYaml","path","parseYaml","stringifyYaml","YAML_INDENT","path","parseYaml","stringifyYaml","path"]}