@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
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/lib/agents/agent-fetcher.ts","../src/cli/lib/agents/agent-recompiler.ts","../src/cli/lib/agents/agent-plugin-compiler.ts","../src/cli/lib/agents/index.ts"],"sourcesContent":["import path from \"path\";\nimport { directoryExists } from \"../../utils/fs\";\nimport { verbose } from \"../../utils/logger\";\nimport { PROJECT_ROOT, DIRS, CLAUDE_DIR } from \"../../consts\";\nimport { fetchFromSource, type FetchOptions } from \"../loading\";\nimport type { AgentSourcePaths } from \"../../types\";\n\nexport type AgentDefinitionOptions = FetchOptions & {\n projectDir?: string;\n};\n\nexport async function getAgentDefinitions(\n remoteSource?: string,\n options: AgentDefinitionOptions = {},\n): Promise<AgentSourcePaths> {\n if (remoteSource) {\n return fetchAgentDefinitionsFromRemote(remoteSource, options);\n }\n return getLocalAgentDefinitions(options);\n}\n\nexport async function getLocalAgentDefinitions(\n options: AgentDefinitionOptions = {},\n): Promise<AgentSourcePaths> {\n const agentsDir = path.join(PROJECT_ROOT, DIRS.agents);\n let templatesDir = path.join(PROJECT_ROOT, DIRS.templates);\n\n if (!(await directoryExists(agentsDir))) {\n throw new Error(\n `Agent partials not found at: ${agentsDir}. ` + `Ensure the CLI is properly installed.`,\n );\n }\n\n // Check for local templates first (from eject templates)\n if (options.projectDir) {\n const localTemplatesDir = path.join(options.projectDir, CLAUDE_DIR, \"templates\");\n if (await directoryExists(localTemplatesDir)) {\n verbose(`Using local templates from: ${localTemplatesDir}`);\n templatesDir = localTemplatesDir;\n }\n }\n\n if (!(await directoryExists(templatesDir))) {\n verbose(`Templates directory not found: ${templatesDir}`);\n }\n\n verbose(`Agent partials loaded from CLI: ${agentsDir}`);\n verbose(`Templates directory: ${templatesDir}`);\n\n return {\n agentsDir,\n templatesDir,\n sourcePath: PROJECT_ROOT,\n };\n}\n\nexport async function fetchAgentDefinitionsFromRemote(\n source: string,\n options: FetchOptions = {},\n): Promise<AgentSourcePaths> {\n verbose(`Fetching agent partials from remote: ${source}`);\n\n const result = await fetchFromSource(source, {\n forceRefresh: options.forceRefresh,\n subdir: \"\",\n });\n\n const agentsDir = path.join(result.path, \"src\", \"agents\");\n const templatesDir = path.join(agentsDir, \"_templates\");\n\n if (!(await directoryExists(agentsDir))) {\n throw new Error(`Agent partials not found at: ${agentsDir}`);\n }\n\n if (!(await directoryExists(templatesDir))) {\n verbose(`Templates directory not found: ${templatesDir}`);\n }\n\n verbose(`Agent partials fetched from: ${result.path}`);\n\n return {\n agentsDir,\n templatesDir,\n sourcePath: result.path,\n };\n}\n","import path from \"path\";\nimport { glob, writeFile, ensureDir, readFile, fileExists } from \"../../utils/fs\";\nimport { verbose } from \"../../utils/logger\";\nimport { loadAllAgents, loadPluginSkills, loadProjectAgents } from \"../loading\";\nimport { resolveAgents, buildSkillRefsFromConfig } from \"../resolver\";\nimport { compileAgentForPlugin } from \"../stacks\";\nimport { getPluginAgentsDir } from \"../plugins\";\nimport { createLiquidEngine } from \"../compiler\";\nimport { loadProjectConfig, type LoadedProjectConfig } from \"../configuration\";\nimport { parse as parseYaml } from \"yaml\";\nimport { projectConfigLoaderSchema } from \"../schemas\";\nimport type {\n AgentConfig,\n AgentDefinition,\n AgentName,\n CompileAgentConfig,\n CompileConfig,\n ProjectConfig,\n SkillDefinition,\n SkillId,\n} from \"../../types\";\nimport { typedEntries, typedKeys } from \"../../utils/typed-object\";\n\nexport type RecompileAgentsOptions = {\n pluginDir: string;\n sourcePath: string;\n agents?: AgentName[];\n skills?: Record<string, SkillDefinition>;\n projectDir?: string;\n outputDir?: string;\n};\n\nexport type RecompileAgentsResult = {\n compiled: AgentName[];\n failed: AgentName[];\n warnings: string[];\n};\n\nasync function getExistingAgentNames(pluginDir: string): Promise<AgentName[]> {\n const agentsDir = getPluginAgentsDir(pluginDir);\n const files = await glob(\"*.md\", agentsDir);\n // Boundary cast: directory names from filesystem are agent names by convention\n return files.map((f) => path.basename(f, \".md\") as AgentName);\n}\n\n// Tries pluginDir/config.yaml (legacy) then pluginDir/.claude/config.yaml\nasync function loadConfigWithFallback(pluginDir: string): Promise<LoadedProjectConfig | null> {\n const legacyConfigPath = path.join(pluginDir, \"config.yaml\");\n if (await fileExists(legacyConfigPath)) {\n try {\n const content = await readFile(legacyConfigPath);\n const parsed = parseYaml(content);\n const result = projectConfigLoaderSchema.safeParse(parsed);\n\n if (result.success) {\n verbose(`Loaded config.yaml from ${legacyConfigPath}`);\n return {\n // Loader schema validates field types but allows partial configs;\n // required field validation happens in validateProjectConfig()\n config: result.data as ProjectConfig,\n configPath: legacyConfigPath,\n };\n } else {\n verbose(`Invalid config.yaml at ${legacyConfigPath}: ${result.error.message}`);\n }\n } catch (error) {\n verbose(`Failed to parse config.yaml: ${error}`);\n }\n }\n\n // Fall back to project config location (.claude/config.yaml)\n return loadProjectConfig(pluginDir);\n}\n\nexport async function recompileAgents(\n options: RecompileAgentsOptions,\n): Promise<RecompileAgentsResult> {\n const {\n pluginDir,\n sourcePath,\n agents: specifiedAgents,\n skills: providedSkills,\n projectDir,\n outputDir,\n } = options;\n\n const result: RecompileAgentsResult = {\n compiled: [],\n failed: [],\n warnings: [],\n };\n\n let loadedConfig = await loadConfigWithFallback(pluginDir);\n if (!loadedConfig && projectDir) {\n loadedConfig = await loadConfigWithFallback(projectDir);\n }\n const projectConfig = loadedConfig?.config ?? null;\n\n const builtinAgents = await loadAllAgents(sourcePath);\n const projectAgents = projectDir ? await loadProjectAgents(projectDir) : {};\n\n // Boundary cast: loadAllAgents returns Record<string, AgentDefinition>, agent dirs are AgentName by convention\n // Priority: project agents > built-in agents\n const allAgents = {\n ...builtinAgents,\n ...projectAgents,\n } as Record<AgentName, AgentDefinition>;\n\n let agentNames: AgentName[];\n if (specifiedAgents) {\n agentNames = specifiedAgents;\n } else if (projectConfig?.agents) {\n agentNames = projectConfig.agents;\n verbose(`Using agents from config.yaml: ${agentNames.join(\", \")}`);\n } else if (outputDir) {\n agentNames = typedKeys<AgentName>(allAgents);\n verbose(`Using all available agents from source: ${agentNames.join(\", \")}`);\n } else {\n agentNames = await getExistingAgentNames(pluginDir);\n }\n\n if (agentNames.length === 0) {\n result.warnings.push(\"No agents found to recompile\");\n return result;\n }\n\n verbose(`Recompiling ${agentNames.length} agents in ${outputDir ?? pluginDir}`);\n\n const pluginSkills = providedSkills ?? (await loadPluginSkills(pluginDir));\n\n const compileAgents = {} as Record<AgentName, CompileAgentConfig>;\n for (const agentName of agentNames) {\n if (allAgents[agentName]) {\n const agentStack = projectConfig?.stack?.[agentName];\n compileAgents[agentName] = agentStack ? { skills: buildSkillRefsFromConfig(agentStack) } : {};\n } else {\n result.warnings.push(`Agent \"${agentName}\" not found in source definitions`);\n }\n }\n\n const compileConfig: CompileConfig = {\n name: projectConfig?.name || path.basename(pluginDir),\n description: projectConfig?.description || \"Recompiled plugin\",\n agents: compileAgents,\n };\n\n const engine = await createLiquidEngine(projectDir);\n const resolvedAgents = await resolveAgents(allAgents, pluginSkills, compileConfig, sourcePath);\n\n const agentsDir = outputDir ?? getPluginAgentsDir(pluginDir);\n await ensureDir(agentsDir);\n\n for (const [agentName, agent] of typedEntries<AgentName, AgentConfig>(resolvedAgents)) {\n try {\n const output = await compileAgentForPlugin(\n agentName,\n agent,\n sourcePath,\n engine,\n projectConfig?.installMode,\n );\n await writeFile(path.join(agentsDir, `${agentName}.md`), output);\n result.compiled.push(agentName);\n verbose(` Recompiled: ${agentName}`);\n } catch (error) {\n result.failed.push(agentName);\n result.warnings.push(\n `Failed to compile ${agentName}: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n\n return result;\n}\n","import path from \"path\";\nimport { readFile, ensureDir, glob, copy } from \"../../utils/fs\";\nimport { verbose, warn } from \"../../utils/logger\";\nimport {\n generateAgentPluginManifest,\n writePluginManifest,\n getPluginManifestPath,\n} from \"../plugins\";\nimport { hashString, determinePluginVersion, writeContentHash } from \"../versioning\";\nimport { extractFrontmatter } from \"../../utils/frontmatter\";\nimport type { PluginManifest } from \"../../types\";\nimport { agentFrontmatterValidationSchema } from \"../schemas\";\n\nexport type AgentPluginOptions = {\n agentPath: string;\n outputDir: string;\n};\n\nexport type CompiledAgentPlugin = {\n pluginPath: string;\n manifest: PluginManifest;\n agentName: string;\n};\n\nfunction parseAgentFrontmatter(\n content: string,\n filePath: string,\n): { name: string; description: string } | null {\n const raw = extractFrontmatter(content);\n if (!raw) {\n return null;\n }\n\n const result = agentFrontmatterValidationSchema.safeParse(raw);\n if (!result.success) {\n warn(\n `Invalid agent frontmatter in ${filePath}: ${result.error.issues.map((i) => `${i.path.join(\".\")}: ${i.message}`).join(\"; \")}`,\n );\n return null;\n }\n\n return { name: result.data.name, description: result.data.description };\n}\n\nexport async function compileAgentPlugin(\n options: AgentPluginOptions,\n): Promise<CompiledAgentPlugin> {\n const { agentPath, outputDir } = options;\n const fileName = path.basename(agentPath);\n\n const content = await readFile(agentPath);\n const frontmatter = parseAgentFrontmatter(content, agentPath);\n\n if (!frontmatter) {\n throw new Error(\n `Agent '${fileName}' has invalid or missing YAML frontmatter. ` +\n `Required fields: 'name' and 'description'. File: ${agentPath}`,\n );\n }\n\n const agentName = frontmatter.name;\n\n verbose(`Compiling agent plugin: ${agentName} from ${agentPath}`);\n\n const pluginDir = path.join(outputDir, `agent-${agentName}`);\n const agentsDir = path.join(pluginDir, \"agents\");\n\n await ensureDir(pluginDir);\n await ensureDir(agentsDir);\n\n const newHash = hashString(content);\n const { version, contentHash } = await determinePluginVersion(\n newHash,\n pluginDir,\n getPluginManifestPath,\n );\n\n const manifest = generateAgentPluginManifest({\n agentName,\n description: frontmatter.description,\n version,\n });\n\n await writePluginManifest(pluginDir, manifest);\n\n await writeContentHash(pluginDir, contentHash, getPluginManifestPath);\n\n verbose(` Wrote plugin.json for ${agentName} (v${version})`);\n\n await copy(agentPath, path.join(agentsDir, `${agentName}.md`));\n verbose(` Copied agent ${fileName} -> agents/${agentName}.md`);\n\n return {\n pluginPath: pluginDir,\n manifest,\n agentName,\n };\n}\n\nexport async function compileAllAgentPlugins(\n agentsDir: string,\n outputDir: string,\n): Promise<CompiledAgentPlugin[]> {\n const results: CompiledAgentPlugin[] = [];\n\n const agentMdFiles = await glob(\"*.md\", agentsDir);\n\n for (const agentFile of agentMdFiles) {\n const agentPath = path.join(agentsDir, agentFile);\n\n try {\n const result = await compileAgentPlugin({\n agentPath,\n outputDir,\n });\n results.push(result);\n console.log(` [OK] agent-${result.agentName}`);\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n console.warn(` [WARN] Failed to compile agent from ${agentFile}: ${errorMessage}`);\n }\n }\n\n return results;\n}\n\nexport function printAgentCompilationSummary(results: CompiledAgentPlugin[]): void {\n console.log(`\\nCompiled ${results.length} agent plugins:`);\n for (const result of results) {\n console.log(` - agent-${result.agentName} (v${result.manifest.version})`);\n }\n}\n","export {\n type AgentDefinitionOptions,\n getAgentDefinitions,\n getLocalAgentDefinitions,\n fetchAgentDefinitionsFromRemote,\n} from \"./agent-fetcher\";\n\nexport {\n type RecompileAgentsOptions,\n type RecompileAgentsResult,\n recompileAgents,\n} from \"./agent-recompiler\";\n\nexport {\n type AgentPluginOptions,\n type CompiledAgentPlugin,\n compileAgentPlugin,\n compileAllAgentPlugins,\n printAgentCompilationSummary,\n} from \"./agent-plugin-compiler\";\n"],"mappings":"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","names":["path","path","path","path"]}
@@ -1,34 +1,45 @@
1
1
  #!/usr/bin/env node
