@claude-collective/cli 0.26.1 → 0.29.4

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 (233) hide show
  1. package/CHANGELOG.md +117 -0
  2. package/README.md +47 -13
  3. package/config/stacks.yaml +330 -93
  4. package/dist/chunk-56ERY7H7.js +29 -0
  5. package/dist/chunk-56ERY7H7.js.map +1 -0
  6. package/dist/{chunk-OBXAY23Y.js → chunk-5I6VY2E7.js} +5 -5
  7. package/dist/chunk-5I6VY2E7.js.map +1 -0
  8. package/dist/{chunk-324DM2L6.js → chunk-5WIHSJRO.js} +230 -65
  9. package/dist/chunk-5WIHSJRO.js.map +1 -0
  10. package/dist/{chunk-GGFOD5PK.js → chunk-6F3ZKDVE.js} +122 -66
  11. package/dist/chunk-6F3ZKDVE.js.map +1 -0
  12. package/dist/{chunk-DBRUQQUF.js → chunk-7GHTQSWI.js} +5 -1
  13. package/dist/{chunk-DBRUQQUF.js.map → chunk-7GHTQSWI.js.map} +1 -1
  14. package/dist/chunk-7ICBJZV2.js +63 -0
  15. package/dist/chunk-7ICBJZV2.js.map +1 -0
  16. package/dist/{chunk-3X5D7RM5.js → chunk-7UKQZSWT.js} +15 -4
  17. package/dist/chunk-7UKQZSWT.js.map +1 -0
  18. package/dist/{chunk-F4RD5FYM.js → chunk-A4T4YSV4.js} +5 -2
  19. package/dist/chunk-A4T4YSV4.js.map +1 -0
  20. package/dist/{chunk-VVYNZZUX.js → chunk-AG5YGYJT.js} +9 -5
  21. package/dist/chunk-AG5YGYJT.js.map +1 -0
  22. package/dist/chunk-AJFSCLJ7.js +81 -0
  23. package/dist/chunk-AJFSCLJ7.js.map +1 -0
  24. package/dist/{chunk-NQJ47R4N.js → chunk-CQZAKMPJ.js} +66 -14
  25. package/dist/chunk-CQZAKMPJ.js.map +1 -0
  26. package/dist/chunk-DIRH4PDF.js +24 -0
  27. package/dist/chunk-DIRH4PDF.js.map +1 -0
  28. package/dist/{chunk-HIQGK5XJ.js → chunk-DUIYVKFK.js} +123 -86
  29. package/dist/chunk-DUIYVKFK.js.map +1 -0
  30. package/dist/chunk-EP6J44I4.js +142 -0
  31. package/dist/chunk-EP6J44I4.js.map +1 -0
  32. package/dist/{chunk-2YMMJP4Z.js → chunk-EUPMWSM3.js} +92 -29
  33. package/dist/chunk-EUPMWSM3.js.map +1 -0
  34. package/dist/chunk-FUPBGSRA.js +66 -0
  35. package/dist/chunk-FUPBGSRA.js.map +1 -0
  36. package/dist/{chunk-U7HFKR74.js → chunk-FY5D4KIC.js} +5 -2
  37. package/dist/chunk-FY5D4KIC.js.map +1 -0
  38. package/dist/chunk-G5WXKKQM.js +233 -0
  39. package/dist/chunk-G5WXKKQM.js.map +1 -0
  40. package/dist/{chunk-KWYO3M5Q.js → chunk-GVVEPVR7.js} +25 -24
  41. package/dist/chunk-GVVEPVR7.js.map +1 -0
  42. package/dist/chunk-IFODQTCX.js +162 -0
  43. package/dist/chunk-IFODQTCX.js.map +1 -0
  44. package/dist/chunk-IQUBOWWU.js +366 -0
  45. package/dist/chunk-IQUBOWWU.js.map +1 -0
  46. package/dist/{chunk-ETCVEV3S.js → chunk-IRG52AN5.js} +242 -155
  47. package/dist/chunk-IRG52AN5.js.map +1 -0
  48. package/dist/chunk-MQAYAISQ.js +88 -0
  49. package/dist/chunk-MQAYAISQ.js.map +1 -0
  50. package/dist/{chunk-G35SYE6Z.js → chunk-N73GQTCK.js} +37 -104
  51. package/dist/chunk-N73GQTCK.js.map +1 -0
  52. package/dist/{chunk-H7SSBSPR.js → chunk-OA5RCL2L.js} +8 -5
  53. package/dist/chunk-OA5RCL2L.js.map +1 -0
  54. package/dist/{chunk-CZBNDP5B.js → chunk-PNXFJPXF.js} +3 -3
  55. package/dist/{chunk-MCTSHLAF.js → chunk-RI5QEK5W.js} +41 -14
  56. package/dist/chunk-RI5QEK5W.js.map +1 -0
  57. package/dist/chunk-RXC7AF7N.js +31 -0
  58. package/dist/chunk-RXC7AF7N.js.map +1 -0
  59. package/dist/{chunk-CQ7657GA.js → chunk-SSHG7MEE.js} +1248 -735
  60. package/dist/chunk-SSHG7MEE.js.map +1 -0
  61. package/dist/{chunk-4S4FCAA2.js → chunk-VTUPUKFD.js} +26 -31
  62. package/dist/chunk-VTUPUKFD.js.map +1 -0
  63. package/dist/{chunk-XENOESJZ.js → chunk-WLQUQXWO.js} +10 -67
  64. package/dist/chunk-WLQUQXWO.js.map +1 -0
  65. package/dist/chunk-WPED6CL3.js +105 -0
  66. package/dist/chunk-WPED6CL3.js.map +1 -0
  67. package/dist/{chunk-NT4K647L.js → chunk-XPMEGGJK.js} +97 -76
  68. package/dist/chunk-XPMEGGJK.js.map +1 -0
  69. package/dist/chunk-XZKVOPCR.js +75 -0
  70. package/dist/chunk-XZKVOPCR.js.map +1 -0
  71. package/dist/{chunk-ZW2PELOH.js → chunk-ZX5DM4D5.js} +106 -69
  72. package/dist/chunk-ZX5DM4D5.js.map +1 -0
  73. package/dist/commands/build/marketplace.js +21 -20
  74. package/dist/commands/build/marketplace.js.map +1 -1
  75. package/dist/commands/build/plugins.js +7 -11
  76. package/dist/commands/build/plugins.js.map +1 -1
  77. package/dist/commands/build/stack.js +8 -13
  78. package/dist/commands/build/stack.js.map +1 -1
  79. package/dist/commands/compile.js +109 -135
  80. package/dist/commands/compile.js.map +1 -1
  81. package/dist/commands/config/get.js +4 -5
  82. package/dist/commands/config/get.js.map +1 -1
  83. package/dist/commands/config/index.js +5 -6
  84. package/dist/commands/config/index.js.map +1 -1
  85. package/dist/commands/config/path.js +4 -5
  86. package/dist/commands/config/path.js.map +1 -1
  87. package/dist/commands/config/set-project.js +4 -5
  88. package/dist/commands/config/set-project.js.map +1 -1
  89. package/dist/commands/config/show.js +5 -6
  90. package/dist/commands/config/unset-project.js +4 -5
  91. package/dist/commands/config/unset-project.js.map +1 -1
  92. package/dist/commands/diff.js +26 -11
  93. package/dist/commands/diff.js.map +1 -1
  94. package/dist/commands/doctor.js +13 -16
  95. package/dist/commands/doctor.js.map +1 -1
  96. package/dist/commands/edit.js +71 -42
  97. package/dist/commands/edit.js.map +1 -1
  98. package/dist/commands/eject.js +34 -14
  99. package/dist/commands/eject.js.map +1 -1
  100. package/dist/commands/import/skill.js +93 -52
  101. package/dist/commands/import/skill.js.map +1 -1
  102. package/dist/commands/info.js +27 -9
  103. package/dist/commands/info.js.map +1 -1
  104. package/dist/commands/init.js +98 -48
  105. package/dist/commands/init.js.map +1 -1
  106. package/dist/commands/list.js +10 -5
  107. package/dist/commands/list.js.map +1 -1
  108. package/dist/commands/new/agent.js +8 -11
  109. package/dist/commands/new/agent.js.map +1 -1
  110. package/dist/commands/new/skill.js +17 -18
  111. package/dist/commands/new/skill.js.map +1 -1
  112. package/dist/commands/outdated.js +23 -9
  113. package/dist/commands/outdated.js.map +1 -1
  114. package/dist/commands/search.js +23 -20
  115. package/dist/commands/search.js.map +1 -1
  116. package/dist/commands/uninstall.js +28 -21
  117. package/dist/commands/uninstall.js.map +1 -1
  118. package/dist/commands/update.js +30 -22
  119. package/dist/commands/update.js.map +1 -1
  120. package/dist/commands/validate.js +103 -39
  121. package/dist/commands/validate.js.map +1 -1
  122. package/dist/commands/version/bump.js +4 -5
  123. package/dist/commands/version/bump.js.map +1 -1
  124. package/dist/commands/version/index.js +4 -5
  125. package/dist/commands/version/index.js.map +1 -1
  126. package/dist/commands/version/set.js +4 -5
  127. package/dist/commands/version/set.js.map +1 -1
  128. package/dist/commands/version/show.js +4 -5
  129. package/dist/commands/version/show.js.map +1 -1
  130. package/dist/components/common/confirm.test.js +2 -2
  131. package/dist/components/common/confirm.test.js.map +1 -1
  132. package/dist/components/skill-search/skill-search.js +4 -2
  133. package/dist/components/wizard/category-grid.js +3 -1
  134. package/dist/components/wizard/category-grid.test.js +63 -64
  135. package/dist/components/wizard/category-grid.test.js.map +1 -1
  136. package/dist/components/wizard/domain-selection.js +13 -0
  137. package/dist/components/wizard/help-modal.js +10 -0
  138. package/dist/components/wizard/help-modal.js.map +1 -0
  139. package/dist/components/wizard/menu-item.js +2 -1
  140. package/dist/components/wizard/search-modal.js +3 -1
  141. package/dist/components/wizard/search-modal.test.js +4 -2
  142. package/dist/components/wizard/search-modal.test.js.map +1 -1
  143. package/dist/components/wizard/section-progress.js +2 -1
  144. package/dist/components/wizard/section-progress.test.js +2 -1
  145. package/dist/components/wizard/section-progress.test.js.map +1 -1
  146. package/dist/components/wizard/source-grid.js +6 -2
  147. package/dist/components/wizard/source-grid.test.js +49 -45
  148. package/dist/components/wizard/source-grid.test.js.map +1 -1
  149. package/dist/components/wizard/stack-selection.js +15 -0
  150. package/dist/components/wizard/stack-selection.js.map +1 -0
  151. package/dist/components/wizard/step-approach.js +8 -6
  152. package/dist/components/wizard/step-approach.test.js +11 -9
  153. package/dist/components/wizard/step-approach.test.js.map +1 -1
  154. package/dist/components/wizard/step-build.js +9 -13
  155. package/dist/components/wizard/step-build.test.js +27 -45
  156. package/dist/components/wizard/step-build.test.js.map +1 -1
  157. package/dist/components/wizard/step-confirm.js +2 -1
  158. package/dist/components/wizard/step-confirm.test.js +6 -5
  159. package/dist/components/wizard/step-confirm.test.js.map +1 -1
  160. package/dist/components/wizard/step-refine.js +2 -1
  161. package/dist/components/wizard/step-refine.test.js +3 -2
  162. package/dist/components/wizard/step-refine.test.js.map +1 -1
  163. package/dist/components/wizard/step-settings.js +8 -6
  164. package/dist/components/wizard/step-settings.test.js +12 -10
  165. package/dist/components/wizard/step-settings.test.js.map +1 -1
  166. package/dist/components/wizard/step-sources.js +11 -9
  167. package/dist/components/wizard/step-sources.test.js +16 -15
  168. package/dist/components/wizard/step-sources.test.js.map +1 -1
  169. package/dist/components/wizard/step-stack.js +9 -6
  170. package/dist/components/wizard/step-stack.test.js +15 -12
  171. package/dist/components/wizard/step-stack.test.js.map +1 -1
  172. package/dist/components/wizard/view-title.js +2 -1
  173. package/dist/components/wizard/wizard-layout.js +7 -9
  174. package/dist/components/wizard/wizard-tabs.js +2 -1
  175. package/dist/components/wizard/wizard-tabs.test.js +2 -1
  176. package/dist/components/wizard/wizard-tabs.test.js.map +1 -1
  177. package/dist/components/wizard/wizard.js +26 -20
  178. package/dist/config/stacks.yaml +330 -93
  179. package/dist/hooks/init.js +3 -4
  180. package/dist/hooks/init.js.map +1 -1
  181. package/dist/source-manager-TV2YGPAN.js +15 -0
  182. package/dist/source-manager-TV2YGPAN.js.map +1 -0
  183. package/dist/stores/wizard-store.js +4 -3
  184. package/dist/stores/wizard-store.test.js +272 -25
  185. package/dist/stores/wizard-store.test.js.map +1 -1
  186. package/package.json +2 -1
  187. package/src/schemas/agent-frontmatter.schema.json +84 -0
  188. package/src/schemas/agent.schema.json +93 -0
  189. package/src/schemas/hooks.schema.json +47 -0
  190. package/src/schemas/marketplace.schema.json +119 -0
  191. package/src/schemas/metadata.schema.json +113 -0
  192. package/src/schemas/plugin.schema.json +130 -0
  193. package/src/schemas/project-config.schema.json +125 -0
  194. package/src/schemas/project-source-config.schema.json +81 -0
  195. package/src/schemas/skill-frontmatter.schema.json +42 -0
  196. package/src/schemas/skills-matrix.schema.json +467 -0
  197. package/src/schemas/stack.schema.json +191 -0
  198. package/src/schemas/stacks.schema.json +111 -0
  199. package/dist/chunk-2OW7FCIF.js +0 -197
  200. package/dist/chunk-2OW7FCIF.js.map +0 -1
  201. package/dist/chunk-2YMMJP4Z.js.map +0 -1
  202. package/dist/chunk-324DM2L6.js.map +0 -1
  203. package/dist/chunk-3X5D7RM5.js.map +0 -1
  204. package/dist/chunk-4S4FCAA2.js.map +0 -1
  205. package/dist/chunk-CQ7657GA.js.map +0 -1
  206. package/dist/chunk-ETCVEV3S.js.map +0 -1
  207. package/dist/chunk-F4RD5FYM.js.map +0 -1
  208. package/dist/chunk-G35SYE6Z.js.map +0 -1
  209. package/dist/chunk-GGFOD5PK.js.map +0 -1
  210. package/dist/chunk-H7SSBSPR.js.map +0 -1
  211. package/dist/chunk-HIQGK5XJ.js.map +0 -1
  212. package/dist/chunk-HWD32NP7.js +0 -19
  213. package/dist/chunk-HWD32NP7.js.map +0 -1
  214. package/dist/chunk-KWYO3M5Q.js.map +0 -1
  215. package/dist/chunk-MCTSHLAF.js.map +0 -1
  216. package/dist/chunk-NQJ47R4N.js.map +0 -1
  217. package/dist/chunk-NT4K647L.js.map +0 -1
  218. package/dist/chunk-O6ZTD7ZI.js +0 -70
  219. package/dist/chunk-O6ZTD7ZI.js.map +0 -1
  220. package/dist/chunk-OBXAY23Y.js.map +0 -1
  221. package/dist/chunk-TMED5DQ2.js +0 -210
  222. package/dist/chunk-TMED5DQ2.js.map +0 -1
  223. package/dist/chunk-U7HFKR74.js.map +0 -1
  224. package/dist/chunk-UEMRJI2K.js +0 -146
  225. package/dist/chunk-UEMRJI2K.js.map +0 -1
  226. package/dist/chunk-UNN7523L.js +0 -78
  227. package/dist/chunk-UNN7523L.js.map +0 -1
  228. package/dist/chunk-VVYNZZUX.js.map +0 -1
  229. package/dist/chunk-XENOESJZ.js.map +0 -1
  230. package/dist/chunk-ZW2PELOH.js.map +0 -1
  231. package/dist/source-manager-VWIIDTK5.js +0 -16
  232. /package/dist/{chunk-CZBNDP5B.js.map → chunk-PNXFJPXF.js.map} +0 -0
  233. /package/dist/{source-manager-VWIIDTK5.js.map → components/wizard/domain-selection.js.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/cli/commands/doctor.ts"],"sourcesContent":["import { Flags } from \"@oclif/core\";\nimport path from \"path\";\nimport { BaseCommand } from \"../base-command\";\nimport { setVerbose } from \"../utils/logger\";\nimport { fileExists, glob, directoryExists } from \"../utils/fs\";\nimport { unique } from \"remeda\";\nimport { EXIT_CODES } from \"../lib/exit-codes\";\nimport { loadProjectConfig, validateProjectConfig } from \"../lib/configuration\";\nimport { loadSkillsMatrixFromSource } from \"../lib/loading\";\nimport { discoverLocalSkills } from \"../lib/skills\";\nimport type { AgentName, MergedSkillsMatrix, ProjectConfig, SkillId } from \"../types\";\n\ntype CheckResult = {\n status: \"pass\" | \"fail\" | \"warn\" | \"skip\";\n message: string;\n details?: string[];\n};\n\nasync function checkConfigValid(projectDir: string): Promise<CheckResult> {\n const loaded = await loadProjectConfig(projectDir);\n\n if (!loaded) {\n return {\n status: \"fail\",\n message: \".claude/config.yaml not found\",\n details: [\"Run 'cc init' to create a configuration\"],\n };\n }\n\n const validation = validateProjectConfig(loaded.config);\n\n if (!validation.valid) {\n return {\n status: \"fail\",\n message: \".claude/config.yaml has errors\",\n details: validation.errors,\n };\n }\n\n if (validation.warnings.length > 0) {\n return {\n status: \"warn\",\n message: \".claude/config.yaml has warnings\",\n details: validation.warnings,\n };\n }\n\n return {\n status: \"pass\",\n message: \".claude/config.yaml is valid\",\n };\n}\n\nasync function checkSkillsResolved(\n config: ProjectConfig,\n matrix: MergedSkillsMatrix,\n projectDir: string,\n): Promise<CheckResult> {\n const configSkills: SkillId[] = [];\n\n if (config.stack) {\n for (const agentConfig of Object.values(config.stack)) {\n for (const skillId of Object.values(agentConfig)) {\n configSkills.push(skillId);\n }\n }\n }\n\n const uniqueSkills = unique(configSkills);\n\n if (uniqueSkills.length === 0) {\n return {\n status: \"pass\",\n message: \"No skills configured\",\n };\n }\n\n const localResult = await discoverLocalSkills(projectDir);\n const localSkillIds = new Set(localResult?.skills.map((s) => s.id) ?? []);\n\n const missingSkills: string[] = [];\n for (const skillId of uniqueSkills) {\n const inMatrix = skillId in matrix.skills;\n const inLocal = localSkillIds.has(skillId);\n if (!inMatrix && !inLocal) {\n missingSkills.push(skillId);\n }\n }\n\n if (missingSkills.length > 0) {\n return {\n status: \"fail\",\n message: `${uniqueSkills.length - missingSkills.length}/${uniqueSkills.length} skills found`,\n details: missingSkills.map((s) => `- ${s} (not found)`),\n };\n }\n\n return {\n status: \"pass\",\n message: `${uniqueSkills.length}/${uniqueSkills.length} skills found`,\n };\n}\n\nasync function checkAgentsCompiled(\n config: ProjectConfig,\n projectDir: string,\n): Promise<CheckResult> {\n const agents = config.agents ?? [];\n\n if (agents.length === 0) {\n return {\n status: \"pass\",\n message: \"No agents configured\",\n };\n }\n\n const agentsDir = path.join(projectDir, \".claude\", \"agents\");\n const missingAgents: string[] = [];\n\n for (const agent of agents) {\n const agentPath = path.join(agentsDir, `${agent}.md`);\n if (!(await fileExists(agentPath))) {\n missingAgents.push(agent);\n }\n }\n\n if (missingAgents.length > 0) {\n return {\n status: \"warn\",\n message: `${missingAgents.length} agent${missingAgents.length === 1 ? \"\" : \"s\"} need${missingAgents.length === 1 ? \"s\" : \"\"} recompilation`,\n details: missingAgents.map((a) => `- ${a} (missing)`),\n };\n }\n\n return {\n status: \"pass\",\n message: `${agents.length}/${agents.length} agents compiled`,\n };\n}\n\nasync function checkNoOrphans(config: ProjectConfig, projectDir: string): Promise<CheckResult> {\n const agentsDir = path.join(projectDir, \".claude\", \"agents\");\n\n if (!(await directoryExists(agentsDir))) {\n return {\n status: \"pass\",\n message: \"No agents directory\",\n };\n }\n\n const mdFiles = await glob(\"*.md\", agentsDir);\n const configAgents = new Set(config.agents ?? []);\n\n const orphanedFiles: string[] = [];\n for (const file of mdFiles) {\n const agentName = file.replace(/\\.md$/, \"\");\n // Boundary cast: filename from filesystem compared against typed config\n if (!configAgents.has(agentName as AgentName)) {\n orphanedFiles.push(agentName);\n }\n }\n\n if (orphanedFiles.length > 0) {\n return {\n status: \"warn\",\n message: `${orphanedFiles.length} orphaned agent file${orphanedFiles.length === 1 ? \"\" : \"s\"}`,\n details: orphanedFiles.map((f) => `- ${f}.md (not in config)`),\n };\n }\n\n return {\n status: \"pass\",\n message: \"No orphaned agent files\",\n };\n}\n\nasync function checkSourceReachable(\n sourceFlag: string | undefined,\n projectDir: string,\n): Promise<CheckResult> {\n try {\n const result = await loadSkillsMatrixFromSource({\n sourceFlag,\n projectDir,\n });\n\n const skillCount = Object.keys(result.matrix.skills).length;\n const sourceLabel = result.isLocal ? \"local\" : \"remote\";\n\n return {\n status: \"pass\",\n message: `Connected to ${sourceLabel}: ${result.sourcePath}`,\n details: [`${skillCount} skills available`],\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n status: \"fail\",\n message: \"Failed to load source\",\n details: [message],\n };\n }\n}\n\nconst CHECK_WIDTH = 20;\n\nfunction formatCheckName(name: string): string {\n return name.padEnd(CHECK_WIDTH);\n}\n\nfunction formatStatus(status: CheckResult[\"status\"]): string {\n switch (status) {\n case \"pass\":\n return \"\\u2713\"; // ✓\n case \"fail\":\n return \"\\u2717\"; // ✗\n case \"warn\":\n return \"!\";\n case \"skip\":\n return \"-\";\n }\n}\n\nfunction formatCheckLine(name: string, result: CheckResult, verbose: boolean): string[] {\n const statusIcon = formatStatus(result.status);\n const nameFormatted = formatCheckName(name);\n const lines: string[] = [];\n\n lines.push(` ${nameFormatted}${statusIcon} ${result.message}`);\n\n const shouldShowDetails =\n result.details &&\n result.details.length > 0 &&\n (verbose || result.status === \"fail\" || result.status === \"warn\");\n\n if (shouldShowDetails) {\n for (const detail of result.details!) {\n lines.push(` ${\" \".repeat(CHECK_WIDTH)} ${detail}`);\n }\n }\n\n return lines;\n}\n\nfunction formatSummary(results: CheckResult[]): string {\n let passed = 0;\n let warnings = 0;\n let errors = 0;\n\n for (const result of results) {\n switch (result.status) {\n case \"pass\":\n passed++;\n break;\n case \"warn\":\n warnings++;\n break;\n case \"fail\":\n errors++;\n break;\n // skip doesn't count\n }\n }\n\n const parts: string[] = [];\n parts.push(`${passed} passed`);\n\n if (warnings > 0) {\n parts.push(`${warnings} warning${warnings === 1 ? \"\" : \"s\"}`);\n } else {\n parts.push(`0 warnings`);\n }\n\n if (errors > 0) {\n parts.push(`${errors} error${errors === 1 ? \"\" : \"s\"}`);\n } else {\n parts.push(`0 errors`);\n }\n\n return ` Summary: ${parts.join(\", \")}`;\n}\n\nfunction formatTips(results: CheckResult[]): string[] {\n const hasAgentWarning = results.some(\n (r) => r.status === \"warn\" && r.message.includes(\"recompilation\"),\n );\n const hasConfigError = results.some((r) => r.status === \"fail\" && r.message.includes(\"config\"));\n const hasSkillError = results.some(\n (r) => r.status === \"fail\" && r.message.includes(\"skills found\"),\n );\n\n const tips: string[] = [];\n\n if (hasAgentWarning) {\n tips.push(\" Tip: Run 'cc compile' to generate missing agent files\");\n }\n if (hasConfigError) {\n tips.push(\" Tip: Run 'cc init' to create or fix configuration\");\n }\n if (hasSkillError) {\n tips.push(\" Tip: Check skill IDs in config match available skills\");\n }\n\n return tips;\n}\n\nexport default class Doctor extends BaseCommand {\n static summary = \"Diagnose common configuration issues\";\n\n static description =\n \"Run diagnostic checks on your Claude Collective configuration to identify issues with config validity, skill resolution, agent compilation, and source connectivity.\";\n\n static examples = [\n \"<%= config.bin %> <%= command.id %>\",\n \"<%= config.bin %> <%= command.id %> --verbose\",\n \"<%= config.bin %> <%= command.id %> --source /path/to/marketplace\",\n ];\n\n static flags = {\n source: Flags.string({\n char: \"s\",\n description: \"Skills source path or URL\",\n }),\n verbose: Flags.boolean({\n char: \"v\",\n description: \"Show detailed output\",\n default: false,\n }),\n };\n\n async run(): Promise<void> {\n const { flags } = await this.parse(Doctor);\n\n setVerbose(flags.verbose);\n\n const projectDir = process.cwd();\n\n this.log(\"\");\n this.log(\"Claude Collective Doctor\");\n this.log(\"\");\n this.log(\" Checking configuration health...\");\n this.log(\"\");\n\n const results: CheckResult[] = [];\n\n const configResult = await checkConfigValid(projectDir);\n results.push(configResult);\n formatCheckLine(\"Config Valid\", configResult, flags.verbose).forEach((line) => this.log(line));\n\n let config: ProjectConfig | null = null;\n let matrix: MergedSkillsMatrix | null = null;\n\n if (configResult.status !== \"fail\") {\n const loaded = await loadProjectConfig(projectDir);\n config = loaded?.config ?? null;\n }\n\n const sourceResult = await checkSourceReachable(flags.source, projectDir);\n\n try {\n const result = await loadSkillsMatrixFromSource({\n sourceFlag: flags.source,\n projectDir,\n });\n matrix = result.matrix;\n } catch {\n // Matrix unavailable\n }\n\n if (config && matrix) {\n const skillsResult = await checkSkillsResolved(config, matrix, projectDir);\n results.push(skillsResult);\n formatCheckLine(\"Skills Resolved\", skillsResult, flags.verbose).forEach((line) =>\n this.log(line),\n );\n } else {\n const skipResult: CheckResult = {\n status: \"skip\",\n message: \"Skipped (config invalid)\",\n };\n results.push(skipResult);\n formatCheckLine(\"Skills Resolved\", skipResult, flags.verbose).forEach((line) =>\n this.log(line),\n );\n }\n\n if (config) {\n const agentsResult = await checkAgentsCompiled(config, projectDir);\n results.push(agentsResult);\n formatCheckLine(\"Agents Compiled\", agentsResult, flags.verbose).forEach((line) =>\n this.log(line),\n );\n } else {\n const skipResult: CheckResult = {\n status: \"skip\",\n message: \"Skipped (config invalid)\",\n };\n results.push(skipResult);\n formatCheckLine(\"Agents Compiled\", skipResult, flags.verbose).forEach((line) =>\n this.log(line),\n );\n }\n\n if (config) {\n const orphansResult = await checkNoOrphans(config, projectDir);\n results.push(orphansResult);\n formatCheckLine(\"No Orphans\", orphansResult, flags.verbose).forEach((line) => this.log(line));\n } else {\n const skipResult: CheckResult = {\n status: \"skip\",\n message: \"Skipped (config invalid)\",\n };\n results.push(skipResult);\n formatCheckLine(\"No Orphans\", skipResult, flags.verbose).forEach((line) => this.log(line));\n }\n\n results.push(sourceResult);\n formatCheckLine(\"Source Reachable\", sourceResult, flags.verbose).forEach((line) =>\n this.log(line),\n );\n\n this.log(\"\");\n this.log(formatSummary(results));\n\n const tips = formatTips(results);\n if (tips.length > 0) {\n this.log(\"\");\n tips.forEach((tip) => this.log(tip));\n }\n\n this.log(\"\");\n\n const hasErrors = results.some((r) => r.status === \"fail\");\n if (hasErrors) {\n this.exit(EXIT_CODES.ERROR);\n }\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/cli/commands/doctor.ts"],"sourcesContent":["import { Flags } from \"@oclif/core\";\nimport path from \"path\";\nimport { BaseCommand } from \"../base-command\";\nimport { getErrorMessage } from \"../utils/errors\";\nimport { EXIT_CODES } from \"../lib/exit-codes\";\nimport { loadProjectConfig, validateProjectConfig } from \"../lib/configuration\";\nimport { loadSkillsMatrixFromSource } from \"../lib/loading\";\nimport { discoverLocalSkills } from \"../lib/skills\";\nimport { getStackSkillIds } from \"../lib/stacks\";\nimport type { AgentName, MergedSkillsMatrix, ProjectConfig, SkillId } from \"../types\";\nimport { fileExists, glob, directoryExists } from \"../utils/fs\";\nimport { setVerbose } from \"../utils/logger\";\n\ntype CheckResult = {\n status: \"pass\" | \"fail\" | \"warn\" | \"skip\";\n message: string;\n details?: string[];\n};\n\nasync function checkConfigValid(projectDir: string): Promise<CheckResult> {\n const loaded = await loadProjectConfig(projectDir);\n\n if (!loaded) {\n return {\n status: \"fail\",\n message: \".claude/config.yaml not found\",\n details: [\"Run 'cc init' to create a configuration\"],\n };\n }\n\n const validation = validateProjectConfig(loaded.config);\n\n if (!validation.valid) {\n return {\n status: \"fail\",\n message: \".claude/config.yaml has errors\",\n details: validation.errors,\n };\n }\n\n if (validation.warnings.length > 0) {\n return {\n status: \"warn\",\n message: \".claude/config.yaml has warnings\",\n details: validation.warnings,\n };\n }\n\n return {\n status: \"pass\",\n message: \".claude/config.yaml is valid\",\n };\n}\n\nasync function checkSkillsResolved(\n config: ProjectConfig,\n matrix: MergedSkillsMatrix,\n projectDir: string,\n): Promise<CheckResult> {\n const uniqueSkills = config.stack ? getStackSkillIds(config.stack) : [];\n\n if (uniqueSkills.length === 0) {\n return {\n status: \"pass\",\n message: \"No skills configured\",\n };\n }\n\n const localResult = await discoverLocalSkills(projectDir);\n const localSkillIds = new Set(localResult?.skills.map((s) => s.id) ?? []);\n\n const missingSkills: string[] = [];\n for (const skillId of uniqueSkills) {\n const inMatrix = skillId in matrix.skills;\n const inLocal = localSkillIds.has(skillId);\n if (!inMatrix && !inLocal) {\n missingSkills.push(skillId);\n }\n }\n\n if (missingSkills.length > 0) {\n return {\n status: \"fail\",\n message: `${uniqueSkills.length - missingSkills.length}/${uniqueSkills.length} skills found`,\n details: missingSkills.map((s) => `- ${s} (not found)`),\n };\n }\n\n return {\n status: \"pass\",\n message: `${uniqueSkills.length}/${uniqueSkills.length} skills found`,\n };\n}\n\nasync function checkAgentsCompiled(\n config: ProjectConfig,\n projectDir: string,\n): Promise<CheckResult> {\n const agents = config.agents ?? [];\n\n if (agents.length === 0) {\n return {\n status: \"pass\",\n message: \"No agents configured\",\n };\n }\n\n const agentsDir = path.join(projectDir, \".claude\", \"agents\");\n const missingAgents: string[] = [];\n\n for (const agent of agents) {\n const agentPath = path.join(agentsDir, `${agent}.md`);\n if (!(await fileExists(agentPath))) {\n missingAgents.push(agent);\n }\n }\n\n if (missingAgents.length > 0) {\n return {\n status: \"warn\",\n message: `${missingAgents.length} agent${missingAgents.length === 1 ? \"\" : \"s\"} need${missingAgents.length === 1 ? \"s\" : \"\"} recompilation`,\n details: missingAgents.map((a) => `- ${a} (missing)`),\n };\n }\n\n return {\n status: \"pass\",\n message: `${agents.length}/${agents.length} agents compiled`,\n };\n}\n\nasync function checkNoOrphans(config: ProjectConfig, projectDir: string): Promise<CheckResult> {\n const agentsDir = path.join(projectDir, \".claude\", \"agents\");\n\n if (!(await directoryExists(agentsDir))) {\n return {\n status: \"pass\",\n message: \"No agents directory\",\n };\n }\n\n const mdFiles = await glob(\"*.md\", agentsDir);\n const configAgents = new Set(config.agents ?? []);\n\n const orphanedFiles: string[] = [];\n for (const file of mdFiles) {\n const agentName = file.replace(/\\.md$/, \"\");\n // Boundary cast: filename from filesystem compared against typed config\n if (!configAgents.has(agentName as AgentName)) {\n orphanedFiles.push(agentName);\n }\n }\n\n if (orphanedFiles.length > 0) {\n return {\n status: \"warn\",\n message: `${orphanedFiles.length} orphaned agent file${orphanedFiles.length === 1 ? \"\" : \"s\"}`,\n details: orphanedFiles.map((f) => `- ${f}.md (not in config)`),\n };\n }\n\n return {\n status: \"pass\",\n message: \"No orphaned agent files\",\n };\n}\n\nasync function checkSourceReachable(\n sourceFlag: string | undefined,\n projectDir: string,\n): Promise<CheckResult> {\n try {\n const result = await loadSkillsMatrixFromSource({\n sourceFlag,\n projectDir,\n });\n\n const skillCount = Object.keys(result.matrix.skills).length;\n const sourceLabel = result.isLocal ? \"local\" : \"remote\";\n\n return {\n status: \"pass\",\n message: `Connected to ${sourceLabel}: ${result.sourcePath}`,\n details: [`${skillCount} skills available`],\n };\n } catch (error) {\n const message = getErrorMessage(error);\n return {\n status: \"fail\",\n message: \"Failed to load source\",\n details: [message],\n };\n }\n}\n\nconst CHECK_WIDTH = 20;\n\nfunction formatCheckName(name: string): string {\n return name.padEnd(CHECK_WIDTH);\n}\n\nfunction formatStatus(status: CheckResult[\"status\"]): string {\n switch (status) {\n case \"pass\":\n return \"\\u2713\"; // ✓\n case \"fail\":\n return \"\\u2717\"; // ✗\n case \"warn\":\n return \"!\";\n case \"skip\":\n return \"-\";\n default:\n return \"?\";\n }\n}\n\nfunction formatCheckLine(name: string, result: CheckResult, verbose: boolean): string[] {\n const statusIcon = formatStatus(result.status);\n const nameFormatted = formatCheckName(name);\n const lines: string[] = [];\n\n lines.push(` ${nameFormatted}${statusIcon} ${result.message}`);\n\n const shouldShowDetails =\n result.details &&\n result.details.length > 0 &&\n (verbose || result.status === \"fail\" || result.status === \"warn\");\n\n if (shouldShowDetails) {\n for (const detail of result.details!) {\n lines.push(` ${\" \".repeat(CHECK_WIDTH)} ${detail}`);\n }\n }\n\n return lines;\n}\n\nfunction formatSummary(results: CheckResult[]): string {\n let passed = 0;\n let warnings = 0;\n let errors = 0;\n\n for (const result of results) {\n switch (result.status) {\n case \"pass\":\n passed++;\n break;\n case \"warn\":\n warnings++;\n break;\n case \"fail\":\n errors++;\n break;\n // skip doesn't count\n default:\n break;\n }\n }\n\n const parts: string[] = [];\n parts.push(`${passed} passed`);\n\n if (warnings > 0) {\n parts.push(`${warnings} warning${warnings === 1 ? \"\" : \"s\"}`);\n } else {\n parts.push(`0 warnings`);\n }\n\n if (errors > 0) {\n parts.push(`${errors} error${errors === 1 ? \"\" : \"s\"}`);\n } else {\n parts.push(`0 errors`);\n }\n\n return ` Summary: ${parts.join(\", \")}`;\n}\n\nfunction formatTips(results: CheckResult[]): string[] {\n const hasAgentWarning = results.some(\n (r) => r.status === \"warn\" && r.message.includes(\"recompilation\"),\n );\n const hasConfigError = results.some((r) => r.status === \"fail\" && r.message.includes(\"config\"));\n const hasSkillError = results.some(\n (r) => r.status === \"fail\" && r.message.includes(\"skills found\"),\n );\n\n const tips: string[] = [];\n\n if (hasAgentWarning) {\n tips.push(\" Tip: Run 'cc compile' to generate missing agent files\");\n }\n if (hasConfigError) {\n tips.push(\" Tip: Run 'cc init' to create or fix configuration\");\n }\n if (hasSkillError) {\n tips.push(\" Tip: Check skill IDs in config match available skills\");\n }\n\n return tips;\n}\n\nexport default class Doctor extends BaseCommand {\n static summary = \"Diagnose common configuration issues\";\n\n static description =\n \"Run diagnostic checks on your Claude Collective configuration to identify issues with config validity, skill resolution, agent compilation, and source connectivity.\";\n\n static examples = [\n \"<%= config.bin %> <%= command.id %>\",\n \"<%= config.bin %> <%= command.id %> --verbose\",\n \"<%= config.bin %> <%= command.id %> --source /path/to/marketplace\",\n ];\n\n static flags = {\n source: Flags.string({\n char: \"s\",\n description: \"Skills source path or URL\",\n }),\n verbose: Flags.boolean({\n char: \"v\",\n description: \"Show detailed output\",\n default: false,\n }),\n };\n\n async run(): Promise<void> {\n const { flags } = await this.parse(Doctor);\n\n setVerbose(flags.verbose);\n\n const projectDir = process.cwd();\n\n this.log(\"\");\n this.log(\"Claude Collective Doctor\");\n this.log(\"\");\n this.log(\" Checking configuration health...\");\n this.log(\"\");\n\n const results: CheckResult[] = [];\n\n const configResult = await checkConfigValid(projectDir);\n results.push(configResult);\n formatCheckLine(\"Config Valid\", configResult, flags.verbose).forEach((line) => this.log(line));\n\n let config: ProjectConfig | null = null;\n let matrix: MergedSkillsMatrix | null = null;\n\n if (configResult.status !== \"fail\") {\n const loaded = await loadProjectConfig(projectDir);\n config = loaded?.config ?? null;\n }\n\n const sourceResult = await checkSourceReachable(flags.source, projectDir);\n\n try {\n const result = await loadSkillsMatrixFromSource({\n sourceFlag: flags.source,\n projectDir,\n });\n matrix = result.matrix;\n } catch {\n // Matrix unavailable\n }\n\n if (config && matrix) {\n const skillsResult = await checkSkillsResolved(config, matrix, projectDir);\n results.push(skillsResult);\n formatCheckLine(\"Skills Resolved\", skillsResult, flags.verbose).forEach((line) =>\n this.log(line),\n );\n } else {\n const skipResult: CheckResult = {\n status: \"skip\",\n message: \"Skipped (config invalid)\",\n };\n results.push(skipResult);\n formatCheckLine(\"Skills Resolved\", skipResult, flags.verbose).forEach((line) =>\n this.log(line),\n );\n }\n\n if (config) {\n const agentsResult = await checkAgentsCompiled(config, projectDir);\n results.push(agentsResult);\n formatCheckLine(\"Agents Compiled\", agentsResult, flags.verbose).forEach((line) =>\n this.log(line),\n );\n } else {\n const skipResult: CheckResult = {\n status: \"skip\",\n message: \"Skipped (config invalid)\",\n };\n results.push(skipResult);\n formatCheckLine(\"Agents Compiled\", skipResult, flags.verbose).forEach((line) =>\n this.log(line),\n );\n }\n\n if (config) {\n const orphansResult = await checkNoOrphans(config, projectDir);\n results.push(orphansResult);\n formatCheckLine(\"No Orphans\", orphansResult, flags.verbose).forEach((line) => this.log(line));\n } else {\n const skipResult: CheckResult = {\n status: \"skip\",\n message: \"Skipped (config invalid)\",\n };\n results.push(skipResult);\n formatCheckLine(\"No Orphans\", skipResult, flags.verbose).forEach((line) => this.log(line));\n }\n\n results.push(sourceResult);\n formatCheckLine(\"Source Reachable\", sourceResult, flags.verbose).forEach((line) =>\n this.log(line),\n );\n\n this.log(\"\");\n this.log(formatSummary(results));\n\n const tips = formatTips(results);\n if (tips.length > 0) {\n this.log(\"\");\n tips.forEach((tip) => this.log(tip));\n }\n\n this.log(\"\");\n\n const hasErrors = results.some((r) => r.status === \"fail\");\n if (hasErrors) {\n this.exit(EXIT_CODES.ERROR);\n }\n }\n}\n"],"mappings":"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","names":[]}
