@agents-inc/cli 0.61.0 → 0.64.0

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 (212) hide show
  1. package/CHANGELOG.md +36 -0
  2. package/README.md +23 -172
  3. package/dist/{chunk-YHOHLNHM.js → chunk-3YNT3NX3.js} +13 -11
  4. package/dist/chunk-3YNT3NX3.js.map +1 -0
  5. package/dist/{chunk-IGM6HA3S.js → chunk-4C7CSZC5.js} +27 -149
  6. package/dist/chunk-4C7CSZC5.js.map +1 -0
  7. package/dist/{chunk-WHISPMAQ.js → chunk-4KVBH2X4.js} +33 -14
  8. package/dist/chunk-4KVBH2X4.js.map +1 -0
  9. package/dist/{chunk-KIWFEBKH.js → chunk-52THXN5G.js} +14 -5
  10. package/dist/chunk-52THXN5G.js.map +1 -0
  11. package/dist/{chunk-FWMWWE3X.js → chunk-53URJ5XK.js} +448 -152
  12. package/dist/chunk-53URJ5XK.js.map +1 -0
  13. package/dist/{chunk-H5DASUX5.js → chunk-6DEK3TDF.js} +10 -10
  14. package/dist/chunk-6DEK3TDF.js.map +1 -0
  15. package/dist/{chunk-SDKCQXWE.js → chunk-6IK2TCK7.js} +13 -6
  16. package/dist/chunk-6IK2TCK7.js.map +1 -0
  17. package/dist/chunk-6VIOO74O.js +51 -0
  18. package/dist/chunk-6VIOO74O.js.map +1 -0
  19. package/dist/{chunk-52XO4ULK.js → chunk-7DI3HGKL.js} +32 -14
  20. package/dist/chunk-7DI3HGKL.js.map +1 -0
  21. package/dist/{chunk-MGNYPVOJ.js → chunk-AQYAVLZK.js} +2 -2
  22. package/dist/{chunk-BNQ5O6LE.js → chunk-AUNBGZS4.js} +2 -2
  23. package/dist/chunk-BGPGQF35.js +248 -0
  24. package/dist/chunk-BGPGQF35.js.map +1 -0
  25. package/dist/chunk-BKL3DF2Q.js +45 -0
  26. package/dist/chunk-BKL3DF2Q.js.map +1 -0
  27. package/dist/{chunk-AX3SZZWA.js → chunk-BKTPEATV.js} +13 -6
  28. package/dist/chunk-BKTPEATV.js.map +1 -0
  29. package/dist/{chunk-H7WJK7NJ.js → chunk-CKPJTMNC.js} +13 -6
  30. package/dist/chunk-CKPJTMNC.js.map +1 -0
  31. package/dist/{chunk-MR6OBL3B.js → chunk-CXRVM7BA.js} +2 -4
  32. package/dist/chunk-CXRVM7BA.js.map +1 -0
  33. package/dist/{chunk-VR3CDXDT.js → chunk-EE5EPS32.js} +2 -2
  34. package/dist/{chunk-6OWHQ7HM.js → chunk-EGMQ3SXN.js} +2 -11
  35. package/dist/{chunk-6OWHQ7HM.js.map → chunk-EGMQ3SXN.js.map} +1 -1
  36. package/dist/{chunk-6DAZG54T.js → chunk-EZ35IPXZ.js} +10 -7
  37. package/dist/chunk-EZ35IPXZ.js.map +1 -0
  38. package/dist/{chunk-OCEFD7V6.js → chunk-F3REOP7N.js} +3 -3
  39. package/dist/{chunk-C577AJE7.js → chunk-FGLUQSVU.js} +3 -3
  40. package/dist/{chunk-Z3TM4N37.js → chunk-J4POGAJF.js} +24 -24
  41. package/dist/chunk-J4POGAJF.js.map +1 -0
  42. package/dist/{chunk-O6BA7Q2B.js → chunk-KFDTVSIC.js} +18 -8
  43. package/dist/chunk-KFDTVSIC.js.map +1 -0
  44. package/dist/{chunk-LWXRUR6B.js → chunk-LMZXL5RQ.js} +2 -2
  45. package/dist/{chunk-LWXRUR6B.js.map → chunk-LMZXL5RQ.js.map} +1 -1
  46. package/dist/{chunk-7FMEMXJ4.js → chunk-MOMI77PL.js} +100 -59
  47. package/dist/chunk-MOMI77PL.js.map +1 -0
  48. package/dist/{chunk-BFD5NZQ4.js → chunk-MVYJVKVT.js} +19 -11
  49. package/dist/chunk-MVYJVKVT.js.map +1 -0
  50. package/dist/{chunk-X5EG4EFP.js → chunk-MWGDG4QN.js} +2 -2
  51. package/dist/{chunk-KDO6WU76.js → chunk-O2HK3NTG.js} +10 -6
  52. package/dist/chunk-O2HK3NTG.js.map +1 -0
  53. package/dist/{chunk-46DQG2N7.js → chunk-OORWBS6F.js} +45 -52
  54. package/dist/chunk-OORWBS6F.js.map +1 -0
  55. package/dist/{chunk-CIG7IKX3.js → chunk-OV5UJWS5.js} +4 -4
  56. package/dist/{chunk-IEEVXLJB.js → chunk-R46CB36B.js} +5 -5
  57. package/dist/{chunk-GH2RQ4MI.js → chunk-RG3KDXMR.js} +16 -8
  58. package/dist/chunk-RG3KDXMR.js.map +1 -0
  59. package/dist/{chunk-MMFQNJPE.js → chunk-SXGBPQY6.js} +3 -3
  60. package/dist/chunk-SXGBPQY6.js.map +1 -0
  61. package/dist/{chunk-XUDTFI4M.js → chunk-T5DJCIUP.js} +2 -2
  62. package/dist/{chunk-AJJJE7F7.js → chunk-TQLDQ3XZ.js} +2 -2
  63. package/dist/{chunk-M6YWRMXH.js → chunk-WSMQ5GAP.js} +33 -21
  64. package/dist/chunk-WSMQ5GAP.js.map +1 -0
  65. package/dist/{chunk-WYVDNGJB.js → chunk-XMLCXRTS.js} +3 -3
  66. package/dist/{chunk-SDLDPFNV.js → chunk-YEGPTBX5.js} +4 -4
  67. package/dist/{chunk-SRBN6RRD.js → chunk-ZFY5EMDV.js} +5 -5
  68. package/dist/{chunk-BKJHAJQW.js → chunk-ZYUASJUN.js} +7 -4
  69. package/dist/chunk-ZYUASJUN.js.map +1 -0
  70. package/dist/commands/build/marketplace.js +4 -4
  71. package/dist/commands/build/plugins.js +7 -6
  72. package/dist/commands/build/plugins.js.map +1 -1
  73. package/dist/commands/build/stack.js +7 -6
  74. package/dist/commands/build/stack.js.map +1 -1
  75. package/dist/commands/compile.js +11 -80
  76. package/dist/commands/compile.js.map +1 -1
  77. package/dist/commands/config/index.js +7 -6
  78. package/dist/commands/config/index.js.map +1 -1
  79. package/dist/commands/config/path.js +6 -5
  80. package/dist/commands/config/path.js.map +1 -1
  81. package/dist/commands/config/show.js +7 -6
  82. package/dist/commands/diff.js +6 -5
  83. package/dist/commands/diff.js.map +1 -1
  84. package/dist/commands/doctor.js +11 -15
  85. package/dist/commands/doctor.js.map +1 -1
  86. package/dist/commands/edit.js +63 -69
  87. package/dist/commands/edit.js.map +1 -1
  88. package/dist/commands/eject.js +13 -13
  89. package/dist/commands/eject.js.map +1 -1
  90. package/dist/commands/import/skill.js +7 -6
  91. package/dist/commands/import/skill.js.map +1 -1
  92. package/dist/commands/info.js +14 -16
  93. package/dist/commands/info.js.map +1 -1
  94. package/dist/commands/init.js +32 -30
  95. package/dist/commands/list.js +6 -5
  96. package/dist/commands/list.js.map +1 -1
  97. package/dist/commands/new/agent.js +7 -6
  98. package/dist/commands/new/agent.js.map +1 -1
  99. package/dist/commands/new/marketplace.js +28 -11
  100. package/dist/commands/new/marketplace.js.map +1 -1
  101. package/dist/commands/new/skill.js +7 -6
  102. package/dist/commands/outdated.js +6 -5
  103. package/dist/commands/outdated.js.map +1 -1
  104. package/dist/commands/search.js +13 -11
  105. package/dist/commands/search.js.map +1 -1
  106. package/dist/commands/uninstall.js +9 -10
  107. package/dist/commands/uninstall.js.map +1 -1
  108. package/dist/commands/update.js +12 -8
  109. package/dist/commands/update.js.map +1 -1
  110. package/dist/commands/validate.js +20 -42
  111. package/dist/commands/validate.js.map +1 -1
  112. package/dist/components/skill-search/skill-search.js +4 -3
  113. package/dist/components/wizard/category-grid.js +5 -3
  114. package/dist/components/wizard/category-grid.test.js +242 -194
  115. package/dist/components/wizard/category-grid.test.js.map +1 -1
  116. package/dist/components/wizard/checkbox-grid.js +5 -5
  117. package/dist/components/wizard/checkbox-grid.test.js +5 -5
  118. package/dist/components/wizard/domain-selection.js +12 -11
  119. package/dist/components/wizard/help-modal.js +3 -2
  120. package/dist/components/wizard/menu-item.js +1 -1
  121. package/dist/components/wizard/search-modal.js +3 -2
  122. package/dist/components/wizard/search-modal.test.js +3 -2
  123. package/dist/components/wizard/search-modal.test.js.map +1 -1
  124. package/dist/components/wizard/section-progress.js +2 -2
  125. package/dist/components/wizard/section-progress.test.js +3 -3
  126. package/dist/components/wizard/section-progress.test.js.map +1 -1
  127. package/dist/components/wizard/selection-card.js +2 -2
  128. package/dist/components/wizard/source-grid.js +6 -4
  129. package/dist/components/wizard/source-grid.test.js +65 -40
  130. package/dist/components/wizard/source-grid.test.js.map +1 -1
  131. package/dist/components/wizard/stack-selection.js +9 -8
  132. package/dist/components/wizard/step-agents.js +11 -10
  133. package/dist/components/wizard/step-agents.test.js +28 -25
  134. package/dist/components/wizard/step-agents.test.js.map +1 -1
  135. package/dist/components/wizard/step-build.js +12 -10
  136. package/dist/components/wizard/step-build.test.js +28 -34
  137. package/dist/components/wizard/step-build.test.js.map +1 -1
  138. package/dist/components/wizard/step-confirm.js +6 -4
  139. package/dist/components/wizard/step-confirm.test.js +11 -15
  140. package/dist/components/wizard/step-confirm.test.js.map +1 -1
  141. package/dist/components/wizard/step-refine.js +3 -2
  142. package/dist/components/wizard/step-refine.test.js +3 -2
  143. package/dist/components/wizard/step-refine.test.js.map +1 -1
  144. package/dist/components/wizard/step-settings.js +10 -8
  145. package/dist/components/wizard/step-settings.test.js +17 -13
  146. package/dist/components/wizard/step-settings.test.js.map +1 -1
  147. package/dist/components/wizard/step-sources.js +13 -11
  148. package/dist/components/wizard/step-sources.test.js +17 -14
  149. package/dist/components/wizard/step-sources.test.js.map +1 -1
  150. package/dist/components/wizard/step-stack.js +15 -14
  151. package/dist/components/wizard/step-stack.test.js +42 -38
  152. package/dist/components/wizard/step-stack.test.js.map +1 -1
  153. package/dist/components/wizard/view-title.js +2 -2
  154. package/dist/components/wizard/wizard-layout.js +10 -8
  155. package/dist/components/wizard/wizard-tabs.js +2 -2
  156. package/dist/components/wizard/wizard-tabs.test.js +2 -2
  157. package/dist/components/wizard/wizard.js +29 -27
  158. package/dist/hooks/init.js +32 -30
  159. package/dist/hooks/init.js.map +1 -1
  160. package/dist/{loader-2O32KKAQ.js → loader-4YOZCFIP.js} +4 -4
  161. package/dist/plugins/dummy-skill/.claude-plugin/.content-hash +1 -0
  162. package/dist/plugins/dummy-skill/.claude-plugin/plugin.json +13 -0
  163. package/dist/{source-loader-KMEBBZCQ.js → source-loader-O5RMYUBW.js} +6 -5
  164. package/dist/{source-manager-5XBSPJNR.js → source-manager-NKLL6HCL.js} +6 -5
  165. package/dist/stores/matrix-store.js +15 -0
  166. package/dist/stores/matrix-store.js.map +1 -0
  167. package/dist/stores/matrix-store.test.js +146 -0
  168. package/dist/stores/matrix-store.test.js.map +1 -0
  169. package/dist/stores/wizard-store.js +6 -5
  170. package/dist/stores/wizard-store.test.js +159 -107
  171. package/dist/stores/wizard-store.test.js.map +1 -1
  172. package/package.json +1 -1
  173. package/dist/chunk-46DQG2N7.js.map +0 -1
  174. package/dist/chunk-52XO4ULK.js.map +0 -1
  175. package/dist/chunk-6DAZG54T.js.map +0 -1
  176. package/dist/chunk-7FMEMXJ4.js.map +0 -1
  177. package/dist/chunk-AX3SZZWA.js.map +0 -1
  178. package/dist/chunk-BFD5NZQ4.js.map +0 -1
  179. package/dist/chunk-BKJHAJQW.js.map +0 -1
  180. package/dist/chunk-FWMWWE3X.js.map +0 -1
  181. package/dist/chunk-GH2RQ4MI.js.map +0 -1
  182. package/dist/chunk-H5DASUX5.js.map +0 -1
  183. package/dist/chunk-H7WJK7NJ.js.map +0 -1
  184. package/dist/chunk-IGM6HA3S.js.map +0 -1
  185. package/dist/chunk-KD2YS76O.js +0 -151
  186. package/dist/chunk-KD2YS76O.js.map +0 -1
  187. package/dist/chunk-KDO6WU76.js.map +0 -1
  188. package/dist/chunk-KIWFEBKH.js.map +0 -1
  189. package/dist/chunk-M6YWRMXH.js.map +0 -1
  190. package/dist/chunk-MMFQNJPE.js.map +0 -1
  191. package/dist/chunk-MR6OBL3B.js.map +0 -1
  192. package/dist/chunk-O6BA7Q2B.js.map +0 -1
  193. package/dist/chunk-SDKCQXWE.js.map +0 -1
  194. package/dist/chunk-WHISPMAQ.js.map +0 -1
  195. package/dist/chunk-YHOHLNHM.js.map +0 -1
  196. package/dist/chunk-Z3TM4N37.js.map +0 -1
  197. /package/dist/{chunk-MGNYPVOJ.js.map → chunk-AQYAVLZK.js.map} +0 -0
  198. /package/dist/{chunk-BNQ5O6LE.js.map → chunk-AUNBGZS4.js.map} +0 -0
  199. /package/dist/{chunk-VR3CDXDT.js.map → chunk-EE5EPS32.js.map} +0 -0
  200. /package/dist/{chunk-OCEFD7V6.js.map → chunk-F3REOP7N.js.map} +0 -0
  201. /package/dist/{chunk-C577AJE7.js.map → chunk-FGLUQSVU.js.map} +0 -0
  202. /package/dist/{chunk-X5EG4EFP.js.map → chunk-MWGDG4QN.js.map} +0 -0
  203. /package/dist/{chunk-CIG7IKX3.js.map → chunk-OV5UJWS5.js.map} +0 -0
  204. /package/dist/{chunk-IEEVXLJB.js.map → chunk-R46CB36B.js.map} +0 -0
  205. /package/dist/{chunk-XUDTFI4M.js.map → chunk-T5DJCIUP.js.map} +0 -0
  206. /package/dist/{chunk-AJJJE7F7.js.map → chunk-TQLDQ3XZ.js.map} +0 -0
  207. /package/dist/{chunk-WYVDNGJB.js.map → chunk-XMLCXRTS.js.map} +0 -0
  208. /package/dist/{chunk-SDLDPFNV.js.map → chunk-YEGPTBX5.js.map} +0 -0
  209. /package/dist/{chunk-SRBN6RRD.js.map → chunk-ZFY5EMDV.js.map} +0 -0
  210. /package/dist/{loader-2O32KKAQ.js.map → loader-4YOZCFIP.js.map} +0 -0
  211. /package/dist/{source-loader-KMEBBZCQ.js.map → source-loader-O5RMYUBW.js.map} +0 -0
  212. /package/dist/{source-manager-5XBSPJNR.js.map → source-manager-NKLL6HCL.js.map} +0 -0
