@claude-collective/cli 0.26.1 → 0.29.4

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 (233) hide show
  1. package/CHANGELOG.md +117 -0
  2. package/README.md +47 -13
  3. package/config/stacks.yaml +330 -93
  4. package/dist/chunk-56ERY7H7.js +29 -0
  5. package/dist/chunk-56ERY7H7.js.map +1 -0
  6. package/dist/{chunk-OBXAY23Y.js → chunk-5I6VY2E7.js} +5 -5
  7. package/dist/chunk-5I6VY2E7.js.map +1 -0
  8. package/dist/{chunk-324DM2L6.js → chunk-5WIHSJRO.js} +230 -65
  9. package/dist/chunk-5WIHSJRO.js.map +1 -0
  10. package/dist/{chunk-GGFOD5PK.js → chunk-6F3ZKDVE.js} +122 -66
  11. package/dist/chunk-6F3ZKDVE.js.map +1 -0
  12. package/dist/{chunk-DBRUQQUF.js → chunk-7GHTQSWI.js} +5 -1
  13. package/dist/{chunk-DBRUQQUF.js.map → chunk-7GHTQSWI.js.map} +1 -1
  14. package/dist/chunk-7ICBJZV2.js +63 -0
  15. package/dist/chunk-7ICBJZV2.js.map +1 -0
  16. package/dist/{chunk-3X5D7RM5.js → chunk-7UKQZSWT.js} +15 -4
  17. package/dist/chunk-7UKQZSWT.js.map +1 -0
  18. package/dist/{chunk-F4RD5FYM.js → chunk-A4T4YSV4.js} +5 -2
  19. package/dist/chunk-A4T4YSV4.js.map +1 -0
  20. package/dist/{chunk-VVYNZZUX.js → chunk-AG5YGYJT.js} +9 -5
  21. package/dist/chunk-AG5YGYJT.js.map +1 -0
  22. package/dist/chunk-AJFSCLJ7.js +81 -0
  23. package/dist/chunk-AJFSCLJ7.js.map +1 -0
  24. package/dist/{chunk-NQJ47R4N.js → chunk-CQZAKMPJ.js} +66 -14
  25. package/dist/chunk-CQZAKMPJ.js.map +1 -0
  26. package/dist/chunk-DIRH4PDF.js +24 -0
  27. package/dist/chunk-DIRH4PDF.js.map +1 -0
  28. package/dist/{chunk-HIQGK5XJ.js → chunk-DUIYVKFK.js} +123 -86
  29. package/dist/chunk-DUIYVKFK.js.map +1 -0
  30. package/dist/chunk-EP6J44I4.js +142 -0
  31. package/dist/chunk-EP6J44I4.js.map +1 -0
  32. package/dist/{chunk-2YMMJP4Z.js → chunk-EUPMWSM3.js} +92 -29
  33. package/dist/chunk-EUPMWSM3.js.map +1 -0
  34. package/dist/chunk-FUPBGSRA.js +66 -0
  35. package/dist/chunk-FUPBGSRA.js.map +1 -0
  36. package/dist/{chunk-U7HFKR74.js → chunk-FY5D4KIC.js} +5 -2
  37. package/dist/chunk-FY5D4KIC.js.map +1 -0
  38. package/dist/chunk-G5WXKKQM.js +233 -0
  39. package/dist/chunk-G5WXKKQM.js.map +1 -0
  40. package/dist/{chunk-KWYO3M5Q.js → chunk-GVVEPVR7.js} +25 -24
  41. package/dist/chunk-GVVEPVR7.js.map +1 -0
  42. package/dist/chunk-IFODQTCX.js +162 -0
  43. package/dist/chunk-IFODQTCX.js.map +1 -0
  44. package/dist/chunk-IQUBOWWU.js +366 -0
  45. package/dist/chunk-IQUBOWWU.js.map +1 -0
  46. package/dist/{chunk-ETCVEV3S.js → chunk-IRG52AN5.js} +242 -155
  47. package/dist/chunk-IRG52AN5.js.map +1 -0
  48. package/dist/chunk-MQAYAISQ.js +88 -0
  49. package/dist/chunk-MQAYAISQ.js.map +1 -0
  50. package/dist/{chunk-G35SYE6Z.js → chunk-N73GQTCK.js} +37 -104
  51. package/dist/chunk-N73GQTCK.js.map +1 -0
  52. package/dist/{chunk-H7SSBSPR.js → chunk-OA5RCL2L.js} +8 -5
  53. package/dist/chunk-OA5RCL2L.js.map +1 -0
  54. package/dist/{chunk-CZBNDP5B.js → chunk-PNXFJPXF.js} +3 -3
  55. package/dist/{chunk-MCTSHLAF.js → chunk-RI5QEK5W.js} +41 -14
  56. package/dist/chunk-RI5QEK5W.js.map +1 -0
  57. package/dist/chunk-RXC7AF7N.js +31 -0
  58. package/dist/chunk-RXC7AF7N.js.map +1 -0
  59. package/dist/{chunk-CQ7657GA.js → chunk-SSHG7MEE.js} +1248 -735
  60. package/dist/chunk-SSHG7MEE.js.map +1 -0
  61. package/dist/{chunk-4S4FCAA2.js → chunk-VTUPUKFD.js} +26 -31
  62. package/dist/chunk-VTUPUKFD.js.map +1 -0
  63. package/dist/{chunk-XENOESJZ.js → chunk-WLQUQXWO.js} +10 -67
  64. package/dist/chunk-WLQUQXWO.js.map +1 -0
  65. package/dist/chunk-WPED6CL3.js +105 -0
  66. package/dist/chunk-WPED6CL3.js.map +1 -0
  67. package/dist/{chunk-NT4K647L.js → chunk-XPMEGGJK.js} +97 -76
  68. package/dist/chunk-XPMEGGJK.js.map +1 -0
  69. package/dist/chunk-XZKVOPCR.js +75 -0
  70. package/dist/chunk-XZKVOPCR.js.map +1 -0
  71. package/dist/{chunk-ZW2PELOH.js → chunk-ZX5DM4D5.js} +106 -69
  72. package/dist/chunk-ZX5DM4D5.js.map +1 -0
  73. package/dist/commands/build/marketplace.js +21 -20
  74. package/dist/commands/build/marketplace.js.map +1 -1
  75. package/dist/commands/build/plugins.js +7 -11
  76. package/dist/commands/build/plugins.js.map +1 -1
  77. package/dist/commands/build/stack.js +8 -13
  78. package/dist/commands/build/stack.js.map +1 -1
  79. package/dist/commands/compile.js +109 -135
  80. package/dist/commands/compile.js.map +1 -1
  81. package/dist/commands/config/get.js +4 -5
  82. package/dist/commands/config/get.js.map +1 -1
  83. package/dist/commands/config/index.js +5 -6
  84. package/dist/commands/config/index.js.map +1 -1
  85. package/dist/commands/config/path.js +4 -5
  86. package/dist/commands/config/path.js.map +1 -1
  87. package/dist/commands/config/set-project.js +4 -5
  88. package/dist/commands/config/set-project.js.map +1 -1
  89. package/dist/commands/config/show.js +5 -6
  90. package/dist/commands/config/unset-project.js +4 -5
  91. package/dist/commands/config/unset-project.js.map +1 -1
  92. package/dist/commands/diff.js +26 -11
  93. package/dist/commands/diff.js.map +1 -1
  94. package/dist/commands/doctor.js +13 -16
  95. package/dist/commands/doctor.js.map +1 -1
  96. package/dist/commands/edit.js +71 -42
  97. package/dist/commands/edit.js.map +1 -1
  98. package/dist/commands/eject.js +34 -14
  99. package/dist/commands/eject.js.map +1 -1
  100. package/dist/commands/import/skill.js +93 -52
  101. package/dist/commands/import/skill.js.map +1 -1
  102. package/dist/commands/info.js +27 -9
  103. package/dist/commands/info.js.map +1 -1
  104. package/dist/commands/init.js +98 -48
  105. package/dist/commands/init.js.map +1 -1
  106. package/dist/commands/list.js +10 -5
  107. package/dist/commands/list.js.map +1 -1
  108. package/dist/commands/new/agent.js +8 -11
  109. package/dist/commands/new/agent.js.map +1 -1
  110. package/dist/commands/new/skill.js +17 -18
  111. package/dist/commands/new/skill.js.map +1 -1
  112. package/dist/commands/outdated.js +23 -9
  113. package/dist/commands/outdated.js.map +1 -1
  114. package/dist/commands/search.js +23 -20
  115. package/dist/commands/search.js.map +1 -1
  116. package/dist/commands/uninstall.js +28 -21
  117. package/dist/commands/uninstall.js.map +1 -1
  118. package/dist/commands/update.js +30 -22
  119. package/dist/commands/update.js.map +1 -1
  120. package/dist/commands/validate.js +103 -39
  121. package/dist/commands/validate.js.map +1 -1
  122. package/dist/commands/version/bump.js +4 -5
  123. package/dist/commands/version/bump.js.map +1 -1
  124. package/dist/commands/version/index.js +4 -5
  125. package/dist/commands/version/index.js.map +1 -1
  126. package/dist/commands/version/set.js +4 -5
  127. package/dist/commands/version/set.js.map +1 -1
  128. package/dist/commands/version/show.js +4 -5
  129. package/dist/commands/version/show.js.map +1 -1
  130. package/dist/components/common/confirm.test.js +2 -2
  131. package/dist/components/common/confirm.test.js.map +1 -1
  132. package/dist/components/skill-search/skill-search.js +4 -2
  133. package/dist/components/wizard/category-grid.js +3 -1
  134. package/dist/components/wizard/category-grid.test.js +63 -64
  135. package/dist/components/wizard/category-grid.test.js.map +1 -1
  136. package/dist/components/wizard/domain-selection.js +13 -0
  137. package/dist/components/wizard/help-modal.js +10 -0
  138. package/dist/components/wizard/help-modal.js.map +1 -0
  139. package/dist/components/wizard/menu-item.js +2 -1
  140. package/dist/components/wizard/search-modal.js +3 -1
  141. package/dist/components/wizard/search-modal.test.js +4 -2
  142. package/dist/components/wizard/search-modal.test.js.map +1 -1
  143. package/dist/components/wizard/section-progress.js +2 -1
  144. package/dist/components/wizard/section-progress.test.js +2 -1
  145. package/dist/components/wizard/section-progress.test.js.map +1 -1
  146. package/dist/components/wizard/source-grid.js +6 -2
  147. package/dist/components/wizard/source-grid.test.js +49 -45
  148. package/dist/components/wizard/source-grid.test.js.map +1 -1
  149. package/dist/components/wizard/stack-selection.js +15 -0
  150. package/dist/components/wizard/stack-selection.js.map +1 -0
  151. package/dist/components/wizard/step-approach.js +8 -6
  152. package/dist/components/wizard/step-approach.test.js +11 -9
  153. package/dist/components/wizard/step-approach.test.js.map +1 -1
  154. package/dist/components/wizard/step-build.js +9 -13
  155. package/dist/components/wizard/step-build.test.js +27 -45
  156. package/dist/components/wizard/step-build.test.js.map +1 -1
  157. package/dist/components/wizard/step-confirm.js +2 -1
  158. package/dist/components/wizard/step-confirm.test.js +6 -5
  159. package/dist/components/wizard/step-confirm.test.js.map +1 -1
  160. package/dist/components/wizard/step-refine.js +2 -1
  161. package/dist/components/wizard/step-refine.test.js +3 -2
  162. package/dist/components/wizard/step-refine.test.js.map +1 -1
  163. package/dist/components/wizard/step-settings.js +8 -6
  164. package/dist/components/wizard/step-settings.test.js +12 -10
  165. package/dist/components/wizard/step-settings.test.js.map +1 -1
  166. package/dist/components/wizard/step-sources.js +11 -9
  167. package/dist/components/wizard/step-sources.test.js +16 -15
  168. package/dist/components/wizard/step-sources.test.js.map +1 -1
  169. package/dist/components/wizard/step-stack.js +9 -6
  170. package/dist/components/wizard/step-stack.test.js +15 -12
  171. package/dist/components/wizard/step-stack.test.js.map +1 -1
  172. package/dist/components/wizard/view-title.js +2 -1
  173. package/dist/components/wizard/wizard-layout.js +7 -9
  174. package/dist/components/wizard/wizard-tabs.js +2 -1
  175. package/dist/components/wizard/wizard-tabs.test.js +2 -1
  176. package/dist/components/wizard/wizard-tabs.test.js.map +1 -1
  177. package/dist/components/wizard/wizard.js +26 -20
  178. package/dist/config/stacks.yaml +330 -93
  179. package/dist/hooks/init.js +3 -4
  180. package/dist/hooks/init.js.map +1 -1
  181. package/dist/source-manager-TV2YGPAN.js +15 -0
  182. package/dist/source-manager-TV2YGPAN.js.map +1 -0
  183. package/dist/stores/wizard-store.js +4 -3
  184. package/dist/stores/wizard-store.test.js +272 -25
  185. package/dist/stores/wizard-store.test.js.map +1 -1
  186. package/package.json +2 -1
  187. package/src/schemas/agent-frontmatter.schema.json +84 -0
  188. package/src/schemas/agent.schema.json +93 -0
  189. package/src/schemas/hooks.schema.json +47 -0
  190. package/src/schemas/marketplace.schema.json +119 -0
  191. package/src/schemas/metadata.schema.json +113 -0
  192. package/src/schemas/plugin.schema.json +130 -0
  193. package/src/schemas/project-config.schema.json +125 -0
  194. package/src/schemas/project-source-config.schema.json +81 -0
  195. package/src/schemas/skill-frontmatter.schema.json +42 -0
  196. package/src/schemas/skills-matrix.schema.json +467 -0
  197. package/src/schemas/stack.schema.json +191 -0
  198. package/src/schemas/stacks.schema.json +111 -0
  199. package/dist/chunk-2OW7FCIF.js +0 -197
  200. package/dist/chunk-2OW7FCIF.js.map +0 -1
  201. package/dist/chunk-2YMMJP4Z.js.map +0 -1
  202. package/dist/chunk-324DM2L6.js.map +0 -1
  203. package/dist/chunk-3X5D7RM5.js.map +0 -1
  204. package/dist/chunk-4S4FCAA2.js.map +0 -1
  205. package/dist/chunk-CQ7657GA.js.map +0 -1
  206. package/dist/chunk-ETCVEV3S.js.map +0 -1
  207. package/dist/chunk-F4RD5FYM.js.map +0 -1
  208. package/dist/chunk-G35SYE6Z.js.map +0 -1
  209. package/dist/chunk-GGFOD5PK.js.map +0 -1
  210. package/dist/chunk-H7SSBSPR.js.map +0 -1
  211. package/dist/chunk-HIQGK5XJ.js.map +0 -1
  212. package/dist/chunk-HWD32NP7.js +0 -19
  213. package/dist/chunk-HWD32NP7.js.map +0 -1
  214. package/dist/chunk-KWYO3M5Q.js.map +0 -1
  215. package/dist/chunk-MCTSHLAF.js.map +0 -1
  216. package/dist/chunk-NQJ47R4N.js.map +0 -1
  217. package/dist/chunk-NT4K647L.js.map +0 -1
  218. package/dist/chunk-O6ZTD7ZI.js +0 -70
  219. package/dist/chunk-O6ZTD7ZI.js.map +0 -1
  220. package/dist/chunk-OBXAY23Y.js.map +0 -1
  221. package/dist/chunk-TMED5DQ2.js +0 -210
  222. package/dist/chunk-TMED5DQ2.js.map +0 -1
  223. package/dist/chunk-U7HFKR74.js.map +0 -1
  224. package/dist/chunk-UEMRJI2K.js +0 -146
  225. package/dist/chunk-UEMRJI2K.js.map +0 -1
  226. package/dist/chunk-UNN7523L.js +0 -78
  227. package/dist/chunk-UNN7523L.js.map +0 -1
  228. package/dist/chunk-VVYNZZUX.js.map +0 -1
  229. package/dist/chunk-XENOESJZ.js.map +0 -1
  230. package/dist/chunk-ZW2PELOH.js.map +0 -1
  231. package/dist/source-manager-VWIIDTK5.js +0 -16
  232. /package/dist/{chunk-CZBNDP5B.js.map → chunk-PNXFJPXF.js.map} +0 -0
  233. /package/dist/{source-manager-VWIIDTK5.js.map → components/wizard/domain-selection.js.map} +0 -0
