@agents-inc/cli 0.79.0 → 0.80.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.
- package/CHANGELOG.md +12 -0
- package/README.md +2 -2
- package/dist/{chunk-XA7WF3BI.js → chunk-3C6AXGR7.js} +3 -3
- package/dist/{chunk-VDVLM3KB.js → chunk-3HWFTE3S.js} +8 -4
- package/dist/chunk-3HWFTE3S.js.map +1 -0
- package/dist/{chunk-7JQIMEUX.js → chunk-3SCIYMRK.js} +3 -3
- package/dist/{chunk-OOWNDQCG.js → chunk-3WDZKBCE.js} +6 -4
- package/dist/chunk-3WDZKBCE.js.map +1 -0
- package/dist/{chunk-FSK4TQX7.js → chunk-4R6I6A3U.js} +3225 -134
- package/dist/chunk-4R6I6A3U.js.map +1 -0
- package/dist/{chunk-MUCQ27HV.js → chunk-4R72372U.js} +2 -2
- package/dist/{chunk-Q755X6QF.js → chunk-4VFBRV76.js} +4 -4
- package/dist/{chunk-F4IZ3UAS.js → chunk-55AZIEK6.js} +4 -4
- package/dist/{chunk-XYPAOBBV.js → chunk-633YIZOU.js} +2 -2
- package/dist/{chunk-N2XGUAJU.js → chunk-6YJXWQCI.js} +2 -12
- package/dist/chunk-6YJXWQCI.js.map +1 -0
- package/dist/{chunk-32HX6UYI.js → chunk-BN73X3JN.js} +59 -2
- package/dist/chunk-BN73X3JN.js.map +1 -0
- package/dist/{chunk-B4C2S5LP.js → chunk-BORVYGIX.js} +17 -15
- package/dist/chunk-BORVYGIX.js.map +1 -0
- package/dist/{chunk-YFHVP3VA.js → chunk-F4VG5XWZ.js} +3 -3
- package/dist/{chunk-NKLNT7N7.js → chunk-H3NQGJMB.js} +2 -2
- package/dist/{chunk-QD3GQ2CH.js → chunk-II3ISVCE.js} +6 -5
- package/dist/chunk-II3ISVCE.js.map +1 -0
- package/dist/{chunk-FUWUCKES.js → chunk-LO4X32JC.js} +2 -2
- package/dist/{chunk-D4T3HHE7.js → chunk-MNJAF4K2.js} +2 -2
- package/dist/{chunk-KVRR4PEJ.js → chunk-NJCU7OC2.js} +5 -5
- package/dist/{chunk-U2KFFRRX.js → chunk-NZAJTLEK.js} +2 -2
- package/dist/{chunk-HANGA633.js → chunk-OBTC2FD7.js} +5 -5
- package/dist/chunk-OBTC2FD7.js.map +1 -0
- package/dist/{chunk-EO6KJI5D.js → chunk-PPBUSAKG.js} +913 -33
- package/dist/chunk-PPBUSAKG.js.map +1 -0
- package/dist/{chunk-OTMIGYBB.js → chunk-RTHAMTDE.js} +6 -6
- package/dist/{chunk-KQDGLEBF.js → chunk-TJXBRYM4.js} +10 -10
- package/dist/chunk-TJXBRYM4.js.map +1 -0
- package/dist/{chunk-7LBYURQR.js → chunk-TQ363UUH.js} +2 -2
- package/dist/{chunk-N34D3ROY.js → chunk-TXFQBYOX.js} +8 -5
- package/dist/chunk-TXFQBYOX.js.map +1 -0
- package/dist/{chunk-IFCASC6R.js → chunk-TZY7WNWO.js} +2 -2
- package/dist/{chunk-SJNUTUSJ.js → chunk-W6PIVGMH.js} +5 -5
- package/dist/{chunk-W46L2PXK.js → chunk-WZGROC5L.js} +2 -2
- package/dist/{chunk-OIHZ2YH3.js → chunk-XFL7EIM7.js} +7 -7
- package/dist/{chunk-7HGMFJ4Y.js → chunk-YDB5KXMG.js} +3 -3
- package/dist/commands/build/marketplace.js +4 -4
- package/dist/commands/build/plugins.js +8 -8
- package/dist/commands/build/stack.js +8 -8
- package/dist/commands/compile.js +8 -8
- package/dist/commands/config/index.js +8 -8
- package/dist/commands/config/path.js +7 -7
- package/dist/commands/config/show.js +8 -8
- package/dist/commands/diff.js +7 -7
- package/dist/commands/doctor.js +7 -7
- package/dist/commands/edit.js +23 -23
- package/dist/commands/eject.js +7 -7
- package/dist/commands/import/skill.js +7 -7
- package/dist/commands/info.js +7 -7
- package/dist/commands/init.js +23 -23
- package/dist/commands/list.js +7 -7
- package/dist/commands/new/agent.js +8 -8
- package/dist/commands/new/marketplace.js +9 -9
- package/dist/commands/new/skill.js +8 -8
- package/dist/commands/outdated.js +7 -7
- package/dist/commands/search.js +7 -7
- package/dist/commands/uninstall.js +7 -7
- package/dist/commands/update.js +8 -8
- package/dist/commands/validate.js +7 -7
- package/dist/components/wizard/category-grid.js +2 -2
- package/dist/components/wizard/category-grid.test.js +11 -11
- package/dist/components/wizard/domain-selection.js +9 -9
- package/dist/components/wizard/source-grid.js +2 -2
- package/dist/components/wizard/source-grid.test.js +11 -11
- package/dist/components/wizard/stack-selection.js +8 -8
- package/dist/components/wizard/step-agents.js +9 -9
- package/dist/components/wizard/step-agents.test.js +13 -13
- package/dist/components/wizard/step-agents.test.js.map +1 -1
- package/dist/components/wizard/step-build.js +9 -9
- package/dist/components/wizard/step-build.test.js +12 -12
- package/dist/components/wizard/step-confirm.js +4 -4
- package/dist/components/wizard/step-confirm.test.js +10 -10
- package/dist/components/wizard/step-settings.js +7 -7
- package/dist/components/wizard/step-settings.test.js +10 -10
- package/dist/components/wizard/step-sources.js +9 -9
- package/dist/components/wizard/step-sources.test.js +12 -12
- package/dist/components/wizard/step-stack.js +9 -12
- package/dist/components/wizard/step-stack.test.js +19 -111
- package/dist/components/wizard/step-stack.test.js.map +1 -1
- package/dist/components/wizard/wizard-layout.js +10 -10
- package/dist/components/wizard/wizard-tabs.js +1 -1
- package/dist/components/wizard/wizard-tabs.test.js +12 -23
- package/dist/components/wizard/wizard-tabs.test.js.map +1 -1
- package/dist/components/wizard/wizard.js +21 -21
- package/dist/config-exports.js +1 -1
- package/dist/hooks/init.js +23 -23
- package/dist/{loader-JMOO2A7C.js → loader-LI3EM4VG.js} +4 -4
- package/dist/{source-loader-D3VIG3GM.js → source-loader-TPUCZELX.js} +7 -7
- package/dist/source-manager-PJ5APXX2.js +19 -0
- package/dist/src/agents/meta/agent-summoner/workflow.md +10 -10
- package/dist/src/agents/meta/convention-keeper/critical-reminders.md +17 -0
- package/dist/src/agents/meta/convention-keeper/critical-requirements.md +15 -0
- package/dist/src/agents/meta/convention-keeper/examples.md +71 -0
- package/dist/src/agents/meta/convention-keeper/intro.md +11 -0
- package/dist/src/agents/meta/convention-keeper/metadata.yaml +12 -0
- package/dist/src/agents/meta/convention-keeper/output-format.md +134 -0
- package/dist/src/agents/meta/convention-keeper/workflow.md +258 -0
- package/dist/src/agents/meta/{documentor → scribe}/metadata.yaml +2 -2
- package/{src/agents/meta/documentor → dist/src/agents/meta/scribe}/workflow.md +1 -1
- package/dist/src/agents/planning/web-pm/workflow.md +1 -1
- package/dist/stores/wizard-store.js +7 -7
- package/dist/stores/wizard-store.test.js +19 -13
- package/dist/stores/wizard-store.test.js.map +1 -1
- package/package.json +1 -1
- package/src/agents/meta/agent-summoner/workflow.md +10 -10
- package/src/agents/meta/convention-keeper/critical-reminders.md +17 -0
- package/src/agents/meta/convention-keeper/critical-requirements.md +15 -0
- package/src/agents/meta/convention-keeper/examples.md +71 -0
- package/src/agents/meta/convention-keeper/intro.md +11 -0
- package/src/agents/meta/convention-keeper/metadata.yaml +12 -0
- package/src/agents/meta/convention-keeper/output-format.md +134 -0
- package/src/agents/meta/convention-keeper/workflow.md +258 -0
- package/src/agents/meta/{documentor → scribe}/metadata.yaml +2 -2
- package/{dist/src/agents/meta/documentor → src/agents/meta/scribe}/workflow.md +1 -1
- package/src/agents/planning/web-pm/workflow.md +1 -1
- package/dist/chunk-32HX6UYI.js.map +0 -1
- package/dist/chunk-B4C2S5LP.js.map +0 -1
- package/dist/chunk-EO6KJI5D.js.map +0 -1
- package/dist/chunk-FSK4TQX7.js.map +0 -1
- package/dist/chunk-HANGA633.js.map +0 -1
- package/dist/chunk-KQDGLEBF.js.map +0 -1
- package/dist/chunk-N2XGUAJU.js.map +0 -1
- package/dist/chunk-N34D3ROY.js.map +0 -1
- package/dist/chunk-OOWNDQCG.js.map +0 -1
- package/dist/chunk-QD3GQ2CH.js.map +0 -1
- package/dist/chunk-VDVLM3KB.js.map +0 -1
- package/dist/source-manager-FPYFJRR7.js +0 -19
- /package/dist/{chunk-XA7WF3BI.js.map → chunk-3C6AXGR7.js.map} +0 -0
- /package/dist/{chunk-7JQIMEUX.js.map → chunk-3SCIYMRK.js.map} +0 -0
- /package/dist/{chunk-MUCQ27HV.js.map → chunk-4R72372U.js.map} +0 -0
- /package/dist/{chunk-Q755X6QF.js.map → chunk-4VFBRV76.js.map} +0 -0
- /package/dist/{chunk-F4IZ3UAS.js.map → chunk-55AZIEK6.js.map} +0 -0
- /package/dist/{chunk-XYPAOBBV.js.map → chunk-633YIZOU.js.map} +0 -0
- /package/dist/{chunk-YFHVP3VA.js.map → chunk-F4VG5XWZ.js.map} +0 -0
- /package/dist/{chunk-NKLNT7N7.js.map → chunk-H3NQGJMB.js.map} +0 -0
- /package/dist/{chunk-FUWUCKES.js.map → chunk-LO4X32JC.js.map} +0 -0
- /package/dist/{chunk-D4T3HHE7.js.map → chunk-MNJAF4K2.js.map} +0 -0
- /package/dist/{chunk-KVRR4PEJ.js.map → chunk-NJCU7OC2.js.map} +0 -0
- /package/dist/{chunk-U2KFFRRX.js.map → chunk-NZAJTLEK.js.map} +0 -0
- /package/dist/{chunk-OTMIGYBB.js.map → chunk-RTHAMTDE.js.map} +0 -0
- /package/dist/{chunk-7LBYURQR.js.map → chunk-TQ363UUH.js.map} +0 -0
- /package/dist/{chunk-IFCASC6R.js.map → chunk-TZY7WNWO.js.map} +0 -0
- /package/dist/{chunk-SJNUTUSJ.js.map → chunk-W6PIVGMH.js.map} +0 -0
- /package/dist/{chunk-W46L2PXK.js.map → chunk-WZGROC5L.js.map} +0 -0
- /package/dist/{chunk-OIHZ2YH3.js.map → chunk-XFL7EIM7.js.map} +0 -0
- /package/dist/{chunk-7HGMFJ4Y.js.map → chunk-YDB5KXMG.js.map} +0 -0
- /package/dist/{loader-JMOO2A7C.js.map → loader-LI3EM4VG.js.map} +0 -0
- /package/dist/{source-loader-D3VIG3GM.js.map → source-loader-TPUCZELX.js.map} +0 -0
- /package/dist/{source-manager-FPYFJRR7.js.map → source-manager-PJ5APXX2.js.map} +0 -0
- /package/dist/src/agents/meta/{documentor → scribe}/critical-reminders.md +0 -0
- /package/dist/src/agents/meta/{documentor → scribe}/critical-requirements.md +0 -0
- /package/dist/src/agents/meta/{documentor → scribe}/examples.md +0 -0
- /package/dist/src/agents/meta/{documentor → scribe}/intro.md +0 -0
- /package/dist/src/agents/meta/{documentor → scribe}/output-format.md +0 -0
- /package/src/agents/meta/{documentor → scribe}/critical-reminders.md +0 -0
- /package/src/agents/meta/{documentor → scribe}/critical-requirements.md +0 -0
- /package/src/agents/meta/{documentor → scribe}/examples.md +0 -0
- /package/src/agents/meta/{documentor → scribe}/intro.md +0 -0
- /package/src/agents/meta/{documentor → scribe}/output-format.md +0 -0
|
@@ -11,9 +11,9 @@ import {
|
|
|
11
11
|
} from "../../chunk-66UDJBF6.js";
|
|
12
12
|
import {
|
|
13
13
|
WEB_PAIR_MATRIX
|
|
14
|
-
} from "../../chunk-
|
|
15
|
-
import "../../chunk-
|
|
16
|
-
import "../../chunk-
|
|
14
|
+
} from "../../chunk-3C6AXGR7.js";
|
|
15
|
+
import "../../chunk-4R72372U.js";
|
|
16
|
+
import "../../chunk-LO4X32JC.js";
|
|
17
17
|
import {
|
|
18
18
|
afterEach,
|
|
19
19
|
beforeEach,
|
|
@@ -24,11 +24,11 @@ import {
|
|
|
24
24
|
} from "../../chunk-XY3XDVMI.js";
|
|
25
25
|
import {
|
|
26
26
|
StepSources
|
|
27
|
-
} from "../../chunk-
|
|
27
|
+
} from "../../chunk-55AZIEK6.js";
|
|
28
28
|
import "../../chunk-V36FRPAU.js";
|
|
29
29
|
import "../../chunk-K77I4XGL.js";
|
|
30
30
|
import "../../chunk-K63OEZW7.js";
|
|
31
|
-
import "../../chunk-
|
|
31
|
+
import "../../chunk-MNJAF4K2.js";
|
|
32
32
|
import "../../chunk-7SOPVGDV.js";
|
|
33
33
|
import "../../chunk-A5JSBU65.js";
|
|
34
34
|
import "../../chunk-P2FHS5IS.js";
|
|
@@ -37,17 +37,17 @@ import "../../chunk-MLXAZODL.js";
|
|
|
37
37
|
import "../../chunk-KUV24B5M.js";
|
|
38
38
|
import {
|
|
39
39
|
useWizardStore
|
|
40
|
-
} from "../../chunk-
|
|
40
|
+
} from "../../chunk-TXFQBYOX.js";
|
|
41
41
|
import "../../chunk-HK53FRMU.js";
|
|
42
|
-
import "../../chunk-
|
|
43
|
-
import "../../chunk-
|
|
42
|
+
import "../../chunk-XFL7EIM7.js";
|
|
43
|
+
import "../../chunk-TZY7WNWO.js";
|
|
44
44
|
import {
|
|
45
45
|
initializeMatrix
|
|
46
|
-
} from "../../chunk-
|
|
47
|
-
import "../../chunk-
|
|
48
|
-
import "../../chunk-
|
|
46
|
+
} from "../../chunk-4R6I6A3U.js";
|
|
47
|
+
import "../../chunk-633YIZOU.js";
|
|
48
|
+
import "../../chunk-BN73X3JN.js";
|
|
49
49
|
import "../../chunk-FMYAYX6W.js";
|
|
50
|
-
import "../../chunk-
|
|
50
|
+
import "../../chunk-PPBUSAKG.js";
|
|
51
51
|
import {
|
|
52
52
|
init_esm_shims
|
|
53
53
|
} from "../../chunk-DHET7RCE.js";
|
|
@@ -1,22 +1,19 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
StepStack
|
|
4
|
-
} from "../../chunk-
|
|
5
|
-
import "../../chunk-
|
|
4
|
+
} from "../../chunk-6YJXWQCI.js";
|
|
5
|
+
import "../../chunk-3WDZKBCE.js";
|
|
6
6
|
import "../../chunk-K77I4XGL.js";
|
|
7
|
-
import "../../chunk-QD3GQ2CH.js";
|
|
8
|
-
import "../../chunk-7JQIMEUX.js";
|
|
9
|
-
import "../../chunk-RU5XLS5Q.js";
|
|
10
7
|
import "../../chunk-SQ7WINEU.js";
|
|
11
8
|
import "../../chunk-FFMWFEUH.js";
|
|
12
|
-
import "../../chunk-
|
|
13
|
-
import "../../chunk-
|
|
14
|
-
import "../../chunk-
|
|
15
|
-
import "../../chunk-
|
|
16
|
-
import "../../chunk-
|
|
17
|
-
import "../../chunk-
|
|
9
|
+
import "../../chunk-TXFQBYOX.js";
|
|
10
|
+
import "../../chunk-XFL7EIM7.js";
|
|
11
|
+
import "../../chunk-TZY7WNWO.js";
|
|
12
|
+
import "../../chunk-4R6I6A3U.js";
|
|
13
|
+
import "../../chunk-633YIZOU.js";
|
|
14
|
+
import "../../chunk-BN73X3JN.js";
|
|
18
15
|
import "../../chunk-FMYAYX6W.js";
|
|
19
|
-
import "../../chunk-
|
|
16
|
+
import "../../chunk-PPBUSAKG.js";
|
|
20
17
|
import "../../chunk-DHET7RCE.js";
|
|
21
18
|
export {
|
|
22
19
|
StepStack
|
|
@@ -16,7 +16,7 @@ import {
|
|
|
16
16
|
TEST_CATEGORIES,
|
|
17
17
|
createMockMatrix,
|
|
18
18
|
createMockResolvedStack
|
|
19
|
-
} from "../../chunk-
|
|
19
|
+
} from "../../chunk-LO4X32JC.js";
|
|
20
20
|
import {
|
|
21
21
|
afterEach,
|
|
22
22
|
beforeEach,
|
|
@@ -27,26 +27,23 @@ import {
|
|
|
27
27
|
} from "../../chunk-XY3XDVMI.js";
|
|
28
28
|
import {
|
|
29
29
|
StepStack
|
|
30
|
-
} from "../../chunk-
|
|
31
|
-
import "../../chunk-
|
|
30
|
+
} from "../../chunk-6YJXWQCI.js";
|
|
31
|
+
import "../../chunk-3WDZKBCE.js";
|
|
32
32
|
import "../../chunk-K77I4XGL.js";
|
|
33
|
-
import "../../chunk-QD3GQ2CH.js";
|
|
34
|
-
import "../../chunk-7JQIMEUX.js";
|
|
35
|
-
import "../../chunk-RU5XLS5Q.js";
|
|
36
33
|
import "../../chunk-SQ7WINEU.js";
|
|
37
34
|
import "../../chunk-FFMWFEUH.js";
|
|
38
35
|
import {
|
|
39
36
|
useWizardStore
|
|
40
|
-
} from "../../chunk-
|
|
41
|
-
import "../../chunk-
|
|
42
|
-
import "../../chunk-
|
|
37
|
+
} from "../../chunk-TXFQBYOX.js";
|
|
38
|
+
import "../../chunk-XFL7EIM7.js";
|
|
39
|
+
import "../../chunk-TZY7WNWO.js";
|
|
43
40
|
import {
|
|
44
41
|
initializeMatrix
|
|
45
|
-
} from "../../chunk-
|
|
46
|
-
import "../../chunk-
|
|
47
|
-
import "../../chunk-
|
|
42
|
+
} from "../../chunk-4R6I6A3U.js";
|
|
43
|
+
import "../../chunk-633YIZOU.js";
|
|
44
|
+
import "../../chunk-BN73X3JN.js";
|
|
48
45
|
import "../../chunk-FMYAYX6W.js";
|
|
49
|
-
import "../../chunk-
|
|
46
|
+
import "../../chunk-PPBUSAKG.js";
|
|
50
47
|
import {
|
|
51
48
|
init_esm_shims
|
|
52
49
|
} from "../../chunk-DHET7RCE.js";
|
|
@@ -95,7 +92,7 @@ describe("StepStack component", () => {
|
|
|
95
92
|
cleanup?.();
|
|
96
93
|
cleanup = void 0;
|
|
97
94
|
});
|
|
98
|
-
describe("
|
|
95
|
+
describe("stack/scratch selection", () => {
|
|
99
96
|
describe("rendering", () => {
|
|
100
97
|
it("should render stack options and scratch option", () => {
|
|
101
98
|
const { lastFrame, unmount } = render(/* @__PURE__ */ jsx(StepStack, {}));
|
|
@@ -127,17 +124,16 @@ describe("StepStack component", () => {
|
|
|
127
124
|
});
|
|
128
125
|
});
|
|
129
126
|
describe("stack selection", () => {
|
|
130
|
-
it("should
|
|
131
|
-
const { stdin,
|
|
127
|
+
it("should set approach and transition to domains step on Enter", async () => {
|
|
128
|
+
const { stdin, unmount } = render(/* @__PURE__ */ jsx(StepStack, {}));
|
|
132
129
|
cleanup = unmount;
|
|
133
130
|
await delay(RENDER_DELAY_MS);
|
|
134
131
|
stdin.write(ENTER);
|
|
135
132
|
await delay(SELECT_NAV_DELAY_MS);
|
|
136
|
-
const { approach, selectedStackId } = useWizardStore.getState();
|
|
133
|
+
const { approach, selectedStackId, step } = useWizardStore.getState();
|
|
137
134
|
globalExpect(approach).toBe("stack");
|
|
138
135
|
globalExpect(selectedStackId).toBe("react-fullstack");
|
|
139
|
-
|
|
140
|
-
globalExpect(output).toContain("Web");
|
|
136
|
+
globalExpect(step).toBe("domains");
|
|
141
137
|
});
|
|
142
138
|
it("should select second stack when navigated to", async () => {
|
|
143
139
|
const { stdin, unmount } = render(/* @__PURE__ */ jsx(StepStack, {}));
|
|
@@ -152,8 +148,8 @@ describe("StepStack component", () => {
|
|
|
152
148
|
});
|
|
153
149
|
});
|
|
154
150
|
describe("scratch selection", () => {
|
|
155
|
-
it("should
|
|
156
|
-
const { stdin,
|
|
151
|
+
it("should set approach and transition to domains step when scratch is selected", async () => {
|
|
152
|
+
const { stdin, unmount } = render(/* @__PURE__ */ jsx(StepStack, {}));
|
|
157
153
|
cleanup = unmount;
|
|
158
154
|
await delay(RENDER_DELAY_MS);
|
|
159
155
|
stdin.write(ARROW_DOWN);
|
|
@@ -162,11 +158,10 @@ describe("StepStack component", () => {
|
|
|
162
158
|
await delay(SELECT_NAV_DELAY_MS);
|
|
163
159
|
stdin.write(ENTER);
|
|
164
160
|
await delay(SELECT_NAV_DELAY_MS);
|
|
165
|
-
const { approach, selectedStackId } = useWizardStore.getState();
|
|
161
|
+
const { approach, selectedStackId, step } = useWizardStore.getState();
|
|
166
162
|
globalExpect(approach).toBe("scratch");
|
|
167
163
|
globalExpect(selectedStackId).toBeNull();
|
|
168
|
-
|
|
169
|
-
globalExpect(output).toContain("Web");
|
|
164
|
+
globalExpect(step).toBe("domains");
|
|
170
165
|
});
|
|
171
166
|
it("should pre-select domains except CLI when scratch is chosen", async () => {
|
|
172
167
|
const { stdin, unmount } = render(/* @__PURE__ */ jsx(StepStack, {}));
|
|
@@ -263,92 +258,5 @@ describe("StepStack component", () => {
|
|
|
263
258
|
});
|
|
264
259
|
});
|
|
265
260
|
});
|
|
266
|
-
describe("domain selection mode (after stack/scratch choice)", () => {
|
|
267
|
-
beforeEach(() => {
|
|
268
|
-
useWizardStore.getState().setApproach("scratch");
|
|
269
|
-
});
|
|
270
|
-
describe("rendering", () => {
|
|
271
|
-
it("should render domain options", () => {
|
|
272
|
-
const { lastFrame, unmount } = render(/* @__PURE__ */ jsx(StepStack, {}));
|
|
273
|
-
cleanup = unmount;
|
|
274
|
-
const output = lastFrame();
|
|
275
|
-
globalExpect(output).toContain("Web");
|
|
276
|
-
globalExpect(output).toContain("API");
|
|
277
|
-
globalExpect(output).toContain("CLI");
|
|
278
|
-
});
|
|
279
|
-
it("should render domain options in selection view", () => {
|
|
280
|
-
const { lastFrame, unmount } = render(/* @__PURE__ */ jsx(StepStack, {}));
|
|
281
|
-
cleanup = unmount;
|
|
282
|
-
const output = lastFrame();
|
|
283
|
-
globalExpect(output).toContain("Web");
|
|
284
|
-
globalExpect(output).toContain("API");
|
|
285
|
-
});
|
|
286
|
-
it("should show domain descriptions", () => {
|
|
287
|
-
const { lastFrame, unmount } = render(/* @__PURE__ */ jsx(StepStack, {}));
|
|
288
|
-
cleanup = unmount;
|
|
289
|
-
const output = lastFrame();
|
|
290
|
-
globalExpect(output).toContain("Frontend web applications");
|
|
291
|
-
});
|
|
292
|
-
});
|
|
293
|
-
describe("domain selection", () => {
|
|
294
|
-
it("should toggle domain when selected", async () => {
|
|
295
|
-
const { stdin, unmount } = render(/* @__PURE__ */ jsx(StepStack, {}));
|
|
296
|
-
cleanup = unmount;
|
|
297
|
-
await delay(RENDER_DELAY_MS);
|
|
298
|
-
stdin.write(" ");
|
|
299
|
-
await delay(SELECT_NAV_DELAY_MS);
|
|
300
|
-
const { selectedDomains } = useWizardStore.getState();
|
|
301
|
-
globalExpect(selectedDomains).toContain("web");
|
|
302
|
-
});
|
|
303
|
-
it("should allow multiple domain selection", async () => {
|
|
304
|
-
const { stdin, unmount } = render(/* @__PURE__ */ jsx(StepStack, {}));
|
|
305
|
-
cleanup = unmount;
|
|
306
|
-
await delay(RENDER_DELAY_MS);
|
|
307
|
-
stdin.write(" ");
|
|
308
|
-
await delay(SELECT_NAV_DELAY_MS);
|
|
309
|
-
globalExpect(useWizardStore.getState().selectedDomains).toContain("web");
|
|
310
|
-
useWizardStore.getState().toggleDomain("api");
|
|
311
|
-
const { selectedDomains } = useWizardStore.getState();
|
|
312
|
-
globalExpect(selectedDomains).toContain("web");
|
|
313
|
-
globalExpect(selectedDomains).toContain("api");
|
|
314
|
-
});
|
|
315
|
-
it("should show selected domains summary when domains selected", async () => {
|
|
316
|
-
useWizardStore.getState().toggleDomain("web");
|
|
317
|
-
const { lastFrame, unmount } = render(/* @__PURE__ */ jsx(StepStack, {}));
|
|
318
|
-
cleanup = unmount;
|
|
319
|
-
const output = lastFrame();
|
|
320
|
-
globalExpect(output).toContain("Selected:");
|
|
321
|
-
globalExpect(output).toContain("web");
|
|
322
|
-
});
|
|
323
|
-
it("should navigate to build step when continuing", async () => {
|
|
324
|
-
useWizardStore.getState().toggleDomain("web");
|
|
325
|
-
const { stdin, unmount } = render(/* @__PURE__ */ jsx(StepStack, {}));
|
|
326
|
-
cleanup = unmount;
|
|
327
|
-
await delay(RENDER_DELAY_MS);
|
|
328
|
-
for (let i = 0; i < 4; i++) {
|
|
329
|
-
stdin.write(ARROW_DOWN);
|
|
330
|
-
await delay(SELECT_NAV_DELAY_MS);
|
|
331
|
-
}
|
|
332
|
-
stdin.write(ENTER);
|
|
333
|
-
await delay(SELECT_NAV_DELAY_MS);
|
|
334
|
-
const { step } = useWizardStore.getState();
|
|
335
|
-
globalExpect(step).toBe("build");
|
|
336
|
-
});
|
|
337
|
-
});
|
|
338
|
-
describe("back navigation", () => {
|
|
339
|
-
it("should return to stack/scratch selection when pressing ESC", async () => {
|
|
340
|
-
const { stdin, lastFrame, unmount } = render(/* @__PURE__ */ jsx(StepStack, {}));
|
|
341
|
-
cleanup = unmount;
|
|
342
|
-
await delay(RENDER_DELAY_MS);
|
|
343
|
-
stdin.write(ESCAPE);
|
|
344
|
-
await delay(SELECT_NAV_DELAY_MS);
|
|
345
|
-
const { approach } = useWizardStore.getState();
|
|
346
|
-
globalExpect(approach).toBeNull();
|
|
347
|
-
const output = lastFrame();
|
|
348
|
-
globalExpect(output).toContain("React Fullstack");
|
|
349
|
-
globalExpect(output).toContain("Start from scratch");
|
|
350
|
-
});
|
|
351
|
-
});
|
|
352
|
-
});
|
|
353
261
|
});
|
|
354
262
|
//# sourceMappingURL=step-stack.test.js.map
|
|
@@ -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 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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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,2EAA2E,MAAM;AAClF,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,oBAAoB;AAAA,MAC/C,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;AAEzB,qBAAO,MAAM,EAAE,UAAU,KAAK;AAAA,MAChC,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;AAEzB,qBAAO,MAAM,EAAE,UAAU,KAAK;AAAA,MAChC,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,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;AAEzB,qBAAO,MAAM,EAAE,UAAU,KAAK;AAC9B,qBAAO,MAAM,EAAE,UAAU,KAAK;AAAA,MAChC,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;AAEzB,qBAAO,MAAM,EAAE,UAAU,iBAAiB;AAC1C,qBAAO,MAAM,EAAE,UAAU,oBAAoB;AAAA,MAC/C,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(\"stack/scratch selection\", () => {\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 set approach and transition to domains step on Enter\", async () => {\n const { stdin, 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, step } = useWizardStore.getState();\n expect(approach).toBe(\"stack\");\n expect(selectedStackId).toBe(\"react-fullstack\");\n expect(step).toBe(\"domains\");\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 set approach and transition to domains step when scratch is selected\", 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 { approach, selectedStackId, step } = useWizardStore.getState();\n expect(approach).toBe(\"scratch\");\n expect(selectedStackId).toBeNull();\n expect(step).toBe(\"domains\");\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"],"mappings":"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","names":[]}
|
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
WizardLayout
|
|
4
|
-
} from "../../chunk-
|
|
5
|
-
import "../../chunk-
|
|
4
|
+
} from "../../chunk-3HWFTE3S.js";
|
|
5
|
+
import "../../chunk-TJXBRYM4.js";
|
|
6
6
|
import "../../chunk-V36FRPAU.js";
|
|
7
|
-
import "../../chunk-
|
|
7
|
+
import "../../chunk-3SCIYMRK.js";
|
|
8
8
|
import "../../chunk-C22ACAL2.js";
|
|
9
|
-
import "../../chunk-
|
|
9
|
+
import "../../chunk-TXFQBYOX.js";
|
|
10
10
|
import "../../chunk-HK53FRMU.js";
|
|
11
|
-
import "../../chunk-
|
|
12
|
-
import "../../chunk-
|
|
13
|
-
import "../../chunk-
|
|
14
|
-
import "../../chunk-
|
|
15
|
-
import "../../chunk-
|
|
11
|
+
import "../../chunk-XFL7EIM7.js";
|
|
12
|
+
import "../../chunk-TZY7WNWO.js";
|
|
13
|
+
import "../../chunk-4R6I6A3U.js";
|
|
14
|
+
import "../../chunk-633YIZOU.js";
|
|
15
|
+
import "../../chunk-BN73X3JN.js";
|
|
16
16
|
import "../../chunk-FMYAYX6W.js";
|
|
17
|
-
import "../../chunk-
|
|
17
|
+
import "../../chunk-PPBUSAKG.js";
|
|
18
18
|
import "../../chunk-DHET7RCE.js";
|
|
19
19
|
export {
|
|
20
20
|
WizardLayout
|
|
@@ -12,7 +12,7 @@ import {
|
|
|
12
12
|
WIZARD_STEPS,
|
|
13
13
|
WizardTabs,
|
|
14
14
|
formatStepLabel
|
|
15
|
-
} from "../../chunk-
|
|
15
|
+
} from "../../chunk-TJXBRYM4.js";
|
|
16
16
|
import "../../chunk-FMYAYX6W.js";
|
|
17
17
|
import {
|
|
18
18
|
init_esm_shims
|
|
@@ -21,10 +21,6 @@ import {
|
|
|
21
21
|
// src/cli/components/wizard/wizard-tabs.test.tsx
|
|
22
22
|
init_esm_shims();
|
|
23
23
|
import { jsx } from "react/jsx-runtime";
|
|
24
|
-
var formatCustomStepLabel = (step) => {
|
|
25
|
-
const prefix = `[${step.number}]`;
|
|
26
|
-
return { prefix, label: step.label, full: `${prefix} ${step.label}` };
|
|
27
|
-
};
|
|
28
24
|
var renderWizardTabs = (props = {}) => {
|
|
29
25
|
const defaultProps = {
|
|
30
26
|
steps: WIZARD_STEPS,
|
|
@@ -42,30 +38,21 @@ describe("WizardTabs component", () => {
|
|
|
42
38
|
cleanup = void 0;
|
|
43
39
|
});
|
|
44
40
|
describe("rendering", () => {
|
|
45
|
-
it("should render all
|
|
41
|
+
it("should render all 6 tabs", () => {
|
|
46
42
|
const { lastFrame, unmount } = renderWizardTabs();
|
|
47
43
|
cleanup = unmount;
|
|
48
44
|
const output = lastFrame();
|
|
49
45
|
globalExpect(output).toContain(formatStepLabel("stack").full);
|
|
46
|
+
globalExpect(output).toContain(formatStepLabel("domains").full);
|
|
50
47
|
globalExpect(output).toContain(formatStepLabel("build").full);
|
|
51
48
|
globalExpect(output).toContain(formatStepLabel("sources").full);
|
|
52
49
|
globalExpect(output).toContain(formatStepLabel("agents").full);
|
|
53
50
|
globalExpect(output).toContain(formatStepLabel("confirm").full);
|
|
54
51
|
});
|
|
55
|
-
it("should render all step numbers", () => {
|
|
56
|
-
const { lastFrame, unmount } = renderWizardTabs();
|
|
57
|
-
cleanup = unmount;
|
|
58
|
-
const output = lastFrame();
|
|
59
|
-
globalExpect(output).toContain(formatStepLabel("stack").prefix);
|
|
60
|
-
globalExpect(output).toContain(formatStepLabel("build").prefix);
|
|
61
|
-
globalExpect(output).toContain(formatStepLabel("sources").prefix);
|
|
62
|
-
globalExpect(output).toContain(formatStepLabel("agents").prefix);
|
|
63
|
-
globalExpect(output).toContain(formatStepLabel("confirm").prefix);
|
|
64
|
-
});
|
|
65
52
|
it("should render with custom steps", () => {
|
|
66
53
|
const customSteps = [
|
|
67
|
-
{ id: "stack", label: "First"
|
|
68
|
-
{ id: "build", label: "Second"
|
|
54
|
+
{ id: "stack", label: "First" },
|
|
55
|
+
{ id: "build", label: "Second" }
|
|
69
56
|
];
|
|
70
57
|
const { lastFrame, unmount } = renderWizardTabs({
|
|
71
58
|
steps: customSteps,
|
|
@@ -73,8 +60,8 @@ describe("WizardTabs component", () => {
|
|
|
73
60
|
});
|
|
74
61
|
cleanup = unmount;
|
|
75
62
|
const output = lastFrame();
|
|
76
|
-
globalExpect(output).toContain(
|
|
77
|
-
globalExpect(output).toContain(
|
|
63
|
+
globalExpect(output).toContain("First");
|
|
64
|
+
globalExpect(output).toContain("Second");
|
|
78
65
|
});
|
|
79
66
|
it("should render horizontal dividers above and below tabs", () => {
|
|
80
67
|
const { lastFrame, unmount } = renderWizardTabs();
|
|
@@ -149,6 +136,7 @@ describe("WizardTabs component", () => {
|
|
|
149
136
|
});
|
|
150
137
|
cleanup = unmount;
|
|
151
138
|
const output = lastFrame();
|
|
139
|
+
globalExpect(output).toContain(formatStepLabel("domains").full);
|
|
152
140
|
globalExpect(output).toContain(formatStepLabel("build").full);
|
|
153
141
|
globalExpect(output).toContain(formatStepLabel("sources").full);
|
|
154
142
|
});
|
|
@@ -270,17 +258,18 @@ describe("WizardTabs component", () => {
|
|
|
270
258
|
it("should handle all steps completed", () => {
|
|
271
259
|
const { lastFrame, unmount } = renderWizardTabs({
|
|
272
260
|
currentStep: "confirm",
|
|
273
|
-
completedSteps: ["stack", "build", "sources", "agents", "confirm"]
|
|
261
|
+
completedSteps: ["stack", "domains", "build", "sources", "agents", "confirm"]
|
|
274
262
|
});
|
|
275
263
|
cleanup = unmount;
|
|
276
264
|
const output = lastFrame();
|
|
277
265
|
globalExpect(output).toContain(formatStepLabel("stack").full);
|
|
266
|
+
globalExpect(output).toContain(formatStepLabel("domains").full);
|
|
278
267
|
globalExpect(output).toContain(formatStepLabel("build").full);
|
|
279
268
|
globalExpect(output).toContain(formatStepLabel("sources").full);
|
|
280
269
|
globalExpect(output).toContain(formatStepLabel("confirm").full);
|
|
281
270
|
});
|
|
282
271
|
it("should handle single step", () => {
|
|
283
|
-
const singleStep = [{ id: "confirm", label: "Only Step"
|
|
272
|
+
const singleStep = [{ id: "confirm", label: "Only Step" }];
|
|
284
273
|
const { lastFrame, unmount } = renderWizardTabs({
|
|
285
274
|
steps: singleStep,
|
|
286
275
|
currentStep: "confirm",
|
|
@@ -288,7 +277,7 @@ describe("WizardTabs component", () => {
|
|
|
288
277
|
});
|
|
289
278
|
cleanup = unmount;
|
|
290
279
|
const output = lastFrame();
|
|
291
|
-
globalExpect(output).toContain(
|
|
280
|
+
globalExpect(output).toContain("Only Step");
|
|
292
281
|
});
|
|
293
282
|
});
|
|
294
283
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/cli/components/wizard/wizard-tabs.test.tsx"],"sourcesContent":["import { render } from \"ink-testing-library\";\nimport { afterEach, describe, expect, it } from \"vitest\";\nimport type { WizardStep } from \"../../stores/wizard-store\";\nimport { WizardTabs, WIZARD_STEPS, formatStepLabel, type WizardTabsProps } from \"./wizard-tabs\";\n\n/** Format a custom (non-WIZARD_STEPS) step label for test assertions */\nconst formatCustomStepLabel = (step: { label: string; number: number }) => {\n const prefix = `[${step.number}]`;\n return { prefix, label: step.label, full: `${prefix} ${step.label}` };\n};\n\nconst renderWizardTabs = (props: Partial<WizardTabsProps> = {}) => {\n const defaultProps: WizardTabsProps = {\n steps: WIZARD_STEPS,\n currentStep: \"stack\",\n completedSteps: [],\n skippedSteps: [],\n ...props,\n };\n return render(<WizardTabs {...defaultProps} />);\n};\n\ndescribe(\"WizardTabs component\", () => {\n let cleanup: (() => void) | undefined;\n\n afterEach(() => {\n cleanup?.();\n cleanup = undefined;\n });\n\n describe(\"rendering\", () => {\n it(\"should render all 5 tabs\", () => {\n const { lastFrame, unmount } = renderWizardTabs();\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(formatStepLabel(\"stack\").full);\n expect(output).toContain(formatStepLabel(\"build\").full);\n expect(output).toContain(formatStepLabel(\"sources\").full);\n expect(output).toContain(formatStepLabel(\"agents\").full);\n expect(output).toContain(formatStepLabel(\"confirm\").full);\n });\n\n it(\"should render all step numbers\", () => {\n const { lastFrame, unmount } = renderWizardTabs();\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(formatStepLabel(\"stack\").prefix);\n expect(output).toContain(formatStepLabel(\"build\").prefix);\n expect(output).toContain(formatStepLabel(\"sources\").prefix);\n expect(output).toContain(formatStepLabel(\"agents\").prefix);\n expect(output).toContain(formatStepLabel(\"confirm\").prefix);\n });\n\n it(\"should render with custom steps\", () => {\n const customSteps = [\n { id: \"stack\" as WizardStep, label: \"First\", number: 1 },\n { id: \"build\" as WizardStep, label: \"Second\", number: 2 },\n ];\n const { lastFrame, unmount } = renderWizardTabs({\n steps: customSteps,\n currentStep: \"stack\",\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(formatCustomStepLabel(customSteps[0]).full);\n expect(output).toContain(formatCustomStepLabel(customSteps[1]).full);\n });\n\n it(\"should render horizontal dividers above and below tabs\", () => {\n const { lastFrame, unmount } = renderWizardTabs();\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"\\u2500\");\n });\n });\n\n describe(\"current step\", () => {\n it(\"should render current step label\", () => {\n const { lastFrame, unmount } = renderWizardTabs({\n currentStep: \"build\",\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(formatStepLabel(\"build\").full);\n });\n\n it(\"should mark first step as current by default\", () => {\n const { lastFrame, unmount } = renderWizardTabs({\n currentStep: \"stack\",\n completedSteps: [],\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(formatStepLabel(\"stack\").full);\n });\n\n it(\"should update current step when changed\", () => {\n const { lastFrame, unmount } = renderWizardTabs({\n currentStep: \"confirm\",\n completedSteps: [\"stack\", \"build\"],\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(formatStepLabel(\"confirm\").full);\n });\n });\n\n describe(\"completed steps\", () => {\n it(\"should render completed step labels\", () => {\n const { lastFrame, unmount } = renderWizardTabs({\n currentStep: \"build\",\n completedSteps: [\"stack\"],\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(formatStepLabel(\"stack\").full);\n });\n\n it(\"should render multiple completed steps\", () => {\n const { lastFrame, unmount } = renderWizardTabs({\n currentStep: \"sources\",\n completedSteps: [\"stack\", \"build\"],\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(formatStepLabel(\"stack\").full);\n expect(output).toContain(formatStepLabel(\"build\").full);\n });\n\n it(\"should render current step separately from completed steps\", () => {\n const { lastFrame, unmount } = renderWizardTabs({\n currentStep: \"stack\",\n completedSteps: [],\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(formatStepLabel(\"stack\").full);\n });\n });\n\n describe(\"pending steps\", () => {\n it(\"should render pending step labels\", () => {\n const { lastFrame, unmount } = renderWizardTabs({\n currentStep: \"stack\",\n completedSteps: [],\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(formatStepLabel(\"build\").full);\n expect(output).toContain(formatStepLabel(\"sources\").full);\n });\n\n it(\"should render steps after current\", () => {\n const { lastFrame, unmount } = renderWizardTabs({\n currentStep: \"build\",\n completedSteps: [\"stack\"],\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(formatStepLabel(\"confirm\").full);\n });\n });\n\n describe(\"skipped steps\", () => {\n it(\"should render skipped step labels\", () => {\n const { lastFrame, unmount } = renderWizardTabs({\n currentStep: \"sources\",\n completedSteps: [\"stack\"],\n skippedSteps: [\"build\"],\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(formatStepLabel(\"build\").full);\n });\n\n it(\"should handle multiple skipped steps\", () => {\n const { lastFrame, unmount } = renderWizardTabs({\n currentStep: \"confirm\",\n completedSteps: [\"stack\"],\n skippedSteps: [\"build\", \"sources\"],\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(formatStepLabel(\"build\").full);\n expect(output).toContain(formatStepLabel(\"sources\").full);\n });\n\n it(\"should prioritize completed over skipped when step is in both arrays\", () => {\n const { lastFrame, unmount } = renderWizardTabs({\n currentStep: \"sources\",\n completedSteps: [\"stack\", \"build\"],\n skippedSteps: [\"build\"],\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(formatStepLabel(\"stack\").full);\n expect(output).toContain(formatStepLabel(\"build\").full);\n });\n });\n\n describe(\"state priority\", () => {\n it(\"should prioritize completed over current\", () => {\n const { lastFrame, unmount } = renderWizardTabs({\n currentStep: \"stack\",\n completedSteps: [\"stack\"],\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(formatStepLabel(\"stack\").full);\n });\n\n it(\"should prioritize current over skipped\", () => {\n const { lastFrame, unmount } = renderWizardTabs({\n currentStep: \"build\",\n completedSteps: [],\n skippedSteps: [\"build\"],\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(formatStepLabel(\"build\").full);\n });\n\n it(\"should prioritize completed over skipped\", () => {\n const { lastFrame, unmount } = renderWizardTabs({\n currentStep: \"sources\",\n completedSteps: [\"stack\"],\n skippedSteps: [\"stack\"],\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(formatStepLabel(\"stack\").full);\n });\n });\n\n describe(\"visual layout\", () => {\n it(\"should render tabs horizontally\", () => {\n const { lastFrame, unmount } = renderWizardTabs();\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(formatStepLabel(\"stack\").label);\n expect(output).toContain(formatStepLabel(\"confirm\").label);\n });\n\n it(\"should include step labels\", () => {\n const { lastFrame, unmount } = renderWizardTabs();\n cleanup = unmount;\n\n const output = lastFrame();\n WIZARD_STEPS.forEach((step) => {\n expect(output).toContain(formatStepLabel(step.id).label);\n });\n });\n });\n\n describe(\"edge cases\", () => {\n it(\"should handle empty completed steps\", () => {\n const { lastFrame, unmount } = renderWizardTabs({\n currentStep: \"stack\",\n completedSteps: [],\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(formatStepLabel(\"stack\").full);\n expect(output).toContain(formatStepLabel(\"confirm\").full);\n });\n\n it(\"should handle empty skipped steps\", () => {\n const { lastFrame, unmount } = renderWizardTabs({\n currentStep: \"sources\",\n completedSteps: [\"stack\", \"build\"],\n skippedSteps: [],\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(formatStepLabel(\"stack\").full);\n expect(output).toContain(formatStepLabel(\"build\").full);\n expect(output).toContain(formatStepLabel(\"sources\").full);\n });\n\n it(\"should handle all steps completed\", () => {\n const { lastFrame, unmount } = renderWizardTabs({\n currentStep: \"confirm\",\n completedSteps: [\"stack\", \"build\", \"sources\", \"agents\", \"confirm\"],\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(formatStepLabel(\"stack\").full);\n expect(output).toContain(formatStepLabel(\"build\").full);\n expect(output).toContain(formatStepLabel(\"sources\").full);\n expect(output).toContain(formatStepLabel(\"confirm\").full);\n });\n\n it(\"should handle single step\", () => {\n const singleStep = [{ id: \"confirm\" as WizardStep, label: \"Only Step\", number: 1 }];\n const { lastFrame, unmount } = renderWizardTabs({\n steps: singleStep,\n currentStep: \"confirm\",\n completedSteps: [],\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(formatCustomStepLabel(singleStep[0]).full);\n });\n });\n});\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../src/cli/components/wizard/wizard-tabs.test.tsx"],"sourcesContent":["import { render } from \"ink-testing-library\";\nimport { afterEach, describe, expect, it } from \"vitest\";\nimport type { WizardStep } from \"../../stores/wizard-store\";\nimport { WizardTabs, WIZARD_STEPS, formatStepLabel, type WizardTabsProps } from \"./wizard-tabs\";\n\nconst renderWizardTabs = (props: Partial<WizardTabsProps> = {}) => {\n const defaultProps: WizardTabsProps = {\n steps: WIZARD_STEPS,\n currentStep: \"stack\",\n completedSteps: [],\n skippedSteps: [],\n ...props,\n };\n return render(<WizardTabs {...defaultProps} />);\n};\n\ndescribe(\"WizardTabs component\", () => {\n let cleanup: (() => void) | undefined;\n\n afterEach(() => {\n cleanup?.();\n cleanup = undefined;\n });\n\n describe(\"rendering\", () => {\n it(\"should render all 6 tabs\", () => {\n const { lastFrame, unmount } = renderWizardTabs();\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(formatStepLabel(\"stack\").full);\n expect(output).toContain(formatStepLabel(\"domains\").full);\n expect(output).toContain(formatStepLabel(\"build\").full);\n expect(output).toContain(formatStepLabel(\"sources\").full);\n expect(output).toContain(formatStepLabel(\"agents\").full);\n expect(output).toContain(formatStepLabel(\"confirm\").full);\n });\n\n it(\"should render with custom steps\", () => {\n const customSteps = [\n { id: \"stack\" as WizardStep, label: \"First\" },\n { id: \"build\" as WizardStep, label: \"Second\" },\n ];\n const { lastFrame, unmount } = renderWizardTabs({\n steps: customSteps,\n currentStep: \"stack\",\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"First\");\n expect(output).toContain(\"Second\");\n });\n\n it(\"should render horizontal dividers above and below tabs\", () => {\n const { lastFrame, unmount } = renderWizardTabs();\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"\\u2500\");\n });\n });\n\n describe(\"current step\", () => {\n it(\"should render current step label\", () => {\n const { lastFrame, unmount } = renderWizardTabs({\n currentStep: \"build\",\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(formatStepLabel(\"build\").full);\n });\n\n it(\"should mark first step as current by default\", () => {\n const { lastFrame, unmount } = renderWizardTabs({\n currentStep: \"stack\",\n completedSteps: [],\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(formatStepLabel(\"stack\").full);\n });\n\n it(\"should update current step when changed\", () => {\n const { lastFrame, unmount } = renderWizardTabs({\n currentStep: \"confirm\",\n completedSteps: [\"stack\", \"build\"],\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(formatStepLabel(\"confirm\").full);\n });\n });\n\n describe(\"completed steps\", () => {\n it(\"should render completed step labels\", () => {\n const { lastFrame, unmount } = renderWizardTabs({\n currentStep: \"build\",\n completedSteps: [\"stack\"],\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(formatStepLabel(\"stack\").full);\n });\n\n it(\"should render multiple completed steps\", () => {\n const { lastFrame, unmount } = renderWizardTabs({\n currentStep: \"sources\",\n completedSteps: [\"stack\", \"build\"],\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(formatStepLabel(\"stack\").full);\n expect(output).toContain(formatStepLabel(\"build\").full);\n });\n\n it(\"should render current step separately from completed steps\", () => {\n const { lastFrame, unmount } = renderWizardTabs({\n currentStep: \"stack\",\n completedSteps: [],\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(formatStepLabel(\"stack\").full);\n });\n });\n\n describe(\"pending steps\", () => {\n it(\"should render pending step labels\", () => {\n const { lastFrame, unmount } = renderWizardTabs({\n currentStep: \"stack\",\n completedSteps: [],\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(formatStepLabel(\"domains\").full);\n expect(output).toContain(formatStepLabel(\"build\").full);\n expect(output).toContain(formatStepLabel(\"sources\").full);\n });\n\n it(\"should render steps after current\", () => {\n const { lastFrame, unmount } = renderWizardTabs({\n currentStep: \"build\",\n completedSteps: [\"stack\"],\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(formatStepLabel(\"confirm\").full);\n });\n });\n\n describe(\"skipped steps\", () => {\n it(\"should render skipped step labels\", () => {\n const { lastFrame, unmount } = renderWizardTabs({\n currentStep: \"sources\",\n completedSteps: [\"stack\"],\n skippedSteps: [\"build\"],\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(formatStepLabel(\"build\").full);\n });\n\n it(\"should handle multiple skipped steps\", () => {\n const { lastFrame, unmount } = renderWizardTabs({\n currentStep: \"confirm\",\n completedSteps: [\"stack\"],\n skippedSteps: [\"build\", \"sources\"],\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(formatStepLabel(\"build\").full);\n expect(output).toContain(formatStepLabel(\"sources\").full);\n });\n\n it(\"should prioritize completed over skipped when step is in both arrays\", () => {\n const { lastFrame, unmount } = renderWizardTabs({\n currentStep: \"sources\",\n completedSteps: [\"stack\", \"build\"],\n skippedSteps: [\"build\"],\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(formatStepLabel(\"stack\").full);\n expect(output).toContain(formatStepLabel(\"build\").full);\n });\n });\n\n describe(\"state priority\", () => {\n it(\"should prioritize completed over current\", () => {\n const { lastFrame, unmount } = renderWizardTabs({\n currentStep: \"stack\",\n completedSteps: [\"stack\"],\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(formatStepLabel(\"stack\").full);\n });\n\n it(\"should prioritize current over skipped\", () => {\n const { lastFrame, unmount } = renderWizardTabs({\n currentStep: \"build\",\n completedSteps: [],\n skippedSteps: [\"build\"],\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(formatStepLabel(\"build\").full);\n });\n\n it(\"should prioritize completed over skipped\", () => {\n const { lastFrame, unmount } = renderWizardTabs({\n currentStep: \"sources\",\n completedSteps: [\"stack\"],\n skippedSteps: [\"stack\"],\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(formatStepLabel(\"stack\").full);\n });\n });\n\n describe(\"visual layout\", () => {\n it(\"should render tabs horizontally\", () => {\n const { lastFrame, unmount } = renderWizardTabs();\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(formatStepLabel(\"stack\").label);\n expect(output).toContain(formatStepLabel(\"confirm\").label);\n });\n\n it(\"should include step labels\", () => {\n const { lastFrame, unmount } = renderWizardTabs();\n cleanup = unmount;\n\n const output = lastFrame();\n WIZARD_STEPS.forEach((step) => {\n expect(output).toContain(formatStepLabel(step.id).label);\n });\n });\n });\n\n describe(\"edge cases\", () => {\n it(\"should handle empty completed steps\", () => {\n const { lastFrame, unmount } = renderWizardTabs({\n currentStep: \"stack\",\n completedSteps: [],\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(formatStepLabel(\"stack\").full);\n expect(output).toContain(formatStepLabel(\"confirm\").full);\n });\n\n it(\"should handle empty skipped steps\", () => {\n const { lastFrame, unmount } = renderWizardTabs({\n currentStep: \"sources\",\n completedSteps: [\"stack\", \"build\"],\n skippedSteps: [],\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(formatStepLabel(\"stack\").full);\n expect(output).toContain(formatStepLabel(\"build\").full);\n expect(output).toContain(formatStepLabel(\"sources\").full);\n });\n\n it(\"should handle all steps completed\", () => {\n const { lastFrame, unmount } = renderWizardTabs({\n currentStep: \"confirm\",\n completedSteps: [\"stack\", \"domains\", \"build\", \"sources\", \"agents\", \"confirm\"],\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(formatStepLabel(\"stack\").full);\n expect(output).toContain(formatStepLabel(\"domains\").full);\n expect(output).toContain(formatStepLabel(\"build\").full);\n expect(output).toContain(formatStepLabel(\"sources\").full);\n expect(output).toContain(formatStepLabel(\"confirm\").full);\n });\n\n it(\"should handle single step\", () => {\n const singleStep = [{ id: \"confirm\" as WizardStep, label: \"Only Step\" }];\n const { lastFrame, unmount } = renderWizardTabs({\n steps: singleStep,\n currentStep: \"confirm\",\n completedSteps: [],\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Only Step\");\n });\n });\n});\n"],"mappings":"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","names":[]}
|