@@ -13,7 +13,7 @@ import {
13
13
  } from "../../chunk-66UDJBF6.js";
14
14
  import {
15
15
  createMockMatrix
16
- } from "../../chunk-7FMEMXJ4.js";
16
+ } from "../../chunk-MOMI77PL.js";
17
17
  import {
18
18
  afterEach,
19
19
  beforeEach,
@@ -23,20 +23,23 @@ import {
23
23
  } from "../../chunk-XY3XDVMI.js";
24
24
  import {
25
25
  StepAgents
26
- } from "../../chunk-Z3TM4N37.js";
26
+ } from "../../chunk-J4POGAJF.js";
27
27
  import "../../chunk-K77I4XGL.js";
28
- import "../../chunk-BKJHAJQW.js";
29
- import "../../chunk-WYVDNGJB.js";
30
- import "../../chunk-MGNYPVOJ.js";
31
- import "../../chunk-BNQ5O6LE.js";
28
+ import "../../chunk-ZYUASJUN.js";
29
+ import "../../chunk-XMLCXRTS.js";
30
+ import "../../chunk-AQYAVLZK.js";
31
+ import "../../chunk-AUNBGZS4.js";
32
32
  import {
33
33
  useWizardStore
34
- } from "../../chunk-IGM6HA3S.js";
35
- import "../../chunk-FWMWWE3X.js";
36
- import "../../chunk-OCEFD7V6.js";
34
+ } from "../../chunk-4C7CSZC5.js";
35
+ import "../../chunk-53URJ5XK.js";
36
+ import "../../chunk-F3REOP7N.js";
37
37
  import "../../chunk-T4EXUIBY.js";
