@claude-collective/cli 0.2.0 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (190) hide show
  1. package/CHANGELOG.md +178 -0
  2. package/README.md +1 -1
  3. package/dist/chunk-3HBTELJN.js +114 -0
  4. package/dist/chunk-3HBTELJN.js.map +1 -0
  5. package/dist/chunk-3ZCB5K33.js +54 -0
  6. package/dist/chunk-3ZCB5K33.js.map +1 -0
  7. package/dist/chunk-66UDJBF6.js +96 -0
  8. package/dist/chunk-66UDJBF6.js.map +1 -0
  9. package/dist/chunk-6LS7XO3H.js +31 -0
  10. package/dist/chunk-6LS7XO3H.js.map +1 -0
  11. package/dist/chunk-A3J6IAXK.js +57 -0
  12. package/dist/chunk-A3J6IAXK.js.map +1 -0
  13. package/dist/chunk-A65SBAAJ.js +69 -0
  14. package/dist/chunk-A65SBAAJ.js.map +1 -0
  15. package/dist/chunk-ALEPJ6YN.js +80 -0
  16. package/dist/chunk-ALEPJ6YN.js.map +1 -0
  17. package/dist/chunk-C4ZTIYFR.js +84 -0
  18. package/dist/chunk-C4ZTIYFR.js.map +1 -0
  19. package/dist/chunk-CIY5UBRB.js +453 -0
  20. package/dist/chunk-CIY5UBRB.js.map +1 -0
  21. package/dist/chunk-DHET7RCE.js +50 -0
  22. package/dist/chunk-DHET7RCE.js.map +1 -0
  23. package/dist/chunk-DHFFRMF6.js +31 -0
  24. package/dist/chunk-DHFFRMF6.js.map +1 -0
  25. package/dist/chunk-DKGL77IY.js +307 -0
  26. package/dist/chunk-DKGL77IY.js.map +1 -0
  27. package/dist/chunk-ED73HCW2.js +315 -0
  28. package/dist/chunk-ED73HCW2.js.map +1 -0
  29. package/dist/chunk-FNOYEXUE.js +308 -0
  30. package/dist/chunk-FNOYEXUE.js.map +1 -0
  31. package/dist/chunk-G2FBJOZG.js +141 -0
  32. package/dist/chunk-G2FBJOZG.js.map +1 -0
  33. package/dist/chunk-HNDT5QRB.js +120 -0
  34. package/dist/chunk-HNDT5QRB.js.map +1 -0
  35. package/dist/chunk-K7PTOVX4.js +158 -0
  36. package/dist/chunk-K7PTOVX4.js.map +1 -0
  37. package/dist/chunk-LQTST4WY.js +91 -0
  38. package/dist/chunk-LQTST4WY.js.map +1 -0
  39. package/dist/chunk-LVKRVFYR.js +54 -0
  40. package/dist/chunk-LVKRVFYR.js.map +1 -0
  41. package/dist/chunk-M7YCPFIX.js +108 -0
  42. package/dist/chunk-M7YCPFIX.js.map +1 -0
  43. package/dist/chunk-MJSFR562.js +57 -0
  44. package/dist/chunk-MJSFR562.js.map +1 -0
  45. package/dist/chunk-MMDXNZPF.js +69 -0
  46. package/dist/chunk-MMDXNZPF.js.map +1 -0
  47. package/dist/chunk-MYAVQ23U.js +356 -0
  48. package/dist/chunk-MYAVQ23U.js.map +1 -0
  49. package/dist/chunk-NGBFJJ7Q.js +124 -0
  50. package/dist/chunk-NGBFJJ7Q.js.map +1 -0
  51. package/dist/chunk-OLBOTK3O.js +64 -0
  52. package/dist/chunk-OLBOTK3O.js.map +1 -0
  53. package/dist/chunk-PPNTD5LO.js +330 -0
  54. package/dist/chunk-PPNTD5LO.js.map +1 -0
  55. package/dist/chunk-Q2LH2DAB.js +392 -0
  56. package/dist/chunk-Q2LH2DAB.js.map +1 -0
  57. package/dist/chunk-Q6DR5QUH.js +547 -0
  58. package/dist/chunk-Q6DR5QUH.js.map +1 -0
  59. package/dist/chunk-QESUUPOE.js +241 -0
  60. package/dist/chunk-QESUUPOE.js.map +1 -0
  61. package/dist/chunk-QGGSLMO3.js +607 -0
  62. package/dist/chunk-QGGSLMO3.js.map +1 -0
  63. package/dist/chunk-SEBPPFUW.js +478 -0
  64. package/dist/chunk-SEBPPFUW.js.map +1 -0
  65. package/dist/chunk-SYQ7R2JO.js +95 -0
  66. package/dist/chunk-SYQ7R2JO.js.map +1 -0
  67. package/dist/chunk-TOPAIL5W.js +22 -0
  68. package/dist/chunk-TOPAIL5W.js.map +1 -0
  69. package/dist/chunk-U4VYHKPM.js +110 -0
  70. package/dist/chunk-U4VYHKPM.js.map +1 -0
  71. package/dist/chunk-UOWHJ6BE.js +83 -0
  72. package/dist/chunk-UOWHJ6BE.js.map +1 -0
  73. package/dist/chunk-XKEG3SCV.js +86 -0
  74. package/dist/chunk-XKEG3SCV.js.map +1 -0
  75. package/dist/chunk-XY3XDVMI.js +15599 -0
  76. package/dist/chunk-XY3XDVMI.js.map +1 -0
  77. package/dist/chunk-Y3V43XCU.js +76 -0
  78. package/dist/chunk-Y3V43XCU.js.map +1 -0
  79. package/dist/chunk-YKXBGCFD.js +129 -0
  80. package/dist/chunk-YKXBGCFD.js.map +1 -0
  81. package/dist/cli-v2/defaults/agent-mappings.yaml +185 -0
  82. package/dist/commands/build/marketplace.js +254 -0
  83. package/dist/commands/build/marketplace.js.map +1 -0
  84. package/dist/commands/build/plugins.js +324 -0
  85. package/dist/commands/build/plugins.js.map +1 -0
  86. package/dist/commands/build/stack.js +169 -0
  87. package/dist/commands/build/stack.js.map +1 -0
  88. package/dist/commands/compile.js +461 -0
  89. package/dist/commands/compile.js.map +1 -0
  90. package/dist/commands/config/get.js +60 -0
  91. package/dist/commands/config/get.js.map +1 -0
  92. package/dist/commands/config/index.js +22 -0
  93. package/dist/commands/config/index.js.map +1 -0
  94. package/dist/commands/config/path.js +35 -0
  95. package/dist/commands/config/path.js.map +1 -0
  96. package/dist/commands/config/set-project.js +61 -0
  97. package/dist/commands/config/set-project.js.map +1 -0
  98. package/dist/commands/config/set.js +60 -0
  99. package/dist/commands/config/set.js.map +1 -0
  100. package/dist/commands/config/show.js +13 -0
  101. package/dist/commands/config/show.js.map +1 -0
  102. package/dist/commands/config/unset-project.js +57 -0
  103. package/dist/commands/config/unset-project.js.map +1 -0
  104. package/dist/commands/config/unset.js +56 -0
  105. package/dist/commands/config/unset.js.map +1 -0
  106. package/dist/commands/diff.js +755 -0
  107. package/dist/commands/diff.js.map +1 -0
  108. package/dist/commands/doctor.js +413 -0
  109. package/dist/commands/doctor.js.map +1 -0
  110. package/dist/commands/edit.js +254 -0
  111. package/dist/commands/edit.js.map +1 -0
  112. package/dist/commands/eject.js +208 -0
  113. package/dist/commands/eject.js.map +1 -0
  114. package/dist/commands/info.js +205 -0
  115. package/dist/commands/info.js.map +1 -0
  116. package/dist/commands/init.js +915 -0
  117. package/dist/commands/init.js.map +1 -0
  118. package/dist/commands/list.js +44 -0
  119. package/dist/commands/list.js.map +1 -0
  120. package/dist/commands/new/agent.js +230 -0
  121. package/dist/commands/new/agent.js.map +1 -0
  122. package/dist/commands/new/skill.js +204 -0
  123. package/dist/commands/new/skill.js.map +1 -0
  124. package/dist/commands/outdated.js +242 -0
  125. package/dist/commands/outdated.js.map +1 -0
  126. package/dist/commands/search.js +115 -0
  127. package/dist/commands/search.js.map +1 -0
  128. package/dist/commands/test-imports.js +92 -0
  129. package/dist/commands/test-imports.js.map +1 -0
  130. package/dist/commands/uninstall.js +309 -0
  131. package/dist/commands/uninstall.js.map +1 -0
  132. package/dist/commands/update.js +428 -0
  133. package/dist/commands/update.js.map +1 -0
  134. package/dist/commands/validate.js +375 -0
  135. package/dist/commands/validate.js.map +1 -0
  136. package/dist/commands/version/bump.js +95 -0
  137. package/dist/commands/version/bump.js.map +1 -0
  138. package/dist/commands/version/index.js +70 -0
  139. package/dist/commands/version/index.js.map +1 -0
  140. package/dist/commands/version/set.js +101 -0
  141. package/dist/commands/version/set.js.map +1 -0
  142. package/dist/commands/version/show.js +70 -0
  143. package/dist/commands/version/show.js.map +1 -0
  144. package/dist/components/common/confirm.js +9 -0
  145. package/dist/components/common/confirm.js.map +1 -0
  146. package/dist/components/common/message.js +24 -0
  147. package/dist/components/common/message.js.map +1 -0
  148. package/dist/components/common/spinner.js +14 -0
  149. package/dist/components/common/spinner.js.map +1 -0
  150. package/dist/components/wizard/category-grid.js +9 -0
  151. package/dist/components/wizard/category-grid.js.map +1 -0
  152. package/dist/components/wizard/category-grid.test.js +728 -0
  153. package/dist/components/wizard/category-grid.test.js.map +1 -0
  154. package/dist/components/wizard/section-progress.js +9 -0
  155. package/dist/components/wizard/section-progress.js.map +1 -0
  156. package/dist/components/wizard/section-progress.test.js +281 -0
  157. package/dist/components/wizard/section-progress.test.js.map +1 -0
  158. package/dist/components/wizard/step-approach.js +11 -0
  159. package/dist/components/wizard/step-approach.js.map +1 -0
  160. package/dist/components/wizard/step-build.js +15 -0
  161. package/dist/components/wizard/step-build.js.map +1 -0
  162. package/dist/components/wizard/step-build.test.js +729 -0
  163. package/dist/components/wizard/step-build.test.js.map +1 -0
  164. package/dist/components/wizard/step-confirm.js +9 -0
  165. package/dist/components/wizard/step-confirm.js.map +1 -0
  166. package/dist/components/wizard/step-refine.js +9 -0
  167. package/dist/components/wizard/step-refine.js.map +1 -0
  168. package/dist/components/wizard/step-refine.test.js +235 -0
  169. package/dist/components/wizard/step-refine.test.js.map +1 -0
  170. package/dist/components/wizard/step-stack-options.js +11 -0
  171. package/dist/components/wizard/step-stack-options.js.map +1 -0
  172. package/dist/components/wizard/step-stack.js +11 -0
  173. package/dist/components/wizard/step-stack.js.map +1 -0
  174. package/dist/components/wizard/wizard-tabs.js +11 -0
  175. package/dist/components/wizard/wizard-tabs.js.map +1 -0
  176. package/dist/components/wizard/wizard.js +20 -0
  177. package/dist/components/wizard/wizard.js.map +1 -0
  178. package/dist/hooks/init.js +41 -0
  179. package/dist/hooks/init.js.map +1 -0
  180. package/dist/index.js +10 -0
  181. package/dist/index.js.map +1 -0
  182. package/dist/magic-string.es-RGXYGAW3.js +1316 -0
  183. package/dist/magic-string.es-RGXYGAW3.js.map +1 -0
  184. package/dist/stores/wizard-store.js +10 -0
  185. package/dist/stores/wizard-store.js.map +1 -0
  186. package/dist/stores/wizard-store.test.js +405 -0
  187. package/dist/stores/wizard-store.test.js.map +1 -0
  188. package/package.json +44 -25
  189. package/dist/cli/index.js +0 -6314
  190. package/dist/cli/index.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/cli-v2/commands/init.tsx","../../src/cli-v2/lib/permission-checker.tsx","../../src/cli-v2/lib/stack-installer.ts","../../src/cli-v2/lib/config-generator.ts","../../src/cli-v2/lib/skill-agent-mappings.ts","../../src/cli-v2/lib/defaults-loader.ts"],"sourcesContent":["/**\n * Initialize Claude Collective in this project.\n *\n * Interactive wizard to select skills and configure installation mode.\n * Supports both Plugin Mode (native install) and Local Mode (copy to .claude/).\n */\nimport { Flags } from \"@oclif/core\";\nimport { render, Text } from \"ink\";\nimport React from \"react\";\nimport path from \"path\";\nimport { stringify as stringifyYaml } from \"yaml\";\nimport { BaseCommand } from \"../base-command.js\";\nimport { Wizard, type WizardResult } from \"../components/wizard/wizard.js\";\nimport {\n loadSkillsMatrixFromSource,\n type SourceLoadResult,\n} from \"../lib/source-loader.js\";\nimport { formatSourceOrigin } from \"../lib/config.js\";\nimport { copySkillsToLocalFlattened } from \"../lib/skill-copier.js\";\nimport { checkPermissions } from \"../lib/permission-checker.js\";\nimport { loadAllAgents } from \"../lib/loader.js\";\nimport { loadStackById } from \"../lib/stacks-loader.js\";\nimport {\n resolveAgents,\n resolveStackSkills,\n resolveAgentSkillsFromStack,\n} from \"../lib/resolver.js\";\nimport { compileAgentForPlugin } from \"../lib/stack-plugin-compiler.js\";\nimport { installStackAsPlugin } from \"../lib/stack-installer.js\";\nimport { getCollectivePluginDir } from \"../lib/plugin-finder.js\";\nimport { createLiquidEngine } from \"../lib/compiler.js\";\nimport {\n generateProjectConfigFromSkills,\n buildStackProperty,\n} from \"../lib/config-generator.js\";\nimport {\n claudePluginMarketplaceExists,\n claudePluginMarketplaceAdd,\n} from \"../utils/exec.js\";\nimport { ensureDir, writeFile, directoryExists } from \"../utils/fs.js\";\nimport { LOCAL_SKILLS_PATH, PROJECT_ROOT } from \"../consts.js\";\nimport { EXIT_CODES } from \"../lib/exit-codes.js\";\nimport type {\n CompileConfig,\n CompileAgentConfig,\n StackConfig,\n ProjectConfig,\n} from \"../../types.js\";\n\nconst PLUGIN_NAME = \"claude-collective\";\n\nexport default class Init extends BaseCommand {\n static summary = \"Initialize Claude Collective in this project\";\n static description =\n \"Interactive wizard to set up skills and agents. Supports Plugin Mode (native install) and Local Mode (copy to .claude/).\";\n\n static flags = {\n ...BaseCommand.baseFlags,\n refresh: Flags.boolean({\n description: \"Force refresh from remote source\",\n default: false,\n }),\n };\n\n async run(): Promise<void> {\n const { flags } = await this.parse(Init);\n const projectDir = process.cwd();\n\n this.log(\"Claude Collective Setup\\n\");\n\n if (flags[\"dry-run\"]) {\n this.log(\"[dry-run] Preview mode - no files will be created\\n\");\n }\n\n // Check if already initialized\n const pluginDir = getCollectivePluginDir();\n const pluginExists = await directoryExists(pluginDir);\n\n if (pluginExists) {\n this.warn(`Claude Collective is already initialized at ${pluginDir}`);\n this.log(`Use 'cc edit' to modify skills.`);\n this.log(\"No changes made.\");\n return;\n }\n\n // Load skills matrix\n this.log(\"Loading skills matrix...\");\n let sourceResult: SourceLoadResult;\n try {\n sourceResult = await loadSkillsMatrixFromSource({\n sourceFlag: flags.source,\n projectDir,\n forceRefresh: flags.refresh,\n });\n\n const sourceInfo = sourceResult.isLocal\n ? \"local\"\n : formatSourceOrigin(sourceResult.sourceConfig.sourceOrigin);\n this.log(\n `Loaded ${Object.keys(sourceResult.matrix.skills).length} skills (${sourceInfo})\\n`,\n );\n } catch (error) {\n this.error(\n error instanceof Error ? error.message : \"Unknown error occurred\",\n { exit: EXIT_CODES.ERROR },\n );\n }\n\n // Store result from wizard\n let wizardResult: WizardResult | null = null;\n\n // Render wizard and wait for completion\n const { waitUntilExit } = render(\n <Wizard\n matrix={sourceResult.matrix}\n onComplete={(result) => {\n wizardResult = result;\n }}\n onCancel={() => {\n this.log(\"Setup cancelled\");\n }}\n />,\n );\n\n await waitUntilExit();\n\n // Handle cancellation or no result\n if (!wizardResult || wizardResult.cancelled) {\n this.exit(EXIT_CODES.CANCELLED);\n }\n\n // Validate selection\n if (wizardResult.selectedSkills.length === 0) {\n this.error(\"No skills selected\", { exit: EXIT_CODES.ERROR });\n }\n\n // Handle installation based on mode\n await this.handleInstallation(wizardResult, sourceResult, flags);\n }\n\n /**\n * Handle installation based on wizard result.\n * Supports Plugin Mode (with stack) and Local Mode (copy to .claude/).\n */\n private async handleInstallation(\n result: WizardResult,\n sourceResult: SourceLoadResult,\n flags: any,\n ): Promise<void> {\n const projectDir = process.cwd();\n const matrix = sourceResult.matrix;\n const dryRun = flags[\"dry-run\"];\n\n // Show summary\n this.log(\"\\n\");\n this.log(`Selected ${result.selectedSkills.length} skills`);\n this.log(\n `Install mode: ${result.installMode === \"plugin\" ? \"Plugin (native install)\" : \"Local (copy to .claude/skills/)\"}`,\n );\n this.log(\"\\n\");\n\n // Dry run preview\n if (dryRun) {\n if (result.installMode === \"plugin\" && result.selectedStack) {\n // Plugin Mode with stack: install entire stack as ONE plugin\n const useMarketplace = !!sourceResult.marketplace;\n if (useMarketplace) {\n this.log(\n `[dry-run] Would install stack \"${result.selectedStack.id}\" from marketplace \"${sourceResult.marketplace}\"`,\n );\n this.log(\n `[dry-run] claude plugin install ${result.selectedStack.id}@${sourceResult.marketplace} --scope project`,\n );\n } else {\n this.log(\n `[dry-run] Would compile and install stack \"${result.selectedStack.id}\" as a native plugin`,\n );\n this.log(\n `[dry-run] claude plugin install ./compiled-stack/${result.selectedStack.id} --scope project`,\n );\n this.log(\n `[dry-run] Stack includes ${result.selectedSkills.length} skills and agents bundled together`,\n );\n }\n } else {\n // Local Mode (or Plugin Mode fallback when no stack selected)\n if (result.installMode === \"plugin\") {\n this.log(\n `[dry-run] Individual skill plugin installation not yet supported`,\n );\n this.log(`[dry-run] Would fall back to Local Mode...`);\n }\n const localSkillsDir = path.join(projectDir, LOCAL_SKILLS_PATH);\n const localAgentsDir = path.join(projectDir, \".claude\", \"agents\");\n this.log(\n `[dry-run] Would copy ${result.selectedSkills.length} skills to ${localSkillsDir}`,\n );\n this.log(`[dry-run] Would compile agents to ${localAgentsDir}`);\n this.log(`[dry-run] Would save config to .claude/config.yaml`);\n }\n this.log(\"\\n[dry-run] Preview complete - no files were created\");\n return;\n }\n\n // Plugin Mode: Install stack as ONE native plugin\n if (result.installMode === \"plugin\") {\n if (result.selectedStack) {\n await this.installPluginMode(result, sourceResult);\n return;\n } else {\n // No stack selected - individual skill installation not yet supported\n this.warn(\n \"Individual skill plugin installation not yet supported in Plugin Mode.\",\n );\n this.log(`Falling back to Local Mode (copying to .claude/skills/)...`);\n this.log(\n \"To use Plugin Mode, select a pre-built stack instead of individual skills.\\n\",\n );\n // Fall through to Local Mode below\n }\n }\n\n // Local Mode: Copy skills and compile agents\n await this.installLocalMode(result, sourceResult);\n }\n\n /**\n * Install in Plugin Mode: install stack as native plugin.\n */\n private async installPluginMode(\n result: WizardResult,\n sourceResult: SourceLoadResult,\n ): Promise<void> {\n if (!result.selectedStack) {\n throw new Error(\"No stack selected for plugin mode\");\n }\n\n const projectDir = process.cwd();\n\n // Register marketplace if needed\n if (sourceResult.marketplace) {\n const marketplaceExists = await claudePluginMarketplaceExists(\n sourceResult.marketplace,\n );\n\n if (!marketplaceExists) {\n this.log(`Registering marketplace \"${sourceResult.marketplace}\"...`);\n try {\n await claudePluginMarketplaceAdd(\n sourceResult.sourceConfig.source,\n sourceResult.marketplace,\n );\n this.log(`Registered marketplace: ${sourceResult.marketplace}`);\n } catch (error) {\n this.error(error instanceof Error ? error.message : \"Unknown error\", {\n exit: EXIT_CODES.ERROR,\n });\n }\n }\n }\n\n const installMethod = sourceResult.marketplace\n ? `Installing from marketplace \"${sourceResult.marketplace}\"`\n : \"Compiling and installing\";\n this.log(`${installMethod} stack \"${result.selectedStack.id}\"...`);\n\n try {\n const installResult = await installStackAsPlugin({\n stackId: result.selectedStack.id,\n projectDir,\n sourcePath: sourceResult.sourcePath,\n agentSourcePath: sourceResult.sourcePath,\n marketplace: sourceResult.marketplace,\n });\n\n const installedFrom = installResult.fromMarketplace\n ? `from marketplace`\n : `(compiled locally)`;\n this.log(\n `Installed stack plugin: ${installResult.pluginName} ${installedFrom}\\n`,\n );\n\n this.log(\"Claude Collective initialized successfully!\\n\");\n this.log(`Stack \"${installResult.stackName}\" installed as plugin`);\n\n if (installResult.agents.length > 0) {\n this.log(\"\\nAgents included:\");\n for (const agentName of installResult.agents) {\n this.log(` ${agentName}`);\n }\n this.log(`\\nSkills bundled: ${installResult.skills.length}`);\n }\n this.log(\"\");\n\n const permissionWarning = await checkPermissions(projectDir);\n if (permissionWarning) {\n const { waitUntilExit } = render(permissionWarning);\n await waitUntilExit();\n }\n } catch (error) {\n this.error(error instanceof Error ? error.message : \"Unknown error\", {\n exit: EXIT_CODES.ERROR,\n });\n }\n }\n\n /**\n * Install in Local Mode: copy skills and compile agents to .claude/.\n */\n private async installLocalMode(\n result: WizardResult,\n sourceResult: SourceLoadResult,\n ): Promise<void> {\n const projectDir = process.cwd();\n const matrix = sourceResult.matrix;\n const localSkillsDir = path.join(projectDir, LOCAL_SKILLS_PATH);\n const localAgentsDir = path.join(projectDir, \".claude\", \"agents\");\n const localConfigPath = path.join(projectDir, \".claude\", \"config.yaml\");\n\n this.log(\"Copying skills to local directory...\");\n try {\n await ensureDir(localSkillsDir);\n await ensureDir(localAgentsDir);\n\n const copiedSkills = await copySkillsToLocalFlattened(\n result.selectedSkills,\n localSkillsDir,\n matrix,\n sourceResult,\n );\n\n this.log(`Copied ${copiedSkills.length} skills to .claude/skills/\\n`);\n\n this.log(\"Generating configuration...\");\n\n // 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 const agents = { ...cliAgents, ...localAgents };\n\n const localSkillsForResolution: Record<\n string,\n {\n id: string;\n name: string;\n description: string;\n canonicalId: string;\n path: string;\n content: string;\n }\n > = {};\n for (const copiedSkill of copiedSkills) {\n const skill = matrix.skills[copiedSkill.skillId];\n if (skill) {\n localSkillsForResolution[copiedSkill.skillId] = {\n id: copiedSkill.skillId,\n name: skill.name,\n description: skill.description || \"\",\n canonicalId: copiedSkill.skillId,\n path: copiedSkill.destPath,\n content: \"\", // Content not needed for skill references\n };\n }\n }\n\n // Get skill aliases from the loaded matrix for Phase 7 skill resolution\n const skillAliases = matrix.aliases || {};\n\n let localConfig: ProjectConfig;\n // Load stack once if selected (used for both config and skill resolution)\n const loadedStack = result.selectedStack\n ? await loadStackById(result.selectedStack.id, PROJECT_ROOT)\n : null;\n\n if (result.selectedStack) {\n if (loadedStack) {\n // Phase 7 format: Stack agents are Record<string, StackAgentConfig>\n // Extract agent IDs as string[] for config\n const agentIds = Object.keys(loadedStack.agents);\n\n // Build resolved stack property with agent->skill mappings\n const stackProperty = buildStackProperty(loadedStack, skillAliases);\n\n localConfig = {\n name: PLUGIN_NAME,\n installMode: result.installMode,\n description: loadedStack.description,\n skills: result.selectedSkills.map((id) => id),\n agents: agentIds,\n philosophy: loadedStack.philosophy,\n stack: stackProperty,\n };\n } else {\n // Stack not found in CLI's config/stacks.yaml\n throw new Error(\n `Stack '${result.selectedStack.id}' 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 result.selectedSkills,\n sourceResult.matrix,\n );\n }\n\n // Add installMode to config\n localConfig.installMode = result.installMode;\n\n const configYaml = stringifyYaml(localConfig, {\n indent: 2,\n lineWidth: 120,\n });\n await writeFile(localConfigPath, configYaml);\n\n this.log(`Configuration saved (${localConfig.agents.length} agents)\\n`);\n\n this.log(\"Compiling agents...\");\n\n const compileAgents: Record<string, CompileAgentConfig> = {};\n for (const agentId of localConfig.agents) {\n if (agents[agentId]) {\n // Phase 7: Skills come from stack's technology mappings\n if (loadedStack) {\n const skillRefs = resolveAgentSkillsFromStack(\n agentId,\n loadedStack,\n skillAliases,\n );\n compileAgents[agentId] = { skills: skillRefs };\n } else if (localConfig.agent_skills?.[agentId]) {\n // Legacy: stack-based skills from agent_skills config\n // Cast to StackConfig since agent_skills format is compatible\n const skillRefs = resolveStackSkills(\n localConfig as unknown as StackConfig,\n agentId,\n localSkillsForResolution,\n );\n compileAgents[agentId] = { skills: skillRefs };\n } else {\n // No stack, no agent_skills: empty skills\n compileAgents[agentId] = {};\n }\n }\n }\n\n const compileConfig: CompileConfig = {\n name: PLUGIN_NAME,\n description:\n localConfig.description ||\n `Local setup with ${result.selectedSkills.length} skills`,\n claude_md: \"\",\n agents: compileAgents,\n };\n\n const engine = await createLiquidEngine(projectDir);\n const resolvedAgents = await resolveAgents(\n agents,\n localSkillsForResolution,\n compileConfig,\n sourceResult.sourcePath,\n );\n\n const compiledAgentNames: string[] = [];\n for (const [name, agent] of Object.entries(resolvedAgents)) {\n const output = await compileAgentForPlugin(\n name,\n agent,\n sourceResult.sourcePath,\n engine,\n );\n await writeFile(path.join(localAgentsDir, `${name}.md`), output);\n compiledAgentNames.push(name);\n }\n\n this.log(\n `Compiled ${compiledAgentNames.length} agents to .claude/agents/\\n`,\n );\n\n // Success summary\n this.log(\"Claude Collective initialized successfully!\\n\");\n this.log(\"Skills copied to:\");\n this.log(` ${localSkillsDir}`);\n for (const copiedSkill of copiedSkills) {\n const skill = matrix.skills[copiedSkill.skillId];\n const displayName = skill?.alias || copiedSkill.skillId;\n this.log(` ${displayName}/`);\n }\n this.log(\"\");\n this.log(\"Agents compiled to:\");\n this.log(` ${localAgentsDir}`);\n for (const agentName of compiledAgentNames) {\n this.log(` ${agentName}.md`);\n }\n this.log(\"\");\n this.log(\"Configuration:\");\n this.log(` ${localConfigPath}`);\n this.log(\"\");\n this.log(\"To customize agent-skill assignments:\");\n this.log(` 1. Edit .claude/config.yaml`);\n this.log(` 2. Run 'cc compile' to regenerate agents`);\n this.log(\"\");\n\n const permissionWarning = await checkPermissions(projectDir);\n if (permissionWarning) {\n const { waitUntilExit } = render(permissionWarning);\n await waitUntilExit();\n }\n } catch (error) {\n this.error(error instanceof Error ? error.message : String(error), {\n exit: EXIT_CODES.ERROR,\n });\n }\n }\n}\n","import path from \"path\";\nimport { Text, Box } from \"ink\";\nimport React from \"react\";\nimport { fileExists, readFile } from \"../utils/fs\";\n\ninterface PermissionConfig {\n allow?: string[];\n deny?: string[];\n}\n\ninterface SettingsFile {\n permissions?: PermissionConfig;\n}\n\n/**\n * Check permissions configuration and return warning component if needed.\n * Returns null if permissions are properly configured.\n */\nexport async function checkPermissions(\n projectRoot: string,\n): Promise<React.ReactElement | null> {\n const settingsPath = path.join(projectRoot, \".claude\", \"settings.json\");\n const localSettingsPath = path.join(\n projectRoot,\n \".claude\",\n \"settings.local.json\",\n );\n\n let permissions: PermissionConfig | undefined;\n\n for (const filePath of [localSettingsPath, settingsPath]) {\n if (await fileExists(filePath)) {\n try {\n const content = await readFile(filePath);\n const parsed = JSON.parse(content) as SettingsFile;\n if (parsed.permissions) {\n permissions = parsed.permissions;\n break;\n }\n } catch {}\n }\n }\n\n if (!permissions) {\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor=\"yellow\"\n padding={1}\n >\n <Text bold color=\"yellow\">\n Permission Notice\n </Text>\n <Text>No permissions configured in .claude/settings.json</Text>\n <Text>Agents will prompt for approval on each tool use.</Text>\n <Text> </Text>\n <Text>For autonomous operation, add to .claude/settings.json:</Text>\n <Text> </Text>\n <Text color=\"dim\">{\"{\"}</Text>\n <Text color=\"dim\">{' \"permissions\": {'}</Text>\n <Text color=\"dim\">{' \"allow\": ['}</Text>\n <Text color=\"dim\">{' \"Read(*)\",'}</Text>\n <Text color=\"dim\">{' \"Bash(git *)\",'}</Text>\n <Text color=\"dim\">{' \"Bash(bun *)\"'}</Text>\n <Text color=\"dim\">{\" ]\"}</Text>\n <Text color=\"dim\">{\" }\"}</Text>\n <Text color=\"dim\">{\"}\"}</Text>\n </Box>\n );\n }\n\n const hasRestrictiveBash = permissions.deny?.some(\n (rule) => rule === \"Bash(*)\" || rule === \"Bash\",\n );\n const hasNoAllows = !permissions.allow || permissions.allow.length === 0;\n\n if (hasRestrictiveBash || hasNoAllows) {\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor=\"yellow\"\n padding={1}\n >\n <Text bold color=\"yellow\">\n Permission Warnings\n </Text>\n {hasRestrictiveBash && (\n <Text>\n ⚠ Bash is denied in permissions. Some agents require Bash for git,\n testing, and build commands.\n </Text>\n )}\n {hasNoAllows && (\n <Text>\n ⚠ No allow rules configured. Agents will prompt for each tool use.\n </Text>\n )}\n </Box>\n );\n }\n\n return null;\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\";\n\nexport interface StackInstallOptions {\n stackId: string;\n projectDir: string;\n sourcePath: string;\n agentSourcePath: string;\n marketplace?: string;\n}\n\nexport interface StackInstallResult {\n pluginName: string;\n stackName: string;\n agents: string[];\n skills: string[];\n pluginPath: string;\n fromMarketplace: boolean;\n}\n\n/**\n * Compile a stack to a temporary directory\n */\nexport async function compileStackToTemp(options: {\n stackId: string;\n projectRoot: string;\n agentSourcePath?: string;\n}): Promise<{ result: CompiledStackPlugin; cleanup: () => Promise<void> }> {\n const tempDir = path.join(os.tmpdir(), `cc-stack-${Date.now()}`);\n await ensureDir(tempDir);\n\n const result = await compileStackPlugin({\n stackId: options.stackId,\n outputDir: tempDir,\n projectRoot: options.projectRoot,\n agentSourcePath: options.agentSourcePath,\n });\n\n return {\n result,\n cleanup: async () => {\n await remove(tempDir);\n },\n };\n}\n\nexport async function installStackAsPlugin(\n options: StackInstallOptions,\n): Promise<StackInstallResult> {\n const { stackId, projectDir, sourcePath, agentSourcePath, marketplace } =\n 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 // Install using native claude plugin install\n await claudePluginInstall(result.pluginPath, \"project\", projectDir);\n\n return {\n pluginName: `stack-${stackId}`,\n stackName: result.stackName,\n agents: result.agents,\n skills: result.skillPlugins,\n pluginPath: result.pluginPath,\n fromMarketplace: false,\n };\n } finally {\n // Clean up temp directory\n await cleanup();\n }\n}\n","import type {\n StackConfig,\n SkillAssignment,\n ProjectConfig,\n SkillEntry,\n AgentSkillConfig,\n} from \"../../types\";\nimport type { MergedSkillsMatrix } from \"../types-matrix\";\nimport type { Stack, StackAgentConfig } from \"../types-stacks\";\nimport {\n getAgentsForSkill,\n shouldPreloadSkill,\n extractCategoryKey,\n} from \"./skill-agent-mappings\";\nimport { DEFAULT_VERSION } from \"../consts\";\n\nconst PLUGIN_NAME = \"claude-collective\";\nconst DEFAULT_AUTHOR = \"@user\";\n\n/**\n * Options for generating a ProjectConfig\n */\nexport interface ProjectConfigOptions {\n /** Brief description of the project */\n description?: string;\n /** Framework hint for agent behavior */\n framework?: string;\n /** Author handle */\n author?: string;\n /** Include agent_skills customizations (default: false - use defaults) */\n includeAgentSkills?: boolean;\n}\n\nexport function generateConfigFromSkills(\n selectedSkillIds: string[],\n matrix: MergedSkillsMatrix,\n): StackConfig {\n const agentSkills: Record<string, Record<string, SkillAssignment[]>> = {};\n const neededAgents = new Set<string>();\n\n for (const skillId of selectedSkillIds) {\n const skill = matrix.skills[skillId];\n if (!skill) {\n continue;\n }\n\n const skillPath = skill.path;\n const category = skill.category;\n const agents = getAgentsForSkill(skillPath, category);\n const categoryKey = extractCategoryKey(skillPath);\n\n for (const agentId of agents) {\n neededAgents.add(agentId);\n\n if (!agentSkills[agentId]) {\n agentSkills[agentId] = {};\n }\n\n if (!agentSkills[agentId][categoryKey]) {\n agentSkills[agentId][categoryKey] = [];\n }\n\n const isPreloaded = shouldPreloadSkill(\n skillPath,\n skillId,\n category,\n agentId,\n );\n\n const assignment: SkillAssignment = { id: skillId };\n if (isPreloaded) {\n assignment.preloaded = true;\n }\n\n agentSkills[agentId][categoryKey].push(assignment);\n }\n }\n\n const skills: SkillAssignment[] = selectedSkillIds.map((id) => {\n const skill = matrix.skills[id];\n if (skill?.local && skill?.localPath) {\n return {\n id,\n local: true,\n path: skill.localPath,\n };\n }\n return { id };\n });\n\n const config: StackConfig = {\n name: PLUGIN_NAME,\n version: DEFAULT_VERSION,\n author: DEFAULT_AUTHOR,\n description: `Custom plugin with ${selectedSkillIds.length} skills`,\n skills,\n agents: Array.from(neededAgents).sort(),\n agent_skills: agentSkills,\n };\n\n return config;\n}\n\nexport function generateConfigFromStack(stackConfig: StackConfig): StackConfig {\n return {\n name: PLUGIN_NAME,\n version: stackConfig.version || DEFAULT_VERSION,\n author: stackConfig.author || DEFAULT_AUTHOR,\n description: stackConfig.description,\n framework: stackConfig.framework,\n skills: stackConfig.skills,\n agents: stackConfig.agents,\n agent_skills: stackConfig.agent_skills,\n hooks: stackConfig.hooks,\n philosophy: stackConfig.philosophy,\n principles: stackConfig.principles,\n tags: stackConfig.tags,\n };\n}\n\nexport function mergeStackWithSkills(\n baseStackConfig: StackConfig,\n selectedSkillIds: string[],\n matrix: MergedSkillsMatrix,\n): StackConfig {\n const baseSkillIds = new Set(baseStackConfig.skills.map((s) => s.id));\n const selectedSet = new Set(selectedSkillIds);\n const addedSkills = selectedSkillIds.filter((id) => !baseSkillIds.has(id));\n const removedSkills = [...baseSkillIds].filter((id) => !selectedSet.has(id));\n\n if (addedSkills.length === 0 && removedSkills.length === 0) {\n return generateConfigFromStack(baseStackConfig);\n }\n\n const config = generateConfigFromStack(baseStackConfig);\n\n config.skills = selectedSkillIds.map((id) => {\n const skill = matrix.skills[id];\n if (skill?.local && skill?.localPath) {\n return {\n id,\n local: true,\n path: skill.localPath,\n };\n }\n return { id };\n });\n\n if (addedSkills.length > 0 && config.agent_skills) {\n for (const skillId of addedSkills) {\n const skill = matrix.skills[skillId];\n if (!skill) continue;\n\n const skillPath = skill.path;\n const category = skill.category;\n const categoryKey = extractCategoryKey(skillPath);\n const agents = getAgentsForSkill(skillPath, category);\n\n for (const agentId of agents) {\n if (!config.agent_skills[agentId]) {\n config.agent_skills[agentId] = {};\n }\n if (!config.agent_skills[agentId][categoryKey]) {\n config.agent_skills[agentId][categoryKey] = [];\n }\n\n const isPreloaded = shouldPreloadSkill(\n skillPath,\n skillId,\n category,\n agentId,\n );\n const assignment: SkillAssignment = { id: skillId };\n if (isPreloaded) {\n assignment.preloaded = true;\n }\n\n config.agent_skills[agentId][categoryKey].push(assignment);\n }\n }\n }\n\n if (removedSkills.length > 0 && config.agent_skills) {\n const removedSet = new Set(removedSkills);\n for (const agentId of Object.keys(config.agent_skills)) {\n for (const categoryKey of Object.keys(config.agent_skills[agentId])) {\n config.agent_skills[agentId][categoryKey] = config.agent_skills[\n agentId\n ][categoryKey].filter((s) => !removedSet.has(s.id));\n\n if (config.agent_skills[agentId][categoryKey].length === 0) {\n delete config.agent_skills[agentId][categoryKey];\n }\n }\n\n if (Object.keys(config.agent_skills[agentId]).length === 0) {\n delete config.agent_skills[agentId];\n }\n }\n }\n\n config.description = `Custom plugin based on ${baseStackConfig.name} with ${selectedSkillIds.length} skills`;\n\n return config;\n}\n\n/**\n * Generate a minimal ProjectConfig from selected skills.\n * Returns a config with just the essentials:\n * - name\n * - skills array (string IDs for remote, objects for local)\n * - agents array (derived from skills via getAgentsForSkill)\n * - Optionally agent_skills if includeAgentSkills is true\n *\n * Does NOT include preload_patterns (rely on defaults)\n */\nexport function generateProjectConfigFromSkills(\n name: string,\n selectedSkillIds: string[],\n matrix: MergedSkillsMatrix,\n options?: ProjectConfigOptions,\n): ProjectConfig {\n const neededAgents = new Set<string>();\n\n // Derive agents from skills\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\n for (const agentId of agents) {\n neededAgents.add(agentId);\n }\n }\n\n // Build minimal skills array\n const skills: SkillEntry[] = selectedSkillIds.map((id) => {\n const skill = matrix.skills[id];\n if (skill?.local && skill?.localPath) {\n return {\n id,\n local: true,\n path: skill.localPath,\n };\n }\n // For remote skills, just use string ID (minimal format)\n return id;\n });\n\n // Build minimal config\n const config: ProjectConfig = {\n name,\n agents: Array.from(neededAgents).sort(),\n };\n\n // Only include skills if there are any\n if (skills.length > 0) {\n config.skills = skills;\n }\n\n // Add optional fields only if provided\n if (options?.description) {\n config.description = options.description;\n }\n\n if (options?.framework) {\n config.framework = options.framework;\n }\n\n if (options?.author) {\n config.author = options.author;\n }\n\n // Only include agent_skills if explicitly requested\n if (options?.includeAgentSkills) {\n const agentSkills = buildAgentSkills(\n selectedSkillIds,\n matrix,\n neededAgents,\n );\n if (Object.keys(agentSkills).length > 0) {\n config.agent_skills = agentSkills;\n }\n }\n\n return config;\n}\n\n/**\n * Build agent_skills mapping for ProjectConfig.\n * Uses simple list format for each agent (not categorized).\n */\nfunction buildAgentSkills(\n selectedSkillIds: string[],\n matrix: MergedSkillsMatrix,\n neededAgents: Set<string>,\n): Record<string, AgentSkillConfig> {\n const agentSkills: Record<string, SkillEntry[]> = {};\n\n for (const skillId of selectedSkillIds) {\n const skill = matrix.skills[skillId];\n if (!skill) {\n continue;\n }\n\n const skillPath = skill.path;\n const category = skill.category;\n const agents = getAgentsForSkill(skillPath, category);\n\n for (const agentId of agents) {\n if (!neededAgents.has(agentId)) continue;\n\n if (!agentSkills[agentId]) {\n agentSkills[agentId] = [];\n }\n\n const isPreloaded = shouldPreloadSkill(\n skillPath,\n skillId,\n category,\n agentId,\n );\n\n // Use minimal format: string for non-preloaded, object only if preloaded\n if (isPreloaded) {\n agentSkills[agentId].push({ id: skillId, preloaded: true });\n } else {\n agentSkills[agentId].push(skillId);\n }\n }\n }\n\n return agentSkills;\n}\n\n/**\n * Generate a ProjectConfig from an existing StackConfig.\n * Converts legacy StackConfig format to new ProjectConfig format.\n */\nexport function generateProjectConfigFromStack(\n stackConfig: StackConfig,\n): ProjectConfig {\n const config: ProjectConfig = {\n name: stackConfig.name,\n agents: stackConfig.agents,\n };\n\n // Convert skills array to SkillEntry[] format\n if (stackConfig.skills && stackConfig.skills.length > 0) {\n config.skills = stackConfig.skills.map((skill) => {\n // If skill has local flag, preserve full object\n if (skill.local && skill.path) {\n return {\n id: skill.id,\n local: true,\n path: skill.path,\n };\n }\n // If skill has preloaded flag, preserve object format\n if (skill.preloaded) {\n return {\n id: skill.id,\n preloaded: true,\n };\n }\n // Otherwise, use minimal string format\n return skill.id;\n });\n }\n\n // Copy optional fields only if present\n if (stackConfig.description) {\n config.description = stackConfig.description;\n }\n\n if (stackConfig.framework) {\n config.framework = stackConfig.framework;\n }\n\n if (stackConfig.author) {\n config.author = stackConfig.author;\n }\n\n // Convert agent_skills (StackConfig uses categorized format)\n if (stackConfig.agent_skills) {\n // Keep the categorized format as-is for ProjectConfig\n // (ProjectConfig supports both simple list and categorized)\n config.agent_skills = stackConfig.agent_skills;\n }\n\n if (stackConfig.hooks) {\n config.hooks = stackConfig.hooks;\n }\n\n if (stackConfig.philosophy) {\n config.philosophy = stackConfig.philosophy;\n }\n\n if (stackConfig.principles && stackConfig.principles.length > 0) {\n config.principles = stackConfig.principles;\n }\n\n if (stackConfig.tags && stackConfig.tags.length > 0) {\n config.tags = stackConfig.tags;\n }\n\n return config;\n}\n\n/**\n * Build resolved stack property for ProjectConfig.\n * Maps each agent to its subcategory->skill ID mappings.\n *\n * @param stack - The Stack with agent technology mappings\n * @param skillAliases - Alias->skill ID mappings from skills-matrix.yaml\n * @returns Record<agentId, Record<subcategoryId, skillId>>\n *\n * @example\n * Input stack.agents:\n * web-developer:\n * framework: react\n * styling: scss-modules\n *\n * Output:\n * web-developer:\n * framework: web/framework/react (@vince)\n * styling: web/styling/scss-modules (@vince)\n */\nexport function buildStackProperty(\n stack: Stack,\n skillAliases: Record<string, string>,\n): Record<string, Record<string, string>> {\n const result: Record<string, Record<string, string>> = {};\n\n for (const [agentId, agentConfig] of Object.entries(stack.agents)) {\n // Skip agents with empty config\n if (!agentConfig || Object.keys(agentConfig).length === 0) {\n continue;\n }\n\n const resolvedMappings: Record<string, string> = {};\n\n for (const [subcategoryId, alias] of Object.entries(\n agentConfig as StackAgentConfig,\n )) {\n // Resolve alias to full skill ID using skill_aliases from matrix\n const skillId = skillAliases[alias];\n if (skillId) {\n resolvedMappings[subcategoryId] = skillId;\n } else {\n // If alias not found, use the alias as-is (might be a full skill ID already)\n resolvedMappings[subcategoryId] = alias;\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","/**\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-v2/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 { ProjectConfig } from \"../../types\";\nimport { getCachedDefaults } from \"./defaults-loader\";\n\n// =============================================================================\n// Hardcoded Fallback Defaults (DEPRECATED)\n// These are used when YAML defaults cannot be loaded (bundled fallback)\n// Skills should now be defined in agent.yaml files directly.\n// =============================================================================\n\nexport const SKILL_TO_AGENTS: Record<string, string[]> = {\n \"frontend/*\": [\n \"web-developer\",\n \"web-reviewer\",\n \"web-researcher\",\n \"web-pm\",\n \"web-pattern-scout\",\n \"web-pattern-critique\",\n \"agent-summoner\",\n \"skill-summoner\",\n \"documentor\",\n ],\n\n \"backend/*\": [\n \"api-developer\",\n \"api-reviewer\",\n \"api-researcher\",\n \"web-architecture\",\n \"web-pm\",\n \"web-pattern-scout\",\n \"web-pattern-critique\",\n \"agent-summoner\",\n \"skill-summoner\",\n \"documentor\",\n ],\n\n \"mobile/*\": [\n \"web-developer\",\n \"web-reviewer\",\n \"web-researcher\",\n \"web-pm\",\n \"agent-summoner\",\n \"skill-summoner\",\n \"documentor\",\n ],\n\n \"setup/*\": [\n \"web-architecture\",\n \"web-developer\",\n \"api-developer\",\n \"agent-summoner\",\n \"skill-summoner\",\n \"documentor\",\n ],\n\n \"security/*\": [\n \"web-developer\",\n \"api-developer\",\n \"web-reviewer\",\n \"api-reviewer\",\n \"web-architecture\",\n \"web-pm\",\n \"agent-summoner\",\n \"skill-summoner\",\n \"documentor\",\n ],\n\n \"reviewing/*\": [\n \"web-reviewer\",\n \"api-reviewer\",\n \"cli-reviewer\",\n \"web-pattern-critique\",\n \"agent-summoner\",\n \"skill-summoner\",\n \"documentor\",\n ],\n\n \"cli/*\": [\n \"cli-developer\",\n \"cli-reviewer\",\n \"api-developer\",\n \"api-reviewer\",\n \"api-researcher\",\n \"web-architecture\",\n \"web-pm\",\n \"agent-summoner\",\n \"skill-summoner\",\n \"documentor\",\n ],\n\n \"research/*\": [\n \"web-researcher\",\n \"api-researcher\",\n \"web-pm\",\n \"web-pattern-scout\",\n \"web-pattern-critique\",\n \"documentor\",\n \"agent-summoner\",\n \"skill-summoner\",\n ],\n\n \"methodology/*\": [\n \"web-developer\",\n \"api-developer\",\n \"web-reviewer\",\n \"api-reviewer\",\n \"web-researcher\",\n \"api-researcher\",\n \"web-tester\",\n \"web-pm\",\n \"web-architecture\",\n \"web-pattern-scout\",\n \"web-pattern-critique\",\n \"agent-summoner\",\n \"skill-summoner\",\n \"documentor\",\n ],\n\n \"frontend/testing\": [\"web-tester\", \"web-developer\", \"web-reviewer\"],\n \"backend/testing\": [\"web-tester\", \"api-developer\", \"api-reviewer\"],\n\n \"frontend/mocks\": [\"web-tester\", \"web-developer\", \"web-reviewer\"],\n};\n\nexport const PRELOADED_SKILLS: Record<string, string[]> = {\n \"web-developer\": [\"framework\", \"styling\"],\n \"api-developer\": [\"api\", \"database\", \"cli\"],\n \"cli-developer\": [\"cli\"],\n \"web-reviewer\": [\"framework\", \"styling\", \"reviewing\"],\n \"api-reviewer\": [\"api\", \"database\", \"reviewing\"],\n \"cli-reviewer\": [\"cli\", \"reviewing\", \"cli-reviewing\"],\n \"web-researcher\": [\"framework\", \"research-methodology\"],\n \"api-researcher\": [\"api\", \"research-methodology\"],\n \"web-tester\": [\"testing\", \"mocks\"],\n \"web-architecture\": [\"monorepo\", \"turborepo\", \"cli\"],\n \"web-pm\": [\"research-methodology\"],\n \"web-pattern-scout\": [\"research-methodology\"],\n \"web-pattern-critique\": [\"research-methodology\", \"reviewing\"],\n documentor: [\"research-methodology\"],\n \"agent-summoner\": [],\n \"skill-summoner\": [],\n};\n\nexport const SUBCATEGORY_ALIASES: Record<string, string> = {\n framework: \"frontend/framework\",\n styling: \"frontend/styling\",\n api: \"backend/api\",\n database: \"backend/database\",\n mocks: \"frontend/mocks\",\n testing: \"testing\",\n reviewing: \"reviewing\",\n \"research-methodology\": \"research/research-methodology\",\n monorepo: \"setup/monorepo\",\n cli: \"cli\",\n};\n\n// =============================================================================\n// Default Agents for Unknown Categories\n// =============================================================================\n\nconst DEFAULT_AGENTS = [\"agent-summoner\", \"skill-summoner\", \"documentor\"];\n\n// =============================================================================\n// Helper Functions to Get Effective Mappings\n// =============================================================================\n\n/**\n * Get the effective skill_to_agents mappings.\n * Priority: YAML defaults (if loaded) > hardcoded fallback\n */\nfunction getEffectiveSkillToAgents(): Record<string, string[]> {\n const defaults = getCachedDefaults();\n if (defaults?.skill_to_agents) {\n return defaults.skill_to_agents;\n }\n return SKILL_TO_AGENTS;\n}\n\n/**\n * Get the effective preloaded_skills mappings.\n * Priority: Project config preload_patterns > YAML defaults > hardcoded fallback\n */\nfunction getEffectivePreloadedSkills(\n projectConfig?: ProjectConfig,\n): Record<string, string[]> {\n // Project config preload_patterns take priority\n if (projectConfig?.preload_patterns) {\n return projectConfig.preload_patterns;\n }\n\n // Then YAML defaults\n const defaults = getCachedDefaults();\n if (defaults?.preloaded_skills) {\n return defaults.preloaded_skills;\n }\n\n // Finally hardcoded fallback\n return PRELOADED_SKILLS;\n}\n\n/**\n * Get the effective subcategory aliases.\n * Priority: YAML defaults > hardcoded fallback\n */\nfunction getEffectiveSubcategoryAliases(): Record<string, string> {\n const defaults = getCachedDefaults();\n if (defaults?.subcategory_aliases) {\n return defaults.subcategory_aliases;\n }\n return SUBCATEGORY_ALIASES;\n}\n\n// =============================================================================\n// Public API\n// =============================================================================\n\n/**\n * Get agents that should receive a skill based on its path and category.\n *\n * Resolution priority:\n * 1. Project config agent_skills (if agentId provided and config has mapping)\n * 2. YAML defaults (if loaded)\n * 3. Hardcoded fallback\n *\n * @param skillPath - Full path to the skill (e.g., \"skills/frontend/framework/react\")\n * @param category - Skill category (e.g., \"frontend/*\" or \"frontend/testing\")\n * @param projectConfig - Optional project config for overrides\n * @returns Array of agent IDs that should receive this skill\n */\nexport function getAgentsForSkill(\n skillPath: string,\n category: string,\n projectConfig?: ProjectConfig,\n): string[] {\n const normalizedPath = skillPath.replace(/^skills\\//, \"\").replace(/\\/$/, \"\");\n\n // Get effective mappings (YAML defaults or hardcoded fallback)\n const skillToAgents = getEffectiveSkillToAgents();\n\n // Check direct category match\n if (skillToAgents[category]) {\n return skillToAgents[category];\n }\n\n // Check exact path match or path prefix match\n for (const [pattern, agents] of Object.entries(skillToAgents)) {\n if (\n normalizedPath === pattern ||\n normalizedPath.startsWith(`${pattern}/`)\n ) {\n return agents;\n }\n }\n\n // Check wildcard pattern match\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\n/**\n * Check if a skill should be preloaded (embedded) for a specific agent.\n *\n * Resolution priority for preload patterns:\n * 1. Project config preload_patterns (if provided)\n * 2. YAML defaults (if loaded)\n * 3. Hardcoded fallback\n *\n * @param skillPath - Full path to the skill\n * @param skillId - Skill identifier\n * @param category - Skill category\n * @param agentId - Agent identifier\n * @param projectConfig - Optional project config for overrides\n * @returns true if skill should be preloaded for this agent\n */\nexport function shouldPreloadSkill(\n skillPath: string,\n skillId: string,\n category: string,\n agentId: string,\n projectConfig?: ProjectConfig,\n): boolean {\n const preloadedSkills = getEffectivePreloadedSkills(projectConfig);\n const preloadedPatterns = preloadedSkills[agentId];\n\n if (!preloadedPatterns || preloadedPatterns.length === 0) {\n return false;\n }\n\n const normalizedPath = skillPath.replace(/^skills\\//, \"\").replace(/\\/$/, \"\");\n const subcategoryAliases = getEffectiveSubcategoryAliases();\n\n for (const pattern of preloadedPatterns) {\n // Category match\n if (category === pattern) {\n return true;\n }\n\n // Path contains pattern\n if (normalizedPath.includes(pattern)) {\n return true;\n }\n\n // Skill ID contains pattern (case-insensitive)\n if (skillId.toLowerCase().includes(pattern.toLowerCase())) {\n return true;\n }\n\n // Alias-based matching\n const aliasedPath = subcategoryAliases[pattern];\n if (aliasedPath && normalizedPath.includes(aliasedPath)) {\n return true;\n }\n }\n\n return false;\n}\n\n/**\n * Extract the category key from a skill path.\n * Used for categorizing skills by their subdirectory.\n *\n * @param skillPath - Full path to the skill\n * @returns Category key (e.g., \"framework\" from \"skills/frontend/framework/react\")\n */\nexport function extractCategoryKey(skillPath: string): string {\n const normalizedPath = skillPath.replace(/^skills\\//, \"\").replace(/\\/$/, \"\");\n const parts = normalizedPath.split(\"/\");\n return parts.length >= 2 ? parts[1] : parts[0];\n}\n\n/**\n * Check if project config has agent_skills overrides for a specific agent.\n *\n * @param agentId - Agent identifier\n * @param projectConfig - Project config to check\n * @returns true if config has agent_skills for this agent\n */\nexport function hasAgentSkillsOverride(\n agentId: string,\n projectConfig?: ProjectConfig,\n): boolean {\n if (!projectConfig?.agent_skills) {\n return false;\n }\n return agentId in projectConfig.agent_skills;\n}\n\n/**\n * Check if a skill is assigned to an agent in project config.\n *\n * Handles both simple list format (SkillEntry[]) and categorized format (Record<string, SkillEntry[]>).\n * Matches by skill ID - supports both string entries and SkillAssignment objects.\n *\n * @param skillId - Skill identifier to check (e.g., \"react (@vince)\")\n * @param agentId - Agent identifier (e.g., \"web-developer\")\n * @param agentSkills - The agent_skills record from project config\n * @returns true if the skill is assigned to the agent\n */\nexport function isSkillAssignedToAgent(\n skillId: string,\n agentId: string,\n agentSkills: Record<string, import(\"../../types\").AgentSkillConfig>,\n): boolean {\n const agentConfig = agentSkills[agentId];\n if (!agentConfig) {\n return false;\n }\n\n // Helper to check if a SkillEntry matches the skillId\n const matchesSkillId = (entry: import(\"../../types\").SkillEntry): boolean => {\n if (typeof entry === \"string\") {\n return entry === skillId;\n }\n // SkillAssignment has an id field\n return entry.id === skillId;\n };\n\n // Check if it's a simple list format (array)\n if (Array.isArray(agentConfig)) {\n return agentConfig.some(matchesSkillId);\n }\n\n // Categorized format: Record<string, SkillEntry[]>\n for (const categorySkills of Object.values(agentConfig)) {\n if (categorySkills.some(matchesSkillId)) {\n return true;\n }\n }\n\n return false;\n}\n\n/**\n * Get agents for a skill, respecting project config overrides.\n *\n * Resolution priority:\n * 1. If project config has `agent_skills`:\n * Return only agents whose config includes this skill\n * 2. Otherwise:\n * Use default mappings (YAML > hardcoded)\n *\n * @param skillId - Skill identifier (e.g., \"react (@vince)\")\n * @param skillPath - Full path to the skill (e.g., \"skills/frontend/framework/react\")\n * @param category - Skill category (e.g., \"frontend/*\" or \"frontend/testing\")\n * @param projectConfig - Optional project config for overrides\n * @returns Array of agent IDs that should receive this skill\n */\nexport function resolveAgentsForSkill(\n skillId: string,\n skillPath: string,\n category: string,\n projectConfig?: ProjectConfig,\n): string[] {\n // If project config has agent_skills, use that as the source of truth\n if (projectConfig?.agent_skills) {\n const matchingAgents: string[] = [];\n\n for (const agentId of Object.keys(projectConfig.agent_skills)) {\n if (\n isSkillAssignedToAgent(skillId, agentId, projectConfig.agent_skills)\n ) {\n matchingAgents.push(agentId);\n }\n }\n\n return matchingAgents;\n }\n\n // Fall back to default mappings (YAML > hardcoded)\n return getAgentsForSkill(skillPath, category, projectConfig);\n}\n","import path from \"path\";\nimport { fileURLToPath } from \"url\";\nimport { parse as parseYaml } from \"yaml\";\nimport { readFile, fileExists } from \"../utils/fs\";\nimport { verbose } from \"../utils/logger\";\n\n/**\n * Default mappings loaded from agent-mappings.yaml\n */\nexport interface 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\n/**\n * Get the path to the defaults directory.\n * Works both in development (src/) and production (dist/).\n */\nfunction getDefaultsPath(): string {\n // In ESM, we can use import.meta.url to get the current file's path\n const currentDir = path.dirname(fileURLToPath(import.meta.url));\n\n // Navigate from lib/ to defaults/\n return path.join(currentDir, \"..\", \"defaults\", \"agent-mappings.yaml\");\n}\n\n/**\n * Load default mappings from YAML file.\n * Returns cached result on subsequent calls.\n *\n * @returns Default mappings or null if file cannot be loaded\n */\nexport async function loadDefaultMappings(): Promise<DefaultMappings | null> {\n // Return cached defaults if available\n if (cachedDefaults !== null) {\n return cachedDefaults;\n }\n\n const defaultsPath = getDefaultsPath();\n\n // Check if file exists\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\n if (!isValidDefaultMappings(parsed)) {\n verbose(`Invalid default mappings structure at ${defaultsPath}`);\n return null;\n }\n\n verbose(`Loaded default mappings from ${defaultsPath}`);\n cachedDefaults = parsed;\n return cachedDefaults;\n } catch (error) {\n verbose(`Failed to parse default mappings: ${error}`);\n return null;\n }\n}\n\n/**\n * Synchronously get cached defaults.\n * Returns null if defaults haven't been loaded yet.\n *\n * This is useful for functions that need defaults but cannot be async.\n * Call loadDefaultMappings() first to populate the cache.\n */\nexport function getCachedDefaults(): DefaultMappings | null {\n return cachedDefaults;\n}\n\n/**\n * Clear the cached defaults (for testing).\n */\nexport function clearDefaultsCache(): void {\n cachedDefaults = null;\n}\n\n/**\n * Type guard to validate default mappings structure.\n */\nfunction isValidDefaultMappings(obj: unknown): obj is DefaultMappings {\n if (typeof obj !== \"object\" || obj === null) return false;\n\n const mappings = obj as Record<string, unknown>;\n\n // Validate skill_to_agents\n if (\n typeof mappings.skill_to_agents !== \"object\" ||\n mappings.skill_to_agents === null\n ) {\n return false;\n }\n\n for (const [, agents] of Object.entries(mappings.skill_to_agents)) {\n if (!Array.isArray(agents)) return false;\n for (const agent of agents) {\n if (typeof agent !== \"string\") return false;\n }\n }\n\n // Validate preloaded_skills\n if (\n typeof mappings.preloaded_skills !== \"object\" ||\n mappings.preloaded_skills === null\n ) {\n return false;\n }\n\n for (const [, patterns] of Object.entries(mappings.preloaded_skills)) {\n if (!Array.isArray(patterns)) return false;\n for (const pattern of patterns) {\n if (typeof pattern !== \"string\") return false;\n }\n }\n\n // Validate subcategory_aliases\n if (\n typeof mappings.subcategory_aliases !== \"object\" ||\n mappings.subcategory_aliases === null\n ) {\n return false;\n }\n\n for (const [, aliasPath] of Object.entries(mappings.subcategory_aliases)) {\n if (typeof aliasPath !== \"string\") return false;\n }\n\n return true;\n}\n"],"mappings":"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","names":["path","path","path","jsx","path"]}
