@claude-collective/cli 0.21.0 → 0.25.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (292) hide show
  1. package/CHANGELOG.md +174 -0
  2. package/README.md +41 -27
  3. package/config/skills-matrix.yaml +38 -37
  4. package/config/stacks.yaml +8 -14
  5. package/dist/{chunk-ZNIDWLL5.js → chunk-3X5D7RM5.js} +4 -3
  6. package/dist/chunk-3X5D7RM5.js.map +1 -0
  7. package/dist/chunk-4S4FCAA2.js +100 -0
  8. package/dist/chunk-4S4FCAA2.js.map +1 -0
  9. package/dist/chunk-4WGN6SUE.js +197 -0
  10. package/dist/chunk-4WGN6SUE.js.map +1 -0
  11. package/dist/{chunk-DHET7RCE.js → chunk-AWKZ5BDL.js} +9 -2
  12. package/dist/{chunk-DHET7RCE.js.map → chunk-AWKZ5BDL.js.map} +1 -1
  13. package/dist/{chunk-6Q3Y7KVB.js → chunk-DBRUQQUF.js} +8 -2
  14. package/dist/chunk-DBRUQQUF.js.map +1 -0
  15. package/dist/{chunk-OQYYMQJR.js → chunk-ETCVEV3S.js} +8 -11
  16. package/dist/chunk-ETCVEV3S.js.map +1 -0
  17. package/dist/{chunk-ZSVMS677.js → chunk-F4RD5FYM.js} +2 -2
  18. package/dist/chunk-F4RD5FYM.js.map +1 -0
  19. package/dist/{chunk-5KXUDHAB.js → chunk-GGFOD5PK.js} +6 -9
  20. package/dist/chunk-GGFOD5PK.js.map +1 -0
  21. package/dist/{chunk-UMORK7OK.js → chunk-H7SSBSPR.js} +2 -2
  22. package/dist/chunk-H7SSBSPR.js.map +1 -0
  23. package/dist/chunk-HWD32NP7.js +19 -0
  24. package/dist/chunk-HWD32NP7.js.map +1 -0
  25. package/dist/{chunk-HGCBZUH5.js → chunk-IAYAE6MG.js} +9 -10
  26. package/dist/chunk-IAYAE6MG.js.map +1 -0
  27. package/dist/{chunk-RTE64SJA.js → chunk-IXBCRT3F.js} +2 -2
  28. package/dist/chunk-IXBCRT3F.js.map +1 -0
  29. package/dist/{chunk-WFEFICFM.js → chunk-KWYO3M5Q.js} +5 -5
  30. package/dist/chunk-KWYO3M5Q.js.map +1 -0
  31. package/dist/{chunk-HEOHU5EZ.js → chunk-MCTSHLAF.js} +22 -11
  32. package/dist/chunk-MCTSHLAF.js.map +1 -0
  33. package/dist/chunk-MH66WDFV.js +251 -0
  34. package/dist/chunk-MH66WDFV.js.map +1 -0
  35. package/dist/{chunk-2LSGX6R4.js → chunk-MTPM7BX5.js} +83 -25
  36. package/dist/chunk-MTPM7BX5.js.map +1 -0
  37. package/dist/chunk-NQJ47R4N.js +1092 -0
  38. package/dist/chunk-NQJ47R4N.js.map +1 -0
  39. package/dist/chunk-NRC7XYCI.js +211 -0
  40. package/dist/chunk-NRC7XYCI.js.map +1 -0
  41. package/dist/{chunk-FJFEKPXF.js → chunk-O6ZTD7ZI.js} +14 -3
  42. package/dist/chunk-O6ZTD7ZI.js.map +1 -0
  43. package/dist/chunk-OBXAY23Y.js +56 -0
  44. package/dist/chunk-OBXAY23Y.js.map +1 -0
  45. package/dist/{chunk-XY3XDVMI.js → chunk-QR2EBWL2.js} +3 -3
  46. package/dist/{chunk-66UDJBF6.js → chunk-REJGRCVQ.js} +2 -2
  47. package/dist/{chunk-CBLPAMZO.js → chunk-TMED5DQ2.js} +68 -42
  48. package/dist/chunk-TMED5DQ2.js.map +1 -0
  49. package/dist/{chunk-Q3J43SF3.js → chunk-U7HFKR74.js} +2 -2
  50. package/dist/chunk-U7HFKR74.js.map +1 -0
  51. package/dist/{chunk-3EHUF54X.js → chunk-UEMRJI2K.js} +17 -4
  52. package/dist/chunk-UEMRJI2K.js.map +1 -0
  53. package/dist/{chunk-Z2CWURZ6.js → chunk-UNN7523L.js} +2 -2
  54. package/dist/chunk-V2ZIH7HV.js +29 -0
  55. package/dist/chunk-V2ZIH7HV.js.map +1 -0
  56. package/dist/{chunk-ZEI3ZUDU.js → chunk-VVYNZZUX.js} +7 -15
  57. package/dist/chunk-VVYNZZUX.js.map +1 -0
  58. package/dist/chunk-WXS4S3MA.js +220 -0
  59. package/dist/chunk-WXS4S3MA.js.map +1 -0
  60. package/dist/{chunk-A46TPNBJ.js → chunk-XENOESJZ.js} +7 -16
  61. package/dist/chunk-XENOESJZ.js.map +1 -0
  62. package/dist/chunk-YDBSSAJ6.js +4207 -0
  63. package/dist/chunk-YDBSSAJ6.js.map +1 -0
  64. package/dist/chunk-ZDREFYD2.js +696 -0
  65. package/dist/chunk-ZDREFYD2.js.map +1 -0
  66. package/dist/chunk-ZW2PELOH.js +197 -0
  67. package/dist/chunk-ZW2PELOH.js.map +1 -0
  68. package/dist/cli/defaults/agent-mappings.yaml +0 -1
  69. package/dist/commands/build/marketplace.js +15 -13
  70. package/dist/commands/build/marketplace.js.map +1 -1
  71. package/dist/commands/build/plugins.js +13 -229
  72. package/dist/commands/build/plugins.js.map +1 -1
  73. package/dist/commands/build/stack.js +11 -18
  74. package/dist/commands/build/stack.js.map +1 -1
  75. package/dist/commands/compile.js +36 -58
  76. package/dist/commands/compile.js.map +1 -1
  77. package/dist/commands/config/get.js +8 -8
  78. package/dist/commands/config/get.js.map +1 -1
  79. package/dist/commands/config/index.js +7 -7
  80. package/dist/commands/config/index.js.map +1 -1
  81. package/dist/commands/config/path.js +6 -6
  82. package/dist/commands/config/path.js.map +1 -1
  83. package/dist/commands/config/set-project.js +8 -8
  84. package/dist/commands/config/set-project.js.map +1 -1
  85. package/dist/commands/config/show.js +7 -7
  86. package/dist/commands/config/unset-project.js +8 -8
  87. package/dist/commands/config/unset-project.js.map +1 -1
  88. package/dist/commands/diff.js +10 -16
  89. package/dist/commands/diff.js.map +1 -1
  90. package/dist/commands/doctor.js +18 -51
  91. package/dist/commands/doctor.js.map +1 -1
  92. package/dist/commands/edit.js +87 -57
  93. package/dist/commands/edit.js.map +1 -1
  94. package/dist/commands/eject.js +17 -49
  95. package/dist/commands/eject.js.map +1 -1
  96. package/dist/commands/import/skill.js +26 -26
  97. package/dist/commands/import/skill.js.map +1 -1
  98. package/dist/commands/info.js +15 -17
  99. package/dist/commands/info.js.map +1 -1
  100. package/dist/commands/init.js +45 -722
  101. package/dist/commands/init.js.map +1 -1
  102. package/dist/commands/list.js +8 -87
  103. package/dist/commands/list.js.map +1 -1
  104. package/dist/commands/new/agent.js +8 -12
  105. package/dist/commands/new/agent.js.map +1 -1
  106. package/dist/commands/new/skill.js +6 -6
  107. package/dist/commands/new/skill.js.map +1 -1
  108. package/dist/commands/outdated.js +15 -19
  109. package/dist/commands/outdated.js.map +1 -1
  110. package/dist/commands/search.js +21 -34
  111. package/dist/commands/search.js.map +1 -1
  112. package/dist/commands/uninstall.js +15 -14
  113. package/dist/commands/uninstall.js.map +1 -1
  114. package/dist/commands/update.js +13 -24
  115. package/dist/commands/update.js.map +1 -1
  116. package/dist/commands/validate.js +44 -487
  117. package/dist/commands/validate.js.map +1 -1
  118. package/dist/commands/version/bump.js +11 -11
  119. package/dist/commands/version/bump.js.map +1 -1
  120. package/dist/commands/version/index.js +9 -10
  121. package/dist/commands/version/index.js.map +1 -1
  122. package/dist/commands/version/set.js +10 -8
  123. package/dist/commands/version/set.js.map +1 -1
  124. package/dist/commands/version/show.js +9 -10
  125. package/dist/commands/version/show.js.map +1 -1
  126. package/dist/components/common/confirm.js +2 -2
  127. package/dist/components/common/confirm.test.js +203 -0
  128. package/dist/components/common/confirm.test.js.map +1 -0
  129. package/dist/components/common/message.js +1 -1
  130. package/dist/components/common/spinner.js +1 -1
  131. package/dist/components/common/spinner.js.map +1 -1
  132. package/dist/components/skill-search/skill-search.js +3 -3
  133. package/dist/components/wizard/category-grid.js +2 -2
  134. package/dist/components/wizard/category-grid.test.js +132 -78
  135. package/dist/components/wizard/category-grid.test.js.map +1 -1
  136. package/dist/components/wizard/menu-item.js +2 -2
  137. package/dist/components/wizard/search-modal.js +9 -0
  138. package/dist/components/wizard/search-modal.js.map +1 -0
  139. package/dist/components/wizard/search-modal.test.js +216 -0
  140. package/dist/components/wizard/search-modal.test.js.map +1 -0
  141. package/dist/components/wizard/section-progress.js +2 -2
  142. package/dist/components/wizard/section-progress.test.js +4 -4
  143. package/dist/components/wizard/section-progress.test.js.map +1 -1
  144. package/dist/components/wizard/source-grid.js +10 -0
  145. package/dist/components/wizard/source-grid.js.map +1 -0
  146. package/dist/components/wizard/source-grid.test.js +500 -0
  147. package/dist/components/wizard/source-grid.test.js.map +1 -0
  148. package/dist/components/wizard/step-approach.js +7 -6
  149. package/dist/components/wizard/step-approach.test.js +115 -0
  150. package/dist/components/wizard/step-approach.test.js.map +1 -0
  151. package/dist/components/wizard/step-build.js +9 -4
  152. package/dist/components/wizard/step-build.test.js +103 -122
  153. package/dist/components/wizard/step-build.test.js.map +1 -1
  154. package/dist/components/wizard/step-confirm.js +3 -2
  155. package/dist/components/wizard/step-confirm.test.js +364 -0
  156. package/dist/components/wizard/step-confirm.test.js.map +1 -0
  157. package/dist/components/wizard/step-refine.js +2 -2
  158. package/dist/components/wizard/step-refine.test.js +19 -13
  159. package/dist/components/wizard/step-refine.test.js.map +1 -1
  160. package/dist/components/wizard/step-settings.js +14 -0
  161. package/dist/components/wizard/step-settings.js.map +1 -0
  162. package/dist/components/wizard/step-settings.test.js +240 -0
  163. package/dist/components/wizard/step-settings.test.js.map +1 -0
  164. package/dist/components/wizard/step-sources.js +17 -0
  165. package/dist/components/wizard/step-sources.js.map +1 -0
  166. package/dist/components/wizard/step-sources.test.js +290 -0
  167. package/dist/components/wizard/step-sources.test.js.map +1 -0
  168. package/dist/components/wizard/step-stack.js +7 -6
  169. package/dist/components/wizard/step-stack.test.js +344 -0
  170. package/dist/components/wizard/step-stack.test.js.map +1 -0
  171. package/dist/components/wizard/view-title.js +2 -2
  172. package/dist/components/wizard/wizard-layout.js +6 -5
  173. package/dist/components/wizard/wizard-tabs.js +2 -2
  174. package/dist/components/wizard/wizard-tabs.test.js +292 -0
  175. package/dist/components/wizard/wizard-tabs.test.js.map +1 -0
  176. package/dist/components/wizard/wizard.js +22 -14
  177. package/dist/config/skills-matrix.yaml +38 -37
  178. package/dist/config/stacks.yaml +8 -14
  179. package/dist/hooks/init.js +5 -5
  180. package/dist/hooks/init.js.map +1 -1
  181. package/dist/index.js +1 -1
  182. package/dist/index.js.map +1 -1
  183. package/dist/{magic-string.es-RGXYGAW3.js → magic-string.es-PAH2SOTR.js} +2 -2
  184. package/dist/source-manager-DSYZEVGZ.js +16 -0
  185. package/dist/source-manager-DSYZEVGZ.js.map +1 -0
  186. package/dist/src/agents/developer/api-developer/agent.yaml +1 -1
  187. package/dist/src/agents/developer/cli-developer/agent.yaml +1 -1
  188. package/dist/src/agents/developer/web-architecture/agent.yaml +1 -1
  189. package/dist/src/agents/developer/web-developer/agent.yaml +1 -1
  190. package/dist/src/agents/meta/agent-summoner/agent.yaml +1 -1
  191. package/dist/src/agents/meta/documentor/agent.yaml +1 -1
  192. package/dist/src/agents/meta/skill-summoner/agent.yaml +1 -1
  193. package/dist/src/agents/migration/cli-migrator/agent.yaml +1 -1
  194. package/dist/src/agents/pattern/pattern-scout/agent.yaml +1 -1
  195. package/dist/src/agents/pattern/web-pattern-critique/agent.yaml +1 -1
  196. package/dist/src/agents/planning/web-pm/agent.yaml +1 -1
  197. package/dist/src/agents/researcher/api-researcher/agent.yaml +1 -1
  198. package/dist/src/agents/researcher/web-researcher/agent.yaml +1 -1
  199. package/dist/src/agents/reviewer/api-reviewer/agent.yaml +1 -1
  200. package/dist/src/agents/reviewer/cli-reviewer/agent.yaml +1 -1
  201. package/dist/src/agents/reviewer/web-reviewer/agent.yaml +1 -1
  202. package/dist/src/agents/tester/cli-tester/agent.yaml +1 -1
  203. package/dist/src/agents/tester/web-tester/agent.yaml +1 -1
  204. package/dist/stores/wizard-store.js +4 -3
  205. package/dist/stores/wizard-store.test.js +51 -82
  206. package/dist/stores/wizard-store.test.js.map +1 -1
  207. package/package.json +5 -3
  208. package/src/agents/developer/api-developer/agent.yaml +1 -1
  209. package/src/agents/developer/cli-developer/agent.yaml +1 -1
  210. package/src/agents/developer/web-architecture/agent.yaml +1 -1
  211. package/src/agents/developer/web-developer/agent.yaml +1 -1
  212. package/src/agents/meta/agent-summoner/agent.yaml +1 -1
  213. package/src/agents/meta/documentor/agent.yaml +1 -1
  214. package/src/agents/meta/skill-summoner/agent.yaml +1 -1
  215. package/src/agents/migration/cli-migrator/agent.yaml +1 -1
  216. package/src/agents/pattern/pattern-scout/agent.yaml +1 -1
  217. package/src/agents/pattern/web-pattern-critique/agent.yaml +1 -1
  218. package/src/agents/planning/web-pm/agent.yaml +1 -1
  219. package/src/agents/researcher/api-researcher/agent.yaml +1 -1
  220. package/src/agents/researcher/web-researcher/agent.yaml +1 -1
  221. package/src/agents/reviewer/api-reviewer/agent.yaml +1 -1
  222. package/src/agents/reviewer/cli-reviewer/agent.yaml +1 -1
  223. package/src/agents/reviewer/web-reviewer/agent.yaml +1 -1
  224. package/src/agents/tester/cli-tester/agent.yaml +1 -1
  225. package/src/agents/tester/web-tester/agent.yaml +1 -1
  226. package/dist/chunk-2LSGX6R4.js.map +0 -1
  227. package/dist/chunk-2OKUEELH.js +0 -32
  228. package/dist/chunk-2OKUEELH.js.map +0 -1
  229. package/dist/chunk-374JNMR6.js +0 -212
  230. package/dist/chunk-374JNMR6.js.map +0 -1
  231. package/dist/chunk-3EHUF54X.js.map +0 -1
  232. package/dist/chunk-3XR4PALU.js +0 -529
  233. package/dist/chunk-3XR4PALU.js.map +0 -1
  234. package/dist/chunk-5K2ZLUO5.js +0 -57
  235. package/dist/chunk-5K2ZLUO5.js.map +0 -1
  236. package/dist/chunk-5KXUDHAB.js.map +0 -1
  237. package/dist/chunk-6Q3Y7KVB.js.map +0 -1
  238. package/dist/chunk-7SLV7CMF.js +0 -615
  239. package/dist/chunk-7SLV7CMF.js.map +0 -1
  240. package/dist/chunk-A46TPNBJ.js.map +0 -1
  241. package/dist/chunk-AL74GBW4.js +0 -69
  242. package/dist/chunk-AL74GBW4.js.map +0 -1
  243. package/dist/chunk-BQX23RBV.js +0 -191
  244. package/dist/chunk-BQX23RBV.js.map +0 -1
  245. package/dist/chunk-CA4LH4LI.js +0 -132
  246. package/dist/chunk-CA4LH4LI.js.map +0 -1
  247. package/dist/chunk-CBLPAMZO.js.map +0 -1
  248. package/dist/chunk-CKPQHGXR.js +0 -417
  249. package/dist/chunk-CKPQHGXR.js.map +0 -1
  250. package/dist/chunk-CXOFOJCN.js +0 -80
  251. package/dist/chunk-CXOFOJCN.js.map +0 -1
  252. package/dist/chunk-EHGD7HIE.js +0 -104
  253. package/dist/chunk-EHGD7HIE.js.map +0 -1
  254. package/dist/chunk-EHS3TWWP.js +0 -95
  255. package/dist/chunk-EHS3TWWP.js.map +0 -1
  256. package/dist/chunk-FJFEKPXF.js.map +0 -1
  257. package/dist/chunk-HEOHU5EZ.js.map +0 -1
  258. package/dist/chunk-HGCBZUH5.js.map +0 -1
  259. package/dist/chunk-HPGFY5ZN.js +0 -114
  260. package/dist/chunk-HPGFY5ZN.js.map +0 -1
  261. package/dist/chunk-INJ2EFRW.js +0 -127
  262. package/dist/chunk-INJ2EFRW.js.map +0 -1
  263. package/dist/chunk-IOBFMF6X.js +0 -61
  264. package/dist/chunk-IOBFMF6X.js.map +0 -1
  265. package/dist/chunk-KH3HA7J7.js +0 -116
  266. package/dist/chunk-KH3HA7J7.js.map +0 -1
  267. package/dist/chunk-N6JNE326.js +0 -261
  268. package/dist/chunk-N6JNE326.js.map +0 -1
  269. package/dist/chunk-NAGU7TVZ.js +0 -36
  270. package/dist/chunk-NAGU7TVZ.js.map +0 -1
  271. package/dist/chunk-OQYYMQJR.js.map +0 -1
  272. package/dist/chunk-PLZOUVDD.js +0 -419
  273. package/dist/chunk-PLZOUVDD.js.map +0 -1
  274. package/dist/chunk-Q3J43SF3.js.map +0 -1
  275. package/dist/chunk-RTE64SJA.js.map +0 -1
  276. package/dist/chunk-T25OEQFI.js +0 -26
  277. package/dist/chunk-T25OEQFI.js.map +0 -1
  278. package/dist/chunk-UMORK7OK.js.map +0 -1
  279. package/dist/chunk-VFHWU7JU.js +0 -287
  280. package/dist/chunk-VFHWU7JU.js.map +0 -1
  281. package/dist/chunk-VS4GVTZE.js +0 -91
  282. package/dist/chunk-VS4GVTZE.js.map +0 -1
  283. package/dist/chunk-WFEFICFM.js.map +0 -1
  284. package/dist/chunk-WG6KIAPK.js +0 -54
  285. package/dist/chunk-WG6KIAPK.js.map +0 -1
  286. package/dist/chunk-ZEI3ZUDU.js.map +0 -1
  287. package/dist/chunk-ZNIDWLL5.js.map +0 -1
  288. package/dist/chunk-ZSVMS677.js.map +0 -1
  289. /package/dist/{chunk-XY3XDVMI.js.map → chunk-QR2EBWL2.js.map} +0 -0
  290. /package/dist/{chunk-66UDJBF6.js.map → chunk-REJGRCVQ.js.map} +0 -0
  291. /package/dist/{chunk-Z2CWURZ6.js.map → chunk-UNN7523L.js.map} +0 -0
  292. /package/dist/{magic-string.es-RGXYGAW3.js.map → magic-string.es-PAH2SOTR.js.map} +0 -0
