@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 +1 @@
1
- {"version":3,"sources":["../../../src/cli/components/wizard/step-stack.test.tsx"],"sourcesContent":["import { render } from \"ink-testing-library\";\nimport { afterEach, beforeEach, describe, expect, it } from \"vitest\";\nimport { StepStack } from \"./step-stack\";\nimport { useWizardStore } from \"../../stores/wizard-store\";\nimport {\n createMockCategory,\n createMockMatrix,\n createMockResolvedStack,\n createMockSkill,\n} from \"../../lib/__tests__/helpers\";\n\nimport type { MergedSkillsMatrix } from \"../../types\";\nimport {\n ARROW_DOWN,\n ARROW_UP,\n ENTER,\n ESCAPE,\n RENDER_DELAY_MS,\n delay,\n} from \"../../lib/__tests__/test-constants\";\n\nconst SELECT_NAV_DELAY_MS = 100;\n\nconst createMockStackWithSkills = (): MergedSkillsMatrix => {\n const skills = {\n [\"web-framework-react\"]: createMockSkill(\"web-framework-react\", \"framework\", {\n description: \"React framework\",\n }),\n [\"web-state-zustand\"]: createMockSkill(\"web-state-zustand\", \"client-state\", {\n description: \"State management\",\n }),\n [\"api-framework-hono\"]: createMockSkill(\"api-framework-hono\", \"api\", {\n description: \"Web framework\",\n }),\n };\n\n const suggestedStacks = [\n createMockResolvedStack(\"react-fullstack\", \"React Fullstack\", {\n description: \"Full React stack with Zustand and Hono\",\n allSkillIds: [\"web-framework-react\", \"web-state-zustand\", \"api-framework-hono\"],\n }),\n createMockResolvedStack(\"react-minimal\", \"React Minimal\", {\n description: \"Minimal React setup\",\n allSkillIds: [\"web-framework-react\"],\n }),\n ];\n\n return createMockMatrix(skills, {\n suggestedStacks,\n categories: {\n framework: createMockCategory(\"framework\", \"Web\", {\n description: \"Web skills\",\n exclusive: false,\n }),\n api: createMockCategory(\"api\", \"API\", {\n description: \"API skills\",\n exclusive: false,\n order: 1,\n }),\n },\n });\n};\n\ndescribe(\"StepStack component\", () => {\n let cleanup: (() => void) | undefined;\n let mockMatrix: MergedSkillsMatrix;\n\n beforeEach(() => {\n useWizardStore.getState().reset();\n mockMatrix = createMockStackWithSkills();\n });\n\n afterEach(() => {\n cleanup?.();\n cleanup = undefined;\n });\n\n describe(\"stack selection mode\", () => {\n beforeEach(() => {\n // Set approach to \"stack\" for stack selection mode\n useWizardStore.getState().setApproach(\"stack\");\n });\n\n describe(\"rendering\", () => {\n it(\"should render stack options as cards\", () => {\n const { lastFrame, unmount } = render(<StepStack matrix={mockMatrix} />);\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"React Fullstack\");\n expect(output).toContain(\"React Minimal\");\n });\n\n it(\"should render focused stack description (only focused item shows description)\", () => {\n const { lastFrame, unmount } = render(<StepStack matrix={mockMatrix} />);\n cleanup = unmount;\n\n const output = lastFrame();\n // Only the focused (first) stack shows its description\n expect(output).toContain(\"Full React stack\");\n });\n\n it(\"should render ViewTitle for stack selection\", () => {\n const { lastFrame, unmount } = render(<StepStack matrix={mockMatrix} />);\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Select a pre-built template\");\n });\n\n it(\"should render header text\", () => {\n const { lastFrame, unmount } = render(<StepStack matrix={mockMatrix} />);\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Select a pre-built template\");\n });\n });\n\n describe(\"stack selection\", () => {\n it(\"should select first stack on Enter (focus starts at first card)\", async () => {\n const { stdin, unmount } = render(<StepStack matrix={mockMatrix} />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n // Focus starts at first stack card, press Enter to select\n stdin.write(ENTER);\n await delay(SELECT_NAV_DELAY_MS);\n\n const { step, selectedStackId } = useWizardStore.getState();\n expect(step).toBe(\"build\");\n expect(selectedStackId).toBe(\"react-fullstack\");\n });\n\n it(\"should select second stack when navigated to\", async () => {\n const { stdin, unmount } = render(<StepStack matrix={mockMatrix} />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n // Navigate down once to second stack card\n stdin.write(ARROW_DOWN);\n await delay(SELECT_NAV_DELAY_MS);\n stdin.write(ENTER);\n await delay(SELECT_NAV_DELAY_MS);\n\n const { selectedStackId } = useWizardStore.getState();\n expect(selectedStackId).toBe(\"react-minimal\");\n });\n });\n\n describe(\"back navigation\", () => {\n it(\"should go back when pressing Escape\", async () => {\n // First set up history by setting step to stack\n useWizardStore.getState().setStep(\"stack\");\n\n const { stdin, unmount } = render(<StepStack matrix={mockMatrix} />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n // Press Escape to go back\n stdin.write(ESCAPE);\n await delay(SELECT_NAV_DELAY_MS);\n\n const { step } = useWizardStore.getState();\n expect(step).toBe(\"approach\");\n });\n\n it(\"should maintain history when going back via Escape\", async () => {\n // Set up proper history\n const store = useWizardStore.getState();\n store.setApproach(\"stack\");\n store.setStep(\"stack\"); // This adds \"approach\" to history\n\n const { stdin, unmount } = render(<StepStack matrix={mockMatrix} />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n stdin.write(ESCAPE); // Press Escape to go back\n await delay(SELECT_NAV_DELAY_MS);\n\n const { step, history } = useWizardStore.getState();\n expect(step).toBe(\"approach\");\n expect(history).toEqual([]);\n });\n });\n\n describe(\"arrow key navigation\", () => {\n it(\"should navigate down to second stack card\", async () => {\n const { stdin, unmount } = render(<StepStack matrix={mockMatrix} />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n // Navigate down once to second stack card and select\n stdin.write(ARROW_DOWN);\n await delay(SELECT_NAV_DELAY_MS);\n stdin.write(ENTER);\n await delay(SELECT_NAV_DELAY_MS);\n\n const { selectedStackId } = useWizardStore.getState();\n expect(selectedStackId).toBe(\"react-minimal\");\n });\n\n it(\"should navigate down then up back to first stack\", async () => {\n const { stdin, unmount } = render(<StepStack matrix={mockMatrix} />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n // Go down to second stack, then back up\n stdin.write(ARROW_DOWN);\n await delay(SELECT_NAV_DELAY_MS);\n stdin.write(ARROW_UP);\n await delay(SELECT_NAV_DELAY_MS);\n stdin.write(ENTER);\n await delay(SELECT_NAV_DELAY_MS);\n\n const { selectedStackId } = useWizardStore.getState();\n expect(selectedStackId).toBe(\"react-fullstack\");\n });\n\n it(\"should clamp at top boundary\", async () => {\n const { stdin, unmount } = render(<StepStack matrix={mockMatrix} />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n // Press up multiple times at the top (should stay at first stack)\n stdin.write(ARROW_UP);\n await delay(SELECT_NAV_DELAY_MS);\n stdin.write(ARROW_UP);\n await delay(SELECT_NAV_DELAY_MS);\n stdin.write(ENTER);\n await delay(SELECT_NAV_DELAY_MS);\n\n const { selectedStackId } = useWizardStore.getState();\n expect(selectedStackId).toBe(\"react-fullstack\");\n });\n\n it(\"should clamp at bottom boundary\", async () => {\n const { stdin, unmount } = render(<StepStack matrix={mockMatrix} />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n // Press down many times past the end (should stay at last stack)\n stdin.write(ARROW_DOWN);\n await delay(SELECT_NAV_DELAY_MS);\n stdin.write(ARROW_DOWN);\n await delay(SELECT_NAV_DELAY_MS);\n stdin.write(ARROW_DOWN);\n await delay(SELECT_NAV_DELAY_MS);\n stdin.write(ENTER);\n await delay(SELECT_NAV_DELAY_MS);\n\n const { selectedStackId } = useWizardStore.getState();\n expect(selectedStackId).toBe(\"react-minimal\");\n });\n });\n\n describe(\"empty state\", () => {\n it(\"should render header with no stacks available\", () => {\n const emptyMatrix = createMockMatrix({}, { suggestedStacks: [] });\n\n const { lastFrame, unmount } = render(<StepStack matrix={emptyMatrix} />);\n cleanup = unmount;\n\n const output = lastFrame();\n // Should still render the header\n expect(output).toContain(\"Select a pre-built template\");\n });\n\n it(\"should not render keyboard hints when no stacks\", () => {\n const emptyMatrix = createMockMatrix({}, { suggestedStacks: [] });\n\n const { lastFrame, unmount } = render(<StepStack matrix={emptyMatrix} />);\n cleanup = unmount;\n\n const output = lastFrame();\n // No keyboard hints when there are no stack cards\n expect(output).not.toContain(\"ENTER\");\n });\n\n it(\"should still allow Escape to go back with no stacks\", async () => {\n const emptyMatrix = createMockMatrix({}, { suggestedStacks: [] });\n\n // Set up history\n useWizardStore.getState().setStep(\"stack\");\n\n const { stdin, unmount } = render(<StepStack matrix={emptyMatrix} />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n stdin.write(ESCAPE);\n await delay(SELECT_NAV_DELAY_MS);\n\n const { step } = useWizardStore.getState();\n expect(step).toBe(\"approach\");\n });\n });\n });\n\n describe(\"domain selection mode\", () => {\n beforeEach(() => {\n // Set approach to \"scratch\" for domain selection mode\n useWizardStore.getState().setApproach(\"scratch\");\n });\n\n describe(\"rendering\", () => {\n it(\"should render domain options\", () => {\n const { lastFrame, unmount } = render(<StepStack matrix={mockMatrix} />);\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Web\");\n expect(output).toContain(\"Web Extras\");\n expect(output).toContain(\"API\");\n expect(output).toContain(\"CLI\");\n // Mobile may be scrolled below the visible window due to the Select component's viewport limit\n });\n\n it(\"should render header text for domain selection\", () => {\n const { lastFrame, unmount } = render(<StepStack matrix={mockMatrix} />);\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Select domains to configure\");\n });\n\n it(\"should show domain descriptions\", () => {\n const { lastFrame, unmount } = render(<StepStack matrix={mockMatrix} />);\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Frontend web applications\");\n expect(output).toContain(\"Backend APIs\");\n });\n });\n\n describe(\"domain selection\", () => {\n it(\"should toggle domain when selected\", async () => {\n const { stdin, unmount } = render(<StepStack matrix={mockMatrix} />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n // Navigate down to first domain (Web) and select\n stdin.write(ARROW_DOWN);\n await delay(SELECT_NAV_DELAY_MS);\n stdin.write(ENTER);\n await delay(SELECT_NAV_DELAY_MS);\n\n const { selectedDomains } = useWizardStore.getState();\n expect(selectedDomains).toContain(\"web\");\n });\n\n it(\"should allow multiple domain selection\", async () => {\n const { stdin, unmount } = render(<StepStack matrix={mockMatrix} />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n // Select Web - toggle domains are tracked in store even if UI doesn't refresh\n stdin.write(ARROW_DOWN);\n await delay(SELECT_NAV_DELAY_MS);\n stdin.write(ENTER);\n await delay(SELECT_NAV_DELAY_MS);\n\n // Check first domain selected\n expect(useWizardStore.getState().selectedDomains).toContain(\"web\");\n\n // Note: The second selection would need the Select to re-render\n // For now, verify the store correctly updates by toggling directly\n useWizardStore.getState().toggleDomain(\"api\");\n\n const { selectedDomains } = useWizardStore.getState();\n expect(selectedDomains).toContain(\"web\");\n expect(selectedDomains).toContain(\"api\");\n });\n\n it(\"should show selected domains summary when domains selected\", async () => {\n // Pre-select a domain\n useWizardStore.getState().toggleDomain(\"web\");\n\n const { lastFrame, unmount } = render(<StepStack matrix={mockMatrix} />);\n cleanup = unmount;\n\n const output = lastFrame();\n // The selected summary should show at the bottom\n expect(output).toContain(\"Selected:\");\n expect(output).toContain(\"web\");\n });\n\n it(\"should navigate to build step when continuing\", async () => {\n // Pre-select a domain\n useWizardStore.getState().toggleDomain(\"web\");\n\n const { stdin, unmount } = render(<StepStack matrix={mockMatrix} />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n // Navigate to continue option (last option)\n for (let i = 0; i < 6; i++) {\n stdin.write(ARROW_DOWN);\n await delay(SELECT_NAV_DELAY_MS);\n }\n stdin.write(ENTER);\n await delay(SELECT_NAV_DELAY_MS);\n\n const { step } = useWizardStore.getState();\n expect(step).toBe(\"build\");\n });\n });\n\n describe(\"back navigation\", () => {\n it(\"should go back when selecting back option\", async () => {\n useWizardStore.getState().setStep(\"stack\");\n\n const { stdin, unmount } = render(<StepStack matrix={mockMatrix} />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n // First option is back\n stdin.write(ENTER);\n await delay(SELECT_NAV_DELAY_MS);\n\n const { step } = useWizardStore.getState();\n expect(step).toBe(\"approach\");\n });\n });\n });\n});\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/cli/components/wizard/step-stack.test.tsx"],"sourcesContent":["import { render } from \"ink-testing-library\";\nimport { afterEach, beforeEach, describe, expect, it } from \"vitest\";\nimport { StepStack } from \"./step-stack\";\nimport { useWizardStore } from \"../../stores/wizard-store\";\nimport {\n createMockCategory,\n createMockMatrix,\n createMockResolvedStack,\n createMockSkill,\n} from \"../../lib/__tests__/helpers\";\n\nimport type { MergedSkillsMatrix } from \"../../types\";\nimport {\n ARROW_DOWN,\n ARROW_UP,\n ENTER,\n ESCAPE,\n RENDER_DELAY_MS,\n SELECT_NAV_DELAY_MS,\n delay,\n} from \"../../lib/__tests__/test-constants\";\n\nconst createMockStackWithSkills = (): MergedSkillsMatrix => {\n const skills = {\n [\"web-framework-react\"]: createMockSkill(\"web-framework-react\", \"framework\", {\n description: \"React framework\",\n }),\n [\"web-state-zustand\"]: createMockSkill(\"web-state-zustand\", \"client-state\", {\n description: \"State management\",\n }),\n [\"api-framework-hono\"]: createMockSkill(\"api-framework-hono\", \"api\", {\n description: \"Web framework\",\n }),\n };\n\n const suggestedStacks = [\n createMockResolvedStack(\"react-fullstack\", \"React Fullstack\", {\n description: \"Full React stack with Zustand and Hono\",\n allSkillIds: [\"web-framework-react\", \"web-state-zustand\", \"api-framework-hono\"],\n }),\n createMockResolvedStack(\"react-minimal\", \"React Minimal\", {\n description: \"Minimal React setup\",\n allSkillIds: [\"web-framework-react\"],\n }),\n ];\n\n return createMockMatrix(skills, {\n suggestedStacks,\n categories: {\n framework: createMockCategory(\"framework\", \"Web\", {\n description: \"Web skills\",\n exclusive: false,\n }),\n api: createMockCategory(\"api\", \"API\", {\n description: \"API skills\",\n exclusive: false,\n order: 1,\n }),\n },\n });\n};\n\ndescribe(\"StepStack component\", () => {\n let cleanup: (() => void) | undefined;\n let mockMatrix: MergedSkillsMatrix;\n\n beforeEach(() => {\n useWizardStore.getState().reset();\n mockMatrix = createMockStackWithSkills();\n });\n\n afterEach(() => {\n cleanup?.();\n cleanup = undefined;\n });\n\n describe(\"stack selection mode\", () => {\n beforeEach(() => {\n // Set approach to \"stack\" for stack selection mode\n useWizardStore.getState().setApproach(\"stack\");\n });\n\n describe(\"rendering\", () => {\n it(\"should render stack options as cards\", () => {\n const { lastFrame, unmount } = render(<StepStack matrix={mockMatrix} />);\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"React Fullstack\");\n expect(output).toContain(\"React Minimal\");\n });\n\n it(\"should render focused stack description (only focused item shows description)\", () => {\n const { lastFrame, unmount } = render(<StepStack matrix={mockMatrix} />);\n cleanup = unmount;\n\n const output = lastFrame();\n // Only the focused (first) stack shows its description\n expect(output).toContain(\"Full React stack\");\n });\n\n it(\"should render ViewTitle for stack selection\", () => {\n const { lastFrame, unmount } = render(<StepStack matrix={mockMatrix} />);\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Select a stack\");\n });\n\n it(\"should render header text\", () => {\n const { lastFrame, unmount } = render(<StepStack matrix={mockMatrix} />);\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Select a stack\");\n });\n });\n\n describe(\"stack selection\", () => {\n it(\"should select first stack on Enter (focus starts at first card)\", async () => {\n const { stdin, unmount } = render(<StepStack matrix={mockMatrix} />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n // Focus starts at first stack card, press Enter to select\n stdin.write(ENTER);\n await delay(SELECT_NAV_DELAY_MS);\n\n const { step, selectedStackId } = useWizardStore.getState();\n expect(step).toBe(\"build\");\n expect(selectedStackId).toBe(\"react-fullstack\");\n });\n\n it(\"should select second stack when navigated to\", async () => {\n const { stdin, unmount } = render(<StepStack matrix={mockMatrix} />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n // Navigate down once to second stack card\n stdin.write(ARROW_DOWN);\n await delay(SELECT_NAV_DELAY_MS);\n stdin.write(ENTER);\n await delay(SELECT_NAV_DELAY_MS);\n\n const { selectedStackId } = useWizardStore.getState();\n expect(selectedStackId).toBe(\"react-minimal\");\n });\n });\n\n describe(\"back navigation\", () => {\n it(\"should go back when pressing Escape\", async () => {\n // First set up history by setting step to stack\n useWizardStore.getState().setStep(\"stack\");\n\n const { stdin, unmount } = render(<StepStack matrix={mockMatrix} />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n // Press Escape to go back\n stdin.write(ESCAPE);\n await delay(SELECT_NAV_DELAY_MS);\n\n const { step } = useWizardStore.getState();\n expect(step).toBe(\"approach\");\n });\n\n it(\"should maintain history when going back via Escape\", async () => {\n // Set up proper history\n const store = useWizardStore.getState();\n store.setApproach(\"stack\");\n store.setStep(\"stack\"); // This adds \"approach\" to history\n\n const { stdin, unmount } = render(<StepStack matrix={mockMatrix} />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n stdin.write(ESCAPE); // Press Escape to go back\n await delay(SELECT_NAV_DELAY_MS);\n\n const { step, history } = useWizardStore.getState();\n expect(step).toBe(\"approach\");\n expect(history).toEqual([]);\n });\n });\n\n describe(\"arrow key navigation\", () => {\n it(\"should navigate down to second stack card\", async () => {\n const { stdin, unmount } = render(<StepStack matrix={mockMatrix} />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n // Navigate down once to second stack card and select\n stdin.write(ARROW_DOWN);\n await delay(SELECT_NAV_DELAY_MS);\n stdin.write(ENTER);\n await delay(SELECT_NAV_DELAY_MS);\n\n const { selectedStackId } = useWizardStore.getState();\n expect(selectedStackId).toBe(\"react-minimal\");\n });\n\n it(\"should navigate down then up back to first stack\", async () => {\n const { stdin, unmount } = render(<StepStack matrix={mockMatrix} />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n // Go down to second stack, then back up\n stdin.write(ARROW_DOWN);\n await delay(SELECT_NAV_DELAY_MS);\n stdin.write(ARROW_UP);\n await delay(SELECT_NAV_DELAY_MS);\n stdin.write(ENTER);\n await delay(SELECT_NAV_DELAY_MS);\n\n const { selectedStackId } = useWizardStore.getState();\n expect(selectedStackId).toBe(\"react-fullstack\");\n });\n\n it(\"should clamp at top boundary\", async () => {\n const { stdin, unmount } = render(<StepStack matrix={mockMatrix} />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n // Press up multiple times at the top (should stay at first stack)\n stdin.write(ARROW_UP);\n await delay(SELECT_NAV_DELAY_MS);\n stdin.write(ARROW_UP);\n await delay(SELECT_NAV_DELAY_MS);\n stdin.write(ENTER);\n await delay(SELECT_NAV_DELAY_MS);\n\n const { selectedStackId } = useWizardStore.getState();\n expect(selectedStackId).toBe(\"react-fullstack\");\n });\n\n it(\"should clamp at bottom boundary\", async () => {\n const { stdin, unmount } = render(<StepStack matrix={mockMatrix} />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n // Press down many times past the end (should stay at last stack)\n stdin.write(ARROW_DOWN);\n await delay(SELECT_NAV_DELAY_MS);\n stdin.write(ARROW_DOWN);\n await delay(SELECT_NAV_DELAY_MS);\n stdin.write(ARROW_DOWN);\n await delay(SELECT_NAV_DELAY_MS);\n stdin.write(ENTER);\n await delay(SELECT_NAV_DELAY_MS);\n\n const { selectedStackId } = useWizardStore.getState();\n expect(selectedStackId).toBe(\"react-minimal\");\n });\n });\n\n describe(\"empty state\", () => {\n it(\"should render header with no stacks available\", () => {\n const emptyMatrix = createMockMatrix({}, { suggestedStacks: [] });\n\n const { lastFrame, unmount } = render(<StepStack matrix={emptyMatrix} />);\n cleanup = unmount;\n\n const output = lastFrame();\n // Should still render the header\n expect(output).toContain(\"Select a stack\");\n });\n\n it(\"should not render keyboard hints when no stacks\", () => {\n const emptyMatrix = createMockMatrix({}, { suggestedStacks: [] });\n\n const { lastFrame, unmount } = render(<StepStack matrix={emptyMatrix} />);\n cleanup = unmount;\n\n const output = lastFrame();\n // No keyboard hints when there are no stack cards\n expect(output).not.toContain(\"ENTER\");\n });\n\n it(\"should still allow Escape to go back with no stacks\", async () => {\n const emptyMatrix = createMockMatrix({}, { suggestedStacks: [] });\n\n // Set up history\n useWizardStore.getState().setStep(\"stack\");\n\n const { stdin, unmount } = render(<StepStack matrix={emptyMatrix} />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n stdin.write(ESCAPE);\n await delay(SELECT_NAV_DELAY_MS);\n\n const { step } = useWizardStore.getState();\n expect(step).toBe(\"approach\");\n });\n });\n });\n\n describe(\"domain selection mode\", () => {\n beforeEach(() => {\n // Set approach to \"scratch\" for domain selection mode\n useWizardStore.getState().setApproach(\"scratch\");\n });\n\n describe(\"rendering\", () => {\n it(\"should render domain options\", () => {\n const { lastFrame, unmount } = render(<StepStack matrix={mockMatrix} />);\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Web\");\n expect(output).toContain(\"Web Extras\");\n expect(output).toContain(\"API\");\n expect(output).toContain(\"CLI\");\n // Mobile may be scrolled below the visible window due to the Select component's viewport limit\n });\n\n it(\"should render header text for domain selection\", () => {\n const { lastFrame, unmount } = render(<StepStack matrix={mockMatrix} />);\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Select domains to configure\");\n });\n\n it(\"should show domain descriptions\", () => {\n const { lastFrame, unmount } = render(<StepStack matrix={mockMatrix} />);\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Frontend web applications\");\n expect(output).toContain(\"Backend APIs\");\n });\n });\n\n describe(\"domain selection\", () => {\n it(\"should toggle domain when selected\", async () => {\n const { stdin, unmount } = render(<StepStack matrix={mockMatrix} />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n // Navigate down to first domain (Web) and select\n stdin.write(ARROW_DOWN);\n await delay(SELECT_NAV_DELAY_MS);\n stdin.write(ENTER);\n await delay(SELECT_NAV_DELAY_MS);\n\n const { selectedDomains } = useWizardStore.getState();\n expect(selectedDomains).toContain(\"web\");\n });\n\n it(\"should allow multiple domain selection\", async () => {\n const { stdin, unmount } = render(<StepStack matrix={mockMatrix} />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n // Select Web - toggle domains are tracked in store even if UI doesn't refresh\n stdin.write(ARROW_DOWN);\n await delay(SELECT_NAV_DELAY_MS);\n stdin.write(ENTER);\n await delay(SELECT_NAV_DELAY_MS);\n\n // Check first domain selected\n expect(useWizardStore.getState().selectedDomains).toContain(\"web\");\n\n // Note: The second selection would need the Select to re-render\n // For now, verify the store correctly updates by toggling directly\n useWizardStore.getState().toggleDomain(\"api\");\n\n const { selectedDomains } = useWizardStore.getState();\n expect(selectedDomains).toContain(\"web\");\n expect(selectedDomains).toContain(\"api\");\n });\n\n it(\"should show selected domains summary when domains selected\", async () => {\n // Pre-select a domain\n useWizardStore.getState().toggleDomain(\"web\");\n\n const { lastFrame, unmount } = render(<StepStack matrix={mockMatrix} />);\n cleanup = unmount;\n\n const output = lastFrame();\n // The selected summary should show at the bottom\n expect(output).toContain(\"Selected:\");\n expect(output).toContain(\"web\");\n });\n\n it(\"should navigate to build step when continuing\", async () => {\n // Pre-select a domain\n useWizardStore.getState().toggleDomain(\"web\");\n\n const { stdin, unmount } = render(<StepStack matrix={mockMatrix} />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n // Navigate to continue option (last option)\n for (let i = 0; i < 6; i++) {\n stdin.write(ARROW_DOWN);\n await delay(SELECT_NAV_DELAY_MS);\n }\n stdin.write(ENTER);\n await delay(SELECT_NAV_DELAY_MS);\n\n const { step } = useWizardStore.getState();\n expect(step).toBe(\"build\");\n });\n });\n\n describe(\"back navigation\", () => {\n it(\"should go back when selecting back option\", async () => {\n useWizardStore.getState().setStep(\"stack\");\n\n const { stdin, unmount } = render(<StepStack matrix={mockMatrix} />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n // First option is back\n stdin.write(ENTER);\n await delay(SELECT_NAV_DELAY_MS);\n\n const { step } = useWizardStore.getState();\n expect(step).toBe(\"approach\");\n });\n });\n });\n});\n"],"mappings":"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","names":[]}
@@ -1,7 +1,8 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  ViewTitle
4
- } from "../../chunk-U7HFKR74.js";
4
+ } from "../../chunk-H2NM6BDH.js";
5
+ import "../../chunk-52XVP55K.js";
5
6
  import "../../chunk-AWKZ5BDL.js";
