@agents-inc/cli 0.41.1 → 0.42.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 (168) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/README.md +1 -1
  3. package/dist/{chunk-ZLHGJSRK.js → chunk-2TWELY5M.js} +3 -3
  4. package/dist/{chunk-4UTPJXUX.js → chunk-33D24DAF.js} +22 -54
  5. package/dist/chunk-33D24DAF.js.map +1 -0
  6. package/dist/{chunk-UKTYDNWJ.js → chunk-44QCEK7E.js} +5 -5
  7. package/dist/chunk-44QCEK7E.js.map +1 -0
  8. package/dist/{chunk-NYP5SB2V.js → chunk-52SI5XJH.js} +2 -2
  9. package/dist/{chunk-GEDWVX6Y.js → chunk-53K3URKF.js} +8 -8
  10. package/dist/chunk-53K3URKF.js.map +1 -0
  11. package/dist/{chunk-2D6LKRHW.js → chunk-ALWLM5MC.js} +2 -2
  12. package/dist/{chunk-AVVYFEMF.js → chunk-AQANPOLS.js} +2 -2
  13. package/dist/{chunk-5TMB53BV.js → chunk-BKW34TKI.js} +7 -4
  14. package/dist/chunk-BKW34TKI.js.map +1 -0
  15. package/dist/{chunk-BFISETQG.js → chunk-EFZN22TO.js} +3 -3
  16. package/dist/{chunk-7FBM7V3E.js → chunk-EPJ2GJNJ.js} +10 -10
  17. package/dist/chunk-EPJ2GJNJ.js.map +1 -0
  18. package/dist/{chunk-SILUTTV7.js → chunk-FDY6SGSA.js} +2 -2
  19. package/dist/{chunk-342YB6TQ.js → chunk-FF4Z7MHY.js} +20 -13
  20. package/dist/chunk-FF4Z7MHY.js.map +1 -0
  21. package/dist/{chunk-ACVJVYMC.js → chunk-GCN7GGWE.js} +15 -27
  22. package/dist/chunk-GCN7GGWE.js.map +1 -0
  23. package/dist/{chunk-FHBICUXB.js → chunk-GIZ6DENW.js} +4 -4
  24. package/dist/{chunk-KC2SIUIA.js → chunk-GVRZY5KI.js} +4 -5
  25. package/dist/chunk-GVRZY5KI.js.map +1 -0
  26. package/dist/{chunk-LJRP4SWY.js → chunk-HMGWGWFT.js} +2 -2
  27. package/dist/{chunk-H6H3COI5.js → chunk-IUYU2TP6.js} +5 -5
  28. package/dist/{chunk-AH7XHAKN.js → chunk-J73KIP6Z.js} +2 -2
  29. package/dist/chunk-J73KIP6Z.js.map +1 -0
  30. package/dist/{chunk-TJAZ7QCF.js → chunk-KA253GGY.js} +4 -4
  31. package/dist/{chunk-4SYXPG7L.js → chunk-MHET2RG2.js} +8 -3
  32. package/dist/chunk-MHET2RG2.js.map +1 -0
  33. package/dist/{chunk-DV4ALU5I.js → chunk-MI4NWOWD.js} +17 -24
  34. package/dist/chunk-MI4NWOWD.js.map +1 -0
  35. package/dist/chunk-MMD26LKJ.js +20 -0
  36. package/dist/chunk-MMD26LKJ.js.map +1 -0
  37. package/dist/{chunk-MNPPGIZQ.js → chunk-ORJPGZVD.js} +5 -5
  38. package/dist/{chunk-R52N7DBG.js → chunk-PEAPABFI.js} +4 -4
  39. package/dist/chunk-PEAPABFI.js.map +1 -0
  40. package/dist/{chunk-BK7TANUV.js → chunk-PP7NDFFE.js} +4 -3
  41. package/dist/{chunk-BK7TANUV.js.map → chunk-PP7NDFFE.js.map} +1 -1
  42. package/dist/{chunk-TTXV55NQ.js → chunk-SYHRJG5G.js} +6 -3
  43. package/dist/chunk-SYHRJG5G.js.map +1 -0
  44. package/dist/{chunk-NZYKDVRL.js → chunk-UVVNWF43.js} +2 -2
  45. package/dist/{chunk-NZYKDVRL.js.map → chunk-UVVNWF43.js.map} +1 -1
  46. package/dist/{chunk-XJXJZ2MJ.js → chunk-UXNHU7Y7.js} +5 -1
  47. package/dist/chunk-UXNHU7Y7.js.map +1 -0
  48. package/dist/{chunk-YLJYAQSG.js → chunk-VHGIQN5O.js} +7 -5
  49. package/dist/chunk-VHGIQN5O.js.map +1 -0
  50. package/dist/{chunk-4LT6RXMY.js → chunk-WMAALRQI.js} +4 -4
  51. package/dist/{chunk-PURJZ72D.js → chunk-X34RGEFX.js} +2 -2
  52. package/dist/{chunk-423MJ6DT.js → chunk-XRA4LHTJ.js} +5 -5
  53. package/dist/chunk-ZHJEZ7AU.js +40 -0
  54. package/dist/chunk-ZHJEZ7AU.js.map +1 -0
  55. package/dist/commands/build/marketplace.js +3 -3
  56. package/dist/commands/build/plugins.js +5 -5
  57. package/dist/commands/build/stack.js +5 -5
  58. package/dist/commands/compile.js +6 -6
  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 +4 -4
  66. package/dist/commands/doctor.js +4 -4
  67. package/dist/commands/edit.js +37 -30
  68. package/dist/commands/edit.js.map +1 -1
  69. package/dist/commands/eject.js +33 -13
  70. package/dist/commands/eject.js.map +1 -1
  71. package/dist/commands/import/skill.js +5 -5
  72. package/dist/commands/info.js +5 -5
  73. package/dist/commands/init.js +27 -27
  74. package/dist/commands/list.js +4 -4
  75. package/dist/commands/new/agent.js +5 -5
  76. package/dist/commands/new/skill.js +4 -4
  77. package/dist/commands/outdated.js +4 -4
  78. package/dist/commands/search.js +7 -7
  79. package/dist/commands/uninstall.js +6 -6
  80. package/dist/commands/update.js +6 -6
  81. package/dist/commands/validate.js +5 -5
  82. package/dist/commands/version/bump.js +4 -4
  83. package/dist/commands/version/index.js +4 -4
  84. package/dist/commands/version/set.js +4 -4
  85. package/dist/commands/version/show.js +4 -4
  86. package/dist/components/skill-search/skill-search.js +3 -3
  87. package/dist/components/wizard/category-grid.js +2 -2
  88. package/dist/components/wizard/category-grid.test.js +2 -2
  89. package/dist/components/wizard/checkbox-grid.js +3 -2
  90. package/dist/components/wizard/checkbox-grid.test.js +16 -22
  91. package/dist/components/wizard/checkbox-grid.test.js.map +1 -1
  92. package/dist/components/wizard/domain-selection.js +8 -7
  93. package/dist/components/wizard/help-modal.js +2 -2
  94. package/dist/components/wizard/menu-item.js +25 -4
  95. package/dist/components/wizard/menu-item.js.map +1 -1
  96. package/dist/components/wizard/search-modal.js +2 -2
  97. package/dist/components/wizard/search-modal.test.js +2 -2
  98. package/dist/components/wizard/section-progress.js +2 -2
  99. package/dist/components/wizard/section-progress.test.js +2 -2
  100. package/dist/components/wizard/selection-card.js +10 -0
  101. package/dist/components/wizard/source-grid.js +3 -3
  102. package/dist/components/wizard/source-grid.test.js +3 -3
  103. package/dist/components/wizard/stack-selection.js +8 -8
  104. package/dist/components/wizard/step-agents.js +7 -6
  105. package/dist/components/wizard/step-agents.test.js +8 -8
  106. package/dist/components/wizard/step-agents.test.js.map +1 -1
  107. package/dist/components/wizard/step-build.js +7 -7
  108. package/dist/components/wizard/step-build.test.js +18 -18
  109. package/dist/components/wizard/step-build.test.js.map +1 -1
  110. package/dist/components/wizard/step-confirm.js +3 -2
  111. package/dist/components/wizard/step-confirm.test.js +7 -6
  112. package/dist/components/wizard/step-confirm.test.js.map +1 -1
  113. package/dist/components/wizard/step-refine.js +2 -2
  114. package/dist/components/wizard/step-refine.test.js +2 -2
  115. package/dist/components/wizard/step-settings.js +5 -5
  116. package/dist/components/wizard/step-settings.test.js +8 -8
  117. package/dist/components/wizard/step-sources.js +10 -9
  118. package/dist/components/wizard/step-sources.test.js +14 -12
  119. package/dist/components/wizard/step-sources.test.js.map +1 -1
  120. package/dist/components/wizard/step-stack.js +11 -11
  121. package/dist/components/wizard/step-stack.test.js +15 -16
  122. package/dist/components/wizard/step-stack.test.js.map +1 -1
  123. package/dist/components/wizard/view-title.js +2 -2
  124. package/dist/components/wizard/wizard-layout.js +8 -8
  125. package/dist/components/wizard/wizard-tabs.js +2 -2
  126. package/dist/components/wizard/wizard-tabs.test.js +2 -2
  127. package/dist/components/wizard/wizard.js +24 -24
  128. package/dist/hooks/init.js +3 -3
  129. package/dist/{source-manager-PPABS6BC.js → source-manager-ABK5COKX.js} +4 -4
  130. package/dist/source-manager-ABK5COKX.js.map +1 -0
  131. package/dist/stores/wizard-store.js +5 -5
  132. package/dist/stores/wizard-store.test.js +6 -6
  133. package/package.json +1 -1
  134. package/src/schemas/project-config.schema.json +7 -0
  135. package/dist/chunk-342YB6TQ.js.map +0 -1
  136. package/dist/chunk-4SYXPG7L.js.map +0 -1
  137. package/dist/chunk-4UTPJXUX.js.map +0 -1
  138. package/dist/chunk-5TMB53BV.js.map +0 -1
  139. package/dist/chunk-7FBM7V3E.js.map +0 -1
  140. package/dist/chunk-ACVJVYMC.js.map +0 -1
  141. package/dist/chunk-AH7XHAKN.js.map +0 -1
  142. package/dist/chunk-DV4ALU5I.js.map +0 -1
  143. package/dist/chunk-GEDWVX6Y.js.map +0 -1
  144. package/dist/chunk-KC2SIUIA.js.map +0 -1
  145. package/dist/chunk-KXM7KOPE.js +0 -31
  146. package/dist/chunk-KXM7KOPE.js.map +0 -1
  147. package/dist/chunk-R52N7DBG.js.map +0 -1
  148. package/dist/chunk-TTXV55NQ.js.map +0 -1
  149. package/dist/chunk-UKTYDNWJ.js.map +0 -1
  150. package/dist/chunk-WS6OQIEN.js +0 -32
  151. package/dist/chunk-WS6OQIEN.js.map +0 -1
  152. package/dist/chunk-XJXJZ2MJ.js.map +0 -1
  153. package/dist/chunk-YLJYAQSG.js.map +0 -1
  154. /package/dist/{chunk-ZLHGJSRK.js.map → chunk-2TWELY5M.js.map} +0 -0
  155. /package/dist/{chunk-NYP5SB2V.js.map → chunk-52SI5XJH.js.map} +0 -0
  156. /package/dist/{chunk-2D6LKRHW.js.map → chunk-ALWLM5MC.js.map} +0 -0
  157. /package/dist/{chunk-AVVYFEMF.js.map → chunk-AQANPOLS.js.map} +0 -0
  158. /package/dist/{chunk-BFISETQG.js.map → chunk-EFZN22TO.js.map} +0 -0
  159. /package/dist/{chunk-SILUTTV7.js.map → chunk-FDY6SGSA.js.map} +0 -0
  160. /package/dist/{chunk-FHBICUXB.js.map → chunk-GIZ6DENW.js.map} +0 -0
  161. /package/dist/{chunk-LJRP4SWY.js.map → chunk-HMGWGWFT.js.map} +0 -0
  162. /package/dist/{chunk-H6H3COI5.js.map → chunk-IUYU2TP6.js.map} +0 -0
  163. /package/dist/{chunk-TJAZ7QCF.js.map → chunk-KA253GGY.js.map} +0 -0
  164. /package/dist/{chunk-MNPPGIZQ.js.map → chunk-ORJPGZVD.js.map} +0 -0
  165. /package/dist/{chunk-4LT6RXMY.js.map → chunk-WMAALRQI.js.map} +0 -0
  166. /package/dist/{chunk-PURJZ72D.js.map → chunk-X34RGEFX.js.map} +0 -0
  167. /package/dist/{chunk-423MJ6DT.js.map → chunk-XRA4LHTJ.js.map} +0 -0
  168. /package/dist/{source-manager-PPABS6BC.js.map → components/wizard/selection-card.js.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/cli/components/wizard/step-confirm.test.tsx"],"sourcesContent":["import { render } from \"ink-testing-library\";\nimport { afterEach, beforeEach, describe, expect, it, vi } from \"vitest\";\nimport { StepConfirm } from \"./step-confirm\";\nimport { useWizardStore } from \"../../stores/wizard-store\";\nimport { ENTER, ESCAPE, RENDER_DELAY_MS, delay } from \"../../lib/__tests__/test-constants\";\n\ndescribe(\"StepConfirm component\", () => {\n let cleanup: (() => void) | undefined;\n\n beforeEach(() => {\n useWizardStore.getState().reset();\n });\n\n afterEach(() => {\n cleanup?.();\n cleanup = undefined;\n });\n\n describe(\"stack path\", () => {\n it(\"should render stack name in title\", () => {\n const onComplete = vi.fn();\n const onBack = vi.fn();\n\n const { lastFrame, unmount } = render(\n <StepConfirm\n onComplete={onComplete}\n stackName=\"nextjs-fullstack\"\n technologyCount={12}\n skillCount={12}\n installMode=\"plugin\"\n onBack={onBack}\n />,\n );\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Ready to install nextjs-fullstack\");\n });\n\n it(\"should show technology count\", () => {\n const onComplete = vi.fn();\n const onBack = vi.fn();\n\n const { lastFrame, unmount } = render(\n <StepConfirm\n onComplete={onComplete}\n stackName=\"nextjs-fullstack\"\n technologyCount={12}\n skillCount={12}\n installMode=\"plugin\"\n onBack={onBack}\n />,\n );\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Technologies:\");\n expect(output).toContain(\"12\");\n });\n\n it(\"should show skill count with verified label\", () => {\n const onComplete = vi.fn();\n const onBack = vi.fn();\n\n const { lastFrame, unmount } = render(\n <StepConfirm\n onComplete={onComplete}\n stackName=\"nextjs-fullstack\"\n technologyCount={12}\n skillCount={12}\n installMode=\"plugin\"\n onBack={onBack}\n />,\n );\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Skills:\");\n expect(output).toContain(\"(all verified)\");\n });\n\n it(\"should show install mode as Plugin\", () => {\n const onComplete = vi.fn();\n const onBack = vi.fn();\n\n const { lastFrame, unmount } = render(\n <StepConfirm\n onComplete={onComplete}\n stackName=\"nextjs-fullstack\"\n technologyCount={12}\n skillCount={12}\n installMode=\"plugin\"\n onBack={onBack}\n />,\n );\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Install mode:\");\n expect(output).toContain(\"Plugin\");\n });\n\n it(\"should show install mode as Local\", () => {\n const onComplete = vi.fn();\n const onBack = vi.fn();\n\n const { lastFrame, unmount } = render(\n <StepConfirm\n onComplete={onComplete}\n stackName=\"nextjs-fullstack\"\n technologyCount={12}\n skillCount={12}\n installMode=\"local\"\n onBack={onBack}\n />,\n );\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Install mode:\");\n expect(output).toContain(\"Local\");\n });\n\n it(\"should render confirm step content\", () => {\n const onComplete = vi.fn();\n const onBack = vi.fn();\n\n const { lastFrame, unmount } = render(\n <StepConfirm\n onComplete={onComplete}\n stackName=\"nextjs-fullstack\"\n technologyCount={12}\n skillCount={12}\n installMode=\"plugin\"\n onBack={onBack}\n />,\n );\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Ready to install\");\n });\n });\n\n describe(\"scratch path\", () => {\n it(\"should render custom stack title with domain names\", () => {\n const onComplete = vi.fn();\n const onBack = vi.fn();\n\n const { lastFrame, unmount } = render(\n <StepConfirm\n onComplete={onComplete}\n selectedDomains={[\"web\", \"api\"]}\n domainSelections={{\n web: {\n \"web-framework\": [\"web-framework-react\"],\n \"web-styling\": [\"web-styling-scss-modules\"],\n },\n api: { \"api-api\": [\"api-framework-hono\"] },\n }}\n technologyCount={3}\n skillCount={3}\n installMode=\"local\"\n onBack={onBack}\n />,\n );\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Ready to install your custom stack\");\n expect(output).toContain(\"Web + API\");\n });\n\n it(\"should show domain breakdown with technologies\", () => {\n const onComplete = vi.fn();\n const onBack = vi.fn();\n\n const { lastFrame, unmount } = render(\n <StepConfirm\n onComplete={onComplete}\n selectedDomains={[\"web\", \"api\"]}\n domainSelections={{\n web: {\n \"web-framework\": [\"web-framework-react\"],\n \"web-styling\": [\"web-styling-scss-modules\"],\n },\n api: { \"api-api\": [\"api-framework-hono\"] },\n }}\n technologyCount={3}\n skillCount={3}\n installMode=\"local\"\n onBack={onBack}\n />,\n );\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Web:\");\n expect(output).toContain(\"react\");\n expect(output).toContain(\"scss-modules\");\n expect(output).toContain(\"API:\");\n expect(output).toContain(\"hono\");\n });\n\n it(\"should handle single domain without plus sign\", () => {\n const onComplete = vi.fn();\n const onBack = vi.fn();\n\n const { lastFrame, unmount } = render(\n <StepConfirm\n onComplete={onComplete}\n selectedDomains={[\"web\"]}\n domainSelections={{\n web: { \"web-framework\": [\"web-framework-react\"] },\n }}\n technologyCount={1}\n skillCount={1}\n installMode=\"local\"\n onBack={onBack}\n />,\n );\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"(Web)\");\n expect(output).not.toContain(\"+\");\n });\n\n it(\"should skip domains with no selections\", () => {\n const onComplete = vi.fn();\n const onBack = vi.fn();\n\n const { lastFrame, unmount } = render(\n <StepConfirm\n onComplete={onComplete}\n selectedDomains={[\"web\", \"api\"]}\n domainSelections={{\n web: { \"web-framework\": [\"web-framework-react\"] },\n api: {}, // Empty selections\n }}\n technologyCount={1}\n skillCount={1}\n installMode=\"local\"\n onBack={onBack}\n />,\n );\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Web:\");\n expect(output).toContain(\"react\");\n // API section should not appear since no technologies selected\n const lines = output?.split(\"\\n\") || [];\n const apiLine = lines.find((line) => line.includes(\"API:\") && line.includes(\"hono\"));\n expect(apiLine).toBeUndefined();\n });\n });\n\n describe(\"keyboard navigation\", () => {\n it(\"should call onComplete when Enter is pressed\", async () => {\n const onComplete = vi.fn();\n const onBack = vi.fn();\n\n const { stdin, unmount } = render(\n <StepConfirm\n onComplete={onComplete}\n stackName=\"nextjs-fullstack\"\n technologyCount={12}\n skillCount={12}\n installMode=\"plugin\"\n onBack={onBack}\n />,\n );\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(ENTER);\n await delay(RENDER_DELAY_MS);\n\n expect(onComplete).toHaveBeenCalled();\n });\n\n it(\"should call onBack when Escape is pressed\", async () => {\n const onComplete = vi.fn();\n const onBack = vi.fn();\n\n const { stdin, unmount } = render(\n <StepConfirm\n onComplete={onComplete}\n stackName=\"nextjs-fullstack\"\n technologyCount={12}\n skillCount={12}\n installMode=\"plugin\"\n onBack={onBack}\n />,\n );\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(ESCAPE);\n await delay(RENDER_DELAY_MS);\n\n expect(onBack).toHaveBeenCalled();\n expect(onComplete).not.toHaveBeenCalled();\n });\n\n it(\"should not call onBack when Escape is pressed but onBack is not provided\", async () => {\n const onComplete = vi.fn();\n\n const { stdin, unmount } = render(\n <StepConfirm\n onComplete={onComplete}\n stackName=\"nextjs-fullstack\"\n technologyCount={12}\n skillCount={12}\n installMode=\"plugin\"\n // No onBack provided\n />,\n );\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(ESCAPE);\n await delay(RENDER_DELAY_MS);\n\n // Should not crash and onComplete should not be called\n expect(onComplete).not.toHaveBeenCalled();\n });\n });\n\n describe(\"default props\", () => {\n it(\"should render custom stack title when no stack name provided\", () => {\n const onComplete = vi.fn();\n\n const { lastFrame, unmount } = render(<StepConfirm onComplete={onComplete} />);\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Ready to install your custom stack\");\n });\n\n it(\"should not show stats when not provided\", () => {\n const onComplete = vi.fn();\n\n const { lastFrame, unmount } = render(<StepConfirm onComplete={onComplete} />);\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).not.toContain(\"Technologies:\");\n expect(output).not.toContain(\"Skills:\");\n expect(output).not.toContain(\"Install mode:\");\n });\n });\n});\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/cli/components/wizard/step-confirm.test.tsx"],"sourcesContent":["import { render } from \"ink-testing-library\";\nimport { afterEach, beforeEach, describe, expect, it, vi } from \"vitest\";\nimport { StepConfirm } from \"./step-confirm\";\nimport { useWizardStore } from \"../../stores/wizard-store\";\nimport { ENTER, ESCAPE, RENDER_DELAY_MS, delay } from \"../../lib/__tests__/test-constants\";\n\ndescribe(\"StepConfirm component\", () => {\n let cleanup: (() => void) | undefined;\n\n beforeEach(() => {\n useWizardStore.getState().reset();\n });\n\n afterEach(() => {\n cleanup?.();\n cleanup = undefined;\n });\n\n describe(\"stack path\", () => {\n it(\"should render stack name in title\", () => {\n const onComplete = vi.fn();\n const onBack = vi.fn();\n\n const { lastFrame, unmount } = render(\n <StepConfirm\n onComplete={onComplete}\n stackName=\"nextjs-fullstack\"\n technologyCount={12}\n skillCount={12}\n installMode=\"plugin\"\n onBack={onBack}\n />,\n );\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Ready to install nextjs-fullstack\");\n });\n\n it(\"should show technology count\", () => {\n const onComplete = vi.fn();\n const onBack = vi.fn();\n\n const { lastFrame, unmount } = render(\n <StepConfirm\n onComplete={onComplete}\n stackName=\"nextjs-fullstack\"\n technologyCount={12}\n skillCount={12}\n installMode=\"plugin\"\n onBack={onBack}\n />,\n );\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Technologies:\");\n expect(output).toContain(\"12\");\n });\n\n it(\"should show skill count with verified label\", () => {\n const onComplete = vi.fn();\n const onBack = vi.fn();\n\n const { lastFrame, unmount } = render(\n <StepConfirm\n onComplete={onComplete}\n stackName=\"nextjs-fullstack\"\n technologyCount={12}\n skillCount={12}\n installMode=\"plugin\"\n onBack={onBack}\n />,\n );\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Skills:\");\n expect(output).toContain(\"(all verified)\");\n });\n\n it(\"should show install mode as Plugin\", () => {\n const onComplete = vi.fn();\n const onBack = vi.fn();\n\n const { lastFrame, unmount } = render(\n <StepConfirm\n onComplete={onComplete}\n stackName=\"nextjs-fullstack\"\n technologyCount={12}\n skillCount={12}\n installMode=\"plugin\"\n onBack={onBack}\n />,\n );\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Install mode:\");\n expect(output).toContain(\"Plugin\");\n });\n\n it(\"should show install mode as Local\", () => {\n const onComplete = vi.fn();\n const onBack = vi.fn();\n\n const { lastFrame, unmount } = render(\n <StepConfirm\n onComplete={onComplete}\n stackName=\"nextjs-fullstack\"\n technologyCount={12}\n skillCount={12}\n installMode=\"local\"\n onBack={onBack}\n />,\n );\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Install mode:\");\n expect(output).toContain(\"Local\");\n });\n\n it(\"should render confirm step content\", () => {\n const onComplete = vi.fn();\n const onBack = vi.fn();\n\n const { lastFrame, unmount } = render(\n <StepConfirm\n onComplete={onComplete}\n stackName=\"nextjs-fullstack\"\n technologyCount={12}\n skillCount={12}\n installMode=\"plugin\"\n onBack={onBack}\n />,\n );\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Ready to install\");\n });\n });\n\n describe(\"scratch path\", () => {\n it(\"should render custom stack title with domain names\", () => {\n const onComplete = vi.fn();\n const onBack = vi.fn();\n\n const { lastFrame, unmount } = render(\n <StepConfirm\n onComplete={onComplete}\n selectedDomains={[\"web\", \"api\"]}\n domainSelections={{\n web: {\n \"web-framework\": [\"web-framework-react\"],\n \"web-styling\": [\"web-styling-scss-modules\"],\n },\n api: { \"api-api\": [\"api-framework-hono\"] },\n }}\n technologyCount={3}\n skillCount={3}\n installMode=\"local\"\n onBack={onBack}\n />,\n );\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Ready to install your custom stack\");\n expect(output).toContain(\"Web + API\");\n });\n\n it(\"should show domain breakdown with technologies\", () => {\n const onComplete = vi.fn();\n const onBack = vi.fn();\n\n const { lastFrame, unmount } = render(\n <StepConfirm\n onComplete={onComplete}\n selectedDomains={[\"web\", \"api\"]}\n domainSelections={{\n web: {\n \"web-framework\": [\"web-framework-react\"],\n \"web-styling\": [\"web-styling-scss-modules\"],\n },\n api: { \"api-api\": [\"api-framework-hono\"] },\n }}\n technologyCount={3}\n skillCount={3}\n installMode=\"local\"\n onBack={onBack}\n />,\n );\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Web:\");\n expect(output).toContain(\"react\");\n expect(output).toContain(\"scss-modules\");\n expect(output).toContain(\"API:\");\n expect(output).toContain(\"hono\");\n });\n\n it(\"should handle single domain without plus sign\", () => {\n const onComplete = vi.fn();\n const onBack = vi.fn();\n\n const { lastFrame, unmount } = render(\n <StepConfirm\n onComplete={onComplete}\n selectedDomains={[\"web\"]}\n domainSelections={{\n web: { \"web-framework\": [\"web-framework-react\"] },\n }}\n technologyCount={1}\n skillCount={1}\n installMode=\"local\"\n onBack={onBack}\n />,\n );\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"(Web)\");\n expect(output).not.toContain(\"+\");\n });\n\n it(\"should skip domains with no selections\", () => {\n const onComplete = vi.fn();\n const onBack = vi.fn();\n\n const { lastFrame, unmount } = render(\n <StepConfirm\n onComplete={onComplete}\n selectedDomains={[\"web\", \"api\"]}\n domainSelections={{\n web: { \"web-framework\": [\"web-framework-react\"] },\n api: {}, // Empty selections\n }}\n technologyCount={1}\n skillCount={1}\n installMode=\"local\"\n onBack={onBack}\n />,\n );\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Web:\");\n expect(output).toContain(\"react\");\n // API section should not appear since no technologies selected\n const lines = output?.split(\"\\n\") || [];\n const apiLine = lines.find((line) => line.includes(\"API:\") && line.includes(\"hono\"));\n expect(apiLine).toBeUndefined();\n });\n });\n\n describe(\"keyboard navigation\", () => {\n it(\"should call onComplete when Enter is pressed\", async () => {\n const onComplete = vi.fn();\n const onBack = vi.fn();\n\n const { stdin, unmount } = render(\n <StepConfirm\n onComplete={onComplete}\n stackName=\"nextjs-fullstack\"\n technologyCount={12}\n skillCount={12}\n installMode=\"plugin\"\n onBack={onBack}\n />,\n );\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(ENTER);\n await delay(RENDER_DELAY_MS);\n\n expect(onComplete).toHaveBeenCalled();\n });\n\n it(\"should call onBack when Escape is pressed\", async () => {\n const onComplete = vi.fn();\n const onBack = vi.fn();\n\n const { stdin, unmount } = render(\n <StepConfirm\n onComplete={onComplete}\n stackName=\"nextjs-fullstack\"\n technologyCount={12}\n skillCount={12}\n installMode=\"plugin\"\n onBack={onBack}\n />,\n );\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(ESCAPE);\n await delay(RENDER_DELAY_MS);\n\n expect(onBack).toHaveBeenCalled();\n expect(onComplete).not.toHaveBeenCalled();\n });\n\n it(\"should not call onBack when Escape is pressed but onBack is not provided\", async () => {\n const onComplete = vi.fn();\n\n const { stdin, unmount } = render(\n <StepConfirm\n onComplete={onComplete}\n stackName=\"nextjs-fullstack\"\n technologyCount={12}\n skillCount={12}\n installMode=\"plugin\"\n // No onBack provided\n />,\n );\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(ESCAPE);\n await delay(RENDER_DELAY_MS);\n\n // Should not crash and onComplete should not be called\n expect(onComplete).not.toHaveBeenCalled();\n });\n });\n\n describe(\"default props\", () => {\n it(\"should render custom stack title when no stack name provided\", () => {\n const onComplete = vi.fn();\n\n const { lastFrame, unmount } = render(<StepConfirm onComplete={onComplete} />);\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Ready to install your custom stack\");\n });\n\n it(\"should not show stats when not provided\", () => {\n const onComplete = vi.fn();\n\n const { lastFrame, unmount } = render(<StepConfirm onComplete={onComplete} />);\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).not.toContain(\"Technologies:\");\n expect(output).not.toContain(\"Skills:\");\n expect(output).not.toContain(\"Install mode:\");\n });\n });\n});\n"],"mappings":"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","names":[]}
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  StepRefine
4
- } from "../../chunk-R52N7DBG.js";
5
- import "../../chunk-BK7TANUV.js";
4
+ } from "../../chunk-PEAPABFI.js";
5
+ import "../../chunk-PP7NDFFE.js";
6
6
  import "../../chunk-DHET7RCE.js";