@@ -4,8 +4,9 @@ import {
4
4
  ARROW_UP,
5
5
  ENTER,
6
6
  RENDER_DELAY_MS,
7
+ SELECT_NAV_DELAY_MS,
7
8
  delay
8
- } from "../../chunk-DBRUQQUF.js";
9
+ } from "../../chunk-7GHTQSWI.js";
9
10
  import {
10
11
  render
11
12
  } from "../../chunk-REJGRCVQ.js";
@@ -18,14 +19,16 @@ import {
18
19
  } from "../../chunk-QR2EBWL2.js";
19
20
  import {
20
21
  StepApproach
21
- } from "../../chunk-KWYO3M5Q.js";
22
- import "../../chunk-U7HFKR74.js";
23
- import "../../chunk-H7SSBSPR.js";
22
+ } from "../../chunk-GVVEPVR7.js";
23
+ import "../../chunk-FY5D4KIC.js";
24
+ import "../../chunk-OA5RCL2L.js";
25
+ import "../../chunk-7ICBJZV2.js";
24
26
  import {
25
27
  useWizardStore
26
- } from "../../chunk-TMED5DQ2.js";
27
- import "../../chunk-HWD32NP7.js";
28
- import "../../chunk-O6ZTD7ZI.js";
28
+ } from "../../chunk-IQUBOWWU.js";
29
+ import "../../chunk-SSHG7MEE.js";
30
+ import "../../chunk-5WIHSJRO.js";
31
+ import "../../chunk-IFODQTCX.js";
29
32
  import {
30
33
  init_esm_shims
31
34
  } from "../../chunk-AWKZ5BDL.js";
@@ -33,7 +36,6 @@ import {
33
36
  // src/cli/components/wizard/step-approach.test.tsx
34
37
  init_esm_shims();
35
38
  import { jsx } from "react/jsx-runtime";
36
- var SELECT_NAV_DELAY_MS = 100;
37
39
  describe("StepApproach component", () => {
38
40
  let cleanup;
39
41
  beforeEach(() => {
@@ -48,7 +50,7 @@ describe("StepApproach component", () => {
48
50
  const { lastFrame, unmount } = render(/* @__PURE__ */ jsx(StepApproach, {}));
49
51
  cleanup = unmount;
50
52
  const output = lastFrame();
51
- globalExpect(output).toContain("Use a pre-built template");
53
+ globalExpect(output).toContain("Use a stack");
52
54
  globalExpect(output).toContain("Start from scratch");
53
55
  });
54
56
  it("should not render expert mode or install mode options (now global shortcuts)", () => {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/cli/components/wizard/step-approach.test.tsx"],"sourcesContent":["import React from \"react\";\nimport { render } from \"ink-testing-library\";\nimport { afterEach, beforeEach, describe, expect, it } from \"vitest\";\nimport { StepApproach } from \"./step-approach\";\nimport { useWizardStore } from \"../../stores/wizard-store\";\nimport {\n ARROW_DOWN,\n ARROW_UP,\n ENTER,\n RENDER_DELAY_MS,\n delay,\n} from \"../../lib/__tests__/test-constants\";\n\nconst SELECT_NAV_DELAY_MS = 100;\n\ndescribe(\"StepApproach component\", () => {\n let cleanup: (() => void) | undefined;\n\n beforeEach(() => {\n useWizardStore.getState().reset();\n });\n\n afterEach(() => {\n cleanup?.();\n cleanup = undefined;\n });\n\n describe(\"rendering\", () => {\n it(\"should render approach options\", () => {\n const { lastFrame, unmount } = render(<StepApproach />);\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Use a pre-built template\");\n expect(output).toContain(\"Start from scratch\");\n });\n\n it(\"should not render expert mode or install mode options (now global shortcuts)\", () => {\n const { lastFrame, unmount } = render(<StepApproach />);\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).not.toContain(\"Expert Mode\");\n expect(output).not.toContain(\"Install Mode\");\n });\n });\n\n describe(\"navigation options\", () => {\n it(\"should navigate to stack step when selecting template\", async () => {\n const { stdin, unmount } = render(<StepApproach />);\n cleanup = unmount;\n\n // Wait for component to be ready\n await delay(RENDER_DELAY_MS);\n\n // First option should be \"Use a pre-built template\" (stack)\n await stdin.write(ENTER);\n await delay(SELECT_NAV_DELAY_MS);\n\n const { step, approach } = useWizardStore.getState();\n expect(step).toBe(\"stack\");\n expect(approach).toBe(\"stack\");\n });\n\n it(\"should navigate to stack step (domain selection) when selecting scratch\", async () => {\n const { stdin, unmount } = render(<StepApproach />);\n cleanup = unmount;\n\n // Wait for component to be ready\n await delay(RENDER_DELAY_MS);\n\n // Navigate down to \"Start from scratch\"\n await stdin.write(ARROW_DOWN);\n await delay(SELECT_NAV_DELAY_MS);\n await stdin.write(ENTER);\n await delay(SELECT_NAV_DELAY_MS);\n\n const { step, approach } = useWizardStore.getState();\n expect(step).toBe(\"stack\"); // Goes to stack step for domain selection\n expect(approach).toBe(\"scratch\");\n });\n });\n\n describe(\"arrow key navigation\", () => {\n it(\"should navigate down through options\", async () => {\n const { stdin, unmount } = render(<StepApproach />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n // Navigate down to second option\n await stdin.write(ARROW_DOWN);\n await delay(SELECT_NAV_DELAY_MS);\n\n // Select (should be \"Start from scratch\")\n await stdin.write(ENTER);\n await delay(SELECT_NAV_DELAY_MS);\n\n const { step, approach } = useWizardStore.getState();\n expect(step).toBe(\"stack\"); // Goes to stack step for domain selection\n expect(approach).toBe(\"scratch\");\n });\n\n it(\"should navigate up through options\", async () => {\n const { stdin, unmount } = render(<StepApproach />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n // Navigate down then up\n await stdin.write(ARROW_DOWN);\n await delay(SELECT_NAV_DELAY_MS);\n await stdin.write(ARROW_UP);\n await delay(SELECT_NAV_DELAY_MS);\n\n // Select (should be back to \"Use a pre-built template\")\n await stdin.write(ENTER);\n await delay(SELECT_NAV_DELAY_MS);\n\n const { step, approach } = useWizardStore.getState();\n expect(step).toBe(\"stack\");\n expect(approach).toBe(\"stack\");\n });\n });\n});\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/cli/components/wizard/step-approach.test.tsx"],"sourcesContent":["import { render } from \"ink-testing-library\";\nimport { afterEach, beforeEach, describe, expect, it } from \"vitest\";\nimport { StepApproach } from \"./step-approach\";\nimport { useWizardStore } from \"../../stores/wizard-store\";\nimport {\n ARROW_DOWN,\n ARROW_UP,\n ENTER,\n RENDER_DELAY_MS,\n SELECT_NAV_DELAY_MS,\n delay,\n} from \"../../lib/__tests__/test-constants\";\n\ndescribe(\"StepApproach component\", () => {\n let cleanup: (() => void) | undefined;\n\n beforeEach(() => {\n useWizardStore.getState().reset();\n });\n\n afterEach(() => {\n cleanup?.();\n cleanup = undefined;\n });\n\n describe(\"rendering\", () => {\n it(\"should render approach options\", () => {\n const { lastFrame, unmount } = render(<StepApproach />);\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Use a stack\");\n expect(output).toContain(\"Start from scratch\");\n });\n\n it(\"should not render expert mode or install mode options (now global shortcuts)\", () => {\n const { lastFrame, unmount } = render(<StepApproach />);\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).not.toContain(\"Expert Mode\");\n expect(output).not.toContain(\"Install Mode\");\n });\n });\n\n describe(\"navigation options\", () => {\n it(\"should navigate to stack step when selecting template\", async () => {\n const { stdin, unmount } = render(<StepApproach />);\n cleanup = unmount;\n\n // Wait for component to be ready\n await delay(RENDER_DELAY_MS);\n\n // First option should be \"Use a stack\" (stack)\n await stdin.write(ENTER);\n await delay(SELECT_NAV_DELAY_MS);\n\n const { step, approach } = useWizardStore.getState();\n expect(step).toBe(\"stack\");\n expect(approach).toBe(\"stack\");\n });\n\n it(\"should navigate to stack step (domain selection) when selecting scratch\", async () => {\n const { stdin, unmount } = render(<StepApproach />);\n cleanup = unmount;\n\n // Wait for component to be ready\n await delay(RENDER_DELAY_MS);\n\n // Navigate down to \"Start from scratch\"\n await stdin.write(ARROW_DOWN);\n await delay(SELECT_NAV_DELAY_MS);\n await stdin.write(ENTER);\n await delay(SELECT_NAV_DELAY_MS);\n\n const { step, approach } = useWizardStore.getState();\n expect(step).toBe(\"stack\"); // Goes to stack step for domain selection\n expect(approach).toBe(\"scratch\");\n });\n });\n\n describe(\"arrow key navigation\", () => {\n it(\"should navigate down through options\", async () => {\n const { stdin, unmount } = render(<StepApproach />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n // Navigate down to second option\n await stdin.write(ARROW_DOWN);\n await delay(SELECT_NAV_DELAY_MS);\n\n // Select (should be \"Start from scratch\")\n await stdin.write(ENTER);\n await delay(SELECT_NAV_DELAY_MS);\n\n const { step, approach } = useWizardStore.getState();\n expect(step).toBe(\"stack\"); // Goes to stack step for domain selection\n expect(approach).toBe(\"scratch\");\n });\n\n it(\"should navigate up through options\", async () => {\n const { stdin, unmount } = render(<StepApproach />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n // Navigate down then up\n await stdin.write(ARROW_DOWN);\n await delay(SELECT_NAV_DELAY_MS);\n await stdin.write(ARROW_UP);\n await delay(SELECT_NAV_DELAY_MS);\n\n // Select (should be back to \"Use a stack\")\n await stdin.write(ENTER);\n await delay(SELECT_NAV_DELAY_MS);\n\n const { step, approach } = useWizardStore.getState();\n expect(step).toBe(\"stack\");\n expect(approach).toBe(\"stack\");\n });\n });\n});\n"],"mappings":"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","names":[]}
@@ -1,20 +1,16 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
- StepBuild,
4
- getDisplayLabel,
5
- validateBuildStep
6
- } from "../../chunk-2YMMJP4Z.js";
3
+ StepBuild
4
+ } from "../../chunk-EUPMWSM3.js";
5
+ import "../../chunk-FY5D4KIC.js";
7
6
  import "../../chunk-V2ZIH7HV.js";
8
- import "../../chunk-U7HFKR74.js";
9
- import "../../chunk-ETCVEV3S.js";
10
- import "../../chunk-CQ7657GA.js";
11
- import "../../chunk-324DM2L6.js";
12
- import "../../chunk-HWD32NP7.js";
13
- import "../../chunk-O6ZTD7ZI.js";
7
+ import "../../chunk-IRG52AN5.js";
8
+ import "../../chunk-WPED6CL3.js";
9
+ import "../../chunk-SSHG7MEE.js";
10
+ import "../../chunk-5WIHSJRO.js";
11
+ import "../../chunk-IFODQTCX.js";
14
12
  import "../../chunk-AWKZ5BDL.js";
15
13
  export {
16
- StepBuild,
17
- getDisplayLabel,
18
- validateBuildStep
14
+ StepBuild
19
15
  };
20
16
  //# sourceMappingURL=step-build.js.map
@@ -3,14 +3,14 @@ import {
3
3
  createMockCategory,
4
4
  createMockMatrix,
5
5
  createMockSkill
6
- } from "../../chunk-NQJ47R4N.js";
6
+ } from "../../chunk-CQZAKMPJ.js";
7
7
  import {
8
8
  ENTER,
9
9
  ESCAPE,
10
10
  INPUT_DELAY_MS,
11
11
  RENDER_DELAY_MS,
12
12
  delay
13
- } from "../../chunk-DBRUQQUF.js";
13
+ } from "../../chunk-7GHTQSWI.js";
14
14
  import {
15
15
  render
16
16
  } from "../../chunk-REJGRCVQ.js";
@@ -23,16 +23,16 @@ import {
23
23
  } from "../../chunk-QR2EBWL2.js";
24
24
  import {
25
25
  StepBuild,
26
- getDisplayLabel,
26
+ getSkillDisplayLabel,
27
27
  validateBuildStep
28
- } from "../../chunk-2YMMJP4Z.js";
28
+ } from "../../chunk-EUPMWSM3.js";
29
+ import "../../chunk-FY5D4KIC.js";
29
30
  import "../../chunk-V2ZIH7HV.js";
