@claude-collective/cli 0.26.1 → 0.29.5

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 (273) hide show
  1. package/CHANGELOG.md +123 -0
  2. package/README.md +47 -13
  3. package/config/skills-matrix.yaml +1 -1
  4. package/config/stacks.yaml +331 -94
  5. package/dist/{chunk-NT4K647L.js → chunk-4DX47646.js} +97 -76
  6. package/dist/chunk-4DX47646.js.map +1 -0
  7. package/dist/{chunk-KWYO3M5Q.js → chunk-4JSKL5SD.js} +25 -24
  8. package/dist/chunk-4JSKL5SD.js.map +1 -0
  9. package/dist/chunk-52XVP55K.js +165 -0
  10. package/dist/chunk-52XVP55K.js.map +1 -0
  11. package/dist/{chunk-OBXAY23Y.js → chunk-5I6VY2E7.js} +5 -5
  12. package/dist/chunk-5I6VY2E7.js.map +1 -0
  13. package/dist/{chunk-324DM2L6.js → chunk-5WIHSJRO.js} +230 -65
  14. package/dist/chunk-5WIHSJRO.js.map +1 -0
  15. package/dist/chunk-73E5CQUK.js +142 -0
  16. package/dist/chunk-73E5CQUK.js.map +1 -0
  17. package/dist/{chunk-DBRUQQUF.js → chunk-7GHTQSWI.js} +5 -1
  18. package/dist/{chunk-DBRUQQUF.js.map → chunk-7GHTQSWI.js.map} +1 -1
  19. package/dist/chunk-7ICBJZV2.js +63 -0
  20. package/dist/chunk-7ICBJZV2.js.map +1 -0
  21. package/dist/{chunk-CQ7657GA.js → chunk-ABK6CSWI.js} +1248 -735
  22. package/dist/chunk-ABK6CSWI.js.map +1 -0
  23. package/dist/{chunk-ZW2PELOH.js → chunk-AGNT3FUE.js} +106 -69
  24. package/dist/chunk-AGNT3FUE.js.map +1 -0
  25. package/dist/{chunk-F4RD5FYM.js → chunk-AGQRRJSY.js} +5 -2
  26. package/dist/chunk-AGQRRJSY.js.map +1 -0
  27. package/dist/{chunk-GGFOD5PK.js → chunk-AXND7NCM.js} +122 -66
  28. package/dist/chunk-AXND7NCM.js.map +1 -0
  29. package/dist/{chunk-NQJ47R4N.js → chunk-CQZAKMPJ.js} +66 -14
  30. package/dist/chunk-CQZAKMPJ.js.map +1 -0
  31. package/dist/{chunk-XENOESJZ.js → chunk-DALU3Y3U.js} +10 -67
  32. package/dist/chunk-DALU3Y3U.js.map +1 -0
  33. package/dist/chunk-DDNK5UNE.js +366 -0
  34. package/dist/chunk-DDNK5UNE.js.map +1 -0
  35. package/dist/chunk-DIRH4PDF.js +24 -0
  36. package/dist/chunk-DIRH4PDF.js.map +1 -0
  37. package/dist/{chunk-VVYNZZUX.js → chunk-DTFEFLUU.js} +9 -5
  38. package/dist/chunk-DTFEFLUU.js.map +1 -0
  39. package/dist/chunk-F23LEXMC.js +81 -0
  40. package/dist/chunk-F23LEXMC.js.map +1 -0
  41. package/dist/chunk-FUPBGSRA.js +66 -0
  42. package/dist/chunk-FUPBGSRA.js.map +1 -0
  43. package/dist/{chunk-U7HFKR74.js → chunk-H2NM6BDH.js} +5 -2
  44. package/dist/chunk-H2NM6BDH.js.map +1 -0
  45. package/dist/chunk-HJS2FWLA.js +75 -0
  46. package/dist/chunk-HJS2FWLA.js.map +1 -0
  47. package/dist/{chunk-MCTSHLAF.js → chunk-I6YQDA2J.js} +41 -14
  48. package/dist/chunk-I6YQDA2J.js.map +1 -0
  49. package/dist/{chunk-G35SYE6Z.js → chunk-J3J2WPI2.js} +37 -104
  50. package/dist/chunk-J3J2WPI2.js.map +1 -0
  51. package/dist/{chunk-HIQGK5XJ.js → chunk-JDQDYGGC.js} +123 -86
  52. package/dist/chunk-JDQDYGGC.js.map +1 -0
  53. package/dist/chunk-JWIH7YQE.js +88 -0
  54. package/dist/chunk-JWIH7YQE.js.map +1 -0
  55. package/dist/{chunk-4S4FCAA2.js → chunk-KFL72CWK.js} +26 -31
  56. package/dist/chunk-KFL72CWK.js.map +1 -0
  57. package/dist/{chunk-H7SSBSPR.js → chunk-LY5HM34M.js} +8 -5
  58. package/dist/chunk-LY5HM34M.js.map +1 -0
  59. package/dist/{chunk-2YMMJP4Z.js → chunk-PRY6MLN3.js} +92 -29
  60. package/dist/chunk-PRY6MLN3.js.map +1 -0
  61. package/dist/{chunk-3X5D7RM5.js → chunk-RFW2RIM7.js} +15 -4
  62. package/dist/chunk-RFW2RIM7.js.map +1 -0
  63. package/dist/chunk-RXC7AF7N.js +31 -0
  64. package/dist/chunk-RXC7AF7N.js.map +1 -0
  65. package/dist/chunk-VBOBVQQW.js +29 -0
  66. package/dist/chunk-VBOBVQQW.js.map +1 -0
  67. package/dist/{chunk-ETCVEV3S.js → chunk-VIBOSHRL.js} +242 -155
  68. package/dist/chunk-VIBOSHRL.js.map +1 -0
  69. package/dist/chunk-WPED6CL3.js +105 -0
  70. package/dist/chunk-WPED6CL3.js.map +1 -0
  71. package/dist/chunk-Z6UK6MI2.js +233 -0
  72. package/dist/chunk-Z6UK6MI2.js.map +1 -0
  73. package/dist/{chunk-CZBNDP5B.js → chunk-ZCIWRQQ4.js} +3 -3
  74. package/dist/commands/build/marketplace.js +21 -20
  75. package/dist/commands/build/marketplace.js.map +1 -1
  76. package/dist/commands/build/plugins.js +7 -11
  77. package/dist/commands/build/plugins.js.map +1 -1
  78. package/dist/commands/build/stack.js +8 -13
  79. package/dist/commands/build/stack.js.map +1 -1
  80. package/dist/commands/compile.js +109 -135
  81. package/dist/commands/compile.js.map +1 -1
  82. package/dist/commands/config/get.js +4 -5
  83. package/dist/commands/config/get.js.map +1 -1
  84. package/dist/commands/config/index.js +5 -6
  85. package/dist/commands/config/index.js.map +1 -1
  86. package/dist/commands/config/path.js +4 -5
  87. package/dist/commands/config/path.js.map +1 -1
  88. package/dist/commands/config/set-project.js +4 -5
  89. package/dist/commands/config/set-project.js.map +1 -1
  90. package/dist/commands/config/show.js +5 -6
  91. package/dist/commands/config/unset-project.js +4 -5
  92. package/dist/commands/config/unset-project.js.map +1 -1
  93. package/dist/commands/diff.js +26 -11
  94. package/dist/commands/diff.js.map +1 -1
  95. package/dist/commands/doctor.js +13 -16
  96. package/dist/commands/doctor.js.map +1 -1
  97. package/dist/commands/edit.js +71 -42
  98. package/dist/commands/edit.js.map +1 -1
  99. package/dist/commands/eject.js +34 -14
  100. package/dist/commands/eject.js.map +1 -1
  101. package/dist/commands/import/skill.js +93 -52
  102. package/dist/commands/import/skill.js.map +1 -1
  103. package/dist/commands/info.js +27 -9
  104. package/dist/commands/info.js.map +1 -1
  105. package/dist/commands/init.js +98 -48
  106. package/dist/commands/init.js.map +1 -1
  107. package/dist/commands/list.js +10 -5
  108. package/dist/commands/list.js.map +1 -1
  109. package/dist/commands/new/agent.js +8 -11
  110. package/dist/commands/new/agent.js.map +1 -1
  111. package/dist/commands/new/skill.js +17 -18
  112. package/dist/commands/new/skill.js.map +1 -1
  113. package/dist/commands/outdated.js +23 -9
  114. package/dist/commands/outdated.js.map +1 -1
  115. package/dist/commands/search.js +23 -20
  116. package/dist/commands/search.js.map +1 -1
  117. package/dist/commands/uninstall.js +28 -21
  118. package/dist/commands/uninstall.js.map +1 -1
  119. package/dist/commands/update.js +30 -22
  120. package/dist/commands/update.js.map +1 -1
  121. package/dist/commands/validate.js +103 -39
  122. package/dist/commands/validate.js.map +1 -1
  123. package/dist/commands/version/bump.js +4 -5
  124. package/dist/commands/version/bump.js.map +1 -1
  125. package/dist/commands/version/index.js +4 -5
  126. package/dist/commands/version/index.js.map +1 -1
  127. package/dist/commands/version/set.js +4 -5
  128. package/dist/commands/version/set.js.map +1 -1
  129. package/dist/commands/version/show.js +4 -5
  130. package/dist/commands/version/show.js.map +1 -1
  131. package/dist/components/common/confirm.test.js +2 -2
  132. package/dist/components/common/confirm.test.js.map +1 -1
  133. package/dist/components/skill-search/skill-search.js +4 -2
  134. package/dist/components/wizard/category-grid.js +3 -1
  135. package/dist/components/wizard/category-grid.test.js +63 -64
  136. package/dist/components/wizard/category-grid.test.js.map +1 -1
  137. package/dist/components/wizard/domain-selection.js +13 -0
  138. package/dist/components/wizard/help-modal.js +10 -0
  139. package/dist/components/wizard/help-modal.js.map +1 -0
  140. package/dist/components/wizard/menu-item.js +2 -1
  141. package/dist/components/wizard/search-modal.js +3 -1
  142. package/dist/components/wizard/search-modal.test.js +4 -2
  143. package/dist/components/wizard/search-modal.test.js.map +1 -1
  144. package/dist/components/wizard/section-progress.js +2 -1
  145. package/dist/components/wizard/section-progress.test.js +2 -1
  146. package/dist/components/wizard/section-progress.test.js.map +1 -1
  147. package/dist/components/wizard/source-grid.js +6 -2
  148. package/dist/components/wizard/source-grid.test.js +49 -45
  149. package/dist/components/wizard/source-grid.test.js.map +1 -1
  150. package/dist/components/wizard/stack-selection.js +15 -0
  151. package/dist/components/wizard/stack-selection.js.map +1 -0
  152. package/dist/components/wizard/step-approach.js +8 -6
  153. package/dist/components/wizard/step-approach.test.js +11 -9
  154. package/dist/components/wizard/step-approach.test.js.map +1 -1
  155. package/dist/components/wizard/step-build.js +9 -13
  156. package/dist/components/wizard/step-build.test.js +27 -45
  157. package/dist/components/wizard/step-build.test.js.map +1 -1
  158. package/dist/components/wizard/step-confirm.js +2 -1
  159. package/dist/components/wizard/step-confirm.test.js +6 -5
  160. package/dist/components/wizard/step-confirm.test.js.map +1 -1
  161. package/dist/components/wizard/step-refine.js +2 -1
  162. package/dist/components/wizard/step-refine.test.js +3 -2
  163. package/dist/components/wizard/step-refine.test.js.map +1 -1
  164. package/dist/components/wizard/step-settings.js +8 -6
  165. package/dist/components/wizard/step-settings.test.js +12 -10
  166. package/dist/components/wizard/step-settings.test.js.map +1 -1
  167. package/dist/components/wizard/step-sources.js +11 -9
  168. package/dist/components/wizard/step-sources.test.js +16 -15
  169. package/dist/components/wizard/step-sources.test.js.map +1 -1
  170. package/dist/components/wizard/step-stack.js +9 -6
  171. package/dist/components/wizard/step-stack.test.js +15 -12
  172. package/dist/components/wizard/step-stack.test.js.map +1 -1
  173. package/dist/components/wizard/view-title.js +2 -1
  174. package/dist/components/wizard/wizard-layout.js +7 -9
  175. package/dist/components/wizard/wizard-tabs.js +2 -1
  176. package/dist/components/wizard/wizard-tabs.test.js +2 -1
  177. package/dist/components/wizard/wizard-tabs.test.js.map +1 -1
  178. package/dist/components/wizard/wizard.js +26 -20
  179. package/dist/config/skills-matrix.yaml +1 -1
  180. package/dist/config/stacks.yaml +331 -94
  181. package/dist/hooks/init.js +3 -4
  182. package/dist/hooks/init.js.map +1 -1
  183. package/dist/source-manager-JUPEIBMY.js +15 -0
  184. package/dist/source-manager-JUPEIBMY.js.map +1 -0
  185. package/dist/src/agents/developer/api-developer/agent.yaml +1 -1
  186. package/dist/src/agents/developer/cli-developer/agent.yaml +1 -1
  187. package/dist/src/agents/developer/web-architecture/agent.yaml +1 -1
  188. package/dist/src/agents/developer/web-developer/agent.yaml +1 -1
  189. package/dist/src/agents/meta/agent-summoner/agent.yaml +1 -1
  190. package/dist/src/agents/meta/documentor/agent.yaml +1 -1
  191. package/dist/src/agents/meta/skill-summoner/agent.yaml +1 -1
  192. package/dist/src/agents/meta/skill-summoner/output-format.md +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 +272 -25
  206. package/dist/stores/wizard-store.test.js.map +1 -1
  207. package/package.json +2 -1
  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/meta/skill-summoner/output-format.md +1 -1
  216. package/src/agents/migration/cli-migrator/agent.yaml +1 -1
  217. package/src/agents/pattern/pattern-scout/agent.yaml +1 -1
  218. package/src/agents/pattern/web-pattern-critique/agent.yaml +1 -1
  219. package/src/agents/planning/web-pm/agent.yaml +1 -1
  220. package/src/agents/researcher/api-researcher/agent.yaml +1 -1
  221. package/src/agents/researcher/web-researcher/agent.yaml +1 -1
  222. package/src/agents/reviewer/api-reviewer/agent.yaml +1 -1
  223. package/src/agents/reviewer/cli-reviewer/agent.yaml +1 -1
  224. package/src/agents/reviewer/web-reviewer/agent.yaml +1 -1
  225. package/src/agents/tester/cli-tester/agent.yaml +1 -1
  226. package/src/agents/tester/web-tester/agent.yaml +1 -1
  227. package/src/schemas/agent-frontmatter.schema.json +84 -0
  228. package/src/schemas/agent.schema.json +93 -0
  229. package/src/schemas/hooks.schema.json +47 -0
  230. package/src/schemas/marketplace.schema.json +119 -0
  231. package/src/schemas/metadata.schema.json +113 -0
  232. package/src/schemas/plugin.schema.json +130 -0
  233. package/src/schemas/project-config.schema.json +125 -0
  234. package/src/schemas/project-source-config.schema.json +81 -0
  235. package/src/schemas/skill-frontmatter.schema.json +42 -0
  236. package/src/schemas/skills-matrix.schema.json +467 -0
  237. package/src/schemas/stack.schema.json +191 -0
  238. package/src/schemas/stacks.schema.json +111 -0
  239. package/dist/chunk-2OW7FCIF.js +0 -197
  240. package/dist/chunk-2OW7FCIF.js.map +0 -1
  241. package/dist/chunk-2YMMJP4Z.js.map +0 -1
  242. package/dist/chunk-324DM2L6.js.map +0 -1
  243. package/dist/chunk-3X5D7RM5.js.map +0 -1
  244. package/dist/chunk-4S4FCAA2.js.map +0 -1
  245. package/dist/chunk-CQ7657GA.js.map +0 -1
  246. package/dist/chunk-ETCVEV3S.js.map +0 -1
  247. package/dist/chunk-F4RD5FYM.js.map +0 -1
  248. package/dist/chunk-G35SYE6Z.js.map +0 -1
  249. package/dist/chunk-GGFOD5PK.js.map +0 -1
  250. package/dist/chunk-H7SSBSPR.js.map +0 -1
  251. package/dist/chunk-HIQGK5XJ.js.map +0 -1
  252. package/dist/chunk-HWD32NP7.js +0 -19
  253. package/dist/chunk-HWD32NP7.js.map +0 -1
  254. package/dist/chunk-KWYO3M5Q.js.map +0 -1
  255. package/dist/chunk-MCTSHLAF.js.map +0 -1
  256. package/dist/chunk-NQJ47R4N.js.map +0 -1
  257. package/dist/chunk-NT4K647L.js.map +0 -1
  258. package/dist/chunk-O6ZTD7ZI.js +0 -70
  259. package/dist/chunk-O6ZTD7ZI.js.map +0 -1
  260. package/dist/chunk-OBXAY23Y.js.map +0 -1
  261. package/dist/chunk-TMED5DQ2.js +0 -210
  262. package/dist/chunk-TMED5DQ2.js.map +0 -1
  263. package/dist/chunk-U7HFKR74.js.map +0 -1
  264. package/dist/chunk-UEMRJI2K.js +0 -146
  265. package/dist/chunk-UEMRJI2K.js.map +0 -1
  266. package/dist/chunk-UNN7523L.js +0 -78
  267. package/dist/chunk-UNN7523L.js.map +0 -1
  268. package/dist/chunk-VVYNZZUX.js.map +0 -1
  269. package/dist/chunk-XENOESJZ.js.map +0 -1
  270. package/dist/chunk-ZW2PELOH.js.map +0 -1
  271. package/dist/source-manager-VWIIDTK5.js +0 -16
  272. /package/dist/{chunk-CZBNDP5B.js.map → chunk-ZCIWRQQ4.js.map} +0 -0
  273. /package/dist/{source-manager-VWIIDTK5.js.map → components/wizard/domain-selection.js.map} +0 -0