@@ -0,0 +1,344 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ createMockCategory,
4
+ createMockMatrix,
5
+ createMockResolvedStack,
6
+ createMockSkill
7
+ } from "../../chunk-NQJ47R4N.js";
8
+ import {
9
+ ARROW_DOWN,
10
+ ARROW_UP,
11
+ ENTER,
12
+ ESCAPE,
13
+ RENDER_DELAY_MS,
14
+ delay
15
+ } from "../../chunk-DBRUQQUF.js";
16
+ import {
17
+ render
18
+ } from "../../chunk-REJGRCVQ.js";
19
+ import {
20
+ afterEach,
21
+ beforeEach,
22
+ describe,
23
+ globalExpect,
24
+ it
25
+ } from "../../chunk-QR2EBWL2.js";
26
+ import {
27
+ StepStack
28
+ } from "../../chunk-XENOESJZ.js";
29
+ import "../../chunk-U7HFKR74.js";
30
+ import "../../chunk-H7SSBSPR.js";
31
+ import {
32
+ useWizardStore
33
+ } from "../../chunk-TMED5DQ2.js";
34
+ import "../../chunk-HWD32NP7.js";
35
+ import "../../chunk-O6ZTD7ZI.js";
36
+ import {
37
+ init_esm_shims
38
+ } from "../../chunk-AWKZ5BDL.js";
39
+
40
+ // src/cli/components/wizard/step-stack.test.tsx
41
+ init_esm_shims();
42
+ import { jsx } from "react/jsx-runtime";
43
+ var SELECT_NAV_DELAY_MS = 100;
44
+ var createMockStackWithSkills = () => {
45
+ const skills = {
46
+ ["web-framework-react"]: createMockSkill("web-framework-react", "framework", {
47
+ description: "React framework"
48
+ }),
49
+ ["web-state-zustand"]: createMockSkill("web-state-zustand", "client-state", {
50
+ description: "State management"
51
+ }),
52
+ ["api-framework-hono"]: createMockSkill("api-framework-hono", "api", {
53
+ description: "Web framework"
54
+ })
55
+ };
56
+ const suggestedStacks = [
57
+ createMockResolvedStack("react-fullstack", "React Fullstack", {
58
+ description: "Full React stack with Zustand and Hono",
59
+ allSkillIds: ["web-framework-react", "web-state-zustand", "api-framework-hono"]
60
+ }),
61
+ createMockResolvedStack("react-minimal", "React Minimal", {
62
+ description: "Minimal React setup",
63
+ allSkillIds: ["web-framework-react"]
64
+ })
65
+ ];
66
+ return createMockMatrix(skills, {
67
+ suggestedStacks,
68
+ categories: {
69
+ framework: createMockCategory("framework", "Web", {
70
+ description: "Web skills",
71
+ exclusive: false
72
+ }),
73
+ api: createMockCategory("api", "API", {
74
+ description: "API skills",
75
+ exclusive: false,
76
+ order: 1
77
+ })
78
+ }
79
+ });
80
+ };
81
+ describe("StepStack component", () => {
82
+ let cleanup;
83
+ let mockMatrix;
84
+ beforeEach(() => {
85
+ useWizardStore.getState().reset();
86
+ mockMatrix = createMockStackWithSkills();
87
+ });
88
+ afterEach(() => {
89
+ cleanup?.();
90
+ cleanup = void 0;
91
+ });
92
+ describe("stack selection mode", () => {
93
+ beforeEach(() => {
94
+ useWizardStore.getState().setApproach("stack");
95
+ });
96
+ describe("rendering", () => {
97
+ it("should render stack options as cards", () => {
98
+ const { lastFrame, unmount } = render(/* @__PURE__ */ jsx(StepStack, { matrix: mockMatrix }));
99
+ cleanup = unmount;
100
+ const output = lastFrame();
101
+ globalExpect(output).toContain("React Fullstack");
102
+ globalExpect(output).toContain("React Minimal");
103
+ });
104
+ it("should render focused stack description (only focused item shows description)", () => {
105
+ const { lastFrame, unmount } = render(/* @__PURE__ */ jsx(StepStack, { matrix: mockMatrix }));
106
+ cleanup = unmount;
107
+ const output = lastFrame();
108
+ globalExpect(output).toContain("Full React stack");
109
+ });
110
+ it("should render ViewTitle for stack selection", () => {
111
+ const { lastFrame, unmount } = render(/* @__PURE__ */ jsx(StepStack, { matrix: mockMatrix }));
112
+ cleanup = unmount;
113
+ const output = lastFrame();
114
+ globalExpect(output).toContain("Select a pre-built template");
115
+ });
116
+ it("should render header text", () => {
117
+ const { lastFrame, unmount } = render(/* @__PURE__ */ jsx(StepStack, { matrix: mockMatrix }));
118
+ cleanup = unmount;
119
+ const output = lastFrame();
120
+ globalExpect(output).toContain("Select a pre-built template");
121
+ });
122
+ });
123
+ describe("stack selection", () => {
124
+ it("should select first stack on Enter (focus starts at first card)", async () => {
125
+ const { stdin, unmount } = render(/* @__PURE__ */ jsx(StepStack, { matrix: mockMatrix }));
126
+ cleanup = unmount;
127
+ await delay(RENDER_DELAY_MS);
128
+ stdin.write(ENTER);
129
+ await delay(SELECT_NAV_DELAY_MS);
130
+ const { step, selectedStackId } = useWizardStore.getState();
131
+ globalExpect(step).toBe("build");
132
+ globalExpect(selectedStackId).toBe("react-fullstack");
133
+ });
134
+ it("should select second stack when navigated to", async () => {
135
+ const { stdin, unmount } = render(/* @__PURE__ */ jsx(StepStack, { matrix: mockMatrix }));
136
+ cleanup = unmount;
137
+ await delay(RENDER_DELAY_MS);
138
+ stdin.write(ARROW_DOWN);
139
+ await delay(SELECT_NAV_DELAY_MS);
140
+ stdin.write(ENTER);
141
+ await delay(SELECT_NAV_DELAY_MS);
142
+ const { selectedStackId } = useWizardStore.getState();
143
+ globalExpect(selectedStackId).toBe("react-minimal");
144
+ });
145
+ });
146
+ describe("back navigation", () => {
147
+ it("should go back when pressing Escape", async () => {
148
+ useWizardStore.getState().setStep("stack");
149
+ const { stdin, unmount } = render(/* @__PURE__ */ jsx(StepStack, { matrix: mockMatrix }));
150
+ cleanup = unmount;
151
+ await delay(RENDER_DELAY_MS);
152
+ stdin.write(ESCAPE);
153
+ await delay(SELECT_NAV_DELAY_MS);
154
+ const { step } = useWizardStore.getState();
155
+ globalExpect(step).toBe("approach");
156
+ });
157
+ it("should maintain history when going back via Escape", async () => {
158
+ const store = useWizardStore.getState();
159
+ store.setApproach("stack");
160
+ store.setStep("stack");
161
+ const { stdin, unmount } = render(/* @__PURE__ */ jsx(StepStack, { matrix: mockMatrix }));
162
+ cleanup = unmount;
163
+ await delay(RENDER_DELAY_MS);
164
+ stdin.write(ESCAPE);
165
+ await delay(SELECT_NAV_DELAY_MS);
166
+ const { step, history } = useWizardStore.getState();
167
+ globalExpect(step).toBe("approach");
168
+ globalExpect(history).toEqual([]);
169
+ });
170
+ });
171
+ describe("arrow key navigation", () => {
172
+ it("should navigate down to second stack card", async () => {
173
+ const { stdin, unmount } = render(/* @__PURE__ */ jsx(StepStack, { matrix: mockMatrix }));
174
+ cleanup = unmount;
175
+ await delay(RENDER_DELAY_MS);
176
+ stdin.write(ARROW_DOWN);
177
+ await delay(SELECT_NAV_DELAY_MS);
178
+ stdin.write(ENTER);
179
+ await delay(SELECT_NAV_DELAY_MS);
180
+ const { selectedStackId } = useWizardStore.getState();
181
+ globalExpect(selectedStackId).toBe("react-minimal");
182
+ });
183
+ it("should navigate down then up back to first stack", async () => {
184
+ const { stdin, unmount } = render(/* @__PURE__ */ jsx(StepStack, { matrix: mockMatrix }));
185
+ cleanup = unmount;
186
+ await delay(RENDER_DELAY_MS);
187
+ stdin.write(ARROW_DOWN);
188
+ await delay(SELECT_NAV_DELAY_MS);
189
+ stdin.write(ARROW_UP);
190
+ await delay(SELECT_NAV_DELAY_MS);
191
+ stdin.write(ENTER);
192
+ await delay(SELECT_NAV_DELAY_MS);
193
+ const { selectedStackId } = useWizardStore.getState();
194
+ globalExpect(selectedStackId).toBe("react-fullstack");
195
+ });
196
+ it("should clamp at top boundary", async () => {
197
+ const { stdin, unmount } = render(/* @__PURE__ */ jsx(StepStack, { matrix: mockMatrix }));
198
+ cleanup = unmount;
199
+ await delay(RENDER_DELAY_MS);
200
+ stdin.write(ARROW_UP);
201
+ await delay(SELECT_NAV_DELAY_MS);
202
+ stdin.write(ARROW_UP);
203
+ await delay(SELECT_NAV_DELAY_MS);
204
+ stdin.write(ENTER);
205
+ await delay(SELECT_NAV_DELAY_MS);
206
+ const { selectedStackId } = useWizardStore.getState();
207
+ globalExpect(selectedStackId).toBe("react-fullstack");
208
+ });
209
+ it("should clamp at bottom boundary", async () => {
210
+ const { stdin, unmount } = render(/* @__PURE__ */ jsx(StepStack, { matrix: mockMatrix }));
211
+ cleanup = unmount;
212
+ await delay(RENDER_DELAY_MS);
213
+ stdin.write(ARROW_DOWN);
214
+ await delay(SELECT_NAV_DELAY_MS);
215
+ stdin.write(ARROW_DOWN);
216
+ await delay(SELECT_NAV_DELAY_MS);
217
+ stdin.write(ARROW_DOWN);
218
+ await delay(SELECT_NAV_DELAY_MS);
219
+ stdin.write(ENTER);
220
+ await delay(SELECT_NAV_DELAY_MS);
221
+ const { selectedStackId } = useWizardStore.getState();
222
+ globalExpect(selectedStackId).toBe("react-minimal");
223
+ });
224
+ });
225
+ describe("empty state", () => {
226
+ it("should render header with no stacks available", () => {
227
+ const emptyMatrix = createMockMatrix({}, { suggestedStacks: [] });
228
+ const { lastFrame, unmount } = render(/* @__PURE__ */ jsx(StepStack, { matrix: emptyMatrix }));
229
+ cleanup = unmount;
230
+ const output = lastFrame();
231
+ globalExpect(output).toContain("Select a pre-built template");
232
+ });
233
+ it("should not render keyboard hints when no stacks", () => {
234
+ const emptyMatrix = createMockMatrix({}, { suggestedStacks: [] });
235
+ const { lastFrame, unmount } = render(/* @__PURE__ */ jsx(StepStack, { matrix: emptyMatrix }));
236
+ cleanup = unmount;
237
+ const output = lastFrame();
238
+ globalExpect(output).not.toContain("ENTER");
239
+ });
240
+ it("should still allow Escape to go back with no stacks", async () => {
241
+ const emptyMatrix = createMockMatrix({}, { suggestedStacks: [] });
242
+ useWizardStore.getState().setStep("stack");
243
+ const { stdin, unmount } = render(/* @__PURE__ */ jsx(StepStack, { matrix: emptyMatrix }));
244
+ cleanup = unmount;
245
+ await delay(RENDER_DELAY_MS);
246
+ stdin.write(ESCAPE);
247
+ await delay(SELECT_NAV_DELAY_MS);
248
+ const { step } = useWizardStore.getState();
249
+ globalExpect(step).toBe("approach");
250
+ });
251
+ });
252
+ });
253
+ describe("domain selection mode", () => {
254
+ beforeEach(() => {
255
+ useWizardStore.getState().setApproach("scratch");
256
+ });
257
+ describe("rendering", () => {
258
+ it("should render domain options", () => {
259
+ const { lastFrame, unmount } = render(/* @__PURE__ */ jsx(StepStack, { matrix: mockMatrix }));
260
+ cleanup = unmount;
261
+ const output = lastFrame();
262
+ globalExpect(output).toContain("Web");
263
+ globalExpect(output).toContain("Web Extras");
264
+ globalExpect(output).toContain("API");
265
+ globalExpect(output).toContain("CLI");
266
+ });
267
+ it("should render header text for domain selection", () => {
268
+ const { lastFrame, unmount } = render(/* @__PURE__ */ jsx(StepStack, { matrix: mockMatrix }));
269
+ cleanup = unmount;
270
+ const output = lastFrame();
271
+ globalExpect(output).toContain("Select domains to configure");
272
+ });
273
+ it("should show domain descriptions", () => {
274
+ const { lastFrame, unmount } = render(/* @__PURE__ */ jsx(StepStack, { matrix: mockMatrix }));
275
+ cleanup = unmount;
276
+ const output = lastFrame();
277
+ globalExpect(output).toContain("Frontend web applications");
278
+ globalExpect(output).toContain("Backend APIs");
279
+ });
280
+ });
281
+ describe("domain selection", () => {
282
+ it("should toggle domain when selected", async () => {
283
+ const { stdin, unmount } = render(/* @__PURE__ */ jsx(StepStack, { matrix: mockMatrix }));
284
+ cleanup = unmount;
285
+ await delay(RENDER_DELAY_MS);
286
+ stdin.write(ARROW_DOWN);
287
+ await delay(SELECT_NAV_DELAY_MS);
288
+ stdin.write(ENTER);
289
+ await delay(SELECT_NAV_DELAY_MS);
290
+ const { selectedDomains } = useWizardStore.getState();
291
+ globalExpect(selectedDomains).toContain("web");
292
+ });
293
+ it("should allow multiple domain selection", async () => {
294
+ const { stdin, unmount } = render(/* @__PURE__ */ jsx(StepStack, { matrix: mockMatrix }));
295
+ cleanup = unmount;
296
+ await delay(RENDER_DELAY_MS);
297
+ stdin.write(ARROW_DOWN);
298
+ await delay(SELECT_NAV_DELAY_MS);
299
+ stdin.write(ENTER);
300
+ await delay(SELECT_NAV_DELAY_MS);
301
+ globalExpect(useWizardStore.getState().selectedDomains).toContain("web");
302
+ useWizardStore.getState().toggleDomain("api");
303
+ const { selectedDomains } = useWizardStore.getState();
304
+ globalExpect(selectedDomains).toContain("web");
305
+ globalExpect(selectedDomains).toContain("api");
306
+ });
307
+ it("should show selected domains summary when domains selected", async () => {
308
+ useWizardStore.getState().toggleDomain("web");
309
+ const { lastFrame, unmount } = render(/* @__PURE__ */ jsx(StepStack, { matrix: mockMatrix }));
310
+ cleanup = unmount;
311
+ const output = lastFrame();
312
+ globalExpect(output).toContain("Selected:");
313
+ globalExpect(output).toContain("web");
314
+ });
315
+ it("should navigate to build step when continuing", async () => {
316
+ useWizardStore.getState().toggleDomain("web");
317
+ const { stdin, unmount } = render(/* @__PURE__ */ jsx(StepStack, { matrix: mockMatrix }));
318
+ cleanup = unmount;
319
+ await delay(RENDER_DELAY_MS);
320
+ for (let i = 0; i < 6; i++) {
321
+ stdin.write(ARROW_DOWN);
322
+ await delay(SELECT_NAV_DELAY_MS);
323
+ }
324
+ stdin.write(ENTER);
325
+ await delay(SELECT_NAV_DELAY_MS);
326
+ const { step } = useWizardStore.getState();
327
+ globalExpect(step).toBe("build");
328
+ });
329
+ });
330
+ describe("back navigation", () => {
331
+ it("should go back when selecting back option", async () => {
332
+ useWizardStore.getState().setStep("stack");
333
+ const { stdin, unmount } = render(/* @__PURE__ */ jsx(StepStack, { matrix: mockMatrix }));
334
+ cleanup = unmount;
335
+ await delay(RENDER_DELAY_MS);
336
+ stdin.write(ENTER);
337
+ await delay(SELECT_NAV_DELAY_MS);
338
+ const { step } = useWizardStore.getState();
339
+ globalExpect(step).toBe("approach");
340
+ });
341
+ });
342
+ });
343
+ });
344
+ //# sourceMappingURL=step-stack.test.js.map
@@ -0,0 +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,8 +1,8 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  ViewTitle
4
- } from "../../chunk-Q3J43SF3.js";
5
- import "../../chunk-DHET7RCE.js";
4
+ } from "../../chunk-U7HFKR74.js";
5
+ import "../../chunk-AWKZ5BDL.js";
6
6
  export {
7
7
  ViewTitle
8
8
  };
@@ -3,11 +3,12 @@ import {
3
3
  DefinitionItem,
4
4
  WizardFooter,
5
5
  WizardLayout
6
- } from "../../chunk-3EHUF54X.js";
7
- import "../../chunk-ZNIDWLL5.js";
8
- import "../../chunk-CBLPAMZO.js";
9
- import "../../chunk-FJFEKPXF.js";
10
- import "../../chunk-DHET7RCE.js";
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";
11
+ import "../../chunk-AWKZ5BDL.js";
11
12
  export {
12
13
  DefinitionItem,
13
14
  WizardFooter,
@@ -2,8 +2,8 @@
2
2
  import {
3
3
  WIZARD_STEPS,
4
4
  WizardTabs
5
- } from "../../chunk-ZNIDWLL5.js";
6
- import "../../chunk-DHET7RCE.js";
5
+ } from "../../chunk-3X5D7RM5.js";
6
+ import "../../chunk-AWKZ5BDL.js";
7
7
  export {
8
8
  WIZARD_STEPS,
9
9
  WizardTabs