@claude-collective/cli 0.21.0 → 0.26.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 (294) hide show
  1. package/CHANGELOG.md +192 -0
  2. package/README.md +41 -27
  3. package/config/skills-matrix.yaml +38 -37
  4. package/config/stacks.yaml +8 -14
  5. package/dist/{chunk-ZNIDWLL5.js → chunk-3X5D7RM5.js} +4 -3
  6. package/dist/chunk-3X5D7RM5.js.map +1 -0
  7. package/dist/chunk-4357L7VK.js +251 -0
  8. package/dist/chunk-4357L7VK.js.map +1 -0
  9. package/dist/chunk-4S4FCAA2.js +100 -0
  10. package/dist/chunk-4S4FCAA2.js.map +1 -0
  11. package/dist/chunk-7UPXT32F.js +197 -0
  12. package/dist/chunk-7UPXT32F.js.map +1 -0
  13. package/dist/{chunk-DHET7RCE.js → chunk-AWKZ5BDL.js} +9 -2
  14. package/dist/{chunk-DHET7RCE.js.map → chunk-AWKZ5BDL.js.map} +1 -1
  15. package/dist/{chunk-6Q3Y7KVB.js → chunk-DBRUQQUF.js} +8 -2
  16. package/dist/chunk-DBRUQQUF.js.map +1 -0
  17. package/dist/{chunk-OQYYMQJR.js → chunk-ETCVEV3S.js} +8 -11
  18. package/dist/chunk-ETCVEV3S.js.map +1 -0
  19. package/dist/chunk-ETQ3BPGU.js +4204 -0
  20. package/dist/chunk-ETQ3BPGU.js.map +1 -0
  21. package/dist/{chunk-ZSVMS677.js → chunk-F4RD5FYM.js} +2 -2
  22. package/dist/chunk-F4RD5FYM.js.map +1 -0
  23. package/dist/{chunk-5KXUDHAB.js → chunk-GGFOD5PK.js} +6 -9
  24. package/dist/chunk-GGFOD5PK.js.map +1 -0
  25. package/dist/{chunk-UMORK7OK.js → chunk-H7SSBSPR.js} +2 -2
  26. package/dist/chunk-H7SSBSPR.js.map +1 -0
  27. package/dist/chunk-HWD32NP7.js +19 -0
  28. package/dist/chunk-HWD32NP7.js.map +1 -0
  29. package/dist/{chunk-HGCBZUH5.js → chunk-I3YYG5IO.js} +9 -10
  30. package/dist/chunk-I3YYG5IO.js.map +1 -0
  31. package/dist/{chunk-RTE64SJA.js → chunk-IXBCRT3F.js} +2 -2
  32. package/dist/chunk-IXBCRT3F.js.map +1 -0
  33. package/dist/{chunk-WFEFICFM.js → chunk-KWYO3M5Q.js} +5 -5
  34. package/dist/chunk-KWYO3M5Q.js.map +1 -0
  35. package/dist/{chunk-HEOHU5EZ.js → chunk-MCTSHLAF.js} +22 -11
  36. package/dist/chunk-MCTSHLAF.js.map +1 -0
  37. package/dist/chunk-NQJ47R4N.js +1092 -0
  38. package/dist/chunk-NQJ47R4N.js.map +1 -0
  39. package/dist/{chunk-FJFEKPXF.js → chunk-O6ZTD7ZI.js} +14 -3
  40. package/dist/chunk-O6ZTD7ZI.js.map +1 -0
  41. package/dist/chunk-OBXAY23Y.js +56 -0
  42. package/dist/chunk-OBXAY23Y.js.map +1 -0
  43. package/dist/{chunk-XY3XDVMI.js → chunk-QR2EBWL2.js} +3 -3
  44. package/dist/chunk-R5KJVI54.js +311 -0
  45. package/dist/chunk-R5KJVI54.js.map +1 -0
  46. package/dist/{chunk-2LSGX6R4.js → chunk-R7B63JAP.js} +83 -25
  47. package/dist/chunk-R7B63JAP.js.map +1 -0
  48. package/dist/{chunk-66UDJBF6.js → chunk-REJGRCVQ.js} +2 -2
  49. package/dist/chunk-TDZE4TDG.js +220 -0
  50. package/dist/chunk-TDZE4TDG.js.map +1 -0
  51. package/dist/{chunk-CBLPAMZO.js → chunk-TMED5DQ2.js} +68 -42
  52. package/dist/chunk-TMED5DQ2.js.map +1 -0
  53. package/dist/{chunk-Q3J43SF3.js → chunk-U7HFKR74.js} +2 -2
  54. package/dist/chunk-U7HFKR74.js.map +1 -0
  55. package/dist/{chunk-3EHUF54X.js → chunk-UEMRJI2K.js} +17 -4
  56. package/dist/chunk-UEMRJI2K.js.map +1 -0
  57. package/dist/{chunk-Z2CWURZ6.js → chunk-UNN7523L.js} +2 -2
  58. package/dist/chunk-V2ZIH7HV.js +29 -0
  59. package/dist/chunk-V2ZIH7HV.js.map +1 -0
  60. package/dist/{chunk-ZEI3ZUDU.js → chunk-VVYNZZUX.js} +7 -15
  61. package/dist/chunk-VVYNZZUX.js.map +1 -0
  62. package/dist/{chunk-A46TPNBJ.js → chunk-XENOESJZ.js} +7 -16
  63. package/dist/chunk-XENOESJZ.js.map +1 -0
  64. package/dist/chunk-ZDREFYD2.js +696 -0
  65. package/dist/chunk-ZDREFYD2.js.map +1 -0
  66. package/dist/chunk-ZW2PELOH.js +197 -0
  67. package/dist/chunk-ZW2PELOH.js.map +1 -0
  68. package/dist/cli/defaults/agent-mappings.yaml +0 -1
  69. package/dist/commands/build/marketplace.js +22 -21
  70. package/dist/commands/build/marketplace.js.map +1 -1
  71. package/dist/commands/build/plugins.js +35 -231
  72. package/dist/commands/build/plugins.js.map +1 -1
  73. package/dist/commands/build/stack.js +11 -18
  74. package/dist/commands/build/stack.js.map +1 -1
  75. package/dist/commands/compile.js +36 -58
  76. package/dist/commands/compile.js.map +1 -1
  77. package/dist/commands/config/get.js +8 -8
  78. package/dist/commands/config/get.js.map +1 -1
  79. package/dist/commands/config/index.js +7 -7
  80. package/dist/commands/config/index.js.map +1 -1
  81. package/dist/commands/config/path.js +6 -6
  82. package/dist/commands/config/path.js.map +1 -1
  83. package/dist/commands/config/set-project.js +8 -8
  84. package/dist/commands/config/set-project.js.map +1 -1
  85. package/dist/commands/config/show.js +7 -7
  86. package/dist/commands/config/unset-project.js +8 -8
  87. package/dist/commands/config/unset-project.js.map +1 -1
  88. package/dist/commands/diff.js +10 -16
  89. package/dist/commands/diff.js.map +1 -1
  90. package/dist/commands/doctor.js +18 -51
  91. package/dist/commands/doctor.js.map +1 -1
  92. package/dist/commands/edit.js +112 -57
  93. package/dist/commands/edit.js.map +1 -1
  94. package/dist/commands/eject.js +17 -49
  95. package/dist/commands/eject.js.map +1 -1
  96. package/dist/commands/import/skill.js +26 -26
  97. package/dist/commands/import/skill.js.map +1 -1
  98. package/dist/commands/info.js +15 -17
  99. package/dist/commands/info.js.map +1 -1
  100. package/dist/commands/init.js +103 -727
  101. package/dist/commands/init.js.map +1 -1
  102. package/dist/commands/list.js +8 -87
  103. package/dist/commands/list.js.map +1 -1
  104. package/dist/commands/new/agent.js +8 -12
  105. package/dist/commands/new/agent.js.map +1 -1
  106. package/dist/commands/new/skill.js +6 -6
  107. package/dist/commands/new/skill.js.map +1 -1
  108. package/dist/commands/outdated.js +15 -19
  109. package/dist/commands/outdated.js.map +1 -1
  110. package/dist/commands/search.js +21 -34
  111. package/dist/commands/search.js.map +1 -1
  112. package/dist/commands/uninstall.js +15 -14
  113. package/dist/commands/uninstall.js.map +1 -1
  114. package/dist/commands/update.js +13 -24
  115. package/dist/commands/update.js.map +1 -1
  116. package/dist/commands/validate.js +44 -487
  117. package/dist/commands/validate.js.map +1 -1
  118. package/dist/commands/version/bump.js +11 -11
  119. package/dist/commands/version/bump.js.map +1 -1
  120. package/dist/commands/version/index.js +9 -10
  121. package/dist/commands/version/index.js.map +1 -1
  122. package/dist/commands/version/set.js +10 -8
  123. package/dist/commands/version/set.js.map +1 -1
  124. package/dist/commands/version/show.js +9 -10
  125. package/dist/commands/version/show.js.map +1 -1
  126. package/dist/components/common/confirm.js +2 -2
  127. package/dist/components/common/confirm.test.js +203 -0
  128. package/dist/components/common/confirm.test.js.map +1 -0
  129. package/dist/components/common/message.js +1 -1
  130. package/dist/components/common/spinner.js +1 -1
  131. package/dist/components/common/spinner.js.map +1 -1
  132. package/dist/components/skill-search/skill-search.js +3 -3
  133. package/dist/components/wizard/category-grid.js +2 -2
  134. package/dist/components/wizard/category-grid.test.js +132 -78
  135. package/dist/components/wizard/category-grid.test.js.map +1 -1
  136. package/dist/components/wizard/menu-item.js +2 -2
  137. package/dist/components/wizard/search-modal.js +9 -0
  138. package/dist/components/wizard/search-modal.js.map +1 -0
  139. package/dist/components/wizard/search-modal.test.js +216 -0
  140. package/dist/components/wizard/search-modal.test.js.map +1 -0
  141. package/dist/components/wizard/section-progress.js +2 -2
  142. package/dist/components/wizard/section-progress.test.js +4 -4
  143. package/dist/components/wizard/section-progress.test.js.map +1 -1
  144. package/dist/components/wizard/source-grid.js +10 -0
  145. package/dist/components/wizard/source-grid.js.map +1 -0
  146. package/dist/components/wizard/source-grid.test.js +500 -0
  147. package/dist/components/wizard/source-grid.test.js.map +1 -0
  148. package/dist/components/wizard/step-approach.js +7 -6
  149. package/dist/components/wizard/step-approach.test.js +115 -0
  150. package/dist/components/wizard/step-approach.test.js.map +1 -0
  151. package/dist/components/wizard/step-build.js +9 -4
  152. package/dist/components/wizard/step-build.test.js +103 -122
  153. package/dist/components/wizard/step-build.test.js.map +1 -1
  154. package/dist/components/wizard/step-confirm.js +3 -2
  155. package/dist/components/wizard/step-confirm.test.js +364 -0
  156. package/dist/components/wizard/step-confirm.test.js.map +1 -0
  157. package/dist/components/wizard/step-refine.js +2 -2
  158. package/dist/components/wizard/step-refine.test.js +19 -13
  159. package/dist/components/wizard/step-refine.test.js.map +1 -1
  160. package/dist/components/wizard/step-settings.js +14 -0
  161. package/dist/components/wizard/step-settings.js.map +1 -0
  162. package/dist/components/wizard/step-settings.test.js +240 -0
  163. package/dist/components/wizard/step-settings.test.js.map +1 -0
  164. package/dist/components/wizard/step-sources.js +17 -0
  165. package/dist/components/wizard/step-sources.js.map +1 -0
  166. package/dist/components/wizard/step-sources.test.js +290 -0
  167. package/dist/components/wizard/step-sources.test.js.map +1 -0
  168. package/dist/components/wizard/step-stack.js +7 -6
  169. package/dist/components/wizard/step-stack.test.js +344 -0
  170. package/dist/components/wizard/step-stack.test.js.map +1 -0
  171. package/dist/components/wizard/view-title.js +2 -2
  172. package/dist/components/wizard/wizard-layout.js +6 -5
  173. package/dist/components/wizard/wizard-tabs.js +2 -2
  174. package/dist/components/wizard/wizard-tabs.test.js +292 -0
  175. package/dist/components/wizard/wizard-tabs.test.js.map +1 -0
  176. package/dist/components/wizard/wizard.js +22 -14
  177. package/dist/config/skills-matrix.yaml +38 -37
  178. package/dist/config/stacks.yaml +8 -14
  179. package/dist/hooks/init.js +5 -5
  180. package/dist/hooks/init.js.map +1 -1
  181. package/dist/index.js +1 -1
  182. package/dist/index.js.map +1 -1
  183. package/dist/{magic-string.es-RGXYGAW3.js → magic-string.es-PAH2SOTR.js} +2 -2
  184. package/dist/source-manager-EYO3F2DV.js +16 -0
  185. package/dist/source-manager-EYO3F2DV.js.map +1 -0
  186. package/dist/src/agents/_templates/agent.liquid +1 -1
  187. package/dist/src/agents/developer/api-developer/agent.yaml +1 -1
  188. package/dist/src/agents/developer/cli-developer/agent.yaml +1 -1
  189. package/dist/src/agents/developer/web-architecture/agent.yaml +1 -1
  190. package/dist/src/agents/developer/web-developer/agent.yaml +1 -1
  191. package/dist/src/agents/meta/agent-summoner/agent.yaml +1 -1
  192. package/dist/src/agents/meta/documentor/agent.yaml +1 -1
  193. package/dist/src/agents/meta/skill-summoner/agent.yaml +1 -1
  194. package/dist/src/agents/migration/cli-migrator/agent.yaml +1 -1
  195. package/dist/src/agents/pattern/pattern-scout/agent.yaml +1 -1
  196. package/dist/src/agents/pattern/web-pattern-critique/agent.yaml +1 -1
  197. package/dist/src/agents/planning/web-pm/agent.yaml +1 -1
  198. package/dist/src/agents/researcher/api-researcher/agent.yaml +1 -1
  199. package/dist/src/agents/researcher/web-researcher/agent.yaml +1 -1
  200. package/dist/src/agents/reviewer/api-reviewer/agent.yaml +1 -1
  201. package/dist/src/agents/reviewer/cli-reviewer/agent.yaml +1 -1
  202. package/dist/src/agents/reviewer/web-reviewer/agent.yaml +1 -1
  203. package/dist/src/agents/tester/cli-tester/agent.yaml +1 -1
  204. package/dist/src/agents/tester/web-tester/agent.yaml +1 -1
  205. package/dist/stores/wizard-store.js +4 -3
  206. package/dist/stores/wizard-store.test.js +51 -82
  207. package/dist/stores/wizard-store.test.js.map +1 -1
  208. package/package.json +5 -3
  209. package/src/agents/_templates/agent.liquid +1 -1
  210. package/src/agents/developer/api-developer/agent.yaml +1 -1
  211. package/src/agents/developer/cli-developer/agent.yaml +1 -1
  212. package/src/agents/developer/web-architecture/agent.yaml +1 -1
  213. package/src/agents/developer/web-developer/agent.yaml +1 -1
  214. package/src/agents/meta/agent-summoner/agent.yaml +1 -1
  215. package/src/agents/meta/documentor/agent.yaml +1 -1
  216. package/src/agents/meta/skill-summoner/agent.yaml +1 -1
  217. package/src/agents/migration/cli-migrator/agent.yaml +1 -1
  218. package/src/agents/pattern/pattern-scout/agent.yaml +1 -1
  219. package/src/agents/pattern/web-pattern-critique/agent.yaml +1 -1
  220. package/src/agents/planning/web-pm/agent.yaml +1 -1
  221. package/src/agents/researcher/api-researcher/agent.yaml +1 -1
  222. package/src/agents/researcher/web-researcher/agent.yaml +1 -1
  223. package/src/agents/reviewer/api-reviewer/agent.yaml +1 -1
  224. package/src/agents/reviewer/cli-reviewer/agent.yaml +1 -1
  225. package/src/agents/reviewer/web-reviewer/agent.yaml +1 -1
  226. package/src/agents/tester/cli-tester/agent.yaml +1 -1
  227. package/src/agents/tester/web-tester/agent.yaml +1 -1
  228. package/dist/chunk-2LSGX6R4.js.map +0 -1
  229. package/dist/chunk-2OKUEELH.js +0 -32
  230. package/dist/chunk-2OKUEELH.js.map +0 -1
  231. package/dist/chunk-374JNMR6.js +0 -212
  232. package/dist/chunk-374JNMR6.js.map +0 -1
  233. package/dist/chunk-3EHUF54X.js.map +0 -1
  234. package/dist/chunk-3XR4PALU.js +0 -529
  235. package/dist/chunk-3XR4PALU.js.map +0 -1
  236. package/dist/chunk-5K2ZLUO5.js +0 -57
  237. package/dist/chunk-5K2ZLUO5.js.map +0 -1
  238. package/dist/chunk-5KXUDHAB.js.map +0 -1
  239. package/dist/chunk-6Q3Y7KVB.js.map +0 -1
  240. package/dist/chunk-7SLV7CMF.js +0 -615
  241. package/dist/chunk-7SLV7CMF.js.map +0 -1
  242. package/dist/chunk-A46TPNBJ.js.map +0 -1
  243. package/dist/chunk-AL74GBW4.js +0 -69
  244. package/dist/chunk-AL74GBW4.js.map +0 -1
  245. package/dist/chunk-BQX23RBV.js +0 -191
  246. package/dist/chunk-BQX23RBV.js.map +0 -1
  247. package/dist/chunk-CA4LH4LI.js +0 -132
  248. package/dist/chunk-CA4LH4LI.js.map +0 -1
  249. package/dist/chunk-CBLPAMZO.js.map +0 -1
  250. package/dist/chunk-CKPQHGXR.js +0 -417
  251. package/dist/chunk-CKPQHGXR.js.map +0 -1
  252. package/dist/chunk-CXOFOJCN.js +0 -80
  253. package/dist/chunk-CXOFOJCN.js.map +0 -1
  254. package/dist/chunk-EHGD7HIE.js +0 -104
  255. package/dist/chunk-EHGD7HIE.js.map +0 -1
  256. package/dist/chunk-EHS3TWWP.js +0 -95
  257. package/dist/chunk-EHS3TWWP.js.map +0 -1
  258. package/dist/chunk-FJFEKPXF.js.map +0 -1
  259. package/dist/chunk-HEOHU5EZ.js.map +0 -1
  260. package/dist/chunk-HGCBZUH5.js.map +0 -1
  261. package/dist/chunk-HPGFY5ZN.js +0 -114
  262. package/dist/chunk-HPGFY5ZN.js.map +0 -1
  263. package/dist/chunk-INJ2EFRW.js +0 -127
  264. package/dist/chunk-INJ2EFRW.js.map +0 -1
  265. package/dist/chunk-IOBFMF6X.js +0 -61
  266. package/dist/chunk-IOBFMF6X.js.map +0 -1
  267. package/dist/chunk-KH3HA7J7.js +0 -116
  268. package/dist/chunk-KH3HA7J7.js.map +0 -1
  269. package/dist/chunk-N6JNE326.js +0 -261
  270. package/dist/chunk-N6JNE326.js.map +0 -1
  271. package/dist/chunk-NAGU7TVZ.js +0 -36
  272. package/dist/chunk-NAGU7TVZ.js.map +0 -1
  273. package/dist/chunk-OQYYMQJR.js.map +0 -1
  274. package/dist/chunk-PLZOUVDD.js +0 -419
  275. package/dist/chunk-PLZOUVDD.js.map +0 -1
  276. package/dist/chunk-Q3J43SF3.js.map +0 -1
  277. package/dist/chunk-RTE64SJA.js.map +0 -1
  278. package/dist/chunk-T25OEQFI.js +0 -26
  279. package/dist/chunk-T25OEQFI.js.map +0 -1
  280. package/dist/chunk-UMORK7OK.js.map +0 -1
  281. package/dist/chunk-VFHWU7JU.js +0 -287
  282. package/dist/chunk-VFHWU7JU.js.map +0 -1
  283. package/dist/chunk-VS4GVTZE.js +0 -91
  284. package/dist/chunk-VS4GVTZE.js.map +0 -1
  285. package/dist/chunk-WFEFICFM.js.map +0 -1
  286. package/dist/chunk-WG6KIAPK.js +0 -54
  287. package/dist/chunk-WG6KIAPK.js.map +0 -1
  288. package/dist/chunk-ZEI3ZUDU.js.map +0 -1
  289. package/dist/chunk-ZNIDWLL5.js.map +0 -1
  290. package/dist/chunk-ZSVMS677.js.map +0 -1
  291. /package/dist/{chunk-XY3XDVMI.js.map → chunk-QR2EBWL2.js.map} +0 -0
  292. /package/dist/{chunk-66UDJBF6.js.map → chunk-REJGRCVQ.js.map} +0 -0
  293. /package/dist/{chunk-Z2CWURZ6.js.map → chunk-UNN7523L.js.map} +0 -0
  294. /package/dist/{magic-string.es-RGXYGAW3.js.map → magic-string.es-PAH2SOTR.js.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/cli/commands/init.tsx","../../src/cli/lib/local-installer.ts","../../src/cli/lib/config-merger.ts","../../src/cli/lib/config-generator.ts","../../src/cli/lib/skill-agent-mappings.ts","../../src/cli/lib/defaults-loader.ts","../../src/cli/lib/permission-checker.tsx","../../src/cli/lib/stack-installer.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 } from \"ink\";\nimport path from \"path\";\nimport { BaseCommand } from \"../base-command.js\";\nimport { Wizard, type WizardResultV2 } from \"../components/wizard/wizard.js\";\nimport { loadSkillsMatrixFromSource, type SourceLoadResult } from \"../lib/source-loader.js\";\nimport { formatSourceOrigin } from \"../lib/config.js\";\nimport { saveSourceToProjectConfig } from \"../lib/config-saver.js\";\nimport { installLocal } from \"../lib/local-installer.js\";\nimport { checkPermissions } from \"../lib/permission-checker.js\";\nimport { installStackAsPlugin } from \"../lib/stack-installer.js\";\nimport { getCollectivePluginDir } from \"../lib/plugin-finder.js\";\nimport { claudePluginMarketplaceExists, claudePluginMarketplaceAdd } from \"../utils/exec.js\";\nimport { directoryExists } from \"../utils/fs.js\";\nimport { CLAUDE_DIR, LOCAL_SKILLS_PATH } from \"../consts.js\";\nimport { EXIT_CODES } from \"../lib/exit-codes.js\";\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(\n ` \n █████╗ ██████╗ ███████╗███╗ ██╗████████╗███████╗ ██╗███╗ ██╗ ██████╗\n██╔══██╗██╔════╝ ██╔════╝████╗ ██║╚══██╔══╝██╔════╝ ██║████╗ ██║██╔════╝\n███████║██║ ███╗█████╗ ██╔██╗ ██║ ██║ ███████╗ ██║██╔██╗ ██║██║ \n██╔══██║██║ ██║██╔══╝ ██║╚██╗██║ ██║ ╚════██║ ██║██║╚██╗██║██║ \n██║ ██║╚██████╔╝███████╗██║ ╚████║ ██║ ███████║ ██║██║ ╚████║╚██████╗\n╚═╝ ╚═╝ ╚═════╝ ╚══════╝╚═╝ ╚═══╝ ╚═╝ ╚══════╝ ╚═╝╚═╝ ╚═══╝ ╚═════╝\n`,\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(`Loaded ${Object.keys(sourceResult.matrix.skills).length} skills (${sourceInfo})\\n`)\n } catch (error) {\n this.error(error instanceof Error ? error.message : \"Unknown error occurred\", {\n exit: EXIT_CODES.ERROR,\n });\n }\n\n // Store result from wizard\n let wizardResult: WizardResultV2 | null = null;\n\n const { waitUntilExit } = render(\n <Wizard\n matrix={sourceResult.matrix}\n version={this.config.version}\n onComplete={(result) => {\n wizardResult = result as WizardResultV2;\n }}\n onCancel={() => {\n this.log(\"Setup cancelled\");\n }}\n />,\n );\n\n await waitUntilExit();\n\n // Handle cancellation or no result\n // Use non-null assertion since waitUntilExit() ensures the callback has been invoked\n const result = wizardResult as WizardResultV2 | null;\n if (!result || result.cancelled) {\n return this.exit(EXIT_CODES.CANCELLED);\n }\n\n // Validate selection\n if (result.selectedSkills.length === 0) {\n return this.error(\"No skills selected\", { exit: EXIT_CODES.ERROR });\n }\n\n // Handle installation based on mode\n await this.handleInstallation(result, 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: WizardResultV2,\n sourceResult: SourceLoadResult,\n flags: any,\n ): Promise<void> {\n const projectDir = process.cwd();\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\n // Dry run preview\n if (dryRun) {\n if (result.installMode === \"plugin\" && result.selectedStackId) {\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.selectedStackId}\" from marketplace \"${sourceResult.marketplace}\"`,\n );\n this.log(\n `[dry-run] claude plugin install ${result.selectedStackId}@${sourceResult.marketplace} --scope project`,\n );\n } else {\n this.log(\n `[dry-run] Would compile and install stack \"${result.selectedStackId}\" as a native plugin`,\n );\n this.log(\n `[dry-run] claude plugin install ./compiled-stack/${result.selectedStackId} --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(`[dry-run] Individual skill plugin installation not yet supported`);\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_DIR, \"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-src/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.selectedStackId) {\n await this.installPluginMode(result, sourceResult, flags);\n return;\n } else {\n // No stack selected - individual skill installation not yet supported\n this.warn(\"Individual skill plugin installation not yet supported in Plugin Mode.\");\n this.log(`Falling back to Local Mode (copying to .claude/skills/)...`);\n this.log(\"To use Plugin Mode, select a pre-built stack instead of individual skills.\\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, flags);\n }\n\n /**\n * Install in Plugin Mode: install stack as native plugin.\n */\n private async installPluginMode(\n result: WizardResultV2,\n sourceResult: SourceLoadResult,\n flags: { source?: string },\n ): Promise<void> {\n if (!result.selectedStackId) {\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(sourceResult.marketplace);\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.selectedStackId}\"...`);\n\n try {\n const installResult = await installStackAsPlugin({\n stackId: result.selectedStackId,\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(`Installed stack plugin: ${installResult.pluginName} ${installedFrom}\\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 // Save source to project config if provided via --source flag\n if (flags.source) {\n await saveSourceToProjectConfig(projectDir, flags.source);\n this.log(`Source saved to .claude-src/config.yaml`);\n }\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: WizardResultV2,\n sourceResult: SourceLoadResult,\n flags: { source?: string },\n ): Promise<void> {\n const projectDir = process.cwd();\n const matrix = sourceResult.matrix;\n\n this.log(\"Copying skills to local directory...\");\n try {\n const installResult = await installLocal({\n wizardResult: result,\n sourceResult,\n projectDir,\n sourceFlag: flags.source,\n });\n\n this.log(`Copied ${installResult.copiedSkills.length} skills to .claude/skills/\\n`);\n this.log(\"Generating configuration...\");\n\n if (installResult.wasMerged) {\n this.log(`Merged with existing config at ${installResult.mergedConfigPath}`);\n }\n\n this.log(`Configuration saved (${installResult.config.agents.length} agents)\\n`);\n this.log(\"Compiling agents...\");\n this.log(`Compiled ${installResult.compiledAgents.length} agents to .claude/agents/\\n`);\n\n // Success summary\n this.log(\"Claude Collective initialized successfully!\\n\");\n this.log(\"Skills copied to:\");\n this.log(` ${installResult.skillsDir}`);\n for (const copiedSkill of installResult.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(` ${installResult.agentsDir}`);\n for (const agentName of installResult.compiledAgents) {\n this.log(` ${agentName}.md`);\n }\n this.log(\"\");\n this.log(\"Configuration:\");\n this.log(` ${installResult.configPath}`);\n this.log(\"\");\n this.log(\"To customize agent-skill assignments:\");\n this.log(` 1. Edit .claude-src/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","/**\n * Local mode installation: copy skills, build config, compile agents.\n *\n * This module extracts the local installation logic from init.tsx into\n * a pure function that does the work and returns a result object.\n * The command file handles all logging based on the result.\n */\nimport path from \"path\";\nimport { stringify as stringifyYaml } from \"yaml\";\nimport type {\n CompileConfig,\n CompileAgentConfig,\n ProjectConfig,\n AgentDefinition,\n} from \"../../types\";\nimport type { SourceLoadResult } from \"./source-loader\";\nimport type { WizardResultV2 } from \"../components/wizard/wizard\";\nimport type { CopiedSkill } from \"./skill-copier\";\nimport type { Stack } from \"../types-stacks\";\nimport type { MergedSkillsMatrix } from \"../types-matrix\";\nimport { copySkillsToLocalFlattened } from \"./skill-copier\";\nimport { mergeWithExistingConfig } from \"./config-merger\";\nimport { loadAllAgents } from \"./loader\";\nimport { loadStackById } from \"./stacks-loader\";\nimport { resolveAgents, resolveStackSkills, resolveAgentSkillsFromStack } from \"./resolver\";\nimport { compileAgentForPlugin } from \"./stack-plugin-compiler\";\nimport { createLiquidEngine } from \"./compiler\";\nimport { generateProjectConfigFromSkills, buildStackProperty } from \"./config-generator\";\nimport { ensureDir, writeFile } from \"../utils/fs\";\nimport { CLAUDE_DIR, CLAUDE_SRC_DIR, LOCAL_SKILLS_PATH, PROJECT_ROOT } from \"../consts\";\n\nconst PLUGIN_NAME = \"claude-collective\";\n\nconst YAML_INDENT = 2;\nconst YAML_LINE_WIDTH = 120;\n\n/**\n * Resolved local skill for agent compilation.\n * Extends SkillDefinition with content field.\n */\ninterface LocalResolvedSkill {\n id: string;\n name: string;\n description: string;\n canonicalId: string;\n path: string;\n content: string;\n}\n\nexport interface LocalInstallOptions {\n /** Wizard result with selected skills and mode */\n wizardResult: WizardResultV2;\n /** Source load result with matrix and paths */\n sourceResult: SourceLoadResult;\n /** Project directory (cwd) */\n projectDir: string;\n /** Source flag value (if provided) */\n sourceFlag?: string;\n}\n\nexport interface LocalInstallResult {\n /** Skills that were copied */\n copiedSkills: CopiedSkill[];\n /** Final merged project config */\n config: ProjectConfig;\n /** Path where config was saved */\n configPath: string;\n /** Names of compiled agents */\n compiledAgents: string[];\n /** Whether config was merged with existing */\n wasMerged: boolean;\n /** Path to the existing config that was merged with, if any */\n mergedConfigPath?: string;\n /** Local skills directory path */\n skillsDir: string;\n /** Local agents directory path */\n agentsDir: string;\n}\n\n/**\n * Build a map of local skills for resolution during agent compilation.\n */\nfunction buildLocalSkillsMap(\n copiedSkills: CopiedSkill[],\n matrix: MergedSkillsMatrix,\n): Record<string, LocalResolvedSkill> {\n const localSkillsForResolution: Record<string, LocalResolvedSkill> = {};\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 return localSkillsForResolution;\n}\n\n/**\n * Build the initial ProjectConfig from wizard result.\n * Uses stack config if a stack was selected, otherwise generates from individual skills.\n */\nasync function buildLocalConfig(\n wizardResult: WizardResultV2,\n sourceResult: SourceLoadResult,\n skillAliases: Record<string, string>,\n): Promise<{ config: ProjectConfig; loadedStack: Stack | null }> {\n const loadedStack = wizardResult.selectedStackId\n ? await loadStackById(wizardResult.selectedStackId, PROJECT_ROOT)\n : null;\n\n let localConfig: ProjectConfig;\n\n if (wizardResult.selectedStackId) {\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: wizardResult.installMode,\n description: loadedStack.description,\n skills: wizardResult.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 '${wizardResult.selectedStackId}' not found in config/stacks.yaml. ` +\n `Available stacks are defined in the CLI's config/stacks.yaml file.`,\n );\n }\n } else {\n localConfig = generateProjectConfigFromSkills(\n PLUGIN_NAME,\n wizardResult.selectedSkills,\n sourceResult.matrix,\n );\n }\n\n return { config: localConfig, loadedStack };\n}\n\n/**\n * Set metadata fields on the config (installMode, source, marketplace).\n */\nfunction setConfigMetadata(\n config: ProjectConfig,\n wizardResult: WizardResultV2,\n sourceResult: SourceLoadResult,\n sourceFlag?: string,\n): void {\n // Add installMode to config\n config.installMode = wizardResult.installMode;\n\n // Add source to config (flag overrides resolved source, but always include it)\n if (sourceFlag) {\n config.source = sourceFlag;\n } else if (sourceResult.sourceConfig.source) {\n config.source = sourceResult.sourceConfig.source;\n }\n\n // Add marketplace if available from resolved config\n if (sourceResult.marketplace) {\n config.marketplace = sourceResult.marketplace;\n }\n}\n\n/**\n * Build CompileAgentConfig map for agent compilation.\n */\nfunction buildCompileAgents(\n config: ProjectConfig,\n agents: Record<string, AgentDefinition>,\n loadedStack: Stack | null,\n skillAliases: Record<string, string>,\n localSkills: Record<string, LocalResolvedSkill>,\n): Record<string, CompileAgentConfig> {\n const compileAgents: Record<string, CompileAgentConfig> = {};\n for (const agentId of config.agents) {\n if (agents[agentId]) {\n // Phase 7: Skills come from stack's technology mappings\n if (loadedStack) {\n const skillRefs = resolveAgentSkillsFromStack(agentId, loadedStack, skillAliases);\n compileAgents[agentId] = { skills: skillRefs };\n } else if (config.agent_skills?.[agentId]) {\n // Resolve skills from agent_skills config\n const skillRefs = resolveStackSkills(config, agentId, localSkills);\n compileAgents[agentId] = { skills: skillRefs };\n } else {\n // No stack, no agent_skills: empty skills\n compileAgents[agentId] = {};\n }\n }\n }\n return compileAgents;\n}\n\n/**\n * Compile agents and write them to the agents directory.\n */\nasync function compileAndWriteAgents(\n compileConfig: CompileConfig,\n agents: Record<string, AgentDefinition>,\n localSkills: Record<string, LocalResolvedSkill>,\n sourceResult: SourceLoadResult,\n loadedStack: Stack | null,\n skillAliases: Record<string, string>,\n projectDir: string,\n agentsDir: string,\n): Promise<string[]> {\n const engine = await createLiquidEngine(projectDir);\n const resolvedAgents = await resolveAgents(\n agents,\n localSkills,\n compileConfig,\n sourceResult.sourcePath,\n loadedStack ?? undefined,\n skillAliases,\n );\n\n const compiledAgentNames: string[] = [];\n for (const [name, agent] of Object.entries(resolvedAgents)) {\n const output = await compileAgentForPlugin(name, agent, sourceResult.sourcePath, engine);\n await writeFile(path.join(agentsDir, `${name}.md`), output);\n compiledAgentNames.push(name);\n }\n\n return compiledAgentNames;\n}\n\n/**\n * Install in Local Mode: copy skills, generate config, compile agents.\n *\n * Steps:\n * 1. Create directories (.claude/skills, .claude/agents, .claude-src/)\n * 2. Copy selected skills to .claude/skills/ (flattened)\n * 3. Generate project config from skills/stack selection\n * 4. Set source, marketplace, installMode on config\n * 5. Merge with existing project config (if any)\n * 6. Write config to .claude-src/config.yaml\n * 7. Compile agents to .claude/agents/\n *\n * Returns structured result for the caller to format output.\n */\nexport async function installLocal(options: LocalInstallOptions): Promise<LocalInstallResult> {\n const { wizardResult, sourceResult, projectDir, sourceFlag } = options;\n const matrix = sourceResult.matrix;\n const localSkillsDir = path.join(projectDir, LOCAL_SKILLS_PATH);\n const localAgentsDir = path.join(projectDir, CLAUDE_DIR, \"agents\");\n const localConfigPath = path.join(projectDir, CLAUDE_SRC_DIR, \"config.yaml\");\n\n // 1. Create directories\n await ensureDir(localSkillsDir);\n await ensureDir(localAgentsDir);\n await ensureDir(path.dirname(localConfigPath));\n\n // 2. Copy selected skills\n const copiedSkills = await copySkillsToLocalFlattened(\n wizardResult.selectedSkills,\n localSkillsDir,\n matrix,\n sourceResult,\n );\n\n // 3. Build local skills map for resolution\n const localSkillsForResolution = buildLocalSkillsMap(copiedSkills, matrix);\n const skillAliases = matrix.aliases || {};\n\n // 4. 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 // 5. Build config\n const { config: builtConfig, loadedStack } = await buildLocalConfig(\n wizardResult,\n sourceResult,\n skillAliases,\n );\n\n // 6. Set metadata\n setConfigMetadata(builtConfig, wizardResult, sourceResult, sourceFlag);\n\n // 7. Merge with existing config\n const mergeResult = await mergeWithExistingConfig(builtConfig, { projectDir });\n const finalConfig = mergeResult.config;\n\n // 8. Write config\n const configYaml = stringifyYaml(finalConfig, {\n indent: YAML_INDENT,\n lineWidth: YAML_LINE_WIDTH,\n });\n await writeFile(localConfigPath, configYaml);\n\n // 9. Build compile agents config\n const compileAgentsConfig = buildCompileAgents(\n finalConfig,\n agents,\n loadedStack,\n skillAliases,\n localSkillsForResolution,\n );\n\n const compileConfig: CompileConfig = {\n name: PLUGIN_NAME,\n description:\n finalConfig.description || `Local setup with ${wizardResult.selectedSkills.length} skills`,\n claude_md: \"\",\n agents: compileAgentsConfig,\n };\n\n // 10. Compile and write agents\n const compiledAgentNames = await compileAndWriteAgents(\n compileConfig,\n agents,\n localSkillsForResolution,\n sourceResult,\n loadedStack,\n skillAliases,\n projectDir,\n localAgentsDir,\n );\n\n return {\n copiedSkills,\n config: finalConfig,\n configPath: localConfigPath,\n compiledAgents: compiledAgentNames,\n wasMerged: mergeResult.merged,\n mergedConfigPath: mergeResult.existingConfigPath,\n skillsDir: localSkillsDir,\n agentsDir: localAgentsDir,\n };\n}\n","import type { ProjectConfig } from \"../../types\";\nimport { loadProjectConfig as loadFullProjectConfig } from \"./project-config\";\nimport { loadProjectConfig } from \"./config\";\n\nexport interface MergeContext {\n projectDir: string;\n}\n\nexport interface MergeResult {\n config: ProjectConfig;\n merged: boolean;\n /** Path to the existing config that was merged with, if any */\n existingConfigPath?: string;\n}\n\n/**\n * Merge a newly generated ProjectConfig with any existing project config.\n *\n * Merge strategy:\n * - Existing values take precedence for identity fields (name, description, source, author)\n * - Skills arrays are unioned (existing + new, deduplicated)\n * - Agents arrays are unioned\n * - Stack is deep-merged (existing agent configs take precedence)\n * - Other optional fields preserved from existing if present\n *\n * If no existing full config is found, falls back to simple project config\n * to inherit author and agents_source.\n *\n * Returns the merged config and whether an existing config was found.\n */\nexport async function mergeWithExistingConfig(\n newConfig: ProjectConfig,\n context: MergeContext,\n): Promise<MergeResult> {\n // Clone to avoid mutating the input\n const localConfig = { ...newConfig };\n\n const existingFullConfig = await loadFullProjectConfig(context.projectDir);\n if (existingFullConfig) {\n const existingConfig = existingFullConfig.config;\n\n // Keep existing name if present\n if (existingConfig.name) {\n localConfig.name = existingConfig.name;\n }\n\n // Keep existing description if present\n if (existingConfig.description) {\n localConfig.description = existingConfig.description;\n }\n\n // Keep existing source if present (don't overwrite user's source)\n if (existingConfig.source) {\n localConfig.source = existingConfig.source;\n }\n\n // Merge skills arrays (union of existing + new)\n if (existingConfig.skills && existingConfig.skills.length > 0) {\n const existingSkillIds = new Set(\n existingConfig.skills.map((s) => (typeof s === \"string\" ? s : s.id)),\n );\n const newSkillIds =\n localConfig.skills?.filter(\n (s) => !existingSkillIds.has(typeof s === \"string\" ? s : s.id),\n ) || [];\n localConfig.skills = [...existingConfig.skills, ...newSkillIds];\n }\n\n // Merge agents arrays (union of existing + new)\n if (existingConfig.agents && existingConfig.agents.length > 0) {\n const existingAgentIds = new Set(existingConfig.agents);\n const newAgentIds = localConfig.agents.filter((a) => !existingAgentIds.has(a));\n localConfig.agents = [...existingConfig.agents, ...newAgentIds];\n }\n\n // Deep merge stack (existing agent configs take precedence)\n if (existingConfig.stack) {\n const mergedStack = { ...localConfig.stack };\n for (const [agentId, agentConfig] of Object.entries(existingConfig.stack)) {\n mergedStack[agentId] = { ...mergedStack[agentId], ...agentConfig };\n }\n localConfig.stack = mergedStack;\n }\n\n // Keep existing author if present\n if (existingConfig.author) {\n localConfig.author = existingConfig.author;\n }\n\n // Keep existing agents_source if present\n if (existingConfig.agents_source) {\n localConfig.agents_source = existingConfig.agents_source;\n }\n\n // Keep existing marketplace if present\n if (existingConfig.marketplace) {\n localConfig.marketplace = existingConfig.marketplace;\n }\n\n // Keep other existing fields\n if (existingConfig.philosophy) {\n localConfig.philosophy = existingConfig.philosophy;\n }\n if (existingConfig.framework) {\n localConfig.framework = existingConfig.framework;\n }\n if (existingConfig.principles) {\n localConfig.principles = existingConfig.principles;\n }\n if (existingConfig.tags) {\n localConfig.tags = existingConfig.tags;\n }\n if (existingConfig.agent_skills) {\n localConfig.agent_skills = existingConfig.agent_skills;\n }\n if (existingConfig.preload_patterns) {\n localConfig.preload_patterns = existingConfig.preload_patterns;\n }\n if (existingConfig.custom_agents) {\n localConfig.custom_agents = existingConfig.custom_agents;\n }\n if (existingConfig.hooks) {\n localConfig.hooks = existingConfig.hooks;\n }\n\n return {\n config: localConfig,\n merged: true,\n existingConfigPath: existingFullConfig.configPath,\n };\n }\n\n // No existing full config, try simple project config for author/agents_source\n const existingProjectConfig = await loadProjectConfig(context.projectDir);\n if (existingProjectConfig?.author) {\n localConfig.author = existingProjectConfig.author;\n }\n if (existingProjectConfig?.agents_source) {\n localConfig.agents_source = existingProjectConfig.agents_source;\n }\n\n return { config: localConfig, merged: false };\n}\n","import type { ProjectConfig, SkillEntry, AgentSkillConfig } from \"../../types\";\nimport type { MergedSkillsMatrix } from \"../types-matrix\";\nimport type { Stack, StackAgentConfig } from \"../types-stacks\";\nimport { getAgentsForSkill, shouldPreloadSkill } from \"./skill-agent-mappings\";\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\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(selectedSkillIds, matrix, neededAgents);\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(skillPath, skillId, category, agentId);\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 * 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(agentConfig as StackAgentConfig)) {\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/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 \"web/*\": [\n \"web-developer\",\n \"web-reviewer\",\n \"web-researcher\",\n \"web-pm\",\n \"pattern-scout\",\n \"web-pattern-critique\",\n \"agent-summoner\",\n \"skill-summoner\",\n \"documentor\",\n ],\n\n \"api/*\": [\n \"api-developer\",\n \"api-reviewer\",\n \"api-researcher\",\n \"web-architecture\",\n \"web-pm\",\n \"pattern-scout\",\n \"web-pattern-critique\",\n \"agent-summoner\",\n \"skill-summoner\",\n \"documentor\",\n ],\n\n \"mobile/*\": [\n \"web-developer\",\n \"web-reviewer\",\n \"web-researcher\",\n \"web-pm\",\n \"agent-summoner\",\n \"skill-summoner\",\n \"documentor\",\n ],\n\n \"infra/*\": [\n \"web-architecture\",\n \"web-developer\",\n \"api-developer\",\n \"agent-summoner\",\n \"skill-summoner\",\n \"documentor\",\n ],\n\n \"security/*\": [\n \"web-developer\",\n \"api-developer\",\n \"web-reviewer\",\n \"api-reviewer\",\n \"web-architecture\",\n \"web-pm\",\n \"agent-summoner\",\n \"skill-summoner\",\n \"documentor\",\n ],\n\n \"reviewing/*\": [\n \"web-reviewer\",\n \"api-reviewer\",\n \"cli-reviewer\",\n \"web-pattern-critique\",\n \"agent-summoner\",\n \"skill-summoner\",\n \"documentor\",\n ],\n\n \"cli/*\": [\n \"cli-developer\",\n \"cli-reviewer\",\n \"api-developer\",\n \"api-reviewer\",\n \"api-researcher\",\n \"web-architecture\",\n \"web-pm\",\n \"agent-summoner\",\n \"skill-summoner\",\n \"documentor\",\n ],\n\n \"research/*\": [\n \"web-researcher\",\n \"api-researcher\",\n \"web-pm\",\n \"pattern-scout\",\n \"web-pattern-critique\",\n \"documentor\",\n \"agent-summoner\",\n \"skill-summoner\",\n ],\n\n \"methodology/*\": [\n \"web-developer\",\n \"api-developer\",\n \"web-reviewer\",\n \"api-reviewer\",\n \"web-researcher\",\n \"api-researcher\",\n \"web-tester\",\n \"web-pm\",\n \"web-architecture\",\n \"pattern-scout\",\n \"web-pattern-critique\",\n \"agent-summoner\",\n \"skill-summoner\",\n \"documentor\",\n ],\n\n \"web/testing\": [\"web-tester\", \"web-developer\", \"web-reviewer\"],\n \"api/testing\": [\"web-tester\", \"api-developer\", \"api-reviewer\"],\n\n \"web/mocks\": [\"web-tester\", \"web-developer\", \"web-reviewer\"],\n};\n\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 \"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: \"web/framework\",\n styling: \"web/styling\",\n api: \"api/api\",\n database: \"api/database\",\n mocks: \"web/mocks\",\n testing: \"testing\",\n reviewing: \"reviewing\",\n \"research-methodology\": \"research/research-methodology\",\n monorepo: \"infra/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(projectConfig?: ProjectConfig): 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/web/framework/react\")\n * @param category - Skill category (e.g., \"web/*\" or \"web/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 (normalizedPath === pattern || normalizedPath.startsWith(`${pattern}/`)) {\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/web/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(agentId: string, projectConfig?: ProjectConfig): 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/web/framework/react\")\n * @param category - Skill category (e.g., \"web/*\" or \"web/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 (isSkillAssignedToAgent(skillId, agentId, projectConfig.agent_skills)) {\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 (typeof mappings.skill_to_agents !== \"object\" || mappings.skill_to_agents === null) {\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 (typeof mappings.preloaded_skills !== \"object\" || mappings.preloaded_skills === null) {\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 (typeof mappings.subcategory_aliases !== \"object\" || mappings.subcategory_aliases === null) {\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","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(projectRoot: string): Promise<React.ReactElement | null> {\n const settingsPath = path.join(projectRoot, \".claude\", \"settings.json\");\n const localSettingsPath = path.join(projectRoot, \".claude\", \"settings.local.json\");\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 flexDirection=\"column\" borderStyle=\"round\" borderColor=\"yellow\" padding={1}>\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 flexDirection=\"column\" borderStyle=\"round\" borderColor=\"yellow\" padding={1}>\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, testing, and build\n commands.\n </Text>\n )}\n {hasNoAllows && (\n <Text>⚠ No allow rules configured. Agents will prompt for each tool use.</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 } = 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"],"mappings":"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","names":["path","loadProjectConfig","path","path","path","path","jsx","result","path"]}
