@agents-inc/cli 0.77.0 → 0.79.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 (136) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/dist/{chunk-ZIZFTSQY.js → chunk-7HGMFJ4Y.js} +2 -2
  3. package/dist/{chunk-R6QNVMN5.js → chunk-B4C2S5LP.js} +11 -11
  4. package/dist/{chunk-R6QNVMN5.js.map → chunk-B4C2S5LP.js.map} +1 -1
  5. package/dist/{chunk-B66E255O.js → chunk-D4T3HHE7.js} +3 -3
  6. package/dist/chunk-D4T3HHE7.js.map +1 -0
  7. package/dist/{chunk-KMLJCO5H.js → chunk-F4IZ3UAS.js} +15 -21
  8. package/dist/chunk-F4IZ3UAS.js.map +1 -0
  9. package/dist/{chunk-XU6N3OIS.js → chunk-HANGA633.js} +2 -6
  10. package/dist/{chunk-XU6N3OIS.js.map → chunk-HANGA633.js.map} +1 -1
  11. package/dist/{chunk-2I5SXGXR.js → chunk-KQDGLEBF.js} +80 -5
  12. package/dist/chunk-KQDGLEBF.js.map +1 -0
  13. package/dist/{chunk-G3YSDQJ2.js → chunk-KVRR4PEJ.js} +46 -37
  14. package/dist/chunk-KVRR4PEJ.js.map +1 -0
  15. package/dist/{chunk-J5OOAKB5.js → chunk-LVBRC2CP.js} +1 -5
  16. package/dist/chunk-LVBRC2CP.js.map +1 -0
  17. package/dist/chunk-N2XGUAJU.js +34 -0
  18. package/dist/{chunk-KB57OPUL.js.map → chunk-N2XGUAJU.js.map} +1 -1
  19. package/dist/{chunk-CY23HPDE.js → chunk-N34D3ROY.js} +10 -11
  20. package/dist/chunk-N34D3ROY.js.map +1 -0
  21. package/dist/{chunk-PDYKGJGR.js → chunk-NKLNT7N7.js} +3 -20
  22. package/dist/chunk-NKLNT7N7.js.map +1 -0
  23. package/dist/{chunk-CZLXZ75E.js → chunk-OIHZ2YH3.js} +107 -69
  24. package/dist/chunk-OIHZ2YH3.js.map +1 -0
  25. package/dist/{chunk-SGKNE6EJ.js → chunk-OOWNDQCG.js} +2 -2
  26. package/dist/{chunk-WMTYOK4E.js → chunk-OTMIGYBB.js} +48 -6
  27. package/dist/chunk-OTMIGYBB.js.map +1 -0
  28. package/dist/chunk-PZERKWE2.js +114 -0
  29. package/dist/chunk-PZERKWE2.js.map +1 -0
  30. package/dist/{chunk-N4KD5PBX.js → chunk-Q755X6QF.js} +2 -2
  31. package/dist/{chunk-AQ5KP4YW.js → chunk-QD3GQ2CH.js} +3 -3
  32. package/dist/{chunk-ERHTXNIF.js → chunk-RU5XLS5Q.js} +1 -5
  33. package/dist/{chunk-ERHTXNIF.js.map → chunk-RU5XLS5Q.js.map} +1 -1
  34. package/dist/{chunk-UZHD4DBD.js → chunk-SJNUTUSJ.js} +2 -2
  35. package/dist/{chunk-5DDHCCEB.js → chunk-VDVLM3KB.js} +42 -4
  36. package/dist/chunk-VDVLM3KB.js.map +1 -0
  37. package/dist/{chunk-CTZ4GEAD.js → chunk-W46L2PXK.js} +17 -8
  38. package/dist/chunk-W46L2PXK.js.map +1 -0
  39. package/dist/{chunk-A6XMJT2Q.js → chunk-YFHVP3VA.js} +3 -10
  40. package/dist/chunk-YFHVP3VA.js.map +1 -0
  41. package/dist/commands/build/plugins.js +2 -2
  42. package/dist/commands/build/stack.js +2 -2
  43. package/dist/commands/compile.js +32 -16
  44. package/dist/commands/compile.js.map +1 -1
  45. package/dist/commands/config/index.js +2 -2
  46. package/dist/commands/config/path.js +1 -1
  47. package/dist/commands/config/show.js +2 -2
  48. package/dist/commands/diff.js +29 -9
  49. package/dist/commands/diff.js.map +1 -1
  50. package/dist/commands/doctor.js +18 -6
  51. package/dist/commands/doctor.js.map +1 -1
  52. package/dist/commands/edit.js +37 -27
  53. package/dist/commands/edit.js.map +1 -1
  54. package/dist/commands/eject.js +1 -1
  55. package/dist/commands/import/skill.js +1 -1
  56. package/dist/commands/info.js +1 -1
  57. package/dist/commands/init.js +18 -18
  58. package/dist/commands/list.js +1 -1
  59. package/dist/commands/new/agent.js +2 -2
  60. package/dist/commands/new/marketplace.js +2 -2
  61. package/dist/commands/new/skill.js +2 -2
  62. package/dist/commands/outdated.js +12 -4
  63. package/dist/commands/outdated.js.map +1 -1
  64. package/dist/commands/search.js +1 -1
  65. package/dist/commands/uninstall.js +9 -21
  66. package/dist/commands/uninstall.js.map +1 -1
  67. package/dist/commands/update.js +20 -10
  68. package/dist/commands/update.js.map +1 -1
  69. package/dist/commands/validate.js +1 -1
  70. package/dist/components/wizard/category-grid.js +1 -1
  71. package/dist/components/wizard/category-grid.test.js +3 -3
  72. package/dist/components/wizard/checkbox-grid.js +1 -2
  73. package/dist/components/wizard/checkbox-grid.test.js +2 -4
  74. package/dist/components/wizard/checkbox-grid.test.js.map +1 -1
  75. package/dist/components/wizard/domain-selection.js +4 -5
  76. package/dist/components/wizard/source-grid.js +1 -1
  77. package/dist/components/wizard/source-grid.test.js +3 -3
  78. package/dist/components/wizard/stack-selection.js +3 -3
  79. package/dist/components/wizard/stats-panel.js +12 -0
  80. package/dist/components/wizard/step-agents.js +3 -4
  81. package/dist/components/wizard/step-agents.test.js +7 -6
  82. package/dist/components/wizard/step-agents.test.js.map +1 -1
  83. package/dist/components/wizard/step-build.js +5 -6
  84. package/dist/components/wizard/step-build.test.js +23 -23
  85. package/dist/components/wizard/step-build.test.js.map +1 -1
  86. package/dist/components/wizard/step-confirm.js +1 -3
  87. package/dist/components/wizard/step-confirm.test.js +17 -16
  88. package/dist/components/wizard/step-confirm.test.js.map +1 -1
  89. package/dist/components/wizard/step-refine.js +1 -2
  90. package/dist/components/wizard/step-refine.test.js +1 -2
  91. package/dist/components/wizard/step-refine.test.js.map +1 -1
  92. package/dist/components/wizard/step-settings.js +2 -3
  93. package/dist/components/wizard/step-settings.test.js +8 -9
  94. package/dist/components/wizard/step-settings.test.js.map +1 -1
  95. package/dist/components/wizard/step-sources.js +4 -5
  96. package/dist/components/wizard/step-sources.test.js +7 -9
  97. package/dist/components/wizard/step-sources.test.js.map +1 -1
  98. package/dist/components/wizard/step-stack.js +6 -7
  99. package/dist/components/wizard/step-stack.test.js +16 -15
  100. package/dist/components/wizard/step-stack.test.js.map +1 -1
  101. package/dist/components/wizard/view-title.js +21 -3
  102. package/dist/components/wizard/view-title.js.map +1 -1
  103. package/dist/components/wizard/wizard-layout.js +5 -4
  104. package/dist/components/wizard/wizard-tabs.js +1 -1
  105. package/dist/components/wizard/wizard-tabs.test.js +1 -1
  106. package/dist/components/wizard/wizard.js +17 -17
  107. package/dist/hooks/init.js +18 -18
  108. package/dist/{source-loader-H3QLG5AE.js → source-loader-D3VIG3GM.js} +2 -2
  109. package/dist/{source-manager-ZDBUHGIR.js → source-manager-FPYFJRR7.js} +2 -2
  110. package/dist/source-manager-FPYFJRR7.js.map +1 -0
  111. package/dist/stores/wizard-store.js +2 -2
  112. package/dist/stores/wizard-store.test.js +4 -4
  113. package/dist/stores/wizard-store.test.js.map +1 -1
  114. package/package.json +1 -1
  115. package/dist/chunk-2I5SXGXR.js.map +0 -1
  116. package/dist/chunk-5DDHCCEB.js.map +0 -1
  117. package/dist/chunk-A6XMJT2Q.js.map +0 -1
  118. package/dist/chunk-B66E255O.js.map +0 -1
  119. package/dist/chunk-CTZ4GEAD.js.map +0 -1
  120. package/dist/chunk-CY23HPDE.js.map +0 -1
  121. package/dist/chunk-CZLXZ75E.js.map +0 -1
  122. package/dist/chunk-G3YSDQJ2.js.map +0 -1
  123. package/dist/chunk-J5OOAKB5.js.map +0 -1
  124. package/dist/chunk-JNQKCZA3.js +0 -28
  125. package/dist/chunk-JNQKCZA3.js.map +0 -1
  126. package/dist/chunk-KB57OPUL.js +0 -40
  127. package/dist/chunk-KMLJCO5H.js.map +0 -1
  128. package/dist/chunk-PDYKGJGR.js.map +0 -1
  129. package/dist/chunk-WMTYOK4E.js.map +0 -1
  130. /package/dist/{chunk-ZIZFTSQY.js.map → chunk-7HGMFJ4Y.js.map} +0 -0
  131. /package/dist/{chunk-SGKNE6EJ.js.map → chunk-OOWNDQCG.js.map} +0 -0
  132. /package/dist/{chunk-N4KD5PBX.js.map → chunk-Q755X6QF.js.map} +0 -0
  133. /package/dist/{chunk-AQ5KP4YW.js.map → chunk-QD3GQ2CH.js.map} +0 -0
  134. /package/dist/{chunk-UZHD4DBD.js.map → chunk-SJNUTUSJ.js.map} +0 -0
  135. /package/dist/{source-loader-H3QLG5AE.js.map → components/wizard/stats-panel.js.map} +0 -0
  136. /package/dist/{source-manager-ZDBUHGIR.js.map → source-loader-D3VIG3GM.js.map} +0 -0