6
7
  export {
7
8
  ViewTitle
@@ -1,17 +1,15 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
- DefinitionItem,
4
- WizardFooter,
5
3
  WizardLayout
6
- } from "../../chunk-UEMRJI2K.js";
7
- import "../../chunk-3X5D7RM5.js";
8
- import "../../chunk-TMED5DQ2.js";
9
- import "../../chunk-HWD32NP7.js";
10
- import "../../chunk-O6ZTD7ZI.js";
4
+ } from "../../chunk-73E5CQUK.js";
5
+ import "../../chunk-RFW2RIM7.js";
6
+ import "../../chunk-JWIH7YQE.js";
7
+ import "../../chunk-DDNK5UNE.js";
8
+ import "../../chunk-ABK6CSWI.js";
9
+ import "../../chunk-5WIHSJRO.js";
10
+ import "../../chunk-52XVP55K.js";
11
11
  import "../../chunk-AWKZ5BDL.js";
12
12
  export {
13
- DefinitionItem,
14
- WizardFooter,
15
13
  WizardLayout
16
14
  };
17
15
  //# sourceMappingURL=wizard-layout.js.map
@@ -2,7 +2,8 @@
2
2
  import {
3
3
  WIZARD_STEPS,
4
4
  WizardTabs
5
- } from "../../chunk-3X5D7RM5.js";
5
+ } from "../../chunk-RFW2RIM7.js";
6
+ import "../../chunk-52XVP55K.js";
6
7
  import "../../chunk-AWKZ5BDL.js";