1
+ {"version":3,"sources":["../../src/cli/commands/init.tsx","../../src/cli/lib/permission-checker.tsx"],"sourcesContent":["import { Flags } from \"@oclif/core\";\nimport { render } from \"ink\";\nimport path from \"path\";\nimport { BaseCommand } from \"../base-command.js\";\nimport { Wizard, type WizardResultV2 } from \"../components/wizard/wizard.js\";\nimport { loadSkillsMatrixFromSource, type SourceLoadResult } from \"../lib/loading/index.js\";\nimport { saveSourceToProjectConfig } from \"../lib/configuration/index.js\";\nimport { installLocal } from \"../lib/installation/index.js\";\nimport { checkPermissions } from \"../lib/permission-checker.js\";\nimport { installStackAsPlugin } from \"../lib/stacks/index.js\";\nimport { getCollectivePluginDir } from \"../lib/plugins/index.js\";\nimport {\n claudePluginInstall,\n claudePluginMarketplaceExists,\n claudePluginMarketplaceAdd,\n} from \"../utils/exec.js\";\nimport { directoryExists } from \"../utils/fs.js\";\nimport { CLAUDE_DIR, LOCAL_SKILLS_PATH } from \"../consts.js\";\nimport { EXIT_CODES } from \"../lib/exit-codes.js\";\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(\n ` \n █████╗ ██████╗ ███████╗███╗ ██╗████████╗███████╗ ██╗███╗ ██╗ ██████╗\n██╔══██╗██╔════╝ ██╔════╝████╗ ██║╚══██╔══╝██╔════╝ ██║████╗ ██║██╔════╝\n███████║██║ ███╗█████╗ ██╔██╗ ██║ ██║ ███████╗ ██║██╔██╗ ██║██║ \n██╔══██║██║ ██║██╔══╝ ██║╚██╗██║ ██║ ╚════██║ ██║██║╚██╗██║██║ \n██║ ██║╚██████╔╝███████╗██║ ╚████║ ██║ ███████║ ██║██║ ╚████║╚██████╗\n╚═╝ ╚═╝ ╚═════╝ ╚══════╝╚═╝ ╚═══╝ ╚═╝ ╚══════╝ ╚═╝╚═╝ ╚═══╝ ╚═════╝\n`,\n );\n\n if (flags[\"dry-run\"]) {\n this.log(\"[dry-run] Preview mode - no files will be created\\n\");\n }\n\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 let sourceResult: SourceLoadResult;\n try {\n sourceResult = await loadSkillsMatrixFromSource({\n sourceFlag: flags.source,\n projectDir,\n forceRefresh: flags.refresh,\n });\n } catch (error) {\n this.error(error instanceof Error ? error.message : \"Unknown error occurred\", {\n exit: EXIT_CODES.ERROR,\n });\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 projectDir={process.cwd()}\n onComplete={(result) => {\n wizardResult = result as WizardResultV2;\n }}\n onCancel={() => {\n this.log(\"Setup cancelled\");\n }}\n />,\n );\n\n await waitUntilExit();\n\n const result = wizardResult as WizardResultV2 | null;\n if (!result || result.cancelled) {\n return this.exit(EXIT_CODES.CANCELLED);\n }\n\n if (result.selectedSkills.length === 0) {\n return this.error(\"No skills selected\", { exit: EXIT_CODES.ERROR });\n }\n\n await this.handleInstallation(result, sourceResult, flags);\n }\n\n private async handleInstallation(\n result: WizardResultV2,\n sourceResult: SourceLoadResult,\n flags: { \"dry-run\": boolean; source?: string; refresh: boolean },\n ): Promise<void> {\n const projectDir = process.cwd();\n const dryRun = flags[\"dry-run\"];\n\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\n if (dryRun) {\n if (result.installMode === \"plugin\" && result.selectedStackId) {\n const useMarketplace = !!sourceResult.marketplace;\n if (useMarketplace) {\n this.log(\n `[dry-run] Would install stack \"${result.selectedStackId}\" from marketplace \"${sourceResult.marketplace}\"`,\n );\n this.log(\n `[dry-run] claude plugin install ${result.selectedStackId}@${sourceResult.marketplace} --scope project`,\n );\n } else {\n this.log(\n `[dry-run] Would compile and install stack \"${result.selectedStackId}\" as a native plugin`,\n );\n this.log(\n `[dry-run] claude plugin install ./compiled-stack/${result.selectedStackId} --scope project`,\n );\n this.log(\n `[dry-run] Stack includes ${result.selectedSkills.length} skills and agents bundled together`,\n );\n }\n } else if (result.installMode === \"plugin\" && sourceResult.marketplace) {\n this.log(\n `[dry-run] Would install ${result.selectedSkills.length} skills as individual plugins from \"${sourceResult.marketplace}\"`,\n );\n for (const skillId of result.selectedSkills) {\n this.log(\n `[dry-run] claude plugin install ${skillId}@${sourceResult.marketplace} --scope project`,\n );\n }\n const localAgentsDir = path.join(projectDir, CLAUDE_DIR, \"agents\");\n this.log(`[dry-run] Would compile agents to ${localAgentsDir}`);\n this.log(`[dry-run] Would save config to .claude-src/config.yaml`);\n } else {\n if (result.installMode === \"plugin\") {\n this.log(\n `[dry-run] Plugin Mode requires a marketplace for individual skills — would fall back to Local Mode`,\n );\n }\n const localSkillsDir = path.join(projectDir, LOCAL_SKILLS_PATH);\n const localAgentsDir = path.join(projectDir, CLAUDE_DIR, \"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-src/config.yaml`);\n }\n this.log(\"\\n[dry-run] Preview complete - no files were created\");\n return;\n }\n\n if (result.installMode === \"plugin\") {\n if (result.selectedStackId) {\n await this.installPluginMode(result, sourceResult, flags);\n } else if (sourceResult.marketplace) {\n await this.installIndividualPlugins(result, sourceResult, flags);\n } else {\n this.warn(\"Plugin Mode requires a marketplace for individual skill installation.\");\n this.log(`Falling back to Local Mode (copying to .claude/skills/)...`);\n this.log(\"To use Plugin Mode, either select a stack or configure a marketplace source.\\n\");\n await this.installLocalMode(result, sourceResult, flags);\n }\n return;\n }\n\n await this.installLocalMode(result, sourceResult, flags);\n }\n\n private async installPluginMode(\n result: WizardResultV2,\n sourceResult: SourceLoadResult,\n flags: { source?: string },\n ): Promise<void> {\n if (!result.selectedStackId) {\n throw new Error(\"No stack selected for plugin mode\");\n }\n\n const projectDir = process.cwd();\n\n if (sourceResult.marketplace) {\n const marketplaceExists = await claudePluginMarketplaceExists(sourceResult.marketplace);\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.selectedStackId}\"...`);\n\n try {\n const installResult = await installStackAsPlugin({\n stackId: result.selectedStackId,\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(`Installed stack plugin: ${installResult.pluginName} ${installedFrom}\\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 if (flags.source) {\n await saveSourceToProjectConfig(projectDir, flags.source);\n this.log(`Source saved to .claude-src/config.yaml`);\n }\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 private async installIndividualPlugins(\n result: WizardResultV2,\n sourceResult: SourceLoadResult,\n flags: { source?: string },\n ): Promise<void> {\n const projectDir = process.cwd();\n\n // 1. Register marketplace if needed (same pattern as installPluginMode)\n if (sourceResult.marketplace) {\n const marketplaceExists = await claudePluginMarketplaceExists(sourceResult.marketplace);\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 // 2. Install each skill as a native plugin\n this.log(\"Installing skill plugins...\");\n for (const skillId of result.selectedSkills) {\n const pluginRef = `${skillId}@${sourceResult.marketplace}`;\n try {\n await claudePluginInstall(pluginRef, \"project\", projectDir);\n this.log(` Installed ${pluginRef}`);\n } catch (error) {\n this.error(\n `Failed to install plugin ${pluginRef}: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n { exit: EXIT_CODES.ERROR },\n );\n }\n }\n\n this.log(`Installed ${result.selectedSkills.length} skill plugins\\n`);\n\n // 3. Run local installation for config generation + agent compilation\n // Skills are also copied to .claude/skills/ as a local reference for the compiler\n await this.installLocalMode(result, sourceResult, flags);\n }\n\n private async installLocalMode(\n result: WizardResultV2,\n sourceResult: SourceLoadResult,\n flags: { source?: string },\n ): Promise<void> {\n const projectDir = process.cwd();\n const matrix = sourceResult.matrix;\n\n this.log(\"Copying skills to local directory...\");\n try {\n const installResult = await installLocal({\n wizardResult: result,\n sourceResult,\n projectDir,\n sourceFlag: flags.source,\n });\n\n this.log(`Copied ${installResult.copiedSkills.length} skills to .claude/skills/\\n`);\n this.log(\"Generating configuration...\");\n\n if (installResult.wasMerged) {\n this.log(`Merged with existing config at ${installResult.mergedConfigPath}`);\n }\n\n this.log(`Configuration saved (${installResult.config.agents.length} agents)\\n`);\n this.log(\"Compiling agents...\");\n this.log(`Compiled ${installResult.compiledAgents.length} agents to .claude/agents/\\n`);\n\n this.log(\"Claude Collective initialized successfully!\\n\");\n this.log(\"Skills copied to:\");\n this.log(` ${installResult.skillsDir}`);\n for (const copiedSkill of installResult.copiedSkills) {\n const skill = matrix.skills[copiedSkill.skillId];\n const displayName = skill?.displayName || copiedSkill.skillId;\n this.log(` ${displayName}/`);\n }\n this.log(\"\");\n this.log(\"Agents compiled to:\");\n this.log(` ${installResult.agentsDir}`);\n for (const agentName of installResult.compiledAgents) {\n this.log(` ${agentName}.md`);\n }\n this.log(\"\");\n this.log(\"Configuration:\");\n this.log(` ${installResult.configPath}`);\n this.log(\"\");\n this.log(\"To customize agent-skill assignments:\");\n this.log(` 1. Edit .claude-src/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\";\nimport { warn } from \"../utils/logger\";\nimport { settingsFileSchema } from \"./schemas\";\n\ntype PermissionConfig = {\n allow?: string[];\n deny?: string[];\n};\n\ntype SettingsFile = {\n permissions?: PermissionConfig;\n};\n\nexport async function checkPermissions(projectRoot: string): Promise<React.ReactElement | null> {\n const settingsPath = path.join(projectRoot, \".claude\", \"settings.json\");\n const localSettingsPath = path.join(projectRoot, \".claude\", \"settings.local.json\");\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 raw = JSON.parse(content);\n const result = settingsFileSchema.safeParse(raw);\n const parsed: SettingsFile = result.success ? (result.data as SettingsFile) : {};\n if (parsed.permissions) {\n permissions = parsed.permissions;\n break;\n }\n } catch {\n warn(`Malformed settings file at ${filePath} — skipping`);\n }\n }\n }\n\n if (!permissions) {\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor=\"yellow\" padding={1}>\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 flexDirection=\"column\" borderStyle=\"round\" borderColor=\"yellow\" padding={1}>\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, testing, and build\n commands.\n </Text>\n )}\n {hasNoAllows && (\n <Text>⚠ No allow rules configured. Agents will prompt for each tool use.</Text>\n )}\n </Box>\n );\n }\n\n return null;\n}\n"],"mappings":"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","names":["path","jsx","result","path"]}
@@ -1,99 +1,20 @@
1
1
  #!/usr/bin/env node
