@agents-inc/cli 0.35.0 → 0.38.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 (190) hide show
  1. package/CHANGELOG.md +37 -0
  2. package/config/skills-matrix.yaml +17 -17
  3. package/dist/{chunk-HTTPKSL6.js → chunk-2XX4TMCI.js} +2 -2
  4. package/dist/{chunk-CEWNZQMH.js → chunk-3E2V5YL3.js} +8 -2
  5. package/dist/chunk-3E2V5YL3.js.map +1 -0
  6. package/dist/{chunk-IG7CUREJ.js → chunk-3NQJOJZL.js} +2 -2
  7. package/dist/chunk-54ZZCWN4.js +51 -0
  8. package/dist/chunk-54ZZCWN4.js.map +1 -0
  9. package/dist/{chunk-VEZ2GZEK.js → chunk-ATLRUR3B.js} +2 -2
  10. package/dist/{chunk-KWF6D7ZP.js → chunk-CYFU3ARY.js} +26 -16
  11. package/dist/chunk-CYFU3ARY.js.map +1 -0
  12. package/dist/{chunk-CXWPUVA7.js → chunk-DUQFF45G.js} +7 -7
  13. package/dist/{chunk-U36YCEBK.js → chunk-EISBUEBL.js} +32 -23
  14. package/dist/chunk-EISBUEBL.js.map +1 -0
  15. package/dist/chunk-EXFVAEPY.js +80 -0
  16. package/dist/chunk-EXFVAEPY.js.map +1 -0
  17. package/dist/{chunk-YN35L5NE.js → chunk-FWQK3HWB.js} +4 -4
  18. package/dist/chunk-FWQK3HWB.js.map +1 -0
  19. package/dist/{chunk-DC5AK3LW.js → chunk-GG4BSB6S.js} +5 -11
  20. package/dist/chunk-GG4BSB6S.js.map +1 -0
  21. package/dist/{chunk-GGHH3KR2.js → chunk-HKDE4LJW.js} +2 -2
  22. package/dist/{chunk-OGXSTJP2.js → chunk-HRMQ2RGY.js} +81 -26
  23. package/dist/chunk-HRMQ2RGY.js.map +1 -0
  24. package/dist/{chunk-YPJKOM42.js → chunk-HRW7BIDE.js} +2 -2
  25. package/dist/{chunk-LFHZBF6N.js → chunk-IVIK776Y.js} +4 -3
  26. package/dist/chunk-IVIK776Y.js.map +1 -0
  27. package/dist/{chunk-NVQEHRJY.js → chunk-IWNPFIGY.js} +38 -48
  28. package/dist/chunk-IWNPFIGY.js.map +1 -0
  29. package/dist/{chunk-YIKBNGE3.js → chunk-IZRVFC2Z.js} +7 -7
  30. package/dist/chunk-IZRVFC2Z.js.map +1 -0
  31. package/dist/{chunk-AQQVSNUX.js → chunk-K77I4XGL.js} +20 -6
  32. package/dist/chunk-K77I4XGL.js.map +1 -0
  33. package/dist/{chunk-BPD4VUAU.js → chunk-M6PGIZNS.js} +5 -5
  34. package/dist/{chunk-5LPPIT6H.js → chunk-NFV4SKH5.js} +4 -4
  35. package/dist/chunk-NI2RSNWB.js +156 -0
  36. package/dist/chunk-NI2RSNWB.js.map +1 -0
  37. package/dist/{chunk-NJ775OJ4.js → chunk-OEX5JDQD.js} +7 -7
  38. package/dist/chunk-OEX5JDQD.js.map +1 -0
  39. package/dist/{chunk-OKILA27U.js → chunk-TA6IIQI4.js} +86 -99
  40. package/dist/chunk-TA6IIQI4.js.map +1 -0
  41. package/dist/{chunk-PKUIO2Z7.js → chunk-TBDIR6LY.js} +8 -8
  42. package/dist/chunk-TBDIR6LY.js.map +1 -0
  43. package/dist/{chunk-XYCN2GCV.js → chunk-TNFACSWF.js} +3 -3
  44. package/dist/{chunk-ZE355C6C.js → chunk-TY5GELDB.js} +9 -4
  45. package/dist/chunk-TY5GELDB.js.map +1 -0
  46. package/dist/{chunk-WMVGRAFB.js → chunk-U5OB5ADP.js} +186 -109
  47. package/dist/chunk-U5OB5ADP.js.map +1 -0
  48. package/dist/{chunk-JXMRTHDT.js → chunk-UOMMQ5M6.js} +2 -2
  49. package/dist/{chunk-XNQJBQ5X.js → chunk-UV6JUGIY.js} +2 -2
  50. package/dist/{chunk-5YNZJ5TP.js → chunk-VAHVSQIG.js} +2 -2
  51. package/dist/{chunk-OGJ7DFCL.js → chunk-VAK5PX72.js} +5 -5
  52. package/dist/chunk-WSGGJKD5.js +113 -0
  53. package/dist/chunk-WSGGJKD5.js.map +1 -0
  54. package/dist/{chunk-BLLXNFWP.js → chunk-YHQNTBBN.js} +2 -2
  55. package/dist/{chunk-OI4WBRC7.js → chunk-YJIJTBSX.js} +77 -102
  56. package/dist/chunk-YJIJTBSX.js.map +1 -0
  57. package/dist/{chunk-YCS7GF6Y.js → chunk-ZBJQXDQN.js} +3 -1
  58. package/dist/{chunk-YCS7GF6Y.js.map → chunk-ZBJQXDQN.js.map} +1 -1
  59. package/dist/cli/defaults/agent-mappings.yaml +4 -4
  60. package/dist/commands/build/marketplace.js +3 -3
  61. package/dist/commands/build/plugins.js +5 -5
  62. package/dist/commands/build/stack.js +5 -5
  63. package/dist/commands/compile.js +12 -17
  64. package/dist/commands/compile.js.map +1 -1
  65. package/dist/commands/config/get.js +8 -8
  66. package/dist/commands/config/get.js.map +1 -1
  67. package/dist/commands/config/index.js +5 -5
  68. package/dist/commands/config/path.js +4 -4
  69. package/dist/commands/config/set-project.js +7 -7
  70. package/dist/commands/config/set-project.js.map +1 -1
  71. package/dist/commands/config/show.js +5 -5
  72. package/dist/commands/config/unset-project.js +5 -5
  73. package/dist/commands/config/unset-project.js.map +1 -1
  74. package/dist/commands/diff.js +8 -8
  75. package/dist/commands/diff.js.map +1 -1
  76. package/dist/commands/doctor.js +4 -4
  77. package/dist/commands/edit.js +30 -27
  78. package/dist/commands/edit.js.map +1 -1
  79. package/dist/commands/eject.js +6 -6
  80. package/dist/commands/eject.js.map +1 -1
  81. package/dist/commands/import/skill.js +16 -16
  82. package/dist/commands/import/skill.js.map +1 -1
  83. package/dist/commands/info.js +5 -5
  84. package/dist/commands/init.js +29 -26
  85. package/dist/commands/init.js.map +1 -1
  86. package/dist/commands/list.js +4 -4
  87. package/dist/commands/new/agent.js +5 -5
  88. package/dist/commands/new/skill.js +8 -8
  89. package/dist/commands/new/skill.js.map +1 -1
  90. package/dist/commands/outdated.js +4 -4
  91. package/dist/commands/search.js +7 -7
  92. package/dist/commands/uninstall.js +109 -102
  93. package/dist/commands/uninstall.js.map +1 -1
  94. package/dist/commands/update.js +6 -6
  95. package/dist/commands/validate.js +5 -5
  96. package/dist/commands/version/bump.js +4 -4
  97. package/dist/commands/version/index.js +4 -4
  98. package/dist/commands/version/set.js +4 -4
  99. package/dist/commands/version/show.js +4 -4
  100. package/dist/components/skill-search/skill-search.js +3 -3
  101. package/dist/components/wizard/category-grid.js +3 -3
  102. package/dist/components/wizard/category-grid.test.js +42 -21
  103. package/dist/components/wizard/category-grid.test.js.map +1 -1
  104. package/dist/components/wizard/checkbox-grid.js +10 -0
  105. package/dist/components/wizard/checkbox-grid.test.js +260 -0
  106. package/dist/components/wizard/checkbox-grid.test.js.map +1 -0
  107. package/dist/components/wizard/domain-selection.js +7 -5
  108. package/dist/components/wizard/help-modal.js +2 -2
  109. package/dist/components/wizard/menu-item.js +2 -2
  110. package/dist/components/wizard/search-modal.js +2 -2
  111. package/dist/components/wizard/search-modal.test.js +2 -2
  112. package/dist/components/wizard/section-progress.js +2 -2
  113. package/dist/components/wizard/section-progress.test.js +2 -2
  114. package/dist/components/wizard/source-grid.js +4 -4
  115. package/dist/components/wizard/source-grid.test.js +4 -4
  116. package/dist/components/wizard/stack-selection.js +8 -7
  117. package/dist/components/wizard/step-agents.js +16 -0
  118. package/dist/components/wizard/step-agents.js.map +1 -0
  119. package/dist/components/wizard/step-agents.test.js +185 -0
  120. package/dist/components/wizard/step-agents.test.js.map +1 -0
  121. package/dist/components/wizard/step-build.js +9 -8
  122. package/dist/components/wizard/step-build.test.js +25 -23
  123. package/dist/components/wizard/step-build.test.js.map +1 -1
  124. package/dist/components/wizard/step-confirm.js +2 -2
  125. package/dist/components/wizard/step-confirm.test.js +6 -5
  126. package/dist/components/wizard/step-confirm.test.js.map +1 -1
  127. package/dist/components/wizard/step-refine.js +2 -2
  128. package/dist/components/wizard/step-refine.test.js +2 -2
  129. package/dist/components/wizard/step-settings.js +5 -5
  130. package/dist/components/wizard/step-settings.test.js +8 -8
  131. package/dist/components/wizard/step-sources.js +11 -10
  132. package/dist/components/wizard/step-sources.test.js +13 -12
  133. package/dist/components/wizard/step-sources.test.js.map +1 -1
  134. package/dist/components/wizard/step-stack.js +11 -9
  135. package/dist/components/wizard/step-stack.test.js +12 -10
  136. package/dist/components/wizard/step-stack.test.js.map +1 -1
  137. package/dist/components/wizard/view-title.js +2 -2
  138. package/dist/components/wizard/wizard-layout.js +8 -7
  139. package/dist/components/wizard/wizard-tabs.js +2 -2
  140. package/dist/components/wizard/wizard-tabs.test.js +6 -4
  141. package/dist/components/wizard/wizard-tabs.test.js.map +1 -1
  142. package/dist/components/wizard/wizard.js +26 -23
  143. package/dist/config/skills-matrix.yaml +17 -17
  144. package/dist/hooks/init.js +3 -3
  145. package/dist/{source-manager-PTK4P6BF.js → source-manager-FEGVYDFZ.js} +4 -4
  146. package/dist/source-manager-FEGVYDFZ.js.map +1 -0
  147. package/dist/stores/wizard-store.js +5 -4
  148. package/dist/stores/wizard-store.test.js +287 -15
  149. package/dist/stores/wizard-store.test.js.map +1 -1
  150. package/package.json +1 -1
  151. package/src/schemas/agent.schema.json +3 -3
  152. package/src/schemas/metadata.schema.json +14 -14
  153. package/src/schemas/project-config.schema.json +43 -2
  154. package/src/schemas/project-source-config.schema.json +5 -5
  155. package/src/schemas/skills-matrix.schema.json +4 -4
  156. package/src/schemas/stack.schema.json +1 -1
  157. package/src/schemas/stacks.schema.json +42 -1
  158. package/dist/chunk-AQQVSNUX.js.map +0 -1
  159. package/dist/chunk-CEWNZQMH.js.map +0 -1
  160. package/dist/chunk-DC5AK3LW.js.map +0 -1
  161. package/dist/chunk-KWF6D7ZP.js.map +0 -1
  162. package/dist/chunk-LFHZBF6N.js.map +0 -1
  163. package/dist/chunk-NJ775OJ4.js.map +0 -1
  164. package/dist/chunk-NVQEHRJY.js.map +0 -1
  165. package/dist/chunk-OGXSTJP2.js.map +0 -1
  166. package/dist/chunk-OI4WBRC7.js.map +0 -1
  167. package/dist/chunk-OKILA27U.js.map +0 -1
  168. package/dist/chunk-PKUIO2Z7.js.map +0 -1
  169. package/dist/chunk-U36YCEBK.js.map +0 -1
  170. package/dist/chunk-UFUQUFV6.js +0 -256
  171. package/dist/chunk-UFUQUFV6.js.map +0 -1
  172. package/dist/chunk-WMVGRAFB.js.map +0 -1
  173. package/dist/chunk-YIKBNGE3.js.map +0 -1
  174. package/dist/chunk-YN35L5NE.js.map +0 -1
  175. package/dist/chunk-ZE355C6C.js.map +0 -1
  176. /package/dist/{chunk-HTTPKSL6.js.map → chunk-2XX4TMCI.js.map} +0 -0
  177. /package/dist/{chunk-IG7CUREJ.js.map → chunk-3NQJOJZL.js.map} +0 -0
  178. /package/dist/{chunk-VEZ2GZEK.js.map → chunk-ATLRUR3B.js.map} +0 -0
  179. /package/dist/{chunk-CXWPUVA7.js.map → chunk-DUQFF45G.js.map} +0 -0
  180. /package/dist/{chunk-GGHH3KR2.js.map → chunk-HKDE4LJW.js.map} +0 -0
  181. /package/dist/{chunk-YPJKOM42.js.map → chunk-HRW7BIDE.js.map} +0 -0
  182. /package/dist/{chunk-BPD4VUAU.js.map → chunk-M6PGIZNS.js.map} +0 -0
  183. /package/dist/{chunk-5LPPIT6H.js.map → chunk-NFV4SKH5.js.map} +0 -0
  184. /package/dist/{chunk-XYCN2GCV.js.map → chunk-TNFACSWF.js.map} +0 -0
  185. /package/dist/{chunk-JXMRTHDT.js.map → chunk-UOMMQ5M6.js.map} +0 -0
  186. /package/dist/{chunk-XNQJBQ5X.js.map → chunk-UV6JUGIY.js.map} +0 -0
  187. /package/dist/{chunk-5YNZJ5TP.js.map → chunk-VAHVSQIG.js.map} +0 -0
  188. /package/dist/{chunk-OGJ7DFCL.js.map → chunk-VAK5PX72.js.map} +0 -0
  189. /package/dist/{chunk-BLLXNFWP.js.map → chunk-YHQNTBBN.js.map} +0 -0
  190. /package/dist/{source-manager-PTK4P6BF.js.map → components/wizard/checkbox-grid.js.map} +0 -0