2
+ import {
3
+ StepSources
4
+ } from "./chunk-4357L7VK.js";
2
5
  import {
3
6
  StepStack
4
- } from "./chunk-A46TPNBJ.js";
7
+ } from "./chunk-XENOESJZ.js";
5
8
  import {
6
9
  WizardLayout
7
- } from "./chunk-3EHUF54X.js";
8
- import {
9
- StepApproach
10
- } from "./chunk-WFEFICFM.js";
10
+ } from "./chunk-UEMRJI2K.js";
11
11
  import {
12
- StepBuild,
13
- getStackName,
14
- validateSelection
15
- } from "./chunk-3XR4PALU.js";
12
+ StepBuild
13
+ } from "./chunk-TDZE4TDG.js";
16
14
  import {
17
15
  StepConfirm
18
- } from "./chunk-ZEI3ZUDU.js";
16
+ } from "./chunk-VVYNZZUX.js";
17
+ import {
18
+ getStackName
19
+ } from "./chunk-V2ZIH7HV.js";
20
+ import {
21
+ StepSettings
22
+ } from "./chunk-7UPXT32F.js";
23
+ import {
24
+ StepApproach
25
+ } from "./chunk-KWYO3M5Q.js";
19
26
  import {
20
27
  cliTheme
21
- } from "./chunk-Z2CWURZ6.js";
28
+ } from "./chunk-UNN7523L.js";
22
29
  import {
23
30
  useWizardStore
24
- } from "./chunk-CBLPAMZO.js";
31
+ } from "./chunk-TMED5DQ2.js";
32
+ import {
33
+ resolveAlias,
34
+ validateSelection
35
+ } from "./chunk-ETQ3BPGU.js";
25
36
  import {
26
37
  init_esm_shims
27
- } from "./chunk-DHET7RCE.js";
38
+ } from "./chunk-AWKZ5BDL.js";
28
39
 