@@ -1,15 +1,14 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  StepSettings
4
- } from "../../chunk-A6XMJT2Q.js";
4
+ } from "../../chunk-YFHVP3VA.js";
5
5
  import "../../chunk-7SOPVGDV.js";
6
6
  import "../../chunk-SQ7WINEU.js";
7
- import "../../chunk-JNQKCZA3.js";
8
7
  import "../../chunk-FFMWFEUH.js";
9
8
  import "../../chunk-KUV24B5M.js";
10
9
  import "../../chunk-U3IGFMCY.js";
11
10
  import "../../chunk-HK53FRMU.js";
12
- import "../../chunk-CZLXZ75E.js";
11
+ import "../../chunk-OIHZ2YH3.js";
13
12
  import "../../chunk-IFCASC6R.js";
14
13
  import "../../chunk-FSK4TQX7.js";
15
14
  import "../../chunk-XYPAOBBV.js";
@@ -19,15 +19,14 @@ import {
19
19
  } from "../../chunk-XY3XDVMI.js";
20
20
  import {
21
21
  StepSettings
22
- } from "../../chunk-A6XMJT2Q.js";
22
+ } from "../../chunk-YFHVP3VA.js";
23
23
  import "../../chunk-7SOPVGDV.js";
24
24
  import "../../chunk-SQ7WINEU.js";
25
- import "../../chunk-JNQKCZA3.js";
26
25
  import "../../chunk-FFMWFEUH.js";
27
26
  import "../../chunk-KUV24B5M.js";
28
27
  import "../../chunk-U3IGFMCY.js";
29
28
  import "../../chunk-HK53FRMU.js";
30
- import "../../chunk-CZLXZ75E.js";
29
+ import "../../chunk-OIHZ2YH3.js";
31
30
  import "../../chunk-IFCASC6R.js";
32
31
  import "../../chunk-FSK4TQX7.js";
33
32
  import "../../chunk-XYPAOBBV.js";