30
- import "../../chunk-U7HFKR74.js";
31
- import "../../chunk-ETCVEV3S.js";
32
- import "../../chunk-CQ7657GA.js";
33
- import "../../chunk-324DM2L6.js";
34
- import "../../chunk-HWD32NP7.js";
35
- import "../../chunk-O6ZTD7ZI.js";
31
+ import "../../chunk-IRG52AN5.js";
32
+ import "../../chunk-WPED6CL3.js";
33
+ import "../../chunk-SSHG7MEE.js";
34
+ import "../../chunk-5WIHSJRO.js";
35
+ import "../../chunk-IFODQTCX.js";
36
36
  import {
37
37
  init_esm_shims
38
38
  } from "../../chunk-AWKZ5BDL.js";
@@ -128,12 +128,9 @@ var defaultProps = {
128
128
  selectedDomains: ["web"],
129
129
  selections: {},
130
130
  allSelections: [],
131
- focusedRow: 0,
132
- focusedCol: 0,
133
131
  showDescriptions: false,
134
132
  expertMode: false,
135
133
  onToggle: vi.fn(),
136
- onFocusChange: vi.fn(),
137
134
  onToggleDescriptions: vi.fn(),
138
135
  onContinue: vi.fn(),
139
136
  onBack: vi.fn()
@@ -206,7 +203,7 @@ describe("StepBuild component", () => {
206
203
  });
207
204
  cleanup = unmount;
208
205
  const output = lastFrame();
209
- globalExpect(output).toContain("Customise your Web stack");
206
+ globalExpect(output).toContain("Customize your Web stack");
210
207
  });