@@ -0,0 +1,260 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ ARROW_DOWN,
4
+ ARROW_UP,
5
+ ENTER,
6
+ ESCAPE,
7
+ INPUT_DELAY_MS,
8
+ RENDER_DELAY_MS,
9
+ SPACE,
10
+ delay
11
+ } from "../../chunk-YZTWZVGX.js";
12
+ import {
13
+ render
14
+ } from "../../chunk-66UDJBF6.js";
15
+ import {
16
+ afterEach,
17
+ describe,
18
+ globalExpect,
19
+ it,
20
+ vi
21
+ } from "../../chunk-XY3XDVMI.js";
22
+ import {
23
+ CheckboxGrid
24
+ } from "../../chunk-IWNPFIGY.js";
25
+ import "../../chunk-ZBJQXDQN.js";
26
+ import {
27
+ init_esm_shims
28
+ } from "../../chunk-DHET7RCE.js";
29
+
30
+ // src/cli/components/wizard/checkbox-grid.test.tsx
31
+ init_esm_shims();
32
+ import { jsx } from "react/jsx-runtime";
33
+ var TEST_ITEMS = [
34
+ { id: "alpha", label: "Alpha", description: "First item" },
35
+ { id: "beta", label: "Beta", description: "Second item" },
36
+ { id: "gamma", label: "Gamma", description: "Third item" }
37
+ ];
38
+ var defaultProps = {
39
+ title: "Test title",
40
+ subtitle: "Test subtitle",
41
+ items: TEST_ITEMS,
42
+ selectedIds: [],
43
+ onToggle: vi.fn(),
44
+ onContinue: vi.fn(),
45
+ onBack: vi.fn(),
46
+ continueLabel: (count) => `Continue with ${count} item(s)`,
47
+ emptyMessage: "Select at least one"
48
+ };
49
+ var renderCheckboxGrid = (props = {}) => {
50
+ return render(/* @__PURE__ */ jsx(CheckboxGrid, { ...defaultProps, ...props }));
51
+ };
52
+ describe("CheckboxGrid component", () => {
53
+ let cleanup;
54
+ afterEach(() => {
55
+ cleanup?.();
56
+ cleanup = void 0;
57
+ });
58
+ describe("rendering", () => {
59
+ it("should render title and subtitle", () => {
60
+ const { lastFrame, unmount } = renderCheckboxGrid();
61
+ cleanup = unmount;
62
+ const output = lastFrame();
63
+ globalExpect(output).toContain("Test title");
64
+ globalExpect(output).toContain("Test subtitle");
65
+ });
66
+ it("should render all items with correct labels", () => {
67
+ const { lastFrame, unmount } = renderCheckboxGrid();
68
+ cleanup = unmount;
69
+ const output = lastFrame();
70
+ globalExpect(output).toContain("Alpha");
71
+ globalExpect(output).toContain("Beta");
72
+ globalExpect(output).toContain("Gamma");
73
+ });
74
+ it("should render item descriptions", () => {
75
+ const { lastFrame, unmount } = renderCheckboxGrid();
76
+ cleanup = unmount;
77
+ const output = lastFrame();
78
+ globalExpect(output).toContain("First item");
79
+ globalExpect(output).toContain("Second item");
80
+ globalExpect(output).toContain("Third item");
81
+ });
82
+ it("should show unchecked checkboxes when nothing selected", () => {
83
+ const { lastFrame, unmount } = renderCheckboxGrid();
84
+ cleanup = unmount;
85
+ const output = lastFrame();
86
+ globalExpect(output).toContain("[ ]");
87
+ globalExpect(output).not.toContain("[\u2713]");
88
+ });
89
+ it("should show checked checkboxes for selected items", () => {
90
+ const { lastFrame, unmount } = renderCheckboxGrid({
91
+ selectedIds: ["alpha", "gamma"]
92
+ });
93
+ cleanup = unmount;
94
+ const output = lastFrame();
95
+ globalExpect(output).toContain("[\u2713]");
96
+ });
97
+ it("should show empty message when nothing selected", () => {
98
+ const { lastFrame, unmount } = renderCheckboxGrid();
99
+ cleanup = unmount;
100
+ const output = lastFrame();
101
+ globalExpect(output).toContain("Select at least one");
102
+ });
103
+ it("should show selected summary when items are selected", () => {
104
+ const { lastFrame, unmount } = renderCheckboxGrid({
105
+ selectedIds: ["alpha", "beta"]
106
+ });
107
+ cleanup = unmount;
108
+ const output = lastFrame();
109
+ globalExpect(output).toContain("Selected:");
110
+ globalExpect(output).toContain("alpha");
111
+ globalExpect(output).toContain("beta");
112
+ });
113
+ it("should show continue option when items are selected", () => {
114
+ const { lastFrame, unmount } = renderCheckboxGrid({
115
+ selectedIds: ["alpha"]
116
+ });
117
+ cleanup = unmount;
118
+ const output = lastFrame();
119
+ globalExpect(output).toContain("Continue with 1 item(s)");
120
+ });
121
+ it("should not show continue option when nothing selected", () => {
122
+ const { lastFrame, unmount } = renderCheckboxGrid();
123
+ cleanup = unmount;
124
+ const output = lastFrame();
125
+ globalExpect(output).not.toContain("Continue with");
126
+ });
127
+ it("should show navigation hints", () => {
128
+ const { lastFrame, unmount } = renderCheckboxGrid();
129
+ cleanup = unmount;
130
+ const output = lastFrame();
131
+ globalExpect(output).toContain("navigate");
132
+ globalExpect(output).toContain("SPACE");
133
+ globalExpect(output).toContain("ENTER");
134
+ globalExpect(output).toContain("ESC");
135
+ });
136
+ });
137
+ describe("keyboard navigation", () => {
138
+ it("should move focus down with arrow down", async () => {
139
+ const { stdin, lastFrame, unmount } = renderCheckboxGrid();
140
+ cleanup = unmount;
141
+ await delay(RENDER_DELAY_MS);
142
+ let output = lastFrame();
143
+ globalExpect(output).toBeDefined();
144
+ stdin.write(ARROW_DOWN);
145
+ await delay(INPUT_DELAY_MS);
146
+ output = lastFrame();
147
+ globalExpect(output).toBeDefined();
148
+ });
149
+ it("should move focus up with arrow up", async () => {
150
+ const { stdin, lastFrame, unmount } = renderCheckboxGrid();
151
+ cleanup = unmount;
152
+ await delay(RENDER_DELAY_MS);
153
+ stdin.write(ARROW_UP);
154
+ await delay(INPUT_DELAY_MS);
155
+ const output = lastFrame();
156
+ globalExpect(output).toBeDefined();
157
+ });
158
+ it("should move focus with j/k vim keys", async () => {
159
+ const { stdin, lastFrame, unmount } = renderCheckboxGrid();
160
+ cleanup = unmount;
161
+ await delay(RENDER_DELAY_MS);
162
+ stdin.write("j");
163
+ await delay(INPUT_DELAY_MS);
164
+ let output = lastFrame();
165
+ globalExpect(output).toBeDefined();
166
+ stdin.write("k");
167
+ await delay(INPUT_DELAY_MS);
168
+ output = lastFrame();
169
+ globalExpect(output).toBeDefined();
170
+ });
171
+ it("should toggle selection with SPACE", async () => {
172
+ const onToggle = vi.fn();
173
+ const { stdin, unmount } = renderCheckboxGrid({ onToggle });
174
+ cleanup = unmount;
175
+ await delay(RENDER_DELAY_MS);
176
+ stdin.write(SPACE);
177
+ await delay(INPUT_DELAY_MS);
178
+ globalExpect(onToggle).toHaveBeenCalledWith("alpha");
179
+ });
180
+ it("should toggle correct item after navigation", async () => {
181
+ const onToggle = vi.fn();
182
+ const { stdin, unmount } = renderCheckboxGrid({ onToggle });
183
+ cleanup = unmount;
184
+ await delay(RENDER_DELAY_MS);
185
+ stdin.write(ARROW_DOWN);
186
+ await delay(INPUT_DELAY_MS);
187
+ stdin.write(SPACE);
188
+ await delay(INPUT_DELAY_MS);
189
+ globalExpect(onToggle).toHaveBeenCalledWith("beta");
190
+ });
191
+ it("should call onContinue with ENTER when items selected", async () => {
192
+ const onContinue = vi.fn();
193
+ const { stdin, unmount } = renderCheckboxGrid({
194
+ onContinue,
195
+ selectedIds: ["alpha"]
196
+ });
197
+ cleanup = unmount;
198
+ await delay(RENDER_DELAY_MS);
199
+ stdin.write(ENTER);
200
+ await delay(INPUT_DELAY_MS);
201
+ globalExpect(onContinue).toHaveBeenCalled();
202
+ });
203
+ it("should not call onContinue with ENTER when nothing selected", async () => {
204
+ const onContinue = vi.fn();
205
+ const { stdin, unmount } = renderCheckboxGrid({
206
+ onContinue,
207
+ selectedIds: []
208
+ });
209
+ cleanup = unmount;
210
+ await delay(RENDER_DELAY_MS);
211
+ stdin.write(ENTER);
212
+ await delay(INPUT_DELAY_MS);
213
+ globalExpect(onContinue).not.toHaveBeenCalled();
214
+ });
215
+ it("should call onBack with ESC", async () => {
216
+ const onBack = vi.fn();
217
+ const { stdin, unmount } = renderCheckboxGrid({ onBack });
218
+ cleanup = unmount;
219
+ await delay(RENDER_DELAY_MS);
220
+ stdin.write(ESCAPE);
221
+ await delay(INPUT_DELAY_MS);
222
+ globalExpect(onBack).toHaveBeenCalled();
223
+ });
224
+ it("should wrap focus from last to first item", async () => {
225
+ const onToggle = vi.fn();
226
+ const { stdin, unmount } = renderCheckboxGrid({ onToggle });
227
+ cleanup = unmount;
228
+ await delay(RENDER_DELAY_MS);
229
+ stdin.write(ARROW_DOWN);
230
+ await delay(INPUT_DELAY_MS);
231
+ stdin.write(ARROW_DOWN);
232
+ await delay(INPUT_DELAY_MS);
233
+ stdin.write(ARROW_DOWN);
234
+ await delay(INPUT_DELAY_MS);
235
+ stdin.write(SPACE);
236
+ await delay(INPUT_DELAY_MS);
237
+ globalExpect(onToggle).toHaveBeenCalledWith("alpha");
238
+ });
239
+ });
240
+ describe("custom props", () => {
241
+ it("should use custom continueLabel", () => {
242
+ const { lastFrame, unmount } = renderCheckboxGrid({
243
+ selectedIds: ["alpha", "beta"],
244
+ continueLabel: (count) => `Proceed with ${count} selected`
245
+ });
246
+ cleanup = unmount;
247
+ const output = lastFrame();
248
+ globalExpect(output).toContain("Proceed with 2 selected");
249
+ });
250
+ it("should use custom emptyMessage", () => {
251
+ const { lastFrame, unmount } = renderCheckboxGrid({
252
+ emptyMessage: "Pick something!"
253
+ });
254
+ cleanup = unmount;
255
+ const output = lastFrame();
256
+ globalExpect(output).toContain("Pick something!");
257
+ });
258
+ });
259
+ });
260
+ //# sourceMappingURL=checkbox-grid.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/cli/components/wizard/checkbox-grid.test.tsx"],"sourcesContent":["import { render } from \"ink-testing-library\";\nimport { afterEach, describe, expect, it, vi } from \"vitest\";\nimport { CheckboxGrid, type CheckboxGridProps } from \"./checkbox-grid\";\nimport {\n ARROW_DOWN,\n ARROW_UP,\n ENTER,\n ESCAPE,\n SPACE,\n RENDER_DELAY_MS,\n INPUT_DELAY_MS,\n delay,\n} from \"../../lib/__tests__/test-constants\";\n\ntype TestItem = \"alpha\" | \"beta\" | \"gamma\";\n\nconst TEST_ITEMS: CheckboxGridProps<TestItem>[\"items\"] = [\n { id: \"alpha\", label: \"Alpha\", description: \"First item\" },\n { id: \"beta\", label: \"Beta\", description: \"Second item\" },\n { id: \"gamma\", label: \"Gamma\", description: \"Third item\" },\n];\n\nconst defaultProps: CheckboxGridProps<TestItem> = {\n title: \"Test title\",\n subtitle: \"Test subtitle\",\n items: TEST_ITEMS,\n selectedIds: [],\n onToggle: vi.fn(),\n onContinue: vi.fn(),\n onBack: vi.fn(),\n continueLabel: (count) => `Continue with ${count} item(s)`,\n emptyMessage: \"Select at least one\",\n};\n\nconst renderCheckboxGrid = (props: Partial<CheckboxGridProps<TestItem>> = {}) => {\n return render(<CheckboxGrid {...defaultProps} {...props} />);\n};\n\ndescribe(\"CheckboxGrid component\", () => {\n let cleanup: (() => void) | undefined;\n\n afterEach(() => {\n cleanup?.();\n cleanup = undefined;\n });\n\n describe(\"rendering\", () => {\n it(\"should render title and subtitle\", () => {\n const { lastFrame, unmount } = renderCheckboxGrid();\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Test title\");\n expect(output).toContain(\"Test subtitle\");\n });\n\n it(\"should render all items with correct labels\", () => {\n const { lastFrame, unmount } = renderCheckboxGrid();\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Alpha\");\n expect(output).toContain(\"Beta\");\n expect(output).toContain(\"Gamma\");\n });\n\n it(\"should render item descriptions\", () => {\n const { lastFrame, unmount } = renderCheckboxGrid();\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"First item\");\n expect(output).toContain(\"Second item\");\n expect(output).toContain(\"Third item\");\n });\n\n it(\"should show unchecked checkboxes when nothing selected\", () => {\n const { lastFrame, unmount } = renderCheckboxGrid();\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"[ ]\");\n expect(output).not.toContain(\"[\\u2713]\");\n });\n\n it(\"should show checked checkboxes for selected items\", () => {\n const { lastFrame, unmount } = renderCheckboxGrid({\n selectedIds: [\"alpha\", \"gamma\"],\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"[\\u2713]\");\n });\n\n it(\"should show empty message when nothing selected\", () => {\n const { lastFrame, unmount } = renderCheckboxGrid();\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Select at least one\");\n });\n\n it(\"should show selected summary when items are selected\", () => {\n const { lastFrame, unmount } = renderCheckboxGrid({\n selectedIds: [\"alpha\", \"beta\"],\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Selected:\");\n expect(output).toContain(\"alpha\");\n expect(output).toContain(\"beta\");\n });\n\n it(\"should show continue option when items are selected\", () => {\n const { lastFrame, unmount } = renderCheckboxGrid({\n selectedIds: [\"alpha\"],\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Continue with 1 item(s)\");\n });\n\n it(\"should not show continue option when nothing selected\", () => {\n const { lastFrame, unmount } = renderCheckboxGrid();\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).not.toContain(\"Continue with\");\n });\n\n it(\"should show navigation hints\", () => {\n const { lastFrame, unmount } = renderCheckboxGrid();\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"navigate\");\n expect(output).toContain(\"SPACE\");\n expect(output).toContain(\"ENTER\");\n expect(output).toContain(\"ESC\");\n });\n });\n\n describe(\"keyboard navigation\", () => {\n it(\"should move focus down with arrow down\", async () => {\n const { stdin, lastFrame, unmount } = renderCheckboxGrid();\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n // First item focused by default (has focus indicator)\n let output = lastFrame();\n expect(output).toBeDefined();\n\n stdin.write(ARROW_DOWN);\n await delay(INPUT_DELAY_MS);\n\n output = lastFrame();\n expect(output).toBeDefined();\n });\n\n it(\"should move focus up with arrow up\", async () => {\n const { stdin, lastFrame, unmount } = renderCheckboxGrid();\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n stdin.write(ARROW_UP);\n await delay(INPUT_DELAY_MS);\n\n // Should wrap to last item\n const output = lastFrame();\n expect(output).toBeDefined();\n });\n\n it(\"should move focus with j/k vim keys\", async () => {\n const { stdin, lastFrame, unmount } = renderCheckboxGrid();\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n stdin.write(\"j\");\n await delay(INPUT_DELAY_MS);\n\n let output = lastFrame();\n expect(output).toBeDefined();\n\n stdin.write(\"k\");\n await delay(INPUT_DELAY_MS);\n\n output = lastFrame();\n expect(output).toBeDefined();\n });\n\n it(\"should toggle selection with SPACE\", async () => {\n const onToggle = vi.fn();\n const { stdin, unmount } = renderCheckboxGrid({ onToggle });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n stdin.write(SPACE);\n await delay(INPUT_DELAY_MS);\n\n // First item is focused by default, so toggling should call with \"alpha\"\n expect(onToggle).toHaveBeenCalledWith(\"alpha\");\n });\n\n it(\"should toggle correct item after navigation\", async () => {\n const onToggle = vi.fn();\n const { stdin, unmount } = renderCheckboxGrid({ onToggle });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n stdin.write(ARROW_DOWN);\n await delay(INPUT_DELAY_MS);\n stdin.write(SPACE);\n await delay(INPUT_DELAY_MS);\n\n expect(onToggle).toHaveBeenCalledWith(\"beta\");\n });\n\n it(\"should call onContinue with ENTER when items selected\", async () => {\n const onContinue = vi.fn();\n const { stdin, unmount } = renderCheckboxGrid({\n onContinue,\n selectedIds: [\"alpha\"],\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 not call onContinue with ENTER when nothing selected\", async () => {\n const onContinue = vi.fn();\n const { stdin, unmount } = renderCheckboxGrid({\n onContinue,\n selectedIds: [],\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).not.toHaveBeenCalled();\n });\n\n it(\"should call onBack with ESC\", async () => {\n const onBack = vi.fn();\n const { stdin, unmount } = renderCheckboxGrid({ 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 wrap focus from last to first item\", async () => {\n const onToggle = vi.fn();\n const { stdin, unmount } = renderCheckboxGrid({ onToggle });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n // Navigate down past all 3 items (no continue since nothing selected)\n stdin.write(ARROW_DOWN);\n await delay(INPUT_DELAY_MS);\n stdin.write(ARROW_DOWN);\n await delay(INPUT_DELAY_MS);\n stdin.write(ARROW_DOWN);\n await delay(INPUT_DELAY_MS);\n // Should wrap to first item\n stdin.write(SPACE);\n await delay(INPUT_DELAY_MS);\n\n expect(onToggle).toHaveBeenCalledWith(\"alpha\");\n });\n });\n\n describe(\"custom props\", () => {\n it(\"should use custom continueLabel\", () => {\n const { lastFrame, unmount } = renderCheckboxGrid({\n selectedIds: [\"alpha\", \"beta\"],\n continueLabel: (count) => `Proceed with ${count} selected`,\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Proceed with 2 selected\");\n });\n\n it(\"should use custom emptyMessage\", () => {\n const { lastFrame, unmount } = renderCheckboxGrid({\n emptyMessage: \"Pick something!\",\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Pick something!\");\n });\n });\n});\n"],"mappings":"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","names":[]}
@@ -1,12 +1,14 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  DomainSelection
4
- } from "../../chunk-NVQEHRJY.js";
5
- import "../../chunk-OGXSTJP2.js";
6
- import "../../chunk-WMVGRAFB.js";
4
+ } from "../../chunk-54ZZCWN4.js";
5
+ import "../../chunk-IWNPFIGY.js";
6
+ import "../../chunk-HRMQ2RGY.js";
7
+ import "../../chunk-WSGGJKD5.js";
8
+ import "../../chunk-U5OB5ADP.js";
7
9
  import "../../chunk-T4EXUIBY.js";