38
- import "../../chunk-LWXRUR6B.js";
39
- import "../../chunk-6OWHQ7HM.js";
38
+ import {
39
+ useMatrixStore
40
+ } from "../../chunk-BKL3DF2Q.js";
41
+ import "../../chunk-LMZXL5RQ.js";
42
+ import "../../chunk-EGMQ3SXN.js";
40
43
  import "../../chunk-EC3UJRKZ.js";
41
44
  import {
42
45
  init_esm_shims
@@ -49,7 +52,7 @@ var EMPTY_MATRIX = createMockMatrix({});
49
52
  describe("StepAgents component", () => {
50
53
  let cleanup;
51
54
  beforeEach(() => {
52
- useWizardStore.getState().reset();
55
+ useMatrixStore.getState().setMatrix(EMPTY_MATRIX);
53
56
  });
54
57
  afterEach(() => {
55
58
  cleanup?.();
@@ -57,13 +60,13 @@ describe("StepAgents component", () => {
57
60
  });
58
61
  describe("rendering", () => {
59
62
  it("should render title", () => {
60
- const { lastFrame, unmount } = render(/* @__PURE__ */ jsx(StepAgents, { matrix: EMPTY_MATRIX }));
63
+ const { lastFrame, unmount } = render(/* @__PURE__ */ jsx(StepAgents, {}));
61
64
  cleanup = unmount;
62
65
  const output = lastFrame();
63
66
  globalExpect(output).toContain("Select agents to compile:");
64
67
  });
65
68
  it("should render all agents", () => {
66
- const { lastFrame, unmount } = render(/* @__PURE__ */ jsx(StepAgents, { matrix: EMPTY_MATRIX }));
69
+ const { lastFrame, unmount } = render(/* @__PURE__ */ jsx(StepAgents, {}));
67
70
  cleanup = unmount;
68
71
  const output = lastFrame();
69
72
  globalExpect(output).toContain("Web Developer");
@@ -85,7 +88,7 @@ describe("StepAgents component", () => {
85
88
  globalExpect(output).toContain("Documentor");
86
89
  });
87
90
  it("should render agent descriptions", () => {
88
- const { lastFrame, unmount } = render(/* @__PURE__ */ jsx(StepAgents, { matrix: EMPTY_MATRIX }));
91
+ const { lastFrame, unmount } = render(/* @__PURE__ */ jsx(StepAgents, {}));
89
92
  cleanup = unmount;
90
93
  const output = lastFrame();
91
94
  globalExpect(output).toContain("Frontend features, components, TypeScript");
@@ -93,7 +96,7 @@ describe("StepAgents component", () => {
93
96
  globalExpect(output).toContain("CLI commands, interactive prompts");
94
97
  });
95
98
  it("should render group headers", () => {
96
- const { lastFrame, unmount } = render(/* @__PURE__ */ jsx(StepAgents, { matrix: EMPTY_MATRIX }));
99
+ const { lastFrame, unmount } = render(/* @__PURE__ */ jsx(StepAgents, {}));
97
100
  cleanup = unmount;
98
101
  const output = lastFrame();
99
102
  globalExpect(output).toContain("Web");
@@ -102,7 +105,7 @@ describe("StepAgents component", () => {
102
105
  globalExpect(output).toContain("Meta");
103
106
  });
104
107
  it("should show continue arrow", () => {
105
- const { lastFrame, unmount } = render(/* @__PURE__ */ jsx(StepAgents, { matrix: EMPTY_MATRIX }));
108
+ const { lastFrame, unmount } = render(/* @__PURE__ */ jsx(StepAgents, {}));
106
109
  cleanup = unmount;
107
110
  const output = lastFrame();
108
111
  globalExpect(output).toContain("\u2192");
@@ -113,13 +116,13 @@ describe("StepAgents component", () => {
113
116
  store.toggleAgent("web-developer");
114
117
  store.toggleAgent("api-developer");
115
118
  store.toggleAgent("web-reviewer");
116
- const { lastFrame, unmount } = render(/* @__PURE__ */ jsx(StepAgents, { matrix: EMPTY_MATRIX }));
119
+ const { lastFrame, unmount } = render(/* @__PURE__ */ jsx(StepAgents, {}));
117
120
  cleanup = unmount;
118
121
  const output = lastFrame();
119
122
  globalExpect(output).toContain("Continue with 3 agent(s)");
120
123
  });
121
124
  it("should show 'Continue without agents' when no agents selected", () => {
122
- const { lastFrame, unmount } = render(/* @__PURE__ */ jsx(StepAgents, { matrix: EMPTY_MATRIX }));
125
+ const { lastFrame, unmount } = render(/* @__PURE__ */ jsx(StepAgents, {}));
123
126
  cleanup = unmount;
124
127
  const output = lastFrame();
125
128
  globalExpect(output).toContain("Continue without agents");
@@ -127,7 +130,7 @@ describe("StepAgents component", () => {
127
130
  });
128
131
  describe("keyboard interaction", () => {
129
132
  it("should toggle agent on SPACE", async () => {
130
- const { stdin, lastFrame, unmount } = render(/* @__PURE__ */ jsx(StepAgents, { matrix: EMPTY_MATRIX }));
133
+ const { stdin, lastFrame, unmount } = render(/* @__PURE__ */ jsx(StepAgents, {}));
131
134
  cleanup = unmount;
132
135
  await delay(RENDER_DELAY_MS);
133
136
  await stdin.write(SPACE);
@@ -136,7 +139,7 @@ describe("StepAgents component", () => {
136
139
  globalExpect(store.selectedAgents).toContain("web-developer");
137
140
  });
138
141
  it("should toggle correct agent after navigation", async () => {
139
- const { stdin, unmount } = render(/* @__PURE__ */ jsx(StepAgents, { matrix: EMPTY_MATRIX }));
142
+ const { stdin, unmount } = render(/* @__PURE__ */ jsx(StepAgents, {}));
140
143
  cleanup = unmount;
141
144
  await delay(RENDER_DELAY_MS);
142
145
  await stdin.write(ARROW_DOWN);
@@ -150,7 +153,7 @@ describe("StepAgents component", () => {
150
153
  const store = useWizardStore.getState();
151
154
  store.toggleAgent("web-developer");
152
155
  store.setStep("agents");
153
- const { stdin, unmount } = render(/* @__PURE__ */ jsx(StepAgents, { matrix: EMPTY_MATRIX }));
156
+ const { stdin, unmount } = render(/* @__PURE__ */ jsx(StepAgents, {}));
154
157
  cleanup = unmount;
155
158
  await delay(RENDER_DELAY_MS);
156
159
  await stdin.write(ENTER);
@@ -161,7 +164,7 @@ describe("StepAgents component", () => {
161
164
  it("should navigate to confirm on ENTER even with no agents selected", async () => {
162
165
  const store = useWizardStore.getState();
163
166
  store.setStep("agents");
164
- const { stdin, unmount } = render(/* @__PURE__ */ jsx(StepAgents, { matrix: EMPTY_MATRIX }));
167
+ const { stdin, unmount } = render(/* @__PURE__ */ jsx(StepAgents, {}));
165
168
  cleanup = unmount;
166
169
  await delay(RENDER_DELAY_MS);
167
170
  await stdin.write(ENTER);
@@ -173,7 +176,7 @@ describe("StepAgents component", () => {
173
176
  const store = useWizardStore.getState();
174
177
  store.setStep("sources");
175
178
  store.setStep("agents");
176
- const { stdin, unmount } = render(/* @__PURE__ */ jsx(StepAgents, { matrix: EMPTY_MATRIX }));
179
+ const { stdin, unmount } = render(/* @__PURE__ */ jsx(StepAgents, {}));
177
180
  cleanup = unmount;
178
181
  await delay(RENDER_DELAY_MS);
179
182
  await stdin.write(ESCAPE);
@@ -184,7 +187,7 @@ describe("StepAgents component", () => {
184
187
  it("should toggle agent off when already selected", async () => {
185
188
  const store = useWizardStore.getState();
186
189
  store.toggleAgent("web-developer");
187
- const { stdin, unmount } = render(/* @__PURE__ */ jsx(StepAgents, { matrix: EMPTY_MATRIX }));
190
+ const { stdin, unmount } = render(/* @__PURE__ */ jsx(StepAgents, {}));
188
191
  cleanup = unmount;
189
192
  await delay(RENDER_DELAY_MS);
190
193
  await stdin.write(SPACE);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/cli/components/wizard/step-agents.test.tsx"],"sourcesContent":["import { render } from \"ink-testing-library\";\nimport { afterEach, beforeEach, describe, expect, it } from \"vitest\";\nimport { StepAgents } from \"./step-agents\";\nimport { useWizardStore } from \"../../stores/wizard-store\";\nimport {\n ARROW_DOWN,\n ENTER,\n ESCAPE,\n SPACE,\n RENDER_DELAY_MS,\n INPUT_DELAY_MS,\n delay,\n} from \"../../lib/__tests__/test-constants\";\nimport { createMockMatrix } from \"../../lib/__tests__/helpers\";\n\nconst EXPECTED_AGENT_COUNT = 18;\nconst EMPTY_MATRIX = createMockMatrix({});\n\ndescribe(\"StepAgents 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 title\", () => {\n const { lastFrame, unmount } = render(<StepAgents matrix={EMPTY_MATRIX} />);\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Select agents to compile:\");\n });\n\n it(\"should render all agents\", () => {\n const { lastFrame, unmount } = render(<StepAgents matrix={EMPTY_MATRIX} />);\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Web Developer\");\n expect(output).toContain(\"API Developer\");\n expect(output).toContain(\"CLI Developer\");\n expect(output).toContain(\"Web Architecture\");\n expect(output).toContain(\"Web Reviewer\");\n expect(output).toContain(\"API Reviewer\");\n expect(output).toContain(\"CLI Reviewer\");\n expect(output).toContain(\"Web Researcher\");\n expect(output).toContain(\"API Researcher\");\n expect(output).toContain(\"Web Tester\");\n expect(output).toContain(\"CLI Tester\");\n expect(output).toContain(\"Web PM\");\n expect(output).toContain(\"Pattern Scout\");\n expect(output).toContain(\"Pattern Critique\");\n expect(output).toContain(\"Agent Summoner\");\n expect(output).toContain(\"Skill Summoner\");\n expect(output).toContain(\"Documentor\");\n });\n\n it(\"should render agent descriptions\", () => {\n const { lastFrame, unmount } = render(<StepAgents matrix={EMPTY_MATRIX} />);\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Frontend features, components, TypeScript\");\n expect(output).toContain(\"Backend routes, database, middleware\");\n expect(output).toContain(\"CLI commands, interactive prompts\");\n });\n\n it(\"should render group headers\", () => {\n const { lastFrame, unmount } = render(<StepAgents matrix={EMPTY_MATRIX} />);\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Web\");\n expect(output).toContain(\"API\");\n expect(output).toContain(\"CLI\");\n expect(output).toContain(\"Meta\");\n });\n\n it(\"should show continue arrow\", () => {\n const { lastFrame, unmount } = render(<StepAgents matrix={EMPTY_MATRIX} />);\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"\\u2192\");\n expect(output).toContain(\"Continue\");\n });\n\n it(\"should show continue option with agent count when agents selected\", () => {\n const store = useWizardStore.getState();\n store.toggleAgent(\"web-developer\");\n store.toggleAgent(\"api-developer\");\n store.toggleAgent(\"web-reviewer\");\n\n const { lastFrame, unmount } = render(<StepAgents matrix={EMPTY_MATRIX} />);\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Continue with 3 agent(s)\");\n });\n\n it(\"should show 'Continue without agents' when no agents selected\", () => {\n const { lastFrame, unmount } = render(<StepAgents matrix={EMPTY_MATRIX} />);\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Continue without agents\");\n });\n });\n\n describe(\"keyboard interaction\", () => {\n it(\"should toggle agent on SPACE\", async () => {\n const { stdin, lastFrame, unmount } = render(<StepAgents matrix={EMPTY_MATRIX} />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(SPACE);\n await delay(INPUT_DELAY_MS);\n\n const store = useWizardStore.getState();\n expect(store.selectedAgents).toContain(\"web-developer\");\n });\n\n it(\"should toggle correct agent after navigation\", async () => {\n const { stdin, unmount } = render(<StepAgents matrix={EMPTY_MATRIX} />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(ARROW_DOWN);\n await delay(INPUT_DELAY_MS);\n await stdin.write(SPACE);\n await delay(INPUT_DELAY_MS);\n\n const store = useWizardStore.getState();\n expect(store.selectedAgents).toContain(\"web-reviewer\");\n });\n\n it(\"should navigate to confirm on ENTER when agents selected\", async () => {\n const store = useWizardStore.getState();\n store.toggleAgent(\"web-developer\");\n // Set step to agents so setStep(\"confirm\") actually navigates\n store.setStep(\"agents\");\n\n const { stdin, unmount } = render(<StepAgents matrix={EMPTY_MATRIX} />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(ENTER);\n await delay(INPUT_DELAY_MS);\n\n const updatedStore = useWizardStore.getState();\n expect(updatedStore.step).toBe(\"confirm\");\n });\n\n it(\"should navigate to confirm on ENTER even with no agents selected\", async () => {\n const store = useWizardStore.getState();\n store.setStep(\"agents\");\n\n const { stdin, unmount } = render(<StepAgents matrix={EMPTY_MATRIX} />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(ENTER);\n await delay(INPUT_DELAY_MS);\n\n const updatedStore = useWizardStore.getState();\n expect(updatedStore.step).toBe(\"confirm\");\n });\n\n it(\"should go back on ESC\", async () => {\n const store = useWizardStore.getState();\n store.setStep(\"sources\");\n store.setStep(\"agents\");\n\n const { stdin, unmount } = render(<StepAgents matrix={EMPTY_MATRIX} />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(ESCAPE);\n await delay(INPUT_DELAY_MS);\n\n const updatedStore = useWizardStore.getState();\n expect(updatedStore.step).toBe(\"sources\");\n });\n\n it(\"should toggle agent off when already selected\", async () => {\n const store = useWizardStore.getState();\n store.toggleAgent(\"web-developer\");\n\n const { stdin, unmount } = render(<StepAgents matrix={EMPTY_MATRIX} />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n // First item is web-developer, toggle it off\n await stdin.write(SPACE);\n await delay(INPUT_DELAY_MS);\n\n const updatedStore = useWizardStore.getState();\n expect(updatedStore.selectedAgents).not.toContain(\"web-developer\");\n });\n });\n});\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/cli/components/wizard/step-agents.test.tsx"],"sourcesContent":["import { render } from \"ink-testing-library\";\nimport { afterEach, beforeEach, describe, expect, it } from \"vitest\";\nimport { StepAgents } from \"./step-agents\";\nimport { useWizardStore } from \"../../stores/wizard-store\";\nimport { useMatrixStore } from \"../../stores/matrix-store\";\nimport {\n ARROW_DOWN,\n ENTER,\n ESCAPE,\n SPACE,\n RENDER_DELAY_MS,\n INPUT_DELAY_MS,\n delay,\n} from \"../../lib/__tests__/test-constants\";\nimport { createMockMatrix } from \"../../lib/__tests__/helpers\";\n\nconst EXPECTED_AGENT_COUNT = 18;\nconst EMPTY_MATRIX = createMockMatrix({});\n\ndescribe(\"StepAgents component\", () => {\n let cleanup: (() => void) | undefined;\n\n beforeEach(() => {\n useMatrixStore.getState().setMatrix(EMPTY_MATRIX);\n });\n\n afterEach(() => {\n cleanup?.();\n cleanup = undefined;\n });\n\n describe(\"rendering\", () => {\n it(\"should render title\", () => {\n const { lastFrame, unmount } = render(<StepAgents />);\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Select agents to compile:\");\n });\n\n it(\"should render all agents\", () => {\n const { lastFrame, unmount } = render(<StepAgents />);\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Web Developer\");\n expect(output).toContain(\"API Developer\");\n expect(output).toContain(\"CLI Developer\");\n expect(output).toContain(\"Web Architecture\");\n expect(output).toContain(\"Web Reviewer\");\n expect(output).toContain(\"API Reviewer\");\n expect(output).toContain(\"CLI Reviewer\");\n expect(output).toContain(\"Web Researcher\");\n expect(output).toContain(\"API Researcher\");\n expect(output).toContain(\"Web Tester\");\n expect(output).toContain(\"CLI Tester\");\n expect(output).toContain(\"Web PM\");\n expect(output).toContain(\"Pattern Scout\");\n expect(output).toContain(\"Pattern Critique\");\n expect(output).toContain(\"Agent Summoner\");\n expect(output).toContain(\"Skill Summoner\");\n expect(output).toContain(\"Documentor\");\n });\n\n it(\"should render agent descriptions\", () => {\n const { lastFrame, unmount } = render(<StepAgents />);\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Frontend features, components, TypeScript\");\n expect(output).toContain(\"Backend routes, database, middleware\");\n expect(output).toContain(\"CLI commands, interactive prompts\");\n });\n\n it(\"should render group headers\", () => {\n const { lastFrame, unmount } = render(<StepAgents />);\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Web\");\n expect(output).toContain(\"API\");\n expect(output).toContain(\"CLI\");\n expect(output).toContain(\"Meta\");\n });\n\n it(\"should show continue arrow\", () => {\n const { lastFrame, unmount } = render(<StepAgents />);\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"\\u2192\");\n expect(output).toContain(\"Continue\");\n });\n\n it(\"should show continue option with agent count when agents selected\", () => {\n const store = useWizardStore.getState();\n store.toggleAgent(\"web-developer\");\n store.toggleAgent(\"api-developer\");\n store.toggleAgent(\"web-reviewer\");\n\n const { lastFrame, unmount } = render(<StepAgents />);\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Continue with 3 agent(s)\");\n });\n\n it(\"should show 'Continue without agents' when no agents selected\", () => {\n const { lastFrame, unmount } = render(<StepAgents />);\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Continue without agents\");\n });\n });\n\n describe(\"keyboard interaction\", () => {\n it(\"should toggle agent on SPACE\", async () => {\n const { stdin, lastFrame, unmount } = render(<StepAgents />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(SPACE);\n await delay(INPUT_DELAY_MS);\n\n const store = useWizardStore.getState();\n expect(store.selectedAgents).toContain(\"web-developer\");\n });\n\n it(\"should toggle correct agent after navigation\", async () => {\n const { stdin, unmount } = render(<StepAgents />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(ARROW_DOWN);\n await delay(INPUT_DELAY_MS);\n await stdin.write(SPACE);\n await delay(INPUT_DELAY_MS);\n\n const store = useWizardStore.getState();\n expect(store.selectedAgents).toContain(\"web-reviewer\");\n });\n\n it(\"should navigate to confirm on ENTER when agents selected\", async () => {\n const store = useWizardStore.getState();\n store.toggleAgent(\"web-developer\");\n // Set step to agents so setStep(\"confirm\") actually navigates\n store.setStep(\"agents\");\n\n const { stdin, unmount } = render(<StepAgents />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(ENTER);\n await delay(INPUT_DELAY_MS);\n\n const updatedStore = useWizardStore.getState();\n expect(updatedStore.step).toBe(\"confirm\");\n });\n\n it(\"should navigate to confirm on ENTER even with no agents selected\", async () => {\n const store = useWizardStore.getState();\n store.setStep(\"agents\");\n\n const { stdin, unmount } = render(<StepAgents />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(ENTER);\n await delay(INPUT_DELAY_MS);\n\n const updatedStore = useWizardStore.getState();\n expect(updatedStore.step).toBe(\"confirm\");\n });\n\n it(\"should go back on ESC\", async () => {\n const store = useWizardStore.getState();\n store.setStep(\"sources\");\n store.setStep(\"agents\");\n\n const { stdin, unmount } = render(<StepAgents />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(ESCAPE);\n await delay(INPUT_DELAY_MS);\n\n const updatedStore = useWizardStore.getState();\n expect(updatedStore.step).toBe(\"sources\");\n });\n\n it(\"should toggle agent off when already selected\", async () => {\n const store = useWizardStore.getState();\n store.toggleAgent(\"web-developer\");\n\n const { stdin, unmount } = render(<StepAgents />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n // First item is web-developer, toggle it off\n await stdin.write(SPACE);\n await delay(INPUT_DELAY_MS);\n\n const updatedStore = useWizardStore.getState();\n expect(updatedStore.selectedAgents).not.toContain(\"web-developer\");\n });\n });\n});\n"],"mappings":"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","names":[]}
@@ -1,19 +1,21 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  StepBuild
4
- } from "../../chunk-KD2YS76O.js";
4
+ } from "../../chunk-BGPGQF35.js";
5
5
  import "../../chunk-K77I4XGL.js";
6
- import "../../chunk-H7WJK7NJ.js";
6
+ import "../../chunk-CKPJTMNC.js";
7
7
  import "../../chunk-GG4BSB6S.js";
8
- import "../../chunk-BKJHAJQW.js";
9
- import "../../chunk-MGNYPVOJ.js";
10
- import "../../chunk-BNQ5O6LE.js";
11
- import "../../chunk-IGM6HA3S.js";
12
- import "../../chunk-FWMWWE3X.js";
13
- import "../../chunk-OCEFD7V6.js";
8
+ import "../../chunk-ZYUASJUN.js";
9
+ import "../../chunk-AQYAVLZK.js";
10
+ import "../../chunk-AUNBGZS4.js";
11
+ import "../../chunk-4C7CSZC5.js";
12
+ import "../../chunk-6VIOO74O.js";
13
+ import "../../chunk-53URJ5XK.js";
14
+ import "../../chunk-F3REOP7N.js";
14
15
  import "../../chunk-T4EXUIBY.js";
15
- import "../../chunk-LWXRUR6B.js";
16
- import "../../chunk-6OWHQ7HM.js";
16
+ import "../../chunk-BKL3DF2Q.js";
17
+ import "../../chunk-LMZXL5RQ.js";
18
+ import "../../chunk-EGMQ3SXN.js";
17
19
  import "../../chunk-EC3UJRKZ.js";
18
20
  import "../../chunk-DHET7RCE.js";
19
21
  export {
@@ -14,34 +14,37 @@ import {
14
14
  createMockMatrix,
15
15
  createMockSkill,
16
16
  getTestSkill
17
- } from "../../chunk-7FMEMXJ4.js";
17
+ } from "../../chunk-MOMI77PL.js";
18
18
  import {
19
19
  afterEach,
20
+ beforeEach,
20
21
  describe,
21
22
  globalExpect,
22
23
  it,
23
24
  vi
24
25
  } from "../../chunk-XY3XDVMI.js";
25
26
  import {
26
- StepBuild
27
- } from "../../chunk-KD2YS76O.js";
27
+ StepBuild,
28
+ validateBuildStep
29
+ } from "../../chunk-BGPGQF35.js";
28
30
  import "../../chunk-K77I4XGL.js";
29
- import "../../chunk-H7WJK7NJ.js";
31
+ import "../../chunk-CKPJTMNC.js";
30
32
  import "../../chunk-GG4BSB6S.js";
31
33
  import {
32
34
  orderDomains
33
- } from "../../chunk-BKJHAJQW.js";
34
- import "../../chunk-MGNYPVOJ.js";
35
- import "../../chunk-BNQ5O6LE.js";
36
- import {
37
- getSkillDisplayLabel,
38
- validateBuildStep
39
- } from "../../chunk-IGM6HA3S.js";
40
- import "../../chunk-FWMWWE3X.js";
41
- import "../../chunk-OCEFD7V6.js";
35
+ } from "../../chunk-ZYUASJUN.js";
36
+ import "../../chunk-AQYAVLZK.js";
37
+ import "../../chunk-AUNBGZS4.js";
38
+ import "../../chunk-4C7CSZC5.js";
39
+ import "../../chunk-6VIOO74O.js";
40
+ import "../../chunk-53URJ5XK.js";
41
+ import "../../chunk-F3REOP7N.js";
42
42
  import "../../chunk-T4EXUIBY.js";
43
- import "../../chunk-LWXRUR6B.js";
44
- import "../../chunk-6OWHQ7HM.js";
43
+ import {
44
+ useMatrixStore
45
+ } from "../../chunk-BKL3DF2Q.js";
46
+ import "../../chunk-LMZXL5RQ.js";
47
+ import "../../chunk-EGMQ3SXN.js";
45
48
  import "../../chunk-EC3UJRKZ.js";
46
49
  import {
47
50
  init_esm_shims
@@ -95,16 +98,16 @@ var buildTestMatrix = (categories, skills) => createMockMatrix(
95
98
  );
96
99
  var reactSkill = getTestSkill("react", { displayName: "react" });
97
100
  var vueSkill = getTestSkill("vue", { displayName: "vue" });
98
- var tailwindSkill = createMockSkill("web-styling-tailwind", "web-styling", {
101
+ var tailwindSkill = createMockSkill("web-styling-tailwind", {
99
102
  displayName: "tailwind"
100
103
  });
101
104
  var scssSkill = getTestSkill("scss-modules", { displayName: "scss-modules" });
102
105
  var zustandSkill = getTestSkill("zustand", { displayName: "zustand" });
103
106
  var honoSkill = getTestSkill("hono", { displayName: "hono" });
104
- var expressSkill = createMockSkill("api-framework-express", "api-api", {
107
+ var expressSkill = createMockSkill("api-framework-express", {
105
108
  displayName: "express"
106
109
  });
107
- var postgresSkill = createMockSkill("api-database-postgres", "api-database");
110
+ var postgresSkill = createMockSkill("api-database-postgres");
108
111
  var defaultMatrix = buildTestMatrix(
109
112
  [
110
113
  WEB_FRAMEWORK_CATEGORY,
@@ -125,7 +128,6 @@ var defaultMatrix = buildTestMatrix(
125
128
  ]
126
129
  );
127
130
  var defaultProps = {
128
- matrix: defaultMatrix,
129
131
  domain: "web",
130
132
  selectedDomains: ["web"],
131
133
  selections: {},
@@ -141,6 +143,9 @@ var renderStepBuild = (props = {}) => {
141
143
  };
142
144
  describe("StepBuild component", () => {
143
145
  let cleanup;
146
+ beforeEach(() => {
147
+ useMatrixStore.getState().setMatrix(defaultMatrix);
148
+ });
144
149
  afterEach(() => {
145
150
  cleanup?.();
146
151
  cleanup = void 0;
@@ -418,7 +423,7 @@ describe("StepBuild component", () => {
418
423
  required: true,
419
424
  order: 0
420
425
  });
421
- const commanderSkill = createMockSkill("cli-cli-framework-commander", "cli-framework", {
426
+ const commanderSkill = createMockSkill("cli-cli-framework-commander", {
422
427
  displayName: "commander"
423
428
  });
424
429
  const matrixWithCli = buildTestMatrix(
@@ -442,8 +447,8 @@ describe("StepBuild component", () => {
442
447
  commanderSkill
443
448
  ]
444
449
  );
450
+ useMatrixStore.getState().setMatrix(matrixWithCli);
445
451
  const { lastFrame, unmount } = renderStepBuild({
446
- matrix: matrixWithCli,
447
452
  domain: "api",
448
453
  selectedDomains: ["web", "api", "cli"]
449
454
  });
@@ -487,7 +492,7 @@ describe("StepBuild component", () => {
487
492
  displayName: "Framework",
488
493
  required: true,
489
494
  exclusive: true,
490
- options: [{ id: "web-framework-react", label: "React", state: "normal", selected: true }]
495
+ options: [{ id: "web-framework-react", state: "normal", selected: true }]
491
496
  }
492
497
  ];
493
498
  const selections = { "web-framework": ["web-framework-react"] };
@@ -502,9 +507,7 @@ describe("StepBuild component", () => {
502
507
  displayName: "Framework",
503
508
  required: true,
504
509
  exclusive: true,
505
- options: [
506
- { id: "web-framework-react", label: "React", state: "normal", selected: false }
507
- ]
510
+ options: [{ id: "web-framework-react", state: "normal", selected: false }]
508
511
  }
509
512
  ];
510
513
  const selections = {};
@@ -522,7 +525,6 @@ describe("StepBuild component", () => {
522
525
  options: [
523
526
  {
524
527
  id: "web-state-zustand",
525
- label: "Zustand",
526
528
  state: "normal",
527
529
  selected: false
528
530
  }
@@ -588,12 +590,4 @@ describe("StepBuild component", () => {
588
590
  });
589
591
  });
590
592
  });
591
- describe("getSkillDisplayLabel", () => {
592
- it("should return displayName when available", () => {
593
- globalExpect(getSkillDisplayLabel({ displayName: "react" })).toBe("react");
594
- });
595
- it("should return displayName", () => {
596
- globalExpect(getSkillDisplayLabel({ displayName: "scss-modules" })).toBe("scss-modules");
597
- });
598
- });
599
593
  //# sourceMappingURL=step-build.test.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/cli/components/wizard/step-build.test.tsx","../../../src/cli/lib/__tests__/mock-data/mock-categories.ts"],"sourcesContent":["import { render } from \"ink-testing-library\";\nimport { indexBy } 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 { orderDomains } from \"./utils\";\nimport type { CategoryRow as GridCategoryRow } from \"./category-grid\";\nimport type {\n CategoryDefinition,\n Domain,\n ResolvedSkill,\n Category,\n CategorySelections,\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 {\n createMockCategory,\n createMockSkill,\n createMockMatrix,\n getTestSkill,\n} from \"../../lib/__tests__/helpers\";\nimport {\n WEB_FRAMEWORK_CATEGORY,\n WEB_STYLING_CATEGORY,\n WEB_STATE_CATEGORY,\n API_FRAMEWORK_CATEGORY,\n API_DATABASE_CATEGORY,\n} from \"../../lib/__tests__/mock-data/mock-categories.js\";\n\n// Test data construction cast: indexBy returns generic Record\nconst buildTestMatrix = (categories: CategoryDefinition[], skills: ResolvedSkill[]) =>\n createMockMatrix(\n indexBy(skills, (s) => s.id),\n {\n categories: indexBy(categories, (c) => c.id) as Record<Category, CategoryDefinition>,\n },\n );\n\nconst reactSkill = getTestSkill(\"react\", { displayName: \"react\" });\nconst vueSkill = getTestSkill(\"vue\", { displayName: \"vue\" });\nconst tailwindSkill = createMockSkill(\"web-styling-tailwind\", \"web-styling\", {\n displayName: \"tailwind\",\n});\nconst scssSkill = getTestSkill(\"scss-modules\", { displayName: \"scss-modules\" });\nconst zustandSkill = getTestSkill(\"zustand\", { displayName: \"zustand\" });\nconst honoSkill = getTestSkill(\"hono\", { displayName: \"hono\" });\nconst expressSkill = createMockSkill(\"api-framework-express\", \"api-api\", {\n displayName: \"express\",\n});\nconst postgresSkill = createMockSkill(\"api-database-postgres\", \"api-database\");\n\nconst defaultMatrix = buildTestMatrix(\n [\n WEB_FRAMEWORK_CATEGORY,\n WEB_STYLING_CATEGORY,\n WEB_STATE_CATEGORY,\n API_FRAMEWORK_CATEGORY,\n API_DATABASE_CATEGORY,\n ],\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 showLabels: false,\n onToggle: vi.fn(),\n onToggleLabels: 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: { \"web-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: { \"web-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: { \"web-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 it(\"should display domains in canonical order regardless of selection order\", () => {\n // Domains selected in reverse order: CLI, Mobile, API, Web\n expect(orderDomains([\"cli\", \"mobile\", \"api\", \"web\"])).toEqual([\n \"web\",\n \"api\",\n \"mobile\",\n \"cli\",\n ]);\n });\n\n it(\"should preserve canonical order with partial domain selection\", () => {\n // Only CLI and Web selected, in reverse order\n expect(orderDomains([\"cli\", \"web\"])).toEqual([\"web\", \"cli\"]);\n });\n\n it(\"should place custom domains before built-in domains\", () => {\n expect(orderDomains([\"web\", \"gaming\" as Domain, \"api\", \"devops\" as Domain])).toEqual([\n \"devops\",\n \"gaming\",\n \"web\",\n \"api\",\n ]);\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: { \"web-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: { \"web-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: { \"web-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 showLabels to CategoryGrid\", () => {\n const { lastFrame, unmount } = renderStepBuild({\n showLabels: true,\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // Labels 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 \"web-framework\": [\"web-framework-react\"],\n \"web-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 onToggleLabels to CategoryGrid\", async () => {\n const onToggleLabels = vi.fn();\n const { stdin, unmount } = renderStepBuild({ onToggleLabels });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n stdin.write(\"d\"); // 'd' key toggles compatibility labels\n await delay(INPUT_DELAY_MS);\n\n expect(onToggleLabels).toHaveBeenCalled();\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-postgres\"], // API skills in test matrix\n selections: { \"web-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 displayName: \"commander\",\n });\n\n const matrixWithCli = buildTestMatrix(\n [\n WEB_FRAMEWORK_CATEGORY,\n WEB_STYLING_CATEGORY,\n WEB_STATE_CATEGORY,\n API_FRAMEWORK_CATEGORY,\n API_DATABASE_CATEGORY,\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 compatibility labels\", async () => {\n const onToggleLabels = vi.fn();\n const { stdin, unmount } = renderStepBuild({ onToggleLabels });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n stdin.write(\"d\");\n await delay(INPUT_DELAY_MS);\n\n expect(onToggleLabels).toHaveBeenCalled();\n });\n });\n\n describe(\"validateBuildStep\", () => {\n it(\"should return valid when required categories have selections\", () => {\n const categories: GridCategoryRow[] = [\n {\n id: \"web-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: CategorySelections = { \"web-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: \"web-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: CategorySelections = {};\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: \"web-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: CategorySelections = {};\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: \"web-framework\",\n displayName: \"Framework\",\n required: true,\n exclusive: true,\n options: [],\n },\n {\n id: \"web-styling\",\n displayName: \"Styling\",\n required: true,\n exclusive: true,\n options: [],\n },\n ];\n const selections: CategorySelections = {};\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 \"web-framework\": [\"web-framework-react\"],\n \"web-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\" })).toBe(\"react\");\n });\n\n it(\"should return displayName\", () => {\n expect(getSkillDisplayLabel({ displayName: \"scss-modules\" })).toBe(\"scss-modules\");\n });\n});\n","// Shared category definitions with domain overrides for test files.\n// Uses createMockCategory from helpers.ts.\n\nimport { createMockCategory } from \"../helpers.js\";\n\n// ---------------------------------------------------------------------------\n// Categories from step-build.test.tsx (with domain overrides)\n// ---------------------------------------------------------------------------\n\nexport const WEB_FRAMEWORK_CATEGORY = createMockCategory(\"web-framework\", \"Framework\", {\n domain: \"web\",\n required: true,\n order: 0,\n});\n\nexport const WEB_STYLING_CATEGORY = createMockCategory(\"web-styling\", \"Styling\", {\n domain: \"web\",\n required: true,\n order: 1,\n});\n\nexport const WEB_STATE_CATEGORY = createMockCategory(\"web-client-state\", \"Client State\", {\n domain: \"web\",\n required: false,\n order: 2,\n});\n\nexport const API_FRAMEWORK_CATEGORY = createMockCategory(\"api-api\", \"API Framework\", {\n domain: \"api\",\n required: true,\n order: 0,\n});\n\nexport const API_DATABASE_CATEGORY = createMockCategory(\"api-database\", \"Database\", {\n domain: \"api\",\n required: false,\n order: 1,\n});\n\n// ---------------------------------------------------------------------------\n// Categories from matrix-loader.test.ts (basic, no domain override)\n// ---------------------------------------------------------------------------\n\nexport const FRAMEWORK_CATEGORY = createMockCategory(\"web-framework\", \"Framework\", {\n description: \"Web frameworks\",\n exclusive: true,\n required: false,\n order: 1,\n});\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/cli/components/wizard/step-build.test.tsx","../../../src/cli/lib/__tests__/mock-data/mock-categories.ts"],"sourcesContent":["import { render } from \"ink-testing-library\";\nimport { indexBy } from \"remeda\";\nimport { describe, expect, it, beforeEach, afterEach, vi } from \"vitest\";\nimport { StepBuild, type StepBuildProps } from \"./step-build\";\nimport { validateBuildStep } from \"../../lib/wizard/index\";\nimport { orderDomains } from \"./utils\";\nimport type { CategoryRow as GridCategoryRow } from \"./category-grid\";\nimport type {\n CategoryDefinition,\n Domain,\n ResolvedSkill,\n Category,\n CategorySelections,\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 {\n createMockCategory,\n createMockSkill,\n createMockMatrix,\n getTestSkill,\n} from \"../../lib/__tests__/helpers\";\nimport { useMatrixStore } from \"../../stores/matrix-store\";\nimport {\n WEB_FRAMEWORK_CATEGORY,\n WEB_STYLING_CATEGORY,\n WEB_STATE_CATEGORY,\n API_FRAMEWORK_CATEGORY,\n API_DATABASE_CATEGORY,\n} from \"../../lib/__tests__/mock-data/mock-categories.js\";\n\n// Test data construction cast: indexBy returns generic Record\nconst buildTestMatrix = (categories: CategoryDefinition[], skills: ResolvedSkill[]) =>\n createMockMatrix(\n indexBy(skills, (s) => s.id),\n {\n categories: indexBy(categories, (c) => c.id) as Record<Category, CategoryDefinition>,\n },\n );\n\nconst reactSkill = getTestSkill(\"react\", { displayName: \"react\" });\nconst vueSkill = getTestSkill(\"vue\", { displayName: \"vue\" });\nconst tailwindSkill = createMockSkill(\"web-styling-tailwind\", {\n displayName: \"tailwind\",\n});\nconst scssSkill = getTestSkill(\"scss-modules\", { displayName: \"scss-modules\" });\nconst zustandSkill = getTestSkill(\"zustand\", { displayName: \"zustand\" });\nconst honoSkill = getTestSkill(\"hono\", { displayName: \"hono\" });\nconst expressSkill = createMockSkill(\"api-framework-express\", {\n displayName: \"express\",\n});\nconst postgresSkill = createMockSkill(\"api-database-postgres\");\n\nconst defaultMatrix = buildTestMatrix(\n [\n WEB_FRAMEWORK_CATEGORY,\n WEB_STYLING_CATEGORY,\n WEB_STATE_CATEGORY,\n API_FRAMEWORK_CATEGORY,\n API_DATABASE_CATEGORY,\n ],\n [\n reactSkill,\n vueSkill,\n tailwindSkill,\n scssSkill,\n zustandSkill,\n honoSkill,\n expressSkill,\n postgresSkill,\n ],\n);\n\nconst defaultProps: StepBuildProps = {\n domain: \"web\",\n selectedDomains: [\"web\"],\n selections: {},\n allSelections: [],\n showLabels: false,\n onToggle: vi.fn(),\n onToggleLabels: 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 beforeEach(() => {\n useMatrixStore.getState().setMatrix(defaultMatrix);\n });\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: { \"web-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: { \"web-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: { \"web-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 it(\"should display domains in canonical order regardless of selection order\", () => {\n // Domains selected in reverse order: CLI, Mobile, API, Web\n expect(orderDomains([\"cli\", \"mobile\", \"api\", \"web\"])).toEqual([\n \"web\",\n \"api\",\n \"mobile\",\n \"cli\",\n ]);\n });\n\n it(\"should preserve canonical order with partial domain selection\", () => {\n // Only CLI and Web selected, in reverse order\n expect(orderDomains([\"cli\", \"web\"])).toEqual([\"web\", \"cli\"]);\n });\n\n it(\"should place custom domains before built-in domains\", () => {\n expect(orderDomains([\"web\", \"gaming\" as Domain, \"api\", \"devops\" as Domain])).toEqual([\n \"devops\",\n \"gaming\",\n \"web\",\n \"api\",\n ]);\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: { \"web-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: { \"web-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: { \"web-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 showLabels to CategoryGrid\", () => {\n const { lastFrame, unmount } = renderStepBuild({\n showLabels: true,\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // Labels 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 \"web-framework\": [\"web-framework-react\"],\n \"web-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 onToggleLabels to CategoryGrid\", async () => {\n const onToggleLabels = vi.fn();\n const { stdin, unmount } = renderStepBuild({ onToggleLabels });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n stdin.write(\"d\"); // 'd' key toggles compatibility labels\n await delay(INPUT_DELAY_MS);\n\n expect(onToggleLabels).toHaveBeenCalled();\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-postgres\"], // API skills in test matrix\n selections: { \"web-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\", {\n displayName: \"commander\",\n });\n\n const matrixWithCli = buildTestMatrix(\n [\n WEB_FRAMEWORK_CATEGORY,\n WEB_STYLING_CATEGORY,\n WEB_STATE_CATEGORY,\n API_FRAMEWORK_CATEGORY,\n API_DATABASE_CATEGORY,\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 useMatrixStore.getState().setMatrix(matrixWithCli);\n const { lastFrame, unmount } = renderStepBuild({\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 compatibility labels\", async () => {\n const onToggleLabels = vi.fn();\n const { stdin, unmount } = renderStepBuild({ onToggleLabels });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n stdin.write(\"d\");\n await delay(INPUT_DELAY_MS);\n\n expect(onToggleLabels).toHaveBeenCalled();\n });\n });\n\n describe(\"validateBuildStep\", () => {\n it(\"should return valid when required categories have selections\", () => {\n const categories: GridCategoryRow[] = [\n {\n id: \"web-framework\",\n displayName: \"Framework\",\n required: true,\n exclusive: true,\n options: [{ id: \"web-framework-react\", state: \"normal\", selected: true }],\n },\n ];\n const selections: CategorySelections = { \"web-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: \"web-framework\",\n displayName: \"Framework\",\n required: true,\n exclusive: true,\n options: [{ id: \"web-framework-react\", state: \"normal\", selected: false }],\n },\n ];\n const selections: CategorySelections = {};\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: \"web-client-state\",\n displayName: \"State Management\",\n required: false,\n exclusive: true,\n options: [\n {\n id: \"web-state-zustand\",\n state: \"normal\",\n selected: false,\n },\n ],\n },\n ];\n const selections: CategorySelections = {};\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: \"web-framework\",\n displayName: \"Framework\",\n required: true,\n exclusive: true,\n options: [],\n },\n {\n id: \"web-styling\",\n displayName: \"Styling\",\n required: true,\n exclusive: true,\n options: [],\n },\n ];\n const selections: CategorySelections = {};\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 \"web-framework\": [\"web-framework-react\"],\n \"web-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","// Shared category definitions with domain overrides for test files.\n// Uses createMockCategory from helpers.ts.\n\nimport { createMockCategory } from \"../helpers.js\";\n\n// ---------------------------------------------------------------------------\n// Categories from step-build.test.tsx (with domain overrides)\n// ---------------------------------------------------------------------------\n\nexport const WEB_FRAMEWORK_CATEGORY = createMockCategory(\"web-framework\", \"Framework\", {\n domain: \"web\",\n required: true,\n order: 0,\n});\n\nexport const WEB_STYLING_CATEGORY = createMockCategory(\"web-styling\", \"Styling\", {\n domain: \"web\",\n required: true,\n order: 1,\n});\n\nexport const WEB_STATE_CATEGORY = createMockCategory(\"web-client-state\", \"Client State\", {\n domain: \"web\",\n required: false,\n order: 2,\n});\n\nexport const API_FRAMEWORK_CATEGORY = createMockCategory(\"api-api\", \"API Framework\", {\n domain: \"api\",\n required: true,\n order: 0,\n});\n\nexport const API_DATABASE_CATEGORY = createMockCategory(\"api-database\", \"Database\", {\n domain: \"api\",\n required: false,\n order: 1,\n});\n\n// ---------------------------------------------------------------------------\n// Categories from matrix-loader.test.ts (basic, no domain override)\n// ---------------------------------------------------------------------------\n\nexport const FRAMEWORK_CATEGORY = createMockCategory(\"web-framework\", \"Framework\", {\n description: \"Web frameworks\",\n exclusive: true,\n required: false,\n order: 1,\n});\n"],"mappings":"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","names":[]}
@@ -1,11 +1,13 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  StepConfirm
4
- } from "../../chunk-KIWFEBKH.js";
5
- import "../../chunk-BKJHAJQW.js";
6
- import "../../chunk-MGNYPVOJ.js";
4
+ } from "../../chunk-52THXN5G.js";
5
+ import "../../chunk-ZYUASJUN.js";
6
+ import "../../chunk-AQYAVLZK.js";
7
+ import "../../chunk-6VIOO74O.js";
7
8
  import "../../chunk-T4EXUIBY.js";
8
- import "../../chunk-6OWHQ7HM.js";
9
+ import "../../chunk-BKL3DF2Q.js";
10
+ import "../../chunk-EGMQ3SXN.js";
9
11
  import "../../chunk-DHET7RCE.js";
10
12
  export {
11
13
  StepConfirm