@agents-inc/cli 0.38.0 → 0.41.2

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 (183) hide show
  1. package/CHANGELOG.md +77 -0
  2. package/README.md +1 -1
  3. package/config/skills-matrix.yaml +115 -123
  4. package/config/stacks.yaml +687 -687
  5. package/dist/{chunk-YHQNTBBN.js → chunk-2D6LKRHW.js} +2 -2
  6. package/dist/{chunk-CYFU3ARY.js → chunk-342YB6TQ.js} +15 -17
  7. package/dist/chunk-342YB6TQ.js.map +1 -0
  8. package/dist/{chunk-HRMQ2RGY.js → chunk-423MJ6DT.js} +31 -56
  9. package/dist/chunk-423MJ6DT.js.map +1 -0
  10. package/dist/{chunk-NFV4SKH5.js → chunk-4LT6RXMY.js} +4 -4
  11. package/dist/{chunk-IVIK776Y.js → chunk-4SYXPG7L.js} +2 -2
  12. package/dist/{chunk-DUQFF45G.js → chunk-4UTPJXUX.js} +8 -8
  13. package/dist/{chunk-3E2V5YL3.js → chunk-5TMB53BV.js} +3 -3
  14. package/dist/{chunk-NI2RSNWB.js → chunk-7FBM7V3E.js} +10 -22
  15. package/dist/chunk-7FBM7V3E.js.map +1 -0
  16. package/dist/chunk-ACVJVYMC.js +111 -0
  17. package/dist/chunk-ACVJVYMC.js.map +1 -0
  18. package/dist/{chunk-FWQK3HWB.js → chunk-AH7XHAKN.js} +11 -11
  19. package/dist/chunk-AH7XHAKN.js.map +1 -0
  20. package/dist/{chunk-VAHVSQIG.js → chunk-AVVYFEMF.js} +2 -2
  21. package/dist/{chunk-EISBUEBL.js → chunk-BFISETQG.js} +3 -3
  22. package/dist/{chunk-ZBJQXDQN.js → chunk-BK7TANUV.js} +4 -2
  23. package/dist/chunk-BK7TANUV.js.map +1 -0
  24. package/dist/{chunk-VAK5PX72.js → chunk-DV4ALU5I.js} +6 -6
  25. package/dist/{chunk-OEX5JDQD.js → chunk-FHBICUXB.js} +4 -4
  26. package/dist/{chunk-TA6IIQI4.js → chunk-GEDWVX6Y.js} +3 -3
  27. package/dist/chunk-GEDWVX6Y.js.map +1 -0
  28. package/dist/{chunk-M6PGIZNS.js → chunk-H6H3COI5.js} +5 -5
  29. package/dist/{chunk-54ZZCWN4.js → chunk-KC2SIUIA.js} +3 -8
  30. package/dist/chunk-KC2SIUIA.js.map +1 -0
  31. package/dist/{chunk-2XX4TMCI.js → chunk-KXM7KOPE.js} +2 -2
  32. package/dist/{chunk-HKDE4LJW.js → chunk-LJRP4SWY.js} +6 -5
  33. package/dist/chunk-LJRP4SWY.js.map +1 -0
  34. package/dist/{chunk-TBDIR6LY.js → chunk-MNPPGIZQ.js} +5 -5
  35. package/dist/{chunk-3NQJOJZL.js → chunk-NYP5SB2V.js} +2 -2
  36. package/dist/{chunk-UOMMQ5M6.js → chunk-NZYKDVRL.js} +2 -2
  37. package/dist/{chunk-UV6JUGIY.js → chunk-PURJZ72D.js} +2 -2
  38. package/dist/{chunk-ATLRUR3B.js → chunk-R52N7DBG.js} +2 -2
  39. package/dist/{chunk-WSGGJKD5.js → chunk-SILUTTV7.js} +6 -6
  40. package/dist/chunk-SILUTTV7.js.map +1 -0
  41. package/dist/{chunk-IZRVFC2Z.js → chunk-TJAZ7QCF.js} +4 -4
  42. package/dist/{chunk-U5OB5ADP.js → chunk-TTXV55NQ.js} +57 -16
  43. package/dist/chunk-TTXV55NQ.js.map +1 -0
  44. package/dist/{chunk-TY5GELDB.js → chunk-UKTYDNWJ.js} +2 -2
  45. package/dist/{chunk-HRW7BIDE.js → chunk-WS6OQIEN.js} +2 -2
  46. package/dist/{chunk-YJIJTBSX.js → chunk-XJXJZ2MJ.js} +42 -54
  47. package/dist/chunk-XJXJZ2MJ.js.map +1 -0
  48. package/dist/chunk-YLJYAQSG.js +210 -0
  49. package/dist/chunk-YLJYAQSG.js.map +1 -0
  50. package/dist/{chunk-MZB3GGOH.js → chunk-YRVTXSXP.js} +1 -2
  51. package/dist/chunk-YRVTXSXP.js.map +1 -0
  52. package/dist/{chunk-TNFACSWF.js → chunk-ZLHGJSRK.js} +3 -3
  53. package/dist/cli/defaults/agent-mappings.yaml +14 -70
  54. package/dist/commands/build/marketplace.js +3 -3
  55. package/dist/commands/build/plugins.js +5 -5
  56. package/dist/commands/build/stack.js +5 -5
  57. package/dist/commands/compile.js +8 -7
  58. package/dist/commands/compile.js.map +1 -1
  59. package/dist/commands/config/get.js +4 -4
  60. package/dist/commands/config/index.js +5 -5
  61. package/dist/commands/config/path.js +4 -4
  62. package/dist/commands/config/set-project.js +4 -4
  63. package/dist/commands/config/show.js +5 -5
  64. package/dist/commands/config/unset-project.js +4 -4
  65. package/dist/commands/diff.js +8 -5
  66. package/dist/commands/diff.js.map +1 -1
  67. package/dist/commands/doctor.js +8 -7
  68. package/dist/commands/doctor.js.map +1 -1
  69. package/dist/commands/edit.js +33 -30
  70. package/dist/commands/edit.js.map +1 -1
  71. package/dist/commands/eject.js +4 -4
  72. package/dist/commands/import/skill.js +5 -5
  73. package/dist/commands/info.js +7 -6
  74. package/dist/commands/info.js.map +1 -1
  75. package/dist/commands/init.js +40 -32
  76. package/dist/commands/init.js.map +1 -1
  77. package/dist/commands/list.js +6 -5
  78. package/dist/commands/list.js.map +1 -1
  79. package/dist/commands/new/agent.js +5 -5
  80. package/dist/commands/new/skill.js +8 -5
  81. package/dist/commands/new/skill.js.map +1 -1
  82. package/dist/commands/outdated.js +8 -5
  83. package/dist/commands/outdated.js.map +1 -1
  84. package/dist/commands/search.js +7 -7
  85. package/dist/commands/uninstall.js +19 -7
  86. package/dist/commands/uninstall.js.map +1 -1
  87. package/dist/commands/update.js +8 -7
  88. package/dist/commands/update.js.map +1 -1
  89. package/dist/commands/validate.js +5 -5
  90. package/dist/commands/version/bump.js +4 -4
  91. package/dist/commands/version/index.js +4 -4
  92. package/dist/commands/version/set.js +4 -4
  93. package/dist/commands/version/show.js +4 -4
  94. package/dist/components/skill-search/skill-search.js +3 -3
  95. package/dist/components/wizard/category-grid.js +2 -2
  96. package/dist/components/wizard/category-grid.test.js +40 -40
  97. package/dist/components/wizard/category-grid.test.js.map +1 -1
  98. package/dist/components/wizard/checkbox-grid.js +2 -2
  99. package/dist/components/wizard/checkbox-grid.test.js +16 -6
  100. package/dist/components/wizard/checkbox-grid.test.js.map +1 -1
  101. package/dist/components/wizard/domain-selection.js +7 -7
  102. package/dist/components/wizard/help-modal.js +2 -2
  103. package/dist/components/wizard/menu-item.js +2 -2
  104. package/dist/components/wizard/search-modal.js +2 -2
  105. package/dist/components/wizard/search-modal.test.js +2 -2
  106. package/dist/components/wizard/section-progress.js +2 -2
  107. package/dist/components/wizard/section-progress.test.js +2 -2
  108. package/dist/components/wizard/source-grid.js +3 -3
  109. package/dist/components/wizard/source-grid.test.js +3 -3
  110. package/dist/components/wizard/stack-selection.js +9 -9
  111. package/dist/components/wizard/step-agents.js +7 -7
  112. package/dist/components/wizard/step-agents.test.js +24 -19
  113. package/dist/components/wizard/step-agents.test.js.map +1 -1
  114. package/dist/components/wizard/step-build.js +8 -8
  115. package/dist/components/wizard/step-build.test.js +40 -39
  116. package/dist/components/wizard/step-build.test.js.map +1 -1
  117. package/dist/components/wizard/step-confirm.js +3 -3
  118. package/dist/components/wizard/step-confirm.test.js +19 -13
  119. package/dist/components/wizard/step-confirm.test.js.map +1 -1
  120. package/dist/components/wizard/step-refine.js +2 -2
  121. package/dist/components/wizard/step-refine.test.js +2 -2
  122. package/dist/components/wizard/step-settings.js +5 -5
  123. package/dist/components/wizard/step-settings.test.js +8 -8
  124. package/dist/components/wizard/step-sources.js +9 -9
  125. package/dist/components/wizard/step-sources.test.js +13 -13
  126. package/dist/components/wizard/step-sources.test.js.map +1 -1
  127. package/dist/components/wizard/step-stack.js +12 -12
  128. package/dist/components/wizard/step-stack.test.js +19 -21
  129. package/dist/components/wizard/step-stack.test.js.map +1 -1
  130. package/dist/components/wizard/view-title.js +2 -2
  131. package/dist/components/wizard/wizard-layout.js +8 -8
  132. package/dist/components/wizard/wizard-tabs.js +2 -2
  133. package/dist/components/wizard/wizard-tabs.test.js +2 -2
  134. package/dist/components/wizard/wizard.js +25 -25
  135. package/dist/config/skills-matrix.yaml +115 -123
  136. package/dist/config/stacks.yaml +687 -687
  137. package/dist/hooks/init.js +3 -3
  138. package/dist/{source-manager-FEGVYDFZ.js → source-manager-PPABS6BC.js} +4 -4
  139. package/dist/stores/wizard-store.js +5 -5
  140. package/dist/stores/wizard-store.test.js +115 -187
  141. package/dist/stores/wizard-store.test.js.map +1 -1
  142. package/package.json +1 -1
  143. package/src/schemas/metadata.schema.json +41 -1
  144. package/src/schemas/project-config.schema.json +34 -35
  145. package/src/schemas/skills-matrix.schema.json +100 -101
  146. package/src/schemas/stacks.schema.json +34 -35
  147. package/dist/chunk-54ZZCWN4.js.map +0 -1
  148. package/dist/chunk-CYFU3ARY.js.map +0 -1
  149. package/dist/chunk-EXFVAEPY.js +0 -80
  150. package/dist/chunk-EXFVAEPY.js.map +0 -1
  151. package/dist/chunk-FWQK3HWB.js.map +0 -1
  152. package/dist/chunk-HKDE4LJW.js.map +0 -1
  153. package/dist/chunk-HRMQ2RGY.js.map +0 -1
  154. package/dist/chunk-IWNPFIGY.js +0 -110
  155. package/dist/chunk-IWNPFIGY.js.map +0 -1
  156. package/dist/chunk-MZB3GGOH.js.map +0 -1
  157. package/dist/chunk-NI2RSNWB.js.map +0 -1
  158. package/dist/chunk-TA6IIQI4.js.map +0 -1
  159. package/dist/chunk-U5OB5ADP.js.map +0 -1
  160. package/dist/chunk-WSGGJKD5.js.map +0 -1
  161. package/dist/chunk-YJIJTBSX.js.map +0 -1
  162. package/dist/chunk-ZBJQXDQN.js.map +0 -1
  163. /package/dist/{chunk-YHQNTBBN.js.map → chunk-2D6LKRHW.js.map} +0 -0
  164. /package/dist/{chunk-NFV4SKH5.js.map → chunk-4LT6RXMY.js.map} +0 -0
  165. /package/dist/{chunk-IVIK776Y.js.map → chunk-4SYXPG7L.js.map} +0 -0
  166. /package/dist/{chunk-DUQFF45G.js.map → chunk-4UTPJXUX.js.map} +0 -0
  167. /package/dist/{chunk-3E2V5YL3.js.map → chunk-5TMB53BV.js.map} +0 -0
  168. /package/dist/{chunk-VAHVSQIG.js.map → chunk-AVVYFEMF.js.map} +0 -0
  169. /package/dist/{chunk-EISBUEBL.js.map → chunk-BFISETQG.js.map} +0 -0
  170. /package/dist/{chunk-VAK5PX72.js.map → chunk-DV4ALU5I.js.map} +0 -0
  171. /package/dist/{chunk-OEX5JDQD.js.map → chunk-FHBICUXB.js.map} +0 -0
  172. /package/dist/{chunk-M6PGIZNS.js.map → chunk-H6H3COI5.js.map} +0 -0
  173. /package/dist/{chunk-2XX4TMCI.js.map → chunk-KXM7KOPE.js.map} +0 -0
  174. /package/dist/{chunk-TBDIR6LY.js.map → chunk-MNPPGIZQ.js.map} +0 -0
  175. /package/dist/{chunk-3NQJOJZL.js.map → chunk-NYP5SB2V.js.map} +0 -0
  176. /package/dist/{chunk-UOMMQ5M6.js.map → chunk-NZYKDVRL.js.map} +0 -0
  177. /package/dist/{chunk-UV6JUGIY.js.map → chunk-PURJZ72D.js.map} +0 -0
  178. /package/dist/{chunk-ATLRUR3B.js.map → chunk-R52N7DBG.js.map} +0 -0
  179. /package/dist/{chunk-IZRVFC2Z.js.map → chunk-TJAZ7QCF.js.map} +0 -0
  180. /package/dist/{chunk-TY5GELDB.js.map → chunk-UKTYDNWJ.js.map} +0 -0
  181. /package/dist/{chunk-HRW7BIDE.js.map → chunk-WS6OQIEN.js.map} +0 -0
  182. /package/dist/{chunk-TNFACSWF.js.map → chunk-ZLHGJSRK.js.map} +0 -0
  183. /package/dist/{source-manager-FEGVYDFZ.js.map → source-manager-PPABS6BC.js.map} +0 -0
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  CheckboxGrid
4
- } from "../../chunk-IWNPFIGY.js";
5
- import "../../chunk-ZBJQXDQN.js";
4
+ } from "../../chunk-ACVJVYMC.js";
5
+ import "../../chunk-BK7TANUV.js";
6
6
  import "../../chunk-DHET7RCE.js";