7
7
  export {
8
8
  StepRefine
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  StepRefine
4
- } from "../../chunk-R52N7DBG.js";
4
+ } from "../../chunk-PEAPABFI.js";
5
5
  import {
6
6
  ARROW_DOWN,
7
7
  ARROW_UP,
@@ -23,7 +23,7 @@ import {
23
23
  } from "../../chunk-XY3XDVMI.js";
24
24
  import {
25
25
  DEFAULT_BRANDING
26
- } from "../../chunk-BK7TANUV.js";
26
+ } from "../../chunk-PP7NDFFE.js";
27
27
  import {
28
28
  init_esm_shims
29
29
  } from "../../chunk-DHET7RCE.js";
@@ -1,15 +1,15 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  StepSettings
4
- } from "../../chunk-H6H3COI5.js";
4
+ } from "../../chunk-IUYU2TP6.js";
5
5
  import "../../chunk-7SOPVGDV.js";
6
- import "../../chunk-KXM7KOPE.js";
6
+ import "../../chunk-MMD26LKJ.js";
7
7
  import "../../chunk-KUV24B5M.js";
8
8
  import "../../chunk-U3IGFMCY.js";
9
- import "../../chunk-TTXV55NQ.js";
9
+ import "../../chunk-SYHRJG5G.js";
10
10
  import "../../chunk-T4EXUIBY.js";