8
- import "../../chunk-OI4WBRC7.js";
9
- import "../../chunk-YCS7GF6Y.js";
10
+ import "../../chunk-YJIJTBSX.js";
11
+ import "../../chunk-ZBJQXDQN.js";
10
12
  import "../../chunk-DHET7RCE.js";
11
13
  export {
12
14
  DomainSelection
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  HelpModal
4
- } from "../../chunk-ZE355C6C.js";
5
- import "../../chunk-YCS7GF6Y.js";
4
+ } from "../../chunk-TY5GELDB.js";
5
+ import "../../chunk-ZBJQXDQN.js";
6
6
  import "../../chunk-DHET7RCE.js";
7
7
  export {
8
8
  HelpModal
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  MenuItem
4
- } from "../../chunk-YPJKOM42.js";
5
- import "../../chunk-YCS7GF6Y.js";
4
+ } from "../../chunk-HRW7BIDE.js";
5
+ import "../../chunk-ZBJQXDQN.js";
6
6
  import "../../chunk-DHET7RCE.js";
7
7
  export {
8
8
  MenuItem
@@ -1,9 +1,9 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  SearchModal
4
- } from "../../chunk-IG7CUREJ.js";
4
+ } from "../../chunk-3NQJOJZL.js";
5
5
  import "../../chunk-KUV24B5M.js";
