@claude-collective/cli 0.21.0 → 0.25.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (292) hide show
  1. package/CHANGELOG.md +174 -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-4S4FCAA2.js +100 -0
  8. package/dist/chunk-4S4FCAA2.js.map +1 -0
  9. package/dist/chunk-4WGN6SUE.js +197 -0
  10. package/dist/chunk-4WGN6SUE.js.map +1 -0
  11. package/dist/{chunk-DHET7RCE.js → chunk-AWKZ5BDL.js} +9 -2
  12. package/dist/{chunk-DHET7RCE.js.map → chunk-AWKZ5BDL.js.map} +1 -1
  13. package/dist/{chunk-6Q3Y7KVB.js → chunk-DBRUQQUF.js} +8 -2
  14. package/dist/chunk-DBRUQQUF.js.map +1 -0
  15. package/dist/{chunk-OQYYMQJR.js → chunk-ETCVEV3S.js} +8 -11
  16. package/dist/chunk-ETCVEV3S.js.map +1 -0
  17. package/dist/{chunk-ZSVMS677.js → chunk-F4RD5FYM.js} +2 -2
  18. package/dist/chunk-F4RD5FYM.js.map +1 -0
  19. package/dist/{chunk-5KXUDHAB.js → chunk-GGFOD5PK.js} +6 -9
  20. package/dist/chunk-GGFOD5PK.js.map +1 -0
  21. package/dist/{chunk-UMORK7OK.js → chunk-H7SSBSPR.js} +2 -2
  22. package/dist/chunk-H7SSBSPR.js.map +1 -0
  23. package/dist/chunk-HWD32NP7.js +19 -0
  24. package/dist/chunk-HWD32NP7.js.map +1 -0
  25. package/dist/{chunk-HGCBZUH5.js → chunk-IAYAE6MG.js} +9 -10
  26. package/dist/chunk-IAYAE6MG.js.map +1 -0
  27. package/dist/{chunk-RTE64SJA.js → chunk-IXBCRT3F.js} +2 -2
  28. package/dist/chunk-IXBCRT3F.js.map +1 -0
  29. package/dist/{chunk-WFEFICFM.js → chunk-KWYO3M5Q.js} +5 -5
  30. package/dist/chunk-KWYO3M5Q.js.map +1 -0
  31. package/dist/{chunk-HEOHU5EZ.js → chunk-MCTSHLAF.js} +22 -11
  32. package/dist/chunk-MCTSHLAF.js.map +1 -0
  33. package/dist/chunk-MH66WDFV.js +251 -0
  34. package/dist/chunk-MH66WDFV.js.map +1 -0
  35. package/dist/{chunk-2LSGX6R4.js → chunk-MTPM7BX5.js} +83 -25
  36. package/dist/chunk-MTPM7BX5.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-NRC7XYCI.js +211 -0
  40. package/dist/chunk-NRC7XYCI.js.map +1 -0
  41. package/dist/{chunk-FJFEKPXF.js → chunk-O6ZTD7ZI.js} +14 -3
  42. package/dist/chunk-O6ZTD7ZI.js.map +1 -0
  43. package/dist/chunk-OBXAY23Y.js +56 -0
  44. package/dist/chunk-OBXAY23Y.js.map +1 -0
  45. package/dist/{chunk-XY3XDVMI.js → chunk-QR2EBWL2.js} +3 -3
  46. package/dist/{chunk-66UDJBF6.js → chunk-REJGRCVQ.js} +2 -2
  47. package/dist/{chunk-CBLPAMZO.js → chunk-TMED5DQ2.js} +68 -42
  48. package/dist/chunk-TMED5DQ2.js.map +1 -0
  49. package/dist/{chunk-Q3J43SF3.js → chunk-U7HFKR74.js} +2 -2
  50. package/dist/chunk-U7HFKR74.js.map +1 -0
  51. package/dist/{chunk-3EHUF54X.js → chunk-UEMRJI2K.js} +17 -4
  52. package/dist/chunk-UEMRJI2K.js.map +1 -0
  53. package/dist/{chunk-Z2CWURZ6.js → chunk-UNN7523L.js} +2 -2
  54. package/dist/chunk-V2ZIH7HV.js +29 -0
  55. package/dist/chunk-V2ZIH7HV.js.map +1 -0
  56. package/dist/{chunk-ZEI3ZUDU.js → chunk-VVYNZZUX.js} +7 -15
  57. package/dist/chunk-VVYNZZUX.js.map +1 -0
  58. package/dist/chunk-WXS4S3MA.js +220 -0
  59. package/dist/chunk-WXS4S3MA.js.map +1 -0
  60. package/dist/{chunk-A46TPNBJ.js → chunk-XENOESJZ.js} +7 -16
  61. package/dist/chunk-XENOESJZ.js.map +1 -0
  62. package/dist/chunk-YDBSSAJ6.js +4207 -0
  63. package/dist/chunk-YDBSSAJ6.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 +15 -13
  70. package/dist/commands/build/marketplace.js.map +1 -1
  71. package/dist/commands/build/plugins.js +13 -229
  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 +87 -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 +45 -722
  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-DSYZEVGZ.js +16 -0
  185. package/dist/source-manager-DSYZEVGZ.js.map +1 -0
  186. package/dist/src/agents/developer/api-developer/agent.yaml +1 -1
  187. package/dist/src/agents/developer/cli-developer/agent.yaml +1 -1
  188. package/dist/src/agents/developer/web-architecture/agent.yaml +1 -1
  189. package/dist/src/agents/developer/web-developer/agent.yaml +1 -1
  190. package/dist/src/agents/meta/agent-summoner/agent.yaml +1 -1
  191. package/dist/src/agents/meta/documentor/agent.yaml +1 -1
  192. package/dist/src/agents/meta/skill-summoner/agent.yaml +1 -1
  193. package/dist/src/agents/migration/cli-migrator/agent.yaml +1 -1
  194. package/dist/src/agents/pattern/pattern-scout/agent.yaml +1 -1
  195. package/dist/src/agents/pattern/web-pattern-critique/agent.yaml +1 -1
  196. package/dist/src/agents/planning/web-pm/agent.yaml +1 -1
  197. package/dist/src/agents/researcher/api-researcher/agent.yaml +1 -1
  198. package/dist/src/agents/researcher/web-researcher/agent.yaml +1 -1
  199. package/dist/src/agents/reviewer/api-reviewer/agent.yaml +1 -1
  200. package/dist/src/agents/reviewer/cli-reviewer/agent.yaml +1 -1
  201. package/dist/src/agents/reviewer/web-reviewer/agent.yaml +1 -1
  202. package/dist/src/agents/tester/cli-tester/agent.yaml +1 -1
  203. package/dist/src/agents/tester/web-tester/agent.yaml +1 -1
  204. package/dist/stores/wizard-store.js +4 -3
  205. package/dist/stores/wizard-store.test.js +51 -82
  206. package/dist/stores/wizard-store.test.js.map +1 -1
  207. package/package.json +5 -3
  208. package/src/agents/developer/api-developer/agent.yaml +1 -1
  209. package/src/agents/developer/cli-developer/agent.yaml +1 -1
  210. package/src/agents/developer/web-architecture/agent.yaml +1 -1
  211. package/src/agents/developer/web-developer/agent.yaml +1 -1
  212. package/src/agents/meta/agent-summoner/agent.yaml +1 -1
  213. package/src/agents/meta/documentor/agent.yaml +1 -1
  214. package/src/agents/meta/skill-summoner/agent.yaml +1 -1
  215. package/src/agents/migration/cli-migrator/agent.yaml +1 -1
  216. package/src/agents/pattern/pattern-scout/agent.yaml +1 -1
  217. package/src/agents/pattern/web-pattern-critique/agent.yaml +1 -1
  218. package/src/agents/planning/web-pm/agent.yaml +1 -1
  219. package/src/agents/researcher/api-researcher/agent.yaml +1 -1
  220. package/src/agents/researcher/web-researcher/agent.yaml +1 -1
  221. package/src/agents/reviewer/api-reviewer/agent.yaml +1 -1
  222. package/src/agents/reviewer/cli-reviewer/agent.yaml +1 -1
  223. package/src/agents/reviewer/web-reviewer/agent.yaml +1 -1
  224. package/src/agents/tester/cli-tester/agent.yaml +1 -1
  225. package/src/agents/tester/web-tester/agent.yaml +1 -1
  226. package/dist/chunk-2LSGX6R4.js.map +0 -1
  227. package/dist/chunk-2OKUEELH.js +0 -32
  228. package/dist/chunk-2OKUEELH.js.map +0 -1
  229. package/dist/chunk-374JNMR6.js +0 -212
  230. package/dist/chunk-374JNMR6.js.map +0 -1
  231. package/dist/chunk-3EHUF54X.js.map +0 -1
  232. package/dist/chunk-3XR4PALU.js +0 -529
  233. package/dist/chunk-3XR4PALU.js.map +0 -1
  234. package/dist/chunk-5K2ZLUO5.js +0 -57
  235. package/dist/chunk-5K2ZLUO5.js.map +0 -1
  236. package/dist/chunk-5KXUDHAB.js.map +0 -1
  237. package/dist/chunk-6Q3Y7KVB.js.map +0 -1
  238. package/dist/chunk-7SLV7CMF.js +0 -615
  239. package/dist/chunk-7SLV7CMF.js.map +0 -1
  240. package/dist/chunk-A46TPNBJ.js.map +0 -1
  241. package/dist/chunk-AL74GBW4.js +0 -69
  242. package/dist/chunk-AL74GBW4.js.map +0 -1
  243. package/dist/chunk-BQX23RBV.js +0 -191
  244. package/dist/chunk-BQX23RBV.js.map +0 -1
  245. package/dist/chunk-CA4LH4LI.js +0 -132
  246. package/dist/chunk-CA4LH4LI.js.map +0 -1
  247. package/dist/chunk-CBLPAMZO.js.map +0 -1
  248. package/dist/chunk-CKPQHGXR.js +0 -417
  249. package/dist/chunk-CKPQHGXR.js.map +0 -1
  250. package/dist/chunk-CXOFOJCN.js +0 -80
  251. package/dist/chunk-CXOFOJCN.js.map +0 -1
  252. package/dist/chunk-EHGD7HIE.js +0 -104
  253. package/dist/chunk-EHGD7HIE.js.map +0 -1
  254. package/dist/chunk-EHS3TWWP.js +0 -95
  255. package/dist/chunk-EHS3TWWP.js.map +0 -1
  256. package/dist/chunk-FJFEKPXF.js.map +0 -1
  257. package/dist/chunk-HEOHU5EZ.js.map +0 -1
  258. package/dist/chunk-HGCBZUH5.js.map +0 -1
  259. package/dist/chunk-HPGFY5ZN.js +0 -114
  260. package/dist/chunk-HPGFY5ZN.js.map +0 -1
  261. package/dist/chunk-INJ2EFRW.js +0 -127
  262. package/dist/chunk-INJ2EFRW.js.map +0 -1
  263. package/dist/chunk-IOBFMF6X.js +0 -61
  264. package/dist/chunk-IOBFMF6X.js.map +0 -1
  265. package/dist/chunk-KH3HA7J7.js +0 -116
  266. package/dist/chunk-KH3HA7J7.js.map +0 -1
  267. package/dist/chunk-N6JNE326.js +0 -261
  268. package/dist/chunk-N6JNE326.js.map +0 -1
  269. package/dist/chunk-NAGU7TVZ.js +0 -36
  270. package/dist/chunk-NAGU7TVZ.js.map +0 -1
  271. package/dist/chunk-OQYYMQJR.js.map +0 -1
  272. package/dist/chunk-PLZOUVDD.js +0 -419
  273. package/dist/chunk-PLZOUVDD.js.map +0 -1
  274. package/dist/chunk-Q3J43SF3.js.map +0 -1
  275. package/dist/chunk-RTE64SJA.js.map +0 -1
  276. package/dist/chunk-T25OEQFI.js +0 -26
  277. package/dist/chunk-T25OEQFI.js.map +0 -1
  278. package/dist/chunk-UMORK7OK.js.map +0 -1
  279. package/dist/chunk-VFHWU7JU.js +0 -287
  280. package/dist/chunk-VFHWU7JU.js.map +0 -1
  281. package/dist/chunk-VS4GVTZE.js +0 -91
  282. package/dist/chunk-VS4GVTZE.js.map +0 -1
  283. package/dist/chunk-WFEFICFM.js.map +0 -1
  284. package/dist/chunk-WG6KIAPK.js +0 -54
  285. package/dist/chunk-WG6KIAPK.js.map +0 -1
  286. package/dist/chunk-ZEI3ZUDU.js.map +0 -1
  287. package/dist/chunk-ZNIDWLL5.js.map +0 -1
  288. package/dist/chunk-ZSVMS677.js.map +0 -1
  289. /package/dist/{chunk-XY3XDVMI.js.map → chunk-QR2EBWL2.js.map} +0 -0
  290. /package/dist/{chunk-66UDJBF6.js.map → chunk-REJGRCVQ.js.map} +0 -0
  291. /package/dist/{chunk-Z2CWURZ6.js.map → chunk-UNN7523L.js.map} +0 -0
  292. /package/dist/{magic-string.es-RGXYGAW3.js.map → magic-string.es-PAH2SOTR.js.map} +0 -0