@@ -2,30 +2,42 @@
2
2
  import {
3
3
  getAgentDefinitions,
4
4
  recompileAgents
5
- } from "../chunk-NT4K647L.js";
5
+ } from "../chunk-XPMEGGJK.js";
6
6
  import {
7
7
  Wizard
8
- } from "../chunk-HIQGK5XJ.js";
9
- import "../chunk-G35SYE6Z.js";
10
- import "../chunk-XENOESJZ.js";
11
- import "../chunk-UEMRJI2K.js";
12
- import "../chunk-3X5D7RM5.js";
13
- import "../chunk-2YMMJP4Z.js";
14
- import "../chunk-VVYNZZUX.js";
8
+ } from "../chunk-DUIYVKFK.js";
9
+ import "../chunk-EP6J44I4.js";
10
+ import "../chunk-7UKQZSWT.js";
11
+ import "../chunk-G5WXKKQM.js";
12
+ import "../chunk-N73GQTCK.js";
13
+ import "../chunk-56ERY7H7.js";
14
+ import "../chunk-XZKVOPCR.js";
15
+ import "../chunk-GVVEPVR7.js";
16
+ import "../chunk-EUPMWSM3.js";
17
+ import "../chunk-FY5D4KIC.js";
18
+ import "../chunk-AG5YGYJT.js";
15
19
  import "../chunk-V2ZIH7HV.js";