@@ -1,4 +1,4 @@
1
- # yaml-language-server: $schema=../../../schemas/agent.schema.json
1
+ # yaml-language-server: $schema=https://raw.githubusercontent.com/claude-collective/cli/main/src/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
- # yaml-language-server: $schema=../../../schemas/agent.schema.json
1
+ # yaml-language-server: $schema=https://raw.githubusercontent.com/claude-collective/cli/main/src/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
- # yaml-language-server: $schema=../../../schemas/agent.schema.json
1
+ # yaml-language-server: $schema=https://raw.githubusercontent.com/claude-collective/cli/main/src/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
- # yaml-language-server: $schema=../../../schemas/agent.schema.json
1
+ # yaml-language-server: $schema=https://raw.githubusercontent.com/claude-collective/cli/main/src/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
- # yaml-language-server: $schema=../../../schemas/agent.schema.json
1
+ # yaml-language-server: $schema=https://raw.githubusercontent.com/claude-collective/cli/main/src/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
- # yaml-language-server: $schema=../../../schemas/agent.schema.json
1
+ # yaml-language-server: $schema=https://raw.githubusercontent.com/claude-collective/cli/main/src/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
- # yaml-language-server: $schema=../../../schemas/agent.schema.json
1
+ # yaml-language-server: $schema=https://raw.githubusercontent.com/claude-collective/cli/main/src/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
- # yaml-language-server: $schema=../../../schemas/agent.schema.json
1
+ # yaml-language-server: $schema=https://raw.githubusercontent.com/claude-collective/cli/main/src/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
- # yaml-language-server: $schema=../../../schemas/agent.schema.json
1
+ # yaml-language-server: $schema=https://raw.githubusercontent.com/claude-collective/cli/main/src/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
- # yaml-language-server: $schema=../../../schemas/agent.schema.json
1
+ # yaml-language-server: $schema=https://raw.githubusercontent.com/claude-collective/cli/main/src/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
@@ -1,9 +1,10 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  useWizardStore
4
- } from "../chunk-TMED5DQ2.js";
5
- import "../chunk-HWD32NP7.js";
6
- import "../chunk-O6ZTD7ZI.js";
4
+ } from "../chunk-DDNK5UNE.js";
5
+ import "../chunk-ABK6CSWI.js";
6
+ import "../chunk-5WIHSJRO.js";
7
+ import "../chunk-52XVP55K.js";
7
8
  import "../chunk-AWKZ5BDL.js";
