@claude-collective/cli 0.13.4 → 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 (314) hide show
  1. package/CHANGELOG.md +357 -0
  2. package/README.md +41 -27
  3. package/config/skills-matrix.yaml +202 -134
  4. package/config/stacks.yaml +14 -20
  5. package/dist/chunk-3X5D7RM5.js +69 -0
  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-Z7G4B5HJ.js → chunk-ETCVEV3S.js} +73 -150
  16. package/dist/chunk-ETCVEV3S.js.map +1 -0
  17. package/dist/chunk-F4RD5FYM.js +45 -0
  18. package/dist/chunk-F4RD5FYM.js.map +1 -0
  19. package/dist/{chunk-ACNBKXXJ.js → chunk-GGFOD5PK.js} +13 -44
  20. package/dist/chunk-GGFOD5PK.js.map +1 -0
  21. package/dist/chunk-H7SSBSPR.js +29 -0
  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-JIPWV2FX.js → chunk-IAYAE6MG.js} +12 -34
  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-KWYO3M5Q.js +67 -0
  30. package/dist/chunk-KWYO3M5Q.js.map +1 -0
  31. package/dist/{chunk-E3FJH4TF.js → chunk-MCTSHLAF.js} +18 -18
  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-K3NB6DSG.js → chunk-MTPM7BX5.js} +108 -110
  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-76DWXGQE.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-D237EVNB.js → chunk-TMED5DQ2.js} +71 -48
  48. package/dist/chunk-TMED5DQ2.js.map +1 -0
  49. package/dist/chunk-U7HFKR74.js +21 -0
  50. package/dist/chunk-U7HFKR74.js.map +1 -0
  51. package/dist/chunk-UEMRJI2K.js +146 -0
  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-X6QONICW.js → chunk-VVYNZZUX.js} +7 -19
  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-CDX4W4DM.js → chunk-XENOESJZ.js} +53 -33
  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 +13 -14
  69. package/dist/commands/build/marketplace.js +19 -23
  70. package/dist/commands/build/marketplace.js.map +1 -1
  71. package/dist/commands/build/plugins.js +13 -240
  72. package/dist/commands/build/plugins.js.map +1 -1
  73. package/dist/commands/build/stack.js +13 -25
  74. package/dist/commands/build/stack.js.map +1 -1
  75. package/dist/commands/compile.js +45 -82
  76. package/dist/commands/compile.js.map +1 -1
  77. package/dist/commands/config/get.js +9 -9
  78. package/dist/commands/config/get.js.map +1 -1
  79. package/dist/commands/config/index.js +8 -8
  80. package/dist/commands/config/index.js.map +1 -1
  81. package/dist/commands/config/path.js +7 -9
  82. package/dist/commands/config/path.js.map +1 -1
  83. package/dist/commands/config/set-project.js +12 -13
  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 +12 -13
  87. package/dist/commands/config/unset-project.js.map +1 -1
  88. package/dist/commands/diff.js +15 -44
  89. package/dist/commands/diff.js.map +1 -1
  90. package/dist/commands/doctor.js +23 -67
  91. package/dist/commands/doctor.js.map +1 -1
  92. package/dist/commands/edit.js +98 -81
  93. package/dist/commands/edit.js.map +1 -1
  94. package/dist/commands/eject.js +27 -79
  95. package/dist/commands/eject.js.map +1 -1
  96. package/dist/commands/import/skill.js +38 -58
  97. package/dist/commands/import/skill.js.map +1 -1
  98. package/dist/commands/info.js +17 -24
  99. package/dist/commands/info.js.map +1 -1
  100. package/dist/commands/init.js +103 -779
  101. package/dist/commands/init.js.map +1 -1
  102. package/dist/commands/list.js +8 -11
  103. package/dist/commands/list.js.map +1 -1
  104. package/dist/commands/new/agent.js +11 -16
  105. package/dist/commands/new/agent.js.map +1 -1
  106. package/dist/commands/new/skill.js +14 -18
  107. package/dist/commands/new/skill.js.map +1 -1
  108. package/dist/commands/outdated.js +16 -97
  109. package/dist/commands/outdated.js.map +1 -1
  110. package/dist/commands/search.js +24 -43
  111. package/dist/commands/search.js.map +1 -1
  112. package/dist/commands/uninstall.js +22 -30
  113. package/dist/commands/uninstall.js.map +1 -1
  114. package/dist/commands/update.js +23 -154
  115. package/dist/commands/update.js.map +1 -1
  116. package/dist/commands/validate.js +38 -89
  117. package/dist/commands/validate.js.map +1 -1
  118. package/dist/commands/version/bump.js +12 -28
  119. package/dist/commands/version/bump.js.map +1 -1
  120. package/dist/commands/version/index.js +8 -24
  121. package/dist/commands/version/index.js.map +1 -1
  122. package/dist/commands/version/set.js +11 -26
  123. package/dist/commands/version/set.js.map +1 -1
  124. package/dist/commands/version/show.js +8 -24
  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 +3 -7
  130. package/dist/components/common/message.js.map +1 -1
  131. package/dist/components/common/spinner.js +1 -1
  132. package/dist/components/common/spinner.js.map +1 -1
  133. package/dist/components/skill-search/skill-search.js +3 -3
  134. package/dist/components/wizard/category-grid.js +2 -2
  135. package/dist/components/wizard/category-grid.test.js +138 -156
  136. package/dist/components/wizard/category-grid.test.js.map +1 -1
  137. package/dist/components/wizard/menu-item.js +9 -0
  138. package/dist/components/wizard/search-modal.js +9 -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 +16 -106
  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 -5
  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 -5
  152. package/dist/components/wizard/step-build.test.js +160 -284
  153. package/dist/components/wizard/step-build.test.js.map +1 -1
  154. package/dist/components/wizard/step-confirm.js +3 -3
  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 -3
  158. package/dist/components/wizard/step-refine.test.js +24 -26
  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 -4
  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 +9 -0
  172. package/dist/components/wizard/view-title.js.map +1 -0
  173. package/dist/components/wizard/wizard-layout.js +17 -0
  174. package/dist/components/wizard/wizard-layout.js.map +1 -0
  175. package/dist/components/wizard/wizard-tabs.js +2 -2
  176. package/dist/components/wizard/wizard-tabs.test.js +292 -0
  177. package/dist/components/wizard/wizard-tabs.test.js.map +1 -0
  178. package/dist/components/wizard/wizard.js +22 -15
  179. package/dist/config/skills-matrix.yaml +202 -134
  180. package/dist/config/stacks.yaml +14 -20
  181. package/dist/hooks/init.js +6 -8
  182. package/dist/hooks/init.js.map +1 -1
  183. package/dist/index.js +1 -1
  184. package/dist/index.js.map +1 -1
  185. package/dist/{magic-string.es-RGXYGAW3.js → magic-string.es-PAH2SOTR.js} +2 -2
  186. package/dist/source-manager-DSYZEVGZ.js +16 -0
  187. package/dist/source-manager-DSYZEVGZ.js.map +1 -0
  188. package/dist/src/agents/developer/api-developer/agent.yaml +1 -1
  189. package/dist/src/agents/developer/cli-developer/agent.yaml +1 -1
  190. package/dist/src/agents/developer/web-architecture/agent.yaml +1 -1
  191. package/dist/src/agents/developer/web-developer/agent.yaml +1 -1
  192. package/dist/src/agents/developer/web-developer/examples.md +1 -6
  193. package/dist/src/agents/meta/agent-summoner/agent.yaml +1 -1
  194. package/dist/src/agents/meta/documentor/agent.yaml +1 -1
  195. package/dist/src/agents/meta/documentor/workflow.md +1 -5
  196. package/dist/src/agents/meta/skill-summoner/agent.yaml +1 -1
  197. package/dist/src/agents/migration/cli-migrator/agent.yaml +1 -1
  198. package/dist/src/agents/migration/cli-migrator/anti-patterns.md +1 -3
  199. package/dist/src/agents/pattern/pattern-scout/agent.yaml +1 -1
  200. package/dist/src/agents/pattern/web-pattern-critique/agent.yaml +1 -1
  201. package/dist/src/agents/planning/web-pm/agent.yaml +1 -1
  202. package/dist/src/agents/researcher/api-researcher/agent.yaml +1 -1
  203. package/dist/src/agents/researcher/web-researcher/agent.yaml +1 -1
  204. package/dist/src/agents/reviewer/api-reviewer/agent.yaml +1 -1
  205. package/dist/src/agents/reviewer/cli-reviewer/agent.yaml +1 -1
  206. package/dist/src/agents/reviewer/web-reviewer/agent.yaml +1 -1
  207. package/dist/src/agents/tester/cli-tester/agent.yaml +1 -1
  208. package/dist/src/agents/tester/web-tester/agent.yaml +1 -1
  209. package/dist/src/agents/tester/web-tester/output-format.md +1 -3
  210. package/dist/stores/wizard-store.js +4 -3
  211. package/dist/stores/wizard-store.test.js +94 -88
  212. package/dist/stores/wizard-store.test.js.map +1 -1
  213. package/package.json +5 -3
  214. package/src/agents/developer/api-developer/agent.yaml +1 -1
  215. package/src/agents/developer/cli-developer/agent.yaml +1 -1
  216. package/src/agents/developer/web-architecture/agent.yaml +1 -1
  217. package/src/agents/developer/web-developer/agent.yaml +1 -1
  218. package/src/agents/developer/web-developer/examples.md +1 -6
  219. package/src/agents/meta/agent-summoner/agent.yaml +1 -1
  220. package/src/agents/meta/documentor/agent.yaml +1 -1
  221. package/src/agents/meta/documentor/workflow.md +1 -5
  222. package/src/agents/meta/skill-summoner/agent.yaml +1 -1
  223. package/src/agents/migration/cli-migrator/agent.yaml +1 -1
  224. package/src/agents/migration/cli-migrator/anti-patterns.md +1 -3
  225. package/src/agents/pattern/pattern-scout/agent.yaml +1 -1
  226. package/src/agents/pattern/web-pattern-critique/agent.yaml +1 -1
  227. package/src/agents/planning/web-pm/agent.yaml +1 -1
  228. package/src/agents/researcher/api-researcher/agent.yaml +1 -1
  229. package/src/agents/researcher/web-researcher/agent.yaml +1 -1
  230. package/src/agents/reviewer/api-reviewer/agent.yaml +1 -1
  231. package/src/agents/reviewer/cli-reviewer/agent.yaml +1 -1
  232. package/src/agents/reviewer/web-reviewer/agent.yaml +1 -1
  233. package/src/agents/tester/cli-tester/agent.yaml +1 -1
  234. package/src/agents/tester/web-tester/agent.yaml +1 -1
  235. package/src/agents/tester/web-tester/output-format.md +1 -3
  236. package/dist/chunk-3U3R4NCG.js +0 -22
  237. package/dist/chunk-3U3R4NCG.js.map +0 -1
  238. package/dist/chunk-4K4ZXQRM.js +0 -317
  239. package/dist/chunk-4K4ZXQRM.js.map +0 -1
  240. package/dist/chunk-6Q3Y7KVB.js.map +0 -1
  241. package/dist/chunk-76DWXGQE.js.map +0 -1
  242. package/dist/chunk-7Q44DMSP.js +0 -582
  243. package/dist/chunk-7Q44DMSP.js.map +0 -1
  244. package/dist/chunk-ACNBKXXJ.js.map +0 -1
  245. package/dist/chunk-B7CCVP6Q.js +0 -639
  246. package/dist/chunk-B7CCVP6Q.js.map +0 -1
  247. package/dist/chunk-BDLUZVKU.js +0 -54
  248. package/dist/chunk-BDLUZVKU.js.map +0 -1
  249. package/dist/chunk-CDX4W4DM.js.map +0 -1
  250. package/dist/chunk-D237EVNB.js.map +0 -1
  251. package/dist/chunk-DRXPNNPB.js +0 -393
  252. package/dist/chunk-DRXPNNPB.js.map +0 -1
  253. package/dist/chunk-E3FJH4TF.js.map +0 -1
  254. package/dist/chunk-ED4E6Q2T.js +0 -114
  255. package/dist/chunk-ED4E6Q2T.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-GDH553MV.js +0 -91
  259. package/dist/chunk-GDH553MV.js.map +0 -1
  260. package/dist/chunk-HLJX2FTL.js +0 -95
  261. package/dist/chunk-HLJX2FTL.js.map +0 -1
  262. package/dist/chunk-I2DSLOXZ.js +0 -75
  263. package/dist/chunk-I2DSLOXZ.js.map +0 -1
  264. package/dist/chunk-I4TPKIYX.js +0 -493
  265. package/dist/chunk-I4TPKIYX.js.map +0 -1
  266. package/dist/chunk-IAUAQJQ2.js +0 -57
  267. package/dist/chunk-IAUAQJQ2.js.map +0 -1
  268. package/dist/chunk-IBE7JIAG.js +0 -129
  269. package/dist/chunk-IBE7JIAG.js.map +0 -1
  270. package/dist/chunk-IMDW5ZUP.js +0 -132
  271. package/dist/chunk-IMDW5ZUP.js.map +0 -1
  272. package/dist/chunk-JIPWV2FX.js.map +0 -1
  273. package/dist/chunk-K3NB6DSG.js.map +0 -1
  274. package/dist/chunk-K7EVM5LY.js +0 -141
  275. package/dist/chunk-K7EVM5LY.js.map +0 -1
  276. package/dist/chunk-KAAEN2PO.js +0 -57
  277. package/dist/chunk-KAAEN2PO.js.map +0 -1
  278. package/dist/chunk-NDY25DTL.js +0 -453
  279. package/dist/chunk-NDY25DTL.js.map +0 -1
  280. package/dist/chunk-P26A2K5N.js +0 -64
  281. package/dist/chunk-P26A2K5N.js.map +0 -1
  282. package/dist/chunk-RFTSZDHV.js +0 -313
  283. package/dist/chunk-RFTSZDHV.js.map +0 -1
  284. package/dist/chunk-RTE64SJA.js.map +0 -1
  285. package/dist/chunk-SVYPSDWY.js +0 -84
  286. package/dist/chunk-SVYPSDWY.js.map +0 -1
  287. package/dist/chunk-TKFPKEV3.js +0 -69
  288. package/dist/chunk-TKFPKEV3.js.map +0 -1
  289. package/dist/chunk-UQTEPWU7.js +0 -108
  290. package/dist/chunk-UQTEPWU7.js.map +0 -1
  291. package/dist/chunk-V46GGCCI.js +0 -294
  292. package/dist/chunk-V46GGCCI.js.map +0 -1
  293. package/dist/chunk-X6QONICW.js.map +0 -1
  294. package/dist/chunk-Y2LW7R3Y.js +0 -23
  295. package/dist/chunk-Y2LW7R3Y.js.map +0 -1
  296. package/dist/chunk-Z7G4B5HJ.js.map +0 -1
  297. package/dist/chunk-ZENYS6KW.js +0 -90
  298. package/dist/chunk-ZENYS6KW.js.map +0 -1
  299. package/dist/chunk-ZFPSUQOU.js +0 -396
  300. package/dist/chunk-ZFPSUQOU.js.map +0 -1
  301. package/dist/commands/config/set.js +0 -61
  302. package/dist/commands/config/set.js.map +0 -1
  303. package/dist/commands/config/unset.js +0 -57
  304. package/dist/commands/config/unset.js.map +0 -1
  305. package/dist/commands/test-imports.js +0 -92
  306. package/dist/commands/test-imports.js.map +0 -1
  307. package/dist/components/wizard/step-stack-options.js +0 -11
  308. package/dist/components/wizard/wizard-footer.js +0 -9
  309. /package/dist/{chunk-XY3XDVMI.js.map → chunk-QR2EBWL2.js.map} +0 -0
  310. /package/dist/{chunk-66UDJBF6.js.map → chunk-REJGRCVQ.js.map} +0 -0
  311. /package/dist/{chunk-Z2CWURZ6.js.map → chunk-UNN7523L.js.map} +0 -0
  312. /package/dist/components/wizard/{step-stack-options.js.map → menu-item.js.map} +0 -0
  313. /package/dist/components/wizard/{wizard-footer.js.map → search-modal.js.map} +0 -0
  314. /package/dist/{magic-string.es-RGXYGAW3.js.map → magic-string.es-PAH2SOTR.js.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/cli/stores/wizard-store.test.ts"],"sourcesContent":["/**\n * Unit tests for the wizard store (Zustand state management).\n *\n * Tests state transitions without UI rendering for fast feedback.\n */\nimport { describe, it, expect, beforeEach } from \"vitest\";\nimport { useWizardStore } from \"./wizard-store\";\nimport { DEFAULT_PRESELECTED_SKILLS } from \"../consts\";\n\n// =============================================================================\n// Tests\n// =============================================================================\n\ndescribe(\"WizardStore\", () => {\n beforeEach(() => {\n // Reset store to initial state before each test\n useWizardStore.getState().reset();\n });\n\n // ===========================================================================\n // Initial State\n // ===========================================================================\n\n describe(\"initial state\", () => {\n it(\"should start at approach step\", () => {\n const { step } = useWizardStore.getState();\n expect(step).toBe(\"approach\");\n });\n\n it(\"should have no approach selected\", () => {\n const { approach } = useWizardStore.getState();\n expect(approach).toBeNull();\n });\n\n it(\"should have no selected stack\", () => {\n const { selectedStackId } = useWizardStore.getState();\n expect(selectedStackId).toBeNull();\n });\n\n it(\"should have expert mode off\", () => {\n const { expertMode } = useWizardStore.getState();\n expect(expertMode).toBe(false);\n });\n\n it(\"should default to local install mode\", () => {\n const { installMode } = useWizardStore.getState();\n expect(installMode).toBe(\"local\");\n });\n\n it(\"should have empty navigation history\", () => {\n const { history } = useWizardStore.getState();\n expect(history).toEqual([]);\n });\n\n it(\"should have empty selected domains\", () => {\n const { selectedDomains } = useWizardStore.getState();\n expect(selectedDomains).toEqual([]);\n });\n\n it(\"should have empty domain selections\", () => {\n const { domainSelections } = useWizardStore.getState();\n expect(domainSelections).toEqual({});\n });\n });\n\n // ===========================================================================\n // Step Navigation\n // ===========================================================================\n\n describe(\"step navigation\", () => {\n it(\"should update step with setStep\", () => {\n const store = useWizardStore.getState();\n store.setStep(\"stack\");\n\n const { step } = useWizardStore.getState();\n expect(step).toBe(\"stack\");\n });\n\n it(\"should track navigation history when setting step\", () => {\n const store = useWizardStore.getState();\n\n store.setStep(\"stack\");\n store.setStep(\"confirm\");\n\n const { history } = useWizardStore.getState();\n expect(history).toEqual([\"approach\", \"stack\"]);\n });\n\n it(\"should go back through history\", () => {\n const store = useWizardStore.getState();\n\n store.setStep(\"stack\");\n store.setStep(\"confirm\");\n store.goBack();\n\n const { step, history } = useWizardStore.getState();\n expect(step).toBe(\"stack\");\n expect(history).toEqual([\"approach\"]);\n });\n\n it(\"should return to approach when history is empty\", () => {\n const store = useWizardStore.getState();\n\n store.setStep(\"stack\");\n store.goBack();\n store.goBack(); // Extra goBack when already at approach\n\n const { step } = useWizardStore.getState();\n expect(step).toBe(\"approach\");\n });\n\n it(\"should reset focus when changing steps\", () => {\n const store = useWizardStore.getState();\n store.setFocus(2, 3);\n store.setStep(\"stack\");\n\n const { focusedRow, focusedCol } = useWizardStore.getState();\n expect(focusedRow).toBe(0);\n expect(focusedCol).toBe(0);\n });\n });\n\n // ===========================================================================\n // Approach Selection\n // ===========================================================================\n\n describe(\"approach selection\", () => {\n it(\"should set approach to stack\", () => {\n const store = useWizardStore.getState();\n store.setApproach(\"stack\");\n\n const { approach } = useWizardStore.getState();\n expect(approach).toBe(\"stack\");\n });\n\n it(\"should set approach to scratch\", () => {\n const store = useWizardStore.getState();\n store.setApproach(\"scratch\");\n\n const { approach } = useWizardStore.getState();\n expect(approach).toBe(\"scratch\");\n });\n });\n\n // ===========================================================================\n // Stack Selection\n // ===========================================================================\n\n describe(\"stack selection\", () => {\n it(\"should select stack by id\", () => {\n const store = useWizardStore.getState();\n store.selectStack(\"nextjs-fullstack\");\n\n const { selectedStackId } = useWizardStore.getState();\n expect(selectedStackId).toBe(\"nextjs-fullstack\");\n });\n\n it(\"should clear stack when null is passed\", () => {\n const store = useWizardStore.getState();\n store.selectStack(\"nextjs-fullstack\");\n store.selectStack(null);\n\n const { selectedStackId } = useWizardStore.getState();\n expect(selectedStackId).toBeNull();\n });\n });\n\n // ===========================================================================\n // Domain Selection\n // ===========================================================================\n\n describe(\"domain selection\", () => {\n it(\"should toggle domain on\", () => {\n const store = useWizardStore.getState();\n store.toggleDomain(\"web\");\n\n const { selectedDomains } = useWizardStore.getState();\n expect(selectedDomains).toContain(\"web\");\n });\n\n it(\"should toggle domain off\", () => {\n const store = useWizardStore.getState();\n store.toggleDomain(\"web\");\n store.toggleDomain(\"web\");\n\n const { selectedDomains } = useWizardStore.getState();\n expect(selectedDomains).not.toContain(\"web\");\n });\n\n it(\"should allow multiple domain selection\", () => {\n const store = useWizardStore.getState();\n store.toggleDomain(\"web\");\n store.toggleDomain(\"api\");\n store.toggleDomain(\"cli\");\n\n const { selectedDomains } = useWizardStore.getState();\n expect(selectedDomains).toEqual([\"web\", \"api\", \"cli\"]);\n });\n });\n\n // ===========================================================================\n // Technology Selection\n // ===========================================================================\n\n describe(\"technology selection\", () => {\n it(\"should toggle technology in exclusive mode\", () => {\n const store = useWizardStore.getState();\n store.toggleTechnology(\"web\", \"framework\", \"react\", true);\n\n const { domainSelections } = useWizardStore.getState();\n expect(domainSelections.web.framework).toEqual([\"react\"]);\n });\n\n it(\"should replace technology in exclusive mode\", () => {\n const store = useWizardStore.getState();\n store.toggleTechnology(\"web\", \"framework\", \"react\", true);\n store.toggleTechnology(\"web\", \"framework\", \"vue\", true);\n\n const { domainSelections } = useWizardStore.getState();\n expect(domainSelections.web.framework).toEqual([\"vue\"]);\n });\n\n it(\"should toggle off technology in exclusive mode\", () => {\n const store = useWizardStore.getState();\n store.toggleTechnology(\"web\", \"framework\", \"react\", true);\n store.toggleTechnology(\"web\", \"framework\", \"react\", true);\n\n const { domainSelections } = useWizardStore.getState();\n expect(domainSelections.web.framework).toEqual([]);\n });\n\n it(\"should allow multiple selections in non-exclusive mode\", () => {\n const store = useWizardStore.getState();\n store.toggleTechnology(\"web\", \"testing\", \"vitest\", false);\n store.toggleTechnology(\"web\", \"testing\", \"jest\", false);\n\n const { domainSelections } = useWizardStore.getState();\n expect(domainSelections.web.testing).toEqual([\"vitest\", \"jest\"]);\n });\n\n it(\"should toggle off technology in non-exclusive mode\", () => {\n const store = useWizardStore.getState();\n store.toggleTechnology(\"web\", \"testing\", \"vitest\", false);\n store.toggleTechnology(\"web\", \"testing\", \"jest\", false);\n store.toggleTechnology(\"web\", \"testing\", \"vitest\", false);\n\n const { domainSelections } = useWizardStore.getState();\n expect(domainSelections.web.testing).toEqual([\"jest\"]);\n });\n });\n\n // ===========================================================================\n // Domain Navigation\n // ===========================================================================\n\n describe(\"domain navigation\", () => {\n it(\"should set current domain index\", () => {\n const store = useWizardStore.getState();\n store.toggleDomain(\"web\");\n store.toggleDomain(\"api\");\n store.setCurrentDomainIndex(1);\n\n const { currentDomainIndex } = useWizardStore.getState();\n expect(currentDomainIndex).toBe(1);\n });\n\n it(\"should reset focus when changing domain index\", () => {\n const store = useWizardStore.getState();\n store.setFocus(2, 3);\n store.setCurrentDomainIndex(1);\n\n const { focusedRow, focusedCol } = useWizardStore.getState();\n expect(focusedRow).toBe(0);\n expect(focusedCol).toBe(0);\n });\n\n it(\"should move to next domain\", () => {\n const store = useWizardStore.getState();\n store.toggleDomain(\"web\");\n store.toggleDomain(\"api\");\n\n const result = store.nextDomain();\n\n const { currentDomainIndex } = useWizardStore.getState();\n expect(result).toBe(true);\n expect(currentDomainIndex).toBe(1);\n });\n\n it(\"should return false when at last domain\", () => {\n const store = useWizardStore.getState();\n store.toggleDomain(\"web\");\n\n const result = store.nextDomain();\n\n expect(result).toBe(false);\n });\n\n it(\"should move to previous domain\", () => {\n const store = useWizardStore.getState();\n store.toggleDomain(\"web\");\n store.toggleDomain(\"api\");\n store.setCurrentDomainIndex(1);\n\n const result = store.prevDomain();\n\n const { currentDomainIndex } = useWizardStore.getState();\n expect(result).toBe(true);\n expect(currentDomainIndex).toBe(0);\n });\n\n it(\"should return false when at first domain\", () => {\n const store = useWizardStore.getState();\n store.toggleDomain(\"web\");\n\n const result = store.prevDomain();\n\n expect(result).toBe(false);\n });\n\n it(\"should get current domain\", () => {\n const store = useWizardStore.getState();\n store.toggleDomain(\"web\");\n store.toggleDomain(\"api\");\n store.setCurrentDomainIndex(1);\n\n const domain = store.getCurrentDomain();\n expect(domain).toBe(\"api\");\n });\n\n it(\"should return null when no domains selected\", () => {\n const store = useWizardStore.getState();\n const domain = store.getCurrentDomain();\n expect(domain).toBeNull();\n });\n });\n\n // ===========================================================================\n // Mode Toggles\n // ===========================================================================\n\n describe(\"mode toggles\", () => {\n it(\"should toggle expert mode on\", () => {\n const store = useWizardStore.getState();\n\n store.toggleExpertMode();\n\n const { expertMode } = useWizardStore.getState();\n expect(expertMode).toBe(true);\n });\n\n it(\"should toggle expert mode off\", () => {\n const store = useWizardStore.getState();\n\n store.toggleExpertMode();\n store.toggleExpertMode();\n\n const { expertMode } = useWizardStore.getState();\n expect(expertMode).toBe(false);\n });\n\n it(\"should toggle install mode to plugin\", () => {\n const store = useWizardStore.getState();\n\n store.toggleInstallMode();\n\n const { installMode } = useWizardStore.getState();\n expect(installMode).toBe(\"plugin\");\n });\n\n it(\"should toggle install mode back to local\", () => {\n const store = useWizardStore.getState();\n\n store.toggleInstallMode();\n store.toggleInstallMode();\n\n const { installMode } = useWizardStore.getState();\n expect(installMode).toBe(\"local\");\n });\n\n it(\"should toggle show descriptions\", () => {\n const store = useWizardStore.getState();\n\n store.toggleShowDescriptions();\n\n const { showDescriptions } = useWizardStore.getState();\n expect(showDescriptions).toBe(true);\n });\n });\n\n // ===========================================================================\n // Refine Step\n // ===========================================================================\n\n describe(\"refine step\", () => {\n it(\"should set refine action\", () => {\n const store = useWizardStore.getState();\n store.setRefineAction(\"all-recommended\");\n\n const { refineAction } = useWizardStore.getState();\n expect(refineAction).toBe(\"all-recommended\");\n });\n\n it(\"should set skill source\", () => {\n const store = useWizardStore.getState();\n store.setSkillSource(\"react\", \"react (@vince)\");\n\n const { skillSources } = useWizardStore.getState();\n expect(skillSources.react).toBe(\"react (@vince)\");\n });\n\n it(\"should set current refine index\", () => {\n const store = useWizardStore.getState();\n store.setCurrentRefineIndex(3);\n\n const { currentRefineIndex } = useWizardStore.getState();\n expect(currentRefineIndex).toBe(3);\n });\n });\n\n // ===========================================================================\n // Computed Getters\n // ===========================================================================\n\n describe(\"computed getters\", () => {\n it(\"should get all selected technologies\", () => {\n const store = useWizardStore.getState();\n store.toggleTechnology(\"web\", \"framework\", \"react\", true);\n store.toggleTechnology(\"web\", \"styling\", \"scss\", true);\n store.toggleTechnology(\"api\", \"api-framework\", \"hono\", true);\n\n const technologies = store.getAllSelectedTechnologies();\n expect(technologies).toContain(\"react\");\n expect(technologies).toContain(\"scss\");\n expect(technologies).toContain(\"hono\");\n });\n\n it(\"should get selected skills including preselected\", () => {\n const store = useWizardStore.getState();\n store.setSkillSource(\"react\", \"react (@vince)\");\n store.setSkillSource(\"scss\", \"scss-modules (@vince)\");\n\n const skills = store.getSelectedSkills();\n\n // Should include preselected skills\n for (const skill of DEFAULT_PRESELECTED_SKILLS) {\n expect(skills).toContain(skill);\n }\n // Should include user selected skills\n expect(skills).toContain(\"react (@vince)\");\n expect(skills).toContain(\"scss-modules (@vince)\");\n });\n });\n\n // ===========================================================================\n // Reset\n // ===========================================================================\n\n describe(\"reset\", () => {\n it(\"should reset to initial state\", () => {\n const store = useWizardStore.getState();\n\n // Make some changes\n store.setStep(\"stack\");\n store.setApproach(\"scratch\");\n store.selectStack(\"nextjs-fullstack\");\n store.toggleDomain(\"web\");\n store.toggleExpertMode();\n\n // Reset\n store.reset();\n\n const state = useWizardStore.getState();\n expect(state.step).toBe(\"approach\");\n expect(state.approach).toBeNull();\n expect(state.selectedStackId).toBeNull();\n expect(state.selectedDomains).toEqual([]);\n expect(state.expertMode).toBe(false);\n expect(state.installMode).toBe(\"local\");\n expect(state.history).toEqual([]);\n });\n });\n\n // ===========================================================================\n // Complex Flows\n // ===========================================================================\n\n describe(\"complex flows\", () => {\n it(\"should handle complete stack selection flow\", () => {\n const store = useWizardStore.getState();\n\n // Step 1: Choose stack approach\n store.setApproach(\"stack\");\n store.setStep(\"stack\");\n\n // Step 2: Select stack\n store.selectStack(\"nextjs-fullstack\");\n store.setStep(\"stack-options\");\n\n // Step 3: Choose defaults\n store.setStackAction(\"defaults\");\n store.setStep(\"refine\");\n\n // Step 4: Refine\n store.setRefineAction(\"all-recommended\");\n store.setStep(\"confirm\");\n\n // Verify final state\n const state = useWizardStore.getState();\n expect(state.step).toBe(\"confirm\");\n expect(state.approach).toBe(\"stack\");\n expect(state.selectedStackId).toBe(\"nextjs-fullstack\");\n expect(state.stackAction).toBe(\"defaults\");\n expect(state.refineAction).toBe(\"all-recommended\");\n expect(state.history).toEqual([\n \"approach\",\n \"stack\",\n \"stack-options\",\n \"refine\",\n ]);\n });\n\n it(\"should handle complete scratch flow\", () => {\n const store = useWizardStore.getState();\n\n // Step 1: Choose scratch approach\n store.setApproach(\"scratch\");\n store.setStep(\"stack\"); // Domain selection\n\n // Step 2: Select domains\n store.toggleDomain(\"web\");\n store.toggleDomain(\"api\");\n store.setStep(\"build\");\n\n // Step 3: Select technologies\n store.toggleTechnology(\"web\", \"framework\", \"react\", true);\n store.toggleTechnology(\"web\", \"styling\", \"scss\", true);\n store.toggleTechnology(\"api\", \"api-framework\", \"hono\", true);\n store.setStep(\"refine\");\n\n // Step 4: Refine\n store.setRefineAction(\"all-recommended\");\n store.setStep(\"confirm\");\n\n // Verify final state\n const state = useWizardStore.getState();\n expect(state.step).toBe(\"confirm\");\n expect(state.approach).toBe(\"scratch\");\n expect(state.selectedDomains).toEqual([\"web\", \"api\"]);\n expect(state.domainSelections.web.framework).toEqual([\"react\"]);\n expect(state.domainSelections.web.styling).toEqual([\"scss\"]);\n expect(state.domainSelections.api[\"api-framework\"]).toEqual([\"hono\"]);\n });\n\n it(\"should preserve selections when going back\", () => {\n const store = useWizardStore.getState();\n\n // Make selections\n store.setApproach(\"scratch\");\n store.setStep(\"stack\");\n store.toggleDomain(\"web\");\n store.setStep(\"build\");\n store.toggleTechnology(\"web\", \"framework\", \"react\", true);\n\n // Go back\n store.goBack();\n store.goBack();\n\n // Selections should be preserved\n const state = useWizardStore.getState();\n expect(state.selectedDomains).toContain(\"web\");\n expect(state.domainSelections.web.framework).toEqual([\"react\"]);\n });\n });\n});\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/cli/stores/wizard-store.test.ts"],"sourcesContent":["import { describe, it, expect, beforeEach } from \"vitest\";\nimport { useWizardStore } from \"./wizard-store\";\nimport { DEFAULT_PRESELECTED_SKILLS } from \"../consts\";\nimport type { Domain, Subcategory } from \"../types\";\n\ndescribe(\"WizardStore\", () => {\n beforeEach(() => {\n useWizardStore.getState().reset();\n });\n\n describe(\"initial state\", () => {\n it(\"should start at approach step\", () => {\n const { step } = useWizardStore.getState();\n expect(step).toBe(\"approach\");\n });\n\n it(\"should have no approach selected\", () => {\n const { approach } = useWizardStore.getState();\n expect(approach).toBeNull();\n });\n\n it(\"should have no selected stack\", () => {\n const { selectedStackId } = useWizardStore.getState();\n expect(selectedStackId).toBeNull();\n });\n\n it(\"should have expert mode off\", () => {\n const { expertMode } = useWizardStore.getState();\n expect(expertMode).toBe(false);\n });\n\n it(\"should default to local install mode\", () => {\n const { installMode } = useWizardStore.getState();\n expect(installMode).toBe(\"local\");\n });\n\n it(\"should have empty navigation history\", () => {\n const { history } = useWizardStore.getState();\n expect(history).toEqual([]);\n });\n\n it(\"should have empty selected domains\", () => {\n const { selectedDomains } = useWizardStore.getState();\n expect(selectedDomains).toEqual([]);\n });\n\n it(\"should have empty domain selections\", () => {\n const { domainSelections } = useWizardStore.getState();\n expect(domainSelections).toEqual({});\n });\n });\n\n describe(\"step navigation\", () => {\n it(\"should update step with setStep\", () => {\n const store = useWizardStore.getState();\n store.setStep(\"stack\");\n\n const { step } = useWizardStore.getState();\n expect(step).toBe(\"stack\");\n });\n\n it(\"should track navigation history when setting step\", () => {\n const store = useWizardStore.getState();\n\n store.setStep(\"stack\");\n store.setStep(\"confirm\");\n\n const { history } = useWizardStore.getState();\n expect(history).toEqual([\"approach\", \"stack\"]);\n });\n\n it(\"should go back through history\", () => {\n const store = useWizardStore.getState();\n\n store.setStep(\"stack\");\n store.setStep(\"confirm\");\n store.goBack();\n\n const { step, history } = useWizardStore.getState();\n expect(step).toBe(\"stack\");\n expect(history).toEqual([\"approach\"]);\n });\n\n it(\"should return to approach when history is empty\", () => {\n const store = useWizardStore.getState();\n\n store.setStep(\"stack\");\n store.goBack();\n store.goBack();\n\n const { step } = useWizardStore.getState();\n expect(step).toBe(\"approach\");\n });\n\n it(\"should reset focus when changing steps\", () => {\n const store = useWizardStore.getState();\n store.setFocus(2, 3);\n store.setStep(\"stack\");\n\n const { focusedRow, focusedCol } = useWizardStore.getState();\n expect(focusedRow).toBe(0);\n expect(focusedCol).toBe(0);\n });\n });\n\n describe(\"approach selection\", () => {\n it(\"should set approach to stack\", () => {\n const store = useWizardStore.getState();\n store.setApproach(\"stack\");\n\n const { approach } = useWizardStore.getState();\n expect(approach).toBe(\"stack\");\n });\n\n it(\"should set approach to scratch\", () => {\n const store = useWizardStore.getState();\n store.setApproach(\"scratch\");\n\n const { approach } = useWizardStore.getState();\n expect(approach).toBe(\"scratch\");\n });\n });\n\n describe(\"stack selection\", () => {\n it(\"should select stack by id\", () => {\n const store = useWizardStore.getState();\n store.selectStack(\"nextjs-fullstack\");\n\n const { selectedStackId } = useWizardStore.getState();\n expect(selectedStackId).toBe(\"nextjs-fullstack\");\n });\n\n it(\"should clear stack when null is passed\", () => {\n const store = useWizardStore.getState();\n store.selectStack(\"nextjs-fullstack\");\n store.selectStack(null);\n\n const { selectedStackId } = useWizardStore.getState();\n expect(selectedStackId).toBeNull();\n });\n });\n\n describe(\"domain selection\", () => {\n it(\"should toggle domain on\", () => {\n const store = useWizardStore.getState();\n store.toggleDomain(\"web\");\n\n const { selectedDomains } = useWizardStore.getState();\n expect(selectedDomains).toContain(\"web\");\n });\n\n it(\"should toggle domain off\", () => {\n const store = useWizardStore.getState();\n store.toggleDomain(\"web\");\n store.toggleDomain(\"web\");\n\n const { selectedDomains } = useWizardStore.getState();\n expect(selectedDomains).not.toContain(\"web\");\n });\n\n it(\"should allow multiple domain selection\", () => {\n const store = useWizardStore.getState();\n store.toggleDomain(\"web\");\n store.toggleDomain(\"api\");\n store.toggleDomain(\"cli\");\n\n const { selectedDomains } = useWizardStore.getState();\n expect(selectedDomains).toEqual([\"web\", \"api\", \"cli\"]);\n });\n });\n\n describe(\"technology selection\", () => {\n it(\"should toggle technology in exclusive mode\", () => {\n const store = useWizardStore.getState();\n store.toggleTechnology(\"web\", \"framework\", \"web-framework-react\", true);\n\n const { domainSelections } = useWizardStore.getState();\n expect(domainSelections.web!.framework).toEqual([\"web-framework-react\"]);\n });\n\n it(\"should replace technology in exclusive mode\", () => {\n const store = useWizardStore.getState();\n store.toggleTechnology(\"web\", \"framework\", \"web-framework-react\", true);\n store.toggleTechnology(\"web\", \"framework\", \"web-framework-vue\", true);\n\n const { domainSelections } = useWizardStore.getState();\n expect(domainSelections.web!.framework).toEqual([\"web-framework-vue\"]);\n });\n\n it(\"should toggle off technology in exclusive mode\", () => {\n const store = useWizardStore.getState();\n store.toggleTechnology(\"web\", \"framework\", \"web-framework-react\", true);\n store.toggleTechnology(\"web\", \"framework\", \"web-framework-react\", true);\n\n const { domainSelections } = useWizardStore.getState();\n expect(domainSelections.web!.framework).toEqual([]);\n });\n\n it(\"should allow multiple selections in non-exclusive mode\", () => {\n const store = useWizardStore.getState();\n store.toggleTechnology(\"web\", \"testing\", \"web-testing-vitest\", false);\n store.toggleTechnology(\"web\", \"testing\", \"web-testing-playwright-e2e\", false);\n\n const { domainSelections } = useWizardStore.getState();\n expect(domainSelections.web!.testing).toEqual([\n \"web-testing-vitest\",\n \"web-testing-playwright-e2e\",\n ]);\n });\n\n it(\"should toggle off technology in non-exclusive mode\", () => {\n const store = useWizardStore.getState();\n store.toggleTechnology(\"web\", \"testing\", \"web-testing-vitest\", false);\n store.toggleTechnology(\"web\", \"testing\", \"web-testing-playwright-e2e\", false);\n store.toggleTechnology(\"web\", \"testing\", \"web-testing-vitest\", false);\n\n const { domainSelections } = useWizardStore.getState();\n expect(domainSelections.web!.testing).toEqual([\"web-testing-playwright-e2e\"]);\n });\n });\n\n describe(\"domain navigation\", () => {\n it(\"should move to next domain\", () => {\n const store = useWizardStore.getState();\n store.toggleDomain(\"web\");\n store.toggleDomain(\"api\");\n\n const result = store.nextDomain();\n\n const { currentDomainIndex } = useWizardStore.getState();\n expect(result).toBe(true);\n expect(currentDomainIndex).toBe(1);\n });\n\n it(\"should return false when at last domain\", () => {\n const store = useWizardStore.getState();\n store.toggleDomain(\"web\");\n\n const result = store.nextDomain();\n\n expect(result).toBe(false);\n });\n\n it(\"should move to previous domain\", () => {\n const store = useWizardStore.getState();\n store.toggleDomain(\"web\");\n store.toggleDomain(\"api\");\n store.nextDomain();\n\n const result = store.prevDomain();\n\n const { currentDomainIndex } = useWizardStore.getState();\n expect(result).toBe(true);\n expect(currentDomainIndex).toBe(0);\n });\n\n it(\"should return false when at first domain\", () => {\n const store = useWizardStore.getState();\n store.toggleDomain(\"web\");\n\n const result = store.prevDomain();\n\n expect(result).toBe(false);\n });\n\n it(\"should get current domain\", () => {\n const store = useWizardStore.getState();\n store.toggleDomain(\"web\");\n store.toggleDomain(\"api\");\n store.nextDomain();\n\n const domain = store.getCurrentDomain();\n expect(domain).toBe(\"api\");\n });\n\n it(\"should return null when no domains selected\", () => {\n const store = useWizardStore.getState();\n const domain = store.getCurrentDomain();\n expect(domain).toBeNull();\n });\n });\n\n describe(\"mode toggles\", () => {\n it(\"should toggle expert mode on\", () => {\n const store = useWizardStore.getState();\n\n store.toggleExpertMode();\n\n const { expertMode } = useWizardStore.getState();\n expect(expertMode).toBe(true);\n });\n\n it(\"should toggle expert mode off\", () => {\n const store = useWizardStore.getState();\n\n store.toggleExpertMode();\n store.toggleExpertMode();\n\n const { expertMode } = useWizardStore.getState();\n expect(expertMode).toBe(false);\n });\n\n it(\"should toggle install mode to plugin\", () => {\n const store = useWizardStore.getState();\n\n store.toggleInstallMode();\n\n const { installMode } = useWizardStore.getState();\n expect(installMode).toBe(\"plugin\");\n });\n\n it(\"should toggle install mode back to local\", () => {\n const store = useWizardStore.getState();\n\n store.toggleInstallMode();\n store.toggleInstallMode();\n\n const { installMode } = useWizardStore.getState();\n expect(installMode).toBe(\"local\");\n });\n\n it(\"should toggle show descriptions\", () => {\n const store = useWizardStore.getState();\n\n store.toggleShowDescriptions();\n\n const { showDescriptions } = useWizardStore.getState();\n expect(showDescriptions).toBe(true);\n });\n });\n\n describe(\"computed getters\", () => {\n it(\"should get all selected technologies\", () => {\n const store = useWizardStore.getState();\n store.toggleTechnology(\"web\", \"framework\", \"web-framework-react\", true);\n store.toggleTechnology(\"web\", \"styling\", \"web-styling-scss-modules\", true);\n store.toggleTechnology(\"api\", \"api\", \"api-framework-hono\", true);\n\n const technologies = store.getAllSelectedTechnologies();\n expect(technologies).toContain(\"web-framework-react\");\n expect(technologies).toContain(\"web-styling-scss-modules\");\n expect(technologies).toContain(\"api-framework-hono\");\n });\n\n it(\"should get selected skills including preselected\", () => {\n const store = useWizardStore.getState();\n\n const skills = store.getSelectedSkills();\n\n for (const skill of DEFAULT_PRESELECTED_SKILLS) {\n expect(skills).toContain(skill);\n }\n });\n });\n\n describe(\"reset\", () => {\n it(\"should reset to initial state\", () => {\n const store = useWizardStore.getState();\n\n store.setStep(\"stack\");\n store.setApproach(\"scratch\");\n store.selectStack(\"nextjs-fullstack\");\n store.toggleDomain(\"web\");\n store.toggleExpertMode();\n\n store.reset();\n\n const state = useWizardStore.getState();\n expect(state.step).toBe(\"approach\");\n expect(state.approach).toBeNull();\n expect(state.selectedStackId).toBeNull();\n expect(state.selectedDomains).toEqual([]);\n expect(state.expertMode).toBe(false);\n expect(state.installMode).toBe(\"local\");\n expect(state.history).toEqual([]);\n });\n });\n\n describe(\"populateFromStack\", () => {\n it(\"should set selectedDomains to all domains regardless of stack contents\", () => {\n const store = useWizardStore.getState();\n\n const stack = {\n agents: {\n web: { framework: \"react\" },\n },\n } as const;\n const categories: Partial<Record<Subcategory, { domain?: Domain }>> = {\n framework: { domain: \"web\" },\n };\n\n store.populateFromStack(stack, categories);\n\n const { selectedDomains, domainSelections } = useWizardStore.getState();\n\n expect(selectedDomains).toEqual([\"web\", \"web-extras\", \"api\", \"cli\", \"mobile\", \"shared\"]);\n\n expect(domainSelections.web).toBeDefined();\n expect(domainSelections.web!.framework).toEqual([\"react\"]);\n expect(domainSelections.api).toBeUndefined();\n });\n\n it(\"should populate domainSelections from stack agents\", () => {\n const store = useWizardStore.getState();\n\n const stack = {\n agents: {\n web: { framework: \"react\", \"client-state\": \"zustand\" },\n api: { api: \"hono\" },\n },\n } as const;\n const categories: Partial<Record<Subcategory, { domain?: Domain }>> = {\n framework: { domain: \"web\" },\n \"client-state\": { domain: \"web\" },\n api: { domain: \"api\" },\n };\n\n store.populateFromStack(stack, categories);\n\n const { domainSelections } = useWizardStore.getState();\n\n expect(domainSelections.web!.framework).toEqual([\"react\"]);\n expect(domainSelections.web![\"client-state\"]).toEqual([\"zustand\"]);\n expect(domainSelections.api!.api).toEqual([\"hono\"]);\n });\n\n it(\"should skip entries without a domain\", () => {\n const store = useWizardStore.getState();\n\n const stack = {\n agents: {\n misc: { methodology: \"vitest\" },\n },\n } as const;\n const categories: Partial<Record<Subcategory, { domain?: Domain }>> = {\n methodology: {},\n };\n\n store.populateFromStack(stack, categories);\n\n const { domainSelections } = useWizardStore.getState();\n\n expect(Object.keys(domainSelections)).toHaveLength(0);\n });\n });\n\n describe(\"complex flows\", () => {\n it(\"should handle complete stack selection flow\", () => {\n const store = useWizardStore.getState();\n\n store.setApproach(\"stack\");\n store.setStep(\"stack\");\n\n store.selectStack(\"nextjs-fullstack\");\n store.setStackAction(\"customize\");\n store.setStep(\"build\");\n\n store.setStep(\"confirm\");\n\n const state = useWizardStore.getState();\n expect(state.step).toBe(\"confirm\");\n expect(state.approach).toBe(\"stack\");\n expect(state.selectedStackId).toBe(\"nextjs-fullstack\");\n expect(state.stackAction).toBe(\"customize\");\n expect(state.history).toEqual([\"approach\", \"stack\", \"build\"]);\n });\n\n it(\"should handle complete scratch flow\", () => {\n const store = useWizardStore.getState();\n\n store.setApproach(\"scratch\");\n store.setStep(\"stack\");\n\n store.toggleDomain(\"web\");\n store.toggleDomain(\"api\");\n store.setStep(\"build\");\n\n store.toggleTechnology(\"web\", \"framework\", \"web-framework-react\", true);\n store.toggleTechnology(\"web\", \"styling\", \"web-styling-scss-modules\", true);\n store.toggleTechnology(\"api\", \"api\", \"api-framework-hono\", true);\n store.setStep(\"confirm\");\n\n const state = useWizardStore.getState();\n expect(state.step).toBe(\"confirm\");\n expect(state.approach).toBe(\"scratch\");\n expect(state.selectedDomains).toEqual([\"web\", \"api\"]);\n expect(state.domainSelections.web!.framework).toEqual([\"web-framework-react\"]);\n expect(state.domainSelections.web!.styling).toEqual([\"web-styling-scss-modules\"]);\n expect(state.domainSelections.api!.api).toEqual([\"api-framework-hono\"]);\n });\n\n it(\"should preserve selections when going back\", () => {\n const store = useWizardStore.getState();\n\n store.setApproach(\"scratch\");\n store.setStep(\"stack\");\n store.toggleDomain(\"web\");\n store.setStep(\"build\");\n store.toggleTechnology(\"web\", \"framework\", \"web-framework-react\", true);\n\n store.goBack();\n store.goBack();\n\n const state = useWizardStore.getState();\n expect(state.selectedDomains).toContain(\"web\");\n expect(state.domainSelections.web!.framework).toEqual([\"web-framework-react\"]);\n });\n });\n});\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@claude-collective/cli",
3
- "version": "0.13.4",
3
+ "version": "0.25.1",
4
4
  "description": "CLI for managing Claude Collective skills, stacks, and agents for Claude Code",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -73,6 +73,8 @@
73
73
  "format:check": "prettier --check .",
74
74
  "typecheck": "tsc --noEmit && echo '✓ No TypeScript errors'",
75
75
  "prepare": "husky",
76
+ "generate:schemas": "npx tsx scripts/generate-json-schemas.ts",
77
+ "generate:schemas:check": "npm run generate:schemas && git diff --exit-code src/schemas/",
76
78
  "prepublishOnly": "npm run format:check && npm run build && npm run test"
77
79
  },