11
- import "../../chunk-XJXJZ2MJ.js";
12
- import "../../chunk-BK7TANUV.js";
11
+ import "../../chunk-UXNHU7Y7.js";
12
+ import "../../chunk-PP7NDFFE.js";
13
13
  import "../../chunk-DHET7RCE.js";
14
14
  export {
15
15
  StepSettings
@@ -19,15 +19,15 @@ import {
19
19
  } from "../../chunk-XY3XDVMI.js";
20
20
  import {
21
21
  StepSettings
22
- } from "../../chunk-H6H3COI5.js";
22
+ } from "../../chunk-IUYU2TP6.js";
23
23
  import "../../chunk-7SOPVGDV.js";
24
- import "../../chunk-KXM7KOPE.js";
24
+ import "../../chunk-MMD26LKJ.js";
25
25
  import "../../chunk-KUV24B5M.js";
26
26
  import "../../chunk-U3IGFMCY.js";
27
- import "../../chunk-TTXV55NQ.js";
27
+ import "../../chunk-SYHRJG5G.js";
28
28
  import "../../chunk-T4EXUIBY.js";
29
- import "../../chunk-XJXJZ2MJ.js";
30
- import "../../chunk-BK7TANUV.js";
29
+ import "../../chunk-UXNHU7Y7.js";
30
+ import "../../chunk-PP7NDFFE.js";
31
31
  import {
32
32
  init_esm_shims
33
33
  } from "../../chunk-DHET7RCE.js";