8
9
  export {
9
10
  useWizardStore
@@ -7,17 +7,21 @@ import {
7
7
  } from "../chunk-QR2EBWL2.js";
8
8
  import {
9
9
  useWizardStore
10
- } from "../chunk-TMED5DQ2.js";
11
- import "../chunk-HWD32NP7.js";
10
+ } from "../chunk-DDNK5UNE.js";
11
+ import "../chunk-ABK6CSWI.js";
12
+ import "../chunk-5WIHSJRO.js";
12
13
  import {
13
14
  DEFAULT_PRESELECTED_SKILLS
14
- } from "../chunk-O6ZTD7ZI.js";
15
+ } from "../chunk-52XVP55K.js";
15
16
  import {
16
17
  init_esm_shims
17
18
  } from "../chunk-AWKZ5BDL.js";
18
19
 
19
20
  // src/cli/stores/wizard-store.test.ts
20
21
  init_esm_shims();
22
+ function sa(id, preloaded = false) {
23
+ return { id, preloaded };
24
+ }
21
25
  describe("WizardStore", () => {
22
26
  beforeEach(() => {
23
27
  useWizardStore.getState().reset();
@@ -79,7 +83,7 @@ describe("WizardStore", () => {
79
83
  globalExpect(step).toBe("stack");
80
84
  globalExpect(history).toEqual(["approach"]);
81
85
  });
82
- it("should return to approach when history is empty", () => {
86
+ it("when goBack is called with empty history, should return to approach step", () => {
83
87
  const store = useWizardStore.getState();
84
88
  store.setStep("stack");
85
89
  store.goBack();
@@ -87,14 +91,6 @@ describe("WizardStore", () => {
87
91
  const { step } = useWizardStore.getState();
88
92
  globalExpect(step).toBe("approach");
89
93
  });
90
- it("should reset focus when changing steps", () => {
91
- const store = useWizardStore.getState();
92
- store.setFocus(2, 3);
93
- store.setStep("stack");
94
- const { focusedRow, focusedCol } = useWizardStore.getState();
95
- globalExpect(focusedRow).toBe(0);
96
- globalExpect(focusedCol).toBe(0);
97
- });
98
94
  });
99
95
  describe("approach selection", () => {
100
96
  it("should set approach to stack", () => {
@@ -117,7 +113,7 @@ describe("WizardStore", () => {
117
113
  const { selectedStackId } = useWizardStore.getState();
118
114
  globalExpect(selectedStackId).toBe("nextjs-fullstack");
119
115
  });
120
- it("should clear stack when null is passed", () => {
116
+ it("when selectStack is called with null, should clear previously selected stack", () => {
121
117
  const store = useWizardStore.getState();
122
118
  store.selectStack("nextjs-fullstack");
123
119
  store.selectStack(null);
@@ -198,7 +194,7 @@ describe("WizardStore", () => {
198
194
  globalExpect(result).toBe(true);
199
195
  globalExpect(currentDomainIndex).toBe(1);
200
196
  });
201
- it("should return false when at last domain", () => {
197
+ it("when already at the last domain, should return false from nextDomain", () => {
202
198
  const store = useWizardStore.getState();
203
199
  store.toggleDomain("web");
204
200
  const result = store.nextDomain();
@@ -214,7 +210,7 @@ describe("WizardStore", () => {
214
210
  globalExpect(result).toBe(true);
215
211
  globalExpect(currentDomainIndex).toBe(0);
216
212
  });
217
- it("should return false when at first domain", () => {
213
+ it("when already at the first domain, should return false from prevDomain", () => {
218
214
  const store = useWizardStore.getState();
219
215
  store.toggleDomain("web");
220
216
  const result = store.prevDomain();
@@ -268,6 +264,30 @@ describe("WizardStore", () => {
268
264
  globalExpect(showDescriptions).toBe(true);
269
265
  });
270
266
  });
267
+ describe("install mode auto-defaulting", () => {
268
+ it("should default installMode to plugin when set via setState (marketplace available)", () => {
269
+ useWizardStore.setState({ installMode: "plugin" });
270
+ const { installMode } = useWizardStore.getState();
271
+ globalExpect(installMode).toBe("plugin");
272
+ });
273
+ it("should keep installMode as local when set via setState (no marketplace)", () => {
274
+ useWizardStore.setState({ installMode: "local" });
275
+ const { installMode } = useWizardStore.getState();
276
+ globalExpect(installMode).toBe("local");
277
+ });
278
+ it("should allow toggling installMode after auto-defaulting to plugin", () => {
279
+ useWizardStore.setState({ installMode: "plugin" });
280
+ useWizardStore.getState().toggleInstallMode();
281
+ const { installMode } = useWizardStore.getState();
282
+ globalExpect(installMode).toBe("local");
283
+ });
284
+ it("should reset installMode to local after reset even if previously set to plugin", () => {
285
+ useWizardStore.setState({ installMode: "plugin" });
286
+ useWizardStore.getState().reset();
287
+ const { installMode } = useWizardStore.getState();
288
+ globalExpect(installMode).toBe("local");
289
+ });
290
+ });
271
291
  describe("computed getters", () => {
272
292
  it("should get all selected technologies", () => {
273
293
  const store = useWizardStore.getState();
@@ -279,13 +299,156 @@ describe("WizardStore", () => {
279
299
  globalExpect(technologies).toContain("web-styling-scss-modules");
280
300
  globalExpect(technologies).toContain("api-framework-hono");
281
301
  });
282
- it("should get selected skills including preselected", () => {
302
+ it("should get default methodology skills", () => {
283
303
  const store = useWizardStore.getState();
284
- const skills = store.getSelectedSkills();
304
+ const skills = store.getDefaultMethodologySkills();
285
305
  for (const skill of DEFAULT_PRESELECTED_SKILLS) {
286
306
  globalExpect(skills).toContain(skill);
287
307
  }
288
308
  });
309
+ it("should get selected technologies per domain", () => {
310
+ const store = useWizardStore.getState();
311
+ store.toggleTechnology("web", "framework", "web-framework-react", true);
312
+ store.toggleTechnology("web", "styling", "web-styling-scss-modules", true);
313
+ store.toggleTechnology("api", "api", "api-framework-hono", true);
314
+ const perDomain = store.getSelectedTechnologiesPerDomain();
315
+ globalExpect(perDomain.web).toEqual(["web-framework-react", "web-styling-scss-modules"]);
316
+ globalExpect(perDomain.api).toEqual(["api-framework-hono"]);
317
+ globalExpect(perDomain.cli).toBeUndefined();
318
+ });
319
+ it("should return empty object for getSelectedTechnologiesPerDomain with no selections", () => {
320
+ const store = useWizardStore.getState();
321
+ const perDomain = store.getSelectedTechnologiesPerDomain();
322
+ globalExpect(perDomain).toEqual({});
323
+ });
324
+ it("should omit domains with empty subcategory arrays from getSelectedTechnologiesPerDomain", () => {
325
+ const store = useWizardStore.getState();
326
+ store.toggleTechnology("web", "framework", "web-framework-react", true);
327
+ store.toggleTechnology("web", "framework", "web-framework-react", true);
328
+ const perDomain = store.getSelectedTechnologiesPerDomain();
329
+ globalExpect(perDomain.web).toBeUndefined();
330
+ });
331
+ it("should get technology count", () => {
332
+ const store = useWizardStore.getState();
333
+ store.toggleTechnology("web", "framework", "web-framework-react", true);
334
+ store.toggleTechnology("web", "styling", "web-styling-scss-modules", true);
335
+ store.toggleTechnology("api", "api", "api-framework-hono", true);
336
+ globalExpect(store.getTechnologyCount()).toBe(3);
337
+ });
338
+ it("should return 0 for getTechnologyCount with no selections", () => {
339
+ const store = useWizardStore.getState();
340
+ globalExpect(store.getTechnologyCount()).toBe(0);
341
+ });
342
+ });
343
+ describe("navigation guards", () => {
344
+ it("canGoToNextDomain should return true when not at last domain", () => {
345
+ const store = useWizardStore.getState();
346
+ store.toggleDomain("web");
347
+ store.toggleDomain("api");
348
+ globalExpect(store.canGoToNextDomain()).toBe(true);
349
+ });
350
+ it("canGoToNextDomain should return false when at last domain", () => {
351
+ const store = useWizardStore.getState();
352
+ store.toggleDomain("web");
353
+ globalExpect(store.canGoToNextDomain()).toBe(false);
354
+ });
355
+ it("canGoToNextDomain should return false with no domains", () => {
356
+ const store = useWizardStore.getState();
357
+ globalExpect(store.canGoToNextDomain()).toBe(false);
358
+ });
359
+ it("canGoToPreviousDomain should return false when at first domain", () => {
360
+ const store = useWizardStore.getState();
361
+ store.toggleDomain("web");
362
+ store.toggleDomain("api");
363
+ globalExpect(store.canGoToPreviousDomain()).toBe(false);
364
+ });
365
+ it("canGoToPreviousDomain should return true when past first domain", () => {
366
+ const store = useWizardStore.getState();
367
+ store.toggleDomain("web");
368
+ store.toggleDomain("api");
369
+ store.nextDomain();
370
+ globalExpect(store.canGoToPreviousDomain()).toBe(true);
371
+ });
372
+ it("canGoToPreviousDomain should return false with no domains", () => {
373
+ const store = useWizardStore.getState();
374
+ globalExpect(store.canGoToPreviousDomain()).toBe(false);
375
+ });
376
+ });
377
+ describe("parent domain selectors", () => {
378
+ const matrixWithParentDomain = {
379
+ categories: {
380
+ "error-handling": {
381
+ id: "error-handling",
382
+ displayName: "Error Handling",
383
+ description: "Error handling tools",
384
+ domain: "web-extras",
385
+ parent_domain: "web",
386
+ exclusive: false,
387
+ required: false,
388
+ order: 0
389
+ },
390
+ framework: {
391
+ id: "framework",
392
+ displayName: "Framework",
393
+ description: "Web frameworks",
394
+ domain: "web",
395
+ exclusive: true,
396
+ required: false,
397
+ order: 0
398
+ }
399
+ }
400
+ };
401
+ const matrixWithoutParent = {
402
+ categories: {
403
+ framework: {
404
+ id: "framework",
405
+ displayName: "Framework",
406
+ description: "Web frameworks",
407
+ domain: "web",
408
+ exclusive: true,
409
+ required: false,
410
+ order: 0
411
+ }
412
+ }
413
+ };
414
+ it("should find parent domain for a domain with parent_domain", () => {
415
+ const store = useWizardStore.getState();
416
+ const parent = store.getParentDomain(
417
+ "web-extras",
418
+ matrixWithParentDomain
419
+ );
420
+ globalExpect(parent).toBe("web");
421
+ });
422
+ it("should return undefined for a domain without parent_domain", () => {
423
+ const store = useWizardStore.getState();
424
+ const parent = store.getParentDomain("web", matrixWithoutParent);
425
+ globalExpect(parent).toBeUndefined();
426
+ });
427
+ it("should get parent domain selections when parent exists", () => {
428
+ const store = useWizardStore.getState();
429
+ store.toggleTechnology("web", "framework", "web-framework-react", true);
430
+ const parentSelections = store.getParentDomainSelections(
431
+ "web-extras",
432
+ matrixWithParentDomain
433
+ );
434
+ globalExpect(parentSelections).toEqual({ framework: ["web-framework-react"] });
435
+ });
436
+ it("should return undefined for getParentDomainSelections when no parent", () => {
437
+ const store = useWizardStore.getState();
438
+ const parentSelections = store.getParentDomainSelections(
439
+ "web",
440
+ matrixWithoutParent
441
+ );
442
+ globalExpect(parentSelections).toBeUndefined();
443
+ });
444
+ it("should return undefined for getParentDomainSelections when parent has no selections", () => {
445
+ const store = useWizardStore.getState();
446
+ const parentSelections = store.getParentDomainSelections(
447
+ "web-extras",
448
+ matrixWithParentDomain
449
+ );
450
+ globalExpect(parentSelections).toBeUndefined();
451
+ });
289
452
  });
290
453
  describe("reset", () => {
291
454
  it("should reset to initial state", () => {
@@ -311,7 +474,7 @@ describe("WizardStore", () => {
311
474
  const store = useWizardStore.getState();
312
475
  const stack = {
313
476
  agents: {
314
- web: { framework: "react" }
477
+ web: { framework: [sa("web-framework-react", true)] }
315
478
  }
316
479
  };
317
480
  const categories = {
@@ -321,15 +484,18 @@ describe("WizardStore", () => {
321
484
  const { selectedDomains, domainSelections } = useWizardStore.getState();
322
485
  globalExpect(selectedDomains).toEqual(["web", "web-extras", "api", "cli", "mobile", "shared"]);
323
486
  globalExpect(domainSelections.web).toBeDefined();
324
- globalExpect(domainSelections.web.framework).toEqual(["react"]);
487
+ globalExpect(domainSelections.web.framework).toEqual(["web-framework-react"]);
325
488
  globalExpect(domainSelections.api).toBeUndefined();
326
489
  });
327
490
  it("should populate domainSelections from stack agents", () => {
328
491
  const store = useWizardStore.getState();
329
492
  const stack = {
330
493
  agents: {
331
- web: { framework: "react", "client-state": "zustand" },
332
- api: { api: "hono" }
494
+ web: {
495
+ framework: [sa("web-framework-react", true)],
496
+ "client-state": [sa("web-state-zustand")]
497
+ },
498
+ api: { api: [sa("api-framework-hono", true)] }
333
499
  }
334
500
  };
335
501
  const categories = {
@@ -339,15 +505,15 @@ describe("WizardStore", () => {
339
505
  };
340
506
  store.populateFromStack(stack, categories);
341
507
  const { domainSelections } = useWizardStore.getState();
342
- globalExpect(domainSelections.web.framework).toEqual(["react"]);
343
- globalExpect(domainSelections.web["client-state"]).toEqual(["zustand"]);
344
- globalExpect(domainSelections.api.api).toEqual(["hono"]);
508
+ globalExpect(domainSelections.web.framework).toEqual(["web-framework-react"]);
509
+ globalExpect(domainSelections.web["client-state"]).toEqual(["web-state-zustand"]);
510
+ globalExpect(domainSelections.api.api).toEqual(["api-framework-hono"]);
345
511
  });
346
512
  it("should skip entries without a domain", () => {
347
513
  const store = useWizardStore.getState();
348
514
  const stack = {
349
515
  agents: {
350
- misc: { methodology: "vitest" }
516
+ misc: { methodology: [sa("meta-methodology-vitest")] }
351
517
  }
352
518
  };
353
519
  const categories = {
@@ -357,6 +523,87 @@ describe("WizardStore", () => {
357
523
  const { domainSelections } = useWizardStore.getState();
358
524
  globalExpect(Object.keys(domainSelections)).toHaveLength(0);
359
525
  });
526
+ it("should populate multiple skills from array-valued subcategories", () => {
527
+ const store = useWizardStore.getState();
528
+ const stack = {
529
+ agents: {
530
+ "pattern-scout": {
531
+ methodology: [
532
+ sa("meta-methodology-investigation-requirements", true),
533
+ sa("meta-methodology-anti-over-engineering", true),
534
+ sa("meta-methodology-success-criteria", true)
535
+ ]
536
+ }
537
+ }
538
+ };
539
+ const categories = {
540
+ methodology: { domain: "shared" }
541
+ };
542
+ store.populateFromStack(stack, categories);
543
+ const { domainSelections } = useWizardStore.getState();
544
+ globalExpect(domainSelections.shared.methodology).toEqual([
545
+ "meta-methodology-investigation-requirements",
546
+ "meta-methodology-anti-over-engineering",
547
+ "meta-methodology-success-criteria"
548
+ ]);
549
+ });
550
+ it("should handle single-element and multi-element arrays across agents", () => {
551
+ const store = useWizardStore.getState();
552
+ const stack = {
553
+ agents: {
554
+ web: {
555
+ framework: [sa("web-framework-react", true)],
556
+ methodology: [
557
+ sa("meta-methodology-investigation-requirements", true),
558
+ sa("meta-methodology-anti-over-engineering", true)
559
+ ]
560
+ },
561
+ api: { api: [sa("api-framework-hono", true)] }
562
+ }
563
+ };
564
+ const categories = {
565
+ framework: { domain: "web" },
566
+ methodology: { domain: "shared" },
567
+ api: { domain: "api" }
568
+ };
569
+ store.populateFromStack(stack, categories);
570
+ const { domainSelections } = useWizardStore.getState();
571
+ globalExpect(domainSelections.web.framework).toEqual(["web-framework-react"]);
572
+ globalExpect(domainSelections.shared.methodology).toEqual([
573
+ "meta-methodology-investigation-requirements",
574
+ "meta-methodology-anti-over-engineering"
575
+ ]);
576
+ globalExpect(domainSelections.api.api).toEqual(["api-framework-hono"]);
577
+ });
578
+ it("should deduplicate skills from arrays across multiple agents", () => {
579
+ const store = useWizardStore.getState();
580
+ const stack = {
581
+ agents: {
582
+ agent1: {
583
+ methodology: [
584
+ sa("meta-methodology-investigation-requirements", true),
585
+ sa("meta-methodology-anti-over-engineering", true)
586
+ ]
587
+ },
588
+ agent2: {
589
+ methodology: [
590
+ sa("meta-methodology-anti-over-engineering", true),
591
+ sa("meta-methodology-success-criteria", true)
592
+ ]
593
+ }
594
+ }
595
+ };
596
+ const categories = {
597
+ methodology: { domain: "shared" }
598
+ };
599
+ store.populateFromStack(stack, categories);
600
+ const { domainSelections } = useWizardStore.getState();
601
+ globalExpect(domainSelections.shared.methodology).toEqual([
602
+ "meta-methodology-investigation-requirements",
603
+ "meta-methodology-anti-over-engineering",
604
+ "meta-methodology-success-criteria"
605
+ ]);
606
+ });
360
607
  });
361
608
  describe("complex flows", () => {
362
609
  it("should handle complete stack selection flow", () => {