2
- import {
3
- detectInstallation
4
- } from "../chunk-5K2ZLUO5.js";
5
- import {
6
- getCollectivePluginDir,
7
- readPluginManifest
8
- } from "../chunk-HPGFY5ZN.js";
9
- import {
10
- loadProjectConfig
11
- } from "../chunk-VFHWU7JU.js";
12
2
  import {
13
3
  BaseCommand
14
- } from "../chunk-EHS3TWWP.js";
15
- import "../chunk-T25OEQFI.js";
4
+ } from "../chunk-OBXAY23Y.js";
16
5
  import {
17
- directoryExists
18
- } from "../chunk-AL74GBW4.js";
19
- import {
20
- DEFAULT_DISPLAY_VERSION
21
- } from "../chunk-FJFEKPXF.js";
6
+ formatInstallationDisplay,
7
+ getInstallationInfo
8
+ } from "../chunk-ETQ3BPGU.js";
9
+ import "../chunk-ZDREFYD2.js";
10
+ import "../chunk-HWD32NP7.js";
11
+ import "../chunk-O6ZTD7ZI.js";
22
12
  import {
23
13
  init_esm_shims
24
- } from "../chunk-DHET7RCE.js";
14
+ } from "../chunk-AWKZ5BDL.js";
25
15
 