@@ -55,7 +55,7 @@ describe("StepSettings component", () => {
55
55
  let cleanup;
56
56
  beforeEach(async () => {
57
57
  vi.resetAllMocks();
58
- const { getSourceSummary } = await import("../../source-manager-PPABS6BC.js");
58
+ const { getSourceSummary } = await import("../../source-manager-ABK5COKX.js");
59
59
  vi.mocked(getSourceSummary).mockResolvedValue({
60
60
  sources: [
61
61
  { name: "public", url: "github:agents-inc/skills", enabled: true },
@@ -216,7 +216,7 @@ describe("StepSettings component", () => {
216
216
  });
217
217
  describe("edge cases", () => {
218
218
  it("should handle empty sources list gracefully", async () => {
219
- const { getSourceSummary } = await import("../../source-manager-PPABS6BC.js");
219
+ const { getSourceSummary } = await import("../../source-manager-ABK5COKX.js");
220
220
  vi.mocked(getSourceSummary).mockResolvedValue({
221
221
  sources: [{ name: "public", url: "github:agents-inc/skills", enabled: true }],
222
222
  localSkillCount: 0,
@@ -230,7 +230,7 @@ describe("StepSettings component", () => {
230
230
  globalExpect(output).toContain("0");
231
231
  });
232
232
  it("should handle getSourceSummary failure gracefully", async () => {
233
- const { getSourceSummary } = await import("../../source-manager-PPABS6BC.js");
233
+ const { getSourceSummary } = await import("../../source-manager-ABK5COKX.js");
234
234
  vi.mocked(getSourceSummary).mockRejectedValue(new Error("Config read failed"));
235
235
  const { lastFrame, unmount } = renderStepSettings();
236
236
  cleanup = unmount;
@@ -1,20 +1,21 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  StepSources
4
- } from "../../chunk-4UTPJXUX.js";
5
- import "../../chunk-BFISETQG.js";
4
+ } from "../../chunk-33D24DAF.js";
5
+ import "../../chunk-EFZN22TO.js";
6
6
  import "../../chunk-7SOPVGDV.js";
7
- import "../../chunk-KXM7KOPE.js";
7
+ import "../../chunk-ZHJEZ7AU.js";
8
8
  import "../../chunk-K77I4XGL.js";
9
- import "../../chunk-NYP5SB2V.js";
9
+ import "../../chunk-MMD26LKJ.js";
10
+ import "../../chunk-52SI5XJH.js";
10
11
  import "../../chunk-KUV24B5M.js";
11
12
  import "../../chunk-GG4BSB6S.js";
12
- import "../../chunk-423MJ6DT.js";
13
- import "../../chunk-SILUTTV7.js";
14
- import "../../chunk-TTXV55NQ.js";
13
+ import "../../chunk-XRA4LHTJ.js";
14
+ import "../../chunk-FDY6SGSA.js";
15
+ import "../../chunk-SYHRJG5G.js";
15
16
  import "../../chunk-T4EXUIBY.js";
16
- import "../../chunk-XJXJZ2MJ.js";
17
- import "../../chunk-BK7TANUV.js";
17
+ import "../../chunk-UXNHU7Y7.js";
18
+ import "../../chunk-PP7NDFFE.js";
18
19
  import "../../chunk-DHET7RCE.js";
19
20
  export {
20
21
  StepSources
@@ -14,7 +14,7 @@ import {
14
14
  import {
15
15
  createMockMatrix,
16
16
  getTestSkill
17
- } from "../../chunk-AH7XHAKN.js";
17
+ } from "../../chunk-J73KIP6Z.js";
18
18
  import {
19
19
  afterEach,
20
20
  beforeEach,
@@ -25,24 +25,26 @@ import {
25
25
  } from "../../chunk-XY3XDVMI.js";
26
26
  import {
27
27
  StepSources
28
- } from "../../chunk-4UTPJXUX.js";
29
- import "../../chunk-BFISETQG.js";
28
+ } from "../../chunk-33D24DAF.js";
29
+ import "../../chunk-EFZN22TO.js";
30
30
  import "../../chunk-7SOPVGDV.js";
31
- import "../../chunk-KXM7KOPE.js";
31
+ import "../../chunk-ZHJEZ7AU.js";
32
32
  import "../../chunk-K77I4XGL.js";
33
- import "../../chunk-NYP5SB2V.js";
33
+ import "../../chunk-MMD26LKJ.js";
34
+ import "../../chunk-52SI5XJH.js";
34
35
  import "../../chunk-KUV24B5M.js";
35
36
  import "../../chunk-GG4BSB6S.js";
36
37
  import {
37
38
  useWizardStore
38
- } from "../../chunk-423MJ6DT.js";
39
- import "../../chunk-SILUTTV7.js";
40
- import "../../chunk-TTXV55NQ.js";
39
+ } from "../../chunk-XRA4LHTJ.js";
40
+ import "../../chunk-FDY6SGSA.js";
41
+ import "../../chunk-SYHRJG5G.js";
41
42
  import "../../chunk-T4EXUIBY.js";
42
- import "../../chunk-XJXJZ2MJ.js";
43
+ import "../../chunk-UXNHU7Y7.js";
43
44
  import {
44
- DEFAULT_BRANDING
45
- } from "../../chunk-BK7TANUV.js";
45
+ DEFAULT_BRANDING,
46
+ UI_SYMBOLS
47
+ } from "../../chunk-PP7NDFFE.js";
46
48
  import {
47
49
  init_esm_shims
48
50
  } from "../../chunk-DHET7RCE.js";
@@ -119,7 +121,7 @@ describe("StepSources component", () => {
119
121
  const { lastFrame, unmount } = renderStepSources();
120
122
  cleanup = unmount;
121
123
  const output = lastFrame();
122
- globalExpect(output).toContain(">");
124
+ globalExpect(output).toContain(UI_SYMBOLS.CHEVRON);
123
125
  globalExpect(output).toContain("Use all recommended");
124
126
  });
125
127
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/cli/components/wizard/step-sources.test.tsx"],"sourcesContent":["import { render } from \"ink-testing-library\";\nimport { describe, expect, it, afterEach, beforeEach, vi } from \"vitest\";\nimport { StepSources, type StepSourcesProps } from \"./step-sources\";\nimport { useWizardStore } from \"../../stores/wizard-store\";\nimport type { SkillId } from \"../../types\";\nimport {\n ENTER,\n ESCAPE,\n ARROW_UP,\n ARROW_DOWN,\n RENDER_DELAY_MS,\n INPUT_DELAY_MS,\n delay,\n} from \"../../lib/__tests__/test-constants\";\nimport { createMockMatrix } from \"../../lib/__tests__/helpers\";\nimport { getTestSkill } from \"../../lib/__tests__/test-fixtures\";\nimport { DEFAULT_BRANDING } from \"../../consts\";\n\nconst reactSkill = getTestSkill(\"react\");\nconst zustandSkill = getTestSkill(\"zustand\");\n\nconst mockMatrix = createMockMatrix({\n [reactSkill.id]: reactSkill,\n [zustandSkill.id]: zustandSkill,\n});\n\nconst defaultProps: StepSourcesProps = {\n matrix: mockMatrix,\n onContinue: vi.fn(),\n onBack: vi.fn(),\n};\n\nconst renderStepSources = (props: Partial<StepSourcesProps> = {}) => {\n return render(<StepSources {...defaultProps} {...props} />);\n};\n\ndescribe(\"StepSources component\", () => {\n let cleanup: (() => void) | undefined;\n\n beforeEach(() => {\n useWizardStore.getState().reset();\n // Set up some selected technologies so the step has data to display\n useWizardStore.setState({\n domainSelections: {\n web: {\n \"web-framework\": [\"web-framework-react\" as SkillId],\n \"web-client-state\": [\"web-state-zustand\" as SkillId],\n },\n },\n });\n });\n\n afterEach(() => {\n cleanup?.();\n cleanup = undefined;\n });\n\n describe(\"choice view rendering\", () => {\n it(\"should render technology count\", () => {\n const { lastFrame, unmount } = renderStepSources();\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"2\");\n expect(output).toContain(\"technologies\");\n });\n\n it(\"should render 'Use all recommended' option\", () => {\n const { lastFrame, unmount } = renderStepSources();\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Use all recommended skills (verified)\");\n });\n\n it(\"should render 'Customize skill sources' option\", () => {\n const { lastFrame, unmount } = renderStepSources();\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Customize skill sources\");\n });\n\n it(\"should render verification description\", () => {\n const { lastFrame, unmount } = renderStepSources();\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"fastest option\");\n expect(output).toContain(\"verified\");\n expect(output).toContain(DEFAULT_BRANDING.NAME);\n });\n\n it(\"should render customize description\", () => {\n const { lastFrame, unmount } = renderStepSources();\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Choose alternative skills for each technology\");\n });\n\n it(\"should show recommended as default selected\", () => {\n const { lastFrame, unmount } = renderStepSources();\n cleanup = unmount;\n\n const output = lastFrame();\n // The \">\" indicator should be on the recommended option\n expect(output).toContain(\">\");\n expect(output).toContain(\"Use all recommended\");\n });\n });\n\n describe(\"choice view keyboard navigation\", () => {\n it(\"should toggle options with arrow up\", async () => {\n const { lastFrame, stdin, unmount } = renderStepSources();\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n // Initially recommended is selected\n let output = lastFrame();\n expect(output).toContain(\"Use all recommended\");\n\n // Press up to switch to customize\n stdin.write(ARROW_UP);\n await delay(INPUT_DELAY_MS);\n\n output = lastFrame();\n // Both options should still be present\n expect(output).toContain(\"Customize skill sources\");\n });\n\n it(\"should toggle options with arrow down\", async () => {\n const { stdin, unmount } = renderStepSources();\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n stdin.write(ARROW_DOWN);\n await delay(INPUT_DELAY_MS);\n\n // Should have toggled\n });\n\n it(\"should call onContinue when Enter pressed on 'Use all recommended'\", async () => {\n const onContinue = vi.fn();\n const { stdin, unmount } = renderStepSources({ onContinue });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n stdin.write(ENTER);\n await delay(INPUT_DELAY_MS);\n\n expect(onContinue).toHaveBeenCalledTimes(1);\n });\n\n it(\"should call onBack when Escape pressed\", async () => {\n const onBack = vi.fn();\n const { stdin, unmount } = renderStepSources({ 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).toHaveBeenCalledTimes(1);\n });\n\n it(\"should switch to customize view when Enter pressed on 'Customize'\", async () => {\n const { lastFrame, stdin, unmount } = renderStepSources();\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n // Move to customize option\n stdin.write(ARROW_DOWN);\n await delay(INPUT_DELAY_MS);\n\n // Press Enter to switch to customize view\n stdin.write(ENTER);\n await delay(INPUT_DELAY_MS);\n\n const output = lastFrame();\n // Should show the grid view with skill names\n expect(output).toContain(\"Customize skill sources\");\n // Should show the selected technologies\n expect(output).toContain(\"react\");\n expect(output).toContain(\"zustand\");\n });\n });\n\n describe(\"customize view\", () => {\n it(\"should show source grid with selected technologies\", async () => {\n const { lastFrame, stdin, unmount } = renderStepSources();\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n // Switch to customize view\n stdin.write(ARROW_DOWN);\n await delay(INPUT_DELAY_MS);\n stdin.write(ENTER);\n await delay(INPUT_DELAY_MS);\n\n const output = lastFrame();\n expect(output).toContain(\"react\");\n expect(output).toContain(\"zustand\");\n expect(output).toContain(\"Agents Inc\");\n });\n\n it(\"should call onContinue when Enter pressed in customize view\", async () => {\n const onContinue = vi.fn();\n const { stdin, unmount } = renderStepSources({ onContinue });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n // Switch to customize view\n stdin.write(ARROW_DOWN);\n await delay(INPUT_DELAY_MS);\n stdin.write(ENTER);\n await delay(INPUT_DELAY_MS);\n\n // Press Enter to continue\n stdin.write(ENTER);\n await delay(INPUT_DELAY_MS);\n\n expect(onContinue).toHaveBeenCalledTimes(1);\n });\n\n it(\"should go back to choice view when Escape pressed in customize view\", async () => {\n const onBack = vi.fn();\n const { lastFrame, stdin, unmount } = renderStepSources({ onBack });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n // Switch to customize view\n stdin.write(ARROW_DOWN);\n await delay(INPUT_DELAY_MS);\n stdin.write(ENTER);\n await delay(INPUT_DELAY_MS);\n\n // Verify we're in customize view\n expect(lastFrame()).toContain(\"Customize skill sources\");\n\n // Press Escape to go back to choice view\n stdin.write(ESCAPE);\n await delay(INPUT_DELAY_MS);\n\n const output = lastFrame();\n // Should be back at choice view with both options\n expect(output).toContain(\"Use all recommended skills (verified)\");\n expect(output).toContain(\"Customize skill sources\");\n\n // onBack should NOT have been called (escape returns to choice, not to build)\n expect(onBack).not.toHaveBeenCalled();\n });\n\n it(\"should show ViewTitle in customize view\", async () => {\n const { lastFrame, stdin, unmount } = renderStepSources();\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n // Switch to customize view\n stdin.write(ARROW_DOWN);\n await delay(INPUT_DELAY_MS);\n stdin.write(ENTER);\n await delay(INPUT_DELAY_MS);\n\n const output = lastFrame();\n expect(output).toContain(\"Customize skill sources\");\n });\n });\n\n describe(\"edge cases\", () => {\n it(\"should handle zero technologies\", () => {\n useWizardStore.setState({\n domainSelections: {},\n });\n\n const { lastFrame, unmount } = renderStepSources();\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"0\");\n expect(output).toContain(\"technologies\");\n });\n\n it(\"should handle single technology\", () => {\n useWizardStore.setState({\n domainSelections: {\n web: {\n \"web-framework\": [\"web-framework-react\" as SkillId],\n },\n },\n });\n\n const { lastFrame, unmount } = renderStepSources();\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"1\");\n expect(output).toContain(\"technologies\");\n });\n\n it(\"should handle multiple Enter presses on recommended\", async () => {\n const onContinue = vi.fn();\n const { stdin, unmount } = renderStepSources({ onContinue });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n stdin.write(ENTER);\n await delay(INPUT_DELAY_MS);\n stdin.write(ENTER);\n await delay(INPUT_DELAY_MS);\n\n expect(onContinue).toHaveBeenCalledTimes(2);\n });\n });\n\n describe(\"store integration\", () => {\n it(\"should set customizeSources when switching to customize view\", async () => {\n const { stdin, unmount } = renderStepSources();\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n // Switch to customize\n stdin.write(ARROW_DOWN);\n await delay(INPUT_DELAY_MS);\n stdin.write(ENTER);\n await delay(INPUT_DELAY_MS);\n\n expect(useWizardStore.getState().customizeSources).toBe(true);\n });\n\n it(\"should reset customizeSources when escaping from customize view\", async () => {\n const { stdin, unmount } = renderStepSources();\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n // Switch to customize\n stdin.write(ARROW_DOWN);\n await delay(INPUT_DELAY_MS);\n stdin.write(ENTER);\n await delay(INPUT_DELAY_MS);\n\n expect(useWizardStore.getState().customizeSources).toBe(true);\n\n // Escape back\n stdin.write(ESCAPE);\n await delay(INPUT_DELAY_MS);\n\n expect(useWizardStore.getState().customizeSources).toBe(false);\n });\n });\n});\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/cli/components/wizard/step-sources.test.tsx"],"sourcesContent":["import { render } from \"ink-testing-library\";\nimport { describe, expect, it, afterEach, beforeEach, vi } from \"vitest\";\nimport { StepSources, type StepSourcesProps } from \"./step-sources\";\nimport { useWizardStore } from \"../../stores/wizard-store\";\nimport type { SkillId } from \"../../types\";\nimport {\n ENTER,\n ESCAPE,\n ARROW_UP,\n ARROW_DOWN,\n RENDER_DELAY_MS,\n INPUT_DELAY_MS,\n delay,\n} from \"../../lib/__tests__/test-constants\";\nimport { createMockMatrix } from \"../../lib/__tests__/helpers\";\nimport { getTestSkill } from \"../../lib/__tests__/test-fixtures\";\nimport { DEFAULT_BRANDING, UI_SYMBOLS } from \"../../consts\";\n\nconst reactSkill = getTestSkill(\"react\");\nconst zustandSkill = getTestSkill(\"zustand\");\n\nconst mockMatrix = createMockMatrix({\n [reactSkill.id]: reactSkill,\n [zustandSkill.id]: zustandSkill,\n});\n\nconst defaultProps: StepSourcesProps = {\n matrix: mockMatrix,\n onContinue: vi.fn(),\n onBack: vi.fn(),\n};\n\nconst renderStepSources = (props: Partial<StepSourcesProps> = {}) => {\n return render(<StepSources {...defaultProps} {...props} />);\n};\n\ndescribe(\"StepSources component\", () => {\n let cleanup: (() => void) | undefined;\n\n beforeEach(() => {\n useWizardStore.getState().reset();\n // Set up some selected technologies so the step has data to display\n useWizardStore.setState({\n domainSelections: {\n web: {\n \"web-framework\": [\"web-framework-react\" as SkillId],\n \"web-client-state\": [\"web-state-zustand\" as SkillId],\n },\n },\n });\n });\n\n afterEach(() => {\n cleanup?.();\n cleanup = undefined;\n });\n\n describe(\"choice view rendering\", () => {\n it(\"should render technology count\", () => {\n const { lastFrame, unmount } = renderStepSources();\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"2\");\n expect(output).toContain(\"technologies\");\n });\n\n it(\"should render 'Use all recommended' option\", () => {\n const { lastFrame, unmount } = renderStepSources();\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Use all recommended skills (verified)\");\n });\n\n it(\"should render 'Customize skill sources' option\", () => {\n const { lastFrame, unmount } = renderStepSources();\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Customize skill sources\");\n });\n\n it(\"should render verification description\", () => {\n const { lastFrame, unmount } = renderStepSources();\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"fastest option\");\n expect(output).toContain(\"verified\");\n expect(output).toContain(DEFAULT_BRANDING.NAME);\n });\n\n it(\"should render customize description\", () => {\n const { lastFrame, unmount } = renderStepSources();\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Choose alternative skills for each technology\");\n });\n\n it(\"should show recommended as default selected\", () => {\n const { lastFrame, unmount } = renderStepSources();\n cleanup = unmount;\n\n const output = lastFrame();\n // The chevron indicator should be on the recommended option\n expect(output).toContain(UI_SYMBOLS.CHEVRON);\n expect(output).toContain(\"Use all recommended\");\n });\n });\n\n describe(\"choice view keyboard navigation\", () => {\n it(\"should toggle options with arrow up\", async () => {\n const { lastFrame, stdin, unmount } = renderStepSources();\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n // Initially recommended is selected\n let output = lastFrame();\n expect(output).toContain(\"Use all recommended\");\n\n // Press up to switch to customize\n stdin.write(ARROW_UP);\n await delay(INPUT_DELAY_MS);\n\n output = lastFrame();\n // Both options should still be present\n expect(output).toContain(\"Customize skill sources\");\n });\n\n it(\"should toggle options with arrow down\", async () => {\n const { stdin, unmount } = renderStepSources();\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n stdin.write(ARROW_DOWN);\n await delay(INPUT_DELAY_MS);\n\n // Should have toggled\n });\n\n it(\"should call onContinue when Enter pressed on 'Use all recommended'\", async () => {\n const onContinue = vi.fn();\n const { stdin, unmount } = renderStepSources({ onContinue });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n stdin.write(ENTER);\n await delay(INPUT_DELAY_MS);\n\n expect(onContinue).toHaveBeenCalledTimes(1);\n });\n\n it(\"should call onBack when Escape pressed\", async () => {\n const onBack = vi.fn();\n const { stdin, unmount } = renderStepSources({ 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).toHaveBeenCalledTimes(1);\n });\n\n it(\"should switch to customize view when Enter pressed on 'Customize'\", async () => {\n const { lastFrame, stdin, unmount } = renderStepSources();\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n // Move to customize option\n stdin.write(ARROW_DOWN);\n await delay(INPUT_DELAY_MS);\n\n // Press Enter to switch to customize view\n stdin.write(ENTER);\n await delay(INPUT_DELAY_MS);\n\n const output = lastFrame();\n // Should show the grid view with skill names\n expect(output).toContain(\"Customize skill sources\");\n // Should show the selected technologies\n expect(output).toContain(\"react\");\n expect(output).toContain(\"zustand\");\n });\n });\n\n describe(\"customize view\", () => {\n it(\"should show source grid with selected technologies\", async () => {\n const { lastFrame, stdin, unmount } = renderStepSources();\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n // Switch to customize view\n stdin.write(ARROW_DOWN);\n await delay(INPUT_DELAY_MS);\n stdin.write(ENTER);\n await delay(INPUT_DELAY_MS);\n\n const output = lastFrame();\n expect(output).toContain(\"react\");\n expect(output).toContain(\"zustand\");\n expect(output).toContain(\"Agents Inc\");\n });\n\n it(\"should call onContinue when Enter pressed in customize view\", async () => {\n const onContinue = vi.fn();\n const { stdin, unmount } = renderStepSources({ onContinue });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n // Switch to customize view\n stdin.write(ARROW_DOWN);\n await delay(INPUT_DELAY_MS);\n stdin.write(ENTER);\n await delay(INPUT_DELAY_MS);\n\n // Press Enter to continue\n stdin.write(ENTER);\n await delay(INPUT_DELAY_MS);\n\n expect(onContinue).toHaveBeenCalledTimes(1);\n });\n\n it(\"should go back to choice view when Escape pressed in customize view\", async () => {\n const onBack = vi.fn();\n const { lastFrame, stdin, unmount } = renderStepSources({ onBack });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n // Switch to customize view\n stdin.write(ARROW_DOWN);\n await delay(INPUT_DELAY_MS);\n stdin.write(ENTER);\n await delay(INPUT_DELAY_MS);\n\n // Verify we're in customize view\n expect(lastFrame()).toContain(\"Customize skill sources\");\n\n // Press Escape to go back to choice view\n stdin.write(ESCAPE);\n await delay(INPUT_DELAY_MS);\n\n const output = lastFrame();\n // Should be back at choice view with both options\n expect(output).toContain(\"Use all recommended skills (verified)\");\n expect(output).toContain(\"Customize skill sources\");\n\n // onBack should NOT have been called (escape returns to choice, not to build)\n expect(onBack).not.toHaveBeenCalled();\n });\n\n it(\"should show ViewTitle in customize view\", async () => {\n const { lastFrame, stdin, unmount } = renderStepSources();\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n // Switch to customize view\n stdin.write(ARROW_DOWN);\n await delay(INPUT_DELAY_MS);\n stdin.write(ENTER);\n await delay(INPUT_DELAY_MS);\n\n const output = lastFrame();\n expect(output).toContain(\"Customize skill sources\");\n });\n });\n\n describe(\"edge cases\", () => {\n it(\"should handle zero technologies\", () => {\n useWizardStore.setState({\n domainSelections: {},\n });\n\n const { lastFrame, unmount } = renderStepSources();\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"0\");\n expect(output).toContain(\"technologies\");\n });\n\n it(\"should handle single technology\", () => {\n useWizardStore.setState({\n domainSelections: {\n web: {\n \"web-framework\": [\"web-framework-react\" as SkillId],\n },\n },\n });\n\n const { lastFrame, unmount } = renderStepSources();\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"1\");\n expect(output).toContain(\"technologies\");\n });\n\n it(\"should handle multiple Enter presses on recommended\", async () => {\n const onContinue = vi.fn();\n const { stdin, unmount } = renderStepSources({ onContinue });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n stdin.write(ENTER);\n await delay(INPUT_DELAY_MS);\n stdin.write(ENTER);\n await delay(INPUT_DELAY_MS);\n\n expect(onContinue).toHaveBeenCalledTimes(2);\n });\n });\n\n describe(\"store integration\", () => {\n it(\"should set customizeSources when switching to customize view\", async () => {\n const { stdin, unmount } = renderStepSources();\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n // Switch to customize\n stdin.write(ARROW_DOWN);\n await delay(INPUT_DELAY_MS);\n stdin.write(ENTER);\n await delay(INPUT_DELAY_MS);\n\n expect(useWizardStore.getState().customizeSources).toBe(true);\n });\n\n it(\"should reset customizeSources when escaping from customize view\", async () => {\n const { stdin, unmount } = renderStepSources();\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n // Switch to customize\n stdin.write(ARROW_DOWN);\n await delay(INPUT_DELAY_MS);\n stdin.write(ENTER);\n await delay(INPUT_DELAY_MS);\n\n expect(useWizardStore.getState().customizeSources).toBe(true);\n\n // Escape back\n stdin.write(ESCAPE);\n await delay(INPUT_DELAY_MS);\n\n expect(useWizardStore.getState().customizeSources).toBe(false);\n });\n });\n});\n"],"mappings":"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","names":[]}
@@ -1,19 +1,19 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  StepStack
4
- } from "../../chunk-4LT6RXMY.js";
5
- import "../../chunk-DV4ALU5I.js";
4
+ } from "../../chunk-WMAALRQI.js";
5
+ import "../../chunk-MI4NWOWD.js";
6
+ import "../../chunk-ZHJEZ7AU.js";
6
7
  import "../../chunk-YRVTXSXP.js";
7
- import "../../chunk-KXM7KOPE.js";
8
- import "../../chunk-KC2SIUIA.js";
9
- import "../../chunk-ACVJVYMC.js";
10
- import "../../chunk-WS6OQIEN.js";
11
- import "../../chunk-423MJ6DT.js";
12
- import "../../chunk-SILUTTV7.js";
13
- import "../../chunk-TTXV55NQ.js";
8
+ import "../../chunk-GVRZY5KI.js";
9
+ import "../../chunk-GCN7GGWE.js";
10
+ import "../../chunk-MMD26LKJ.js";
11
+ import "../../chunk-XRA4LHTJ.js";
12
+ import "../../chunk-FDY6SGSA.js";
13
+ import "../../chunk-SYHRJG5G.js";
14
14
  import "../../chunk-T4EXUIBY.js";
15
- import "../../chunk-XJXJZ2MJ.js";
16
- import "../../chunk-BK7TANUV.js";
15
+ import "../../chunk-UXNHU7Y7.js";
16
+ import "../../chunk-PP7NDFFE.js";
17
17
  import "../../chunk-DHET7RCE.js";
18
18
  export {
19
19
  StepStack
@@ -16,7 +16,7 @@ import {
16
16
  createMockMatrix,
17
17
  createMockResolvedStack,
18
18
  createMockSkill
19
- } from "../../chunk-AH7XHAKN.js";
19
+ } from "../../chunk-J73KIP6Z.js";
20
20
  import {
21
21
  afterEach,
22
22
  beforeEach,
@@ -27,21 +27,21 @@ import {
27
27
  } from "../../chunk-XY3XDVMI.js";
28
28
  import {
29
29
  StepStack
30
- } from "../../chunk-4LT6RXMY.js";
31
- import "../../chunk-DV4ALU5I.js";
30
+ } from "../../chunk-WMAALRQI.js";
31
+ import "../../chunk-MI4NWOWD.js";
32
+ import "../../chunk-ZHJEZ7AU.js";
32
33
  import "../../chunk-YRVTXSXP.js";
33
- import "../../chunk-KXM7KOPE.js";
34
- import "../../chunk-KC2SIUIA.js";
35
- import "../../chunk-ACVJVYMC.js";
36
- import "../../chunk-WS6OQIEN.js";
34
+ import "../../chunk-GVRZY5KI.js";
35
+ import "../../chunk-GCN7GGWE.js";
36
+ import "../../chunk-MMD26LKJ.js";
37
37
  import {
38
38
  useWizardStore
39
- } from "../../chunk-423MJ6DT.js";
40
- import "../../chunk-SILUTTV7.js";
41
- import "../../chunk-TTXV55NQ.js";
39
+ } from "../../chunk-XRA4LHTJ.js";
40
+ import "../../chunk-FDY6SGSA.js";
41
+ import "../../chunk-SYHRJG5G.js";
42
42
  import "../../chunk-T4EXUIBY.js";
43
- import "../../chunk-XJXJZ2MJ.js";
44
- import "../../chunk-BK7TANUV.js";
43
+ import "../../chunk-UXNHU7Y7.js";
44
+ import "../../chunk-PP7NDFFE.js";
45
45
  import {
46
46
  init_esm_shims
47
47
  } from "../../chunk-DHET7RCE.js";
@@ -117,7 +117,7 @@ describe("StepStack component", () => {
117
117
  const { lastFrame, unmount } = render(/* @__PURE__ */ jsx(StepStack, { matrix: mockMatrix }));
118
118
  cleanup = unmount;
119
119
  const output = lastFrame();
120
- globalExpect(output).toContain("[1] Choose a stack");
120
+ globalExpect(output).toContain("Choose a stack");
121
121
  });
122
122
  it("should render divider between stacks and scratch option", () => {
123
123
  const { lastFrame, unmount } = render(/* @__PURE__ */ jsx(StepStack, { matrix: mockMatrix }));
@@ -258,7 +258,7 @@ describe("StepStack component", () => {
258
258
  const { lastFrame, unmount } = render(/* @__PURE__ */ jsx(StepStack, { matrix: emptyMatrix }));
259
259
  cleanup = unmount;
260
260
  const output = lastFrame();
261
- globalExpect(output).toContain("[1] Choose a stack");
261
+ globalExpect(output).toContain("Choose a stack");
262
262
  globalExpect(output).toContain("Start from scratch");
263
263
  });
264
264
  });
@@ -287,7 +287,6 @@ describe("StepStack component", () => {
287
287
  cleanup = unmount;
288
288
  const output = lastFrame();
289
289
  globalExpect(output).toContain("Frontend web applications");
290
- globalExpect(output).toContain("Backend APIs");
291
290
  });
292
291
  });
293
292
  describe("domain selection", () => {
@@ -345,7 +344,7 @@ describe("StepStack component", () => {
345
344
  const { approach } = useWizardStore.getState();
346
345
  globalExpect(approach).toBeNull();
347
346
  const output = lastFrame();
348
- globalExpect(output).toContain("[1] Choose a stack");
347
+ globalExpect(output).toContain("Choose a stack");
349
348
  });
350
349
  });
351
350
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/cli/components/wizard/step-stack.test.tsx"],"sourcesContent":["import { render } from \"ink-testing-library\";\nimport { afterEach, beforeEach, describe, expect, it, vi } from \"vitest\";\nimport { StepStack } from \"./step-stack\";\nimport { useWizardStore } from \"../../stores/wizard-store\";\nimport {\n createMockCategory,\n createMockMatrix,\n createMockResolvedStack,\n createMockSkill,\n} from \"../../lib/__tests__/helpers\";\n\nimport type { MergedSkillsMatrix } from \"../../types\";\nimport {\n ARROW_DOWN,\n ARROW_UP,\n ENTER,\n ESCAPE,\n RENDER_DELAY_MS,\n SELECT_NAV_DELAY_MS,\n delay,\n} from \"../../lib/__tests__/test-constants\";\n\nconst createMockStackWithSkills = (): MergedSkillsMatrix => {\n const skills = {\n [\"web-framework-react\"]: createMockSkill(\"web-framework-react\", \"web-framework\", {\n description: \"React framework\",\n }),\n [\"web-state-zustand\"]: createMockSkill(\"web-state-zustand\", \"web-client-state\", {\n description: \"State management\",\n }),\n [\"api-framework-hono\"]: createMockSkill(\"api-framework-hono\", \"api-api\", {\n description: \"Web framework\",\n }),\n };\n\n const suggestedStacks = [\n createMockResolvedStack(\"react-fullstack\", \"React Fullstack\", {\n description: \"Full React stack with Zustand and Hono\",\n allSkillIds: [\"web-framework-react\", \"web-state-zustand\", \"api-framework-hono\"],\n }),\n createMockResolvedStack(\"react-minimal\", \"React Minimal\", {\n description: \"Minimal React setup\",\n allSkillIds: [\"web-framework-react\"],\n }),\n ];\n\n return createMockMatrix(skills, {\n suggestedStacks,\n categories: {\n \"web-framework\": createMockCategory(\"web-framework\", \"Web\", {\n description: \"Web skills\",\n exclusive: false,\n }),\n \"api-api\": createMockCategory(\"api-api\", \"API\", {\n description: \"API skills\",\n exclusive: false,\n order: 1,\n }),\n },\n });\n};\n\ndescribe(\"StepStack component\", () => {\n let cleanup: (() => void) | undefined;\n let mockMatrix: MergedSkillsMatrix;\n\n beforeEach(() => {\n useWizardStore.getState().reset();\n mockMatrix = createMockStackWithSkills();\n });\n\n afterEach(() => {\n cleanup?.();\n cleanup = undefined;\n });\n\n describe(\"unified stack/scratch selection (initial view)\", () => {\n describe(\"rendering\", () => {\n it(\"should render stack options and scratch option\", () => {\n const { lastFrame, unmount } = render(<StepStack matrix={mockMatrix} />);\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"React Fullstack\");\n expect(output).toContain(\"React Minimal\");\n expect(output).toContain(\"Start from scratch\");\n });\n\n it(\"should render focused stack description (only focused item shows description)\", () => {\n const { lastFrame, unmount } = render(<StepStack matrix={mockMatrix} />);\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Full React stack\");\n });\n\n it(\"should render ViewTitle for stack selection\", () => {\n const { lastFrame, unmount } = render(<StepStack matrix={mockMatrix} />);\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"[1] Choose a stack\");\n });\n\n it(\"should render divider between stacks and scratch option\", () => {\n const { lastFrame, unmount } = render(<StepStack matrix={mockMatrix} />);\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"\\u2500\");\n });\n });\n\n describe(\"stack selection\", () => {\n it(\"should select first stack on Enter and show domain selection\", async () => {\n const { stdin, lastFrame, unmount } = render(<StepStack matrix={mockMatrix} />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n stdin.write(ENTER);\n await delay(SELECT_NAV_DELAY_MS);\n\n const { approach, selectedStackId } = useWizardStore.getState();\n expect(approach).toBe(\"stack\");\n expect(selectedStackId).toBe(\"react-fullstack\");\n\n const output = lastFrame();\n expect(output).toContain(\"Select domains to configure\");\n });\n\n it(\"should select second stack when navigated to\", async () => {\n const { stdin, unmount } = render(<StepStack matrix={mockMatrix} />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n stdin.write(ARROW_DOWN);\n await delay(SELECT_NAV_DELAY_MS);\n stdin.write(ENTER);\n await delay(SELECT_NAV_DELAY_MS);\n\n const { selectedStackId } = useWizardStore.getState();\n expect(selectedStackId).toBe(\"react-minimal\");\n });\n });\n\n describe(\"scratch selection\", () => {\n it(\"should show domain selection when scratch is selected\", async () => {\n const { stdin, lastFrame, unmount } = render(<StepStack matrix={mockMatrix} />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n stdin.write(ARROW_DOWN);\n await delay(SELECT_NAV_DELAY_MS);\n stdin.write(ARROW_DOWN);\n await delay(SELECT_NAV_DELAY_MS);\n stdin.write(ENTER);\n await delay(SELECT_NAV_DELAY_MS);\n\n const { approach, selectedStackId } = useWizardStore.getState();\n expect(approach).toBe(\"scratch\");\n expect(selectedStackId).toBeNull();\n\n const output = lastFrame();\n expect(output).toContain(\"Select domains to configure\");\n });\n\n it(\"should pre-select domains except CLI when scratch is chosen\", async () => {\n const { stdin, unmount } = render(<StepStack matrix={mockMatrix} />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n stdin.write(ARROW_DOWN);\n await delay(SELECT_NAV_DELAY_MS);\n stdin.write(ARROW_DOWN);\n await delay(SELECT_NAV_DELAY_MS);\n stdin.write(ENTER);\n await delay(SELECT_NAV_DELAY_MS);\n\n const { selectedDomains } = useWizardStore.getState();\n expect(selectedDomains).toContain(\"web\");\n expect(selectedDomains).toContain(\"api\");\n expect(selectedDomains).toContain(\"mobile\");\n expect(selectedDomains).not.toContain(\"cli\");\n });\n });\n\n describe(\"cancel navigation\", () => {\n it(\"should call onCancel when pressing Escape at initial view\", async () => {\n const onCancel = vi.fn();\n const { stdin, unmount } = render(<StepStack matrix={mockMatrix} onCancel={onCancel} />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n stdin.write(ESCAPE);\n await delay(SELECT_NAV_DELAY_MS);\n\n expect(onCancel).toHaveBeenCalledTimes(1);\n });\n });\n\n describe(\"arrow key navigation\", () => {\n it(\"should navigate down to second stack card\", async () => {\n const { stdin, unmount } = render(<StepStack matrix={mockMatrix} />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n stdin.write(ARROW_DOWN);\n await delay(SELECT_NAV_DELAY_MS);\n stdin.write(ENTER);\n await delay(SELECT_NAV_DELAY_MS);\n\n const { selectedStackId } = useWizardStore.getState();\n expect(selectedStackId).toBe(\"react-minimal\");\n });\n\n it(\"should navigate down then up back to first stack\", async () => {\n const { stdin, unmount } = render(<StepStack matrix={mockMatrix} />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n stdin.write(ARROW_DOWN);\n await delay(SELECT_NAV_DELAY_MS);\n stdin.write(ARROW_UP);\n await delay(SELECT_NAV_DELAY_MS);\n stdin.write(ENTER);\n await delay(SELECT_NAV_DELAY_MS);\n\n const { selectedStackId } = useWizardStore.getState();\n expect(selectedStackId).toBe(\"react-fullstack\");\n });\n\n it(\"should clamp at top boundary\", async () => {\n const { stdin, unmount } = render(<StepStack matrix={mockMatrix} />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n stdin.write(ARROW_UP);\n await delay(SELECT_NAV_DELAY_MS);\n stdin.write(ARROW_UP);\n await delay(SELECT_NAV_DELAY_MS);\n stdin.write(ENTER);\n await delay(SELECT_NAV_DELAY_MS);\n\n const { selectedStackId } = useWizardStore.getState();\n expect(selectedStackId).toBe(\"react-fullstack\");\n });\n\n it(\"should clamp at bottom boundary (scratch is last)\", async () => {\n const { stdin, unmount } = render(<StepStack matrix={mockMatrix} />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n stdin.write(ARROW_DOWN);\n await delay(SELECT_NAV_DELAY_MS);\n stdin.write(ARROW_DOWN);\n await delay(SELECT_NAV_DELAY_MS);\n stdin.write(ARROW_DOWN);\n await delay(SELECT_NAV_DELAY_MS);\n stdin.write(ARROW_DOWN);\n await delay(SELECT_NAV_DELAY_MS);\n stdin.write(ENTER);\n await delay(SELECT_NAV_DELAY_MS);\n\n const { approach } = useWizardStore.getState();\n expect(approach).toBe(\"scratch\");\n });\n });\n\n describe(\"empty state\", () => {\n it(\"should still show scratch option with no stacks available\", () => {\n const emptyMatrix = createMockMatrix({}, { suggestedStacks: [] });\n\n const { lastFrame, unmount } = render(<StepStack matrix={emptyMatrix} />);\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"[1] Choose a stack\");\n expect(output).toContain(\"Start from scratch\");\n });\n });\n });\n\n describe(\"domain selection mode (after stack/scratch choice)\", () => {\n beforeEach(() => {\n useWizardStore.getState().setApproach(\"scratch\");\n });\n\n describe(\"rendering\", () => {\n it(\"should render domain options\", () => {\n const { lastFrame, unmount } = render(<StepStack matrix={mockMatrix} />);\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Web\");\n expect(output).toContain(\"API\");\n expect(output).toContain(\"CLI\");\n });\n\n it(\"should render header text for domain selection\", () => {\n const { lastFrame, unmount } = render(<StepStack matrix={mockMatrix} />);\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Select domains to configure\");\n });\n\n it(\"should show domain descriptions\", () => {\n const { lastFrame, unmount } = render(<StepStack matrix={mockMatrix} />);\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Frontend web applications\");\n expect(output).toContain(\"Backend APIs\");\n });\n });\n\n describe(\"domain selection\", () => {\n it(\"should toggle domain when selected\", async () => {\n const { stdin, unmount } = render(<StepStack matrix={mockMatrix} />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n // First domain (Web) is focused by default, toggle with space\n stdin.write(\" \");\n await delay(SELECT_NAV_DELAY_MS);\n\n const { selectedDomains } = useWizardStore.getState();\n expect(selectedDomains).toContain(\"web\");\n });\n\n it(\"should allow multiple domain selection\", async () => {\n const { stdin, unmount } = render(<StepStack matrix={mockMatrix} />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n // First domain (Web) is focused by default\n stdin.write(\" \");\n await delay(SELECT_NAV_DELAY_MS);\n\n expect(useWizardStore.getState().selectedDomains).toContain(\"web\");\n\n useWizardStore.getState().toggleDomain(\"api\");\n\n const { selectedDomains } = useWizardStore.getState();\n expect(selectedDomains).toContain(\"web\");\n expect(selectedDomains).toContain(\"api\");\n });\n\n it(\"should show selected domains summary when domains selected\", async () => {\n useWizardStore.getState().toggleDomain(\"web\");\n\n const { lastFrame, unmount } = render(<StepStack matrix={mockMatrix} />);\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Selected:\");\n expect(output).toContain(\"web\");\n });\n\n it(\"should navigate to build step when continuing\", async () => {\n useWizardStore.getState().toggleDomain(\"web\");\n\n const { stdin, unmount } = render(<StepStack matrix={mockMatrix} />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n // Navigate to continue option (after 4 domains)\n for (let i = 0; i < 4; i++) {\n stdin.write(ARROW_DOWN);\n await delay(SELECT_NAV_DELAY_MS);\n }\n stdin.write(ENTER);\n await delay(SELECT_NAV_DELAY_MS);\n\n const { step } = useWizardStore.getState();\n expect(step).toBe(\"build\");\n });\n });\n\n describe(\"back navigation\", () => {\n it(\"should return to stack/scratch selection when pressing ESC\", async () => {\n const { stdin, lastFrame, unmount } = render(<StepStack matrix={mockMatrix} />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n stdin.write(ESCAPE);\n await delay(SELECT_NAV_DELAY_MS);\n\n const { approach } = useWizardStore.getState();\n expect(approach).toBeNull();\n\n const output = lastFrame();\n expect(output).toContain(\"[1] Choose a stack\");\n });\n });\n });\n});\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/cli/components/wizard/step-stack.test.tsx"],"sourcesContent":["import { render } from \"ink-testing-library\";\nimport { afterEach, beforeEach, describe, expect, it, vi } from \"vitest\";\nimport { StepStack } from \"./step-stack\";\nimport { useWizardStore } from \"../../stores/wizard-store\";\nimport {\n createMockCategory,\n createMockMatrix,\n createMockResolvedStack,\n createMockSkill,\n} from \"../../lib/__tests__/helpers\";\n\nimport type { MergedSkillsMatrix } from \"../../types\";\nimport {\n ARROW_DOWN,\n ARROW_UP,\n ENTER,\n ESCAPE,\n RENDER_DELAY_MS,\n SELECT_NAV_DELAY_MS,\n delay,\n} from \"../../lib/__tests__/test-constants\";\n\nconst createMockStackWithSkills = (): MergedSkillsMatrix => {\n const skills = {\n [\"web-framework-react\"]: createMockSkill(\"web-framework-react\", \"web-framework\", {\n description: \"React framework\",\n }),\n [\"web-state-zustand\"]: createMockSkill(\"web-state-zustand\", \"web-client-state\", {\n description: \"State management\",\n }),\n [\"api-framework-hono\"]: createMockSkill(\"api-framework-hono\", \"api-api\", {\n description: \"Web framework\",\n }),\n };\n\n const suggestedStacks = [\n createMockResolvedStack(\"react-fullstack\", \"React Fullstack\", {\n description: \"Full React stack with Zustand and Hono\",\n allSkillIds: [\"web-framework-react\", \"web-state-zustand\", \"api-framework-hono\"],\n }),\n createMockResolvedStack(\"react-minimal\", \"React Minimal\", {\n description: \"Minimal React setup\",\n allSkillIds: [\"web-framework-react\"],\n }),\n ];\n\n return createMockMatrix(skills, {\n suggestedStacks,\n categories: {\n \"web-framework\": createMockCategory(\"web-framework\", \"Web\", {\n description: \"Web skills\",\n exclusive: false,\n }),\n \"api-api\": createMockCategory(\"api-api\", \"API\", {\n description: \"API skills\",\n exclusive: false,\n order: 1,\n }),\n },\n });\n};\n\ndescribe(\"StepStack component\", () => {\n let cleanup: (() => void) | undefined;\n let mockMatrix: MergedSkillsMatrix;\n\n beforeEach(() => {\n useWizardStore.getState().reset();\n mockMatrix = createMockStackWithSkills();\n });\n\n afterEach(() => {\n cleanup?.();\n cleanup = undefined;\n });\n\n describe(\"unified stack/scratch selection (initial view)\", () => {\n describe(\"rendering\", () => {\n it(\"should render stack options and scratch option\", () => {\n const { lastFrame, unmount } = render(<StepStack matrix={mockMatrix} />);\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"React Fullstack\");\n expect(output).toContain(\"React Minimal\");\n expect(output).toContain(\"Start from scratch\");\n });\n\n it(\"should render focused stack description (only focused item shows description)\", () => {\n const { lastFrame, unmount } = render(<StepStack matrix={mockMatrix} />);\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Full React stack\");\n });\n\n it(\"should render ViewTitle for stack selection\", () => {\n const { lastFrame, unmount } = render(<StepStack matrix={mockMatrix} />);\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Choose a stack\");\n });\n\n it(\"should render divider between stacks and scratch option\", () => {\n const { lastFrame, unmount } = render(<StepStack matrix={mockMatrix} />);\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"\\u2500\");\n });\n });\n\n describe(\"stack selection\", () => {\n it(\"should select first stack on Enter and show domain selection\", async () => {\n const { stdin, lastFrame, unmount } = render(<StepStack matrix={mockMatrix} />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n stdin.write(ENTER);\n await delay(SELECT_NAV_DELAY_MS);\n\n const { approach, selectedStackId } = useWizardStore.getState();\n expect(approach).toBe(\"stack\");\n expect(selectedStackId).toBe(\"react-fullstack\");\n\n const output = lastFrame();\n expect(output).toContain(\"Select domains to configure\");\n });\n\n it(\"should select second stack when navigated to\", async () => {\n const { stdin, unmount } = render(<StepStack matrix={mockMatrix} />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n stdin.write(ARROW_DOWN);\n await delay(SELECT_NAV_DELAY_MS);\n stdin.write(ENTER);\n await delay(SELECT_NAV_DELAY_MS);\n\n const { selectedStackId } = useWizardStore.getState();\n expect(selectedStackId).toBe(\"react-minimal\");\n });\n });\n\n describe(\"scratch selection\", () => {\n it(\"should show domain selection when scratch is selected\", async () => {\n const { stdin, lastFrame, unmount } = render(<StepStack matrix={mockMatrix} />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n stdin.write(ARROW_DOWN);\n await delay(SELECT_NAV_DELAY_MS);\n stdin.write(ARROW_DOWN);\n await delay(SELECT_NAV_DELAY_MS);\n stdin.write(ENTER);\n await delay(SELECT_NAV_DELAY_MS);\n\n const { approach, selectedStackId } = useWizardStore.getState();\n expect(approach).toBe(\"scratch\");\n expect(selectedStackId).toBeNull();\n\n const output = lastFrame();\n expect(output).toContain(\"Select domains to configure\");\n });\n\n it(\"should pre-select domains except CLI when scratch is chosen\", async () => {\n const { stdin, unmount } = render(<StepStack matrix={mockMatrix} />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n stdin.write(ARROW_DOWN);\n await delay(SELECT_NAV_DELAY_MS);\n stdin.write(ARROW_DOWN);\n await delay(SELECT_NAV_DELAY_MS);\n stdin.write(ENTER);\n await delay(SELECT_NAV_DELAY_MS);\n\n const { selectedDomains } = useWizardStore.getState();\n expect(selectedDomains).toContain(\"web\");\n expect(selectedDomains).toContain(\"api\");\n expect(selectedDomains).toContain(\"mobile\");\n expect(selectedDomains).not.toContain(\"cli\");\n });\n });\n\n describe(\"cancel navigation\", () => {\n it(\"should call onCancel when pressing Escape at initial view\", async () => {\n const onCancel = vi.fn();\n const { stdin, unmount } = render(<StepStack matrix={mockMatrix} onCancel={onCancel} />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n stdin.write(ESCAPE);\n await delay(SELECT_NAV_DELAY_MS);\n\n expect(onCancel).toHaveBeenCalledTimes(1);\n });\n });\n\n describe(\"arrow key navigation\", () => {\n it(\"should navigate down to second stack card\", async () => {\n const { stdin, unmount } = render(<StepStack matrix={mockMatrix} />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n stdin.write(ARROW_DOWN);\n await delay(SELECT_NAV_DELAY_MS);\n stdin.write(ENTER);\n await delay(SELECT_NAV_DELAY_MS);\n\n const { selectedStackId } = useWizardStore.getState();\n expect(selectedStackId).toBe(\"react-minimal\");\n });\n\n it(\"should navigate down then up back to first stack\", async () => {\n const { stdin, unmount } = render(<StepStack matrix={mockMatrix} />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n stdin.write(ARROW_DOWN);\n await delay(SELECT_NAV_DELAY_MS);\n stdin.write(ARROW_UP);\n await delay(SELECT_NAV_DELAY_MS);\n stdin.write(ENTER);\n await delay(SELECT_NAV_DELAY_MS);\n\n const { selectedStackId } = useWizardStore.getState();\n expect(selectedStackId).toBe(\"react-fullstack\");\n });\n\n it(\"should clamp at top boundary\", async () => {\n const { stdin, unmount } = render(<StepStack matrix={mockMatrix} />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n stdin.write(ARROW_UP);\n await delay(SELECT_NAV_DELAY_MS);\n stdin.write(ARROW_UP);\n await delay(SELECT_NAV_DELAY_MS);\n stdin.write(ENTER);\n await delay(SELECT_NAV_DELAY_MS);\n\n const { selectedStackId } = useWizardStore.getState();\n expect(selectedStackId).toBe(\"react-fullstack\");\n });\n\n it(\"should clamp at bottom boundary (scratch is last)\", async () => {\n const { stdin, unmount } = render(<StepStack matrix={mockMatrix} />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n stdin.write(ARROW_DOWN);\n await delay(SELECT_NAV_DELAY_MS);\n stdin.write(ARROW_DOWN);\n await delay(SELECT_NAV_DELAY_MS);\n stdin.write(ARROW_DOWN);\n await delay(SELECT_NAV_DELAY_MS);\n stdin.write(ARROW_DOWN);\n await delay(SELECT_NAV_DELAY_MS);\n stdin.write(ENTER);\n await delay(SELECT_NAV_DELAY_MS);\n\n const { approach } = useWizardStore.getState();\n expect(approach).toBe(\"scratch\");\n });\n });\n\n describe(\"empty state\", () => {\n it(\"should still show scratch option with no stacks available\", () => {\n const emptyMatrix = createMockMatrix({}, { suggestedStacks: [] });\n\n const { lastFrame, unmount } = render(<StepStack matrix={emptyMatrix} />);\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Choose a stack\");\n expect(output).toContain(\"Start from scratch\");\n });\n });\n });\n\n describe(\"domain selection mode (after stack/scratch choice)\", () => {\n beforeEach(() => {\n useWizardStore.getState().setApproach(\"scratch\");\n });\n\n describe(\"rendering\", () => {\n it(\"should render domain options\", () => {\n const { lastFrame, unmount } = render(<StepStack matrix={mockMatrix} />);\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Web\");\n expect(output).toContain(\"API\");\n expect(output).toContain(\"CLI\");\n });\n\n it(\"should render header text for domain selection\", () => {\n const { lastFrame, unmount } = render(<StepStack matrix={mockMatrix} />);\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Select domains to configure\");\n });\n\n it(\"should show domain descriptions\", () => {\n const { lastFrame, unmount } = render(<StepStack matrix={mockMatrix} />);\n cleanup = unmount;\n\n const output = lastFrame();\n // Only the focused item (Web, first in list) shows its description\n expect(output).toContain(\"Frontend web applications\");\n });\n });\n\n describe(\"domain selection\", () => {\n it(\"should toggle domain when selected\", async () => {\n const { stdin, unmount } = render(<StepStack matrix={mockMatrix} />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n // First domain (Web) is focused by default, toggle with space\n stdin.write(\" \");\n await delay(SELECT_NAV_DELAY_MS);\n\n const { selectedDomains } = useWizardStore.getState();\n expect(selectedDomains).toContain(\"web\");\n });\n\n it(\"should allow multiple domain selection\", async () => {\n const { stdin, unmount } = render(<StepStack matrix={mockMatrix} />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n // First domain (Web) is focused by default\n stdin.write(\" \");\n await delay(SELECT_NAV_DELAY_MS);\n\n expect(useWizardStore.getState().selectedDomains).toContain(\"web\");\n\n useWizardStore.getState().toggleDomain(\"api\");\n\n const { selectedDomains } = useWizardStore.getState();\n expect(selectedDomains).toContain(\"web\");\n expect(selectedDomains).toContain(\"api\");\n });\n\n it(\"should show selected domains summary when domains selected\", async () => {\n useWizardStore.getState().toggleDomain(\"web\");\n\n const { lastFrame, unmount } = render(<StepStack matrix={mockMatrix} />);\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Selected:\");\n expect(output).toContain(\"web\");\n });\n\n it(\"should navigate to build step when continuing\", async () => {\n useWizardStore.getState().toggleDomain(\"web\");\n\n const { stdin, unmount } = render(<StepStack matrix={mockMatrix} />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n // Navigate to continue option (after 4 domains)\n for (let i = 0; i < 4; i++) {\n stdin.write(ARROW_DOWN);\n await delay(SELECT_NAV_DELAY_MS);\n }\n stdin.write(ENTER);\n await delay(SELECT_NAV_DELAY_MS);\n\n const { step } = useWizardStore.getState();\n expect(step).toBe(\"build\");\n });\n });\n\n describe(\"back navigation\", () => {\n it(\"should return to stack/scratch selection when pressing ESC\", async () => {\n const { stdin, lastFrame, unmount } = render(<StepStack matrix={mockMatrix} />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n stdin.write(ESCAPE);\n await delay(SELECT_NAV_DELAY_MS);\n\n const { approach } = useWizardStore.getState();\n expect(approach).toBeNull();\n\n const output = lastFrame();\n expect(output).toContain(\"Choose a stack\");\n });\n });\n });\n});\n"],"mappings":"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","names":[]}
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  ViewTitle
4
- } from "../../chunk-KXM7KOPE.js";
5
- import "../../chunk-BK7TANUV.js";
4
+ } from "../../chunk-MMD26LKJ.js";
5
+ import "../../chunk-PP7NDFFE.js";
6
6
  import "../../chunk-DHET7RCE.js";
7
7
  export {
8
8
  ViewTitle
@@ -1,15 +1,15 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  WizardLayout
4
- } from "../../chunk-MNPPGIZQ.js";
5
- import "../../chunk-4SYXPG7L.js";
6
- import "../../chunk-UKTYDNWJ.js";
7
- import "../../chunk-423MJ6DT.js";
8
- import "../../chunk-SILUTTV7.js";
9
- import "../../chunk-TTXV55NQ.js";
4
+ } from "../../chunk-ORJPGZVD.js";
5
+ import "../../chunk-MHET2RG2.js";
6
+ import "../../chunk-44QCEK7E.js";
7
+ import "../../chunk-XRA4LHTJ.js";
8
+ import "../../chunk-FDY6SGSA.js";
9
+ import "../../chunk-SYHRJG5G.js";
10
10
  import "../../chunk-T4EXUIBY.js";
11
- import "../../chunk-XJXJZ2MJ.js";
12
- import "../../chunk-BK7TANUV.js";
11
+ import "../../chunk-UXNHU7Y7.js";
12
+ import "../../chunk-PP7NDFFE.js";
13
13
  import "../../chunk-DHET7RCE.js";
14
14
  export {
15
15
  WizardLayout