16
- import "../chunk-2OW7FCIF.js";
17
- import "../chunk-ZW2PELOH.js";
18
- import "../chunk-4S4FCAA2.js";
19
- import "../chunk-KWYO3M5Q.js";
20
- import "../chunk-U7HFKR74.js";
21
- import "../chunk-H7SSBSPR.js";
22
- import "../chunk-ETCVEV3S.js";
23
- import "../chunk-UNN7523L.js";
24
- import "../chunk-TMED5DQ2.js";
20
+ import "../chunk-WLQUQXWO.js";
21
+ import "../chunk-MQAYAISQ.js";
22
+ import "../chunk-OA5RCL2L.js";
23
+ import "../chunk-ZX5DM4D5.js";
24
+ import "../chunk-DIRH4PDF.js";
25
+ import "../chunk-VTUPUKFD.js";
26
+ import "../chunk-7ICBJZV2.js";
27
+ import "../chunk-IRG52AN5.js";
28
+ import "../chunk-WPED6CL3.js";
29
+ import "../chunk-AJFSCLJ7.js";
30
+ import "../chunk-RXC7AF7N.js";
31
+ import "../chunk-IQUBOWWU.js";
32
+ import {
33
+ ERROR_MESSAGES,
34
+ INFO_MESSAGES,
35
+ STATUS_MESSAGES
36
+ } from "../chunk-FUPBGSRA.js";
25
37
  import {
26
38
  BaseCommand,
27
39
  EXIT_CODES
28
- } from "../chunk-OBXAY23Y.js";
40
+ } from "../chunk-5I6VY2E7.js";
29
41
  import {
30
42
  archiveLocalSkill,
31
43
  bumpPluginVersion,
@@ -34,20 +46,20 @@ import {
34
46
  copySkillsToPluginFromSource,
35
47
  detectInstallation,
36
48
  getCollectivePluginDir,
49
+ getMarketplaceLabel,
37
50
  getPluginSkillIds,
38
51
  getPluginSkillsDir,
39
52
  loadSkillsMatrixFromSource,
40
- restoreArchivedSkill
41
- } from "../chunk-CQ7657GA.js";
53
+ restoreArchivedSkill,
54
+ typedEntries
55
+ } from "../chunk-SSHG7MEE.js";
42
56
  import {
43
57
  directoryExists,
44
58
  ensureDir,
59
+ getErrorMessage,
45
60
  remove
46
- } from "../chunk-324DM2L6.js";
47
- import {
48
- typedEntries
49
- } from "../chunk-HWD32NP7.js";
50
- import "../chunk-O6ZTD7ZI.js";
61
+ } from "../chunk-5WIHSJRO.js";
62
+ import "../chunk-IFODQTCX.js";
51
63
  import {
52
64
  init_esm_shims
53
65
  } from "../chunk-AWKZ5BDL.js";