7
8
  export {
8
9
  WIZARD_STEPS,
@@ -11,7 +11,8 @@ import {
11
11
  import {
12
12
  WIZARD_STEPS,
13
13
  WizardTabs
14
- } from "../../chunk-3X5D7RM5.js";
14
+ } from "../../chunk-RFW2RIM7.js";
15
+ import "../../chunk-52XVP55K.js";
15
16
  import {
16
17
  init_esm_shims
17
18
  } from "../../chunk-AWKZ5BDL.js";
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/cli/components/wizard/wizard-tabs.test.tsx"],"sourcesContent":["import React from \"react\";\nimport { render } from \"ink-testing-library\";\nimport { afterEach, describe, expect, it } from \"vitest\";\nimport { WizardTabs, WIZARD_STEPS, type WizardTabsProps } from \"./wizard-tabs\";\n\nconst renderWizardTabs = (props: Partial<WizardTabsProps> = {}) => {\n const defaultProps: WizardTabsProps = {\n steps: WIZARD_STEPS,\n currentStep: \"approach\",\n completedSteps: [],\n skippedSteps: [],\n ...props,\n };\n return render(<WizardTabs {...defaultProps} />);\n};\n\ndescribe(\"WizardTabs component\", () => {\n let cleanup: (() => void) | undefined;\n\n afterEach(() => {\n cleanup?.();\n cleanup = undefined;\n });\n\n describe(\"rendering\", () => {\n it(\"should render all 5 tabs\", () => {\n const { lastFrame, unmount } = renderWizardTabs();\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"[1] Intro\");\n expect(output).toContain(\"[2] Stack\");\n expect(output).toContain(\"[3] Build\");\n expect(output).toContain(\"[4] Sources\");\n expect(output).toContain(\"[5] Confirm\");\n });\n\n it(\"should render all step numbers\", () => {\n const { lastFrame, unmount } = renderWizardTabs();\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"[1]\");\n expect(output).toContain(\"[2]\");\n expect(output).toContain(\"[3]\");\n expect(output).toContain(\"[4]\");\n expect(output).toContain(\"[5]\");\n });\n\n it(\"should render with custom steps\", () => {\n const customSteps = [\n { id: \"one\", label: \"First\", number: 1 },\n { id: \"two\", label: \"Second\", number: 2 },\n ];\n const { lastFrame, unmount } = renderWizardTabs({\n steps: customSteps,\n currentStep: \"one\",\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"[1] First\");\n expect(output).toContain(\"[2] Second\");\n expect(output).not.toContain(\"Intro\");\n });\n\n it(\"should render horizontal dividers above and below tabs\", () => {\n const { lastFrame, unmount } = renderWizardTabs();\n cleanup = unmount;\n\n const output = lastFrame();\n // The divider uses Unicode horizontal line character (U+2500)\n expect(output).toContain(\"\\u2500\");\n });\n });\n\n describe(\"current step\", () => {\n it(\"should render current step label\", () => {\n const { lastFrame, unmount } = renderWizardTabs({\n currentStep: \"build\",\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // Current step should be rendered with its label\n expect(output).toContain(\"[3] Build\");\n });\n\n it(\"should mark first step as current by default\", () => {\n const { lastFrame, unmount } = renderWizardTabs({\n currentStep: \"approach\",\n completedSteps: [],\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"[1] Intro\");\n });\n\n it(\"should update current step when changed\", () => {\n const { lastFrame, unmount } = renderWizardTabs({\n currentStep: \"confirm\",\n completedSteps: [\"approach\", \"stack\", \"build\"],\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // Should show confirm step\n expect(output).toContain(\"[5] Confirm\");\n });\n });\n\n describe(\"completed steps\", () => {\n it(\"should render completed step labels\", () => {\n const { lastFrame, unmount } = renderWizardTabs({\n currentStep: \"stack\",\n completedSteps: [\"approach\"],\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"[1] Intro\");\n });\n\n it(\"should render multiple completed steps\", () => {\n const { lastFrame, unmount } = renderWizardTabs({\n currentStep: \"build\",\n completedSteps: [\"approach\", \"stack\"],\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"[1] Intro\");\n expect(output).toContain(\"[2] Stack\");\n });\n\n it(\"should render current step separately from completed steps\", () => {\n const { lastFrame, unmount } = renderWizardTabs({\n currentStep: \"approach\",\n completedSteps: [],\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // Should contain approach tab\n expect(output).toContain(\"[1] Intro\");\n });\n });\n\n describe(\"pending steps\", () => {\n it(\"should render pending step labels\", () => {\n const { lastFrame, unmount } = renderWizardTabs({\n currentStep: \"approach\",\n completedSteps: [],\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // Pending steps should still be visible\n expect(output).toContain(\"[2] Stack\");\n expect(output).toContain(\"[3] Build\");\n });\n\n it(\"should render steps after current\", () => {\n const { lastFrame, unmount } = renderWizardTabs({\n currentStep: \"build\",\n completedSteps: [\"approach\", \"stack\"],\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // Pending step (confirm) should be rendered\n expect(output).toContain(\"[5] Confirm\");\n });\n });\n\n describe(\"skipped steps\", () => {\n it(\"should render skipped step labels\", () => {\n const { lastFrame, unmount } = renderWizardTabs({\n currentStep: \"build\",\n completedSteps: [\"approach\"],\n skippedSteps: [\"stack\"],\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // Skipped step should still be rendered\n expect(output).toContain(\"[2] Stack\");\n });\n\n it(\"should handle multiple skipped steps\", () => {\n const { lastFrame, unmount } = renderWizardTabs({\n currentStep: \"confirm\",\n completedSteps: [\"approach\", \"build\"],\n skippedSteps: [\"stack\"],\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"[2] Stack\");\n });\n\n it(\"should prioritize completed over skipped when step is in both arrays\", () => {\n // Completed takes precedence over skipped\n const { lastFrame, unmount } = renderWizardTabs({\n currentStep: \"build\",\n completedSteps: [\"approach\", \"stack\"],\n skippedSteps: [\"stack\"], // Also in skipped\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // Should render both - completed status takes precedence visually\n expect(output).toContain(\"[1] Intro\");\n expect(output).toContain(\"[2] Stack\");\n });\n });\n\n describe(\"state priority\", () => {\n it(\"should prioritize completed over current\", () => {\n const { lastFrame, unmount } = renderWizardTabs({\n currentStep: \"approach\",\n completedSteps: [\"approach\"],\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // Should render approach - completed takes precedence\n expect(output).toContain(\"[1] Intro\");\n });\n\n it(\"should prioritize current over skipped\", () => {\n const { lastFrame, unmount } = renderWizardTabs({\n currentStep: \"stack\",\n completedSteps: [],\n skippedSteps: [\"stack\"], // Also current\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // Should render stack - current takes precedence over skipped\n expect(output).toContain(\"[2] Stack\");\n });\n\n it(\"should prioritize completed over skipped\", () => {\n const { lastFrame, unmount } = renderWizardTabs({\n currentStep: \"build\",\n completedSteps: [\"approach\"],\n skippedSteps: [\"approach\"], // Also completed\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // Should render approach - completed takes precedence\n expect(output).toContain(\"[1] Intro\");\n });\n });\n\n describe(\"visual layout\", () => {\n it(\"should render tabs horizontally\", () => {\n const { lastFrame, unmount } = renderWizardTabs();\n cleanup = unmount;\n\n const output = lastFrame();\n // All tabs should be in the output\n expect(output).toContain(\"Intro\");\n expect(output).toContain(\"Confirm\");\n });\n\n it(\"should include step labels\", () => {\n const { lastFrame, unmount } = renderWizardTabs();\n cleanup = unmount;\n\n const output = lastFrame();\n WIZARD_STEPS.forEach((step) => {\n expect(output).toContain(step.label);\n });\n });\n });\n\n describe(\"edge cases\", () => {\n it(\"should handle empty completed steps\", () => {\n const { lastFrame, unmount } = renderWizardTabs({\n currentStep: \"approach\",\n completedSteps: [],\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // Should still render all tabs\n expect(output).toContain(\"[1] Intro\");\n expect(output).toContain(\"[5] Confirm\");\n });\n\n it(\"should handle empty skipped steps\", () => {\n const { lastFrame, unmount } = renderWizardTabs({\n currentStep: \"build\",\n completedSteps: [\"approach\", \"stack\"],\n skippedSteps: [],\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // Should render all tabs\n expect(output).toContain(\"[1] Intro\");\n expect(output).toContain(\"[2] Stack\");\n expect(output).toContain(\"[3] Build\");\n });\n\n it(\"should handle all steps completed\", () => {\n const { lastFrame, unmount } = renderWizardTabs({\n currentStep: \"confirm\",\n completedSteps: [\"approach\", \"stack\", \"build\", \"confirm\"],\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // All 4 tabs should be rendered\n expect(output).toContain(\"[1] Intro\");\n expect(output).toContain(\"[2] Stack\");\n expect(output).toContain(\"[3] Build\");\n expect(output).toContain(\"[5] Confirm\");\n });\n\n it(\"should handle single step\", () => {\n const singleStep = [{ id: \"only\", label: \"Only Step\", number: 1 }];\n const { lastFrame, unmount } = renderWizardTabs({\n steps: singleStep,\n currentStep: \"only\",\n completedSteps: [],\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"[1] Only Step\");\n });\n });\n});\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/cli/components/wizard/wizard-tabs.test.tsx"],"sourcesContent":["import { render } from \"ink-testing-library\";\nimport { afterEach, describe, expect, it } from \"vitest\";\nimport { WizardTabs, WIZARD_STEPS, type WizardTabsProps } from \"./wizard-tabs\";\n\nconst renderWizardTabs = (props: Partial<WizardTabsProps> = {}) => {\n const defaultProps: WizardTabsProps = {\n steps: WIZARD_STEPS,\n currentStep: \"approach\",\n completedSteps: [],\n skippedSteps: [],\n ...props,\n };\n return render(<WizardTabs {...defaultProps} />);\n};\n\ndescribe(\"WizardTabs component\", () => {\n let cleanup: (() => void) | undefined;\n\n afterEach(() => {\n cleanup?.();\n cleanup = undefined;\n });\n\n describe(\"rendering\", () => {\n it(\"should render all 5 tabs\", () => {\n const { lastFrame, unmount } = renderWizardTabs();\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"[1] Intro\");\n expect(output).toContain(\"[2] Stack\");\n expect(output).toContain(\"[3] Build\");\n expect(output).toContain(\"[4] Sources\");\n expect(output).toContain(\"[5] Confirm\");\n });\n\n it(\"should render all step numbers\", () => {\n const { lastFrame, unmount } = renderWizardTabs();\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"[1]\");\n expect(output).toContain(\"[2]\");\n expect(output).toContain(\"[3]\");\n expect(output).toContain(\"[4]\");\n expect(output).toContain(\"[5]\");\n });\n\n it(\"should render with custom steps\", () => {\n const customSteps = [\n { id: \"one\", label: \"First\", number: 1 },\n { id: \"two\", label: \"Second\", number: 2 },\n ];\n const { lastFrame, unmount } = renderWizardTabs({\n steps: customSteps,\n currentStep: \"one\",\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"[1] First\");\n expect(output).toContain(\"[2] Second\");\n expect(output).not.toContain(\"Intro\");\n });\n\n it(\"should render horizontal dividers above and below tabs\", () => {\n const { lastFrame, unmount } = renderWizardTabs();\n cleanup = unmount;\n\n const output = lastFrame();\n // The divider uses Unicode horizontal line character (U+2500)\n expect(output).toContain(\"\\u2500\");\n });\n });\n\n describe(\"current step\", () => {\n it(\"should render current step label\", () => {\n const { lastFrame, unmount } = renderWizardTabs({\n currentStep: \"build\",\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // Current step should be rendered with its label\n expect(output).toContain(\"[3] Build\");\n });\n\n it(\"should mark first step as current by default\", () => {\n const { lastFrame, unmount } = renderWizardTabs({\n currentStep: \"approach\",\n completedSteps: [],\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"[1] Intro\");\n });\n\n it(\"should update current step when changed\", () => {\n const { lastFrame, unmount } = renderWizardTabs({\n currentStep: \"confirm\",\n completedSteps: [\"approach\", \"stack\", \"build\"],\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // Should show confirm step\n expect(output).toContain(\"[5] Confirm\");\n });\n });\n\n describe(\"completed steps\", () => {\n it(\"should render completed step labels\", () => {\n const { lastFrame, unmount } = renderWizardTabs({\n currentStep: \"stack\",\n completedSteps: [\"approach\"],\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"[1] Intro\");\n });\n\n it(\"should render multiple completed steps\", () => {\n const { lastFrame, unmount } = renderWizardTabs({\n currentStep: \"build\",\n completedSteps: [\"approach\", \"stack\"],\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"[1] Intro\");\n expect(output).toContain(\"[2] Stack\");\n });\n\n it(\"should render current step separately from completed steps\", () => {\n const { lastFrame, unmount } = renderWizardTabs({\n currentStep: \"approach\",\n completedSteps: [],\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // Should contain approach tab\n expect(output).toContain(\"[1] Intro\");\n });\n });\n\n describe(\"pending steps\", () => {\n it(\"should render pending step labels\", () => {\n const { lastFrame, unmount } = renderWizardTabs({\n currentStep: \"approach\",\n completedSteps: [],\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // Pending steps should still be visible\n expect(output).toContain(\"[2] Stack\");\n expect(output).toContain(\"[3] Build\");\n });\n\n it(\"should render steps after current\", () => {\n const { lastFrame, unmount } = renderWizardTabs({\n currentStep: \"build\",\n completedSteps: [\"approach\", \"stack\"],\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // Pending step (confirm) should be rendered\n expect(output).toContain(\"[5] Confirm\");\n });\n });\n\n describe(\"skipped steps\", () => {\n it(\"should render skipped step labels\", () => {\n const { lastFrame, unmount } = renderWizardTabs({\n currentStep: \"build\",\n completedSteps: [\"approach\"],\n skippedSteps: [\"stack\"],\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // Skipped step should still be rendered\n expect(output).toContain(\"[2] Stack\");\n });\n\n it(\"should handle multiple skipped steps\", () => {\n const { lastFrame, unmount } = renderWizardTabs({\n currentStep: \"confirm\",\n completedSteps: [\"approach\", \"build\"],\n skippedSteps: [\"stack\"],\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"[2] Stack\");\n });\n\n it(\"should prioritize completed over skipped when step is in both arrays\", () => {\n // Completed takes precedence over skipped\n const { lastFrame, unmount } = renderWizardTabs({\n currentStep: \"build\",\n completedSteps: [\"approach\", \"stack\"],\n skippedSteps: [\"stack\"], // Also in skipped\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // Should render both - completed status takes precedence visually\n expect(output).toContain(\"[1] Intro\");\n expect(output).toContain(\"[2] Stack\");\n });\n });\n\n describe(\"state priority\", () => {\n it(\"should prioritize completed over current\", () => {\n const { lastFrame, unmount } = renderWizardTabs({\n currentStep: \"approach\",\n completedSteps: [\"approach\"],\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // Should render approach - completed takes precedence\n expect(output).toContain(\"[1] Intro\");\n });\n\n it(\"should prioritize current over skipped\", () => {\n const { lastFrame, unmount } = renderWizardTabs({\n currentStep: \"stack\",\n completedSteps: [],\n skippedSteps: [\"stack\"], // Also current\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // Should render stack - current takes precedence over skipped\n expect(output).toContain(\"[2] Stack\");\n });\n\n it(\"should prioritize completed over skipped\", () => {\n const { lastFrame, unmount } = renderWizardTabs({\n currentStep: \"build\",\n completedSteps: [\"approach\"],\n skippedSteps: [\"approach\"], // Also completed\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // Should render approach - completed takes precedence\n expect(output).toContain(\"[1] Intro\");\n });\n });\n\n describe(\"visual layout\", () => {\n it(\"should render tabs horizontally\", () => {\n const { lastFrame, unmount } = renderWizardTabs();\n cleanup = unmount;\n\n const output = lastFrame();\n // All tabs should be in the output\n expect(output).toContain(\"Intro\");\n expect(output).toContain(\"Confirm\");\n });\n\n it(\"should include step labels\", () => {\n const { lastFrame, unmount } = renderWizardTabs();\n cleanup = unmount;\n\n const output = lastFrame();\n WIZARD_STEPS.forEach((step) => {\n expect(output).toContain(step.label);\n });\n });\n });\n\n describe(\"edge cases\", () => {\n it(\"should handle empty completed steps\", () => {\n const { lastFrame, unmount } = renderWizardTabs({\n currentStep: \"approach\",\n completedSteps: [],\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // Should still render all tabs\n expect(output).toContain(\"[1] Intro\");\n expect(output).toContain(\"[5] Confirm\");\n });\n\n it(\"should handle empty skipped steps\", () => {\n const { lastFrame, unmount } = renderWizardTabs({\n currentStep: \"build\",\n completedSteps: [\"approach\", \"stack\"],\n skippedSteps: [],\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // Should render all tabs\n expect(output).toContain(\"[1] Intro\");\n expect(output).toContain(\"[2] Stack\");\n expect(output).toContain(\"[3] Build\");\n });\n\n it(\"should handle all steps completed\", () => {\n const { lastFrame, unmount } = renderWizardTabs({\n currentStep: \"confirm\",\n completedSteps: [\"approach\", \"stack\", \"build\", \"confirm\"],\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // All 4 tabs should be rendered\n expect(output).toContain(\"[1] Intro\");\n expect(output).toContain(\"[2] Stack\");\n expect(output).toContain(\"[3] Build\");\n expect(output).toContain(\"[5] Confirm\");\n });\n\n it(\"should handle single step\", () => {\n const singleStep = [{ id: \"only\", label: \"Only Step\", number: 1 }];\n const { lastFrame, unmount } = renderWizardTabs({\n steps: singleStep,\n currentStep: \"only\",\n completedSteps: [],\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"[1] Only Step\");\n });\n });\n});\n"],"mappings":"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","names":[]}
@@ -1,27 +1,33 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  Wizard
4
- } from "../../chunk-HIQGK5XJ.js";
5
- import "../../chunk-G35SYE6Z.js";
6
- import "../../chunk-XENOESJZ.js";
7
- import "../../chunk-UEMRJI2K.js";
8
- import "../../chunk-3X5D7RM5.js";
9
- import "../../chunk-2YMMJP4Z.js";
10
- import "../../chunk-VVYNZZUX.js";
4
+ } from "../../chunk-JDQDYGGC.js";
5
+ import "../../chunk-73E5CQUK.js";
6
+ import "../../chunk-RFW2RIM7.js";
7
+ import "../../chunk-Z6UK6MI2.js";
8
+ import "../../chunk-J3J2WPI2.js";
9
+ import "../../chunk-VBOBVQQW.js";
10
+ import "../../chunk-HJS2FWLA.js";
11
+ import "../../chunk-4JSKL5SD.js";
12
+ import "../../chunk-PRY6MLN3.js";
13
+ import "../../chunk-H2NM6BDH.js";
14
+ import "../../chunk-DTFEFLUU.js";
11
15
  import "../../chunk-V2ZIH7HV.js";