78
80
  "lint-staged": {
@@ -96,8 +98,6 @@
96
98
  "@oclif/plugin-not-found": "^3.0.0",
97
99
  "@oclif/plugin-warn-if-update-available": "^3.0.0",
98
100
  "@oclif/table": "^0.5.0",
99
- "ajv": "^8.17.1",
100
- "ajv-formats": "^3.0.1",
101
101
  "diff": "^8.0.3",
102
102
  "execa": "^9.0.0",
103
103
  "fast-glob": "^3.3.0",
@@ -107,7 +107,9 @@
107
107
  "ink": "^5.0.0",
108
108
  "liquidjs": "^10.24.0",
109
109
  "react": "^18.2.0",
110
+ "remeda": "^2.33.6",
110
111
  "yaml": "^2.8.2",
112
+ "zod": "^4.3.6",
111
113
  "zustand": "^5.0.0"
112
114
  },
113
115
  "devDependencies": {
@@ -1,4 +1,4 @@
1
- $schema: https://raw.githubusercontent.com/claude-collective/cli/main/src/schemas/agent.schema.json
1
+ # yaml-language-server: $schema=../../../schemas/agent.schema.json
2
2
  id: api-developer
3
3
  title: API Developer Agent
4
4
  description: Implements backend features from detailed specs - API routes, database operations, server utilities, authentication, middleware - surgical execution following existing patterns - invoke AFTER web-pm creates spec
@@ -1,4 +1,4 @@
1
- $schema: https://raw.githubusercontent.com/claude-collective/cli/main/src/schemas/agent.schema.json
1
+ # yaml-language-server: $schema=../../../schemas/agent.schema.json
2
2
  id: cli-developer
3
3
  title: CLI Developer Agent
4
4
  description: Implements CLI features from detailed specs - CLI commands, interactive prompts, option parsing, config hierarchies, exit codes - surgical execution following existing patterns - invoke AFTER pm creates spec
@@ -1,4 +1,4 @@
1
- $schema: https://raw.githubusercontent.com/claude-collective/cli/main/src/schemas/agent.schema.json
1
+ # yaml-language-server: $schema=../../../schemas/agent.schema.json
2
2
  id: web-architecture
3
3
  title: Web Architecture Agent
4
4
  description: Scaffolds new applications in the monorepo with all foundational patterns (authentication, database, API, analytics, observability, CI/CD)
@@ -1,4 +1,4 @@
1
- $schema: https://raw.githubusercontent.com/claude-collective/cli/main/src/schemas/agent.schema.json
1
+ # yaml-language-server: $schema=../../../schemas/agent.schema.json
2
2
  id: web-developer
3
3
  title: Web Developer Agent
4
4
  description: Implements frontend features from detailed specs - UI components, TypeScript, styling, client state - surgical execution following existing patterns - invoke AFTER web-pm creates spec
@@ -53,12 +53,7 @@ import { useThemeStore } from "../stores/ThemeStore";
53
53
  export function DarkModeToggle({ className }: { className?: string }) {
54
54
  const { darkMode, toggleDarkMode } = useThemeStore();
55
55
  return (
56
- <Switch
57
- label="Dark mode"
58
- checked={darkMode}
59
- onChange={toggleDarkMode}
60
- className={className}
61
- />
56
+ <Switch label="Dark mode" checked={darkMode} onChange={toggleDarkMode} className={className} />
62
57
  );
63
58
  }
64
59
  ```
@@ -1,4 +1,4 @@
1
- $schema: https://raw.githubusercontent.com/claude-collective/cli/main/src/schemas/agent.schema.json
1
+ # yaml-language-server: $schema=../../../schemas/agent.schema.json
2
2
  id: agent-summoner
3
3
  title: Agent Summoner Agent
4
4
  description: Expert in creating agents and skills - understands agent architecture deeply - invoke when you need to create, improve, or analyze agents/skills
@@ -1,4 +1,4 @@
1
- $schema: https://raw.githubusercontent.com/claude-collective/cli/main/src/schemas/agent.schema.json
1
+ # yaml-language-server: $schema=../../../schemas/agent.schema.json
2
2
  id: documentor
3
3
  title: Documentor Agent
4
4
  description: Creates AI-focused documentation that helps other agents understand where and how to implement features. Works incrementally, tracking progress over time.
@@ -562,11 +562,7 @@ export type ButtonProps = React.ComponentProps<"button"> & {
562
562
  size?: "sm" | "lg";
563
563
  };
564
564
 
565
- export const Button = ({
566
- variant = "primary",
567
- size = "sm",
568
- ...props
569
- }: ButtonProps) => {
565
+ export const Button = ({ variant = "primary", size = "sm", ...props }: ButtonProps) => {
570
566
  // ...
571
567
  };
572
568
  ```
@@ -1,4 +1,4 @@
1
- $schema: https://raw.githubusercontent.com/claude-collective/cli/main/src/schemas/agent.schema.json
1
+ # yaml-language-server: $schema=../../../schemas/agent.schema.json
2
2
  id: skill-summoner
3
3
  title: Skill Summoner Agent
4
4
  description: Creates technology-specific skills by researching best practices and comparing with codebase standards - use for state management, styling, API frameworks, and other technology skills
@@ -1,4 +1,4 @@
1
- $schema: https://raw.githubusercontent.com/claude-collective/cli/main/src/schemas/agent.schema.json
1
+ # yaml-language-server: $schema=../../../schemas/agent.schema.json
2
2
  id: cli-migrator
3
3
  title: CLI Migration Specialist
4
4
  description: Converts Commander.js + @clack/prompts CLI code to oclif + Ink - TEMPORARY agent for migration effort
@@ -92,9 +92,7 @@ export class Init extends Command {
92
92
 
93
93
  ```tsx
94
94
  // BAD
95
- const Component = () => (
96
- <Box>Hello World {/* Error: text outside Text component */}</Box>
97
- );
95
+ const Component = () => <Box>Hello World {/* Error: text outside Text component */}</Box>;
98
96
 
99
97
  // GOOD
100
98
  const Component = () => (
@@ -1,4 +1,4 @@
1
- $schema: https://raw.githubusercontent.com/claude-collective/cli/main/src/schemas/agent.schema.json
1
+ # yaml-language-server: $schema=../../../schemas/agent.schema.json
2
2
  id: pattern-scout
3
3
  title: Pattern Scout Agent
4
4
  description: Extracts ALL patterns from monorepo (15+ categories - code, architecture, testing, design, build, CI/CD, env, security) - creates comprehensive standards - invoke for new codebases
@@ -1,4 +1,4 @@
1
- $schema: https://raw.githubusercontent.com/claude-collective/cli/main/src/schemas/agent.schema.json
1
+ # yaml-language-server: $schema=../../../schemas/agent.schema.json
2
2
  id: web-pattern-critique
3
3
  title: Web Pattern Critique Agent
4
4
  description: Critiques extracted patterns against industry standards (Airbnb, Stripe, Meta, Vercel) - frontend architecture focus - invoke AFTER pattern-scout extracts patterns
@@ -1,4 +1,4 @@
1
- $schema: https://raw.githubusercontent.com/claude-collective/cli/main/src/schemas/agent.schema.json
1
+ # yaml-language-server: $schema=../../../schemas/agent.schema.json
2
2
  id: web-pm
3
3
  title: Web PM and Architect Agent
4
4
  description: Creates detailed implementation specs by researching codebase patterns - architectural planning and requirements gathering - invoke BEFORE developer for any new feature
@@ -1,4 +1,4 @@
1
- $schema: https://raw.githubusercontent.com/claude-collective/cli/main/src/schemas/agent.schema.json
1
+ # yaml-language-server: $schema=../../../schemas/agent.schema.json
2
2
  id: api-researcher
3
3
  title: API Researcher Agent
4
4
  description: Read-only backend research specialist - discovers API route patterns, understands database schemas and ORM patterns, catalogs middleware and authentication flows, finds similar service implementations - produces structured findings for api-developer - invoke for backend research before implementation
@@ -1,4 +1,4 @@
1
- $schema: https://raw.githubusercontent.com/claude-collective/cli/main/src/schemas/agent.schema.json
1
+ # yaml-language-server: $schema=../../../schemas/agent.schema.json
2
2
  id: web-researcher
3
3
  title: Web Researcher Agent
4
4
  description: Read-only frontend research specialist - discovers UI component patterns, catalogs design systems, understands styling methodology and tokens, finds similar component implementations - produces structured findings for web-developer - invoke for frontend research before implementation
@@ -1,4 +1,4 @@
1
- $schema: https://raw.githubusercontent.com/claude-collective/cli/main/src/schemas/agent.schema.json
1
+ # yaml-language-server: $schema=../../../schemas/agent.schema.json
2
2
  id: api-reviewer
3
3
  title: API Reviewer Agent
4
4
  description: Reviews non-component code - API routes, server utils, configs (*.config.*), build tooling, CI/CD (*.yml), security, env management - defers UI components to web-reviewer
@@ -1,4 +1,4 @@
1
- $schema: https://raw.githubusercontent.com/claude-collective/cli/main/src/schemas/agent.schema.json
1
+ # yaml-language-server: $schema=../../../schemas/agent.schema.json
2
2
  id: cli-reviewer
3
3
  title: CLI Reviewer Agent
4
4
  description: Reviews CLI code ONLY - CLI commands, interactive prompts, exit codes, SIGINT handling, error messages, user feedback patterns - defers non-CLI code to api-reviewer
@@ -1,4 +1,4 @@
1
- $schema: https://raw.githubusercontent.com/claude-collective/cli/main/src/schemas/agent.schema.json
1
+ # yaml-language-server: $schema=../../../schemas/agent.schema.json
2
2
  id: web-reviewer
3
3
  title: Web Reviewer Agent
4
4
  description: Reviews UI component code ONLY (*.tsx/*.jsx with JSX) - components, hooks, props, state, performance, a11y patterns - NOT for API routes, configs, or server code (use api-reviewer)
@@ -1,4 +1,4 @@
1
- $schema: https://raw.githubusercontent.com/claude-collective/cli/main/src/schemas/agent.schema.json
1
+ # yaml-language-server: $schema=../../../schemas/agent.schema.json
2
2
  id: cli-tester
3
3
  title: CLI Tester Agent
4
4
  description: Tests CLI applications - wizard flows, commands, keyboard interactions, file system outputs - invoke BEFORE or AFTER cli-developer implements features
@@ -1,4 +1,4 @@
1
- $schema: https://raw.githubusercontent.com/claude-collective/cli/main/src/schemas/agent.schema.json
1
+ # yaml-language-server: $schema=../../../schemas/agent.schema.json
2
2
  id: web-tester
3
3
  title: Web Tester Agent
4
4
  description: Writes tests BEFORE implementation - all test types (*.test.*, *.spec.*, E2E) - Tester red-green-refactor - invoke BEFORE developer implements feature
@@ -154,9 +154,7 @@ describe("[Feature/Component Name]", () => {
154
154
  const mockApi = {
155
155
  success: { data: { id: 1, name: "Test" } },
156
156
  error: { error: { message: "Failed" } },
157
- timeout: new Promise((_, reject) =>
158
- setTimeout(() => reject(new Error("Timeout")), 100),
159
- ),
157
+ timeout: new Promise((_, reject) => setTimeout(() => reject(new Error("Timeout")), 100)),
160
158
  };
161
159
  ```
162
160
 
@@ -1,22 +0,0 @@
1
- #!/usr/bin/env node
2
- import {
3
- init_esm_shims
4
- } from "./chunk-DHET7RCE.js";
5
-
6
- // src/cli/utils/logger.ts
7
- init_esm_shims();
8
- var verboseMode = false;
9
- function setVerbose(enabled) {
10
- verboseMode = enabled;
11
- }
12
- function verbose(msg) {
13
- if (verboseMode) {
14
- console.log(` ${msg}`);
15
- }
16
- }
17
-
18
- export {
19
- setVerbose,
20
- verbose
21
- };
22
- //# sourceMappingURL=chunk-3U3R4NCG.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/cli/utils/logger.ts"],"sourcesContent":["/**\n * Verbose logging utility.\n * Used by lib/ modules that don't have access to oclif command context.\n * In oclif commands, prefer using this.log() instead.\n */\n\nlet verboseMode = false;\n\nexport function setVerbose(enabled: boolean): void {\n verboseMode = enabled;\n}\n\nexport function verbose(msg: string): void {\n if (verboseMode) {\n console.log(` ${msg}`);\n }\n}\n"],"mappings":";;;;;;AAAA;AAMA,IAAI,cAAc;AAEX,SAAS,WAAW,SAAwB;AACjD,gBAAc;AAChB;AAEO,SAAS,QAAQ,KAAmB;AACzC,MAAI,aAAa;AACf,YAAQ,IAAI,KAAK,GAAG,EAAE;AAAA,EACxB;AACF;","names":[]}