@@ -63,7 +62,7 @@ describe("StepSettings component", () => {
63
62
  let cleanup;
64
63
  beforeEach(async () => {
65
64
  vi.resetAllMocks();
66
- const { getSourceSummary } = await import("../../source-manager-ZDBUHGIR.js");
65
+ const { getSourceSummary } = await import("../../source-manager-FPYFJRR7.js");
67
66
  vi.mocked(getSourceSummary).mockResolvedValue({
68
67
  sources: [
69
68
  { name: "public", url: "github:agents-inc/skills", enabled: true },
@@ -78,12 +77,12 @@ describe("StepSettings component", () => {
78
77
  cleanup = void 0;
79
78
  });
80
79
  describe("rendering", () => {
81
- it("should render the title", async () => {
80
+ it("should render configured marketplaces header", async () => {
82
81
  const { lastFrame, unmount } = renderStepSettings();
83
82
  cleanup = unmount;
84
83
  await delay(LOADING_SETTLE_MS);
85
84
  const output = lastFrame();
86
- globalExpect(output).toContain("Skill Sources");
85
+ globalExpect(output).toContain("Configured marketplaces:");
87
86
  });
88
87
  it("should render configured sources", async () => {
89
88
  const { lastFrame, unmount } = renderStepSettings();
@@ -201,7 +200,7 @@ describe("StepSettings component", () => {
201
200
  await delay(INPUT_DELAY_MS);
202
201
  globalExpect(onClose).not.toHaveBeenCalled();
203
202
  const output = lastFrame();
204
- globalExpect(output).toContain("Skill Sources");
203
+ globalExpect(output).toContain("Configured marketplaces:");
205
204
  });
206
205
  it("should show hint text for add mode", async () => {
207
206
  const { lastFrame, stdin, unmount } = renderStepSettings();
@@ -224,7 +223,7 @@ describe("StepSettings component", () => {
224
223
  });
225
224
  describe("edge cases", () => {
226
225
  it("should handle empty sources list gracefully", async () => {
227
- const { getSourceSummary } = await import("../../source-manager-ZDBUHGIR.js");
226
+ const { getSourceSummary } = await import("../../source-manager-FPYFJRR7.js");
228
227
  vi.mocked(getSourceSummary).mockResolvedValue({
229
228
  sources: [{ name: "public", url: "github:agents-inc/skills", enabled: true }],
230
229
  localSkillCount: 0,
@@ -238,7 +237,7 @@ describe("StepSettings component", () => {
238
237
  globalExpect(output).toContain("0");
239
238
  });
240
239
  it("should handle getSourceSummary failure gracefully", async () => {
241
- const { getSourceSummary } = await import("../../source-manager-ZDBUHGIR.js");
240
+ const { getSourceSummary } = await import("../../source-manager-FPYFJRR7.js");
242
241
  vi.mocked(getSourceSummary).mockRejectedValue(new Error("Config read failed"));
243
242
  const { lastFrame, unmount } = renderStepSettings();
244
243
  cleanup = unmount;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/cli/components/wizard/step-settings.test.tsx"],"sourcesContent":["import { render } from \"ink-testing-library\";\nimport { describe, expect, it, afterEach, beforeEach, vi } from \"vitest\";\nimport { StepSettings, type StepSettingsProps } from \"./step-settings\";\nimport {\n ESCAPE,\n ARROW_UP,\n ARROW_DOWN,\n INPUT_DELAY_MS,\n delay,\n} from \"../../lib/__tests__/test-constants\";\n\n// Mock source-manager\nvi.mock(\"../../lib/configuration/source-manager.js\", async (importOriginal) => ({\n ...(await importOriginal<typeof import(\"../../lib/configuration/source-manager.js\")>()),\n getSourceSummary: vi.fn(),\n addSource: vi.fn(),\n removeSource: vi.fn(),\n}));\n\n// Mock config\nvi.mock(\"../../lib/configuration/config.js\", async (importOriginal) => ({\n ...(await importOriginal<typeof import(\"../../lib/configuration/config.js\")>()),\n DEFAULT_SOURCE: \"github:agents-inc/skills\",\n}));\n\nconst LOADING_SETTLE_MS = 200;\n\nconst defaultProps: StepSettingsProps = {\n projectDir: \"/test/project\",\n onClose: vi.fn(),\n};\n\nconst renderStepSettings = (props: Partial<StepSettingsProps> = {}) => {\n return render(<StepSettings {...defaultProps} {...props} />);\n};\n\ndescribe(\"StepSettings component\", () => {\n let cleanup: (() => void) | undefined;\n\n beforeEach(async () => {\n vi.resetAllMocks();\n\n const { getSourceSummary } = await import(\"../../lib/configuration/source-manager.js\");\n vi.mocked(getSourceSummary).mockResolvedValue({\n sources: [\n { name: \"public\", url: \"github:agents-inc/skills\", enabled: true },\n { name: \"acme-corp\", url: \"github:acme-corp/claude-skills\", enabled: true },\n ],\n localSkillCount: 3,\n pluginSkillCount: 1,\n });\n });\n\n afterEach(() => {\n cleanup?.();\n cleanup = undefined;\n });\n\n describe(\"rendering\", () => {\n it(\"should render the title\", async () => {\n const { lastFrame, unmount } = renderStepSettings();\n cleanup = unmount;\n\n await delay(LOADING_SETTLE_MS);\n const output = lastFrame();\n expect(output).toContain(\"Skill Sources\");\n });\n\n it(\"should render configured sources\", async () => {\n const { lastFrame, unmount } = renderStepSettings();\n cleanup = unmount;\n\n await delay(LOADING_SETTLE_MS);\n const output = lastFrame();\n expect(output).toContain(\"Public\");\n expect(output).toContain(\"acme-corp\");\n });\n\n it(\"should show default label for public source\", async () => {\n const { lastFrame, unmount } = renderStepSettings();\n cleanup = unmount;\n\n await delay(LOADING_SETTLE_MS);\n const output = lastFrame();\n expect(output).toContain(\"(default)\");\n });\n\n it(\"should show source URLs\", async () => {\n const { lastFrame, unmount } = renderStepSettings();\n cleanup = unmount;\n\n await delay(LOADING_SETTLE_MS);\n const output = lastFrame();\n expect(output).toContain(\"github:agents-inc/skills\");\n expect(output).toContain(\"github:acme-corp/claude-skills\");\n });\n\n it(\"should show local skill count\", async () => {\n const { lastFrame, unmount } = renderStepSettings();\n cleanup = unmount;\n\n await delay(LOADING_SETTLE_MS);\n const output = lastFrame();\n expect(output).toContain(\"3\");\n expect(output).toContain(\".claude/skills/\");\n });\n\n it(\"should show plugin count\", async () => {\n const { lastFrame, unmount } = renderStepSettings();\n cleanup = unmount;\n\n await delay(LOADING_SETTLE_MS);\n const output = lastFrame();\n expect(output).toContain(\"1\");\n expect(output).toContain(\"installed plugins\");\n });\n\n it(\"should show add source input area\", async () => {\n const { lastFrame, unmount } = renderStepSettings();\n cleanup = unmount;\n\n await delay(LOADING_SETTLE_MS);\n const output = lastFrame();\n expect(output).toContain(\"Add source\");\n });\n\n it(\"should show loading state initially\", () => {\n const { lastFrame, unmount } = renderStepSettings();\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Loading sources...\");\n });\n });\n\n describe(\"keyboard navigation\", () => {\n it(\"should navigate down with arrow down\", async () => {\n const { lastFrame, stdin, unmount } = renderStepSettings();\n cleanup = unmount;\n\n await delay(LOADING_SETTLE_MS);\n\n // Move focus down\n stdin.write(ARROW_DOWN);\n await delay(INPUT_DELAY_MS);\n\n const output = lastFrame();\n // The second source (acme-corp) should now be focused\n expect(output).toContain(\"acme-corp\");\n });\n\n it(\"should navigate up with arrow up\", async () => {\n const { lastFrame, stdin, unmount } = renderStepSettings();\n cleanup = unmount;\n\n await delay(LOADING_SETTLE_MS);\n\n // Move down then up\n stdin.write(ARROW_DOWN);\n await delay(INPUT_DELAY_MS);\n stdin.write(ARROW_UP);\n await delay(INPUT_DELAY_MS);\n\n const output = lastFrame();\n expect(output).toContain(\"Public\");\n });\n\n it(\"should not navigate above first item\", async () => {\n const { lastFrame, stdin, unmount } = renderStepSettings();\n cleanup = unmount;\n\n await delay(LOADING_SETTLE_MS);\n\n // Try to move up from first item\n stdin.write(ARROW_UP);\n await delay(INPUT_DELAY_MS);\n\n const output = lastFrame();\n expect(output).toContain(\"Public\");\n });\n });\n\n describe(\"escape to close\", () => {\n it(\"should call onClose when Escape is pressed\", async () => {\n const onClose = vi.fn();\n const { stdin, unmount } = renderStepSettings({ onClose });\n cleanup = unmount;\n\n await delay(LOADING_SETTLE_MS);\n stdin.write(ESCAPE);\n await delay(INPUT_DELAY_MS);\n\n expect(onClose).toHaveBeenCalledTimes(1);\n });\n });\n\n describe(\"add source input mode\", () => {\n it(\"should enter add source mode on 'a' key\", async () => {\n const { lastFrame, stdin, unmount } = renderStepSettings();\n cleanup = unmount;\n\n await delay(LOADING_SETTLE_MS);\n\n stdin.write(\"a\");\n await delay(INPUT_DELAY_MS);\n\n const output = lastFrame();\n // Should show cursor block character indicating input mode\n expect(output).toContain(\"\\u2588\");\n });\n\n it(\"should exit add source mode on Escape\", async () => {\n const onClose = vi.fn();\n const { lastFrame, stdin, unmount } = renderStepSettings({ onClose });\n cleanup = unmount;\n\n await delay(LOADING_SETTLE_MS);\n\n // Enter add mode\n stdin.write(\"a\");\n await delay(INPUT_DELAY_MS);\n\n // Escape from add mode (should NOT close settings)\n stdin.write(ESCAPE);\n await delay(INPUT_DELAY_MS);\n\n expect(onClose).not.toHaveBeenCalled();\n\n const output = lastFrame();\n // Should still show the settings view\n expect(output).toContain(\"Skill Sources\");\n });\n\n it(\"should show hint text for add mode\", async () => {\n const { lastFrame, stdin, unmount } = renderStepSettings();\n cleanup = unmount;\n\n await delay(LOADING_SETTLE_MS);\n\n stdin.write(\"a\");\n await delay(INPUT_DELAY_MS);\n\n const output = lastFrame();\n expect(output).toContain(\"ENTER submit\");\n expect(output).toContain(\"ESC cancel\");\n });\n\n it(\"should show hint text for normal mode\", async () => {\n const { lastFrame, unmount } = renderStepSettings();\n cleanup = unmount;\n\n await delay(LOADING_SETTLE_MS);\n\n const output = lastFrame();\n expect(output).toContain(\"DEL remove\");\n expect(output).toContain(\"close\");\n });\n });\n\n describe(\"edge cases\", () => {\n it(\"should handle empty sources list gracefully\", async () => {\n const { getSourceSummary } = await import(\"../../lib/configuration/source-manager.js\");\n vi.mocked(getSourceSummary).mockResolvedValue({\n sources: [{ name: \"public\", url: \"github:agents-inc/skills\", enabled: true }],\n localSkillCount: 0,\n pluginSkillCount: 0,\n });\n\n const { lastFrame, unmount } = renderStepSettings();\n cleanup = unmount;\n\n await delay(LOADING_SETTLE_MS);\n\n const output = lastFrame();\n expect(output).toContain(\"Public\");\n expect(output).toContain(\"0\");\n });\n\n it(\"should handle getSourceSummary failure gracefully\", async () => {\n const { getSourceSummary } = await import(\"../../lib/configuration/source-manager.js\");\n vi.mocked(getSourceSummary).mockRejectedValue(new Error(\"Config read failed\"));\n\n const { lastFrame, unmount } = renderStepSettings();\n cleanup = unmount;\n\n await delay(LOADING_SETTLE_MS);\n\n const output = lastFrame();\n // Should show fallback with default source\n expect(output).toContain(\"Public\");\n });\n });\n});\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/cli/components/wizard/step-settings.test.tsx"],"sourcesContent":["import { render } from \"ink-testing-library\";\nimport { describe, expect, it, afterEach, beforeEach, vi } from \"vitest\";\nimport { StepSettings, type StepSettingsProps } from \"./step-settings\";\nimport {\n ESCAPE,\n ARROW_UP,\n ARROW_DOWN,\n INPUT_DELAY_MS,\n delay,\n} from \"../../lib/__tests__/test-constants\";\n\n// Mock source-manager\nvi.mock(\"../../lib/configuration/source-manager.js\", async (importOriginal) => ({\n ...(await importOriginal<typeof import(\"../../lib/configuration/source-manager.js\")>()),\n getSourceSummary: vi.fn(),\n addSource: vi.fn(),\n removeSource: vi.fn(),\n}));\n\n// Mock config\nvi.mock(\"../../lib/configuration/config.js\", async (importOriginal) => ({\n ...(await importOriginal<typeof import(\"../../lib/configuration/config.js\")>()),\n DEFAULT_SOURCE: \"github:agents-inc/skills\",\n}));\n\nconst LOADING_SETTLE_MS = 200;\n\nconst defaultProps: StepSettingsProps = {\n projectDir: \"/test/project\",\n onClose: vi.fn(),\n};\n\nconst renderStepSettings = (props: Partial<StepSettingsProps> = {}) => {\n return render(<StepSettings {...defaultProps} {...props} />);\n};\n\ndescribe(\"StepSettings component\", () => {\n let cleanup: (() => void) | undefined;\n\n beforeEach(async () => {\n vi.resetAllMocks();\n\n const { getSourceSummary } = await import(\"../../lib/configuration/source-manager.js\");\n vi.mocked(getSourceSummary).mockResolvedValue({\n sources: [\n { name: \"public\", url: \"github:agents-inc/skills\", enabled: true },\n { name: \"acme-corp\", url: \"github:acme-corp/claude-skills\", enabled: true },\n ],\n localSkillCount: 3,\n pluginSkillCount: 1,\n });\n });\n\n afterEach(() => {\n cleanup?.();\n cleanup = undefined;\n });\n\n describe(\"rendering\", () => {\n it(\"should render configured marketplaces header\", async () => {\n const { lastFrame, unmount } = renderStepSettings();\n cleanup = unmount;\n\n await delay(LOADING_SETTLE_MS);\n const output = lastFrame();\n // ViewTitle removed; verify content renders (title shown by wizard-layout)\n expect(output).toContain(\"Configured marketplaces:\");\n });\n\n it(\"should render configured sources\", async () => {\n const { lastFrame, unmount } = renderStepSettings();\n cleanup = unmount;\n\n await delay(LOADING_SETTLE_MS);\n const output = lastFrame();\n expect(output).toContain(\"Public\");\n expect(output).toContain(\"acme-corp\");\n });\n\n it(\"should show default label for public source\", async () => {\n const { lastFrame, unmount } = renderStepSettings();\n cleanup = unmount;\n\n await delay(LOADING_SETTLE_MS);\n const output = lastFrame();\n expect(output).toContain(\"(default)\");\n });\n\n it(\"should show source URLs\", async () => {\n const { lastFrame, unmount } = renderStepSettings();\n cleanup = unmount;\n\n await delay(LOADING_SETTLE_MS);\n const output = lastFrame();\n expect(output).toContain(\"github:agents-inc/skills\");\n expect(output).toContain(\"github:acme-corp/claude-skills\");\n });\n\n it(\"should show local skill count\", async () => {\n const { lastFrame, unmount } = renderStepSettings();\n cleanup = unmount;\n\n await delay(LOADING_SETTLE_MS);\n const output = lastFrame();\n expect(output).toContain(\"3\");\n expect(output).toContain(\".claude/skills/\");\n });\n\n it(\"should show plugin count\", async () => {\n const { lastFrame, unmount } = renderStepSettings();\n cleanup = unmount;\n\n await delay(LOADING_SETTLE_MS);\n const output = lastFrame();\n expect(output).toContain(\"1\");\n expect(output).toContain(\"installed plugins\");\n });\n\n it(\"should show add source input area\", async () => {\n const { lastFrame, unmount } = renderStepSettings();\n cleanup = unmount;\n\n await delay(LOADING_SETTLE_MS);\n const output = lastFrame();\n expect(output).toContain(\"Add source\");\n });\n\n it(\"should show loading state initially\", () => {\n const { lastFrame, unmount } = renderStepSettings();\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Loading sources...\");\n });\n });\n\n describe(\"keyboard navigation\", () => {\n it(\"should navigate down with arrow down\", async () => {\n const { lastFrame, stdin, unmount } = renderStepSettings();\n cleanup = unmount;\n\n await delay(LOADING_SETTLE_MS);\n\n // Move focus down\n stdin.write(ARROW_DOWN);\n await delay(INPUT_DELAY_MS);\n\n const output = lastFrame();\n // The second source (acme-corp) should now be focused\n expect(output).toContain(\"acme-corp\");\n });\n\n it(\"should navigate up with arrow up\", async () => {\n const { lastFrame, stdin, unmount } = renderStepSettings();\n cleanup = unmount;\n\n await delay(LOADING_SETTLE_MS);\n\n // Move down then up\n stdin.write(ARROW_DOWN);\n await delay(INPUT_DELAY_MS);\n stdin.write(ARROW_UP);\n await delay(INPUT_DELAY_MS);\n\n const output = lastFrame();\n expect(output).toContain(\"Public\");\n });\n\n it(\"should not navigate above first item\", async () => {\n const { lastFrame, stdin, unmount } = renderStepSettings();\n cleanup = unmount;\n\n await delay(LOADING_SETTLE_MS);\n\n // Try to move up from first item\n stdin.write(ARROW_UP);\n await delay(INPUT_DELAY_MS);\n\n const output = lastFrame();\n expect(output).toContain(\"Public\");\n });\n });\n\n describe(\"escape to close\", () => {\n it(\"should call onClose when Escape is pressed\", async () => {\n const onClose = vi.fn();\n const { stdin, unmount } = renderStepSettings({ onClose });\n cleanup = unmount;\n\n await delay(LOADING_SETTLE_MS);\n stdin.write(ESCAPE);\n await delay(INPUT_DELAY_MS);\n\n expect(onClose).toHaveBeenCalledTimes(1);\n });\n });\n\n describe(\"add source input mode\", () => {\n it(\"should enter add source mode on 'a' key\", async () => {\n const { lastFrame, stdin, unmount } = renderStepSettings();\n cleanup = unmount;\n\n await delay(LOADING_SETTLE_MS);\n\n stdin.write(\"a\");\n await delay(INPUT_DELAY_MS);\n\n const output = lastFrame();\n // Should show cursor block character indicating input mode\n expect(output).toContain(\"\\u2588\");\n });\n\n it(\"should exit add source mode on Escape\", async () => {\n const onClose = vi.fn();\n const { lastFrame, stdin, unmount } = renderStepSettings({ onClose });\n cleanup = unmount;\n\n await delay(LOADING_SETTLE_MS);\n\n // Enter add mode\n stdin.write(\"a\");\n await delay(INPUT_DELAY_MS);\n\n // Escape from add mode (should NOT close settings)\n stdin.write(ESCAPE);\n await delay(INPUT_DELAY_MS);\n\n expect(onClose).not.toHaveBeenCalled();\n\n const output = lastFrame();\n // Should still show the settings view (ViewTitle removed, check content)\n expect(output).toContain(\"Configured marketplaces:\");\n });\n\n it(\"should show hint text for add mode\", async () => {\n const { lastFrame, stdin, unmount } = renderStepSettings();\n cleanup = unmount;\n\n await delay(LOADING_SETTLE_MS);\n\n stdin.write(\"a\");\n await delay(INPUT_DELAY_MS);\n\n const output = lastFrame();\n expect(output).toContain(\"ENTER submit\");\n expect(output).toContain(\"ESC cancel\");\n });\n\n it(\"should show hint text for normal mode\", async () => {\n const { lastFrame, unmount } = renderStepSettings();\n cleanup = unmount;\n\n await delay(LOADING_SETTLE_MS);\n\n const output = lastFrame();\n expect(output).toContain(\"DEL remove\");\n expect(output).toContain(\"close\");\n });\n });\n\n describe(\"edge cases\", () => {\n it(\"should handle empty sources list gracefully\", async () => {\n const { getSourceSummary } = await import(\"../../lib/configuration/source-manager.js\");\n vi.mocked(getSourceSummary).mockResolvedValue({\n sources: [{ name: \"public\", url: \"github:agents-inc/skills\", enabled: true }],\n localSkillCount: 0,\n pluginSkillCount: 0,\n });\n\n const { lastFrame, unmount } = renderStepSettings();\n cleanup = unmount;\n\n await delay(LOADING_SETTLE_MS);\n\n const output = lastFrame();\n expect(output).toContain(\"Public\");\n expect(output).toContain(\"0\");\n });\n\n it(\"should handle getSourceSummary failure gracefully\", async () => {\n const { getSourceSummary } = await import(\"../../lib/configuration/source-manager.js\");\n vi.mocked(getSourceSummary).mockRejectedValue(new Error(\"Config read failed\"));\n\n const { lastFrame, unmount } = renderStepSettings();\n cleanup = unmount;\n\n await delay(LOADING_SETTLE_MS);\n\n const output = lastFrame();\n // Should show fallback with default source\n expect(output).toContain(\"Public\");\n });\n });\n});\n"],"mappings":"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","names":[]}
@@ -1,21 +1,20 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  StepSources
4
- } from "../../chunk-KMLJCO5H.js";
4
+ } from "../../chunk-F4IZ3UAS.js";
5
5
  import "../../chunk-V36FRPAU.js";
6
6
  import "../../chunk-K77I4XGL.js";
7
7
  import "../../chunk-K63OEZW7.js";
8
- import "../../chunk-B66E255O.js";
8
+ import "../../chunk-D4T3HHE7.js";
9
9
  import "../../chunk-7SOPVGDV.js";
10
10
  import "../../chunk-A5JSBU65.js";
11
11
  import "../../chunk-P2FHS5IS.js";
12
- import "../../chunk-JNQKCZA3.js";
13
12
  import "../../chunk-FFMWFEUH.js";
14
13
  import "../../chunk-MLXAZODL.js";
15
14
  import "../../chunk-KUV24B5M.js";
16
- import "../../chunk-CY23HPDE.js";
15
+ import "../../chunk-N34D3ROY.js";
17
16
  import "../../chunk-HK53FRMU.js";
18
- import "../../chunk-CZLXZ75E.js";
17
+ import "../../chunk-OIHZ2YH3.js";
19
18
  import "../../chunk-IFCASC6R.js";
20
19
  import "../../chunk-FSK4TQX7.js";
21
20
  import "../../chunk-XYPAOBBV.js";
@@ -24,23 +24,22 @@ import {
24
24
  } from "../../chunk-XY3XDVMI.js";
25
25
  import {
26
26
  StepSources
27
- } from "../../chunk-KMLJCO5H.js";
27
+ } from "../../chunk-F4IZ3UAS.js";
28
28
  import "../../chunk-V36FRPAU.js";
29
29
  import "../../chunk-K77I4XGL.js";
30
30
  import "../../chunk-K63OEZW7.js";
31
- import "../../chunk-B66E255O.js";
31
+ import "../../chunk-D4T3HHE7.js";
32
32
  import "../../chunk-7SOPVGDV.js";
33
33
  import "../../chunk-A5JSBU65.js";
34
34
  import "../../chunk-P2FHS5IS.js";
35
- import "../../chunk-JNQKCZA3.js";
36
35
  import "../../chunk-FFMWFEUH.js";
37
36
  import "../../chunk-MLXAZODL.js";
38
37
  import "../../chunk-KUV24B5M.js";
39
38
  import {
40
39
  useWizardStore
41
- } from "../../chunk-CY23HPDE.js";
40
+ } from "../../chunk-N34D3ROY.js";
42
41
  import "../../chunk-HK53FRMU.js";
43
- import "../../chunk-CZLXZ75E.js";
42
+ import "../../chunk-OIHZ2YH3.js";
44
43
  import "../../chunk-IFCASC6R.js";
45
44
  import {
46
45
  initializeMatrix
@@ -109,12 +108,12 @@ describe("StepSources component", () => {
109
108
  await delay(INPUT_DELAY_MS);
110
109
  globalExpect(onBack).toHaveBeenCalledTimes(1);
111
110
  });
112
- it("should show ViewTitle in customize view", async () => {
111
+ it("should show source grid content in customize view", async () => {
113
112
  const { lastFrame, unmount } = renderStepSources();
114
113
  cleanup = unmount;
115
114
  await delay(RENDER_DELAY_MS);
116
115
  const output = lastFrame();
117
- globalExpect(output).toContain("Customize skill sources");
116
+ globalExpect(output).toContain("React");
118
117
  });
119
118
  });
120
119
  describe("edge cases", () => {
@@ -125,7 +124,7 @@ describe("StepSources component", () => {
125
124
  const { lastFrame, unmount } = renderStepSources();
126
125
  cleanup = unmount;
127
126
  const output = lastFrame();
128
- globalExpect(output).toContain("Customize skill sources");
127
+ globalExpect(output).toBeDefined();
129
128
  });
130
129
  it("should handle single technology", () => {
131
130
  useWizardStore.setState({
@@ -138,7 +137,6 @@ describe("StepSources component", () => {
138
137
  const { lastFrame, unmount } = renderStepSources();
139
138
  cleanup = unmount;
140
139
  const output = lastFrame();
141
- globalExpect(output).toContain("Customize skill sources");
142
140
  globalExpect(output).toContain("React");
143
141
  });
144
142
  it("should handle multiple Enter presses in customize view", async () => {
@@ -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 { initializeMatrix } from \"../../lib/matrix/matrix-provider\";\nimport {\n ENTER,\n ESCAPE,\n RENDER_DELAY_MS,\n INPUT_DELAY_MS,\n delay,\n} from \"../../lib/__tests__/test-constants\";\nimport { WEB_PAIR_MATRIX } from \"../../lib/__tests__/mock-data/mock-matrices\";\n\nconst mockMatrix = WEB_PAIR_MATRIX;\n\nconst defaultProps: StepSourcesProps = {\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 initializeMatrix(mockMatrix);\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\"],\n \"web-client-state\": [\"web-state-zustand\"],\n },\n },\n });\n });\n\n afterEach(() => {\n cleanup?.();\n cleanup = undefined;\n });\n\n describe(\"customize view\", () => {\n it(\"should show source grid with selected technologies\", async () => {\n const { lastFrame, unmount } = renderStepSources();\n cleanup = unmount;\n\n await delay(RENDER_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 // Press Enter to continue (starts directly in customize view)\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 in customize view\", async () => {\n const onBack = vi.fn();\n const { stdin, unmount } = renderStepSources({ onBack });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n // Press Escape (starts directly in customize view, goes back)\n stdin.write(ESCAPE);\n await delay(INPUT_DELAY_MS);\n\n expect(onBack).toHaveBeenCalledTimes(1);\n });\n\n it(\"should show ViewTitle in customize view\", async () => {\n const { lastFrame, unmount } = renderStepSources();\n cleanup = unmount;\n\n await delay(RENDER_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 // Should still render the customize view title\n expect(output).toContain(\"Customize skill sources\");\n });\n\n it(\"should handle single technology\", () => {\n useWizardStore.setState({\n domainSelections: {\n web: {\n \"web-framework\": [\"web-framework-react\"],\n },\n },\n });\n\n const { lastFrame, unmount } = renderStepSources();\n cleanup = unmount;\n\n const output = lastFrame();\n // Should show the single technology in the source grid\n expect(output).toContain(\"Customize skill sources\");\n expect(output).toContain(\"React\");\n });\n\n it(\"should handle multiple Enter presses 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 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"],"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 { initializeMatrix } from \"../../lib/matrix/matrix-provider\";\nimport {\n ENTER,\n ESCAPE,\n RENDER_DELAY_MS,\n INPUT_DELAY_MS,\n delay,\n} from \"../../lib/__tests__/test-constants\";\nimport { WEB_PAIR_MATRIX } from \"../../lib/__tests__/mock-data/mock-matrices\";\n\nconst mockMatrix = WEB_PAIR_MATRIX;\n\nconst defaultProps: StepSourcesProps = {\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 initializeMatrix(mockMatrix);\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\"],\n \"web-client-state\": [\"web-state-zustand\"],\n },\n },\n });\n });\n\n afterEach(() => {\n cleanup?.();\n cleanup = undefined;\n });\n\n describe(\"customize view\", () => {\n it(\"should show source grid with selected technologies\", async () => {\n const { lastFrame, unmount } = renderStepSources();\n cleanup = unmount;\n\n await delay(RENDER_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 // Press Enter to continue (starts directly in customize view)\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 in customize view\", async () => {\n const onBack = vi.fn();\n const { stdin, unmount } = renderStepSources({ onBack });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n // Press Escape (starts directly in customize view, goes back)\n stdin.write(ESCAPE);\n await delay(INPUT_DELAY_MS);\n\n expect(onBack).toHaveBeenCalledTimes(1);\n });\n\n it(\"should show source grid content in customize view\", async () => {\n const { lastFrame, unmount } = renderStepSources();\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n const output = lastFrame();\n // ViewTitle removed; verify source grid renders (title shown by wizard-layout)\n expect(output).toContain(\"React\");\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 // ViewTitle removed; source grid renders empty state\n expect(output).toBeDefined();\n });\n\n it(\"should handle single technology\", () => {\n useWizardStore.setState({\n domainSelections: {\n web: {\n \"web-framework\": [\"web-framework-react\"],\n },\n },\n });\n\n const { lastFrame, unmount } = renderStepSources();\n cleanup = unmount;\n\n const output = lastFrame();\n // ViewTitle removed; verify source grid shows the technology\n expect(output).toContain(\"React\");\n });\n\n it(\"should handle multiple Enter presses 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 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"],"mappings":"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","names":[]}
@@ -1,17 +1,16 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  StepStack
4
- } from "../../chunk-KB57OPUL.js";
5
- import "../../chunk-SGKNE6EJ.js";
4
+ } from "../../chunk-N2XGUAJU.js";
5
+ import "../../chunk-OOWNDQCG.js";
6
6
  import "../../chunk-K77I4XGL.js";
7
- import "../../chunk-AQ5KP4YW.js";
7
+ import "../../chunk-QD3GQ2CH.js";
8
8
  import "../../chunk-7JQIMEUX.js";
9
- import "../../chunk-ERHTXNIF.js";
9
+ import "../../chunk-RU5XLS5Q.js";
10
10
  import "../../chunk-SQ7WINEU.js";
11
- import "../../chunk-JNQKCZA3.js";
12
11
  import "../../chunk-FFMWFEUH.js";
13
- import "../../chunk-CY23HPDE.js";
14
- import "../../chunk-CZLXZ75E.js";
12
+ import "../../chunk-N34D3ROY.js";
13
+ import "../../chunk-OIHZ2YH3.js";
15
14
  import "../../chunk-IFCASC6R.js";
16
15
  import "../../chunk-FSK4TQX7.js";
17
16
  import "../../chunk-XYPAOBBV.js";
@@ -27,19 +27,18 @@ import {
27
27
  } from "../../chunk-XY3XDVMI.js";
28
28
  import {
29
29
  StepStack
30
- } from "../../chunk-KB57OPUL.js";
31
- import "../../chunk-SGKNE6EJ.js";
30
+ } from "../../chunk-N2XGUAJU.js";
31
+ import "../../chunk-OOWNDQCG.js";
32
32
  import "../../chunk-K77I4XGL.js";
33
- import "../../chunk-AQ5KP4YW.js";
33
+ import "../../chunk-QD3GQ2CH.js";
34
34
  import "../../chunk-7JQIMEUX.js";
35
- import "../../chunk-ERHTXNIF.js";
35
+ import "../../chunk-RU5XLS5Q.js";
36
36
  import "../../chunk-SQ7WINEU.js";
37
- import "../../chunk-JNQKCZA3.js";
38
37
  import "../../chunk-FFMWFEUH.js";
39
38
  import {
40
39
  useWizardStore
41
- } from "../../chunk-CY23HPDE.js";
42
- import "../../chunk-CZLXZ75E.js";
40
+ } from "../../chunk-N34D3ROY.js";
41
+ import "../../chunk-OIHZ2YH3.js";
43
42
  import "../../chunk-IFCASC6R.js";
44
43
  import {
45
44
  initializeMatrix
@@ -112,11 +111,12 @@ describe("StepStack component", () => {
112
111
  const output = lastFrame();
113
112
  globalExpect(output).toContain("Full React stack");
114
113
  });
115
- it("should render ViewTitle for stack selection", () => {
114
+ it("should render stack selection content (title rendered by wizard-layout)", () => {
116
115
  const { lastFrame, unmount } = render(/* @__PURE__ */ jsx(StepStack, {}));
117
116
  cleanup = unmount;
118
117
  const output = lastFrame();
119
- globalExpect(output).toContain("Choose a stack");
118
+ globalExpect(output).toContain("React Fullstack");
119
+ globalExpect(output).toContain("Start from scratch");
120
120
  });
121
121
  it("should render section structure with scratch option", () => {
122
122
  const { lastFrame, unmount } = render(/* @__PURE__ */ jsx(StepStack, {}));
@@ -137,7 +137,7 @@ describe("StepStack component", () => {
137
137
  globalExpect(approach).toBe("stack");
138
138
  globalExpect(selectedStackId).toBe("react-fullstack");
139
139
  const output = lastFrame();
140
- globalExpect(output).toContain("Select domains to configure");
140
+ globalExpect(output).toContain("Web");
141
141
  });
142
142
  it("should select second stack when navigated to", async () => {
143
143
  const { stdin, unmount } = render(/* @__PURE__ */ jsx(StepStack, {}));
@@ -166,7 +166,7 @@ describe("StepStack component", () => {
166
166
  globalExpect(approach).toBe("scratch");
167
167
  globalExpect(selectedStackId).toBeNull();
168
168
  const output = lastFrame();
169
- globalExpect(output).toContain("Select domains to configure");
169
+ globalExpect(output).toContain("Web");
170
170
  });
171
171
  it("should pre-select domains except CLI when scratch is chosen", async () => {
172
172
  const { stdin, unmount } = render(/* @__PURE__ */ jsx(StepStack, {}));
@@ -259,7 +259,6 @@ describe("StepStack component", () => {
259
259
  const { lastFrame, unmount } = render(/* @__PURE__ */ jsx(StepStack, {}));
260
260
  cleanup = unmount;
261
261
  const output = lastFrame();
262
- globalExpect(output).toContain("Choose a stack");
263
262
  globalExpect(output).toContain("Start from scratch");
264
263
  });
265
264
  });
@@ -277,11 +276,12 @@ describe("StepStack component", () => {
277
276
  globalExpect(output).toContain("API");
278
277
  globalExpect(output).toContain("CLI");
279
278
  });
280
- it("should render header text for domain selection", () => {
279
+ it("should render domain options in selection view", () => {
281
280
  const { lastFrame, unmount } = render(/* @__PURE__ */ jsx(StepStack, {}));
282
281
  cleanup = unmount;
283
282
  const output = lastFrame();
284
- globalExpect(output).toContain("Select domains to configure");
283
+ globalExpect(output).toContain("Web");
284
+ globalExpect(output).toContain("API");
285
285
  });
286
286
  it("should show domain descriptions", () => {
287
287
  const { lastFrame, unmount } = render(/* @__PURE__ */ jsx(StepStack, {}));
@@ -345,7 +345,8 @@ describe("StepStack component", () => {
345
345
  const { approach } = useWizardStore.getState();
346
346
  globalExpect(approach).toBeNull();
347
347
  const output = lastFrame();
348
- globalExpect(output).toContain("Choose a stack");
348
+ globalExpect(output).toContain("React Fullstack");
349
+ globalExpect(output).toContain("Start from scratch");
349
350
  });
350
351
  });
351
352
  });
@@ -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 { initializeMatrix } from \"../../lib/matrix/matrix-provider\";\nimport { createMockMatrix, createMockResolvedStack, SKILLS } from \"../../lib/__tests__/helpers\";\nimport { TEST_CATEGORIES } from \"../../lib/__tests__/test-fixtures\";\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 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 allSkillIds: [\"web-framework-react\"],\n }),\n ];\n\n return createMockMatrix(SKILLS.react, SKILLS.zustand, SKILLS.hono, {\n suggestedStacks,\n categories: {\n \"web-framework\": { ...TEST_CATEGORIES.framework, domain: \"web\" as const, exclusive: false },\n \"api-api\": { ...TEST_CATEGORIES.api, domain: \"api\" as const, exclusive: false, order: 1 },\n \"cli-framework\": {\n ...TEST_CATEGORIES.cliFramework,\n domain: \"cli\" as const,\n exclusive: false,\n order: 2,\n },\n \"mobile-framework\": {\n ...TEST_CATEGORIES.mobileFramework,\n domain: \"mobile\" as const,\n exclusive: false,\n order: 3,\n },\n },\n });\n};\n\ndescribe(\"StepStack component\", () => {\n let cleanup: (() => void) | undefined;\n let mockMatrix: MergedSkillsMatrix;\n\n beforeEach(() => {\n mockMatrix = createMockStackWithSkills();\n initializeMatrix(mockMatrix);\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 />);\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 />);\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 />);\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Choose a stack\");\n });\n\n it(\"should render section structure with scratch option\", () => {\n const { lastFrame, unmount } = render(<StepStack />);\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Start from scratch\");\n expect(output).toContain(\"Select domains and skills manually\");\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 />);\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 />);\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 />);\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 />);\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 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 />);\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 />);\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 wrap to last item when pressing up from first item\", async () => {\n const { stdin, unmount } = render(<StepStack />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n // From index 0, UP wraps to scratch (index 2), UP again goes to react-minimal (index 1)\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-minimal\");\n });\n\n it(\"should wrap to first item when pressing down past last item\", async () => {\n const { stdin, unmount } = render(<StepStack />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n // From index 0, DOWN x4: 0->1->2->0->1 (react-minimal)\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 { selectedStackId } = useWizardStore.getState();\n expect(selectedStackId).toBe(\"react-minimal\");\n });\n });\n\n describe(\"empty state\", () => {\n it(\"should still show scratch option with no stacks available\", () => {\n const emptyMatrix = createMockMatrix({}, { suggestedStacks: [] });\n initializeMatrix(emptyMatrix);\n\n const { lastFrame, unmount } = render(<StepStack />);\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 />);\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 />);\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 />);\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 />);\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 />);\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 />);\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 />);\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 />);\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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAoE8C;AAjD9C,IAAM,4BAA4B,MAA0B;AAC1D,QAAM,kBAAkB;AAAA,IACtB,wBAAwB,mBAAmB,mBAAmB;AAAA,MAC5D,aAAa;AAAA,MACb,aAAa,CAAC,uBAAuB,qBAAqB,oBAAoB;AAAA,IAChF,CAAC;AAAA,IACD,wBAAwB,iBAAiB,iBAAiB;AAAA,MACxD,aAAa,CAAC,qBAAqB;AAAA,IACrC,CAAC;AAAA,EACH;AAEA,SAAO,iBAAiB,OAAO,OAAO,OAAO,SAAS,OAAO,MAAM;AAAA,IACjE;AAAA,IACA,YAAY;AAAA,MACV,iBAAiB,EAAE,GAAG,gBAAgB,WAAW,QAAQ,OAAgB,WAAW,MAAM;AAAA,MAC1F,WAAW,EAAE,GAAG,gBAAgB,KAAK,QAAQ,OAAgB,WAAW,OAAO,OAAO,EAAE;AAAA,MACxF,iBAAiB;AAAA,QACf,GAAG,gBAAgB;AAAA,QACnB,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,OAAO;AAAA,MACT;AAAA,MACA,oBAAoB;AAAA,QAClB,GAAG,gBAAgB;AAAA,QACnB,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,OAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAEA,SAAS,uBAAuB,MAAM;AACpC,MAAI;AACJ,MAAI;AAEJ,aAAW,MAAM;AACf,iBAAa,0BAA0B;AACvC,qBAAiB,UAAU;AAAA,EAC7B,CAAC;AAED,YAAU,MAAM;AACd,cAAU;AACV,cAAU;AAAA,EACZ,CAAC;AAED,WAAS,kDAAkD,MAAM;AAC/D,aAAS,aAAa,MAAM;AAC1B,SAAG,kDAAkD,MAAM;AACzD,cAAM,EAAE,WAAW,QAAQ,IAAI,OAAO,oBAAC,aAAU,CAAE;AACnD,kBAAU;AAEV,cAAM,SAAS,UAAU;AACzB,qBAAO,MAAM,EAAE,UAAU,iBAAiB;AAC1C,qBAAO,MAAM,EAAE,UAAU,eAAe;AACxC,qBAAO,MAAM,EAAE,UAAU,oBAAoB;AAAA,MAC/C,CAAC;AAED,SAAG,iFAAiF,MAAM;AACxF,cAAM,EAAE,WAAW,QAAQ,IAAI,OAAO,oBAAC,aAAU,CAAE;AACnD,kBAAU;AAEV,cAAM,SAAS,UAAU;AACzB,qBAAO,MAAM,EAAE,UAAU,kBAAkB;AAAA,MAC7C,CAAC;AAED,SAAG,+CAA+C,MAAM;AACtD,cAAM,EAAE,WAAW,QAAQ,IAAI,OAAO,oBAAC,aAAU,CAAE;AACnD,kBAAU;AAEV,cAAM,SAAS,UAAU;AACzB,qBAAO,MAAM,EAAE,UAAU,gBAAgB;AAAA,MAC3C,CAAC;AAED,SAAG,uDAAuD,MAAM;AAC9D,cAAM,EAAE,WAAW,QAAQ,IAAI,OAAO,oBAAC,aAAU,CAAE;AACnD,kBAAU;AAEV,cAAM,SAAS,UAAU;AACzB,qBAAO,MAAM,EAAE,UAAU,oBAAoB;AAC7C,qBAAO,MAAM,EAAE,UAAU,oCAAoC;AAAA,MAC/D,CAAC;AAAA,IACH,CAAC;AAED,aAAS,mBAAmB,MAAM;AAChC,SAAG,gEAAgE,YAAY;AAC7E,cAAM,EAAE,OAAO,WAAW,QAAQ,IAAI,OAAO,oBAAC,aAAU,CAAE;AAC1D,kBAAU;AAEV,cAAM,MAAM,eAAe;AAE3B,cAAM,MAAM,KAAK;AACjB,cAAM,MAAM,mBAAmB;AAE/B,cAAM,EAAE,UAAU,gBAAgB,IAAI,eAAe,SAAS;AAC9D,qBAAO,QAAQ,EAAE,KAAK,OAAO;AAC7B,qBAAO,eAAe,EAAE,KAAK,iBAAiB;AAE9C,cAAM,SAAS,UAAU;AACzB,qBAAO,MAAM,EAAE,UAAU,6BAA6B;AAAA,MACxD,CAAC;AAED,SAAG,gDAAgD,YAAY;AAC7D,cAAM,EAAE,OAAO,QAAQ,IAAI,OAAO,oBAAC,aAAU,CAAE;AAC/C,kBAAU;AAEV,cAAM,MAAM,eAAe;AAE3B,cAAM,MAAM,UAAU;AACtB,cAAM,MAAM,mBAAmB;AAC/B,cAAM,MAAM,KAAK;AACjB,cAAM,MAAM,mBAAmB;AAE/B,cAAM,EAAE,gBAAgB,IAAI,eAAe,SAAS;AACpD,qBAAO,eAAe,EAAE,KAAK,eAAe;AAAA,MAC9C,CAAC;AAAA,IACH,CAAC;AAED,aAAS,qBAAqB,MAAM;AAClC,SAAG,yDAAyD,YAAY;AACtE,cAAM,EAAE,OAAO,WAAW,QAAQ,IAAI,OAAO,oBAAC,aAAU,CAAE;AAC1D,kBAAU;AAEV,cAAM,MAAM,eAAe;AAE3B,cAAM,MAAM,UAAU;AACtB,cAAM,MAAM,mBAAmB;AAC/B,cAAM,MAAM,UAAU;AACtB,cAAM,MAAM,mBAAmB;AAC/B,cAAM,MAAM,KAAK;AACjB,cAAM,MAAM,mBAAmB;AAE/B,cAAM,EAAE,UAAU,gBAAgB,IAAI,eAAe,SAAS;AAC9D,qBAAO,QAAQ,EAAE,KAAK,SAAS;AAC/B,qBAAO,eAAe,EAAE,SAAS;AAEjC,cAAM,SAAS,UAAU;AACzB,qBAAO,MAAM,EAAE,UAAU,6BAA6B;AAAA,MACxD,CAAC;AAED,SAAG,+DAA+D,YAAY;AAC5E,cAAM,EAAE,OAAO,QAAQ,IAAI,OAAO,oBAAC,aAAU,CAAE;AAC/C,kBAAU;AAEV,cAAM,MAAM,eAAe;AAE3B,cAAM,MAAM,UAAU;AACtB,cAAM,MAAM,mBAAmB;AAC/B,cAAM,MAAM,UAAU;AACtB,cAAM,MAAM,mBAAmB;AAC/B,cAAM,MAAM,KAAK;AACjB,cAAM,MAAM,mBAAmB;AAE/B,cAAM,EAAE,gBAAgB,IAAI,eAAe,SAAS;AACpD,qBAAO,eAAe,EAAE,UAAU,KAAK;AACvC,qBAAO,eAAe,EAAE,UAAU,KAAK;AACvC,qBAAO,eAAe,EAAE,UAAU,QAAQ;AAC1C,qBAAO,eAAe,EAAE,IAAI,UAAU,KAAK;AAAA,MAC7C,CAAC;AAAA,IACH,CAAC;AAED,aAAS,qBAAqB,MAAM;AAClC,SAAG,6DAA6D,YAAY;AAC1E,cAAM,WAAW,GAAG,GAAG;AACvB,cAAM,EAAE,OAAO,QAAQ,IAAI,OAAO,oBAAC,aAAU,UAAoB,CAAE;AACnE,kBAAU;AAEV,cAAM,MAAM,eAAe;AAE3B,cAAM,MAAM,MAAM;AAClB,cAAM,MAAM,mBAAmB;AAE/B,qBAAO,QAAQ,EAAE,sBAAsB,CAAC;AAAA,MAC1C,CAAC;AAAA,IACH,CAAC;AAED,aAAS,wBAAwB,MAAM;AACrC,SAAG,6CAA6C,YAAY;AAC1D,cAAM,EAAE,OAAO,QAAQ,IAAI,OAAO,oBAAC,aAAU,CAAE;AAC/C,kBAAU;AAEV,cAAM,MAAM,eAAe;AAE3B,cAAM,MAAM,UAAU;AACtB,cAAM,MAAM,mBAAmB;AAC/B,cAAM,MAAM,KAAK;AACjB,cAAM,MAAM,mBAAmB;AAE/B,cAAM,EAAE,gBAAgB,IAAI,eAAe,SAAS;AACpD,qBAAO,eAAe,EAAE,KAAK,eAAe;AAAA,MAC9C,CAAC;AAED,SAAG,oDAAoD,YAAY;AACjE,cAAM,EAAE,OAAO,QAAQ,IAAI,OAAO,oBAAC,aAAU,CAAE;AAC/C,kBAAU;AAEV,cAAM,MAAM,eAAe;AAE3B,cAAM,MAAM,UAAU;AACtB,cAAM,MAAM,mBAAmB;AAC/B,cAAM,MAAM,QAAQ;AACpB,cAAM,MAAM,mBAAmB;AAC/B,cAAM,MAAM,KAAK;AACjB,cAAM,MAAM,mBAAmB;AAE/B,cAAM,EAAE,gBAAgB,IAAI,eAAe,SAAS;AACpD,qBAAO,eAAe,EAAE,KAAK,iBAAiB;AAAA,MAChD,CAAC;AAED,SAAG,6DAA6D,YAAY;AAC1E,cAAM,EAAE,OAAO,QAAQ,IAAI,OAAO,oBAAC,aAAU,CAAE;AAC/C,kBAAU;AAEV,cAAM,MAAM,eAAe;AAG3B,cAAM,MAAM,QAAQ;AACpB,cAAM,MAAM,mBAAmB;AAC/B,cAAM,MAAM,QAAQ;AACpB,cAAM,MAAM,mBAAmB;AAC/B,cAAM,MAAM,KAAK;AACjB,cAAM,MAAM,mBAAmB;AAE/B,cAAM,EAAE,gBAAgB,IAAI,eAAe,SAAS;AACpD,qBAAO,eAAe,EAAE,KAAK,eAAe;AAAA,MAC9C,CAAC;AAED,SAAG,+DAA+D,YAAY;AAC5E,cAAM,EAAE,OAAO,QAAQ,IAAI,OAAO,oBAAC,aAAU,CAAE;AAC/C,kBAAU;AAEV,cAAM,MAAM,eAAe;AAG3B,cAAM,MAAM,UAAU;AACtB,cAAM,MAAM,mBAAmB;AAC/B,cAAM,MAAM,UAAU;AACtB,cAAM,MAAM,mBAAmB;AAC/B,cAAM,MAAM,UAAU;AACtB,cAAM,MAAM,mBAAmB;AAC/B,cAAM,MAAM,UAAU;AACtB,cAAM,MAAM,mBAAmB;AAC/B,cAAM,MAAM,KAAK;AACjB,cAAM,MAAM,mBAAmB;AAE/B,cAAM,EAAE,gBAAgB,IAAI,eAAe,SAAS;AACpD,qBAAO,eAAe,EAAE,KAAK,eAAe;AAAA,MAC9C,CAAC;AAAA,IACH,CAAC;AAED,aAAS,eAAe,MAAM;AAC5B,SAAG,6DAA6D,MAAM;AACpE,cAAM,cAAc,iBAAiB,CAAC,GAAG,EAAE,iBAAiB,CAAC,EAAE,CAAC;AAChE,yBAAiB,WAAW;AAE5B,cAAM,EAAE,WAAW,QAAQ,IAAI,OAAO,oBAAC,aAAU,CAAE;AACnD,kBAAU;AAEV,cAAM,SAAS,UAAU;AACzB,qBAAO,MAAM,EAAE,UAAU,gBAAgB;AACzC,qBAAO,MAAM,EAAE,UAAU,oBAAoB;AAAA,MAC/C,CAAC;AAAA,IACH,CAAC;AAAA,EACH,CAAC;AAED,WAAS,sDAAsD,MAAM;AACnE,eAAW,MAAM;AACf,qBAAe,SAAS,EAAE,YAAY,SAAS;AAAA,IACjD,CAAC;AAED,aAAS,aAAa,MAAM;AAC1B,SAAG,gCAAgC,MAAM;AACvC,cAAM,EAAE,WAAW,QAAQ,IAAI,OAAO,oBAAC,aAAU,CAAE;AACnD,kBAAU;AAEV,cAAM,SAAS,UAAU;AACzB,qBAAO,MAAM,EAAE,UAAU,KAAK;AAC9B,qBAAO,MAAM,EAAE,UAAU,KAAK;AAC9B,qBAAO,MAAM,EAAE,UAAU,KAAK;AAAA,MAChC,CAAC;AAED,SAAG,kDAAkD,MAAM;AACzD,cAAM,EAAE,WAAW,QAAQ,IAAI,OAAO,oBAAC,aAAU,CAAE;AACnD,kBAAU;AAEV,cAAM,SAAS,UAAU;AACzB,qBAAO,MAAM,EAAE,UAAU,6BAA6B;AAAA,MACxD,CAAC;AAED,SAAG,mCAAmC,MAAM;AAC1C,cAAM,EAAE,WAAW,QAAQ,IAAI,OAAO,oBAAC,aAAU,CAAE;AACnD,kBAAU;AAEV,cAAM,SAAS,UAAU;AAEzB,qBAAO,MAAM,EAAE,UAAU,2BAA2B;AAAA,MACtD,CAAC;AAAA,IACH,CAAC;AAED,aAAS,oBAAoB,MAAM;AACjC,SAAG,sCAAsC,YAAY;AACnD,cAAM,EAAE,OAAO,QAAQ,IAAI,OAAO,oBAAC,aAAU,CAAE;AAC/C,kBAAU;AAEV,cAAM,MAAM,eAAe;AAG3B,cAAM,MAAM,GAAG;AACf,cAAM,MAAM,mBAAmB;AAE/B,cAAM,EAAE,gBAAgB,IAAI,eAAe,SAAS;AACpD,qBAAO,eAAe,EAAE,UAAU,KAAK;AAAA,MACzC,CAAC;AAED,SAAG,0CAA0C,YAAY;AACvD,cAAM,EAAE,OAAO,QAAQ,IAAI,OAAO,oBAAC,aAAU,CAAE;AAC/C,kBAAU;AAEV,cAAM,MAAM,eAAe;AAG3B,cAAM,MAAM,GAAG;AACf,cAAM,MAAM,mBAAmB;AAE/B,qBAAO,eAAe,SAAS,EAAE,eAAe,EAAE,UAAU,KAAK;AAEjE,uBAAe,SAAS,EAAE,aAAa,KAAK;AAE5C,cAAM,EAAE,gBAAgB,IAAI,eAAe,SAAS;AACpD,qBAAO,eAAe,EAAE,UAAU,KAAK;AACvC,qBAAO,eAAe,EAAE,UAAU,KAAK;AAAA,MACzC,CAAC;AAED,SAAG,8DAA8D,YAAY;AAC3E,uBAAe,SAAS,EAAE,aAAa,KAAK;AAE5C,cAAM,EAAE,WAAW,QAAQ,IAAI,OAAO,oBAAC,aAAU,CAAE;AACnD,kBAAU;AAEV,cAAM,SAAS,UAAU;AACzB,qBAAO,MAAM,EAAE,UAAU,WAAW;AACpC,qBAAO,MAAM,EAAE,UAAU,KAAK;AAAA,MAChC,CAAC;AAED,SAAG,iDAAiD,YAAY;AAC9D,uBAAe,SAAS,EAAE,aAAa,KAAK;AAE5C,cAAM,EAAE,OAAO,QAAQ,IAAI,OAAO,oBAAC,aAAU,CAAE;AAC/C,kBAAU;AAEV,cAAM,MAAM,eAAe;AAG3B,iBAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,gBAAM,MAAM,UAAU;AACtB,gBAAM,MAAM,mBAAmB;AAAA,QACjC;AACA,cAAM,MAAM,KAAK;AACjB,cAAM,MAAM,mBAAmB;AAE/B,cAAM,EAAE,KAAK,IAAI,eAAe,SAAS;AACzC,qBAAO,IAAI,EAAE,KAAK,OAAO;AAAA,MAC3B,CAAC;AAAA,IACH,CAAC;AAED,aAAS,mBAAmB,MAAM;AAChC,SAAG,8DAA8D,YAAY;AAC3E,cAAM,EAAE,OAAO,WAAW,QAAQ,IAAI,OAAO,oBAAC,aAAU,CAAE;AAC1D,kBAAU;AAEV,cAAM,MAAM,eAAe;AAE3B,cAAM,MAAM,MAAM;AAClB,cAAM,MAAM,mBAAmB;AAE/B,cAAM,EAAE,SAAS,IAAI,eAAe,SAAS;AAC7C,qBAAO,QAAQ,EAAE,SAAS;AAE1B,cAAM,SAAS,UAAU;AACzB,qBAAO,MAAM,EAAE,UAAU,gBAAgB;AAAA,MAC3C,CAAC;AAAA,IACH,CAAC;AAAA,EACH,CAAC;AACH,CAAC;","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 { initializeMatrix } from \"../../lib/matrix/matrix-provider\";\nimport { createMockMatrix, createMockResolvedStack, SKILLS } from \"../../lib/__tests__/helpers\";\nimport { TEST_CATEGORIES } from \"../../lib/__tests__/test-fixtures\";\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 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 allSkillIds: [\"web-framework-react\"],\n }),\n ];\n\n return createMockMatrix(SKILLS.react, SKILLS.zustand, SKILLS.hono, {\n suggestedStacks,\n categories: {\n \"web-framework\": { ...TEST_CATEGORIES.framework, domain: \"web\" as const, exclusive: false },\n \"api-api\": { ...TEST_CATEGORIES.api, domain: \"api\" as const, exclusive: false, order: 1 },\n \"cli-framework\": {\n ...TEST_CATEGORIES.cliFramework,\n domain: \"cli\" as const,\n exclusive: false,\n order: 2,\n },\n \"mobile-framework\": {\n ...TEST_CATEGORIES.mobileFramework,\n domain: \"mobile\" as const,\n exclusive: false,\n order: 3,\n },\n },\n });\n};\n\ndescribe(\"StepStack component\", () => {\n let cleanup: (() => void) | undefined;\n let mockMatrix: MergedSkillsMatrix;\n\n beforeEach(() => {\n mockMatrix = createMockStackWithSkills();\n initializeMatrix(mockMatrix);\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 />);\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 />);\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Full React stack\");\n });\n\n it(\"should render stack selection content (title rendered by wizard-layout)\", () => {\n const { lastFrame, unmount } = render(<StepStack />);\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"React Fullstack\");\n expect(output).toContain(\"Start from scratch\");\n });\n\n it(\"should render section structure with scratch option\", () => {\n const { lastFrame, unmount } = render(<StepStack />);\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Start from scratch\");\n expect(output).toContain(\"Select domains and skills manually\");\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 />);\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 // Domain selection content is now rendered (title handled by wizard-layout)\n expect(output).toContain(\"Web\");\n });\n\n it(\"should select second stack when navigated to\", async () => {\n const { stdin, unmount } = render(<StepStack />);\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 />);\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 // Domain selection content is now rendered (title handled by wizard-layout)\n expect(output).toContain(\"Web\");\n });\n\n it(\"should pre-select domains except CLI when scratch is chosen\", async () => {\n const { stdin, unmount } = render(<StepStack />);\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 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 />);\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 />);\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 wrap to last item when pressing up from first item\", async () => {\n const { stdin, unmount } = render(<StepStack />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n // From index 0, UP wraps to scratch (index 2), UP again goes to react-minimal (index 1)\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-minimal\");\n });\n\n it(\"should wrap to first item when pressing down past last item\", async () => {\n const { stdin, unmount } = render(<StepStack />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n // From index 0, DOWN x4: 0->1->2->0->1 (react-minimal)\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 { selectedStackId } = useWizardStore.getState();\n expect(selectedStackId).toBe(\"react-minimal\");\n });\n });\n\n describe(\"empty state\", () => {\n it(\"should still show scratch option with no stacks available\", () => {\n const emptyMatrix = createMockMatrix({}, { suggestedStacks: [] });\n initializeMatrix(emptyMatrix);\n\n const { lastFrame, unmount } = render(<StepStack />);\n cleanup = unmount;\n\n const output = lastFrame();\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 />);\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 domain options in selection view\", () => {\n const { lastFrame, unmount } = render(<StepStack />);\n cleanup = unmount;\n\n const output = lastFrame();\n // Domain items are shown directly (title rendered by wizard-layout)\n expect(output).toContain(\"Web\");\n expect(output).toContain(\"API\");\n });\n\n it(\"should show domain descriptions\", () => {\n const { lastFrame, unmount } = render(<StepStack />);\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 />);\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 />);\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 />);\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 />);\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 />);\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 // Back to stack selection view (title rendered by wizard-layout)\n expect(output).toContain(\"React Fullstack\");\n expect(output).toContain(\"Start from scratch\");\n });\n });\n });\n});\n"],"mappings":"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","names":[]}
@@ -1,8 +1,26 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
- ViewTitle
4
- } from "../../chunk-JNQKCZA3.js";
5
- import "../../chunk-DHET7RCE.js";
3
+ init_esm_shims
4
+ } from "../../chunk-DHET7RCE.js";
5
+
6
+ // src/cli/components/wizard/view-title.tsx
7
+ init_esm_shims();
8
+ import { Box, Text } from "ink";
9
+ import { jsx, jsxs } from "react/jsx-runtime";
10
+ var TITLE_HORIZONTAL_PADDING = 6;
11
+ var ViewTitle = ({ children }) => {
12
+ const padding = " ".repeat(children.length + TITLE_HORIZONTAL_PADDING);
13
+ const paddingHalf = " ".repeat(TITLE_HORIZONTAL_PADDING / 2);
14
+ return /* @__PURE__ */ jsxs(Box, { marginBottom: 2, flexDirection: "column", children: [
15
+ /* @__PURE__ */ jsx(Text, { backgroundColor: "#eee", children: padding }),
16
+ /* @__PURE__ */ jsxs(Text, { bold: true, backgroundColor: "#eee", color: "#000", children: [
17
+ paddingHalf,
18
+ children,
19
+ paddingHalf
20
+ ] }),
21
+ /* @__PURE__ */ jsx(Text, { backgroundColor: "#eee", children: padding })
22
+ ] });
23
+ };
6
24
  export {
7
25
  ViewTitle
8
26
  };
@@ -1 +1 @@
1
- {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
1
+ {"version":3,"sources":["../../../src/cli/components/wizard/view-title.tsx"],"sourcesContent":["import { Box, Text } from \"ink\";\nimport React from \"react\";\n\nconst TITLE_HORIZONTAL_PADDING = 6;\n\ntype ViewTitleProps = {\n children: string;\n};\n\nexport const ViewTitle: React.FC<ViewTitleProps> = ({ children }) => {\n const padding = \" \".repeat(children.length + TITLE_HORIZONTAL_PADDING);\n const paddingHalf = \" \".repeat(TITLE_HORIZONTAL_PADDING / 2);\n\n return (\n <Box marginBottom={2} flexDirection=\"column\">\n <Text backgroundColor={\"#eee\"}>{padding}</Text>\n <Text bold backgroundColor={\"#eee\"} color={\"#000\"}>\n {paddingHalf}\n {children}\n {paddingHalf}\n </Text>\n <Text backgroundColor={\"#eee\"}>{padding}</Text>\n </Box>\n );\n};\n"],"mappings":";;;;;;AAAA;AAAA,SAAS,KAAK,YAAY;AAepB,cACA,YADA;AAZN,IAAM,2BAA2B;AAM1B,IAAM,YAAsC,CAAC,EAAE,SAAS,MAAM;AACnE,QAAM,UAAU,IAAI,OAAO,SAAS,SAAS,wBAAwB;AACrE,QAAM,cAAc,IAAI,OAAO,2BAA2B,CAAC;AAE3D,SACE,qBAAC,OAAI,cAAc,GAAG,eAAc,UAClC;AAAA,wBAAC,QAAK,iBAAiB,QAAS,mBAAQ;AAAA,IACxC,qBAAC,QAAK,MAAI,MAAC,iBAAiB,QAAQ,OAAO,QACxC;AAAA;AAAA,MACA;AAAA,MACA;AAAA,OACH;AAAA,IACA,oBAAC,QAAK,iBAAiB,QAAS,mBAAQ;AAAA,KAC1C;AAEJ;","names":[]}
@@ -1,13 +1,14 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  WizardLayout
4
- } from "../../chunk-5DDHCCEB.js";
5
- import "../../chunk-2I5SXGXR.js";
4
+ } from "../../chunk-VDVLM3KB.js";
5
+ import "../../chunk-KQDGLEBF.js";
6
6
  import "../../chunk-V36FRPAU.js";
7
+ import "../../chunk-7JQIMEUX.js";
7
8
  import "../../chunk-C22ACAL2.js";
8
- import "../../chunk-CY23HPDE.js";
9
+ import "../../chunk-N34D3ROY.js";
9
10
  import "../../chunk-HK53FRMU.js";
10
- import "../../chunk-CZLXZ75E.js";
11
+ import "../../chunk-OIHZ2YH3.js";
11
12
  import "../../chunk-IFCASC6R.js";
12
13
  import "../../chunk-FSK4TQX7.js";
13
14
  import "../../chunk-XYPAOBBV.js";
@@ -3,7 +3,7 @@ import {
3
3
  WIZARD_STEPS,
4
4
  WizardTabs,
5
5
  formatStepLabel
6
- } from "../../chunk-2I5SXGXR.js";
6
+ } from "../../chunk-KQDGLEBF.js";
7
7
  import "../../chunk-FMYAYX6W.js";
8
8
  import "../../chunk-DHET7RCE.js";
9
9
  export {
@@ -12,7 +12,7 @@ import {
12
12
  WIZARD_STEPS,
13
13
  WizardTabs,
14
14
  formatStepLabel
15
- } from "../../chunk-2I5SXGXR.js";
15
+ } from "../../chunk-KQDGLEBF.js";
16
16
  import "../../chunk-FMYAYX6W.js";
17
17
  import {
18
18
  init_esm_shims