6
- import "../../chunk-YCS7GF6Y.js";
6
+ import "../../chunk-ZBJQXDQN.js";
7
7
  import "../../chunk-DHET7RCE.js";
8
8
  export {
9
9
  SearchModal
@@ -20,9 +20,9 @@ import {
20
20
  } from "../../chunk-XY3XDVMI.js";
21
21
  import {
22
22
  SearchModal
23
- } from "../../chunk-IG7CUREJ.js";
23
+ } from "../../chunk-3NQJOJZL.js";
24
24
  import "../../chunk-KUV24B5M.js";
25
- import "../../chunk-YCS7GF6Y.js";
25
+ import "../../chunk-ZBJQXDQN.js";
26
26
  import {
27
27
  init_esm_shims
28
28
  } from "../../chunk-DHET7RCE.js";
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  SectionProgress
4
- } from "../../chunk-JXMRTHDT.js";
5
- import "../../chunk-YCS7GF6Y.js";
4
+ } from "../../chunk-UOMMQ5M6.js";
5
+ import "../../chunk-ZBJQXDQN.js";
6
6
  import "../../chunk-DHET7RCE.js";
7
7
  export {
8
8
  SectionProgress
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  SectionProgress
4
- } from "../../chunk-JXMRTHDT.js";
4
+ } from "../../chunk-UOMMQ5M6.js";
5
5
  import {
6
6
  render
7
7
  } from "../../chunk-66UDJBF6.js";