12
- import "../../chunk-2OW7FCIF.js";
13
- import "../../chunk-ZW2PELOH.js";
14
- import "../../chunk-4S4FCAA2.js";
15
- import "../../chunk-KWYO3M5Q.js";
16
- import "../../chunk-U7HFKR74.js";
17
- import "../../chunk-H7SSBSPR.js";
18
- import "../../chunk-ETCVEV3S.js";
19
- import "../../chunk-UNN7523L.js";
20
- import "../../chunk-TMED5DQ2.js";
21
- import "../../chunk-CQ7657GA.js";
22
- import "../../chunk-324DM2L6.js";
23
- import "../../chunk-HWD32NP7.js";
24
- import "../../chunk-O6ZTD7ZI.js";
16
+ import "../../chunk-DALU3Y3U.js";
17
+ import "../../chunk-JWIH7YQE.js";
18
+ import "../../chunk-LY5HM34M.js";
19
+ import "../../chunk-AGNT3FUE.js";
20
+ import "../../chunk-DIRH4PDF.js";
21
+ import "../../chunk-KFL72CWK.js";
22
+ import "../../chunk-7ICBJZV2.js";
23
+ import "../../chunk-VIBOSHRL.js";
24
+ import "../../chunk-WPED6CL3.js";
25
+ import "../../chunk-F23LEXMC.js";
26
+ import "../../chunk-RXC7AF7N.js";
27
+ import "../../chunk-DDNK5UNE.js";
28
+ import "../../chunk-ABK6CSWI.js";
29
+ import "../../chunk-5WIHSJRO.js";
30
+ import "../../chunk-52XVP55K.js";
25
31
  import "../../chunk-AWKZ5BDL.js";
26
32
  export {
27
33
  Wizard
@@ -1,4 +1,4 @@
1
- # yaml-language-server: $schema=../src/schemas/skills-matrix.schema.json
1
+ # yaml-language-server: $schema=https://raw.githubusercontent.com/claude-collective/cli/main/src/schemas/skills-matrix.schema.json
2
2
  # =============================================================================
3
3
  # skills-matrix.yaml
4
4
  # Full skills matrix for CLI data-driven architecture