@@ -1,10 +1,13 @@
1
1
  #!/usr/bin/env node
2
+ import {
3
+ typedKeys
4
+ } from "./chunk-HWD32NP7.js";
2
5
  import {
3
6
  DEFAULT_PRESELECTED_SKILLS
4
- } from "./chunk-FJFEKPXF.js";
7
+ } from "./chunk-O6ZTD7ZI.js";
5
8
  import {
6
9
  init_esm_shims
7
- } from "./chunk-DHET7RCE.js";
10
+ } from "./chunk-AWKZ5BDL.js";
8
11
 
9
12
  // src/cli/stores/wizard-store.ts
10
13
  init_esm_shims();
@@ -20,11 +23,14 @@ var createInitialState = () => ({
20
23
  domainSelections: {},
21
24
  focusedRow: 0,
22
25
  focusedCol: 0,
23
- currentRefineIndex: 0,
24
- skillSources: {},
25
26
  showDescriptions: false,
26
27
  expertMode: false,
27
28
  installMode: "local",
29
+ sourceSelections: {},
30
+ customizeSources: false,
31
+ showSettings: false,
32
+ enabledSources: {},
33
+ boundSkills: [],
28
34
  history: []
29
35
  });
30
36
  var useWizardStore = create((set, get) => ({
@@ -32,7 +38,6 @@ var useWizardStore = create((set, get) => ({
32
38
  setStep: (step) => set((state) => ({
33
39
  step,
34
40
  history: [...state.history, state.step],
35
- // Reset focus when changing steps
36
41
  focusedRow: 0,
37
42
  focusedCol: 0
38
43
  })),
@@ -44,8 +49,10 @@ var useWizardStore = create((set, get) => ({
44
49
  const domains = /* @__PURE__ */ new Set();
45
50
  for (const agentConfig of Object.values(stack.agents)) {
46
51
  for (const [subcategoryId, technologyAlias] of Object.entries(agentConfig)) {
47
- const category = categories[subcategoryId];
52
+ const subcat = subcategoryId;
53
+ const category = categories[subcat];
48
54
  const domain = category?.domain;
55
+ const tech = technologyAlias;
49
56
  if (!domain) {
50
57
  continue;
51
58
  }
@@ -53,11 +60,12 @@ var useWizardStore = create((set, get) => ({
53
60
  if (!domainSelections[domain]) {
54
61
  domainSelections[domain] = {};
55
62
  }
56
- if (!domainSelections[domain][subcategoryId]) {
57
- domainSelections[domain][subcategoryId] = [];
63
+ if (!domainSelections[domain][subcat]) {
64
+ domainSelections[domain][subcat] = [];
58
65
  }
59
- if (!domainSelections[domain][subcategoryId].includes(technologyAlias)) {
60
- domainSelections[domain][subcategoryId].push(technologyAlias);
66
+ const techAsId = tech;
67
+ if (!domainSelections[domain][subcat].includes(techAsId)) {
68
+ domainSelections[domain][subcat].push(techAsId);
61
69
  }
62
70
  }
63
71
  }
@@ -66,21 +74,41 @@ var useWizardStore = create((set, get) => ({
66
74
  selectedDomains: ALL_DOMAINS
67
75
  };
68
76
  }),
77
+ populateFromSkillIds: (skillIds, skills, categories) => set(() => {
78
+ const domainSelections = {};
79
+ const domains = /* @__PURE__ */ new Set();
80
+ for (const skillId of skillIds) {
81
+ const skill = skills[skillId];
82
+ if (!skill?.category || !skill.displayName) {
83
+ console.warn(
84
+ `Installed skill '${skillId}' is missing from the marketplace \u2014 it may have been removed or renamed`
85
+ );
86
+ continue;
87
+ }
88
+ const subcat = skill.category;
89
+ const domain = categories[subcat]?.domain;
90
+ if (!domain) {
91
+ console.warn(
92
+ `Installed skill '${skillId}' has unknown category '${skill.category}' \u2014 skipping`
93
+ );
94
+ continue;
95
+ }
96
+ domains.add(domain);
97
+ if (!domainSelections[domain]) domainSelections[domain] = {};
98
+ if (!domainSelections[domain][subcat]) domainSelections[domain][subcat] = [];
99
+ const techAsId = skill.displayName;
100
+ if (!domainSelections[domain][subcat].includes(techAsId)) {
101
+ domainSelections[domain][subcat].push(techAsId);
102
+ }
103
+ }
104
+ return { domainSelections, selectedDomains: ALL_DOMAINS };
105
+ }),
69
106
  toggleDomain: (domain) => set((state) => {
70
107
  const isSelected = state.selectedDomains.includes(domain);
71
108
  return {
72
109
  selectedDomains: isSelected ? state.selectedDomains.filter((d) => d !== domain) : [...state.selectedDomains, domain]
73
110
  };
74
111
  }),
75
- setDomainSelection: (domain, subcategory, technologies) => set((state) => ({
76
- domainSelections: {
77
- ...state.domainSelections,
78
- [domain]: {
79
- ...state.domainSelections[domain],
80
- [subcategory]: technologies
81
- }
82
- }
83
- })),
84
112
  toggleTechnology: (domain, subcategory, technology, exclusive) => set((state) => {
85
113
  const currentSelections = state.domainSelections[domain]?.[subcategory] || [];
86
114
  const isSelected = currentSelections.includes(technology);
@@ -100,7 +128,6 @@ var useWizardStore = create((set, get) => ({
100
128
  }
101
129
  };
102
130
  }),
103
- setCurrentDomainIndex: (index) => set({ currentDomainIndex: index, focusedRow: 0, focusedCol: 0 }),
104
131
  nextDomain: () => {
105
132
  const state = get();
106
133
  if (state.currentDomainIndex < state.selectedDomains.length - 1) {
@@ -126,18 +153,24 @@ var useWizardStore = create((set, get) => ({
126
153
  return false;
127
154
  },
128
155
  setFocus: (row, col) => set({ focusedRow: row, focusedCol: col }),
129
- setSkillSource: (technology, skillId) => set((state) => ({
130
- skillSources: {
131
- ...state.skillSources,
132
- [technology]: skillId
133
- }
134
- })),
135
- setCurrentRefineIndex: (index) => set({ currentRefineIndex: index }),
136
156
  toggleShowDescriptions: () => set((state) => ({ showDescriptions: !state.showDescriptions })),
137
157
  toggleExpertMode: () => set((state) => ({ expertMode: !state.expertMode })),
138
158
  toggleInstallMode: () => set((state) => ({
139
159
  installMode: state.installMode === "plugin" ? "local" : "plugin"
140
160
  })),
161
+ setSourceSelection: (skillId, sourceId) => set((state) => ({
162
+ sourceSelections: { ...state.sourceSelections, [skillId]: sourceId }
163
+ })),
164
+ setCustomizeSources: (customize) => set({ customizeSources: customize }),
165
+ toggleSettings: () => set((state) => ({ showSettings: !state.showSettings })),
166
+ setEnabledSources: (sources) => set({ enabledSources: sources }),
167
+ bindSkill: (skill) => set((state) => {
168
+ const exists = state.boundSkills.some(
169
+ (b) => b.id === skill.id && b.sourceUrl === skill.sourceUrl
170
+ );
171
+ if (exists) return state;
172
+ return { boundSkills: [...state.boundSkills, skill] };
173
+ }),
141
174
  goBack: () => set((state) => {
142
175
  const history = [...state.history];
143
176
  const previousStep = history.pop();
@@ -149,15 +182,15 @@ var useWizardStore = create((set, get) => ({
149
182
  };
150
183
  }),
151
184
  reset: () => set(createInitialState()),
152
- // ─────────────────────────────────────────────────────────────────
153
- // Computed getters
154
- // ─────────────────────────────────────────────────────────────────
155
185
  getAllSelectedTechnologies: () => {
156
186
  const state = get();
157
187
  const technologies = [];
158
- for (const domain of Object.keys(state.domainSelections)) {
159
- for (const subcategory of Object.keys(state.domainSelections[domain])) {
160
- technologies.push(...state.domainSelections[domain][subcategory]);
188
+ for (const domain of typedKeys(state.domainSelections)) {
189
+ const domainSel = state.domainSelections[domain];
190
+ if (!domainSel) continue;
191
+ for (const subcategory of typedKeys(domainSel)) {
192
+ const techs = domainSel[subcategory];
193
+ if (techs) technologies.push(...techs);
161
194
  }
162
195
  }
163
196
  return technologies;
@@ -167,18 +200,11 @@ var useWizardStore = create((set, get) => ({
167
200
  return state.selectedDomains[state.currentDomainIndex] || null;
168
201
  },
169
202
  getSelectedSkills: () => {
170
- const state = get();
171
- const skillIds = [...DEFAULT_PRESELECTED_SKILLS];
172
- for (const skillId of Object.values(state.skillSources)) {
173
- if (!skillIds.includes(skillId)) {
174
- skillIds.push(skillId);
175
- }
176
- }
177
- return skillIds;
203
+ return [...DEFAULT_PRESELECTED_SKILLS];
178
204
  }
179
205
  }));
180
206
 
181
207
  export {
182
208
  useWizardStore
183
209
  };
184
- //# sourceMappingURL=chunk-CBLPAMZO.js.map
210
+ //# sourceMappingURL=chunk-TMED5DQ2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/stores/wizard-store.ts"],"sourcesContent":["import { create } from \"zustand\";\nimport { DEFAULT_PRESELECTED_SKILLS } from \"../consts\";\nimport type {\n BoundSkill,\n Domain,\n DomainSelections,\n SkillDisplayName,\n SkillId,\n Subcategory,\n} from \"../types/index.js\";\nimport { typedKeys } from \"../utils/typed-object.js\";\n\nconst ALL_DOMAINS: Domain[] = [\"web\", \"web-extras\", \"api\", \"cli\", \"mobile\", \"shared\"];\n\nexport type WizardStep =\n | \"approach\" // Choose stack template or build from scratch\n | \"stack\" // Select pre-built stack (if approach=stack) or domains (if approach=scratch)\n | \"build\" // CategoryGrid for technology selection\n | \"sources\" // Choose skill sources (recommended vs custom)\n | \"confirm\"; // Final confirmation\n\nexport type WizardState = {\n step: WizardStep;\n\n approach: \"stack\" | \"scratch\" | null;\n selectedStackId: string | null;\n stackAction: \"defaults\" | \"customize\" | null;\n\n selectedDomains: Domain[];\n\n currentDomainIndex: number;\n domainSelections: DomainSelections;\n\n focusedRow: number;\n focusedCol: number;\n\n showDescriptions: boolean;\n expertMode: boolean;\n\n installMode: \"plugin\" | \"local\";\n\n sourceSelections: Partial<Record<SkillId, string>>;\n customizeSources: boolean;\n\n showSettings: boolean;\n enabledSources: Record<string, boolean>;\n\n boundSkills: BoundSkill[];\n\n history: WizardStep[];\n\n setStep: (step: WizardStep) => void;\n setApproach: (approach: \"stack\" | \"scratch\") => void;\n selectStack: (stackId: string | null) => void;\n setStackAction: (action: \"defaults\" | \"customize\") => void;\n /** Pre-populate domainSelections from a stack's technology mappings */\n populateFromStack: (\n stack: { agents: Record<string, Partial<Record<Subcategory, SkillDisplayName>>> },\n categories: Partial<Record<Subcategory, { domain?: Domain }>>,\n ) => void;\n populateFromSkillIds: (\n skillIds: SkillId[],\n skills: Partial<Record<SkillId, { category: string; displayName?: string }>>,\n categories: Partial<Record<Subcategory, { domain?: Domain }>>,\n ) => void;\n toggleDomain: (domain: Domain) => void;\n toggleTechnology: (\n domain: Domain,\n subcategory: Subcategory,\n technology: SkillId,\n exclusive: boolean,\n ) => void;\n nextDomain: () => boolean;\n prevDomain: () => boolean;\n setFocus: (row: number, col: number) => void;\n toggleShowDescriptions: () => void;\n toggleExpertMode: () => void;\n toggleInstallMode: () => void;\n setSourceSelection: (skillId: SkillId, sourceId: string) => void;\n setCustomizeSources: (customize: boolean) => void;\n toggleSettings: () => void;\n setEnabledSources: (sources: Record<string, boolean>) => void;\n bindSkill: (skill: BoundSkill) => void;\n goBack: () => void;\n reset: () => void;\n\n getAllSelectedTechnologies: () => SkillId[];\n getCurrentDomain: () => Domain | null;\n getSelectedSkills: () => SkillId[];\n};\n\nconst createInitialState = () => ({\n step: \"approach\" as WizardStep,\n approach: null as \"stack\" | \"scratch\" | null,\n selectedStackId: null as string | null,\n stackAction: null as \"defaults\" | \"customize\" | null,\n selectedDomains: [] as Domain[],\n currentDomainIndex: 0,\n domainSelections: {} as DomainSelections,\n focusedRow: 0,\n focusedCol: 0,\n showDescriptions: false,\n expertMode: false,\n installMode: \"local\" as \"plugin\" | \"local\",\n sourceSelections: {} as Partial<Record<SkillId, string>>,\n customizeSources: false,\n showSettings: false,\n enabledSources: {} as Record<string, boolean>,\n boundSkills: [] as BoundSkill[],\n history: [] as WizardStep[],\n});\n\nexport const useWizardStore = create<WizardState>((set, get) => ({\n ...createInitialState(),\n\n setStep: (step) =>\n set((state) => ({\n step,\n history: [...state.history, state.step],\n focusedRow: 0,\n focusedCol: 0,\n })),\n\n setApproach: (approach) => set({ approach }),\n\n selectStack: (stackId) => set({ selectedStackId: stackId }),\n\n setStackAction: (action) => set({ stackAction: action }),\n\n populateFromStack: (stack, categories) =>\n set(() => {\n const domainSelections: DomainSelections = {};\n const domains = new Set<Domain>();\n\n for (const agentConfig of Object.values(stack.agents)) {\n for (const [subcategoryId, technologyAlias] of Object.entries(agentConfig)) {\n // Boundary cast: Object.entries returns string keys, but agentConfig is Record<Subcategory, ...>\n const subcat = subcategoryId as Subcategory;\n const category = categories[subcat];\n const domain = category?.domain;\n const tech = technologyAlias;\n\n if (!domain) {\n continue;\n }\n\n domains.add(domain);\n\n if (!domainSelections[domain]) {\n domainSelections[domain] = {};\n }\n\n if (!domainSelections[domain][subcat]) {\n domainSelections[domain][subcat] = [];\n }\n\n // Boundary cast: display names from stack are resolved to SkillId downstream by resolveAlias\n const techAsId = tech as unknown as SkillId;\n if (!domainSelections[domain][subcat].includes(techAsId)) {\n domainSelections[domain][subcat].push(techAsId);\n }\n }\n }\n\n return {\n domainSelections,\n selectedDomains: ALL_DOMAINS,\n };\n }),\n\n populateFromSkillIds: (skillIds, skills, categories) =>\n set(() => {\n const domainSelections: DomainSelections = {};\n const domains = new Set<Domain>();\n\n for (const skillId of skillIds) {\n const skill = skills[skillId];\n if (!skill?.category || !skill.displayName) {\n console.warn(\n `Installed skill '${skillId}' is missing from the marketplace — it may have been removed or renamed`,\n );\n continue;\n }\n\n // Boundary cast: category is a Subcategory at the data boundary\n const subcat = skill.category as Subcategory;\n const domain = categories[subcat]?.domain;\n if (!domain) {\n console.warn(\n `Installed skill '${skillId}' has unknown category '${skill.category}' — skipping`,\n );\n continue;\n }\n\n domains.add(domain);\n if (!domainSelections[domain]) domainSelections[domain] = {};\n if (!domainSelections[domain][subcat]) domainSelections[domain][subcat] = [];\n\n // Boundary cast: display name resolved to SkillId downstream by resolveAlias\n const techAsId = skill.displayName as SkillId;\n if (!domainSelections[domain][subcat].includes(techAsId)) {\n domainSelections[domain][subcat].push(techAsId);\n }\n }\n\n return { domainSelections, selectedDomains: ALL_DOMAINS };\n }),\n\n toggleDomain: (domain) =>\n set((state) => {\n const isSelected = state.selectedDomains.includes(domain);\n return {\n selectedDomains: isSelected\n ? state.selectedDomains.filter((d) => d !== domain)\n : [...state.selectedDomains, domain],\n };\n }),\n\n toggleTechnology: (domain, subcategory, technology, exclusive) =>\n set((state) => {\n const currentSelections = state.domainSelections[domain]?.[subcategory] || [];\n const isSelected = currentSelections.includes(technology);\n\n let newSelections: SkillId[];\n if (exclusive) {\n newSelections = isSelected ? [] : [technology];\n } else {\n newSelections = isSelected\n ? currentSelections.filter((t) => t !== technology)\n : [...currentSelections, technology];\n }\n\n return {\n domainSelections: {\n ...state.domainSelections,\n [domain]: {\n ...state.domainSelections[domain],\n [subcategory]: newSelections,\n },\n },\n };\n }),\n\n nextDomain: () => {\n const state = get();\n if (state.currentDomainIndex < state.selectedDomains.length - 1) {\n set({\n currentDomainIndex: state.currentDomainIndex + 1,\n focusedRow: 0,\n focusedCol: 0,\n });\n return true;\n }\n return false;\n },\n\n prevDomain: () => {\n const state = get();\n if (state.currentDomainIndex > 0) {\n set({\n currentDomainIndex: state.currentDomainIndex - 1,\n focusedRow: 0,\n focusedCol: 0,\n });\n return true;\n }\n return false;\n },\n\n setFocus: (row, col) => set({ focusedRow: row, focusedCol: col }),\n\n toggleShowDescriptions: () => set((state) => ({ showDescriptions: !state.showDescriptions })),\n\n toggleExpertMode: () => set((state) => ({ expertMode: !state.expertMode })),\n\n toggleInstallMode: () =>\n set((state) => ({\n installMode: state.installMode === \"plugin\" ? \"local\" : \"plugin\",\n })),\n\n setSourceSelection: (skillId, sourceId) =>\n set((state) => ({\n sourceSelections: { ...state.sourceSelections, [skillId]: sourceId },\n })),\n\n setCustomizeSources: (customize) => set({ customizeSources: customize }),\n\n toggleSettings: () => set((state) => ({ showSettings: !state.showSettings })),\n\n setEnabledSources: (sources) => set({ enabledSources: sources }),\n\n bindSkill: (skill) =>\n set((state) => {\n const exists = state.boundSkills.some(\n (b) => b.id === skill.id && b.sourceUrl === skill.sourceUrl,\n );\n if (exists) return state;\n return { boundSkills: [...state.boundSkills, skill] };\n }),\n\n goBack: () =>\n set((state) => {\n const history = [...state.history];\n const previousStep = history.pop();\n return {\n step: previousStep || \"approach\",\n history,\n focusedRow: 0,\n focusedCol: 0,\n };\n }),\n\n reset: () => set(createInitialState()),\n\n getAllSelectedTechnologies: () => {\n const state = get();\n const technologies: SkillId[] = [];\n for (const domain of typedKeys<Domain>(state.domainSelections)) {\n const domainSel = state.domainSelections[domain];\n if (!domainSel) continue;\n for (const subcategory of typedKeys<Subcategory>(domainSel)) {\n const techs = domainSel[subcategory];\n if (techs) technologies.push(...techs);\n }\n }\n return technologies;\n },\n\n getCurrentDomain: () => {\n const state = get();\n return state.selectedDomains[state.currentDomainIndex] || null;\n },\n\n getSelectedSkills: () => {\n return [...DEFAULT_PRESELECTED_SKILLS];\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
  // src/cli/components/wizard/view-title.tsx
7
7
  init_esm_shims();
@@ -18,4 +18,4 @@ var ViewTitle = ({ children }) => {
18
18
  export {
19
19
  ViewTitle
20
20
  };
21
- //# sourceMappingURL=chunk-Q3J43SF3.js.map
21
+ //# sourceMappingURL=chunk-U7HFKR74.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/components/wizard/view-title.tsx"],"sourcesContent":["import React from \"react\";\nimport { Text } from \"ink\";\n\nexport type ViewTitleProps = {\n children: React.ReactNode;\n};\n\nexport const ViewTitle: React.FC<ViewTitleProps> = ({ children }) => {\n return (\n <Text backgroundColor=\"yellow\" bold color=\"#000\">\n {\" \"}\n {children}{\" \"}\n </Text>\n );\n};\n"],"mappings":";;;;;;AAAA;AACA,SAAS,YAAY;AAQjB;AAFG,IAAM,YAAsC,CAAC,EAAE,SAAS,MAAM;AACnE,SACE,qBAAC,QAAK,iBAAgB,UAAS,MAAI,MAAC,OAAM,QACvC;AAAA;AAAA,IACA;AAAA,IAAU;AAAA,KACb;AAEJ;","names":[]}
@@ -2,13 +2,13 @@
2
2
  import {
3
3
  WIZARD_STEPS,
4
4
  WizardTabs
5
- } from "./chunk-ZNIDWLL5.js";
5
+ } from "./chunk-3X5D7RM5.js";
6
6
  import {
7
7
  useWizardStore
8
- } from "./chunk-CBLPAMZO.js";
8
+ } from "./chunk-TMED5DQ2.js";
9
9
  import {
10
10
  init_esm_shims
11
- } from "./chunk-DHET7RCE.js";
11
+ } from "./chunk-AWKZ5BDL.js";
12
12
 
13
13
  // src/cli/components/wizard/wizard-layout.tsx
14
14
  init_esm_shims();
@@ -84,8 +84,12 @@ var WizardLayout = ({ version, children }) => {
84
84
  }
85
85
  if (store.approach === "stack" && store.selectedStackId && store.stackAction === "defaults") {
86
86
  skipped.push("build");
87
+ skipped.push("sources");
87
88
  } else if (store.step === "confirm") {
88
89
  completed.push("build");
90
+ completed.push("sources");
91
+ } else if (store.step === "sources") {
92
+ completed.push("build");
89
93
  }
90
94
  return { completedSteps: completed, skippedSteps: skipped };
91
95
  }, [store.step, store.approach, store.selectedStackId, store.stackAction]);
@@ -119,6 +123,15 @@ var WizardLayout = ({ version, children }) => {
119
123
  values: ["P"],
120
124
  isActive: store.installMode === "plugin"
121
125
  }
126
+ ),
127
+ /* @__PURE__ */ jsx(
128
+ DefinitionItem,
129
+ {
130
+ label: "Settings",
131
+ values: ["G"],
132
+ isVisible: store.step === "sources",
133
+ isActive: store.showSettings
134
+ }
122
135
  )
123
136
  ] }),
124
137
  /* @__PURE__ */ jsx(WizardFooter, {})
@@ -130,4 +143,4 @@ export {
130
143
  WizardFooter,
131
144
  WizardLayout
132
145
  };
133
- //# sourceMappingURL=chunk-3EHUF54X.js.map
146
+ //# sourceMappingURL=chunk-UEMRJI2K.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/components/wizard/wizard-layout.tsx"],"sourcesContent":["import React, { Fragment, useMemo } from \"react\";\nimport { Box, Text } from \"ink\";\nimport { useWizardStore } from \"../../stores/wizard-store.js\";\nimport { WizardTabs, WIZARD_STEPS } from \"./wizard-tabs.js\";\n\ntype KeyHintProps = {\n isVisible?: boolean;\n isActive?: boolean;\n label: string;\n values: string[];\n};\n\nexport const DefinitionItem: React.FC<KeyHintProps> = ({\n isVisible = true,\n isActive = false,\n label,\n values,\n}) => {\n if (!isVisible) {\n return null;\n }\n\n return (\n <Text>\n {values.map((value) => (\n <Fragment key={value}>\n <Text backgroundColor=\"black\" color=\"white\">\n {\" \"}\n {value}{\" \"}\n </Text>{\" \"}\n </Fragment>\n ))}\n <Text color={isActive ? \"cyan\" : undefined}>{label}</Text>\n </Text>\n );\n};\n\nconst HOT_KEYS: { label: string; values: string[] }[] = [\n { label: \"navigate\", values: [\"\\u2190/\\u2192\", \"\\u2191/\\u2193\"] },\n { label: \"select\", values: [\"SPACE\"] },\n { label: \"continue\", values: [\"ENTER\"] },\n { label: \"back\", values: [\"ESC\"] },\n];\n\nexport const WizardFooter = () => {\n const store = useWizardStore();\n\n return (\n <Box\n columnGap={2}\n borderTop\n borderRight={false}\n borderBottom\n borderLeft={false}\n borderColor=\"blackBright\"\n borderStyle=\"single\"\n paddingLeft={1}\n paddingRight={1}\n >\n <DefinitionItem\n label=\"Accept defaults\"\n values={[\"A\"]}\n isVisible={store.step === \"build\" && !!store.selectedStackId}\n />\n {HOT_KEYS.map((hotkey) => (\n <DefinitionItem {...hotkey} key={hotkey.label} />\n ))}\n </Box>\n );\n};\n\ntype WizardLayoutProps = {\n version?: string;\n children: React.ReactNode;\n};\n\nexport const WizardLayout: React.FC<WizardLayoutProps> = ({ version, children }) => {\n const store = useWizardStore();\n\n const { completedSteps, skippedSteps } = useMemo(() => {\n const completed: string[] = [];\n const skipped: string[] = [];\n\n if (store.step !== \"approach\") {\n completed.push(\"approach\");\n }\n\n if (store.step !== \"approach\" && store.step !== \"stack\") {\n completed.push(\"stack\");\n }\n\n // Stack path with defaults skips build and sources\n if (store.approach === \"stack\" && store.selectedStackId && store.stackAction === \"defaults\") {\n skipped.push(\"build\");\n skipped.push(\"sources\");\n } else if (store.step === \"confirm\") {\n completed.push(\"build\");\n completed.push(\"sources\");\n } else if (store.step === \"sources\") {\n completed.push(\"build\");\n }\n\n return { completedSteps: completed, skippedSteps: skipped };\n }, [store.step, store.approach, store.selectedStackId, store.stackAction]);\n\n return (\n <Box flexDirection=\"column\" paddingX={1}>\n <WizardTabs\n steps={WIZARD_STEPS}\n currentStep={store.step}\n completedSteps={completedSteps}\n skippedSteps={skippedSteps}\n version={version}\n />\n <Box marginTop={1}>{children}</Box>\n <Box paddingX={1} columnGap={2} marginTop={2}>\n <DefinitionItem label=\"Expert mode\" values={[\"E\"]} isActive={store.expertMode} />\n <DefinitionItem\n label=\"Descriptions\"\n values={[\"D\"]}\n isVisible={store.step === \"build\"}\n isActive={store.showDescriptions}\n />\n <DefinitionItem\n label=\"Plugin mode\"\n values={[\"P\"]}\n isActive={store.installMode === \"plugin\"}\n />\n <DefinitionItem\n label=\"Settings\"\n values={[\"G\"]}\n isVisible={store.step === \"sources\"}\n isActive={store.showSettings}\n />\n </Box>\n <WizardFooter />\n </Box>\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
  // src/cli/components/themes/default.ts
7
7
  init_esm_shims();
@@ -75,4 +75,4 @@ var cliTheme = extendTheme(defaultTheme, {
75
75
  export {
76
76
  cliTheme
77
77
  };
78
- //# sourceMappingURL=chunk-Z2CWURZ6.js.map
78
+ //# sourceMappingURL=chunk-UNN7523L.js.map
@@ -0,0 +1,29 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ init_esm_shims
4
+ } from "./chunk-AWKZ5BDL.js";
5
+
6
+ // src/cli/components/wizard/utils.ts
7
+ init_esm_shims();
8
+ function getDomainDisplayName(domain) {
9
+ const displayNames = {
10
+ web: "Web",
11
+ "web-extras": "Web Extras",
12
+ api: "API",
13
+ cli: "CLI",
14
+ mobile: "Mobile",
15
+ shared: "Shared"
16
+ };
17
+ return displayNames[domain] || domain.charAt(0).toUpperCase() + domain.slice(1);
18
+ }
19
+ function getStackName(stackId, matrix) {
20
+ if (!stackId) return void 0;
21
+ const stack = matrix.suggestedStacks.find((s) => s.id === stackId);
22
+ return stack?.name;
23
+ }
24
+
25
+ export {
26
+ getDomainDisplayName,
27
+ getStackName
28
+ };
29
+ //# sourceMappingURL=chunk-V2ZIH7HV.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/components/wizard/utils.ts"],"sourcesContent":["import type { Domain, MergedSkillsMatrix } from \"../../types/index.js\";\n\nexport function getDomainDisplayName(domain: Domain): string {\n const displayNames: Record<Domain, string> = {\n web: \"Web\",\n \"web-extras\": \"Web Extras\",\n api: \"API\",\n cli: \"CLI\",\n mobile: \"Mobile\",\n shared: \"Shared\",\n };\n return displayNames[domain] || domain.charAt(0).toUpperCase() + domain.slice(1);\n}\n\nexport function getStackName(\n stackId: string | null,\n matrix: MergedSkillsMatrix,\n): string | undefined {\n if (!stackId) return undefined;\n const stack = matrix.suggestedStacks.find((s) => s.id === stackId);\n return stack?.name;\n}\n"],"mappings":";;;;;;AAAA;AAEO,SAAS,qBAAqB,QAAwB;AAC3D,QAAM,eAAuC;AAAA,IAC3C,KAAK;AAAA,IACL,cAAc;AAAA,IACd,KAAK;AAAA,IACL,KAAK;AAAA,IACL,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AACA,SAAO,aAAa,MAAM,KAAK,OAAO,OAAO,CAAC,EAAE,YAAY,IAAI,OAAO,MAAM,CAAC;AAChF;AAEO,SAAS,aACd,SACA,QACoB;AACpB,MAAI,CAAC,QAAS,QAAO;AACrB,QAAM,QAAQ,OAAO,gBAAgB,KAAK,CAAC,MAAM,EAAE,OAAO,OAAO;AACjE,SAAO,OAAO;AAChB;","names":[]}
@@ -1,24 +1,16 @@
1
1
  #!/usr/bin/env node
2
+ import {
3
+ getDomainDisplayName
4
+ } from "./chunk-V2ZIH7HV.js";
2
5
  import {
3
6
  init_esm_shims
4
- } from "./chunk-DHET7RCE.js";
7
+ } from "./chunk-AWKZ5BDL.js";
5
8
 
6
9
  // src/cli/components/wizard/step-confirm.tsx
7
10
  init_esm_shims();
8
11
  import { Box, Text, useInput } from "ink";
9
12
  import { jsx, jsxs } from "react/jsx-runtime";
10
- var formatDomainName = (domain) => {
11
- const names = {
12
- web: "Web",
13
- "web-extras": "Web Extras",
14
- api: "API",
15
- cli: "CLI",
16
- mobile: "Mobile"
17
- };
18
- return names[domain] || domain.charAt(0).toUpperCase() + domain.slice(1);
19
- };
20
13
  var StepConfirm = ({
21
- matrix,
22
14
  onComplete,
23
15
  stackName,
24
16
  selectedDomains,
@@ -36,7 +28,7 @@ var StepConfirm = ({
36
28
  onBack();
37
29
  }
38
30
  });
39
- const domainsText = selectedDomains?.map(formatDomainName).join(" + ") || "";
31
+ const domainsText = selectedDomains?.map(getDomainDisplayName).join(" + ") || "";
40
32
  const title = stackName ? `Ready to install ${stackName}` : `Ready to install your custom stack${domainsText ? ` (${domainsText})` : ""}`;
41
33
  return /* @__PURE__ */ jsxs(Box, { flexDirection: "column", paddingX: 2, children: [
42
34
  /* @__PURE__ */ jsx(Text, { bold: true, color: "green", children: title }),
@@ -47,7 +39,7 @@ var StepConfirm = ({
47
39
  if (techs.length === 0) return null;
48
40
  return /* @__PURE__ */ jsxs(Text, { children: [
49
41
  /* @__PURE__ */ jsxs(Text, { bold: true, children: [
50
- formatDomainName(domain),
42
+ getDomainDisplayName(domain),
51
43
  ":"
52
44
  ] }),
53
45
  " ",
@@ -79,4 +71,4 @@ var StepConfirm = ({
79
71
  export {
80
72
  StepConfirm
81
73
  };
82
- //# sourceMappingURL=chunk-ZEI3ZUDU.js.map
74
+ //# sourceMappingURL=chunk-VVYNZZUX.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/components/wizard/step-confirm.tsx"],"sourcesContent":["import React from \"react\";\nimport { Box, Text, useInput } from \"ink\";\nimport type { DomainSelections, Domain } from \"../../types/index.js\";\nimport { getDomainDisplayName } from \"./utils.js\";\n\nexport type StepConfirmProps = {\n onComplete: () => void;\n stackName?: string;\n selectedDomains?: Domain[];\n domainSelections?: DomainSelections;\n technologyCount?: number;\n skillCount?: number;\n installMode?: \"plugin\" | \"local\";\n onBack?: () => void;\n};\n\nexport const StepConfirm: React.FC<StepConfirmProps> = ({\n onComplete,\n stackName,\n selectedDomains,\n domainSelections,\n technologyCount,\n skillCount,\n installMode,\n onBack,\n}) => {\n useInput((input, key) => {\n if (key.return) {\n onComplete();\n }\n if (key.escape && onBack) {\n onBack();\n }\n });\n\n const domainsText = selectedDomains?.map(getDomainDisplayName).join(\" + \") || \"\";\n const title = stackName\n ? `Ready to install ${stackName}`\n : `Ready to install your custom stack${domainsText ? ` (${domainsText})` : \"\"}`;\n\n return (\n <Box flexDirection=\"column\" paddingX={2}>\n <Text bold color=\"green\">\n {title}\n </Text>\n <Text> </Text>\n\n {domainSelections && selectedDomains && !stackName && (\n <Box flexDirection=\"column\" marginBottom={1}>\n {selectedDomains.map((domain) => {\n const selections = domainSelections[domain] || {};\n const techs = Object.values(selections).flat();\n if (techs.length === 0) return null;\n return (\n <Text key={domain}>\n <Text bold>{getDomainDisplayName(domain)}:</Text> <Text>{techs.join(\", \")}</Text>\n </Text>\n );\n })}\n </Box>\n )}\n\n <Box flexDirection=\"column\" marginY={1}>\n {technologyCount !== undefined && (\n <Text>\n <Text dimColor>Technologies:</Text> <Text bold>{technologyCount}</Text>\n </Text>\n )}\n {skillCount !== undefined && (\n <Text>\n <Text dimColor>Skills:</Text> <Text bold>{skillCount}</Text>{\" \"}\n <Text color=\"green\">(all verified)</Text>\n </Text>\n )}\n {installMode && (\n <Text>\n <Text dimColor>Install mode:</Text>{\" \"}\n <Text bold>{installMode === \"plugin\" ? \"Plugin\" : \"Local\"}</Text>\n </Text>\n )}\n </Box>\n </Box>\n );\n};\n"],"mappings":";;;;;;;;;AAAA;AACA,SAAS,KAAK,MAAM,gBAAgB;AAyC9B,cAaU,YAbV;AA1BC,IAAM,cAA0C,CAAC;AAAA,EACtD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,WAAS,CAAC,OAAO,QAAQ;AACvB,QAAI,IAAI,QAAQ;AACd,iBAAW;AAAA,IACb;AACA,QAAI,IAAI,UAAU,QAAQ;AACxB,aAAO;AAAA,IACT;AAAA,EACF,CAAC;AAED,QAAM,cAAc,iBAAiB,IAAI,oBAAoB,EAAE,KAAK,KAAK,KAAK;AAC9E,QAAM,QAAQ,YACV,oBAAoB,SAAS,KAC7B,qCAAqC,cAAc,KAAK,WAAW,MAAM,EAAE;AAE/E,SACE,qBAAC,OAAI,eAAc,UAAS,UAAU,GACpC;AAAA,wBAAC,QAAK,MAAI,MAAC,OAAM,SACd,iBACH;AAAA,IACA,oBAAC,QAAK,eAAC;AAAA,IAEN,oBAAoB,mBAAmB,CAAC,aACvC,oBAAC,OAAI,eAAc,UAAS,cAAc,GACvC,0BAAgB,IAAI,CAAC,WAAW;AAC/B,YAAM,aAAa,iBAAiB,MAAM,KAAK,CAAC;AAChD,YAAM,QAAQ,OAAO,OAAO,UAAU,EAAE,KAAK;AAC7C,UAAI,MAAM,WAAW,EAAG,QAAO;AAC/B,aACE,qBAAC,QACC;AAAA,6BAAC,QAAK,MAAI,MAAE;AAAA,+BAAqB,MAAM;AAAA,UAAE;AAAA,WAAC;AAAA,QAAO;AAAA,QAAC,oBAAC,QAAM,gBAAM,KAAK,IAAI,GAAE;AAAA,WADjE,MAEX;AAAA,IAEJ,CAAC,GACH;AAAA,IAGF,qBAAC,OAAI,eAAc,UAAS,SAAS,GAClC;AAAA,0BAAoB,UACnB,qBAAC,QACC;AAAA,4BAAC,QAAK,UAAQ,MAAC,2BAAa;AAAA,QAAO;AAAA,QAAC,oBAAC,QAAK,MAAI,MAAE,2BAAgB;AAAA,SAClE;AAAA,MAED,eAAe,UACd,qBAAC,QACC;AAAA,4BAAC,QAAK,UAAQ,MAAC,qBAAO;AAAA,QAAO;AAAA,QAAC,oBAAC,QAAK,MAAI,MAAE,sBAAW;AAAA,QAAQ;AAAA,QAC7D,oBAAC,QAAK,OAAM,SAAQ,4BAAc;AAAA,SACpC;AAAA,MAED,eACC,qBAAC,QACC;AAAA,4BAAC,QAAK,UAAQ,MAAC,2BAAa;AAAA,QAAQ;AAAA,QACpC,oBAAC,QAAK,MAAI,MAAE,0BAAgB,WAAW,WAAW,SAAQ;AAAA,SAC5D;AAAA,OAEJ;AAAA,KACF;AAEJ;","names":[]}
@@ -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-YDBSSAJ6.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-WXS4S3MA.js.map