@@ -0,0 +1,44 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ formatInstallationDisplay,
4
+ getInstallationInfo
5
+ } from "../chunk-YKXBGCFD.js";
6
+ import "../chunk-3ZCB5K33.js";
7
+ import "../chunk-MYAVQ23U.js";
8
+ import "../chunk-3HBTELJN.js";
9
+ import "../chunk-A3J6IAXK.js";
10
+ import {
11
+ BaseCommand
12
+ } from "../chunk-SYQ7R2JO.js";
13
+ import "../chunk-TOPAIL5W.js";
14
+ import "../chunk-MMDXNZPF.js";
15
+ import {
16
+ init_esm_shims
17
+ } from "../chunk-DHET7RCE.js";
18
+
19
+ // src/cli-v2/commands/list.ts
20
+ init_esm_shims();
21
+ var List = class _List extends BaseCommand {
22
+ static summary = "Show installation information";
23
+ static description = "Display details about the Claude Collective installation (local or plugin mode)";
24
+ static aliases = ["ls"];
25
+ static flags = {
26
+ ...BaseCommand.baseFlags
27
+ };
28
+ async run() {
29
+ await this.parse(_List);
30
+ const info = await getInstallationInfo();
31
+ if (!info) {
32
+ this.log("No installation found.");
33
+ this.log("Run 'cc init' to create one.");
34
+ return;
35
+ }
36
+ this.log("");
37
+ this.log(formatInstallationDisplay(info));
38
+ this.log("");
39
+ }
40
+ };
41
+ export {
42
+ List as default
43
+ };
44
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/cli-v2/commands/list.ts"],"sourcesContent":["import { BaseCommand } from \"../base-command.js\";\nimport {\n getInstallationInfo,\n formatInstallationDisplay,\n} from \"../lib/plugin-info.js\";\n\nexport default class List extends BaseCommand {\n static summary = \"Show installation information\";\n static description =\n \"Display details about the Claude Collective installation (local or plugin mode)\";\n static aliases = [\"ls\"];\n\n static flags = {\n ...BaseCommand.baseFlags,\n };\n\n async run(): Promise<void> {\n await this.parse(List);\n\n const info = await getInstallationInfo();\n\n if (!info) {\n this.log(\"No installation found.\");\n this.log(\"Run 'cc init' to create one.\");\n return;\n }\n\n this.log(\"\");\n this.log(formatInstallationDisplay(info));\n this.log(\"\");\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAMA,IAAqB,OAArB,MAAqB,cAAa,YAAY;AAAA,EAC5C,OAAO,UAAU;AAAA,EACjB,OAAO,cACL;AAAA,EACF,OAAO,UAAU,CAAC,IAAI;AAAA,EAEtB,OAAO,QAAQ;AAAA,IACb,GAAG,YAAY;AAAA,EACjB;AAAA,EAEA,MAAM,MAAqB;AACzB,UAAM,KAAK,MAAM,KAAI;AAErB,UAAM,OAAO,MAAM,oBAAoB;AAEvC,QAAI,CAAC,MAAM;AACT,WAAK,IAAI,wBAAwB;AACjC,WAAK,IAAI,8BAA8B;AACvC;AAAA,IACF;AAEA,SAAK,IAAI,EAAE;AACX,SAAK,IAAI,0BAA0B,IAAI,CAAC;AACxC,SAAK,IAAI,EAAE;AAAA,EACb;AACF;","names":[]}
@@ -0,0 +1,230 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ isClaudeCLIAvailable
4
+ } from "../../chunk-M7YCPFIX.js";
5
+ import {
6
+ fetchFromSource
7
+ } from "../../chunk-NGBFJJ7Q.js";
8
+ import {
9
+ resolveSource
10
+ } from "../../chunk-QESUUPOE.js";
11
+ import {
12
+ CLAUDE_DIR
13
+ } from "../../chunk-A3J6IAXK.js";
14
+ import {
15
+ BaseCommand,
16
+ EXIT_CODES
17
+ } from "../../chunk-SYQ7R2JO.js";
18
+ import "../../chunk-TOPAIL5W.js";
19
+ import {
20
+ fileExists,
21
+ readFile
22
+ } from "../../chunk-MMDXNZPF.js";
23
+ import {
24
+ init_esm_shims
25
+ } from "../../chunk-DHET7RCE.js";
26
+
27
+ // src/cli-v2/commands/new/agent.tsx
28
+ init_esm_shims();
29
+ import { Args, Flags } from "@oclif/core";
30
+ import { render, Box, Text } from "ink";
31
+ import { TextInput } from "@inkjs/ui";
32
+ import { useState } from "react";
33
+ import path from "path";
34
+ import { spawn } from "child_process";
35
+ import matter from "gray-matter";
36
+ import { jsx, jsxs } from "react/jsx-runtime";
37
+ var META_AGENT_NAME = "agent-summoner";
38
+ var AGENTS_SUBDIR = ".claude/agents";
39
+ var PurposeInput = ({ onSubmit, onCancel }) => {
40
+ const [error, setError] = useState(null);
41
+ const handleSubmit = (value) => {
42
+ const trimmed = value.trim();
43
+ if (!trimmed) {
44
+ setError("Purpose is required");
45
+ return;
46
+ }
47
+ onSubmit(trimmed);
48
+ };
49
+ return /* @__PURE__ */ jsxs(Box, { flexDirection: "column", children: [
50
+ /* @__PURE__ */ jsx(Text, { bold: true, children: "Create New Agent" }),
51
+ /* @__PURE__ */ jsx(Text, { children: "What should this agent do?" }),
52
+ /* @__PURE__ */ jsx(Text, { dimColor: true, children: "e.g., Manages database migrations with rollback support" }),
53
+ /* @__PURE__ */ jsx(Text, { children: " " }),
54
+ /* @__PURE__ */ jsx(
55
+ TextInput,
56
+ {
57
+ placeholder: "Enter agent purpose...",
58
+ onSubmit: handleSubmit,
59
+ onCancel
60
+ }
61
+ ),
62
+ error && /* @__PURE__ */ jsx(Box, { marginTop: 1, children: /* @__PURE__ */ jsx(Text, { color: "red", children: error }) })
63
+ ] });
64
+ };
65
+ async function fetchMetaAgent(source, forceRefresh) {
66
+ const result = await fetchFromSource(source, {
67
+ forceRefresh,
68
+ subdir: AGENTS_SUBDIR
69
+ });
70
+ const agentPath = path.join(result.path, `${META_AGENT_NAME}.md`);
71
+ if (!await fileExists(agentPath)) {
72
+ throw new Error(
73
+ `Meta-agent not found: ${META_AGENT_NAME}.md
74
+
75
+ Expected at: ${agentPath}
76
+ The source repository may not contain the agent-summoner agent.`
77
+ );
78
+ }
79
+ const content = await readFile(agentPath);
80
+ const { data: frontmatter, content: body } = matter(content);
81
+ const fm = frontmatter;
82
+ const tools = fm.tools ? fm.tools.split(",").map((t) => t.trim()) : void 0;
83
+ return {
84
+ description: fm.description || "Creates new agents",
85
+ prompt: body,
86
+ model: fm.model,
87
+ tools
88
+ };
89
+ }
90
+ function buildAgentPrompt(agentName, purpose, outputDir) {
91
+ return `Create a new Claude Code agent named "${agentName}" in the directory "${outputDir}".
92
+
93
+ Agent Purpose: ${purpose}
94
+
95
+ Requirements:
96
+ 1. Create the agent directory structure at ${outputDir}/${agentName}/
97
+ 2. Create agent.yaml with appropriate configuration
98
+ 3. Create intro.md with the agent's role and context
99
+ 4. Create workflow.md with the agent's operational process
100
+ 5. Optionally create examples.md if relevant examples would help
101
+ 6. Optionally create critical-requirements.md for important rules
102
+
103
+ Follow the existing agent patterns in the codebase. Keep the agent focused and practical.`;
104
+ }
105
+ async function invokeMetaAgent(agentDef, prompt, nonInteractive) {
106
+ const agentsJson = JSON.stringify({
107
+ [META_AGENT_NAME]: {
108
+ description: agentDef.description,
109
+ prompt: agentDef.prompt,
110
+ model: agentDef.model,
111
+ tools: agentDef.tools
112
+ }
113
+ });
114
+ const args = ["--agents", agentsJson, "--agent", META_AGENT_NAME];
115
+ if (nonInteractive) {
116
+ args.push("-p", prompt);
117
+ } else {
118
+ args.push("--prompt", prompt);
119
+ }
120
+ return new Promise((resolve, reject) => {
121
+ const child = spawn("claude", args, {
122
+ stdio: "inherit",
123
+ shell: true
124
+ });
125
+ child.on("error", (error) => {
126
+ reject(new Error(`Failed to spawn claude CLI: ${error.message}`));
127
+ });
128
+ child.on("close", (code) => {
129
+ if (code === 0) {
130
+ resolve();
131
+ } else {
132
+ reject(new Error(`Claude CLI exited with code ${code}`));
133
+ }
134
+ });
135
+ });
136
+ }
137
+ var NewAgent = class _NewAgent extends BaseCommand {
138
+ static summary = "Create a new custom agent using AI generation";
139
+ static description = "Uses the agent-summoner meta-agent to scaffold a new agent with proper structure and documentation.";
140
+ static args = {
141
+ name: Args.string({
142
+ description: "Name of the agent to create",
143
+ required: true
144
+ })
145
+ };
146
+ static flags = {
147
+ ...BaseCommand.baseFlags,
148
+ purpose: Flags.string({
149
+ char: "p",
150
+ description: "Purpose/description of the agent",
151
+ required: false
152
+ }),
153
+ refresh: Flags.boolean({
154
+ char: "r",
155
+ description: "Force refresh remote source",
156
+ default: false
157
+ }),
158
+ "non-interactive": Flags.boolean({
159
+ char: "n",
160
+ description: "Run in non-interactive mode",
161
+ default: false
162
+ })
163
+ };
164
+ async run() {
165
+ const { args, flags } = await this.parse(_NewAgent);
166
+ const projectDir = process.cwd();
167
+ const cliAvailable = await isClaudeCLIAvailable();
168
+ if (!cliAvailable) {
169
+ this.error(
170
+ "Claude CLI not found. Please install it first:\n npm install -g @anthropic-ai/claude-code",
171
+ { exit: EXIT_CODES.ERROR }
172
+ );
173
+ }
174
+ const sourceConfig = await resolveSource(flags.source, projectDir);
175
+ const source = sourceConfig.source;
176
+ let purpose = flags.purpose;
177
+ if (!purpose) {
178
+ let inputResult = null;
179
+ let cancelled = false;
180
+ const { waitUntilExit } = render(
181
+ /* @__PURE__ */ jsx(
182
+ PurposeInput,
183
+ {
184
+ onSubmit: (value) => {
185
+ inputResult = value;
186
+ },
187
+ onCancel: () => {
188
+ cancelled = true;
189
+ }
190
+ }
191
+ )
192
+ );
193
+ await waitUntilExit();
194
+ if (cancelled || !inputResult) {
195
+ this.log("Cancelled");
196
+ this.exit(EXIT_CODES.CANCELLED);
197
+ }
198
+ purpose = inputResult;
199
+ }
200
+ const outputDir = path.join(projectDir, CLAUDE_DIR, "agents", "_custom");
201
+ this.log("");
202
+ this.log(`Agent name: ${args.name}`);
203
+ this.log(`Purpose: ${purpose}`);
204
+ this.log(`Output: ${outputDir}`);
205
+ this.log("");
206
+ this.log("Fetching agent-summoner from source...");
207
+ try {
208
+ const agentDef = await fetchMetaAgent(source, flags.refresh);
209
+ this.log("Meta-agent loaded");
210
+ this.log("");
211
+ const agentPrompt = buildAgentPrompt(args.name, purpose, outputDir);
212
+ this.log("Invoking agent-summoner to create your agent...");
213
+ this.log("\u2500".repeat(60));
214
+ this.log("");
215
+ await invokeMetaAgent(agentDef, agentPrompt, flags["non-interactive"]);
216
+ this.log("");
217
+ this.log("\u2500".repeat(60));
218
+ this.logSuccess("Agent creation complete!");
219
+ } catch (error) {
220
+ this.error(
221
+ error instanceof Error ? error.message : "Unknown error occurred",
222
+ { exit: EXIT_CODES.ERROR }
223
+ );
224
+ }
225
+ }
226
+ };
227
+ export {
228
+ NewAgent as default
229
+ };
230
+ //# sourceMappingURL=agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/cli-v2/commands/new/agent.tsx"],"sourcesContent":["/**\n * Create a new custom agent using AI generation.\n *\n * This command uses the \"agent-summoner\" meta-agent to generate\n * a new agent scaffold with proper structure and documentation.\n */\nimport { Args, Flags } from \"@oclif/core\";\nimport { render, Box, Text } from \"ink\";\nimport { TextInput } from \"@inkjs/ui\";\nimport React, { useState } from \"react\";\nimport path from \"path\";\nimport { spawn } from \"child_process\";\nimport matter from \"gray-matter\";\nimport { BaseCommand } from \"../../base-command.js\";\nimport { fetchFromSource } from \"../../lib/source-fetcher.js\";\nimport { resolveSource } from \"../../lib/config.js\";\nimport { isClaudeCLIAvailable } from \"../../utils/exec.js\";\nimport { fileExists, readFile } from \"../../utils/fs.js\";\nimport { CLAUDE_DIR } from \"../../consts.js\";\nimport { EXIT_CODES } from \"../../lib/exit-codes.js\";\n\nconst META_AGENT_NAME = \"agent-summoner\";\nconst AGENTS_SUBDIR = \".claude/agents\";\n\ninterface AgentDefinition {\n description: string;\n prompt: string;\n model?: string;\n tools?: string[];\n}\n\ninterface AgentFrontmatter {\n name: string;\n description: string;\n tools?: string;\n model?: string;\n permissionMode?: string;\n}\n\ninterface PurposeInputProps {\n onSubmit: (purpose: string) => void;\n onCancel: () => void;\n}\n\nconst PurposeInput: React.FC<PurposeInputProps> = ({ onSubmit, onCancel }) => {\n const [error, setError] = useState<string | null>(null);\n\n const handleSubmit = (value: string) => {\n const trimmed = value.trim();\n if (!trimmed) {\n setError(\"Purpose is required\");\n return;\n }\n onSubmit(trimmed);\n };\n\n return (\n <Box flexDirection=\"column\">\n <Text bold>Create New Agent</Text>\n <Text>What should this agent do?</Text>\n <Text dimColor>\n e.g., Manages database migrations with rollback support\n </Text>\n <Text> </Text>\n <TextInput\n placeholder=\"Enter agent purpose...\"\n onSubmit={handleSubmit}\n onCancel={onCancel}\n />\n {error && (\n <Box marginTop={1}>\n <Text color=\"red\">{error}</Text>\n </Box>\n )}\n </Box>\n );\n};\n\nasync function fetchMetaAgent(\n source: string,\n forceRefresh: boolean,\n): Promise<AgentDefinition> {\n // Fetch the source repository\n const result = await fetchFromSource(source, {\n forceRefresh,\n subdir: AGENTS_SUBDIR,\n });\n\n // Read the agent-summoner.md file\n const agentPath = path.join(result.path, `${META_AGENT_NAME}.md`);\n\n if (!(await fileExists(agentPath))) {\n throw new Error(\n `Meta-agent not found: ${META_AGENT_NAME}.md\\n\\n` +\n `Expected at: ${agentPath}\\n` +\n `The source repository may not contain the agent-summoner agent.`,\n );\n }\n\n const content = await readFile(agentPath);\n\n // Parse frontmatter and body\n const { data: frontmatter, content: body } = matter(content);\n const fm = frontmatter as AgentFrontmatter;\n\n // Construct agent definition\n const tools = fm.tools\n ? fm.tools.split(\",\").map((t: string) => t.trim())\n : undefined;\n\n return {\n description: fm.description || \"Creates new agents\",\n prompt: body,\n model: fm.model,\n tools,\n };\n}\n\nfunction buildAgentPrompt(\n agentName: string,\n purpose: string,\n outputDir: string,\n): string {\n return `Create a new Claude Code agent named \"${agentName}\" in the directory \"${outputDir}\".\n\nAgent Purpose: ${purpose}\n\nRequirements:\n1. Create the agent directory structure at ${outputDir}/${agentName}/\n2. Create agent.yaml with appropriate configuration\n3. Create intro.md with the agent's role and context\n4. Create workflow.md with the agent's operational process\n5. Optionally create examples.md if relevant examples would help\n6. Optionally create critical-requirements.md for important rules\n\nFollow the existing agent patterns in the codebase. Keep the agent focused and practical.`;\n}\n\nasync function invokeMetaAgent(\n agentDef: AgentDefinition,\n prompt: string,\n nonInteractive: boolean,\n): Promise<void> {\n // Construct the agents JSON\n const agentsJson = JSON.stringify({\n [META_AGENT_NAME]: {\n description: agentDef.description,\n prompt: agentDef.prompt,\n model: agentDef.model,\n tools: agentDef.tools,\n },\n });\n\n // Build the command arguments\n const args = [\"--agents\", agentsJson, \"--agent\", META_AGENT_NAME];\n\n if (nonInteractive) {\n args.push(\"-p\", prompt);\n } else {\n // Interactive mode - let user interact with the agent\n args.push(\"--prompt\", prompt);\n }\n\n // Spawn claude CLI\n return new Promise((resolve, reject) => {\n const child = spawn(\"claude\", args, {\n stdio: \"inherit\",\n shell: true,\n });\n\n child.on(\"error\", (error) => {\n reject(new Error(`Failed to spawn claude CLI: ${error.message}`));\n });\n\n child.on(\"close\", (code) => {\n if (code === 0) {\n resolve();\n } else {\n reject(new Error(`Claude CLI exited with code ${code}`));\n }\n });\n });\n}\n\nexport default class NewAgent extends BaseCommand {\n static summary = \"Create a new custom agent using AI generation\";\n static description =\n \"Uses the agent-summoner meta-agent to scaffold a new agent with proper structure and documentation.\";\n\n static args = {\n name: Args.string({\n description: \"Name of the agent to create\",\n required: true,\n }),\n };\n\n static flags = {\n ...BaseCommand.baseFlags,\n purpose: Flags.string({\n char: \"p\",\n description: \"Purpose/description of the agent\",\n required: false,\n }),\n refresh: Flags.boolean({\n char: \"r\",\n description: \"Force refresh remote source\",\n default: false,\n }),\n \"non-interactive\": Flags.boolean({\n char: \"n\",\n description: \"Run in non-interactive mode\",\n default: false,\n }),\n };\n\n async run(): Promise<void> {\n const { args, flags } = await this.parse(NewAgent);\n const projectDir = process.cwd();\n\n // Check if claude CLI is available\n const cliAvailable = await isClaudeCLIAvailable();\n if (!cliAvailable) {\n this.error(\n \"Claude CLI not found. Please install it first:\\n\" +\n \" npm install -g @anthropic-ai/claude-code\",\n { exit: EXIT_CODES.ERROR },\n );\n }\n\n // Resolve source\n const sourceConfig = await resolveSource(flags.source, projectDir);\n const source = sourceConfig.source;\n\n // Get purpose - either from flag or prompt\n let purpose = flags.purpose;\n\n if (!purpose) {\n // Render interactive prompt\n let inputResult: string | null = null;\n let cancelled = false;\n\n const { waitUntilExit } = render(\n <PurposeInput\n onSubmit={(value) => {\n inputResult = value;\n }}\n onCancel={() => {\n cancelled = true;\n }}\n />,\n );\n\n await waitUntilExit();\n\n if (cancelled || !inputResult) {\n this.log(\"Cancelled\");\n this.exit(EXIT_CODES.CANCELLED);\n }\n\n purpose = inputResult;\n }\n\n // Determine output directory\n const outputDir = path.join(projectDir, CLAUDE_DIR, \"agents\", \"_custom\");\n\n this.log(\"\");\n this.log(`Agent name: ${args.name}`);\n this.log(`Purpose: ${purpose}`);\n this.log(`Output: ${outputDir}`);\n this.log(\"\");\n\n this.log(\"Fetching agent-summoner from source...\");\n\n try {\n // Fetch the meta-agent\n const agentDef = await fetchMetaAgent(source, flags.refresh);\n this.log(\"Meta-agent loaded\");\n this.log(\"\");\n\n // Build the prompt\n const agentPrompt = buildAgentPrompt(args.name, purpose, outputDir);\n\n this.log(\"Invoking agent-summoner to create your agent...\");\n this.log(\"─\".repeat(60));\n this.log(\"\");\n\n // Invoke the meta-agent\n await invokeMetaAgent(agentDef, agentPrompt, flags[\"non-interactive\"]);\n\n this.log(\"\");\n this.log(\"─\".repeat(60));\n this.logSuccess(\"Agent creation complete!\");\n } catch (error) {\n this.error(\n error instanceof Error ? error.message : \"Unknown error occurred\",\n { exit: EXIT_CODES.ERROR },\n );\n }\n }\n}\n"],"mappings":"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","names":[]}