26
16
  // src/cli/commands/list.ts
27
17
  init_esm_shims();
28
-
29
- // src/cli/lib/plugin-info.ts
30
- init_esm_shims();
31
- import { readdir } from "fs/promises";
32
- var DEFAULT_NAME = "claude-collective";
33
- async function getInstallationInfo() {
34
- const installation = await detectInstallation();
35
- if (!installation) {
36
- return null;
37
- }
38
- let skillCount = 0;
39
- let agentCount = 0;
40
- let name = DEFAULT_NAME;
41
- let version = DEFAULT_DISPLAY_VERSION;
42
- if (await directoryExists(installation.skillsDir)) {
43
- try {
44
- const skills = await readdir(installation.skillsDir, {
45
- withFileTypes: true
46
- });
47
- skillCount = skills.filter((s) => s.isDirectory()).length;
48
- } catch {
49
- }
50
- }
51
- if (await directoryExists(installation.agentsDir)) {
52
- try {
53
- const agents = await readdir(installation.agentsDir, {
54
- withFileTypes: true
55
- });
56
- agentCount = agents.filter((a) => a.isFile() && a.name.endsWith(".md")).length;
57
- } catch {
58
- }
59
- }
60
- if (installation.mode === "local") {
61
- const loaded = await loadProjectConfig(installation.projectDir);
62
- if (loaded?.config) {
63
- name = loaded.config.name || DEFAULT_NAME;
64
- version = "local";
65
- }
66
- } else {
67
- const pluginDir = getCollectivePluginDir(installation.projectDir);
68
- const manifest = await readPluginManifest(pluginDir);
69
- if (manifest) {
70
- name = manifest.name || DEFAULT_NAME;
71
- version = manifest.version || DEFAULT_DISPLAY_VERSION;
72
- }
73
- }
74
- return {
75
- mode: installation.mode,
76
- name,
77
- version,
78
- skillCount,
79
- agentCount,
80
- configPath: installation.configPath,
81
- agentsDir: installation.agentsDir,
82
- skillsDir: installation.skillsDir
83
- };
84
- }
85
- function formatInstallationDisplay(info) {
86
- const modeLabel = info.mode === "local" ? "Local" : "Plugin";
87
- const versionDisplay = info.mode === "local" ? "(local mode)" : `v${info.version}`;
88
- return `Installation: ${info.name} ${versionDisplay}
89
- Mode: ${modeLabel}
90
- Skills: ${info.skillCount}
91
- Agents: ${info.agentCount}
92
- Config: ${info.configPath}
93
- Agents: ${info.agentsDir}`;
94
- }
95
-
96
- // src/cli/commands/list.ts
97
18
  var List = class _List extends BaseCommand {
98
19
  static summary = "Show installation information";
99
20
  static description = "Display details about the Claude Collective installation (local or plugin mode)";
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/cli/commands/list.ts","../../src/cli/lib/plugin-info.ts"],"sourcesContent":["import { BaseCommand } from \"../base-command.js\";\nimport { getInstallationInfo, formatInstallationDisplay } 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","import { readdir } from \"fs/promises\";\nimport {\n getCollectivePluginDir,\n getPluginSkillsDir,\n getPluginAgentsDir,\n readPluginManifest,\n} from \"./plugin-finder\";\nimport { directoryExists } from \"../utils/fs\";\nimport { DEFAULT_DISPLAY_VERSION } from \"../consts\";\nimport { detectInstallation, type InstallMode } from \"./installation\";\nimport { loadProjectConfig } from \"./project-config\";\n\nconst DEFAULT_NAME = \"claude-collective\";\n\nexport interface PluginInfo {\n name: string;\n version: string;\n skillCount: number;\n agentCount: number;\n path: string;\n}\n\nexport interface InstallationInfo {\n mode: InstallMode;\n name: string;\n version: string;\n skillCount: number;\n agentCount: number;\n configPath: string;\n agentsDir: string;\n skillsDir: string;\n}\n\nexport async function getPluginInfo(): Promise<PluginInfo | null> {\n const pluginDir = getCollectivePluginDir();\n\n if (!(await directoryExists(pluginDir))) {\n return null;\n }\n\n const manifest = await readPluginManifest(pluginDir);\n if (!manifest) {\n return null;\n }\n\n const skillsDir = getPluginSkillsDir(pluginDir);\n const agentsDir = getPluginAgentsDir(pluginDir);\n\n let skillCount = 0;\n let agentCount = 0;\n\n if (await directoryExists(skillsDir)) {\n const skills = await readdir(skillsDir, { withFileTypes: true });\n skillCount = skills.filter((s) => s.isDirectory()).length;\n }\n\n if (await directoryExists(agentsDir)) {\n const agents = await readdir(agentsDir, { withFileTypes: true });\n agentCount = agents.filter((a) => a.isFile() && a.name.endsWith(\".md\")).length;\n }\n\n return {\n name: manifest.name || DEFAULT_NAME,\n version: manifest.version || DEFAULT_DISPLAY_VERSION,\n skillCount,\n agentCount,\n path: pluginDir,\n };\n}\n\nexport function formatPluginDisplay(info: PluginInfo): string {\n return `Plugin: ${info.name} v${info.version}\n Skills: ${info.skillCount}\n Agents: ${info.agentCount}\n Path: ${info.path}`;\n}\n\n/**\n * Get installation info for either local or plugin mode.\n * Auto-detects the installation mode and returns unified info.\n */\nexport async function getInstallationInfo(): Promise<InstallationInfo | null> {\n const installation = await detectInstallation();\n\n if (!installation) {\n return null;\n }\n\n let skillCount = 0;\n let agentCount = 0;\n let name = DEFAULT_NAME;\n let version = DEFAULT_DISPLAY_VERSION;\n\n // Count skills\n if (await directoryExists(installation.skillsDir)) {\n try {\n const skills = await readdir(installation.skillsDir, {\n withFileTypes: true,\n });\n skillCount = skills.filter((s) => s.isDirectory()).length;\n } catch {\n // Ignore errors\n }\n }\n\n // Count agents\n if (await directoryExists(installation.agentsDir)) {\n try {\n const agents = await readdir(installation.agentsDir, {\n withFileTypes: true,\n });\n agentCount = agents.filter((a) => a.isFile() && a.name.endsWith(\".md\")).length;\n } catch {\n // Ignore errors\n }\n }\n\n // Get name/version from config or manifest depending on mode\n if (installation.mode === \"local\") {\n const loaded = await loadProjectConfig(installation.projectDir);\n if (loaded?.config) {\n name = loaded.config.name || DEFAULT_NAME;\n // Local mode doesn't have version in the same way\n version = \"local\";\n }\n } else {\n // Plugin mode - read from manifest\n const pluginDir = getCollectivePluginDir(installation.projectDir);\n const manifest = await readPluginManifest(pluginDir);\n if (manifest) {\n name = manifest.name || DEFAULT_NAME;\n version = manifest.version || DEFAULT_DISPLAY_VERSION;\n }\n }\n\n return {\n mode: installation.mode,\n name,\n version,\n skillCount,\n agentCount,\n configPath: installation.configPath,\n agentsDir: installation.agentsDir,\n skillsDir: installation.skillsDir,\n };\n}\n\nexport function formatInstallationDisplay(info: InstallationInfo): string {\n const modeLabel = info.mode === \"local\" ? \"Local\" : \"Plugin\";\n const versionDisplay = info.mode === \"local\" ? \"(local mode)\" : `v${info.version}`;\n\n return `Installation: ${info.name} ${versionDisplay}\n Mode: ${modeLabel}\n Skills: ${info.skillCount}\n Agents: ${info.agentCount}\n Config: ${info.configPath}\n Agents: ${info.agentsDir}`;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;ACAA;AAAA,SAAS,eAAe;AAYxB,IAAM,eAAe;AAqErB,eAAsB,sBAAwD;AAC5E,QAAM,eAAe,MAAM,mBAAmB;AAE9C,MAAI,CAAC,cAAc;AACjB,WAAO;AAAA,EACT;AAEA,MAAI,aAAa;AACjB,MAAI,aAAa;AACjB,MAAI,OAAO;AACX,MAAI,UAAU;AAGd,MAAI,MAAM,gBAAgB,aAAa,SAAS,GAAG;AACjD,QAAI;AACF,YAAM,SAAS,MAAM,QAAQ,aAAa,WAAW;AAAA,QACnD,eAAe;AAAA,MACjB,CAAC;AACD,mBAAa,OAAO,OAAO,CAAC,MAAM,EAAE,YAAY,CAAC,EAAE;AAAA,IACrD,QAAQ;AAAA,IAER;AAAA,EACF;AAGA,MAAI,MAAM,gBAAgB,aAAa,SAAS,GAAG;AACjD,QAAI;AACF,YAAM,SAAS,MAAM,QAAQ,aAAa,WAAW;AAAA,QACnD,eAAe;AAAA,MACjB,CAAC;AACD,mBAAa,OAAO,OAAO,CAAC,MAAM,EAAE,OAAO,KAAK,EAAE,KAAK,SAAS,KAAK,CAAC,EAAE;AAAA,IAC1E,QAAQ;AAAA,IAER;AAAA,EACF;AAGA,MAAI,aAAa,SAAS,SAAS;AACjC,UAAM,SAAS,MAAM,kBAAkB,aAAa,UAAU;AAC9D,QAAI,QAAQ,QAAQ;AAClB,aAAO,OAAO,OAAO,QAAQ;AAE7B,gBAAU;AAAA,IACZ;AAAA,EACF,OAAO;AAEL,UAAM,YAAY,uBAAuB,aAAa,UAAU;AAChE,UAAM,WAAW,MAAM,mBAAmB,SAAS;AACnD,QAAI,UAAU;AACZ,aAAO,SAAS,QAAQ;AACxB,gBAAU,SAAS,WAAW;AAAA,IAChC;AAAA,EACF;AAEA,SAAO;AAAA,IACL,MAAM,aAAa;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,YAAY,aAAa;AAAA,IACzB,WAAW,aAAa;AAAA,IACxB,WAAW,aAAa;AAAA,EAC1B;AACF;AAEO,SAAS,0BAA0B,MAAgC;AACxE,QAAM,YAAY,KAAK,SAAS,UAAU,UAAU;AACpD,QAAM,iBAAiB,KAAK,SAAS,UAAU,iBAAiB,IAAI,KAAK,OAAO;AAEhF,SAAO,iBAAiB,KAAK,IAAI,IAAI,cAAc;AAAA,aACxC,SAAS;AAAA,aACT,KAAK,UAAU;AAAA,aACf,KAAK,UAAU;AAAA,aACf,KAAK,UAAU;AAAA,aACf,KAAK,SAAS;AAC3B;;;AD1JA,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":[]}
1
+ {"version":3,"sources":["../../src/cli/commands/list.ts"],"sourcesContent":["import { BaseCommand } from \"../base-command.js\";\nimport { getInstallationInfo, formatInstallationDisplay } from \"../lib/plugins/index.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;AAGA,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":[]}
@@ -1,28 +1,24 @@
1
1
  #!/usr/bin/env node
2
- import {
3
- isClaudeCLIAvailable
4
- } from "../../chunk-EHGD7HIE.js";
5
- import {
6
- fetchFromSource
7
- } from "../../chunk-CA4LH4LI.js";
8
2
  import {
9
3
  BaseCommand,
10
4
  EXIT_CODES
11
- } from "../../chunk-EHS3TWWP.js";
5
+ } from "../../chunk-OBXAY23Y.js";
12
6
  import {
7
+ fetchFromSource,
8
+ isClaudeCLIAvailable,
13
9
  resolveSource
14
- } from "../../chunk-374JNMR6.js";
15
- import "../../chunk-T25OEQFI.js";
10
+ } from "../../chunk-ETQ3BPGU.js";
16
11
  import {
17
12
  fileExists,
18
13
  readFile
19
- } from "../../chunk-AL74GBW4.js";
14
+ } from "../../chunk-ZDREFYD2.js";
15
+ import "../../chunk-HWD32NP7.js";
20
16
  import {
21
17
  CLAUDE_DIR
22
- } from "../../chunk-FJFEKPXF.js";
18
+ } from "../../chunk-O6ZTD7ZI.js";
23
19
  import {
24
20
  init_esm_shims
25
- } from "../../chunk-DHET7RCE.js";
21
+ } from "../../chunk-AWKZ5BDL.js";
26
22
 