@@ -67,6 +79,20 @@ function formatSourceDisplayName(sourceName) {
67
79
  var Edit = class _Edit extends BaseCommand {
68
80
  static summary = "Edit skills in the plugin";
69
81
  static description = "Modify the currently installed skills via interactive wizard";
82
+ static examples = [
83
+ {
84
+ description: "Open the edit wizard",
85
+ command: "<%= config.bin %> <%= command.id %>"
86
+ },
87
+ {
88
+ description: "Edit with a custom source",
89
+ command: "<%= config.bin %> <%= command.id %> --source github:org/marketplace"
90
+ },
91
+ {
92
+ description: "Force refresh skills from remote",
93
+ command: "<%= config.bin %> <%= command.id %> --refresh"
94
+ }
95
+ ];
70
96
  static flags = {
71
97
  ...BaseCommand.baseFlags,
72
98
  refresh: Flags.boolean({
@@ -81,7 +107,7 @@ var Edit = class _Edit extends BaseCommand {
81
107
  const { flags } = await this.parse(_Edit);
82
108
  const installation = await detectInstallation();
83
109
  if (!installation) {
84
- this.error("No installation found. Run 'cc init' first to set up Claude Collective.", {
110
+ this.error(ERROR_MESSAGES.NO_INSTALLATION, {
85
111
  exit: EXIT_CODES.ERROR
86
112
  });
87
113
  }
@@ -90,7 +116,7 @@ var Edit = class _Edit extends BaseCommand {
90
116
  const modeLabel = installation.mode === "local" ? "Local" : "Plugin";
91
117
  this.log(`Edit ${modeLabel} Skills
92
118
  `);
93
- this.log("Resolving marketplace source...");
119
+ this.log(STATUS_MESSAGES.LOADING_MARKETPLACE_SOURCE);
94
120
  let sourceResult;
95
121
  try {
96
122
  sourceResult = await loadSkillsMatrixFromSource({
@@ -116,13 +142,16 @@ var Edit = class _Edit extends BaseCommand {
116
142
  this.handleError(error);
117
143
  }
118
144
  let wizardResult = null;
145
+ const marketplaceLabel = getMarketplaceLabel(sourceResult);
119
146
  const { waitUntilExit } = render(
120
147
  /* @__PURE__ */ jsx(
121
148
  Wizard,
122
149
  {
123
150
  matrix: sourceResult.matrix,
124
151
  version: this.config.version,
152
+ marketplaceLabel,
125
153
  initialStep: "build",
154
+ initialInstallMode: sourceResult.marketplace ? "plugin" : "local",
126
155
  installedSkillIds: currentSkillIds,
127
156
  projectDir: process.cwd(),
128
157
  onComplete: (result2) => {
@@ -170,7 +199,7 @@ var Edit = class _Edit extends BaseCommand {
170
199
  this.log("");
171
200
  }
172
201
  if (!hasSkillChanges && !hasSourceChanges) {
173
- this.log("No changes made.");
202
+ this.log(INFO_MESSAGES.NO_CHANGES_MADE);
174
203
  this.log("Plugin unchanged\n");
175
204
  return;
176
205
  }
@@ -205,9 +234,7 @@ var Edit = class _Edit extends BaseCommand {
205
234
  try {
206
235
  await claudePluginInstall(pluginRef, "project", projectDir);
207
236
  } catch (error) {
208
- this.warn(
209
- `Failed to install plugin ${pluginRef}: ${error instanceof Error ? error.message : String(error)}`
210
- );
237
+ this.warn(`Failed to install plugin ${pluginRef}: ${getErrorMessage(error)}`);
211
238
  }
212
239
  }
213
240
  for (const skillId of removedSkills) {
@@ -215,13 +242,11 @@ var Edit = class _Edit extends BaseCommand {
215
242
  try {
216
243
  await claudePluginUninstall(skillId, "project", projectDir);
217
244
  } catch (error) {
218
- this.warn(
219
- `Failed to uninstall plugin ${skillId}: ${error instanceof Error ? error.message : String(error)}`
220
- );
245
+ this.warn(`Failed to uninstall plugin ${skillId}: ${getErrorMessage(error)}`);
221
246
  }
222
247
  }
223
248
  }
224
- this.log("Updating plugin skills...");
249
+ this.log(STATUS_MESSAGES.COPYING_SKILLS);
225
250
  try {
226
251
  if (await directoryExists(pluginSkillsDir)) {
227
252
  await remove(pluginSkillsDir);
@@ -232,15 +257,21 @@ var Edit = class _Edit extends BaseCommand {
232
257
  pluginDir,
233
258
  sourceResult.matrix,
234
259
  sourceResult,
235
- result.sourceSelections
260
+ result.sourceSelections,
261
+ (completed, total) => {
262
+ process.stdout.write(`\r Copying ${completed} of ${total} skills...`);
263
+ }
236
264
  );
237
- this.log(`\u2713 Plugin updated with ${result.selectedSkills.length} skills
265
+ process.stdout.write("\n");
266
+ this.log(`\u2713 Copied ${result.selectedSkills.length} skills to plugin
238
267
  `);
239
268
  } catch (error) {
240
269
  this.handleError(error);
241
270
  }
242
271
  let sourcePath;
243
- this.log(flags["agent-source"] ? "Fetching agent partials..." : "Loading agent partials...");
272
+ this.log(
273
+ flags["agent-source"] ? STATUS_MESSAGES.FETCHING_AGENT_PARTIALS : STATUS_MESSAGES.LOADING_AGENT_PARTIALS
274
+ );
244
275
  try {
245
276
  const agentDefs = await getAgentDefinitions(flags["agent-source"], {
246
277
  forceRefresh: flags.refresh
@@ -250,7 +281,7 @@ var Edit = class _Edit extends BaseCommand {
250
281
  } catch (error) {
251
282
  this.handleError(error);
252
283
  }
253
- this.log("Recompiling agents...");
284
+ this.log(STATUS_MESSAGES.RECOMPILING_AGENTS);
254
285
  try {
255
286
  const recompileResult = await recompileAgents({
256
287
  pluginDir,
@@ -271,9 +302,7 @@ var Edit = class _Edit extends BaseCommand {
271
302
  this.log("\u2713 No agents to recompile\n");
272
303
  }
273
304
  } catch (error) {
274
- this.warn(
275
- `Agent recompilation failed: ${error instanceof Error ? error.message : String(error)}`
276
- );
305
+ this.warn(`Agent recompilation failed: ${getErrorMessage(error)}`);
277
306
  this.log("You can manually recompile with 'cc compile'.\n");
278
307
  }
279
308
  this.log("Updating plugin version...");
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/cli/commands/edit.tsx"],"sourcesContent":["import { Flags } from \"@oclif/core\";\nimport { render } from \"ink\";\nimport { BaseCommand } from \"../base-command.js\";\nimport { Wizard, type WizardResultV2 } from \"../components/wizard/wizard.js\";\nimport { loadSkillsMatrixFromSource } from \"../lib/loading/index.js\";\nimport { directoryExists, ensureDir, remove } from \"../utils/fs.js\";\nimport {\n getCollectivePluginDir,\n getPluginSkillsDir,\n getPluginSkillIds,\n bumpPluginVersion,\n} from \"../lib/plugins/index.js\";\nimport {\n copySkillsToPluginFromSource,\n archiveLocalSkill,\n restoreArchivedSkill,\n} from \"../lib/skills/index.js\";\nimport { recompileAgents, getAgentDefinitions } from \"../lib/agents/index.js\";\nimport { EXIT_CODES } from \"../lib/exit-codes.js\";\nimport { detectInstallation } from \"../lib/installation/index.js\";\nimport { claudePluginInstall, claudePluginUninstall } from \"../utils/exec.js\";\nimport type { SkillId } from \"../types/index.js\";\nimport { typedEntries } from \"../utils/typed-object.js\";\n\nconst SOURCE_DISPLAY_NAMES: Record<string, string> = {\n public: \"Public\",\n local: \"Local\",\n};\n\nfunction formatSourceDisplayName(sourceName: string): string {\n return SOURCE_DISPLAY_NAMES[sourceName] ?? sourceName;\n}\n\nexport default class Edit extends BaseCommand {\n static summary = \"Edit skills in the plugin\";\n static description = \"Modify the currently installed skills via interactive wizard\";\n\n static flags = {\n ...BaseCommand.baseFlags,\n refresh: Flags.boolean({\n description: \"Force refresh from remote sources\",\n default: false,\n }),\n \"agent-source\": Flags.string({\n description: \"Remote agent partials source (default: local CLI)\",\n }),\n };\n\n async run(): Promise<void> {\n const { flags } = await this.parse(Edit);\n\n const installation = await detectInstallation();\n\n if (!installation) {\n this.error(\"No installation found. Run 'cc init' first to set up Claude Collective.\", {\n exit: EXIT_CODES.ERROR,\n });\n }\n\n const pluginDir = getCollectivePluginDir();\n const pluginSkillsDir =\n installation.mode === \"local\" ? installation.skillsDir : getPluginSkillsDir(pluginDir);\n\n const modeLabel = installation.mode === \"local\" ? \"Local\" : \"Plugin\";\n this.log(`Edit ${modeLabel} Skills\\n`);\n\n this.log(\"Resolving marketplace source...\");\n let sourceResult;\n try {\n sourceResult = await loadSkillsMatrixFromSource({\n sourceFlag: flags.source,\n projectDir: process.cwd(),\n forceRefresh: flags.refresh,\n });\n\n const sourceInfo = sourceResult.isLocal ? \"local\" : sourceResult.sourceConfig.sourceOrigin;\n this.log(\n `✓ Loaded ${Object.keys(sourceResult.matrix.skills).length} skills (${sourceInfo})\\n`,\n );\n } catch (error) {\n this.handleError(error);\n }\n\n this.log(\"Reading current skills...\");\n let currentSkillIds: SkillId[];\n try {\n currentSkillIds = await getPluginSkillIds(pluginSkillsDir, sourceResult.matrix);\n this.log(`✓ Current plugin has ${currentSkillIds.length} skills\\n`);\n } catch (error) {\n this.handleError(error);\n }\n\n let wizardResult: WizardResultV2 | null = null;\n\n const { waitUntilExit } = render(\n <Wizard\n matrix={sourceResult.matrix}\n version={this.config.version}\n initialStep=\"build\"\n installedSkillIds={currentSkillIds}\n projectDir={process.cwd()}\n onComplete={(result) => {\n wizardResult = result as WizardResultV2;\n }}\n onCancel={() => {\n this.log(\"\\nEdit cancelled\");\n }}\n />,\n );\n\n await waitUntilExit();\n\n const result = wizardResult as WizardResultV2 | null;\n\n if (!result || result.cancelled) {\n this.error(\"Cancelled\", { exit: EXIT_CODES.CANCELLED });\n }\n\n if (!result.validation.valid) {\n const errorMessages = result.validation.errors.map((e) => e.message).join(\"\\n \");\n this.error(`Selection has validation errors:\\n ${errorMessages}`, {\n exit: EXIT_CODES.ERROR,\n });\n }\n\n const addedSkills = result.selectedSkills.filter((id) => !currentSkillIds.includes(id));\n const removedSkills = currentSkillIds.filter((id) => !result.selectedSkills.includes(id));\n\n // Detect source changes (user changed which source provides a skill)\n const sourceChanges = new Map<SkillId, { from: string; to: string }>();\n for (const [skillId, selectedSource] of typedEntries<SkillId, string>(\n result.sourceSelections,\n )) {\n const skill = sourceResult.matrix.skills[skillId];\n if (skill?.activeSource && skill.activeSource.name !== selectedSource) {\n sourceChanges.set(skillId, {\n from: skill.activeSource.name,\n to: selectedSource,\n });\n }\n }\n\n const hasSourceChanges = sourceChanges.size > 0;\n const hasSkillChanges = addedSkills.length > 0 || removedSkills.length > 0;\n\n if (result.validation.warnings.length > 0) {\n this.log(\"\\nWarnings:\");\n for (const warning of result.validation.warnings) {\n this.warn(` ! ${warning.message}`);\n }\n this.log(\"\");\n }\n\n if (!hasSkillChanges && !hasSourceChanges) {\n this.log(\"No changes made.\");\n this.log(\"Plugin unchanged\\n\");\n return;\n }\n\n this.log(\"\\nChanges:\");\n for (const skillId of addedSkills) {\n const skill = sourceResult.matrix.skills[skillId];\n this.log(` + ${skill?.displayName || skillId}`);\n }\n for (const skillId of removedSkills) {\n const skill = sourceResult.matrix.skills[skillId];\n this.log(` - ${skill?.displayName || skillId}`);\n }\n for (const [skillId, change] of sourceChanges) {\n const fromLabel = formatSourceDisplayName(change.from);\n const toLabel = formatSourceDisplayName(change.to);\n this.log(` ~ ${skillId} (${fromLabel} \\u2192 ${toLabel})`);\n }\n this.log(\"\");\n\n // Apply source switches (archive/restore local skills)\n const projectDir = process.cwd();\n for (const [skillId, change] of sourceChanges) {\n if (change.from === \"local\") {\n await archiveLocalSkill(projectDir, skillId);\n }\n if (change.to === \"local\") {\n await restoreArchivedSkill(projectDir, skillId);\n }\n }\n\n // Install/uninstall individual skill plugins when in plugin mode with a marketplace\n if (installation.mode === \"plugin\" && sourceResult.marketplace) {\n for (const skillId of addedSkills) {\n const pluginRef = `${skillId}@${sourceResult.marketplace}`;\n this.log(`Installing plugin: ${pluginRef}...`);\n try {\n await claudePluginInstall(pluginRef, \"project\", projectDir);\n } catch (error) {\n this.warn(\n `Failed to install plugin ${pluginRef}: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n for (const skillId of removedSkills) {\n this.log(`Uninstalling plugin: ${skillId}...`);\n try {\n await claudePluginUninstall(skillId, \"project\", projectDir);\n } catch (error) {\n this.warn(\n `Failed to uninstall plugin ${skillId}: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n }\n\n this.log(\"Updating plugin skills...\");\n try {\n if (await directoryExists(pluginSkillsDir)) {\n await remove(pluginSkillsDir);\n }\n await ensureDir(pluginSkillsDir);\n\n await copySkillsToPluginFromSource(\n result.selectedSkills,\n pluginDir,\n sourceResult.matrix,\n sourceResult,\n result.sourceSelections,\n );\n this.log(`✓ Plugin updated with ${result.selectedSkills.length} skills\\n`);\n } catch (error) {\n this.handleError(error);\n }\n\n let sourcePath: string;\n this.log(flags[\"agent-source\"] ? \"Fetching agent partials...\" : \"Loading agent partials...\");\n try {\n const agentDefs = await getAgentDefinitions(flags[\"agent-source\"], {\n forceRefresh: flags.refresh,\n });\n sourcePath = agentDefs.sourcePath;\n this.log(flags[\"agent-source\"] ? \"✓ Agent partials fetched\\n\" : \"✓ Agent partials loaded\\n\");\n } catch (error) {\n this.handleError(error);\n }\n\n this.log(\"Recompiling agents...\");\n try {\n const recompileResult = await recompileAgents({\n pluginDir,\n sourcePath,\n });\n\n if (recompileResult.failed.length > 0) {\n this.log(\n `✓ Recompiled ${recompileResult.compiled.length} agents (${recompileResult.failed.length} failed)\\n`,\n );\n for (const warning of recompileResult.warnings) {\n this.warn(warning);\n }\n } else if (recompileResult.compiled.length > 0) {\n this.log(`✓ Recompiled ${recompileResult.compiled.length} agents\\n`);\n } else {\n this.log(\"✓ No agents to recompile\\n\");\n }\n } catch (error) {\n this.warn(\n `Agent recompilation failed: ${error instanceof Error ? error.message : String(error)}`,\n );\n this.log(\"You can manually recompile with 'cc compile'.\\n\");\n }\n\n this.log(\"Updating plugin version...\");\n try {\n const newVersion = await bumpPluginVersion(pluginDir, \"patch\");\n this.log(`✓ Version bumped to ${newVersion}\\n`);\n } catch (error) {\n this.handleError(error);\n }\n\n const summaryParts = [`${addedSkills.length} added`, `${removedSkills.length} removed`];\n if (hasSourceChanges) {\n summaryParts.push(`${sourceChanges.size} source${sourceChanges.size > 1 ? \"s\" : \"\"} changed`);\n }\n this.log(`\\n\\u2713 Plugin updated! (${summaryParts.join(\", \")})\\n`);\n }\n}\n"],"mappings":"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","names":["result"]}
1
+ {"version":3,"sources":["../../src/cli/commands/edit.tsx"],"sourcesContent":["import { Flags } from \"@oclif/core\";\nimport { render } from \"ink\";\n\nimport { BaseCommand } from \"../base-command.js\";\nimport { Wizard, type WizardResultV2 } from \"../components/wizard/wizard.js\";\nimport { getErrorMessage } from \"../utils/errors.js\";\nimport { loadSkillsMatrixFromSource, getMarketplaceLabel } from \"../lib/loading/index.js\";\nimport { directoryExists, ensureDir, remove } from \"../utils/fs.js\";\nimport {\n getCollectivePluginDir,\n getPluginSkillsDir,\n getPluginSkillIds,\n bumpPluginVersion,\n} from \"../lib/plugins/index.js\";\nimport {\n copySkillsToPluginFromSource,\n archiveLocalSkill,\n restoreArchivedSkill,\n} from \"../lib/skills/index.js\";\nimport { recompileAgents, getAgentDefinitions } from \"../lib/agents/index.js\";\nimport { EXIT_CODES } from \"../lib/exit-codes.js\";\nimport { detectInstallation } from \"../lib/installation/index.js\";\nimport { ERROR_MESSAGES, STATUS_MESSAGES, INFO_MESSAGES } from \"../utils/messages.js\";\nimport { claudePluginInstall, claudePluginUninstall } from \"../utils/exec.js\";\nimport type { SkillId } from \"../types/index.js\";\nimport { typedEntries } from \"../utils/typed-object.js\";\n\nconst SOURCE_DISPLAY_NAMES: Record<string, string> = {\n public: \"Public\",\n local: \"Local\",\n};\n\nfunction formatSourceDisplayName(sourceName: string): string {\n return SOURCE_DISPLAY_NAMES[sourceName] ?? sourceName;\n}\n\nexport default class Edit extends BaseCommand {\n static summary = \"Edit skills in the plugin\";\n static description = \"Modify the currently installed skills via interactive wizard\";\n\n static examples = [\n {\n description: \"Open the edit wizard\",\n command: \"<%= config.bin %> <%= command.id %>\",\n },\n {\n description: \"Edit with a custom source\",\n command: \"<%= config.bin %> <%= command.id %> --source github:org/marketplace\",\n },\n {\n description: \"Force refresh skills from remote\",\n command: \"<%= config.bin %> <%= command.id %> --refresh\",\n },\n ];\n\n static flags = {\n ...BaseCommand.baseFlags,\n refresh: Flags.boolean({\n description: \"Force refresh from remote sources\",\n default: false,\n }),\n \"agent-source\": Flags.string({\n description: \"Remote agent partials source (default: local CLI)\",\n }),\n };\n\n async run(): Promise<void> {\n const { flags } = await this.parse(Edit);\n\n const installation = await detectInstallation();\n\n if (!installation) {\n this.error(ERROR_MESSAGES.NO_INSTALLATION, {\n exit: EXIT_CODES.ERROR,\n });\n }\n\n const pluginDir = getCollectivePluginDir();\n const pluginSkillsDir =\n installation.mode === \"local\" ? installation.skillsDir : getPluginSkillsDir(pluginDir);\n\n const modeLabel = installation.mode === \"local\" ? \"Local\" : \"Plugin\";\n this.log(`Edit ${modeLabel} Skills\\n`);\n\n this.log(STATUS_MESSAGES.LOADING_MARKETPLACE_SOURCE);\n let sourceResult;\n try {\n sourceResult = await loadSkillsMatrixFromSource({\n sourceFlag: flags.source,\n projectDir: process.cwd(),\n forceRefresh: flags.refresh,\n });\n\n const sourceInfo = sourceResult.isLocal ? \"local\" : sourceResult.sourceConfig.sourceOrigin;\n this.log(\n `✓ Loaded ${Object.keys(sourceResult.matrix.skills).length} skills (${sourceInfo})\\n`,\n );\n } catch (error) {\n this.handleError(error);\n }\n\n this.log(\"Reading current skills...\");\n let currentSkillIds: SkillId[];\n try {\n currentSkillIds = await getPluginSkillIds(pluginSkillsDir, sourceResult.matrix);\n this.log(`✓ Current plugin has ${currentSkillIds.length} skills\\n`);\n } catch (error) {\n this.handleError(error);\n }\n\n let wizardResult: WizardResultV2 | null = null;\n const marketplaceLabel = getMarketplaceLabel(sourceResult);\n\n const { waitUntilExit } = render(\n <Wizard\n matrix={sourceResult.matrix}\n version={this.config.version}\n marketplaceLabel={marketplaceLabel}\n initialStep=\"build\"\n initialInstallMode={sourceResult.marketplace ? \"plugin\" : \"local\"}\n installedSkillIds={currentSkillIds}\n projectDir={process.cwd()}\n onComplete={(result) => {\n wizardResult = result as WizardResultV2;\n }}\n onCancel={() => {\n this.log(\"\\nEdit cancelled\");\n }}\n />,\n );\n\n await waitUntilExit();\n\n const result = wizardResult as WizardResultV2 | null;\n\n if (!result || result.cancelled) {\n this.error(\"Cancelled\", { exit: EXIT_CODES.CANCELLED });\n }\n\n if (!result.validation.valid) {\n const errorMessages = result.validation.errors.map((e) => e.message).join(\"\\n \");\n this.error(`Selection has validation errors:\\n ${errorMessages}`, {\n exit: EXIT_CODES.ERROR,\n });\n }\n\n const addedSkills = result.selectedSkills.filter((id) => !currentSkillIds.includes(id));\n const removedSkills = currentSkillIds.filter((id) => !result.selectedSkills.includes(id));\n\n // Detect source changes (user changed which source provides a skill)\n const sourceChanges = new Map<SkillId, { from: string; to: string }>();\n for (const [skillId, selectedSource] of typedEntries<SkillId, string>(\n result.sourceSelections,\n )) {\n const skill = sourceResult.matrix.skills[skillId];\n if (skill?.activeSource && skill.activeSource.name !== selectedSource) {\n sourceChanges.set(skillId, {\n from: skill.activeSource.name,\n to: selectedSource,\n });\n }\n }\n\n const hasSourceChanges = sourceChanges.size > 0;\n const hasSkillChanges = addedSkills.length > 0 || removedSkills.length > 0;\n\n if (result.validation.warnings.length > 0) {\n this.log(\"\\nWarnings:\");\n for (const warning of result.validation.warnings) {\n this.warn(` ! ${warning.message}`);\n }\n this.log(\"\");\n }\n\n if (!hasSkillChanges && !hasSourceChanges) {\n this.log(INFO_MESSAGES.NO_CHANGES_MADE);\n this.log(\"Plugin unchanged\\n\");\n return;\n }\n\n this.log(\"\\nChanges:\");\n for (const skillId of addedSkills) {\n const skill = sourceResult.matrix.skills[skillId];\n this.log(` + ${skill?.displayName || skillId}`);\n }\n for (const skillId of removedSkills) {\n const skill = sourceResult.matrix.skills[skillId];\n this.log(` - ${skill?.displayName || skillId}`);\n }\n for (const [skillId, change] of sourceChanges) {\n const fromLabel = formatSourceDisplayName(change.from);\n const toLabel = formatSourceDisplayName(change.to);\n this.log(` ~ ${skillId} (${fromLabel} \\u2192 ${toLabel})`);\n }\n this.log(\"\");\n\n // Apply source switches (archive/restore local skills)\n const projectDir = process.cwd();\n for (const [skillId, change] of sourceChanges) {\n if (change.from === \"local\") {\n await archiveLocalSkill(projectDir, skillId);\n }\n if (change.to === \"local\") {\n await restoreArchivedSkill(projectDir, skillId);\n }\n }\n\n // Install/uninstall individual skill plugins when in plugin mode with a marketplace\n if (installation.mode === \"plugin\" && sourceResult.marketplace) {\n for (const skillId of addedSkills) {\n const pluginRef = `${skillId}@${sourceResult.marketplace}`;\n this.log(`Installing plugin: ${pluginRef}...`);\n try {\n await claudePluginInstall(pluginRef, \"project\", projectDir);\n } catch (error) {\n this.warn(`Failed to install plugin ${pluginRef}: ${getErrorMessage(error)}`);\n }\n }\n for (const skillId of removedSkills) {\n this.log(`Uninstalling plugin: ${skillId}...`);\n try {\n await claudePluginUninstall(skillId, \"project\", projectDir);\n } catch (error) {\n this.warn(`Failed to uninstall plugin ${skillId}: ${getErrorMessage(error)}`);\n }\n }\n }\n\n this.log(STATUS_MESSAGES.COPYING_SKILLS);\n try {\n if (await directoryExists(pluginSkillsDir)) {\n await remove(pluginSkillsDir);\n }\n await ensureDir(pluginSkillsDir);\n\n await copySkillsToPluginFromSource(\n result.selectedSkills,\n pluginDir,\n sourceResult.matrix,\n sourceResult,\n result.sourceSelections,\n (completed, total) => {\n process.stdout.write(`\\r Copying ${completed} of ${total} skills...`);\n },\n );\n process.stdout.write(\"\\n\");\n this.log(`✓ Copied ${result.selectedSkills.length} skills to plugin\\n`);\n } catch (error) {\n this.handleError(error);\n }\n\n let sourcePath: string;\n this.log(\n flags[\"agent-source\"]\n ? STATUS_MESSAGES.FETCHING_AGENT_PARTIALS\n : STATUS_MESSAGES.LOADING_AGENT_PARTIALS,\n );\n try {\n const agentDefs = await getAgentDefinitions(flags[\"agent-source\"], {\n forceRefresh: flags.refresh,\n });\n sourcePath = agentDefs.sourcePath;\n this.log(flags[\"agent-source\"] ? \"✓ Agent partials fetched\\n\" : \"✓ Agent partials loaded\\n\");\n } catch (error) {\n this.handleError(error);\n }\n\n this.log(STATUS_MESSAGES.RECOMPILING_AGENTS);\n try {\n const recompileResult = await recompileAgents({\n pluginDir,\n sourcePath,\n });\n\n if (recompileResult.failed.length > 0) {\n this.log(\n `✓ Recompiled ${recompileResult.compiled.length} agents (${recompileResult.failed.length} failed)\\n`,\n );\n for (const warning of recompileResult.warnings) {\n this.warn(warning);\n }\n } else if (recompileResult.compiled.length > 0) {\n this.log(`✓ Recompiled ${recompileResult.compiled.length} agents\\n`);\n } else {\n this.log(\"✓ No agents to recompile\\n\");\n }\n } catch (error) {\n this.warn(`Agent recompilation failed: ${getErrorMessage(error)}`);\n this.log(\"You can manually recompile with 'cc compile'.\\n\");\n }\n\n this.log(\"Updating plugin version...\");\n try {\n const newVersion = await bumpPluginVersion(pluginDir, \"patch\");\n this.log(`✓ Version bumped to ${newVersion}\\n`);\n } catch (error) {\n this.handleError(error);\n }\n\n const summaryParts = [`${addedSkills.length} added`, `${removedSkills.length} removed`];\n if (hasSourceChanges) {\n summaryParts.push(`${sourceChanges.size} source${sourceChanges.size > 1 ? \"s\" : \"\"} changed`);\n }\n this.log(`\\n\\u2713 Plugin updated! (${summaryParts.join(\", \")})\\n`);\n }\n}\n"],"mappings":"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","names":["result"]}
@@ -2,30 +2,30 @@
2
2
  import {
3
3
  BaseCommand,
4
4
  EXIT_CODES
5
- } from "../chunk-OBXAY23Y.js";
5
+ } from "../chunk-5I6VY2E7.js";
6
6
  import {
7
7
  copySkillsToLocalFlattened,
8
8
  loadProjectSourceConfig,
9
9
  loadSkillsMatrixFromSource,
10
10
  resolveSource,
11
- saveSourceToProjectConfig
12
- } from "../chunk-CQ7657GA.js";
11
+ saveSourceToProjectConfig,
12
+ typedKeys
13
+ } from "../chunk-SSHG7MEE.js";
13
14
  import {
14
15
  copy,
15
16
  directoryExists,
16
17
  ensureDir,
17
18
  fileExists,
18
19
  writeFile
19
- } from "../chunk-324DM2L6.js";
20
- import {
21
- typedKeys
22
- } from "../chunk-HWD32NP7.js";
20
+ } from "../chunk-5WIHSJRO.js";
23
21
  import {
24
22
  CLAUDE_SRC_DIR,
25
23
  DIRS,
26
24
  LOCAL_SKILLS_PATH,
27
- PROJECT_ROOT
28
- } from "../chunk-O6ZTD7ZI.js";
25
+ PROJECT_ROOT,
26
+ STANDARD_FILES,
27
+ YAML_FORMATTING
28
+ } from "../chunk-IFODQTCX.js";
29
29
  import {
30
30
  init_esm_shims
31
31
  } from "../chunk-AWKZ5BDL.js";
@@ -40,6 +40,24 @@ var EJECT_TYPES = ["agent-partials", "skills", "all"];
40
40
  var Eject = class _Eject extends BaseCommand {
41
41
  static summary = "Eject skills or agent partials for local customization";
42
42
  static description = "Copy agent partials or skills to your project for customization. Agent partials are always copied from the CLI. Skills are copied from the configured source (public marketplace by default).";
43
+ static examples = [
44
+ {
45
+ description: "Eject agent partials for customization",
46
+ command: "<%= config.bin %> <%= command.id %> agent-partials"
47
+ },
48
+ {
49
+ description: "Eject skills to local directory",
50
+ command: "<%= config.bin %> <%= command.id %> skills"
51
+ },
52
+ {
53
+ description: "Eject everything with force overwrite",
54
+ command: "<%= config.bin %> <%= command.id %> all --force"
55
+ },
56
+ {
57
+ description: "Eject to a custom output directory",
58
+ command: "<%= config.bin %> <%= command.id %> skills -o ./custom-dir"
59
+ }
60
+ ];
43
61
  static args = {
44
62
  type: Args.string({
45
63
  description: "What to eject: agent-partials, skills, all",
@@ -112,8 +130,8 @@ var Eject = class _Eject extends BaseCommand {
112
130
  await this.ejectSkills(
113
131
  projectDir,
114
132
  flags.force,
115
- directOutput,
116
133
  sourceResult,
134
+ directOutput,
117
135
  directOutput ? outputBase : void 0
118
136
  );
119
137
  break;
@@ -122,11 +140,13 @@ var Eject = class _Eject extends BaseCommand {
122
140
  await this.ejectSkills(
123
141
  projectDir,
124
142
  flags.force,
125
- directOutput,
126
143
  sourceResult,
144
+ directOutput,
127
145
  directOutput ? outputBase : void 0
128
146
  );
129
147
  break;
148
+ default:
149
+ break;
130
150
  }
131
151
  if (flags.source) {
132
152
  await saveSourceToProjectConfig(projectDir, flags.source);
@@ -139,7 +159,7 @@ var Eject = class _Eject extends BaseCommand {
139
159
  }
140
160
  // Ensures a minimal config.yaml exists so `cc compile` works after eject
141
161
  async ensureMinimalConfig(projectDir, sourceFlag, sourceResult) {
142
- const configPath = path.join(projectDir, CLAUDE_SRC_DIR, "config.yaml");
162
+ const configPath = path.join(projectDir, CLAUDE_SRC_DIR, STANDARD_FILES.CONFIG_YAML);
143
163
  if (await fileExists(configPath)) {
144
164
  return;
145
165
  }
@@ -165,7 +185,7 @@ var Eject = class _Eject extends BaseCommand {
165
185
  config.agents_source = existingProjectConfig.agents_source;
166
186
  }
167
187
  await ensureDir(path.join(projectDir, CLAUDE_SRC_DIR));
168
- let configContent = stringifyYaml(config, { indent: 2 });
188
+ let configContent = stringifyYaml(config, { indent: YAML_FORMATTING.INDENT });
169
189
  const exampleStackComment = `
170
190
  # Example stack configuration (uncomment and customize):
171
191
  #
@@ -208,7 +228,7 @@ var Eject = class _Eject extends BaseCommand {
208
228
  this.logSuccess(`Agent partials ejected to ${destDir}`);
209
229
  this.log("You can now customize templates, agent intro, workflow, and examples locally.");
210
230
  }
211
- async ejectSkills(projectDir, force, directOutput = false, sourceResult, customOutputBase) {
231
+ async ejectSkills(projectDir, force, sourceResult, directOutput = false, customOutputBase) {
212
232
  const destDir = directOutput && customOutputBase ? customOutputBase : path.join(projectDir, LOCAL_SKILLS_PATH);
213
233
  if (await directoryExists(destDir) && !force) {
214
234
  this.warn(`Skills already exist at ${destDir}. Use --force to overwrite.`);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/cli/commands/eject.ts"],"sourcesContent":["import { Args, Flags } from \"@oclif/core\";\nimport path from \"path\";\nimport os from \"os\";\nimport { stringify as stringifyYaml } from \"yaml\";\nimport { BaseCommand } from \"../base-command.js\";\nimport { copy, ensureDir, directoryExists, fileExists, writeFile } from \"../utils/fs.js\";\nimport { CLAUDE_SRC_DIR, DIRS, LOCAL_SKILLS_PATH, PROJECT_ROOT } from \"../consts.js\";\nimport { EXIT_CODES } from \"../lib/exit-codes.js\";\nimport { loadSkillsMatrixFromSource, type SourceLoadResult } from \"../lib/loading/index.js\";\nimport { copySkillsToLocalFlattened } from \"../lib/skills/index.js\";\nimport type { SkillId } from \"../types/index.js\";\nimport { typedKeys } from \"../utils/typed-object.js\";\nimport {\n loadProjectSourceConfig,\n resolveSource,\n saveSourceToProjectConfig,\n} from \"../lib/configuration/index.js\";\n\nconst EJECT_TYPES = [\"agent-partials\", \"skills\", \"all\"] as const;\ntype EjectType = (typeof EJECT_TYPES)[number];\n\nexport default class Eject extends BaseCommand {\n static summary = \"Eject skills or agent partials for local customization\";\n static description =\n \"Copy agent partials or skills to your project for customization. \" +\n \"Agent partials are always copied from the CLI. \" +\n \"Skills are copied from the configured source (public marketplace by default).\";\n\n static args = {\n type: Args.string({\n description: \"What to eject: agent-partials, skills, all\",\n required: false,\n options: EJECT_TYPES as unknown as string[],\n }),\n };\n\n static flags = {\n ...BaseCommand.baseFlags,\n force: Flags.boolean({\n char: \"f\",\n description: \"Overwrite existing files\",\n default: false,\n }),\n output: Flags.string({\n char: \"o\",\n description: \"Output directory (default: .claude/ in current directory)\",\n }),\n refresh: Flags.boolean({\n description: \"Force refresh from remote source\",\n default: false,\n }),\n };\n\n async run(): Promise<void> {\n const { args, flags } = await this.parse(Eject);\n const projectDir = process.cwd();\n\n if (!args.type) {\n this.error(\"Please specify what to eject: agent-partials, skills, or all\", {\n exit: EXIT_CODES.INVALID_ARGS,\n });\n }\n\n if (!EJECT_TYPES.includes(args.type as EjectType)) {\n this.error(`Unknown eject type: ${args.type}`, {\n exit: EXIT_CODES.INVALID_ARGS,\n });\n }\n\n let outputBase: string;\n if (flags.output) {\n const expandedPath = flags.output.startsWith(\"~\")\n ? path.join(os.homedir(), flags.output.slice(1))\n : flags.output;\n outputBase = path.resolve(projectDir, expandedPath);\n\n if (await fileExists(outputBase)) {\n this.error(`Output path exists as a file: ${outputBase}`, {\n exit: EXIT_CODES.INVALID_ARGS,\n });\n }\n } else {\n outputBase = path.join(projectDir, CLAUDE_SRC_DIR);\n }\n\n this.log(\"\");\n this.log(\"Claude Collective Eject\");\n this.log(\"\");\n\n if (flags.output) {\n this.log(`Output directory: ${outputBase}`);\n }\n\n const ejectType = args.type as EjectType;\n const directOutput = !!flags.output;\n\n let sourceResult: SourceLoadResult | undefined;\n if (ejectType === \"skills\" || ejectType === \"all\") {\n sourceResult = await loadSkillsMatrixFromSource({\n sourceFlag: flags.source,\n projectDir,\n forceRefresh: flags.refresh,\n });\n }\n\n switch (ejectType) {\n case \"agent-partials\":\n await this.ejectAgentPartials(outputBase, flags.force, directOutput);\n break;\n case \"skills\":\n await this.ejectSkills(\n projectDir,\n flags.force,\n directOutput,\n sourceResult!,\n directOutput ? outputBase : undefined,\n );\n break;\n case \"all\":\n await this.ejectAgentPartials(outputBase, flags.force, directOutput);\n await this.ejectSkills(\n projectDir,\n flags.force,\n directOutput,\n sourceResult!,\n directOutput ? outputBase : undefined,\n );\n break;\n }\n\n if (flags.source) {\n await saveSourceToProjectConfig(projectDir, flags.source);\n this.log(`Source saved to .claude-src/config.yaml`);\n }\n\n await this.ensureMinimalConfig(projectDir, flags.source, sourceResult);\n\n this.log(\"\");\n this.logSuccess(\"Eject complete!\");\n this.log(\"\");\n }\n\n // Ensures a minimal config.yaml exists so `cc compile` works after eject\n private async ensureMinimalConfig(\n projectDir: string,\n sourceFlag?: string,\n sourceResult?: SourceLoadResult,\n ): Promise<void> {\n const configPath = path.join(projectDir, CLAUDE_SRC_DIR, \"config.yaml\");\n\n if (await fileExists(configPath)) {\n return;\n }\n\n const projectName = path.basename(projectDir);\n\n const config: Record<string, unknown> = {\n name: projectName,\n installMode: \"local\",\n };\n\n const resolvedConfig =\n sourceResult?.sourceConfig ?? (await resolveSource(sourceFlag, projectDir));\n\n if (sourceFlag) {\n config.source = sourceFlag;\n } else if (resolvedConfig.source) {\n config.source = resolvedConfig.source;\n }\n\n if (resolvedConfig.marketplace) {\n config.marketplace = resolvedConfig.marketplace;\n }\n\n const existingProjectConfig = await loadProjectSourceConfig(projectDir);\n if (existingProjectConfig?.author) {\n config.author = existingProjectConfig.author;\n }\n if (existingProjectConfig?.agents_source) {\n config.agents_source = existingProjectConfig.agents_source;\n }\n\n await ensureDir(path.join(projectDir, CLAUDE_SRC_DIR));\n\n let configContent = stringifyYaml(config, { indent: 2 });\n\n const exampleStackComment = `\n# Example stack configuration (uncomment and customize):\n#\n# skills:\n# - web-framework-react\n# - web-styling-scss-modules\n# - api-framework-hono\n# - api-database-drizzle\n#\n# agents:\n# - web-developer\n# - api-developer\n# - web-reviewer\n#\n# stack:\n# web-developer:\n# framework: web-framework-react\n# styling: web-styling-scss-modules\n# api-developer:\n# api: api-framework-hono\n# database: api-database-drizzle\n`;\n\n configContent += exampleStackComment;\n await writeFile(configPath, configContent);\n\n this.logSuccess(`Created ${CLAUDE_SRC_DIR}/config.yaml`);\n }\n\n private async ejectAgentPartials(\n outputBase: string,\n force: boolean,\n directOutput: boolean = false,\n ): Promise<void> {\n const sourceDir = path.join(PROJECT_ROOT, DIRS.agents);\n\n if (!(await directoryExists(sourceDir))) {\n this.warn(\"No agent partials found in CLI.\");\n return;\n }\n\n const destDir = directOutput ? outputBase : path.join(outputBase, \"agents\");\n\n if ((await directoryExists(destDir)) && !force) {\n this.warn(`Agent partials already exist at ${destDir}. Use --force to overwrite.`);\n return;\n }\n\n await ensureDir(destDir);\n\n await copy(sourceDir, destDir);\n\n this.logSuccess(`Agent partials ejected to ${destDir}`);\n this.log(\"You can now customize templates, agent intro, workflow, and examples locally.\");\n }\n\n private async ejectSkills(\n projectDir: string,\n force: boolean,\n directOutput: boolean = false,\n sourceResult: SourceLoadResult,\n customOutputBase?: string,\n ): Promise<void> {\n const destDir =\n directOutput && customOutputBase\n ? customOutputBase\n : path.join(projectDir, LOCAL_SKILLS_PATH);\n\n if ((await directoryExists(destDir)) && !force) {\n this.warn(`Skills already exist at ${destDir}. Use --force to overwrite.`);\n return;\n }\n\n const skillIds = typedKeys<SkillId>(sourceResult.matrix.skills).filter(\n (skillId) => !sourceResult.matrix.skills[skillId]?.local,\n );\n\n if (skillIds.length === 0) {\n this.warn(\"No skills found in source to eject.\");\n return;\n }\n\n await ensureDir(destDir);\n\n const copiedSkills = await copySkillsToLocalFlattened(\n skillIds,\n destDir,\n sourceResult.matrix,\n sourceResult,\n );\n\n const sourceLabel = sourceResult.isLocal\n ? sourceResult.sourcePath\n : sourceResult.marketplace || sourceResult.sourceConfig.source;\n\n this.logSuccess(`${copiedSkills.length} skills ejected to ${destDir} from ${sourceLabel}`);\n this.log(\"You can now customize skill content locally.\");\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA,SAAS,MAAM,aAAa;AAC5B,OAAO,UAAU;AACjB,OAAO,QAAQ;AACf,SAAS,aAAa,qBAAqB;AAe3C,IAAM,cAAc,CAAC,kBAAkB,UAAU,KAAK;AAGtD,IAAqB,QAArB,MAAqB,eAAc,YAAY;AAAA,EAC7C,OAAO,UAAU;AAAA,EACjB,OAAO,cACL;AAAA,EAIF,OAAO,OAAO;AAAA,IACZ,MAAM,KAAK,OAAO;AAAA,MAChB,aAAa;AAAA,MACb,UAAU;AAAA,MACV,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAAA,EAEA,OAAO,QAAQ;AAAA,IACb,GAAG,YAAY;AAAA,IACf,OAAO,MAAM,QAAQ;AAAA,MACnB,MAAM;AAAA,MACN,aAAa;AAAA,MACb,SAAS;AAAA,IACX,CAAC;AAAA,IACD,QAAQ,MAAM,OAAO;AAAA,MACnB,MAAM;AAAA,MACN,aAAa;AAAA,IACf,CAAC;AAAA,IACD,SAAS,MAAM,QAAQ;AAAA,MACrB,aAAa;AAAA,MACb,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,MAAqB;AACzB,UAAM,EAAE,MAAM,MAAM,IAAI,MAAM,KAAK,MAAM,MAAK;AAC9C,UAAM,aAAa,QAAQ,IAAI;AAE/B,QAAI,CAAC,KAAK,MAAM;AACd,WAAK,MAAM,gEAAgE;AAAA,QACzE,MAAM,WAAW;AAAA,MACnB,CAAC;AAAA,IACH;AAEA,QAAI,CAAC,YAAY,SAAS,KAAK,IAAiB,GAAG;AACjD,WAAK,MAAM,uBAAuB,KAAK,IAAI,IAAI;AAAA,QAC7C,MAAM,WAAW;AAAA,MACnB,CAAC;AAAA,IACH;AAEA,QAAI;AACJ,QAAI,MAAM,QAAQ;AAChB,YAAM,eAAe,MAAM,OAAO,WAAW,GAAG,IAC5C,KAAK,KAAK,GAAG,QAAQ,GAAG,MAAM,OAAO,MAAM,CAAC,CAAC,IAC7C,MAAM;AACV,mBAAa,KAAK,QAAQ,YAAY,YAAY;AAElD,UAAI,MAAM,WAAW,UAAU,GAAG;AAChC,aAAK,MAAM,iCAAiC,UAAU,IAAI;AAAA,UACxD,MAAM,WAAW;AAAA,QACnB,CAAC;AAAA,MACH;AAAA,IACF,OAAO;AACL,mBAAa,KAAK,KAAK,YAAY,cAAc;AAAA,IACnD;AAEA,SAAK,IAAI,EAAE;AACX,SAAK,IAAI,yBAAyB;AAClC,SAAK,IAAI,EAAE;AAEX,QAAI,MAAM,QAAQ;AAChB,WAAK,IAAI,qBAAqB,UAAU,EAAE;AAAA,IAC5C;AAEA,UAAM,YAAY,KAAK;AACvB,UAAM,eAAe,CAAC,CAAC,MAAM;AAE7B,QAAI;AACJ,QAAI,cAAc,YAAY,cAAc,OAAO;AACjD,qBAAe,MAAM,2BAA2B;AAAA,QAC9C,YAAY,MAAM;AAAA,QAClB;AAAA,QACA,cAAc,MAAM;AAAA,MACtB,CAAC;AAAA,IACH;AAEA,YAAQ,WAAW;AAAA,MACjB,KAAK;AACH,cAAM,KAAK,mBAAmB,YAAY,MAAM,OAAO,YAAY;AACnE;AAAA,MACF,KAAK;AACH,cAAM,KAAK;AAAA,UACT;AAAA,UACA,MAAM;AAAA,UACN;AAAA,UACA;AAAA,UACA,eAAe,aAAa;AAAA,QAC9B;AACA;AAAA,MACF,KAAK;AACH,cAAM,KAAK,mBAAmB,YAAY,MAAM,OAAO,YAAY;AACnE,cAAM,KAAK;AAAA,UACT;AAAA,UACA,MAAM;AAAA,UACN;AAAA,UACA;AAAA,UACA,eAAe,aAAa;AAAA,QAC9B;AACA;AAAA,IACJ;AAEA,QAAI,MAAM,QAAQ;AAChB,YAAM,0BAA0B,YAAY,MAAM,MAAM;AACxD,WAAK,IAAI,yCAAyC;AAAA,IACpD;AAEA,UAAM,KAAK,oBAAoB,YAAY,MAAM,QAAQ,YAAY;AAErE,SAAK,IAAI,EAAE;AACX,SAAK,WAAW,iBAAiB;AACjC,SAAK,IAAI,EAAE;AAAA,EACb;AAAA;AAAA,EAGA,MAAc,oBACZ,YACA,YACA,cACe;AACf,UAAM,aAAa,KAAK,KAAK,YAAY,gBAAgB,aAAa;AAEtE,QAAI,MAAM,WAAW,UAAU,GAAG;AAChC;AAAA,IACF;AAEA,UAAM,cAAc,KAAK,SAAS,UAAU;AAE5C,UAAM,SAAkC;AAAA,MACtC,MAAM;AAAA,MACN,aAAa;AAAA,IACf;AAEA,UAAM,iBACJ,cAAc,gBAAiB,MAAM,cAAc,YAAY,UAAU;AAE3E,QAAI,YAAY;AACd,aAAO,SAAS;AAAA,IAClB,WAAW,eAAe,QAAQ;AAChC,aAAO,SAAS,eAAe;AAAA,IACjC;AAEA,QAAI,eAAe,aAAa;AAC9B,aAAO,cAAc,eAAe;AAAA,IACtC;AAEA,UAAM,wBAAwB,MAAM,wBAAwB,UAAU;AACtE,QAAI,uBAAuB,QAAQ;AACjC,aAAO,SAAS,sBAAsB;AAAA,IACxC;AACA,QAAI,uBAAuB,eAAe;AACxC,aAAO,gBAAgB,sBAAsB;AAAA,IAC/C;AAEA,UAAM,UAAU,KAAK,KAAK,YAAY,cAAc,CAAC;AAErD,QAAI,gBAAgB,cAAc,QAAQ,EAAE,QAAQ,EAAE,CAAC;AAEvD,UAAM,sBAAsB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAuB5B,qBAAiB;AACjB,UAAM,UAAU,YAAY,aAAa;AAEzC,SAAK,WAAW,WAAW,cAAc,cAAc;AAAA,EACzD;AAAA,EAEA,MAAc,mBACZ,YACA,OACA,eAAwB,OACT;AACf,UAAM,YAAY,KAAK,KAAK,cAAc,KAAK,MAAM;AAErD,QAAI,CAAE,MAAM,gBAAgB,SAAS,GAAI;AACvC,WAAK,KAAK,iCAAiC;AAC3C;AAAA,IACF;AAEA,UAAM,UAAU,eAAe,aAAa,KAAK,KAAK,YAAY,QAAQ;AAE1E,QAAK,MAAM,gBAAgB,OAAO,KAAM,CAAC,OAAO;AAC9C,WAAK,KAAK,mCAAmC,OAAO,6BAA6B;AACjF;AAAA,IACF;AAEA,UAAM,UAAU,OAAO;AAEvB,UAAM,KAAK,WAAW,OAAO;AAE7B,SAAK,WAAW,6BAA6B,OAAO,EAAE;AACtD,SAAK,IAAI,+EAA+E;AAAA,EAC1F;AAAA,EAEA,MAAc,YACZ,YACA,OACA,eAAwB,OACxB,cACA,kBACe;AACf,UAAM,UACJ,gBAAgB,mBACZ,mBACA,KAAK,KAAK,YAAY,iBAAiB;AAE7C,QAAK,MAAM,gBAAgB,OAAO,KAAM,CAAC,OAAO;AAC9C,WAAK,KAAK,2BAA2B,OAAO,6BAA6B;AACzE;AAAA,IACF;AAEA,UAAM,WAAW,UAAmB,aAAa,OAAO,MAAM,EAAE;AAAA,MAC9D,CAAC,YAAY,CAAC,aAAa,OAAO,OAAO,OAAO,GAAG;AAAA,IACrD;AAEA,QAAI,SAAS,WAAW,GAAG;AACzB,WAAK,KAAK,qCAAqC;AAC/C;AAAA,IACF;AAEA,UAAM,UAAU,OAAO;AAEvB,UAAM,eAAe,MAAM;AAAA,MACzB;AAAA,MACA;AAAA,MACA,aAAa;AAAA,MACb;AAAA,IACF;AAEA,UAAM,cAAc,aAAa,UAC7B,aAAa,aACb,aAAa,eAAe,aAAa,aAAa;AAE1D,SAAK,WAAW,GAAG,aAAa,MAAM,sBAAsB,OAAO,SAAS,WAAW,EAAE;AACzF,SAAK,IAAI,8CAA8C;AAAA,EACzD;AACF;","names":[]}
1
+ {"version":3,"sources":["../../src/cli/commands/eject.ts"],"sourcesContent":["import { Args, Flags } from \"@oclif/core\";\nimport path from \"path\";\nimport os from \"os\";\nimport { stringify as stringifyYaml } from \"yaml\";\nimport { BaseCommand } from \"../base-command.js\";\nimport { copy, ensureDir, directoryExists, fileExists, writeFile } from \"../utils/fs.js\";\nimport {\n CLAUDE_SRC_DIR,\n DIRS,\n LOCAL_SKILLS_PATH,\n PROJECT_ROOT,\n STANDARD_FILES,\n YAML_FORMATTING,\n} from \"../consts.js\";\nimport { EXIT_CODES } from \"../lib/exit-codes.js\";\nimport { loadSkillsMatrixFromSource, type SourceLoadResult } from \"../lib/loading/index.js\";\nimport { copySkillsToLocalFlattened } from \"../lib/skills/index.js\";\nimport type { SkillId } from \"../types/index.js\";\nimport { typedKeys } from \"../utils/typed-object.js\";\nimport {\n loadProjectSourceConfig,\n resolveSource,\n saveSourceToProjectConfig,\n} from \"../lib/configuration/index.js\";\n\nconst EJECT_TYPES = [\"agent-partials\", \"skills\", \"all\"] as const;\ntype EjectType = (typeof EJECT_TYPES)[number];\n\nexport default class Eject extends BaseCommand {\n static summary = \"Eject skills or agent partials for local customization\";\n static description =\n \"Copy agent partials or skills to your project for customization. \" +\n \"Agent partials are always copied from the CLI. \" +\n \"Skills are copied from the configured source (public marketplace by default).\";\n\n static examples = [\n {\n description: \"Eject agent partials for customization\",\n command: \"<%= config.bin %> <%= command.id %> agent-partials\",\n },\n {\n description: \"Eject skills to local directory\",\n command: \"<%= config.bin %> <%= command.id %> skills\",\n },\n {\n description: \"Eject everything with force overwrite\",\n command: \"<%= config.bin %> <%= command.id %> all --force\",\n },\n {\n description: \"Eject to a custom output directory\",\n command: \"<%= config.bin %> <%= command.id %> skills -o ./custom-dir\",\n },\n ];\n\n static args = {\n type: Args.string({\n description: \"What to eject: agent-partials, skills, all\",\n required: false,\n options: EJECT_TYPES as unknown as string[],\n }),\n };\n\n static flags = {\n ...BaseCommand.baseFlags,\n force: Flags.boolean({\n char: \"f\",\n description: \"Overwrite existing files\",\n default: false,\n }),\n output: Flags.string({\n char: \"o\",\n description: \"Output directory (default: .claude/ in current directory)\",\n }),\n refresh: Flags.boolean({\n description: \"Force refresh from remote source\",\n default: false,\n }),\n };\n\n async run(): Promise<void> {\n const { args, flags } = await this.parse(Eject);\n const projectDir = process.cwd();\n\n if (!args.type) {\n this.error(\"Please specify what to eject: agent-partials, skills, or all\", {\n exit: EXIT_CODES.INVALID_ARGS,\n });\n }\n\n if (!EJECT_TYPES.includes(args.type as EjectType)) {\n this.error(`Unknown eject type: ${args.type}`, {\n exit: EXIT_CODES.INVALID_ARGS,\n });\n }\n\n let outputBase: string;\n if (flags.output) {\n const expandedPath = flags.output.startsWith(\"~\")\n ? path.join(os.homedir(), flags.output.slice(1))\n : flags.output;\n outputBase = path.resolve(projectDir, expandedPath);\n\n if (await fileExists(outputBase)) {\n this.error(`Output path exists as a file: ${outputBase}`, {\n exit: EXIT_CODES.INVALID_ARGS,\n });\n }\n } else {\n outputBase = path.join(projectDir, CLAUDE_SRC_DIR);\n }\n\n this.log(\"\");\n this.log(\"Claude Collective Eject\");\n this.log(\"\");\n\n if (flags.output) {\n this.log(`Output directory: ${outputBase}`);\n }\n\n const ejectType = args.type as EjectType;\n const directOutput = !!flags.output;\n\n let sourceResult: SourceLoadResult | undefined;\n if (ejectType === \"skills\" || ejectType === \"all\") {\n sourceResult = await loadSkillsMatrixFromSource({\n sourceFlag: flags.source,\n projectDir,\n forceRefresh: flags.refresh,\n });\n }\n\n switch (ejectType) {\n case \"agent-partials\":\n await this.ejectAgentPartials(outputBase, flags.force, directOutput);\n break;\n case \"skills\":\n await this.ejectSkills(\n projectDir,\n flags.force,\n sourceResult!,\n directOutput,\n directOutput ? outputBase : undefined,\n );\n break;\n case \"all\":\n await this.ejectAgentPartials(outputBase, flags.force, directOutput);\n await this.ejectSkills(\n projectDir,\n flags.force,\n sourceResult!,\n directOutput,\n directOutput ? outputBase : undefined,\n );\n break;\n default:\n break;\n }\n\n if (flags.source) {\n await saveSourceToProjectConfig(projectDir, flags.source);\n this.log(`Source saved to .claude-src/config.yaml`);\n }\n\n await this.ensureMinimalConfig(projectDir, flags.source, sourceResult);\n\n this.log(\"\");\n this.logSuccess(\"Eject complete!\");\n this.log(\"\");\n }\n\n // Ensures a minimal config.yaml exists so `cc compile` works after eject\n private async ensureMinimalConfig(\n projectDir: string,\n sourceFlag?: string,\n sourceResult?: SourceLoadResult,\n ): Promise<void> {\n const configPath = path.join(projectDir, CLAUDE_SRC_DIR, STANDARD_FILES.CONFIG_YAML);\n\n if (await fileExists(configPath)) {\n return;\n }\n\n const projectName = path.basename(projectDir);\n\n const config: Record<string, unknown> = {\n name: projectName,\n installMode: \"local\",\n };\n\n const resolvedConfig =\n sourceResult?.sourceConfig ?? (await resolveSource(sourceFlag, projectDir));\n\n if (sourceFlag) {\n config.source = sourceFlag;\n } else if (resolvedConfig.source) {\n config.source = resolvedConfig.source;\n }\n\n if (resolvedConfig.marketplace) {\n config.marketplace = resolvedConfig.marketplace;\n }\n\n const existingProjectConfig = await loadProjectSourceConfig(projectDir);\n if (existingProjectConfig?.author) {\n config.author = existingProjectConfig.author;\n }\n if (existingProjectConfig?.agents_source) {\n config.agents_source = existingProjectConfig.agents_source;\n }\n\n await ensureDir(path.join(projectDir, CLAUDE_SRC_DIR));\n\n let configContent = stringifyYaml(config, { indent: YAML_FORMATTING.INDENT });\n\n const exampleStackComment = `\n# Example stack configuration (uncomment and customize):\n#\n# skills:\n# - web-framework-react\n# - web-styling-scss-modules\n# - api-framework-hono\n# - api-database-drizzle\n#\n# agents:\n# - web-developer\n# - api-developer\n# - web-reviewer\n#\n# stack:\n# web-developer:\n# framework: web-framework-react\n# styling: web-styling-scss-modules\n# api-developer:\n# api: api-framework-hono\n# database: api-database-drizzle\n`;\n\n configContent += exampleStackComment;\n await writeFile(configPath, configContent);\n\n this.logSuccess(`Created ${CLAUDE_SRC_DIR}/config.yaml`);\n }\n\n private async ejectAgentPartials(\n outputBase: string,\n force: boolean,\n directOutput = false,\n ): Promise<void> {\n const sourceDir = path.join(PROJECT_ROOT, DIRS.agents);\n\n if (!(await directoryExists(sourceDir))) {\n this.warn(\"No agent partials found in CLI.\");\n return;\n }\n\n const destDir = directOutput ? outputBase : path.join(outputBase, \"agents\");\n\n if ((await directoryExists(destDir)) && !force) {\n this.warn(`Agent partials already exist at ${destDir}. Use --force to overwrite.`);\n return;\n }\n\n await ensureDir(destDir);\n\n await copy(sourceDir, destDir);\n\n this.logSuccess(`Agent partials ejected to ${destDir}`);\n this.log(\"You can now customize templates, agent intro, workflow, and examples locally.\");\n }\n\n private async ejectSkills(\n projectDir: string,\n force: boolean,\n sourceResult: SourceLoadResult,\n directOutput = false,\n customOutputBase?: string,\n ): Promise<void> {\n const destDir =\n directOutput && customOutputBase\n ? customOutputBase\n : path.join(projectDir, LOCAL_SKILLS_PATH);\n\n if ((await directoryExists(destDir)) && !force) {\n this.warn(`Skills already exist at ${destDir}. Use --force to overwrite.`);\n return;\n }\n\n const skillIds = typedKeys<SkillId>(sourceResult.matrix.skills).filter(\n (skillId) => !sourceResult.matrix.skills[skillId]?.local,\n );\n\n if (skillIds.length === 0) {\n this.warn(\"No skills found in source to eject.\");\n return;\n }\n\n await ensureDir(destDir);\n\n const copiedSkills = await copySkillsToLocalFlattened(\n skillIds,\n destDir,\n sourceResult.matrix,\n sourceResult,\n );\n\n const sourceLabel = sourceResult.isLocal\n ? sourceResult.sourcePath\n : sourceResult.marketplace || sourceResult.sourceConfig.source;\n\n this.logSuccess(`${copiedSkills.length} skills ejected to ${destDir} from ${sourceLabel}`);\n this.log(\"You can now customize skill content locally.\");\n }\n}\n"],"mappings":"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","names":[]}