211
208
  it("should show ViewTitle with domain when only one selected", () => {
212
209
  const { lastFrame, unmount } = renderStepBuild({
@@ -214,7 +211,7 @@ describe("StepBuild component", () => {
214
211
  });
215
212
  cleanup = unmount;
216
213
  const output = lastFrame();
217
- globalExpect(output).toContain("Customise your Web stack");
214
+ globalExpect(output).toContain("Customize your Web stack");
218
215
  });
219
216
  it("should show ViewTitle for current domain on final domain", () => {
220
217
  const { lastFrame, unmount } = renderStepBuild({
@@ -223,7 +220,7 @@ describe("StepBuild component", () => {
223
220
  });
224
221
  cleanup = unmount;
225
222
  const output = lastFrame();
226
- globalExpect(output).toContain("Customise your API stack");
223
+ globalExpect(output).toContain("Customize your API stack");
227
224
  });
228
225
  it("should show correct domain display names", () => {
229
226
  const { lastFrame, unmount } = renderStepBuild({
@@ -232,7 +229,7 @@ describe("StepBuild component", () => {
232
229
  });
233
230
  cleanup = unmount;
234
231
  const output = lastFrame();
235
- globalExpect(output).toContain("Customise your API stack");
232
+ globalExpect(output).toContain("Customize your API stack");
236
233
  });
237
234
  });
238
235
  describe("category filtering", () => {
@@ -321,25 +318,10 @@ describe("StepBuild component", () => {
321
318
  await delay(INPUT_DELAY_MS);
322
319
  globalExpect(onBack).toHaveBeenCalled();
323
320
  });
324
- it("should pass focus callbacks to CategoryGrid", async () => {
325
- const onFocusChange = vi.fn();
326
- const { stdin, unmount } = renderStepBuild({
327
- onFocusChange,
328
- focusedRow: 0,
329
- focusedCol: 0
330
- });
331
- cleanup = unmount;
332
- await delay(RENDER_DELAY_MS);
333
- stdin.write("\x1B[B");
334
- await delay(INPUT_DELAY_MS);
335
- globalExpect(onFocusChange).toHaveBeenCalled();
336
- });
337
321
  it("should pass toggle callback to CategoryGrid", async () => {
338
322
  const onToggle = vi.fn();
339
323
  const { stdin, unmount } = renderStepBuild({
340
- onToggle,
341
- focusedRow: 0,
342
- focusedCol: 0
324
+ onToggle
343
325
  });
344
326
  cleanup = unmount;
345
327
  await delay(RENDER_DELAY_MS);
@@ -413,7 +395,7 @@ describe("StepBuild component", () => {
413
395
  });
414
396
  cleanup = unmount;
415
397
  const output = lastFrame();
416
- globalExpect(output).toContain("Customise your Web stack");
398
+ globalExpect(output).toContain("Customize your Web stack");
417
399
  });
418
400
  it("should show ViewTitle for last domain in multi-domain flow", () => {
419
401
  const { lastFrame, unmount } = renderStepBuild({
@@ -422,7 +404,7 @@ describe("StepBuild component", () => {
422
404
  });
423
405
  cleanup = unmount;
424
406
  const output = lastFrame();
425
- globalExpect(output).toContain("Customise your API stack");
407
+ globalExpect(output).toContain("Customize your API stack");
426
408
  });
427
409
  it("should show ViewTitle for current domain in three-domain flow", () => {
428
410
  const cliFrameworkCategory = createMockCategory("cli-framework", "CLI Framework", {
@@ -462,7 +444,7 @@ describe("StepBuild component", () => {
462
444
  });
463
445
  cleanup = unmount;
464
446
  const output = lastFrame();
465
- globalExpect(output).toContain("Customise your API stack");
447
+ globalExpect(output).toContain("Customize your API stack");
466
448
  });
467
449
  });
468
450
  describe("header and selection count", () => {
@@ -470,7 +452,7 @@ describe("StepBuild component", () => {
470
452
  const { lastFrame, unmount } = renderStepBuild();
471
453
  cleanup = unmount;
472
454
  const output = lastFrame();
473
- globalExpect(output).toContain("Customise your Web stack");
455
+ globalExpect(output).toContain("Customize your Web stack");
474
456
  });
475
457
  it("should render ViewTitle with domain display name", () => {
476
458
  const { lastFrame, unmount } = renderStepBuild({
@@ -478,7 +460,7 @@ describe("StepBuild component", () => {
478
460
  });
479
461
  cleanup = unmount;
480
462
  const output = lastFrame();
481
- globalExpect(output).toContain("Customise your API stack");
463
+ globalExpect(output).toContain("Customize your API stack");
482
464
  });
483
465
  });
484
466
  describe("keyboard help text", () => {
@@ -581,7 +563,7 @@ describe("StepBuild component", () => {
581
563
  stdin.write(ENTER);
582
564
  await delay(INPUT_DELAY_MS);
583
565
  const output = lastFrame();
584
- globalExpect(output).toContain("Please select");
566
+ globalExpect(output).toContain("Select at least one skill");
585
567
  globalExpect(onContinue).not.toHaveBeenCalled();
586
568
  });
587
569
  it("should call onContinue when validation passes", async () => {
@@ -601,17 +583,17 @@ describe("StepBuild component", () => {
601
583
  });
602
584
  });
603
585
  });
604
- describe("getDisplayLabel", () => {
586
+ describe("getSkillDisplayLabel", () => {
605
587
  it("should return displayName when available", () => {
606
- globalExpect(getDisplayLabel({ displayName: "react", id: "web-framework-react" })).toBe("react");
588
+ globalExpect(getSkillDisplayLabel({ displayName: "react", id: "web-framework-react" })).toBe("react");
607
589
  });
608
590
  it("should return id when no displayName", () => {
609
- globalExpect(getDisplayLabel({ id: "web-framework-react" })).toBe("web-framework-react");
591
+ globalExpect(getSkillDisplayLabel({ id: "web-framework-react" })).toBe("web-framework-react");
610
592
  });
611
593
  it("should prefer displayName over id", () => {
612
- globalExpect(getDisplayLabel({ displayName: "scss-modules", id: "web-styling-scss-modules" })).toBe(
613
- "scss-modules"
614
- );
594
+ globalExpect(
595
+ getSkillDisplayLabel({ displayName: "scss-modules", id: "web-styling-scss-modules" })
596
+ ).toBe("scss-modules");
615
597
  });
616
598
  });
617
599
  //# sourceMappingURL=step-build.test.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/cli/components/wizard/step-build.test.tsx"],"sourcesContent":["import { render } from \"ink-testing-library\";\nimport { indexBy, mapToObj } from \"remeda\";\nimport { describe, expect, it, afterEach, vi } from \"vitest\";\nimport { StepBuild, type StepBuildProps, validateBuildStep, getDisplayLabel } from \"./step-build\";\nimport type { CategoryRow as GridCategoryRow } from \"./category-grid\";\nimport type {\n CategoryDefinition,\n ResolvedSkill,\n SkillDisplayName,\n SkillId,\n Subcategory,\n SubcategorySelections,\n} from \"../../types\";\nimport {\n ENTER,\n ESCAPE,\n RENDER_DELAY_MS,\n INPUT_DELAY_MS,\n delay,\n} from \"../../lib/__tests__/test-constants\";\nimport { createMockCategory, createMockSkill, createMockMatrix } from \"../../lib/__tests__/helpers\";\n\nconst SKILL_DEFAULTS: Partial<ResolvedSkill> = { categoryExclusive: true };\n\nconst buildTestMatrix = (categories: CategoryDefinition[], skills: ResolvedSkill[]) => {\n const withDisplayName = skills.filter((s) => s.displayName);\n return createMockMatrix(\n indexBy(skills, (s) => s.id),\n {\n categories: indexBy(categories, (c) => c.id) as Record<Subcategory, CategoryDefinition>,\n displayNameToId: mapToObj(withDisplayName, (s) => [s.displayName!, s.id]) as Record<\n SkillDisplayName,\n SkillId\n >,\n displayNames: mapToObj(withDisplayName, (s) => [s.id, s.displayName!]) as Record<\n SkillId,\n SkillDisplayName\n >,\n },\n );\n};\n\nconst frameworkCategory = createMockCategory(\"framework\", \"Framework\", {\n domain: \"web\",\n required: true,\n order: 0,\n});\n\nconst stylingCategory = createMockCategory(\"styling\", \"Styling\", {\n domain: \"web\",\n required: true,\n order: 1,\n});\n\nconst stateCategory = createMockCategory(\"client-state\", \"Client State\", {\n domain: \"web\",\n required: false,\n order: 2,\n});\n\nconst apiFrameworkCategory = createMockCategory(\"api\", \"API Framework\", {\n domain: \"api\",\n required: true,\n order: 0,\n});\n\nconst databaseCategory = createMockCategory(\"database\", \"Database\", {\n domain: \"api\",\n required: false,\n order: 1,\n});\n\nconst reactSkill = createMockSkill(\"web-framework-react\", \"framework\", {\n ...SKILL_DEFAULTS,\n displayName: \"react\",\n});\n\nconst vueSkill = createMockSkill(\"web-framework-vue\", \"framework\", {\n ...SKILL_DEFAULTS,\n displayName: \"vue\",\n});\n\nconst tailwindSkill = createMockSkill(\"web-styling-tailwind\", \"styling\", {\n ...SKILL_DEFAULTS,\n displayName: \"tailwind\",\n});\n\nconst scssSkill = createMockSkill(\"web-styling-scss-modules\", \"styling\", {\n ...SKILL_DEFAULTS,\n displayName: \"scss-modules\",\n});\n\nconst zustandSkill = createMockSkill(\"web-state-zustand\", \"client-state\", {\n ...SKILL_DEFAULTS,\n displayName: \"zustand\",\n});\n\nconst honoSkill = createMockSkill(\"api-framework-hono\", \"api\", {\n ...SKILL_DEFAULTS,\n displayName: \"hono\",\n});\n\nconst expressSkill = createMockSkill(\"api-framework-express\", \"api\", {\n ...SKILL_DEFAULTS,\n displayName: \"express\",\n});\n\nconst postgresSkill = createMockSkill(\"api-database-postgres\", \"database\", {\n ...SKILL_DEFAULTS,\n});\n\nconst defaultMatrix = buildTestMatrix(\n [frameworkCategory, stylingCategory, stateCategory, apiFrameworkCategory, databaseCategory],\n [\n reactSkill,\n vueSkill,\n tailwindSkill,\n scssSkill,\n zustandSkill,\n honoSkill,\n expressSkill,\n postgresSkill,\n ],\n);\n\nconst defaultProps: StepBuildProps = {\n matrix: defaultMatrix,\n domain: \"web\",\n selectedDomains: [\"web\"],\n selections: {},\n allSelections: [],\n focusedRow: 0,\n focusedCol: 0,\n showDescriptions: false,\n expertMode: false,\n onToggle: vi.fn(),\n onFocusChange: vi.fn(),\n onToggleDescriptions: vi.fn(),\n onContinue: vi.fn(),\n onBack: vi.fn(),\n};\n\nconst renderStepBuild = (props: Partial<StepBuildProps> = {}) => {\n return render(<StepBuild {...defaultProps} {...props} />);\n};\n\ndescribe(\"StepBuild component\", () => {\n let cleanup: (() => void) | undefined;\n\n afterEach(() => {\n cleanup?.();\n cleanup = undefined;\n });\n\n describe(\"rendering\", () => {\n it(\"should render CategoryGrid with correct categories for domain\", () => {\n // For web domain with framework-first flow, initially only shows Framework\n // To see other categories, need a framework selection\n const { lastFrame, unmount } = renderStepBuild({\n selections: { framework: [\"web-framework-react\"] }, // Framework selected to show other categories\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // Web domain should show Framework, Styling, Client State (when framework selected)\n expect(output).toContain(\"Framework\");\n expect(output).toContain(\"Styling\");\n expect(output).toContain(\"Client State\");\n // Should NOT show API categories\n expect(output).not.toContain(\"API Framework\");\n expect(output).not.toContain(\"Database\");\n });\n\n it(\"should render API categories when domain is api\", () => {\n const { lastFrame, unmount } = renderStepBuild({\n domain: \"api\",\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // API domain should show API Framework, Database\n expect(output).toContain(\"API Framework\");\n expect(output).toContain(\"Database\");\n // Should NOT show Web categories\n expect(output).not.toContain(\"Styling\");\n expect(output).not.toContain(\"Client State\");\n });\n\n it(\"should render skills as options\", () => {\n // Need framework selected to see other categories in web domain\n const { lastFrame, unmount } = renderStepBuild({\n selections: { framework: [\"web-framework-react\"] },\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // Framework skills (displayed as alias)\n expect(output).toContain(\"react\");\n expect(output).toContain(\"vue\");\n // Styling skills (visible after framework selected)\n expect(output).toContain(\"tailwind\");\n expect(output).toContain(\"scss-modules\");\n });\n\n it(\"should show required indicator (*) for required categories\", () => {\n const { lastFrame, unmount } = renderStepBuild();\n cleanup = unmount;\n\n const output = lastFrame();\n // Framework and Styling are required\n expect(output).toContain(\"*\");\n });\n\n it(\"should render categories for the domain\", () => {\n const { lastFrame, unmount } = renderStepBuild({\n selections: { framework: [\"web-framework-react\"] },\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // Should render the domain categories\n expect(output).toContain(\"Framework\");\n expect(output).toContain(\"Styling\");\n });\n });\n\n describe(\"domain header\", () => {\n it(\"should show ViewTitle with current domain when multiple domains selected\", () => {\n const { lastFrame, unmount } = renderStepBuild({\n selectedDomains: [\"web\", \"api\"],\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Customise your Web stack\");\n });\n\n it(\"should show ViewTitle with domain when only one selected\", () => {\n const { lastFrame, unmount } = renderStepBuild({\n selectedDomains: [\"web\"],\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Customise your Web stack\");\n });\n\n it(\"should show ViewTitle for current domain on final domain\", () => {\n const { lastFrame, unmount } = renderStepBuild({\n selectedDomains: [\"web\", \"api\"],\n domain: \"api\",\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Customise your API stack\");\n });\n\n it(\"should show correct domain display names\", () => {\n const { lastFrame, unmount } = renderStepBuild({\n selectedDomains: [\"web\", \"api\", \"cli\"],\n domain: \"api\",\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Customise your API stack\");\n });\n });\n\n describe(\"category filtering\", () => {\n it(\"should filter categories correctly by domain\", () => {\n // Web domain with framework selected (to bypass framework-first filter)\n const { lastFrame: webFrame, unmount: webUnmount } = renderStepBuild({\n domain: \"web\",\n selections: { framework: [\"web-framework-react\"] },\n });\n const webOutput = webFrame();\n webUnmount();\n\n // API domain (no framework-first filter for API)\n const { lastFrame: apiFrame, unmount: apiUnmount } = renderStepBuild({\n domain: \"api\",\n });\n cleanup = apiUnmount;\n const apiOutput = apiFrame();\n\n // Web should have Framework, Styling, Client State (with framework selected)\n expect(webOutput).toContain(\"Framework\");\n expect(webOutput).toContain(\"Styling\");\n expect(webOutput).toContain(\"Client State\");\n expect(webOutput).not.toContain(\"API Framework\");\n\n // API should have API Framework, Database\n expect(apiOutput).toContain(\"API Framework\");\n expect(apiOutput).toContain(\"Database\");\n expect(apiOutput).not.toContain(\"Styling\");\n });\n\n it(\"should sort categories by order\", () => {\n // Need framework selected to see all categories\n const { lastFrame, unmount } = renderStepBuild({\n selections: { framework: [\"web-framework-react\"] },\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // Framework (order 0) should appear before Styling (order 1)\n // and Styling before Client State (order 2)\n const frameworkIndex = output?.indexOf(\"Framework\") ?? -1;\n const stylingIndex = output?.indexOf(\"Styling\") ?? -1;\n const stateIndex = output?.indexOf(\"Client State\") ?? -1;\n\n expect(frameworkIndex).toBeLessThan(stylingIndex);\n expect(stylingIndex).toBeLessThan(stateIndex);\n });\n });\n\n describe(\"option states\", () => {\n it(\"should show selected options correctly\", () => {\n const { lastFrame, unmount } = renderStepBuild({\n allSelections: [\"web-framework-react\"],\n selections: { framework: [\"web-framework-react\"] },\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // Should show selected option (no circle symbol anymore, uses background)\n // Just verify the selected label is present (displayed as alias)\n expect(output).toContain(\"react\");\n });\n\n it(\"should pass expertMode to CategoryGrid\", () => {\n const { lastFrame, unmount } = renderStepBuild({\n expertMode: true,\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // Expert mode is passed to CategoryGrid for option sorting behavior\n // The visual indicator is now shown globally in wizard-layout, not in CategoryGrid header\n expect(output).toBeDefined();\n });\n\n it(\"should pass showDescriptions to CategoryGrid\", () => {\n const { lastFrame, unmount } = renderStepBuild({\n showDescriptions: true,\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // Descriptions toggle is now shown globally in wizard-layout\n // Verify component renders without error\n expect(output).toBeDefined();\n });\n });\n\n describe(\"keyboard navigation\", () => {\n it(\"should call onContinue when Enter is pressed with valid selections\", async () => {\n const onContinue = vi.fn();\n // Provide selections for required categories to pass validation\n const { stdin, unmount } = renderStepBuild({\n onContinue,\n selections: {\n framework: [\"web-framework-react\"],\n styling: [\"web-styling-tailwind\"],\n },\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n stdin.write(ENTER);\n await delay(INPUT_DELAY_MS);\n\n expect(onContinue).toHaveBeenCalled();\n });\n\n it(\"should call onBack when Escape is pressed\", async () => {\n const onBack = vi.fn();\n const { stdin, unmount } = renderStepBuild({ onBack });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n stdin.write(ESCAPE);\n await delay(INPUT_DELAY_MS);\n\n expect(onBack).toHaveBeenCalled();\n });\n\n it(\"should pass focus callbacks to CategoryGrid\", async () => {\n const onFocusChange = vi.fn();\n const { stdin, unmount } = renderStepBuild({\n onFocusChange,\n focusedRow: 0,\n focusedCol: 0,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n // Arrow down should trigger focus change\n stdin.write(\"\\x1B[B\"); // Arrow down\n await delay(INPUT_DELAY_MS);\n\n expect(onFocusChange).toHaveBeenCalled();\n });\n\n it(\"should pass toggle callback to CategoryGrid\", async () => {\n const onToggle = vi.fn();\n const { stdin, unmount } = renderStepBuild({\n onToggle,\n focusedRow: 0,\n focusedCol: 0,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n // Space should trigger toggle\n stdin.write(\" \");\n await delay(INPUT_DELAY_MS);\n\n expect(onToggle).toHaveBeenCalled();\n });\n });\n\n describe(\"toggle callbacks\", () => {\n it(\"should pass onToggleDescriptions to CategoryGrid\", async () => {\n const onToggleDescriptions = vi.fn();\n const { stdin, unmount } = renderStepBuild({ onToggleDescriptions });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n stdin.write(\"d\"); // 'd' key toggles descriptions\n await delay(INPUT_DELAY_MS);\n\n expect(onToggleDescriptions).toHaveBeenCalled();\n });\n\n it(\"should not handle expert mode toggle locally (handled globally)\", () => {\n // Expert mode toggle is now handled at wizard.tsx level\n // StepBuild no longer has onToggleExpertMode prop\n const { lastFrame, unmount } = renderStepBuild();\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toBeDefined();\n });\n });\n\n describe(\"edge cases\", () => {\n it(\"should handle domain with no categories\", () => {\n const { lastFrame, unmount } = renderStepBuild({\n domain: \"mobile\", // No mobile categories in test matrix\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // Should show empty state message from CategoryGrid\n expect(output).toContain(\"No categories to display\");\n });\n\n it(\"should handle unknown domain gracefully\", () => {\n const { lastFrame, unmount } = renderStepBuild({\n domain: \"shared\",\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // Should render without crashing\n expect(output).toBeDefined();\n });\n\n it(\"should handle empty allSelections\", () => {\n const { lastFrame, unmount } = renderStepBuild({\n allSelections: [],\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Framework\");\n });\n\n it(\"should handle allSelections with skills from other domains\", () => {\n const { lastFrame, unmount } = renderStepBuild({\n domain: \"web\",\n allSelections: [\"api-framework-hono\", \"api-database-drizzle\"], // API skills (aliases)\n selections: { framework: [\"web-framework-react\"] }, // Need framework to see other categories\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // Should still render web categories\n expect(output).toContain(\"Framework\");\n expect(output).toContain(\"Styling\");\n });\n });\n\n describe(\"multi-domain scenarios\", () => {\n it(\"should show ViewTitle for current domain in multi-domain flow\", () => {\n const { lastFrame, unmount } = renderStepBuild({\n domain: \"web\",\n selectedDomains: [\"web\", \"api\"],\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Customise your Web stack\");\n });\n\n it(\"should show ViewTitle for last domain in multi-domain flow\", () => {\n const { lastFrame, unmount } = renderStepBuild({\n domain: \"api\",\n selectedDomains: [\"web\", \"api\"],\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Customise your API stack\");\n });\n\n it(\"should show ViewTitle for current domain in three-domain flow\", () => {\n // Add cli category to matrix\n const cliFrameworkCategory = createMockCategory(\"cli-framework\", \"CLI Framework\", {\n domain: \"cli\",\n required: true,\n order: 0,\n });\n const commanderSkill = createMockSkill(\"cli-cli-framework-commander\", \"cli-framework\", {\n ...SKILL_DEFAULTS,\n displayName: \"commander\",\n });\n\n const matrixWithCli = buildTestMatrix(\n [\n frameworkCategory,\n stylingCategory,\n stateCategory,\n apiFrameworkCategory,\n databaseCategory,\n cliFrameworkCategory,\n ],\n [\n reactSkill,\n vueSkill,\n tailwindSkill,\n scssSkill,\n zustandSkill,\n honoSkill,\n expressSkill,\n postgresSkill,\n commanderSkill,\n ],\n );\n\n const { lastFrame, unmount } = renderStepBuild({\n matrix: matrixWithCli,\n domain: \"api\",\n selectedDomains: [\"web\", \"api\", \"cli\"],\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Customise your API stack\");\n });\n });\n\n describe(\"header and selection count\", () => {\n it(\"should show ViewTitle with domain name\", () => {\n const { lastFrame, unmount } = renderStepBuild();\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Customise your Web stack\");\n });\n\n it(\"should render ViewTitle with domain display name\", () => {\n const { lastFrame, unmount } = renderStepBuild({\n domain: \"api\",\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Customise your API stack\");\n });\n });\n\n describe(\"keyboard help text\", () => {\n it(\"should respond to d key for toggling descriptions\", async () => {\n const onToggleDescriptions = vi.fn();\n const { stdin, unmount } = renderStepBuild({ onToggleDescriptions });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n stdin.write(\"d\");\n await delay(INPUT_DELAY_MS);\n\n expect(onToggleDescriptions).toHaveBeenCalled();\n });\n });\n\n describe(\"validateBuildStep\", () => {\n it(\"should return valid when required categories have selections\", () => {\n const categories: GridCategoryRow[] = [\n {\n id: \"framework\",\n displayName: \"Framework\",\n required: true,\n exclusive: true,\n options: [{ id: \"web-framework-react\", label: \"React\", state: \"normal\", selected: true }],\n },\n ];\n const selections: SubcategorySelections = { framework: [\"web-framework-react\"] };\n\n const result = validateBuildStep(categories, selections);\n expect(result.valid).toBe(true);\n expect(result.message).toBeUndefined();\n });\n\n it(\"should return invalid when required category has no selection\", () => {\n const categories: GridCategoryRow[] = [\n {\n id: \"framework\",\n displayName: \"Framework\",\n required: true,\n exclusive: true,\n options: [\n { id: \"web-framework-react\", label: \"React\", state: \"normal\", selected: false },\n ],\n },\n ];\n const selections: SubcategorySelections = {};\n\n const result = validateBuildStep(categories, selections);\n expect(result.valid).toBe(false);\n expect(result.message).toContain(\"Framework\");\n });\n\n it(\"should return valid when optional categories have no selections\", () => {\n const categories: GridCategoryRow[] = [\n {\n id: \"client-state\",\n displayName: \"State Management\",\n required: false,\n exclusive: true,\n options: [\n {\n id: \"web-state-zustand\",\n label: \"Zustand\",\n state: \"normal\",\n selected: false,\n },\n ],\n },\n ];\n const selections: SubcategorySelections = {};\n\n const result = validateBuildStep(categories, selections);\n expect(result.valid).toBe(true);\n });\n\n it(\"should return invalid for first missing required category\", () => {\n const categories: GridCategoryRow[] = [\n {\n id: \"framework\",\n displayName: \"Framework\",\n required: true,\n exclusive: true,\n options: [],\n },\n {\n id: \"styling\",\n displayName: \"Styling\",\n required: true,\n exclusive: true,\n options: [],\n },\n ];\n const selections: SubcategorySelections = {};\n\n const result = validateBuildStep(categories, selections);\n expect(result.valid).toBe(false);\n expect(result.message).toContain(\"Framework\"); // Should be the first one\n });\n });\n\n describe(\"validation on continue\", () => {\n it(\"should show validation error when trying to continue without required selection\", async () => {\n const onContinue = vi.fn();\n const { stdin, lastFrame, unmount } = renderStepBuild({\n onContinue,\n selections: {},\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n // Press Enter to continue without selecting required framework\n stdin.write(ENTER);\n await delay(INPUT_DELAY_MS);\n\n // Should show validation error and NOT call onContinue\n const output = lastFrame();\n expect(output).toContain(\"Please select\");\n expect(onContinue).not.toHaveBeenCalled();\n });\n\n it(\"should call onContinue when validation passes\", async () => {\n const onContinue = vi.fn();\n const { stdin, unmount } = renderStepBuild({\n onContinue,\n selections: {\n framework: [\"web-framework-react\"],\n styling: [\"web-styling-tailwind\"],\n },\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n // Press Enter to continue with required selections\n stdin.write(ENTER);\n await delay(INPUT_DELAY_MS);\n\n expect(onContinue).toHaveBeenCalled();\n });\n });\n});\n\ndescribe(\"getDisplayLabel\", () => {\n it(\"should return displayName when available\", () => {\n expect(getDisplayLabel({ displayName: \"react\", id: \"web-framework-react\" })).toBe(\"react\");\n });\n\n it(\"should return id when no displayName\", () => {\n expect(getDisplayLabel({ id: \"web-framework-react\" })).toBe(\"web-framework-react\");\n });\n\n it(\"should prefer displayName over id\", () => {\n expect(getDisplayLabel({ displayName: \"scss-modules\", id: \"web-styling-scss-modules\" })).toBe(\n \"scss-modules\",\n );\n });\n});\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/cli/components/wizard/step-build.test.tsx"],"sourcesContent":["import { render } from \"ink-testing-library\";\nimport { indexBy, mapToObj } from \"remeda\";\nimport { describe, expect, it, afterEach, vi } from \"vitest\";\nimport { StepBuild, type StepBuildProps } from \"./step-build\";\nimport { validateBuildStep, getSkillDisplayLabel } from \"../../lib/wizard/index\";\nimport type { CategoryRow as GridCategoryRow } from \"./category-grid\";\nimport type {\n CategoryDefinition,\n ResolvedSkill,\n SkillDisplayName,\n SkillId,\n Subcategory,\n SubcategorySelections,\n} from \"../../types\";\nimport {\n ENTER,\n ESCAPE,\n RENDER_DELAY_MS,\n INPUT_DELAY_MS,\n delay,\n} from \"../../lib/__tests__/test-constants\";\nimport { createMockCategory, createMockSkill, createMockMatrix } from \"../../lib/__tests__/helpers\";\n\nconst SKILL_DEFAULTS: Partial<ResolvedSkill> = { categoryExclusive: true };\n\nconst buildTestMatrix = (categories: CategoryDefinition[], skills: ResolvedSkill[]) => {\n const withDisplayName = skills.filter((s) => s.displayName);\n return createMockMatrix(\n indexBy(skills, (s) => s.id),\n {\n categories: indexBy(categories, (c) => c.id) as Record<Subcategory, CategoryDefinition>,\n displayNameToId: mapToObj(withDisplayName, (s) => [s.displayName!, s.id]) as Record<\n SkillDisplayName,\n SkillId\n >,\n displayNames: mapToObj(withDisplayName, (s) => [s.id, s.displayName!]) as Record<\n SkillId,\n SkillDisplayName\n >,\n },\n );\n};\n\nconst frameworkCategory = createMockCategory(\"framework\", \"Framework\", {\n domain: \"web\",\n required: true,\n order: 0,\n});\n\nconst stylingCategory = createMockCategory(\"styling\", \"Styling\", {\n domain: \"web\",\n required: true,\n order: 1,\n});\n\nconst stateCategory = createMockCategory(\"client-state\", \"Client State\", {\n domain: \"web\",\n required: false,\n order: 2,\n});\n\nconst apiFrameworkCategory = createMockCategory(\"api\", \"API Framework\", {\n domain: \"api\",\n required: true,\n order: 0,\n});\n\nconst databaseCategory = createMockCategory(\"database\", \"Database\", {\n domain: \"api\",\n required: false,\n order: 1,\n});\n\nconst reactSkill = createMockSkill(\"web-framework-react\", \"framework\", {\n ...SKILL_DEFAULTS,\n displayName: \"react\",\n});\n\nconst vueSkill = createMockSkill(\"web-framework-vue\", \"framework\", {\n ...SKILL_DEFAULTS,\n displayName: \"vue\",\n});\n\nconst tailwindSkill = createMockSkill(\"web-styling-tailwind\", \"styling\", {\n ...SKILL_DEFAULTS,\n displayName: \"tailwind\",\n});\n\nconst scssSkill = createMockSkill(\"web-styling-scss-modules\", \"styling\", {\n ...SKILL_DEFAULTS,\n displayName: \"scss-modules\",\n});\n\nconst zustandSkill = createMockSkill(\"web-state-zustand\", \"client-state\", {\n ...SKILL_DEFAULTS,\n displayName: \"zustand\",\n});\n\nconst honoSkill = createMockSkill(\"api-framework-hono\", \"api\", {\n ...SKILL_DEFAULTS,\n displayName: \"hono\",\n});\n\nconst expressSkill = createMockSkill(\"api-framework-express\", \"api\", {\n ...SKILL_DEFAULTS,\n displayName: \"express\",\n});\n\nconst postgresSkill = createMockSkill(\"api-database-postgres\", \"database\", {\n ...SKILL_DEFAULTS,\n});\n\nconst defaultMatrix = buildTestMatrix(\n [frameworkCategory, stylingCategory, stateCategory, apiFrameworkCategory, databaseCategory],\n [\n reactSkill,\n vueSkill,\n tailwindSkill,\n scssSkill,\n zustandSkill,\n honoSkill,\n expressSkill,\n postgresSkill,\n ],\n);\n\nconst defaultProps: StepBuildProps = {\n matrix: defaultMatrix,\n domain: \"web\",\n selectedDomains: [\"web\"],\n selections: {},\n allSelections: [],\n showDescriptions: false,\n expertMode: false,\n onToggle: vi.fn(),\n onToggleDescriptions: vi.fn(),\n onContinue: vi.fn(),\n onBack: vi.fn(),\n};\n\nconst renderStepBuild = (props: Partial<StepBuildProps> = {}) => {\n return render(<StepBuild {...defaultProps} {...props} />);\n};\n\ndescribe(\"StepBuild component\", () => {\n let cleanup: (() => void) | undefined;\n\n afterEach(() => {\n cleanup?.();\n cleanup = undefined;\n });\n\n describe(\"rendering\", () => {\n it(\"should render CategoryGrid with correct categories for domain\", () => {\n // For web domain with framework-first flow, initially only shows Framework\n // To see other categories, need a framework selection\n const { lastFrame, unmount } = renderStepBuild({\n selections: { framework: [\"web-framework-react\"] }, // Framework selected to show other categories\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // Web domain should show Framework, Styling, Client State (when framework selected)\n expect(output).toContain(\"Framework\");\n expect(output).toContain(\"Styling\");\n expect(output).toContain(\"Client State\");\n // Should NOT show API categories\n expect(output).not.toContain(\"API Framework\");\n expect(output).not.toContain(\"Database\");\n });\n\n it(\"should render API categories when domain is api\", () => {\n const { lastFrame, unmount } = renderStepBuild({\n domain: \"api\",\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // API domain should show API Framework, Database\n expect(output).toContain(\"API Framework\");\n expect(output).toContain(\"Database\");\n // Should NOT show Web categories\n expect(output).not.toContain(\"Styling\");\n expect(output).not.toContain(\"Client State\");\n });\n\n it(\"should render skills as options\", () => {\n // Need framework selected to see other categories in web domain\n const { lastFrame, unmount } = renderStepBuild({\n selections: { framework: [\"web-framework-react\"] },\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // Framework skills (displayed as alias)\n expect(output).toContain(\"react\");\n expect(output).toContain(\"vue\");\n // Styling skills (visible after framework selected)\n expect(output).toContain(\"tailwind\");\n expect(output).toContain(\"scss-modules\");\n });\n\n it(\"should show required indicator (*) for required categories\", () => {\n const { lastFrame, unmount } = renderStepBuild();\n cleanup = unmount;\n\n const output = lastFrame();\n // Framework and Styling are required\n expect(output).toContain(\"*\");\n });\n\n it(\"should render categories for the domain\", () => {\n const { lastFrame, unmount } = renderStepBuild({\n selections: { framework: [\"web-framework-react\"] },\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // Should render the domain categories\n expect(output).toContain(\"Framework\");\n expect(output).toContain(\"Styling\");\n });\n });\n\n describe(\"domain header\", () => {\n it(\"should show ViewTitle with current domain when multiple domains selected\", () => {\n const { lastFrame, unmount } = renderStepBuild({\n selectedDomains: [\"web\", \"api\"],\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Customize your Web stack\");\n });\n\n it(\"should show ViewTitle with domain when only one selected\", () => {\n const { lastFrame, unmount } = renderStepBuild({\n selectedDomains: [\"web\"],\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Customize your Web stack\");\n });\n\n it(\"should show ViewTitle for current domain on final domain\", () => {\n const { lastFrame, unmount } = renderStepBuild({\n selectedDomains: [\"web\", \"api\"],\n domain: \"api\",\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Customize your API stack\");\n });\n\n it(\"should show correct domain display names\", () => {\n const { lastFrame, unmount } = renderStepBuild({\n selectedDomains: [\"web\", \"api\", \"cli\"],\n domain: \"api\",\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Customize your API stack\");\n });\n });\n\n describe(\"category filtering\", () => {\n it(\"should filter categories correctly by domain\", () => {\n // Web domain with framework selected (to bypass framework-first filter)\n const { lastFrame: webFrame, unmount: webUnmount } = renderStepBuild({\n domain: \"web\",\n selections: { framework: [\"web-framework-react\"] },\n });\n const webOutput = webFrame();\n webUnmount();\n\n // API domain (no framework-first filter for API)\n const { lastFrame: apiFrame, unmount: apiUnmount } = renderStepBuild({\n domain: \"api\",\n });\n cleanup = apiUnmount;\n const apiOutput = apiFrame();\n\n // Web should have Framework, Styling, Client State (with framework selected)\n expect(webOutput).toContain(\"Framework\");\n expect(webOutput).toContain(\"Styling\");\n expect(webOutput).toContain(\"Client State\");\n expect(webOutput).not.toContain(\"API Framework\");\n\n // API should have API Framework, Database\n expect(apiOutput).toContain(\"API Framework\");\n expect(apiOutput).toContain(\"Database\");\n expect(apiOutput).not.toContain(\"Styling\");\n });\n\n it(\"should sort categories by order\", () => {\n // Need framework selected to see all categories\n const { lastFrame, unmount } = renderStepBuild({\n selections: { framework: [\"web-framework-react\"] },\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // Framework (order 0) should appear before Styling (order 1)\n // and Styling before Client State (order 2)\n const frameworkIndex = output?.indexOf(\"Framework\") ?? -1;\n const stylingIndex = output?.indexOf(\"Styling\") ?? -1;\n const stateIndex = output?.indexOf(\"Client State\") ?? -1;\n\n expect(frameworkIndex).toBeLessThan(stylingIndex);\n expect(stylingIndex).toBeLessThan(stateIndex);\n });\n });\n\n describe(\"option states\", () => {\n it(\"should show selected options correctly\", () => {\n const { lastFrame, unmount } = renderStepBuild({\n allSelections: [\"web-framework-react\"],\n selections: { framework: [\"web-framework-react\"] },\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // Should show selected option (no circle symbol anymore, uses background)\n // Just verify the selected label is present (displayed as alias)\n expect(output).toContain(\"react\");\n });\n\n it(\"should pass expertMode to CategoryGrid\", () => {\n const { lastFrame, unmount } = renderStepBuild({\n expertMode: true,\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // Expert mode is passed to CategoryGrid for option sorting behavior\n // The visual indicator is now shown globally in wizard-layout, not in CategoryGrid header\n expect(output).toBeDefined();\n });\n\n it(\"should pass showDescriptions to CategoryGrid\", () => {\n const { lastFrame, unmount } = renderStepBuild({\n showDescriptions: true,\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // Descriptions toggle is now shown globally in wizard-layout\n // Verify component renders without error\n expect(output).toBeDefined();\n });\n });\n\n describe(\"keyboard navigation\", () => {\n it(\"should call onContinue when Enter is pressed with valid selections\", async () => {\n const onContinue = vi.fn();\n // Provide selections for required categories to pass validation\n const { stdin, unmount } = renderStepBuild({\n onContinue,\n selections: {\n framework: [\"web-framework-react\"],\n styling: [\"web-styling-tailwind\"],\n },\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n stdin.write(ENTER);\n await delay(INPUT_DELAY_MS);\n\n expect(onContinue).toHaveBeenCalled();\n });\n\n it(\"should call onBack when Escape is pressed\", async () => {\n const onBack = vi.fn();\n const { stdin, unmount } = renderStepBuild({ onBack });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n stdin.write(ESCAPE);\n await delay(INPUT_DELAY_MS);\n\n expect(onBack).toHaveBeenCalled();\n });\n\n it(\"should pass toggle callback to CategoryGrid\", async () => {\n const onToggle = vi.fn();\n const { stdin, unmount } = renderStepBuild({\n onToggle,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n // Space should trigger toggle\n stdin.write(\" \");\n await delay(INPUT_DELAY_MS);\n\n expect(onToggle).toHaveBeenCalled();\n });\n });\n\n describe(\"toggle callbacks\", () => {\n it(\"should pass onToggleDescriptions to CategoryGrid\", async () => {\n const onToggleDescriptions = vi.fn();\n const { stdin, unmount } = renderStepBuild({ onToggleDescriptions });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n stdin.write(\"d\"); // 'd' key toggles descriptions\n await delay(INPUT_DELAY_MS);\n\n expect(onToggleDescriptions).toHaveBeenCalled();\n });\n\n it(\"should not handle expert mode toggle locally (handled globally)\", () => {\n // Expert mode toggle is now handled at wizard.tsx level\n // StepBuild no longer has onToggleExpertMode prop\n const { lastFrame, unmount } = renderStepBuild();\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toBeDefined();\n });\n });\n\n describe(\"edge cases\", () => {\n it(\"should handle domain with no categories\", () => {\n const { lastFrame, unmount } = renderStepBuild({\n domain: \"mobile\", // No mobile categories in test matrix\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // Should show empty state message from CategoryGrid\n expect(output).toContain(\"No categories to display\");\n });\n\n it(\"should handle unknown domain gracefully\", () => {\n const { lastFrame, unmount } = renderStepBuild({\n domain: \"shared\",\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // Should render without crashing\n expect(output).toBeDefined();\n });\n\n it(\"should handle empty allSelections\", () => {\n const { lastFrame, unmount } = renderStepBuild({\n allSelections: [],\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Framework\");\n });\n\n it(\"should handle allSelections with skills from other domains\", () => {\n const { lastFrame, unmount } = renderStepBuild({\n domain: \"web\",\n allSelections: [\"api-framework-hono\", \"api-database-drizzle\"], // API skills (aliases)\n selections: { framework: [\"web-framework-react\"] }, // Need framework to see other categories\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // Should still render web categories\n expect(output).toContain(\"Framework\");\n expect(output).toContain(\"Styling\");\n });\n });\n\n describe(\"multi-domain scenarios\", () => {\n it(\"should show ViewTitle for current domain in multi-domain flow\", () => {\n const { lastFrame, unmount } = renderStepBuild({\n domain: \"web\",\n selectedDomains: [\"web\", \"api\"],\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Customize your Web stack\");\n });\n\n it(\"should show ViewTitle for last domain in multi-domain flow\", () => {\n const { lastFrame, unmount } = renderStepBuild({\n domain: \"api\",\n selectedDomains: [\"web\", \"api\"],\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Customize your API stack\");\n });\n\n it(\"should show ViewTitle for current domain in three-domain flow\", () => {\n // Add cli category to matrix\n const cliFrameworkCategory = createMockCategory(\"cli-framework\", \"CLI Framework\", {\n domain: \"cli\",\n required: true,\n order: 0,\n });\n const commanderSkill = createMockSkill(\"cli-cli-framework-commander\", \"cli-framework\", {\n ...SKILL_DEFAULTS,\n displayName: \"commander\",\n });\n\n const matrixWithCli = buildTestMatrix(\n [\n frameworkCategory,\n stylingCategory,\n stateCategory,\n apiFrameworkCategory,\n databaseCategory,\n cliFrameworkCategory,\n ],\n [\n reactSkill,\n vueSkill,\n tailwindSkill,\n scssSkill,\n zustandSkill,\n honoSkill,\n expressSkill,\n postgresSkill,\n commanderSkill,\n ],\n );\n\n const { lastFrame, unmount } = renderStepBuild({\n matrix: matrixWithCli,\n domain: \"api\",\n selectedDomains: [\"web\", \"api\", \"cli\"],\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Customize your API stack\");\n });\n });\n\n describe(\"header and selection count\", () => {\n it(\"should show ViewTitle with domain name\", () => {\n const { lastFrame, unmount } = renderStepBuild();\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Customize your Web stack\");\n });\n\n it(\"should render ViewTitle with domain display name\", () => {\n const { lastFrame, unmount } = renderStepBuild({\n domain: \"api\",\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Customize your API stack\");\n });\n });\n\n describe(\"keyboard help text\", () => {\n it(\"should respond to d key for toggling descriptions\", async () => {\n const onToggleDescriptions = vi.fn();\n const { stdin, unmount } = renderStepBuild({ onToggleDescriptions });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n stdin.write(\"d\");\n await delay(INPUT_DELAY_MS);\n\n expect(onToggleDescriptions).toHaveBeenCalled();\n });\n });\n\n describe(\"validateBuildStep\", () => {\n it(\"should return valid when required categories have selections\", () => {\n const categories: GridCategoryRow[] = [\n {\n id: \"framework\",\n displayName: \"Framework\",\n required: true,\n exclusive: true,\n options: [{ id: \"web-framework-react\", label: \"React\", state: \"normal\", selected: true }],\n },\n ];\n const selections: SubcategorySelections = { framework: [\"web-framework-react\"] };\n\n const result = validateBuildStep(categories, selections);\n expect(result.valid).toBe(true);\n expect(result.message).toBeUndefined();\n });\n\n it(\"should return invalid when required category has no selection\", () => {\n const categories: GridCategoryRow[] = [\n {\n id: \"framework\",\n displayName: \"Framework\",\n required: true,\n exclusive: true,\n options: [\n { id: \"web-framework-react\", label: \"React\", state: \"normal\", selected: false },\n ],\n },\n ];\n const selections: SubcategorySelections = {};\n\n const result = validateBuildStep(categories, selections);\n expect(result.valid).toBe(false);\n expect(result.message).toContain(\"Framework\");\n });\n\n it(\"should return valid when optional categories have no selections\", () => {\n const categories: GridCategoryRow[] = [\n {\n id: \"client-state\",\n displayName: \"State Management\",\n required: false,\n exclusive: true,\n options: [\n {\n id: \"web-state-zustand\",\n label: \"Zustand\",\n state: \"normal\",\n selected: false,\n },\n ],\n },\n ];\n const selections: SubcategorySelections = {};\n\n const result = validateBuildStep(categories, selections);\n expect(result.valid).toBe(true);\n });\n\n it(\"should return invalid for first missing required category\", () => {\n const categories: GridCategoryRow[] = [\n {\n id: \"framework\",\n displayName: \"Framework\",\n required: true,\n exclusive: true,\n options: [],\n },\n {\n id: \"styling\",\n displayName: \"Styling\",\n required: true,\n exclusive: true,\n options: [],\n },\n ];\n const selections: SubcategorySelections = {};\n\n const result = validateBuildStep(categories, selections);\n expect(result.valid).toBe(false);\n expect(result.message).toContain(\"Framework\"); // Should be the first one\n });\n });\n\n describe(\"validation on continue\", () => {\n it(\"should show validation error when trying to continue without required selection\", async () => {\n const onContinue = vi.fn();\n const { stdin, lastFrame, unmount } = renderStepBuild({\n onContinue,\n selections: {},\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n // Press Enter to continue without selecting required framework\n stdin.write(ENTER);\n await delay(INPUT_DELAY_MS);\n\n // Should show validation error and NOT call onContinue\n const output = lastFrame();\n expect(output).toContain(\"Select at least one skill\");\n expect(onContinue).not.toHaveBeenCalled();\n });\n\n it(\"should call onContinue when validation passes\", async () => {\n const onContinue = vi.fn();\n const { stdin, unmount } = renderStepBuild({\n onContinue,\n selections: {\n framework: [\"web-framework-react\"],\n styling: [\"web-styling-tailwind\"],\n },\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n // Press Enter to continue with required selections\n stdin.write(ENTER);\n await delay(INPUT_DELAY_MS);\n\n expect(onContinue).toHaveBeenCalled();\n });\n });\n});\n\ndescribe(\"getSkillDisplayLabel\", () => {\n it(\"should return displayName when available\", () => {\n expect(getSkillDisplayLabel({ displayName: \"react\", id: \"web-framework-react\" })).toBe(\"react\");\n });\n\n it(\"should return id when no displayName\", () => {\n expect(getSkillDisplayLabel({ id: \"web-framework-react\" })).toBe(\"web-framework-react\");\n });\n\n it(\"should prefer displayName over id\", () => {\n expect(\n getSkillDisplayLabel({ displayName: \"scss-modules\", id: \"web-styling-scss-modules\" }),\n ).toBe(\"scss-modules\");\n });\n});\n"],"mappings":"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","names":[]}
@@ -1,8 +1,9 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  StepConfirm
4
- } from "../../chunk-VVYNZZUX.js";
4
+ } from "../../chunk-AG5YGYJT.js";
5
5
  import "../../chunk-V2ZIH7HV.js";
6
+ import "../../chunk-IFODQTCX.js";
6
7
  import "../../chunk-AWKZ5BDL.js";
7
8
  export {
8
9
  StepConfirm
@@ -4,7 +4,7 @@ import {
4
4
  ESCAPE,
5
5
  RENDER_DELAY_MS,
6
6
  delay
7
- } from "../../chunk-DBRUQQUF.js";
7
+ } from "../../chunk-7GHTQSWI.js";
8
8
  import {
9
9
  render
10
10
  } from "../../chunk-REJGRCVQ.js";
@@ -18,13 +18,14 @@ import {
18
18
  } from "../../chunk-QR2EBWL2.js";
19
19
  import {
20
20
  StepConfirm
21
- } from "../../chunk-VVYNZZUX.js";
21
+ } from "../../chunk-AG5YGYJT.js";
22
22
  import "../../chunk-V2ZIH7HV.js";
23
23
  import {
24
24
  useWizardStore
25
- } from "../../chunk-TMED5DQ2.js";
26
- import "../../chunk-HWD32NP7.js";
27
- import "../../chunk-O6ZTD7ZI.js";
25
+ } from "../../chunk-IQUBOWWU.js";
26
+ import "../../chunk-SSHG7MEE.js";
27
+ import "../../chunk-5WIHSJRO.js";
28
+ import "../../chunk-IFODQTCX.js";
28
29
  import {
29
30
  init_esm_shims
30
31
  } from "../../chunk-AWKZ5BDL.js";
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/cli/components/wizard/step-confirm.test.tsx"],"sourcesContent":["import React from \"react\";\nimport { render } from \"ink-testing-library\";\nimport { afterEach, beforeEach, describe, expect, it, vi } from \"vitest\";\nimport { StepConfirm } from \"./step-confirm\";\nimport { useWizardStore } from \"../../stores/wizard-store\";\nimport { ENTER, ESCAPE, RENDER_DELAY_MS, delay } from \"../../lib/__tests__/test-constants\";\n\ndescribe(\"StepConfirm component\", () => {\n let cleanup: (() => void) | undefined;\n\n beforeEach(() => {\n useWizardStore.getState().reset();\n });\n\n afterEach(() => {\n cleanup?.();\n cleanup = undefined;\n });\n\n describe(\"stack path\", () => {\n it(\"should render stack name in title\", () => {\n const onComplete = vi.fn();\n const onBack = vi.fn();\n\n const { lastFrame, unmount } = render(\n <StepConfirm\n onComplete={onComplete}\n stackName=\"nextjs-fullstack\"\n technologyCount={12}\n skillCount={12}\n installMode=\"plugin\"\n onBack={onBack}\n />,\n );\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Ready to install nextjs-fullstack\");\n });\n\n it(\"should show technology count\", () => {\n const onComplete = vi.fn();\n const onBack = vi.fn();\n\n const { lastFrame, unmount } = render(\n <StepConfirm\n onComplete={onComplete}\n stackName=\"nextjs-fullstack\"\n technologyCount={12}\n skillCount={12}\n installMode=\"plugin\"\n onBack={onBack}\n />,\n );\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Technologies:\");\n expect(output).toContain(\"12\");\n });\n\n it(\"should show skill count with verified label\", () => {\n const onComplete = vi.fn();\n const onBack = vi.fn();\n\n const { lastFrame, unmount } = render(\n <StepConfirm\n onComplete={onComplete}\n stackName=\"nextjs-fullstack\"\n technologyCount={12}\n skillCount={12}\n installMode=\"plugin\"\n onBack={onBack}\n />,\n );\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Skills:\");\n expect(output).toContain(\"(all verified)\");\n });\n\n it(\"should show install mode as Plugin\", () => {\n const onComplete = vi.fn();\n const onBack = vi.fn();\n\n const { lastFrame, unmount } = render(\n <StepConfirm\n onComplete={onComplete}\n stackName=\"nextjs-fullstack\"\n technologyCount={12}\n skillCount={12}\n installMode=\"plugin\"\n onBack={onBack}\n />,\n );\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Install mode:\");\n expect(output).toContain(\"Plugin\");\n });\n\n it(\"should show install mode as Local\", () => {\n const onComplete = vi.fn();\n const onBack = vi.fn();\n\n const { lastFrame, unmount } = render(\n <StepConfirm\n onComplete={onComplete}\n stackName=\"nextjs-fullstack\"\n technologyCount={12}\n skillCount={12}\n installMode=\"local\"\n onBack={onBack}\n />,\n );\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Install mode:\");\n expect(output).toContain(\"Local\");\n });\n\n it(\"should render confirm step content\", () => {\n const onComplete = vi.fn();\n const onBack = vi.fn();\n\n const { lastFrame, unmount } = render(\n <StepConfirm\n onComplete={onComplete}\n stackName=\"nextjs-fullstack\"\n technologyCount={12}\n skillCount={12}\n installMode=\"plugin\"\n onBack={onBack}\n />,\n );\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Ready to install\");\n });\n });\n\n describe(\"scratch path\", () => {\n it(\"should render custom stack title with domain names\", () => {\n const onComplete = vi.fn();\n const onBack = vi.fn();\n\n const { lastFrame, unmount } = render(\n <StepConfirm\n onComplete={onComplete}\n selectedDomains={[\"web\", \"api\"]}\n domainSelections={{\n web: { framework: [\"web-framework-react\"], styling: [\"web-styling-scss-modules\"] },\n api: { api: [\"api-framework-hono\"] },\n }}\n technologyCount={3}\n skillCount={3}\n installMode=\"local\"\n onBack={onBack}\n />,\n );\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Ready to install your custom stack\");\n expect(output).toContain(\"Web + API\");\n });\n\n it(\"should show domain breakdown with technologies\", () => {\n const onComplete = vi.fn();\n const onBack = vi.fn();\n\n const { lastFrame, unmount } = render(\n <StepConfirm\n onComplete={onComplete}\n selectedDomains={[\"web\", \"api\"]}\n domainSelections={{\n web: { framework: [\"web-framework-react\"], styling: [\"web-styling-scss-modules\"] },\n api: { api: [\"api-framework-hono\"] },\n }}\n technologyCount={3}\n skillCount={3}\n installMode=\"local\"\n onBack={onBack}\n />,\n );\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Web:\");\n expect(output).toContain(\"react\");\n expect(output).toContain(\"scss-modules\");\n expect(output).toContain(\"API:\");\n expect(output).toContain(\"hono\");\n });\n\n it(\"should handle single domain without plus sign\", () => {\n const onComplete = vi.fn();\n const onBack = vi.fn();\n\n const { lastFrame, unmount } = render(\n <StepConfirm\n onComplete={onComplete}\n selectedDomains={[\"web\"]}\n domainSelections={{\n web: { framework: [\"web-framework-react\"] },\n }}\n technologyCount={1}\n skillCount={1}\n installMode=\"local\"\n onBack={onBack}\n />,\n );\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"(Web)\");\n expect(output).not.toContain(\"+\");\n });\n\n it(\"should skip domains with no selections\", () => {\n const onComplete = vi.fn();\n const onBack = vi.fn();\n\n const { lastFrame, unmount } = render(\n <StepConfirm\n onComplete={onComplete}\n selectedDomains={[\"web\", \"api\"]}\n domainSelections={{\n web: { framework: [\"web-framework-react\"] },\n api: {}, // Empty selections\n }}\n technologyCount={1}\n skillCount={1}\n installMode=\"local\"\n onBack={onBack}\n />,\n );\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Web:\");\n expect(output).toContain(\"react\");\n // API section should not appear since no technologies selected\n const lines = output?.split(\"\\n\") || [];\n const apiLine = lines.find((line) => line.includes(\"API:\") && line.includes(\"hono\"));\n expect(apiLine).toBeUndefined();\n });\n });\n\n describe(\"keyboard navigation\", () => {\n it(\"should call onComplete when Enter is pressed\", async () => {\n const onComplete = vi.fn();\n const onBack = vi.fn();\n\n const { stdin, unmount } = render(\n <StepConfirm\n onComplete={onComplete}\n stackName=\"nextjs-fullstack\"\n technologyCount={12}\n skillCount={12}\n installMode=\"plugin\"\n onBack={onBack}\n />,\n );\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(ENTER);\n await delay(RENDER_DELAY_MS);\n\n expect(onComplete).toHaveBeenCalled();\n });\n\n it(\"should call onBack when Escape is pressed\", async () => {\n const onComplete = vi.fn();\n const onBack = vi.fn();\n\n const { stdin, unmount } = render(\n <StepConfirm\n onComplete={onComplete}\n stackName=\"nextjs-fullstack\"\n technologyCount={12}\n skillCount={12}\n installMode=\"plugin\"\n onBack={onBack}\n />,\n );\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(ESCAPE);\n await delay(RENDER_DELAY_MS);\n\n expect(onBack).toHaveBeenCalled();\n expect(onComplete).not.toHaveBeenCalled();\n });\n\n it(\"should not call onBack when Escape is pressed but onBack is not provided\", async () => {\n const onComplete = vi.fn();\n\n const { stdin, unmount } = render(\n <StepConfirm\n onComplete={onComplete}\n stackName=\"nextjs-fullstack\"\n technologyCount={12}\n skillCount={12}\n installMode=\"plugin\"\n // No onBack provided\n />,\n );\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(ESCAPE);\n await delay(RENDER_DELAY_MS);\n\n // Should not crash and onComplete should not be called\n expect(onComplete).not.toHaveBeenCalled();\n });\n });\n\n describe(\"default props\", () => {\n it(\"should render custom stack title when no stack name provided\", () => {\n const onComplete = vi.fn();\n\n const { lastFrame, unmount } = render(<StepConfirm onComplete={onComplete} />);\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Ready to install your custom stack\");\n });\n\n it(\"should not show stats when not provided\", () => {\n const onComplete = vi.fn();\n\n const { lastFrame, unmount } = render(<StepConfirm onComplete={onComplete} />);\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).not.toContain(\"Technologies:\");\n expect(output).not.toContain(\"Skills:\");\n expect(output).not.toContain(\"Install mode:\");\n });\n });\n});\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/cli/components/wizard/step-confirm.test.tsx"],"sourcesContent":["import { render } from \"ink-testing-library\";\nimport { afterEach, beforeEach, describe, expect, it, vi } from \"vitest\";\nimport { StepConfirm } from \"./step-confirm\";\nimport { useWizardStore } from \"../../stores/wizard-store\";\nimport { ENTER, ESCAPE, RENDER_DELAY_MS, delay } from \"../../lib/__tests__/test-constants\";\n\ndescribe(\"StepConfirm component\", () => {\n let cleanup: (() => void) | undefined;\n\n beforeEach(() => {\n useWizardStore.getState().reset();\n });\n\n afterEach(() => {\n cleanup?.();\n cleanup = undefined;\n });\n\n describe(\"stack path\", () => {\n it(\"should render stack name in title\", () => {\n const onComplete = vi.fn();\n const onBack = vi.fn();\n\n const { lastFrame, unmount } = render(\n <StepConfirm\n onComplete={onComplete}\n stackName=\"nextjs-fullstack\"\n technologyCount={12}\n skillCount={12}\n installMode=\"plugin\"\n onBack={onBack}\n />,\n );\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Ready to install nextjs-fullstack\");\n });\n\n it(\"should show technology count\", () => {\n const onComplete = vi.fn();\n const onBack = vi.fn();\n\n const { lastFrame, unmount } = render(\n <StepConfirm\n onComplete={onComplete}\n stackName=\"nextjs-fullstack\"\n technologyCount={12}\n skillCount={12}\n installMode=\"plugin\"\n onBack={onBack}\n />,\n );\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Technologies:\");\n expect(output).toContain(\"12\");\n });\n\n it(\"should show skill count with verified label\", () => {\n const onComplete = vi.fn();\n const onBack = vi.fn();\n\n const { lastFrame, unmount } = render(\n <StepConfirm\n onComplete={onComplete}\n stackName=\"nextjs-fullstack\"\n technologyCount={12}\n skillCount={12}\n installMode=\"plugin\"\n onBack={onBack}\n />,\n );\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Skills:\");\n expect(output).toContain(\"(all verified)\");\n });\n\n it(\"should show install mode as Plugin\", () => {\n const onComplete = vi.fn();\n const onBack = vi.fn();\n\n const { lastFrame, unmount } = render(\n <StepConfirm\n onComplete={onComplete}\n stackName=\"nextjs-fullstack\"\n technologyCount={12}\n skillCount={12}\n installMode=\"plugin\"\n onBack={onBack}\n />,\n );\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Install mode:\");\n expect(output).toContain(\"Plugin\");\n });\n\n it(\"should show install mode as Local\", () => {\n const onComplete = vi.fn();\n const onBack = vi.fn();\n\n const { lastFrame, unmount } = render(\n <StepConfirm\n onComplete={onComplete}\n stackName=\"nextjs-fullstack\"\n technologyCount={12}\n skillCount={12}\n installMode=\"local\"\n onBack={onBack}\n />,\n );\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Install mode:\");\n expect(output).toContain(\"Local\");\n });\n\n it(\"should render confirm step content\", () => {\n const onComplete = vi.fn();\n const onBack = vi.fn();\n\n const { lastFrame, unmount } = render(\n <StepConfirm\n onComplete={onComplete}\n stackName=\"nextjs-fullstack\"\n technologyCount={12}\n skillCount={12}\n installMode=\"plugin\"\n onBack={onBack}\n />,\n );\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Ready to install\");\n });\n });\n\n describe(\"scratch path\", () => {\n it(\"should render custom stack title with domain names\", () => {\n const onComplete = vi.fn();\n const onBack = vi.fn();\n\n const { lastFrame, unmount } = render(\n <StepConfirm\n onComplete={onComplete}\n selectedDomains={[\"web\", \"api\"]}\n domainSelections={{\n web: { framework: [\"web-framework-react\"], styling: [\"web-styling-scss-modules\"] },\n api: { api: [\"api-framework-hono\"] },\n }}\n technologyCount={3}\n skillCount={3}\n installMode=\"local\"\n onBack={onBack}\n />,\n );\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Ready to install your custom stack\");\n expect(output).toContain(\"Web + API\");\n });\n\n it(\"should show domain breakdown with technologies\", () => {\n const onComplete = vi.fn();\n const onBack = vi.fn();\n\n const { lastFrame, unmount } = render(\n <StepConfirm\n onComplete={onComplete}\n selectedDomains={[\"web\", \"api\"]}\n domainSelections={{\n web: { framework: [\"web-framework-react\"], styling: [\"web-styling-scss-modules\"] },\n api: { api: [\"api-framework-hono\"] },\n }}\n technologyCount={3}\n skillCount={3}\n installMode=\"local\"\n onBack={onBack}\n />,\n );\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Web:\");\n expect(output).toContain(\"react\");\n expect(output).toContain(\"scss-modules\");\n expect(output).toContain(\"API:\");\n expect(output).toContain(\"hono\");\n });\n\n it(\"should handle single domain without plus sign\", () => {\n const onComplete = vi.fn();\n const onBack = vi.fn();\n\n const { lastFrame, unmount } = render(\n <StepConfirm\n onComplete={onComplete}\n selectedDomains={[\"web\"]}\n domainSelections={{\n web: { framework: [\"web-framework-react\"] },\n }}\n technologyCount={1}\n skillCount={1}\n installMode=\"local\"\n onBack={onBack}\n />,\n );\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"(Web)\");\n expect(output).not.toContain(\"+\");\n });\n\n it(\"should skip domains with no selections\", () => {\n const onComplete = vi.fn();\n const onBack = vi.fn();\n\n const { lastFrame, unmount } = render(\n <StepConfirm\n onComplete={onComplete}\n selectedDomains={[\"web\", \"api\"]}\n domainSelections={{\n web: { framework: [\"web-framework-react\"] },\n api: {}, // Empty selections\n }}\n technologyCount={1}\n skillCount={1}\n installMode=\"local\"\n onBack={onBack}\n />,\n );\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Web:\");\n expect(output).toContain(\"react\");\n // API section should not appear since no technologies selected\n const lines = output?.split(\"\\n\") || [];\n const apiLine = lines.find((line) => line.includes(\"API:\") && line.includes(\"hono\"));\n expect(apiLine).toBeUndefined();\n });\n });\n\n describe(\"keyboard navigation\", () => {\n it(\"should call onComplete when Enter is pressed\", async () => {\n const onComplete = vi.fn();\n const onBack = vi.fn();\n\n const { stdin, unmount } = render(\n <StepConfirm\n onComplete={onComplete}\n stackName=\"nextjs-fullstack\"\n technologyCount={12}\n skillCount={12}\n installMode=\"plugin\"\n onBack={onBack}\n />,\n );\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(ENTER);\n await delay(RENDER_DELAY_MS);\n\n expect(onComplete).toHaveBeenCalled();\n });\n\n it(\"should call onBack when Escape is pressed\", async () => {\n const onComplete = vi.fn();\n const onBack = vi.fn();\n\n const { stdin, unmount } = render(\n <StepConfirm\n onComplete={onComplete}\n stackName=\"nextjs-fullstack\"\n technologyCount={12}\n skillCount={12}\n installMode=\"plugin\"\n onBack={onBack}\n />,\n );\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(ESCAPE);\n await delay(RENDER_DELAY_MS);\n\n expect(onBack).toHaveBeenCalled();\n expect(onComplete).not.toHaveBeenCalled();\n });\n\n it(\"should not call onBack when Escape is pressed but onBack is not provided\", async () => {\n const onComplete = vi.fn();\n\n const { stdin, unmount } = render(\n <StepConfirm\n onComplete={onComplete}\n stackName=\"nextjs-fullstack\"\n technologyCount={12}\n skillCount={12}\n installMode=\"plugin\"\n // No onBack provided\n />,\n );\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(ESCAPE);\n await delay(RENDER_DELAY_MS);\n\n // Should not crash and onComplete should not be called\n expect(onComplete).not.toHaveBeenCalled();\n });\n });\n\n describe(\"default props\", () => {\n it(\"should render custom stack title when no stack name provided\", () => {\n const onComplete = vi.fn();\n\n const { lastFrame, unmount } = render(<StepConfirm onComplete={onComplete} />);\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Ready to install your custom stack\");\n });\n\n it(\"should not show stats when not provided\", () => {\n const onComplete = vi.fn();\n\n const { lastFrame, unmount } = render(<StepConfirm onComplete={onComplete} />);\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).not.toContain(\"Technologies:\");\n expect(output).not.toContain(\"Skills:\");\n expect(output).not.toContain(\"Install mode:\");\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
  StepRefine
4
- } from "../../chunk-MCTSHLAF.js";
4
+ } from "../../chunk-RI5QEK5W.js";
5
+ import "../../chunk-IFODQTCX.js";
5
6
  import "../../chunk-AWKZ5BDL.js";
6
7
  export {
7
8
  StepRefine