29
40
  // src/cli/components/wizard/wizard.tsx
30
41
  init_esm_shims();
31
- import { useCallback } from "react";
42
+ import { useCallback, useState } from "react";
32
43
  import { Box, Text, useApp, useInput, useStdout } from "ink";
33
44
  import { ThemeProvider } from "@inkjs/ui";
34
45
  import { jsx, jsxs } from "react/jsx-runtime";
@@ -37,18 +48,36 @@ function getParentDomain(domain, matrix) {
37
48
  return cat?.parent_domain;
38
49
  }
39
50
  var MIN_TERMINAL_WIDTH = 80;
40
- var Wizard = ({ matrix, onComplete, onCancel, version }) => {
51
+ var Wizard = ({
52
+ matrix,
53
+ onComplete,
54
+ onCancel,
55
+ version,
56
+ initialStep,
57
+ installedSkillIds,
58
+ projectDir
59
+ }) => {
41
60
  const store = useWizardStore();
42
61
  const { exit } = useApp();
43
62
  const { stdout } = useStdout();
44
63
  const terminalWidth = stdout.columns || MIN_TERMINAL_WIDTH;
45
64
  const isNarrowTerminal = terminalWidth < MIN_TERMINAL_WIDTH;
65
+ const [initialized] = useState(() => {
66
+ if (initialStep) {
67
+ if (installedSkillIds?.length) {
68
+ useWizardStore.getState().populateFromSkillIds(installedSkillIds, matrix.skills, matrix.categories);
69
+ }
70
+ useWizardStore.setState({ step: initialStep, approach: "scratch" });
71
+ }
72
+ return true;
73
+ });
46
74
  useInput((input, key) => {
75
+ if (store.showSettings) return;
47
76
  if (key.escape) {
48
77
  if (store.step === "approach") {
49
78
  onCancel();
50
79
  exit();
51
- } else if (store.step !== "build" && store.step !== "confirm") {
80
+ } else if (store.step !== "build" && store.step !== "confirm" && store.step !== "sources") {
52
81
  store.goBack();
53
82
  }
54
83
  return;
@@ -58,6 +87,10 @@ var Wizard = ({ matrix, onComplete, onCancel, version }) => {
58
87
  store.setStep("confirm");
59
88
  return;
60
89
  }
90
+ if ((input === "g" || input === "G") && store.step === "sources") {
91
+ store.toggleSettings();
92
+ return;
93
+ }
61
94
  if (input === "e" || input === "E") {
62
95
  store.toggleExpertMode();
63
96
  return;
@@ -78,13 +111,13 @@ var Wizard = ({ matrix, onComplete, onCancel, version }) => {
78
111
  } else {
79
112
  const techNames = store.getAllSelectedTechnologies();
80
113
  allSkills = techNames.map((tech) => {
81
- const resolved = matrix.aliases[tech];
82
- if (!resolved && !matrix.skills[tech]) {
114
+ const resolved = resolveAlias(tech, matrix);
115
+ if (!matrix.skills[resolved]) {
83
116
  console.warn(
84
117
  `Warning: Technology '${tech}' could not be resolved to a skill ID \u2014 it may be missing from skill_aliases`
85
118
  );
86
119
  }
87
- return resolved || tech;
120
+ return resolved;
88
121
  });
89
122
  }
90
123
  const methodologySkills = store.getSelectedSkills();
@@ -98,6 +131,7 @@ var Wizard = ({ matrix, onComplete, onCancel, version }) => {
98
131
  selectedSkills: allSkills,
99
132
  selectedStackId: store.selectedStackId,
100
133
  domainSelections: store.domainSelections,
134
+ sourceSelections: store.sourceSelections,
101
135
  expertMode: store.expertMode,
102
136
  installMode: store.installMode,
103
137
  cancelled: false,
@@ -114,7 +148,8 @@ var Wizard = ({ matrix, onComplete, onCancel, version }) => {
114
148
  return /* @__PURE__ */ jsx(StepStack, { matrix });
115
149
  case "build": {
116
150
  const currentDomain = store.getCurrentDomain();
117
- const effectiveDomains = store.selectedDomains.length > 0 ? store.selectedDomains : ["web"];
151
+ const defaultDomains = ["web"];
152
+ const effectiveDomains = store.selectedDomains.length > 0 ? store.selectedDomains : defaultDomains;
118
153
  const allSelections = store.getAllSelectedTechnologies();
119
154
  const activeDomain = currentDomain || effectiveDomains[0] || "web";
120
155
  const parentDomain = getParentDomain(activeDomain, matrix);
@@ -132,6 +167,7 @@ var Wizard = ({ matrix, onComplete, onCancel, version }) => {
132
167
  showDescriptions: store.showDescriptions,
133
168
  expertMode: store.expertMode,
134
169
  parentDomainSelections,
170
+ installedSkillIds,
135
171
  onToggle: (subcategoryId, techId) => {
136
172
  const domain = store.getCurrentDomain() || "web";
137
173
  const cat = matrix.categories[subcategoryId];
@@ -141,7 +177,7 @@ var Wizard = ({ matrix, onComplete, onCancel, version }) => {
141
177
  onToggleDescriptions: store.toggleShowDescriptions,
142
178
  onContinue: () => {
143
179
  if (!store.nextDomain()) {
144
- store.setStep("confirm");
180
+ store.setStep("sources");
145
181
  }
146
182
  },
147
183
  onBack: () => {
@@ -152,18 +188,40 @@ var Wizard = ({ matrix, onComplete, onCancel, version }) => {
152
188
  }
153
189
  );
154
190
  }
191
+ case "sources": {
192
+ if (store.showSettings) {
193
+ return /* @__PURE__ */ jsx(
194
+ StepSettings,
195
+ {
196
+ projectDir: projectDir || process.cwd(),
197
+ onClose: () => store.toggleSettings()
198
+ }
199
+ );
200
+ }
201
+ return /* @__PURE__ */ jsx(
202
+ StepSources,
203
+ {
204
+ matrix,
205
+ projectDir,
206
+ onContinue: handleComplete,
207
+ onBack: store.goBack
208
+ }
209
+ );
210
+ }
211
+ // NOTE: Currently unreachable — sources step calls handleComplete directly.
212
+ // Kept for future use when confirm step is wired back in.
155
213
  case "confirm": {
156
214
  const stackName = getStackName(store.selectedStackId, matrix);
215
+ const selectedCount = store.getAllSelectedTechnologies().length;
157
216
  return /* @__PURE__ */ jsx(
158
217
  StepConfirm,
159
218
  {
160
- matrix,
161
219
  onComplete: handleComplete,
162
220
  stackName,
163
221
  selectedDomains: store.selectedDomains,
164
222
  domainSelections: store.domainSelections,
165
- technologyCount: store.getAllSelectedTechnologies().length,
166
- skillCount: store.getAllSelectedTechnologies().length,
223
+ technologyCount: selectedCount,
224
+ skillCount: selectedCount,
167
225
  installMode: store.installMode,
168
226
  onBack: store.goBack
169
227
  }
@@ -196,4 +254,4 @@ var Wizard = ({ matrix, onComplete, onCancel, version }) => {
196
254
  export {
197
255
  Wizard
198
256
  };
199
- //# sourceMappingURL=chunk-2LSGX6R4.js.map
257
+ //# sourceMappingURL=chunk-R7B63JAP.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/components/wizard/wizard.tsx"],"sourcesContent":["import React, { useCallback, useState } from \"react\";\nimport { Box, Text, useApp, useInput, useStdout } from \"ink\";\nimport { ThemeProvider } from \"@inkjs/ui\";\nimport { useWizardStore, type WizardStep } from \"../../stores/wizard-store.js\";\nimport { cliTheme } from \"../themes/default.js\";\nimport { WizardLayout } from \"./wizard-layout.js\";\nimport { StepApproach } from \"./step-approach.js\";\nimport { StepStack } from \"./step-stack.js\";\nimport { StepBuild } from \"./step-build.js\";\nimport { StepConfirm } from \"./step-confirm.js\";\nimport { StepSources } from \"./step-sources.js\";\nimport { StepSettings } from \"./step-settings.js\";\nimport { resolveAlias, validateSelection } from \"../../lib/matrix/index.js\";\nimport type { Domain, DomainSelections, MergedSkillsMatrix, SkillId } from \"../../types/index.js\";\nimport { getStackName } from \"./utils.js\";\n\nexport type WizardResultV2 = {\n selectedSkills: SkillId[];\n selectedStackId: string | null;\n domainSelections: DomainSelections;\n sourceSelections: Partial<Record<SkillId, string>>;\n expertMode: boolean;\n installMode: \"plugin\" | \"local\";\n cancelled: boolean;\n validation: {\n valid: boolean;\n errors: Array<{ message: string }>;\n warnings: Array<{ message: string }>;\n };\n};\n\ntype WizardProps = {\n matrix: MergedSkillsMatrix;\n onComplete: (result: WizardResultV2) => void;\n onCancel: () => void;\n version?: string;\n initialStep?: WizardStep;\n installedSkillIds?: SkillId[];\n projectDir?: string;\n};\n\nfunction getParentDomain(domain: Domain, matrix: MergedSkillsMatrix): Domain | undefined {\n const cat = Object.values(matrix.categories).find((c) => c.domain === domain && c.parent_domain);\n return cat?.parent_domain;\n}\n\nconst MIN_TERMINAL_WIDTH = 80;\n\nexport const Wizard: React.FC<WizardProps> = ({\n matrix,\n onComplete,\n onCancel,\n version,\n initialStep,\n installedSkillIds,\n projectDir,\n}) => {\n const store = useWizardStore();\n const { exit } = useApp();\n const { stdout } = useStdout();\n\n const terminalWidth = stdout.columns || MIN_TERMINAL_WIDTH;\n const isNarrowTerminal = terminalWidth < MIN_TERMINAL_WIDTH;\n\n const [initialized] = useState(() => {\n if (initialStep) {\n if (installedSkillIds?.length) {\n useWizardStore\n .getState()\n .populateFromSkillIds(installedSkillIds, matrix.skills, matrix.categories);\n }\n useWizardStore.setState({ step: initialStep, approach: \"scratch\" });\n }\n return true;\n });\n\n useInput((input, key) => {\n // Disable global hotkeys when settings overlay is active\n if (store.showSettings) return;\n\n if (key.escape) {\n if (store.step === \"approach\") {\n onCancel();\n exit();\n } else if (store.step !== \"build\" && store.step !== \"confirm\" && store.step !== \"sources\") {\n // Only handle escape globally for steps that don't have their own escape handler.\n // Build, sources, and confirm handle escape via their onBack props.\n store.goBack();\n }\n return;\n }\n\n // Accept defaults shortcut (stack path only, during build step)\n if ((input === \"a\" || input === \"A\") && store.step === \"build\" && store.selectedStackId) {\n store.setStackAction(\"defaults\");\n store.setStep(\"confirm\");\n return;\n }\n\n // Settings overlay (sources step only)\n if ((input === \"g\" || input === \"G\") && store.step === \"sources\") {\n store.toggleSettings();\n return;\n }\n\n // Global toggles\n if (input === \"e\" || input === \"E\") {\n store.toggleExpertMode();\n return;\n }\n if (input === \"p\" || input === \"P\") {\n store.toggleInstallMode();\n return;\n }\n });\n\n const handleComplete = useCallback(() => {\n let allSkills: SkillId[];\n\n if (store.selectedStackId && store.stackAction === \"defaults\") {\n const stack = matrix.suggestedStacks.find((s) => s.id === store.selectedStackId);\n if (!stack) {\n console.warn(`Stack not found in matrix: ${store.selectedStackId}`);\n }\n allSkills = [...(stack?.allSkillIds || [])];\n } else {\n const techNames = store.getAllSelectedTechnologies();\n allSkills = techNames.map((tech) => {\n const resolved = resolveAlias(tech, matrix);\n if (!matrix.skills[resolved]) {\n console.warn(\n `Warning: Technology '${tech}' could not be resolved to a skill ID — it may be missing from skill_aliases`,\n );\n }\n return resolved;\n });\n }\n\n const methodologySkills = store.getSelectedSkills();\n for (const skill of methodologySkills) {\n if (!allSkills.includes(skill)) {\n allSkills.push(skill);\n }\n }\n\n const validation = validateSelection(allSkills, matrix);\n\n const result: WizardResultV2 = {\n selectedSkills: allSkills,\n selectedStackId: store.selectedStackId,\n domainSelections: store.domainSelections,\n sourceSelections: store.sourceSelections,\n expertMode: store.expertMode,\n installMode: store.installMode,\n cancelled: false,\n validation,\n };\n\n onComplete(result);\n exit();\n }, [store, matrix, onComplete, exit]);\n\n const renderStep = () => {\n switch (store.step) {\n case \"approach\":\n return <StepApproach />;\n\n case \"stack\":\n return <StepStack matrix={matrix} />;\n\n case \"build\": {\n const currentDomain = store.getCurrentDomain();\n const defaultDomains: Domain[] = [\"web\"];\n const effectiveDomains =\n store.selectedDomains.length > 0 ? store.selectedDomains : defaultDomains;\n\n const allSelections = store.getAllSelectedTechnologies();\n\n const activeDomain: Domain = currentDomain || effectiveDomains[0] || \"web\";\n const parentDomain = getParentDomain(activeDomain, matrix);\n const parentDomainSelections = parentDomain\n ? store.domainSelections[parentDomain]\n : undefined;\n\n return (\n <StepBuild\n matrix={matrix}\n domain={activeDomain}\n selectedDomains={effectiveDomains}\n selections={store.domainSelections[activeDomain] || {}}\n allSelections={allSelections}\n focusedRow={store.focusedRow}\n focusedCol={store.focusedCol}\n showDescriptions={store.showDescriptions}\n expertMode={store.expertMode}\n parentDomainSelections={parentDomainSelections}\n installedSkillIds={installedSkillIds}\n onToggle={(subcategoryId, techId) => {\n const domain: Domain = store.getCurrentDomain() || \"web\";\n const cat = matrix.categories[subcategoryId];\n store.toggleTechnology(domain, subcategoryId, techId, cat?.exclusive ?? true);\n }}\n onFocusChange={store.setFocus}\n onToggleDescriptions={store.toggleShowDescriptions}\n onContinue={() => {\n if (!store.nextDomain()) {\n store.setStep(\"sources\");\n }\n }}\n onBack={() => {\n if (!store.prevDomain()) {\n store.goBack();\n }\n }}\n />\n );\n }\n\n case \"sources\": {\n if (store.showSettings) {\n return (\n <StepSettings\n projectDir={projectDir || process.cwd()}\n onClose={() => store.toggleSettings()}\n />\n );\n }\n return (\n <StepSources\n matrix={matrix}\n projectDir={projectDir}\n onContinue={handleComplete}\n onBack={store.goBack}\n />\n );\n }\n\n // NOTE: Currently unreachable — sources step calls handleComplete directly.\n // Kept for future use when confirm step is wired back in.\n case \"confirm\": {\n const stackName = getStackName(store.selectedStackId, matrix);\n const selectedCount = store.getAllSelectedTechnologies().length;\n return (\n <StepConfirm\n onComplete={handleComplete}\n stackName={stackName}\n selectedDomains={store.selectedDomains}\n domainSelections={store.domainSelections}\n technologyCount={selectedCount}\n skillCount={selectedCount}\n installMode={store.installMode}\n onBack={store.goBack}\n />\n );\n }\n\n default:\n return null;\n }\n };\n\n if (isNarrowTerminal) {\n return (\n <ThemeProvider theme={cliTheme}>\n <Box flexDirection=\"column\" padding={1}>\n <Text color=\"yellow\">\n Terminal too narrow ({terminalWidth} columns). Please resize to at least{\" \"}\n {MIN_TERMINAL_WIDTH} columns.\n </Text>\n <Box marginTop={1}>\n <Text dimColor>Current width: {terminalWidth} columns</Text>\n </Box>\n </Box>\n </ThemeProvider>\n );\n }\n\n return (\n <ThemeProvider theme={cliTheme}>\n <WizardLayout version={version}>{renderStep()}</WizardLayout>\n </ThemeProvider>\n );\n};\n"],"mappings":"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","names":[]}
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  init_esm_shims
4
- } from "./chunk-DHET7RCE.js";
4
+ } from "./chunk-AWKZ5BDL.js";
5
5
 
6
6
  // node_modules/ink-testing-library/build/index.js
7
7
  init_esm_shims();
@@ -93,4 +93,4 @@ var render = (tree) => {
93
93
  export {
94
94
  render
95
95
  };
96
- //# sourceMappingURL=chunk-66UDJBF6.js.map
96
+ //# sourceMappingURL=chunk-REJGRCVQ.js.map
@@ -0,0 +1,220 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ getDomainDisplayName
4
+ } from "./chunk-V2ZIH7HV.js";
5
+ import {
6
+ ViewTitle
7
+ } from "./chunk-U7HFKR74.js";
8
+ import {
9
+ CategoryGrid
10
+ } from "./chunk-ETCVEV3S.js";
11
+ import {
12
+ getAvailableSkills,
13
+ resolveAlias
14
+ } from "./chunk-ETQ3BPGU.js";
15
+ import {
16
+ init_esm_shims
17
+ } from "./chunk-AWKZ5BDL.js";
18
+
19
+ // src/cli/components/wizard/step-build.tsx
20
+ init_esm_shims();
21
+ import { useState } from "react";
22
+ import { Box, Text, useInput } from "ink";
23
+ import { sortBy } from "remeda";
24
+ import { jsx, jsxs } from "react/jsx-runtime";
25
+ var FRAMEWORK_SUBCATEGORY_ID = "framework";
26
+ var WEB_DOMAIN_ID = "web";
27
+ function validateBuildStep(categories, selections) {
28
+ for (const category of categories) {
29
+ if (category.required) {
30
+ const categorySelections = selections[category.id] || [];
31
+ if (categorySelections.length === 0) {
32
+ return {
33
+ valid: false,
34
+ message: `Please select a ${category.displayName}`
35
+ };
36
+ }
37
+ }
38
+ }
39
+ return { valid: true };
40
+ }
41
+ function computeOptionState(skill) {
42
+ if (skill.disabled) {
43
+ return "disabled";
44
+ }
45
+ if (skill.discouraged) {
46
+ return "discouraged";
47
+ }
48
+ if (skill.recommended) {
49
+ return "recommended";
50
+ }
51
+ return "normal";
52
+ }
53
+ function getDisplayLabel(skill) {
54
+ return skill.displayName || skill.id;
55
+ }
56
+ function getStateReason(skill) {
57
+ if (skill.disabled && skill.disabledReason) {
58
+ return skill.disabledReason;
59
+ }
60
+ if (skill.discouraged && skill.discouragedReason) {
61
+ return skill.discouragedReason;
62
+ }
63
+ if (skill.recommended && skill.recommendedReason) {
64
+ return skill.recommendedReason;
65
+ }
66
+ return void 0;
67
+ }
68
+ function isFrameworkSelected(selections) {
69
+ const frameworkSelections = selections[FRAMEWORK_SUBCATEGORY_ID] ?? [];
70
+ return frameworkSelections.length > 0;
71
+ }
72
+ function getSelectedFrameworks(selections, matrix) {
73
+ const frameworkSelections = selections[FRAMEWORK_SUBCATEGORY_ID] ?? [];
74
+ return frameworkSelections.map((alias) => resolveAlias(alias, matrix));
75
+ }
76
+ function isCompatibleWithSelectedFrameworks(skillId, selectedFrameworkIds, matrix) {
77
+ const skill = matrix.skills[skillId];
78
+ if (!skill) return false;
79
+ if (skill.compatibleWith.length === 0) {
80
+ return true;
81
+ }
82
+ return selectedFrameworkIds.some((frameworkId) => skill.compatibleWith.includes(frameworkId));
83
+ }
84
+ function buildCategoriesForDomain(domain, allSelections, matrix, expertMode, selections, parentDomainSelections, installedSkillIds) {
85
+ const frameworkSource = parentDomainSelections ?? selections;
86
+ const frameworkSelected = isFrameworkSelected(frameworkSource);
87
+ const selectedFrameworkIds = frameworkSelected ? getSelectedFrameworks(frameworkSource, matrix) : [];
88
+ const subcategories = sortBy(
89
+ Object.values(matrix.categories).filter((cat) => cat.domain === domain),
90
+ (cat) => cat.order ?? 0
91
+ );
92
+ const categoryRows = subcategories.map((cat) => {
93
+ const skillOptions = getAvailableSkills(cat.id, allSelections, matrix, {
94
+ expertMode
95
+ });
96
+ const useFrameworkFilter = (domain === WEB_DOMAIN_ID || parentDomainSelections !== void 0) && cat.id !== FRAMEWORK_SUBCATEGORY_ID && frameworkSelected;
97
+ const filteredSkillOptions = useFrameworkFilter ? skillOptions.filter(
98
+ (skill) => isCompatibleWithSelectedFrameworks(skill.id, selectedFrameworkIds, matrix)
99
+ ) : skillOptions;
100
+ const options = filteredSkillOptions.map((skill) => ({
101
+ id: skill.id,
102
+ label: getDisplayLabel(skill),
103
+ state: computeOptionState(skill),
104
+ stateReason: getStateReason(skill),
105
+ selected: skill.selected,
106
+ local: matrix.skills[skill.id]?.local,
107
+ installed: installedSkillIds?.includes(skill.id) || false
108
+ }));
109
+ return {
110
+ id: cat.id,
111
+ displayName: cat.displayName,
112
+ required: cat.required ?? false,
113
+ exclusive: cat.exclusive ?? true,
114
+ options
115
+ };
116
+ });
117
+ return categoryRows.filter((row) => row.options.length > 0);
118
+ }
119
+ var Footer = ({ validationError }) => {
120
+ return /* @__PURE__ */ jsx(Box, { flexDirection: "column", marginTop: 1, children: validationError && /* @__PURE__ */ jsx(Box, { marginBottom: 1, children: /* @__PURE__ */ jsx(Text, { color: "yellow", children: validationError }) }) });
121
+ };
122
+ var LegendRow = () => {
123
+ return /* @__PURE__ */ jsxs(Box, { paddingLeft: 1, columnGap: 2, children: [
124
+ /* @__PURE__ */ jsx(Text, { color: "cyan", children: "active" }),
125
+ /* @__PURE__ */ jsx(Text, { color: "#fff", children: "recommended" }),
126
+ /* @__PURE__ */ jsx(Text, { color: "yellow", children: "discouraged" }),
127
+ /* @__PURE__ */ jsx(Text, { color: "gray", children: "disabled" })
128
+ ] });
129
+ };
130
+ var StepBuild = ({
131
+ matrix,
132
+ domain: activeDomain,
133
+ selectedDomains,
134
+ selections,
135
+ allSelections,
136
+ focusedRow,
137
+ focusedCol,
138
+ showDescriptions,
139
+ expertMode,
140
+ parentDomainSelections,
141
+ installedSkillIds,
142
+ onToggle,
143
+ onFocusChange,
144
+ onToggleDescriptions,
145
+ onContinue,
146
+ onBack
147
+ }) => {
148
+ const [validationError, setValidationError] = useState(void 0);
149
+ const categories = buildCategoriesForDomain(
150
+ activeDomain,
151
+ allSelections,
152
+ matrix,
153
+ expertMode,
154
+ selections,
155
+ parentDomainSelections,
156
+ installedSkillIds
157
+ );
158
+ useInput((_input, key) => {
159
+ if (key.return) {
160
+ const validation = validateBuildStep(categories, selections);
161
+ if (validation.valid) {
162
+ setValidationError(void 0);
163
+ onContinue();
164
+ } else {
165
+ setValidationError(validation.message);
166
+ }
167
+ } else if (key.escape) {
168
+ setValidationError(void 0);
169
+ onBack();
170
+ }
171
+ });
172
+ return /* @__PURE__ */ jsxs(Box, { flexDirection: "column", width: "100%", children: [
173
+ /* @__PURE__ */ jsxs(
174
+ Box,
175
+ {
176
+ columnGap: 2,
177
+ flexDirection: "row",
178
+ justifyContent: "space-between",
179
+ marginBottom: 1,
180
+ paddingRight: 1,
181
+ marginTop: -1,
182
+ borderTop: false,
183
+ borderRight: false,
184
+ borderLeft: false,
185
+ borderColor: "gray",
186
+ borderStyle: "single",
187
+ children: [
188
+ /* @__PURE__ */ jsx(Box, { columnGap: 2, flexDirection: "row", children: selectedDomains.map((domain) => /* @__PURE__ */ jsx(Text, { color: domain === activeDomain ? "cyan" : void 0, children: getDomainDisplayName(domain) }, domain)) }),
189
+ /* @__PURE__ */ jsx(LegendRow, {})
190
+ ]
191
+ }
192
+ ),
193
+ /* @__PURE__ */ jsxs(ViewTitle, { children: [
194
+ "Customise your ",
195
+ getDomainDisplayName(activeDomain),
196
+ " stack"
197
+ ] }),
198
+ /* @__PURE__ */ jsx(
199
+ CategoryGrid,
200
+ {
201
+ categories,
202
+ focusedRow,
203
+ focusedCol,
204
+ expertMode,
205
+ showDescriptions,
206
+ onToggle,
207
+ onFocusChange,
208
+ onToggleDescriptions
209
+ }
210
+ ),
211
+ /* @__PURE__ */ jsx(Footer, { validationError })
212
+ ] });
213
+ };
214
+
215
+ export {
216
+ validateBuildStep,
217
+ getDisplayLabel,
218
+ StepBuild
219
+ };
220
+ //# sourceMappingURL=chunk-TDZE4TDG.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/components/wizard/step-build.tsx"],"sourcesContent":["import React, { useState } from \"react\";\nimport { Box, Text, useInput } from \"ink\";\nimport { sortBy } from \"remeda\";\nimport type {\n Domain,\n MergedSkillsMatrix,\n SkillId,\n Subcategory,\n SubcategorySelections,\n} from \"../../types/index.js\";\nimport { getAvailableSkills, resolveAlias } from \"../../lib/matrix/index.js\";\nimport {\n CategoryGrid,\n type CategoryRow,\n type CategoryOption,\n type OptionState,\n} from \"./category-grid.js\";\nimport { ViewTitle } from \"./view-title.js\";\nimport { getDomainDisplayName } from \"./utils.js\";\n\nexport type StepBuildProps = {\n matrix: MergedSkillsMatrix;\n domain: Domain;\n selectedDomains: Domain[];\n selections: SubcategorySelections;\n allSelections: SkillId[];\n focusedRow: number;\n focusedCol: number;\n showDescriptions: boolean;\n expertMode: boolean;\n /** For framework-first filtering on sub-domains (e.g., web-extras inherits from web) */\n parentDomainSelections?: SubcategorySelections;\n /** Skill IDs already installed on disk, shown with a dimmed checkmark */\n installedSkillIds?: SkillId[];\n onToggle: (subcategoryId: Subcategory, technologyId: SkillId) => void;\n onFocusChange: (row: number, col: number) => void;\n onToggleDescriptions: () => void;\n onContinue: () => void;\n onBack: () => void;\n};\n\nconst FRAMEWORK_SUBCATEGORY_ID = \"framework\";\nconst WEB_DOMAIN_ID = \"web\";\n\nexport type BuildStepValidation = {\n valid: boolean;\n message?: string;\n};\n\nexport function validateBuildStep(\n categories: CategoryRow[],\n selections: SubcategorySelections,\n): BuildStepValidation {\n for (const category of categories) {\n if (category.required) {\n const categorySelections = selections[category.id] || [];\n if (categorySelections.length === 0) {\n return {\n valid: false,\n message: `Please select a ${category.displayName}`,\n };\n }\n }\n }\n return { valid: true };\n}\n\nfunction computeOptionState(skill: {\n disabled: boolean;\n discouraged: boolean;\n recommended: boolean;\n}): OptionState {\n if (skill.disabled) {\n return \"disabled\";\n }\n if (skill.discouraged) {\n return \"discouraged\";\n }\n if (skill.recommended) {\n return \"recommended\";\n }\n return \"normal\";\n}\n\nexport function getDisplayLabel(skill: { displayName?: string; id: string }): string {\n return skill.displayName || skill.id;\n}\n\nfunction getStateReason(skill: {\n disabled: boolean;\n disabledReason?: string;\n discouraged: boolean;\n discouragedReason?: string;\n recommended: boolean;\n recommendedReason?: string;\n}): string | undefined {\n if (skill.disabled && skill.disabledReason) {\n return skill.disabledReason;\n }\n if (skill.discouraged && skill.discouragedReason) {\n return skill.discouragedReason;\n }\n if (skill.recommended && skill.recommendedReason) {\n return skill.recommendedReason;\n }\n return undefined;\n}\n\nfunction isFrameworkSelected(selections: SubcategorySelections): boolean {\n const frameworkSelections = selections[FRAMEWORK_SUBCATEGORY_ID] ?? [];\n return frameworkSelections.length > 0;\n}\n\nfunction getSelectedFrameworks(\n selections: SubcategorySelections,\n matrix: MergedSkillsMatrix,\n): SkillId[] {\n const frameworkSelections = selections[FRAMEWORK_SUBCATEGORY_ID] ?? [];\n // Resolve aliases to full skill IDs\n return frameworkSelections.map((alias) => resolveAlias(alias, matrix));\n}\n\nfunction isCompatibleWithSelectedFrameworks(\n skillId: SkillId,\n selectedFrameworkIds: SkillId[],\n matrix: MergedSkillsMatrix,\n): boolean {\n const skill = matrix.skills[skillId];\n if (!skill) return false;\n\n // No compatibleWith = compatible with all (allows legacy skills to appear)\n if (skill.compatibleWith.length === 0) {\n return true;\n }\n\n return selectedFrameworkIds.some((frameworkId) => skill.compatibleWith.includes(frameworkId));\n}\n\n// Build CategoryRow[] from matrix for a domain, with framework-first filtering for web\nfunction buildCategoriesForDomain(\n domain: Domain,\n allSelections: SkillId[],\n matrix: MergedSkillsMatrix,\n expertMode: boolean,\n selections: SubcategorySelections,\n parentDomainSelections?: SubcategorySelections,\n installedSkillIds?: SkillId[],\n): CategoryRow[] {\n // For sub-domains (e.g., web-extras), use parent domain selections for framework checks\n const frameworkSource = parentDomainSelections ?? selections;\n const frameworkSelected = isFrameworkSelected(frameworkSource);\n const selectedFrameworkIds = frameworkSelected\n ? getSelectedFrameworks(frameworkSource, matrix)\n : [];\n\n const subcategories = sortBy(\n Object.values(matrix.categories).filter((cat) => cat.domain === domain),\n (cat) => cat.order ?? 0,\n );\n\n // All sections always visible; locking is handled by CategoryGrid\n const categoryRows: CategoryRow[] = subcategories.map((cat) => {\n const skillOptions = getAvailableSkills(cat.id, allSelections, matrix, {\n expertMode,\n });\n\n // Filter by framework compatibility (skip framework category itself)\n const useFrameworkFilter =\n (domain === WEB_DOMAIN_ID || parentDomainSelections !== undefined) &&\n cat.id !== FRAMEWORK_SUBCATEGORY_ID &&\n frameworkSelected;\n const filteredSkillOptions = useFrameworkFilter\n ? skillOptions.filter((skill) =>\n isCompatibleWithSelectedFrameworks(skill.id, selectedFrameworkIds, matrix),\n )\n : skillOptions;\n\n const options: CategoryOption[] = filteredSkillOptions.map((skill) => ({\n id: skill.id,\n label: getDisplayLabel(skill),\n state: computeOptionState(skill),\n stateReason: getStateReason(skill),\n selected: skill.selected,\n local: matrix.skills[skill.id]?.local,\n installed: installedSkillIds?.includes(skill.id) || false,\n }));\n\n return {\n id: cat.id,\n displayName: cat.displayName,\n required: cat.required ?? false,\n exclusive: cat.exclusive ?? true,\n options,\n };\n });\n\n return categoryRows.filter((row) => row.options.length > 0);\n}\n\ntype FooterProps = {\n validationError?: string;\n};\n\nconst Footer: React.FC<FooterProps> = ({ validationError }) => {\n return (\n <Box flexDirection=\"column\" marginTop={1}>\n {validationError && (\n <Box marginBottom={1}>\n <Text color=\"yellow\">{validationError}</Text>\n </Box>\n )}\n </Box>\n );\n};\n\nconst LegendRow: React.FC = () => {\n return (\n <Box paddingLeft={1} columnGap={2}>\n <Text color=\"cyan\">active</Text>\n <Text color=\"#fff\">recommended</Text>\n <Text color=\"yellow\">discouraged</Text>\n <Text color=\"gray\">disabled</Text>\n </Box>\n );\n};\n\nexport const StepBuild: React.FC<StepBuildProps> = ({\n matrix,\n domain: activeDomain,\n selectedDomains,\n selections,\n allSelections,\n focusedRow,\n focusedCol,\n showDescriptions,\n expertMode,\n parentDomainSelections,\n installedSkillIds,\n onToggle,\n onFocusChange,\n onToggleDescriptions,\n onContinue,\n onBack,\n}) => {\n const [validationError, setValidationError] = useState<string | undefined>(undefined);\n\n const categories = buildCategoriesForDomain(\n activeDomain,\n allSelections,\n matrix,\n expertMode,\n selections,\n parentDomainSelections,\n installedSkillIds,\n );\n\n useInput((_input, key) => {\n if (key.return) {\n const validation = validateBuildStep(categories, selections);\n if (validation.valid) {\n setValidationError(undefined);\n onContinue();\n } else {\n setValidationError(validation.message);\n }\n } else if (key.escape) {\n setValidationError(undefined);\n onBack();\n }\n });\n\n return (\n <Box flexDirection=\"column\" width=\"100%\">\n <Box\n columnGap={2}\n flexDirection=\"row\"\n justifyContent=\"space-between\"\n marginBottom={1}\n paddingRight={1}\n marginTop={-1}\n borderTop={false}\n borderRight={false}\n borderLeft={false}\n borderColor=\"gray\"\n borderStyle=\"single\"\n >\n <Box columnGap={2} flexDirection=\"row\">\n {selectedDomains.map((domain) => (\n <Text key={domain} color={domain === activeDomain ? \"cyan\" : undefined}>\n {getDomainDisplayName(domain)}\n </Text>\n ))}\n </Box>\n <LegendRow />\n </Box>\n <ViewTitle>Customise your {getDomainDisplayName(activeDomain)} stack</ViewTitle>\n\n <CategoryGrid\n categories={categories}\n focusedRow={focusedRow}\n focusedCol={focusedCol}\n expertMode={expertMode}\n showDescriptions={showDescriptions}\n onToggle={onToggle}\n onFocusChange={onFocusChange}\n onToggleDescriptions={onToggleDescriptions}\n />\n\n <Footer validationError={validationError} />\n </Box>\n );\n};\n"],"mappings":"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","names":[]}