7
7
  export {
8
8
  CheckboxGrid
@@ -21,8 +21,8 @@ import {
21
21
  } from "../../chunk-XY3XDVMI.js";
22
22
  import {
23
23
  CheckboxGrid
24
- } from "../../chunk-IWNPFIGY.js";
25
- import "../../chunk-ZBJQXDQN.js";
24
+ } from "../../chunk-ACVJVYMC.js";
25
+ import "../../chunk-BK7TANUV.js";
26
26
  import {
27
27
  init_esm_shims
28
28
  } from "../../chunk-DHET7RCE.js";
@@ -100,6 +100,14 @@ describe("CheckboxGrid component", () => {
100
100
  const output = lastFrame();
101
101
  globalExpect(output).toContain("Select at least one");
102
102
  });
103
+ it("should show empty message as dimmed informational text", () => {
104
+ const { lastFrame, unmount } = renderCheckboxGrid({
105
+ emptyMessage: "No items selected"
106
+ });
107
+ cleanup = unmount;
108
+ const output = lastFrame();
109
+ globalExpect(output).toContain("No items selected");
110
+ });
103
111
  it("should show selected summary when items are selected", () => {
104
112
  const { lastFrame, unmount } = renderCheckboxGrid({
105
113
  selectedIds: ["alpha", "beta"]
@@ -118,11 +126,11 @@ describe("CheckboxGrid component", () => {
118
126
  const output = lastFrame();
119
127
  globalExpect(output).toContain("Continue with 1 item(s)");
120
128
  });
121
- it("should not show continue option when nothing selected", () => {
129
+ it("should always show continue option even when nothing selected", () => {
122
130
  const { lastFrame, unmount } = renderCheckboxGrid();
123
131
  cleanup = unmount;
124
132
  const output = lastFrame();
125
- globalExpect(output).not.toContain("Continue with");
133
+ globalExpect(output).toContain("Continue with 0 item(s)");
126
134
  });
127
135
  it("should show navigation hints", () => {
128
136
  const { lastFrame, unmount } = renderCheckboxGrid();
@@ -200,7 +208,7 @@ describe("CheckboxGrid component", () => {
200
208
  await delay(INPUT_DELAY_MS);
201
209
  globalExpect(onContinue).toHaveBeenCalled();
202
210
  });
203
- it("should not call onContinue with ENTER when nothing selected", async () => {
211
+ it("should call onContinue with ENTER even when nothing selected", async () => {
204
212
  const onContinue = vi.fn();
205
213
  const { stdin, unmount } = renderCheckboxGrid({
206
214
  onContinue,
@@ -210,7 +218,7 @@ describe("CheckboxGrid component", () => {
210
218
  await delay(RENDER_DELAY_MS);
211
219
  stdin.write(ENTER);
212
220
  await delay(INPUT_DELAY_MS);
213
- globalExpect(onContinue).not.toHaveBeenCalled();
221
+ globalExpect(onContinue).toHaveBeenCalled();
214
222
  });
215
223
  it("should call onBack with ESC", async () => {
216
224
  const onBack = vi.fn();
@@ -232,6 +240,8 @@ describe("CheckboxGrid component", () => {
232
240
  await delay(INPUT_DELAY_MS);
233
241
  stdin.write(ARROW_DOWN);
234
242
  await delay(INPUT_DELAY_MS);
243
+ stdin.write(ARROW_DOWN);
244
+ await delay(INPUT_DELAY_MS);
235
245
  stdin.write(SPACE);
236
246
  await delay(INPUT_DELAY_MS);
237
247
  globalExpect(onToggle).toHaveBeenCalledWith("alpha");
@@ -1 +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
+ {"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 empty message as dimmed informational text\", () => {\n const { lastFrame, unmount } = renderCheckboxGrid({\n emptyMessage: \"No items selected\",\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"No items selected\");\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 always show continue option even when nothing selected\", () => {\n const { lastFrame, unmount } = renderCheckboxGrid();\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Continue with 0 item(s)\");\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 call onContinue with ENTER even 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).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 + continue item (always present)\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 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,14 +1,14 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  DomainSelection
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";
4
+ } from "../../chunk-KC2SIUIA.js";
5
+ import "../../chunk-ACVJVYMC.js";
6
+ import "../../chunk-423MJ6DT.js";
7
+ import "../../chunk-SILUTTV7.js";
8
+ import "../../chunk-TTXV55NQ.js";
9
9
  import "../../chunk-T4EXUIBY.js";
10
- import "../../chunk-YJIJTBSX.js";
11
- import "../../chunk-ZBJQXDQN.js";
10
+ import "../../chunk-XJXJZ2MJ.js";
11
+ import "../../chunk-BK7TANUV.js";
12
12
  import "../../chunk-DHET7RCE.js";
13
13
  export {
14
14
  DomainSelection
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  HelpModal
4
- } from "../../chunk-TY5GELDB.js";
5
- import "../../chunk-ZBJQXDQN.js";
4
+ } from "../../chunk-UKTYDNWJ.js";
5
+ import "../../chunk-BK7TANUV.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-HRW7BIDE.js";
5
- import "../../chunk-ZBJQXDQN.js";
4
+ } from "../../chunk-WS6OQIEN.js";
5
+ import "../../chunk-BK7TANUV.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-3NQJOJZL.js";
4
+ } from "../../chunk-NYP5SB2V.js";
5
5
  import "../../chunk-KUV24B5M.js";
6
- import "../../chunk-ZBJQXDQN.js";
6
+ import "../../chunk-BK7TANUV.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-3NQJOJZL.js";
23
+ } from "../../chunk-NYP5SB2V.js";
24
24
  import "../../chunk-KUV24B5M.js";
25
- import "../../chunk-ZBJQXDQN.js";
25
+ import "../../chunk-BK7TANUV.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-UOMMQ5M6.js";
5
- import "../../chunk-ZBJQXDQN.js";
4
+ } from "../../chunk-NZYKDVRL.js";
5
+ import "../../chunk-BK7TANUV.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-UOMMQ5M6.js";
4
+ } from "../../chunk-NZYKDVRL.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-ZBJQXDQN.js";
14
+ import "../../chunk-BK7TANUV.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-EISBUEBL.js";
4
+ } from "../../chunk-BFISETQG.js";
5
5
  import "../../chunk-7SOPVGDV.js";
6
- import "../../chunk-3NQJOJZL.js";
6
+ import "../../chunk-NYP5SB2V.js";
7
7
  import "../../chunk-KUV24B5M.js";
8
8
  import "../../chunk-GG4BSB6S.js";
9
- import "../../chunk-ZBJQXDQN.js";
9
+ import "../../chunk-BK7TANUV.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-EISBUEBL.js";
26
+ } from "../../chunk-BFISETQG.js";
27
27
  import "../../chunk-7SOPVGDV.js";
28
- import "../../chunk-3NQJOJZL.js";
28
+ import "../../chunk-NYP5SB2V.js";
29
29
  import "../../chunk-KUV24B5M.js";
30
30
  import "../../chunk-GG4BSB6S.js";
31
- import "../../chunk-ZBJQXDQN.js";
31
+ import "../../chunk-BK7TANUV.js";
32
32
  import {
33
33
  init_esm_shims
34
34
  } from "../../chunk-DHET7RCE.js";
@@ -1,16 +1,16 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  StackSelection
4
- } from "../../chunk-VAK5PX72.js";
5
- import "../../chunk-MZB3GGOH.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";
4
+ } from "../../chunk-DV4ALU5I.js";
5
+ import "../../chunk-YRVTXSXP.js";
6
+ import "../../chunk-KXM7KOPE.js";
7
+ import "../../chunk-WS6OQIEN.js";
8
+ import "../../chunk-423MJ6DT.js";
9
+ import "../../chunk-SILUTTV7.js";
10
+ import "../../chunk-TTXV55NQ.js";
11
11
  import "../../chunk-T4EXUIBY.js";
12
- import "../../chunk-YJIJTBSX.js";
13
- import "../../chunk-ZBJQXDQN.js";
12
+ import "../../chunk-XJXJZ2MJ.js";
13
+ import "../../chunk-BK7TANUV.js";
14
14
  import "../../chunk-DHET7RCE.js";
15
15
  export {
16
16
  StackSelection
@@ -1,14 +1,14 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
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";
4
+ } from "../../chunk-YLJYAQSG.js";
5
+ import "../../chunk-K77I4XGL.js";
6
+ import "../../chunk-423MJ6DT.js";
7
+ import "../../chunk-SILUTTV7.js";
8
+ import "../../chunk-TTXV55NQ.js";
9
9
  import "../../chunk-T4EXUIBY.js";
10
- import "../../chunk-YJIJTBSX.js";
11
- import "../../chunk-ZBJQXDQN.js";
10
+ import "../../chunk-XJXJZ2MJ.js";
11
+ import "../../chunk-BK7TANUV.js";
12
12
  import "../../chunk-DHET7RCE.js";
13
13
  export {
14
14
  StepAgents
@@ -20,16 +20,16 @@ import {
20
20
  } from "../../chunk-XY3XDVMI.js";
21
21
  import {
22
22
  StepAgents
23
- } from "../../chunk-EXFVAEPY.js";
24
- import "../../chunk-IWNPFIGY.js";
23
+ } from "../../chunk-YLJYAQSG.js";
24
+ import "../../chunk-K77I4XGL.js";
25
25
  import {
26
26
  useWizardStore
27
- } from "../../chunk-HRMQ2RGY.js";
28
- import "../../chunk-WSGGJKD5.js";
29
- import "../../chunk-U5OB5ADP.js";
27
+ } from "../../chunk-423MJ6DT.js";
28
+ import "../../chunk-SILUTTV7.js";
29
+ import "../../chunk-TTXV55NQ.js";
30
30
  import "../../chunk-T4EXUIBY.js";
31
- import "../../chunk-YJIJTBSX.js";
32
- import "../../chunk-ZBJQXDQN.js";
31
+ import "../../chunk-XJXJZ2MJ.js";
32
+ import "../../chunk-BK7TANUV.js";
33
33
  import {
34
34
  init_esm_shims
35
35
  } from "../../chunk-DHET7RCE.js";
@@ -85,22 +85,21 @@ describe("StepAgents component", () => {
85
85
  globalExpect(output).toContain("Backend routes, database, middleware");
86
86
  globalExpect(output).toContain("CLI commands, interactive prompts");
87
87
  });
88
- it("should show empty message when no agents selected", () => {
88
+ it("should render group headers", () => {
89
89
  const { lastFrame, unmount } = render(/* @__PURE__ */ jsx(StepAgents, {}));
90
90
  cleanup = unmount;
91
91
  const output = lastFrame();
92
- globalExpect(output).toContain("Please select at least one agent");
92
+ globalExpect(output).toContain("Web");
93
+ globalExpect(output).toContain("API");
94
+ globalExpect(output).toContain("CLI");
95
+ globalExpect(output).toContain("Meta");
93
96
  });
94
- it("should show selected agents when preselected", () => {
95
- const store = useWizardStore.getState();
96
- store.toggleAgent("web-developer");
97
- store.toggleAgent("api-developer");
97
+ it("should show continue arrow", () => {
98
98
  const { lastFrame, unmount } = render(/* @__PURE__ */ jsx(StepAgents, {}));
99
99
  cleanup = unmount;
100
100
  const output = lastFrame();
101
- globalExpect(output).toContain("Selected:");
102
- globalExpect(output).toContain("web-developer");
103
- globalExpect(output).toContain("api-developer");
101
+ globalExpect(output).toContain("\u2192");
102
+ globalExpect(output).toContain("Continue");
104
103
  });
105
104
  it("should show continue option with agent count when agents selected", () => {
106
105
  const store = useWizardStore.getState();
@@ -112,6 +111,12 @@ describe("StepAgents component", () => {
112
111
  const output = lastFrame();
113
112
  globalExpect(output).toContain("Continue with 3 agent(s)");
114
113
  });
114
+ it("should show 'Continue without agents' when no agents selected", () => {
115
+ const { lastFrame, unmount } = render(/* @__PURE__ */ jsx(StepAgents, {}));
116
+ cleanup = unmount;
117
+ const output = lastFrame();
118
+ globalExpect(output).toContain("Continue without agents");
119
+ });
115
120
  });
116
121
  describe("keyboard interaction", () => {
117
122
  it("should toggle agent on SPACE", async () => {
@@ -132,7 +137,7 @@ describe("StepAgents component", () => {
132
137
  stdin.write(SPACE);
133
138
  await delay(INPUT_DELAY_MS);
134
139
  const store = useWizardStore.getState();
135
- globalExpect(store.selectedAgents).toContain("api-developer");
140
+ globalExpect(store.selectedAgents).toContain("web-reviewer");
136
141
  });
137
142
  it("should navigate to confirm on ENTER when agents selected", async () => {
138
143
  const store = useWizardStore.getState();
@@ -146,7 +151,7 @@ describe("StepAgents component", () => {
146
151
  const updatedStore = useWizardStore.getState();
147
152
  globalExpect(updatedStore.step).toBe("confirm");
148
153
  });
149
- it("should not navigate on ENTER when no agents selected", async () => {
154
+ it("should navigate to confirm on ENTER even with no agents selected", async () => {
150
155
  const store = useWizardStore.getState();
151
156
  store.setStep("agents");
152
157
  const { stdin, unmount } = render(/* @__PURE__ */ jsx(StepAgents, {}));
@@ -155,7 +160,7 @@ describe("StepAgents component", () => {
155
160
  stdin.write(ENTER);
156
161
  await delay(INPUT_DELAY_MS);
157
162
  const updatedStore = useWizardStore.getState();
158
- globalExpect(updatedStore.step).toBe("agents");
163
+ globalExpect(updatedStore.step).toBe("confirm");
159
164
  });
160
165
  it("should go back on ESC", async () => {
161
166
  const store = useWizardStore.getState();
@@ -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\";\n\nconst EXPECTED_AGENT_COUNT = 18;\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 and subtitle\", () => {\n const { lastFrame, unmount } = render(<StepAgents />);\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Select agents to compile:\");\n expect(output).toContain(\"Toggle agents on/off, then continue\");\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 expect(output).toContain(\"CLI Migrator\");\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 show empty message when no agents selected\", () => {\n const { lastFrame, unmount } = render(<StepAgents />);\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Please select at least one agent\");\n });\n\n it(\"should show selected agents when preselected\", () => {\n const store = useWizardStore.getState();\n store.toggleAgent(\"web-developer\");\n store.toggleAgent(\"api-developer\");\n\n const { lastFrame, unmount } = render(<StepAgents />);\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Selected:\");\n expect(output).toContain(\"web-developer\");\n expect(output).toContain(\"api-developer\");\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\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 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 stdin.write(ARROW_DOWN);\n await delay(INPUT_DELAY_MS);\n stdin.write(SPACE);\n await delay(INPUT_DELAY_MS);\n\n const store = useWizardStore.getState();\n expect(store.selectedAgents).toContain(\"api-developer\");\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 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 not navigate on ENTER when 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 stdin.write(ENTER);\n await delay(INPUT_DELAY_MS);\n\n const updatedStore = useWizardStore.getState();\n expect(updatedStore.step).toBe(\"agents\");\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 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 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 {\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\";\n\nconst EXPECTED_AGENT_COUNT = 18;\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 and subtitle\", () => {\n const { lastFrame, unmount } = render(<StepAgents />);\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Select agents to compile:\");\n expect(output).toContain(\"Toggle agents on/off, then continue\");\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 expect(output).toContain(\"CLI Migrator\");\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 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 stdin.write(ARROW_DOWN);\n await delay(INPUT_DELAY_MS);\n 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 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 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 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 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,17 +1,17 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  StepBuild
4
- } from "../../chunk-NI2RSNWB.js";
4
+ } from "../../chunk-7FBM7V3E.js";
5
+ import "../../chunk-YRVTXSXP.js";
6
+ import "../../chunk-KXM7KOPE.js";
5
7
  import "../../chunk-K77I4XGL.js";
6
- import "../../chunk-MZB3GGOH.js";
7
- import "../../chunk-2XX4TMCI.js";
8
- import "../../chunk-TA6IIQI4.js";
8
+ import "../../chunk-GEDWVX6Y.js";
9
9
  import "../../chunk-GG4BSB6S.js";
10
- import "../../chunk-WSGGJKD5.js";
11
- import "../../chunk-U5OB5ADP.js";
10
+ import "../../chunk-SILUTTV7.js";
11
+ import "../../chunk-TTXV55NQ.js";
12
12
  import "../../chunk-T4EXUIBY.js";
13
- import "../../chunk-YJIJTBSX.js";
14
- import "../../chunk-ZBJQXDQN.js";
13
+ import "../../chunk-XJXJZ2MJ.js";
14
+ import "../../chunk-BK7TANUV.js";
15
15
  import "../../chunk-DHET7RCE.js";
16
16
  export {
17
17
  StepBuild