@@ -11,7 +11,7 @@ import {
11
11
  globalExpect,
12
12
  it
13
13
  } from "../../chunk-XY3XDVMI.js";
14
- import "../../chunk-YCS7GF6Y.js";
14
+ import "../../chunk-ZBJQXDQN.js";
15
15
  import {
16
16
  init_esm_shims
17
17
  } from "../../chunk-DHET7RCE.js";
@@ -1,12 +1,12 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  SourceGrid
4
- } from "../../chunk-U36YCEBK.js";
4
+ } from "../../chunk-EISBUEBL.js";
5
5
  import "../../chunk-7SOPVGDV.js";
6
- import "../../chunk-DC5AK3LW.js";
7
- import "../../chunk-IG7CUREJ.js";
6
+ import "../../chunk-3NQJOJZL.js";
8
7
  import "../../chunk-KUV24B5M.js";
9
- import "../../chunk-YCS7GF6Y.js";
8
+ import "../../chunk-GG4BSB6S.js";
9
+ import "../../chunk-ZBJQXDQN.js";
10
10
  import "../../chunk-DHET7RCE.js";
11
11
  export {
12
12
  SourceGrid
@@ -23,12 +23,12 @@ import {
23
23
  } from "../../chunk-XY3XDVMI.js";
24
24
  import {
25
25
  SourceGrid
26
- } from "../../chunk-U36YCEBK.js";
26
+ } from "../../chunk-EISBUEBL.js";
27
27
  import "../../chunk-7SOPVGDV.js";