27
23
  // src/cli/commands/new/agent.tsx
28
24
  init_esm_shims();
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/cli/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, useInput } 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 NewAgentInput {\n description: string;\n prompt: string;\n model?: string;\n tools?: string[];\n}\n\ninterface AgentSourceFrontmatter {\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 // Handle escape key for cancel\n useInput((_input, key) => {\n if (key.escape) {\n onCancel();\n }\n });\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>e.g., Manages database migrations with rollback support</Text>\n <Text> </Text>\n <TextInput placeholder=\"Enter agent purpose...\" onSubmit={handleSubmit} />\n {error && (\n <Box marginTop={1}>\n <Text color=\"red\">{error}</Text>\n </Box>\n )}\n </Box>\n );\n};\n\nasync function fetchMetaAgent(source: string, forceRefresh: boolean): Promise<NewAgentInput> {\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 AgentSourceFrontmatter;\n\n // Construct agent definition\n const tools = fm.tools ? fm.tools.split(\",\").map((t: string) => t.trim()) : 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(agentName: string, purpose: string, outputDir: string): 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: NewAgentInput,\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(error instanceof Error ? error.message : \"Unknown error occurred\", {\n exit: EXIT_CODES.ERROR,\n });\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAMA,SAAS,MAAM,aAAa;AAC5B,SAAS,QAAQ,KAAK,MAAM,gBAAgB;AAC5C,SAAS,iBAAiB;AAC1B,SAAgB,gBAAgB;AAChC,OAAO,UAAU;AACjB,SAAS,aAAa;AACtB,OAAO,YAAY;AAoDf,SACE,KADF;AA3CJ,IAAM,kBAAkB;AACxB,IAAM,gBAAgB;AAsBtB,IAAM,eAA4C,CAAC,EAAE,UAAU,SAAS,MAAM;AAC5E,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAwB,IAAI;AAGtD,WAAS,CAAC,QAAQ,QAAQ;AACxB,QAAI,IAAI,QAAQ;AACd,eAAS;AAAA,IACX;AAAA,EACF,CAAC;AAED,QAAM,eAAe,CAAC,UAAkB;AACtC,UAAM,UAAU,MAAM,KAAK;AAC3B,QAAI,CAAC,SAAS;AACZ,eAAS,qBAAqB;AAC9B;AAAA,IACF;AACA,aAAS,OAAO;AAAA,EAClB;AAEA,SACE,qBAAC,OAAI,eAAc,UACjB;AAAA,wBAAC,QAAK,MAAI,MAAC,8BAAgB;AAAA,IAC3B,oBAAC,QAAK,wCAA0B;AAAA,IAChC,oBAAC,QAAK,UAAQ,MAAC,qEAAuD;AAAA,IACtE,oBAAC,QAAK,eAAC;AAAA,IACP,oBAAC,aAAU,aAAY,0BAAyB,UAAU,cAAc;AAAA,IACvE,SACC,oBAAC,OAAI,WAAW,GACd,8BAAC,QAAK,OAAM,OAAO,iBAAM,GAC3B;AAAA,KAEJ;AAEJ;AAEA,eAAe,eAAe,QAAgB,cAA+C;AAE3F,QAAM,SAAS,MAAM,gBAAgB,QAAQ;AAAA,IAC3C;AAAA,IACA,QAAQ;AAAA,EACV,CAAC;AAGD,QAAM,YAAY,KAAK,KAAK,OAAO,MAAM,GAAG,eAAe,KAAK;AAEhE,MAAI,CAAE,MAAM,WAAW,SAAS,GAAI;AAClC,UAAM,IAAI;AAAA,MACR,yBAAyB,eAAe;AAAA;AAAA,eACtB,SAAS;AAAA;AAAA,IAE7B;AAAA,EACF;AAEA,QAAM,UAAU,MAAM,SAAS,SAAS;AAGxC,QAAM,EAAE,MAAM,aAAa,SAAS,KAAK,IAAI,OAAO,OAAO;AAC3D,QAAM,KAAK;AAGX,QAAM,QAAQ,GAAG,QAAQ,GAAG,MAAM,MAAM,GAAG,EAAE,IAAI,CAAC,MAAc,EAAE,KAAK,CAAC,IAAI;AAE5E,SAAO;AAAA,IACL,aAAa,GAAG,eAAe;AAAA,IAC/B,QAAQ;AAAA,IACR,OAAO,GAAG;AAAA,IACV;AAAA,EACF;AACF;AAEA,SAAS,iBAAiB,WAAmB,SAAiB,WAA2B;AACvF,SAAO,yCAAyC,SAAS,uBAAuB,SAAS;AAAA;AAAA,iBAE1E,OAAO;AAAA;AAAA;AAAA,6CAGqB,SAAS,IAAI,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQnE;AAEA,eAAe,gBACb,UACA,QACA,gBACe;AAEf,QAAM,aAAa,KAAK,UAAU;AAAA,IAChC,CAAC,eAAe,GAAG;AAAA,MACjB,aAAa,SAAS;AAAA,MACtB,QAAQ,SAAS;AAAA,MACjB,OAAO,SAAS;AAAA,MAChB,OAAO,SAAS;AAAA,IAClB;AAAA,EACF,CAAC;AAGD,QAAM,OAAO,CAAC,YAAY,YAAY,WAAW,eAAe;AAEhE,MAAI,gBAAgB;AAClB,SAAK,KAAK,MAAM,MAAM;AAAA,EACxB,OAAO;AAEL,SAAK,KAAK,YAAY,MAAM;AAAA,EAC9B;AAGA,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,UAAM,QAAQ,MAAM,UAAU,MAAM;AAAA,MAClC,OAAO;AAAA,MACP,OAAO;AAAA,IACT,CAAC;AAED,UAAM,GAAG,SAAS,CAAC,UAAU;AAC3B,aAAO,IAAI,MAAM,+BAA+B,MAAM,OAAO,EAAE,CAAC;AAAA,IAClE,CAAC;AAED,UAAM,GAAG,SAAS,CAAC,SAAS;AAC1B,UAAI,SAAS,GAAG;AACd,gBAAQ;AAAA,MACV,OAAO;AACL,eAAO,IAAI,MAAM,+BAA+B,IAAI,EAAE,CAAC;AAAA,MACzD;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AACH;AAEA,IAAqB,WAArB,MAAqB,kBAAiB,YAAY;AAAA,EAChD,OAAO,UAAU;AAAA,EACjB,OAAO,cACL;AAAA,EAEF,OAAO,OAAO;AAAA,IACZ,MAAM,KAAK,OAAO;AAAA,MAChB,aAAa;AAAA,MACb,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AAAA,EAEA,OAAO,QAAQ;AAAA,IACb,GAAG,YAAY;AAAA,IACf,SAAS,MAAM,OAAO;AAAA,MACpB,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACZ,CAAC;AAAA,IACD,SAAS,MAAM,QAAQ;AAAA,MACrB,MAAM;AAAA,MACN,aAAa;AAAA,MACb,SAAS;AAAA,IACX,CAAC;AAAA,IACD,mBAAmB,MAAM,QAAQ;AAAA,MAC/B,MAAM;AAAA,MACN,aAAa;AAAA,MACb,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,MAAqB;AACzB,UAAM,EAAE,MAAM,MAAM,IAAI,MAAM,KAAK,MAAM,SAAQ;AACjD,UAAM,aAAa,QAAQ,IAAI;AAG/B,UAAM,eAAe,MAAM,qBAAqB;AAChD,QAAI,CAAC,cAAc;AACjB,WAAK;AAAA,QACH;AAAA,QAEA,EAAE,MAAM,WAAW,MAAM;AAAA,MAC3B;AAAA,IACF;AAGA,UAAM,eAAe,MAAM,cAAc,MAAM,QAAQ,UAAU;AACjE,UAAM,SAAS,aAAa;AAG5B,QAAI,UAAU,MAAM;AAEpB,QAAI,CAAC,SAAS;AAEZ,UAAI,cAA6B;AACjC,UAAI,YAAY;AAEhB,YAAM,EAAE,cAAc,IAAI;AAAA,QACxB;AAAA,UAAC;AAAA;AAAA,YACC,UAAU,CAAC,UAAU;AACnB,4BAAc;AAAA,YAChB;AAAA,YACA,UAAU,MAAM;AACd,0BAAY;AAAA,YACd;AAAA;AAAA,QACF;AAAA,MACF;AAEA,YAAM,cAAc;AAEpB,UAAI,aAAa,CAAC,aAAa;AAC7B,aAAK,IAAI,WAAW;AACpB,aAAK,KAAK,WAAW,SAAS;AAAA,MAChC;AAEA,gBAAU;AAAA,IACZ;AAGA,UAAM,YAAY,KAAK,KAAK,YAAY,YAAY,UAAU,SAAS;AAEvE,SAAK,IAAI,EAAE;AACX,SAAK,IAAI,eAAe,KAAK,IAAI,EAAE;AACnC,SAAK,IAAI,YAAY,OAAO,EAAE;AAC9B,SAAK,IAAI,WAAW,SAAS,EAAE;AAC/B,SAAK,IAAI,EAAE;AAEX,SAAK,IAAI,wCAAwC;AAEjD,QAAI;AAEF,YAAM,WAAW,MAAM,eAAe,QAAQ,MAAM,OAAO;AAC3D,WAAK,IAAI,mBAAmB;AAC5B,WAAK,IAAI,EAAE;AAGX,YAAM,cAAc,iBAAiB,KAAK,MAAM,SAAS,SAAS;AAElE,WAAK,IAAI,iDAAiD;AAC1D,WAAK,IAAI,SAAI,OAAO,EAAE,CAAC;AACvB,WAAK,IAAI,EAAE;AAGX,YAAM,gBAAgB,UAAU,aAAa,MAAM,iBAAiB,CAAC;AAErE,WAAK,IAAI,EAAE;AACX,WAAK,IAAI,SAAI,OAAO,EAAE,CAAC;AACvB,WAAK,WAAW,0BAA0B;AAAA,IAC5C,SAAS,OAAO;AACd,WAAK,MAAM,iBAAiB,QAAQ,MAAM,UAAU,0BAA0B;AAAA,QAC5E,MAAM,WAAW;AAAA,MACnB,CAAC;AAAA,IACH;AAAA,EACF;AACF;","names":[]}
1
+ {"version":3,"sources":["../../../src/cli/commands/new/agent.tsx"],"sourcesContent":["import { Args, Flags } from \"@oclif/core\";\nimport { render, Box, Text, useInput } 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/loading/index.js\";\nimport { resolveSource } from \"../../lib/configuration/index.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\ntype NewAgentInput = {\n description: string;\n prompt: string;\n model?: string;\n tools?: string[];\n};\n\ntype AgentSourceFrontmatter = {\n name: string;\n description: string;\n tools?: string;\n model?: string;\n permissionMode?: string;\n};\n\ntype 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 useInput((_input, key) => {\n if (key.escape) {\n onCancel();\n }\n });\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>e.g., Manages database migrations with rollback support</Text>\n <Text> </Text>\n <TextInput placeholder=\"Enter agent purpose...\" onSubmit={handleSubmit} />\n {error && (\n <Box marginTop={1}>\n <Text color=\"red\">{error}</Text>\n </Box>\n )}\n </Box>\n );\n};\n\nasync function fetchMetaAgent(source: string, forceRefresh: boolean): Promise<NewAgentInput> {\n const result = await fetchFromSource(source, {\n forceRefresh,\n subdir: AGENTS_SUBDIR,\n });\n\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 const { data: frontmatter, content: body } = matter(content);\n const fm = frontmatter as AgentSourceFrontmatter;\n\n const tools = fm.tools ? fm.tools.split(\",\").map((t: string) => t.trim()) : 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(agentName: string, purpose: string, outputDir: string): 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: NewAgentInput,\n prompt: string,\n nonInteractive: boolean,\n): Promise<void> {\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 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 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 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 const sourceConfig = await resolveSource(flags.source, projectDir);\n const source = sourceConfig.source;\n\n let purpose = flags.purpose;\n\n if (!purpose) {\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 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 const agentDef = await fetchMetaAgent(source, flags.refresh);\n this.log(\"Meta-agent loaded\");\n this.log(\"\");\n\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 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(error instanceof Error ? error.message : \"Unknown error occurred\", {\n exit: EXIT_CODES.ERROR,\n });\n }\n }\n}\n"],"mappings":"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","names":[]}
@@ -2,21 +2,21 @@
2
2
  import {
3
3
  BaseCommand,
4
4
  EXIT_CODES
5
- } from "../../chunk-EHS3TWWP.js";
5
+ } from "../../chunk-OBXAY23Y.js";
6
6
  import {
7
7
  resolveAuthor
8
- } from "../../chunk-374JNMR6.js";
9
- import "../../chunk-T25OEQFI.js";
8
+ } from "../../chunk-ETQ3BPGU.js";
10
9
  import {
11
10
  directoryExists,
12
11
  writeFile
13
- } from "../../chunk-AL74GBW4.js";
12
+ } from "../../chunk-ZDREFYD2.js";
13
+ import "../../chunk-HWD32NP7.js";
14
14
  import {
15
15
  LOCAL_SKILLS_PATH
16
- } from "../../chunk-FJFEKPXF.js";
16
+ } from "../../chunk-O6ZTD7ZI.js";
17
17
  import {
18
18
  init_esm_shims
19
- } from "../../chunk-DHET7RCE.js";
19
+ } from "../../chunk-AWKZ5BDL.js";
20
20
 