28
- import "../../chunk-DC5AK3LW.js";
29
- import "../../chunk-IG7CUREJ.js";
28
+ import "../../chunk-3NQJOJZL.js";
30
29
  import "../../chunk-KUV24B5M.js";
31
- import "../../chunk-YCS7GF6Y.js";
30
+ import "../../chunk-GG4BSB6S.js";
31
+ import "../../chunk-ZBJQXDQN.js";
32
32
  import {
33
33
  init_esm_shims
34
34
  } from "../../chunk-DHET7RCE.js";
@@ -1,15 +1,16 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  StackSelection
4
- } from "../../chunk-OGJ7DFCL.js";
4
+ } from "../../chunk-VAK5PX72.js";
5
5
  import "../../chunk-MZB3GGOH.js";
6
- import "../../chunk-HTTPKSL6.js";
7
- import "../../chunk-YPJKOM42.js";
8
- import "../../chunk-OGXSTJP2.js";
9
- import "../../chunk-WMVGRAFB.js";
6
+ import "../../chunk-2XX4TMCI.js";
7
+ import "../../chunk-HRW7BIDE.js";
8
+ import "../../chunk-HRMQ2RGY.js";
9
+ import "../../chunk-WSGGJKD5.js";
10
+ import "../../chunk-U5OB5ADP.js";
10
11
  import "../../chunk-T4EXUIBY.js";