21
21
  // src/cli/commands/new/skill.ts
22
22
  init_esm_shims();
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/cli/commands/new/skill.ts"],"sourcesContent":["import { Args, Flags } from \"@oclif/core\";\nimport path from \"path\";\nimport { BaseCommand } from \"../../base-command.js\";\nimport { resolveAuthor } from \"../../lib/config.js\";\nimport { writeFile, directoryExists } from \"../../utils/fs.js\";\nimport { LOCAL_SKILLS_PATH } from \"../../consts.js\";\nimport { EXIT_CODES } from \"../../lib/exit-codes.js\";\n\nconst DEFAULT_AUTHOR = \"@local\";\nconst DEFAULT_CATEGORY = \"local\";\nconst KEBAB_CASE_PATTERN = /^[a-z][a-z0-9-]*$/;\n\n/**\n * Validates that a skill name follows kebab-case convention.\n * Must start with lowercase letter, followed by lowercase letters, numbers, or hyphens.\n */\nexport function validateSkillName(name: string): string | null {\n if (!name || name.trim() === \"\") {\n return \"Skill name is required\";\n }\n\n if (!KEBAB_CASE_PATTERN.test(name)) {\n return \"Skill name must be kebab-case (lowercase letters, numbers, and hyphens, starting with a letter)\";\n }\n\n return null;\n}\n\n/**\n * Converts kebab-case to Title Case.\n * e.g., \"my-patterns\" -> \"My Patterns\"\n */\nexport function toTitleCase(kebabCase: string): string {\n return kebabCase\n .split(\"-\")\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(\" \");\n}\n\n/**\n * Generates the SKILL.md content with frontmatter.\n */\nexport function generateSkillMd(name: string, author: string): string {\n const titleName = toTitleCase(name);\n const skillId = `${name} (${author})`;\n\n return `---\nname: ${skillId}\ndescription: Brief description of this skill\n---\n\n# ${titleName}\n\n> **Quick Guide:** Add a brief summary of what this skill teaches.\n\n---\n\n<critical_requirements>\n\n## CRITICAL: Before Using This Skill\n\n**(Add critical requirements here)**\n\n</critical_requirements>\n\n---\n\n**When to use:**\n\n- Add use cases here\n\n**Key patterns covered:**\n\n- Add patterns here\n\n---\n\n<patterns>\n\n## Core Patterns\n\n### Pattern 1: Example Pattern\n\nAdd your patterns here.\n\n</patterns>\n\n---\n\n<critical_reminders>\n\n## CRITICAL REMINDERS\n\n**(Repeat critical requirements here)**\n\n</critical_reminders>\n`;\n}\n\n/**\n * Generates the metadata.yaml content.\n */\nexport function generateMetadataYaml(name: string, author: string, category: string): string {\n const titleName = toTitleCase(name);\n\n return `# yaml-language-server: $schema=https://raw.githubusercontent.com/claude-collective/skills/main/schemas/metadata.schema.json\ncategory: ${category}\ncategory_exclusive: false\nauthor: \"${author}\"\nversion: 1\ncli_name: ${titleName}\ncli_description: Brief description\nusage_guidance: Use when <guidance>.\ntags:\n - local\n - custom\n`;\n}\n\nexport default class NewSkill extends BaseCommand {\n static summary = \"Create a new local skill with proper structure\";\n static description = \"Create a new local skill scaffold with SKILL.md and metadata.yaml files\";\n\n static args = {\n name: Args.string({\n description: \"Name of the skill to create (kebab-case)\",\n required: true,\n }),\n };\n\n static flags = {\n ...BaseCommand.baseFlags,\n author: Flags.string({\n char: \"a\",\n description: \"Author identifier (e.g., @myhandle)\",\n required: false,\n }),\n category: Flags.string({\n char: \"c\",\n description: \"Skill category\",\n default: DEFAULT_CATEGORY,\n }),\n force: Flags.boolean({\n char: \"f\",\n description: \"Overwrite existing skill directory\",\n default: false,\n }),\n };\n\n async run(): Promise<void> {\n const { args, flags } = await this.parse(NewSkill);\n const projectDir = process.cwd();\n\n this.log(\"\");\n this.log(\"Create New Skill\");\n this.log(\"\");\n\n // Validate skill name\n const validationError = validateSkillName(args.name);\n if (validationError) {\n this.error(validationError, { exit: EXIT_CODES.INVALID_ARGS });\n }\n\n // Determine author: flag > project config > default\n let author = flags.author;\n if (!author) {\n author = (await resolveAuthor(projectDir)) || DEFAULT_AUTHOR;\n }\n\n const category = flags.category;\n\n // Determine skill directory path\n const skillDir = path.join(projectDir, LOCAL_SKILLS_PATH, args.name);\n\n // Check if directory already exists\n if (await directoryExists(skillDir)) {\n if (!flags.force) {\n this.error(`Skill directory already exists: ${skillDir}\\nUse --force to overwrite.`, {\n exit: EXIT_CODES.ERROR,\n });\n }\n this.warn(`Overwriting existing skill at ${skillDir}`);\n }\n\n this.log(`Skill name: ${args.name}`);\n this.log(`Author: ${author}`);\n this.log(`Category: ${category}`);\n this.log(`Directory: ${skillDir}`);\n this.log(\"\");\n\n if (flags[\"dry-run\"]) {\n this.log(\"[DRY RUN] Would create skill files\");\n return;\n }\n\n this.log(\"Creating skill files...\");\n\n try {\n // Generate file contents\n const skillMdContent = generateSkillMd(args.name, author);\n const metadataContent = generateMetadataYaml(args.name, author, category);\n\n // Write files (writeFile automatically creates parent directories)\n const skillMdPath = path.join(skillDir, \"SKILL.md\");\n const metadataPath = path.join(skillDir, \"metadata.yaml\");\n\n await writeFile(skillMdPath, skillMdContent);\n await writeFile(metadataPath, metadataContent);\n\n this.log(\"\");\n this.logSuccess(`Created SKILL.md at ${skillMdPath}`);\n this.logSuccess(`Created metadata.yaml at ${metadataPath}`);\n this.log(\"\");\n this.log(\"Skill created successfully! Run 'cc compile' to include it in your agents.\");\n this.log(\"\");\n } catch (error) {\n this.error(error instanceof Error ? error.message : \"Unknown error occurred\", {\n exit: EXIT_CODES.ERROR,\n });\n }\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/cli/commands/new/skill.ts"],"sourcesContent":["import { Args, Flags } from \"@oclif/core\";\nimport path from \"path\";\nimport { BaseCommand } from \"../../base-command.js\";\nimport { resolveAuthor } from \"../../lib/configuration/index.js\";\nimport { writeFile, directoryExists } from \"../../utils/fs.js\";\nimport { LOCAL_SKILLS_PATH } from \"../../consts.js\";\nimport { EXIT_CODES } from \"../../lib/exit-codes.js\";\nimport type { CategoryPath } from \"../../types/index.js\";\n\nconst DEFAULT_AUTHOR = \"@local\";\nconst DEFAULT_CATEGORY = \"local\";\nconst KEBAB_CASE_PATTERN = /^[a-z][a-z0-9-]*$/;\n\nexport function validateSkillName(name: string): string | null {\n if (!name || name.trim() === \"\") {\n return \"Skill name is required\";\n }\n\n if (!KEBAB_CASE_PATTERN.test(name)) {\n return \"Skill name must be kebab-case (lowercase letters, numbers, and hyphens, starting with a letter)\";\n }\n\n return null;\n}\n\nexport function toTitleCase(kebabCase: string): string {\n return kebabCase\n .split(\"-\")\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(\" \");\n}\n\nexport function generateSkillMd(name: string, author: string): string {\n const titleName = toTitleCase(name);\n const skillId = `${name} (${author})`;\n\n return `---\nname: ${skillId}\ndescription: Brief description of this skill\n---\n\n# ${titleName}\n\n> **Quick Guide:** Add a brief summary of what this skill teaches.\n\n---\n\n<critical_requirements>\n\n## CRITICAL: Before Using This Skill\n\n**(Add critical requirements here)**\n\n</critical_requirements>\n\n---\n\n**When to use:**\n\n- Add use cases here\n\n**Key patterns covered:**\n\n- Add patterns here\n\n---\n\n<patterns>\n\n## Core Patterns\n\n### Pattern 1: Example Pattern\n\nAdd your patterns here.\n\n</patterns>\n\n---\n\n<critical_reminders>\n\n## CRITICAL REMINDERS\n\n**(Repeat critical requirements here)**\n\n</critical_reminders>\n`;\n}\n\nexport function generateMetadataYaml(name: string, author: string, category: CategoryPath): string {\n const titleName = toTitleCase(name);\n\n return `# yaml-language-server: $schema=https://raw.githubusercontent.com/claude-collective/skills/main/schemas/metadata.schema.json\ncategory: ${category}\ncategory_exclusive: false\nauthor: \"${author}\"\nversion: 1\ncli_name: ${titleName}\ncli_description: Brief description\nusage_guidance: Use when <guidance>.\ntags:\n - local\n - custom\n`;\n}\n\nexport default class NewSkill extends BaseCommand {\n static summary = \"Create a new local skill with proper structure\";\n static description = \"Create a new local skill scaffold with SKILL.md and metadata.yaml files\";\n\n static args = {\n name: Args.string({\n description: \"Name of the skill to create (kebab-case)\",\n required: true,\n }),\n };\n\n static flags = {\n ...BaseCommand.baseFlags,\n author: Flags.string({\n char: \"a\",\n description: \"Author identifier (e.g., @myhandle)\",\n required: false,\n }),\n category: Flags.string({\n char: \"c\",\n description: \"Skill category\",\n default: DEFAULT_CATEGORY,\n }),\n force: Flags.boolean({\n char: \"f\",\n description: \"Overwrite existing skill directory\",\n default: false,\n }),\n };\n\n async run(): Promise<void> {\n const { args, flags } = await this.parse(NewSkill);\n const projectDir = process.cwd();\n\n this.log(\"\");\n this.log(\"Create New Skill\");\n this.log(\"\");\n\n const validationError = validateSkillName(args.name);\n if (validationError) {\n this.error(validationError, { exit: EXIT_CODES.INVALID_ARGS });\n }\n\n // Determine author: flag > project config > default\n let author = flags.author;\n if (!author) {\n author = (await resolveAuthor(projectDir)) || DEFAULT_AUTHOR;\n }\n\n // CLI flag is an untyped string — cast at data boundary\n const category = flags.category as CategoryPath;\n\n const skillDir = path.join(projectDir, LOCAL_SKILLS_PATH, args.name);\n\n if (await directoryExists(skillDir)) {\n if (!flags.force) {\n this.error(`Skill directory already exists: ${skillDir}\\nUse --force to overwrite.`, {\n exit: EXIT_CODES.ERROR,\n });\n }\n this.warn(`Overwriting existing skill at ${skillDir}`);\n }\n\n this.log(`Skill name: ${args.name}`);\n this.log(`Author: ${author}`);\n this.log(`Category: ${category}`);\n this.log(`Directory: ${skillDir}`);\n this.log(\"\");\n\n if (flags[\"dry-run\"]) {\n this.log(\"[DRY RUN] Would create skill files\");\n return;\n }\n\n this.log(\"Creating skill files...\");\n\n try {\n const skillMdContent = generateSkillMd(args.name, author);\n const metadataContent = generateMetadataYaml(args.name, author, category);\n\n const skillMdPath = path.join(skillDir, \"SKILL.md\");\n const metadataPath = path.join(skillDir, \"metadata.yaml\");\n\n await writeFile(skillMdPath, skillMdContent);\n await writeFile(metadataPath, metadataContent);\n\n this.log(\"\");\n this.logSuccess(`Created SKILL.md at ${skillMdPath}`);\n this.logSuccess(`Created metadata.yaml at ${metadataPath}`);\n this.log(\"\");\n this.log(\"Skill created successfully! Run 'cc compile' to include it in your agents.\");\n this.log(\"\");\n } catch (error) {\n this.error(error instanceof Error ? error.message : \"Unknown error occurred\", {\n exit: EXIT_CODES.ERROR,\n });\n }\n }\n}\n"],"mappings":"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","names":[]}