11
- import "../../chunk-OI4WBRC7.js";
12
- import "../../chunk-YCS7GF6Y.js";
12
+ import "../../chunk-YJIJTBSX.js";
13
+ import "../../chunk-ZBJQXDQN.js";
13
14
  import "../../chunk-DHET7RCE.js";
14
15
  export {
15
16
  StackSelection
@@ -0,0 +1,16 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ StepAgents
4
+ } from "../../chunk-EXFVAEPY.js";
5
+ import "../../chunk-IWNPFIGY.js";
6
+ import "../../chunk-HRMQ2RGY.js";
7
+ import "../../chunk-WSGGJKD5.js";
8
+ import "../../chunk-U5OB5ADP.js";
9
+ import "../../chunk-T4EXUIBY.js";
10
+ import "../../chunk-YJIJTBSX.js";
11
+ import "../../chunk-ZBJQXDQN.js";
12
+ import "../../chunk-DHET7RCE.js";
13
+ export {
14
+ StepAgents
15
+ };
16
+ //# sourceMappingURL=step-agents.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,185 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ ARROW_DOWN,
4
+ ENTER,
5
+ ESCAPE,
6
+ INPUT_DELAY_MS,
7
+ RENDER_DELAY_MS,
8
+ SPACE,
9
+ delay
10
+ } from "../../chunk-YZTWZVGX.js";
11
+ import {
12
+ render
13
+ } from "../../chunk-66UDJBF6.js";
14
+ import {
15
+ afterEach,
16
+ beforeEach,
17
+ describe,
18
+ globalExpect,
19
+ it
20
+ } from "../../chunk-XY3XDVMI.js";
21
+ import {
22
+ StepAgents
23
+ } from "../../chunk-EXFVAEPY.js";
24
+ import "../../chunk-IWNPFIGY.js";
25
+ import {
26
+ useWizardStore
27
+ } from "../../chunk-HRMQ2RGY.js";
28
+ import "../../chunk-WSGGJKD5.js";
29
+ import "../../chunk-U5OB5ADP.js";
30
+ import "../../chunk-T4EXUIBY.js";
31
+ import "../../chunk-YJIJTBSX.js";
32
+ import "../../chunk-ZBJQXDQN.js";
33
+ import {
34
+ init_esm_shims
35
+ } from "../../chunk-DHET7RCE.js";
36
+
37
+ // src/cli/components/wizard/step-agents.test.tsx
38
+ init_esm_shims();
39
+ import { jsx } from "react/jsx-runtime";
40
+ describe("StepAgents component", () => {
41
+ let cleanup;
42
+ beforeEach(() => {
43
+ useWizardStore.getState().reset();
44
+ });
45
+ afterEach(() => {
46
+ cleanup?.();
47
+ cleanup = void 0;
48
+ });
49
+ describe("rendering", () => {
50
+ it("should render title and subtitle", () => {
51
+ const { lastFrame, unmount } = render(/* @__PURE__ */ jsx(StepAgents, {}));
52
+ cleanup = unmount;
53
+ const output = lastFrame();
54
+ globalExpect(output).toContain("Select agents to compile:");
55
+ globalExpect(output).toContain("Toggle agents on/off, then continue");
56
+ });
57
+ it("should render all agents", () => {
58
+ const { lastFrame, unmount } = render(/* @__PURE__ */ jsx(StepAgents, {}));
59
+ cleanup = unmount;
60
+ const output = lastFrame();
61
+ globalExpect(output).toContain("Web Developer");
62
+ globalExpect(output).toContain("API Developer");
63
+ globalExpect(output).toContain("CLI Developer");
64
+ globalExpect(output).toContain("Web Architecture");
65
+ globalExpect(output).toContain("Web Reviewer");
66
+ globalExpect(output).toContain("API Reviewer");
67
+ globalExpect(output).toContain("CLI Reviewer");
68
+ globalExpect(output).toContain("Web Researcher");
69
+ globalExpect(output).toContain("API Researcher");
70
+ globalExpect(output).toContain("Web Tester");
71
+ globalExpect(output).toContain("CLI Tester");
72
+ globalExpect(output).toContain("Web PM");
73
+ globalExpect(output).toContain("Pattern Scout");
74
+ globalExpect(output).toContain("Pattern Critique");
75
+ globalExpect(output).toContain("Agent Summoner");
76
+ globalExpect(output).toContain("Skill Summoner");
77
+ globalExpect(output).toContain("Documentor");
78
+ globalExpect(output).toContain("CLI Migrator");
79
+ });
80
+ it("should render agent descriptions", () => {
81
+ const { lastFrame, unmount } = render(/* @__PURE__ */ jsx(StepAgents, {}));
82
+ cleanup = unmount;
83
+ const output = lastFrame();
84
+ globalExpect(output).toContain("Frontend features, components, TypeScript");
85
+ globalExpect(output).toContain("Backend routes, database, middleware");
86
+ globalExpect(output).toContain("CLI commands, interactive prompts");
87
+ });
88
+ it("should show empty message when no agents selected", () => {
89
+ const { lastFrame, unmount } = render(/* @__PURE__ */ jsx(StepAgents, {}));
90
+ cleanup = unmount;
91
+ const output = lastFrame();
92
+ globalExpect(output).toContain("Please select at least one agent");
93
+ });
94
+ it("should show selected agents when preselected", () => {
95
+ const store = useWizardStore.getState();
96
+ store.toggleAgent("web-developer");
97
+ store.toggleAgent("api-developer");
98
+ const { lastFrame, unmount } = render(/* @__PURE__ */ jsx(StepAgents, {}));
99
+ cleanup = unmount;
100
+ const output = lastFrame();
101
+ globalExpect(output).toContain("Selected:");
102
+ globalExpect(output).toContain("web-developer");
103
+ globalExpect(output).toContain("api-developer");
104
+ });
105
+ it("should show continue option with agent count when agents selected", () => {
106
+ const store = useWizardStore.getState();
107
+ store.toggleAgent("web-developer");
108
+ store.toggleAgent("api-developer");
109
+ store.toggleAgent("web-reviewer");
110
+ const { lastFrame, unmount } = render(/* @__PURE__ */ jsx(StepAgents, {}));
111
+ cleanup = unmount;
112
+ const output = lastFrame();
113
+ globalExpect(output).toContain("Continue with 3 agent(s)");
114
+ });
115
+ });
116
+ describe("keyboard interaction", () => {
117
+ it("should toggle agent on SPACE", async () => {
118
+ const { stdin, lastFrame, unmount } = render(/* @__PURE__ */ jsx(StepAgents, {}));
119
+ cleanup = unmount;
120
+ await delay(RENDER_DELAY_MS);
121
+ stdin.write(SPACE);
122
+ await delay(INPUT_DELAY_MS);
123
+ const store = useWizardStore.getState();
124
+ globalExpect(store.selectedAgents).toContain("web-developer");
125
+ });
126
+ it("should toggle correct agent after navigation", async () => {
127
+ const { stdin, unmount } = render(/* @__PURE__ */ jsx(StepAgents, {}));
128
+ cleanup = unmount;
129
+ await delay(RENDER_DELAY_MS);
130
+ stdin.write(ARROW_DOWN);
131
+ await delay(INPUT_DELAY_MS);
132
+ stdin.write(SPACE);
133
+ await delay(INPUT_DELAY_MS);
134
+ const store = useWizardStore.getState();
135
+ globalExpect(store.selectedAgents).toContain("api-developer");
136
+ });
137
+ it("should navigate to confirm on ENTER when agents selected", async () => {
138
+ const store = useWizardStore.getState();
139
+ store.toggleAgent("web-developer");
140
+ store.setStep("agents");
141
+ const { stdin, unmount } = render(/* @__PURE__ */ jsx(StepAgents, {}));
142
+ cleanup = unmount;
143
+ await delay(RENDER_DELAY_MS);
144
+ stdin.write(ENTER);
145
+ await delay(INPUT_DELAY_MS);
146
+ const updatedStore = useWizardStore.getState();
147
+ globalExpect(updatedStore.step).toBe("confirm");
148
+ });
149
+ it("should not navigate on ENTER when no agents selected", async () => {
150
+ const store = useWizardStore.getState();
151
+ store.setStep("agents");
152
+ const { stdin, unmount } = render(/* @__PURE__ */ jsx(StepAgents, {}));
153
+ cleanup = unmount;
154
+ await delay(RENDER_DELAY_MS);
155
+ stdin.write(ENTER);
156
+ await delay(INPUT_DELAY_MS);
157
+ const updatedStore = useWizardStore.getState();
158
+ globalExpect(updatedStore.step).toBe("agents");
159
+ });
160
+ it("should go back on ESC", async () => {
161
+ const store = useWizardStore.getState();
162
+ store.setStep("sources");
163
+ store.setStep("agents");
164
+ const { stdin, unmount } = render(/* @__PURE__ */ jsx(StepAgents, {}));
165
+ cleanup = unmount;
166
+ await delay(RENDER_DELAY_MS);
167
+ stdin.write(ESCAPE);
168
+ await delay(INPUT_DELAY_MS);
169
+ const updatedStore = useWizardStore.getState();
170
+ globalExpect(updatedStore.step).toBe("sources");
171
+ });
172
+ it("should toggle agent off when already selected", async () => {
173
+ const store = useWizardStore.getState();
174
+ store.toggleAgent("web-developer");
175
+ const { stdin, unmount } = render(/* @__PURE__ */ jsx(StepAgents, {}));
176
+ cleanup = unmount;
177
+ await delay(RENDER_DELAY_MS);
178
+ stdin.write(SPACE);
179
+ await delay(INPUT_DELAY_MS);
180
+ const updatedStore = useWizardStore.getState();
181
+ globalExpect(updatedStore.selectedAgents).not.toContain("web-developer");
182
+ });
183
+ });
184
+ });
185
+ //# sourceMappingURL=step-agents.test.js.map