@agents-inc/cli 0.76.0 → 0.78.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 +23 -0
- package/dist/{chunk-Q4PJSAMP.js → chunk-32HX6UYI.js} +2 -1
- package/dist/chunk-32HX6UYI.js.map +1 -0
- package/dist/{chunk-CKU7FJNV.js → chunk-7HGMFJ4Y.js} +3 -3
- package/dist/{chunk-UBNHVBSV.js → chunk-7JQIMEUX.js} +3 -3
- package/dist/{chunk-XYZ7B5BY.js → chunk-7LBYURQR.js} +2 -2
- package/dist/{chunk-NWW3OJH5.js → chunk-A5JSBU65.js} +2 -2
- package/dist/{chunk-ODVQXXEO.js → chunk-B4C2S5LP.js} +17 -43
- package/dist/{chunk-ODVQXXEO.js.map → chunk-B4C2S5LP.js.map} +1 -1
- package/dist/{chunk-IDN2OZJY.js → chunk-C22ACAL2.js} +2 -2
- package/dist/{chunk-I2SUTL7S.js → chunk-D4T3HHE7.js} +5 -5
- package/dist/chunk-D4T3HHE7.js.map +1 -0
- package/dist/{chunk-7XUKTYVD.js → chunk-EO6KJI5D.js} +1038 -270
- package/dist/chunk-EO6KJI5D.js.map +1 -0
- package/dist/{chunk-WZ5S4LGX.js → chunk-F4IZ3UAS.js} +16 -22
- package/dist/chunk-F4IZ3UAS.js.map +1 -0
- package/dist/{chunk-JWMYAJHD.js → chunk-FSK4TQX7.js} +1236 -354
- package/dist/chunk-FSK4TQX7.js.map +1 -0
- package/dist/{chunk-WMMU5FOO.js → chunk-FUWUCKES.js} +2 -2
- package/dist/{chunk-WMMU5FOO.js.map → chunk-FUWUCKES.js.map} +1 -1
- package/dist/{chunk-S6DKM6MJ.js → chunk-HANGA633.js} +4 -8
- package/dist/{chunk-S6DKM6MJ.js.map → chunk-HANGA633.js.map} +1 -1
- package/dist/{chunk-CBYRFAUN.js → chunk-HK53FRMU.js} +3 -1
- package/dist/chunk-HK53FRMU.js.map +1 -0
- package/dist/{chunk-I534EWJQ.js → chunk-IFCASC6R.js} +2 -2
- package/dist/{chunk-2I5SXGXR.js → chunk-KQDGLEBF.js} +80 -5
- package/dist/chunk-KQDGLEBF.js.map +1 -0
- package/dist/{chunk-AE2QHAFO.js → chunk-KVRR4PEJ.js} +81 -73
- package/dist/chunk-KVRR4PEJ.js.map +1 -0
- package/dist/{chunk-R7F5YQMI.js → chunk-LVBRC2CP.js} +2 -6
- package/dist/chunk-LVBRC2CP.js.map +1 -0
- package/dist/{chunk-CCSU4R65.js → chunk-MG55NDVG.js} +2 -2
- package/dist/{chunk-M4ZDKHJV.js → chunk-MUCQ27HV.js} +2 -2
- package/dist/chunk-N2XGUAJU.js +34 -0
- package/dist/{chunk-7PZFDI46.js.map → chunk-N2XGUAJU.js.map} +1 -1
- package/dist/{chunk-PRG7PKZM.js → chunk-N34D3ROY.js} +14 -13
- package/dist/chunk-N34D3ROY.js.map +1 -0
- package/dist/{chunk-7PMFIL5L.js → chunk-NKLNT7N7.js} +4 -21
- package/dist/chunk-NKLNT7N7.js.map +1 -0
- package/dist/{chunk-WS3TL2AO.js → chunk-OIHZ2YH3.js} +172 -102
- package/dist/chunk-OIHZ2YH3.js.map +1 -0
- package/dist/chunk-OOWNDQCG.js +192 -0
- package/dist/chunk-OOWNDQCG.js.map +1 -0
- package/dist/{chunk-EEZSCHS2.js → chunk-OTMIGYBB.js} +52 -10
- package/dist/chunk-OTMIGYBB.js.map +1 -0
- package/dist/chunk-PZERKWE2.js +114 -0
- package/dist/chunk-PZERKWE2.js.map +1 -0
- package/dist/{chunk-O5CPXIC4.js → chunk-Q755X6QF.js} +4 -4
- package/dist/{chunk-36YW5E7G.js → chunk-QD3GQ2CH.js} +5 -5
- package/dist/{chunk-ERHTXNIF.js → chunk-RU5XLS5Q.js} +1 -5
- package/dist/{chunk-ERHTXNIF.js.map → chunk-RU5XLS5Q.js.map} +1 -1
- package/dist/{chunk-VQV3DSHD.js → chunk-SJNUTUSJ.js} +5 -5
- package/dist/{chunk-KPRCP3MZ.js → chunk-U2KFFRRX.js} +2 -2
- package/dist/{chunk-CBJTSEI2.js → chunk-VDVLM3KB.js} +54 -6
- package/dist/chunk-VDVLM3KB.js.map +1 -0
- package/dist/{chunk-7NACNRFG.js → chunk-W46L2PXK.js} +32 -23
- package/dist/chunk-W46L2PXK.js.map +1 -0
- package/dist/{chunk-6F3CZLD6.js → chunk-XA7WF3BI.js} +3 -3
- package/dist/{chunk-WN2TUP4M.js → chunk-XYPAOBBV.js} +2 -2
- package/dist/{chunk-LO5QGAP2.js → chunk-YFHVP3VA.js} +5 -12
- package/dist/chunk-YFHVP3VA.js.map +1 -0
- 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 +38 -22
- package/dist/commands/compile.js.map +1 -1
- 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 +35 -15
- package/dist/commands/diff.js.map +1 -1
- package/dist/commands/doctor.js +24 -12
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/edit.js +47 -37
- package/dist/commands/edit.js.map +1 -1
- 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 +28 -28
- 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 +18 -10
- package/dist/commands/outdated.js.map +1 -1
- package/dist/commands/search.js +9 -9
- package/dist/commands/uninstall.js +15 -27
- package/dist/commands/uninstall.js.map +1 -1
- package/dist/commands/update.js +26 -16
- package/dist/commands/update.js.map +1 -1
- package/dist/commands/validate.js +7 -7
- package/dist/components/skill-search/skill-search.js +2 -2
- package/dist/components/wizard/category-grid.js +3 -3
- package/dist/components/wizard/category-grid.test.js +18 -19
- package/dist/components/wizard/category-grid.test.js.map +1 -1
- package/dist/components/wizard/checkbox-grid.js +1 -2
- package/dist/components/wizard/checkbox-grid.test.js +2 -4
- package/dist/components/wizard/checkbox-grid.test.js.map +1 -1
- package/dist/components/wizard/domain-selection.js +10 -11
- package/dist/components/wizard/help-modal.js +2 -2
- package/dist/components/wizard/search-modal.js +2 -2
- package/dist/components/wizard/search-modal.test.js +2 -2
- package/dist/components/wizard/source-grid.js +4 -4
- package/dist/components/wizard/source-grid.test.js +13 -13
- package/dist/components/wizard/stack-selection.js +10 -9
- package/dist/components/wizard/stats-panel.js +12 -0
- package/dist/components/wizard/step-agents.js +9 -10
- package/dist/components/wizard/step-agents.test.js +16 -15
- package/dist/components/wizard/step-agents.test.js.map +1 -1
- package/dist/components/wizard/step-build.js +11 -12
- package/dist/components/wizard/step-build.test.js +34 -32
- package/dist/components/wizard/step-build.test.js.map +1 -1
- package/dist/components/wizard/step-confirm.js +4 -6
- package/dist/components/wizard/step-confirm.test.js +24 -23
- package/dist/components/wizard/step-confirm.test.js.map +1 -1
- package/dist/components/wizard/step-refine.js +2 -3
- package/dist/components/wizard/step-refine.test.js +2 -3
- package/dist/components/wizard/step-refine.test.js.map +1 -1
- package/dist/components/wizard/step-settings.js +8 -9
- package/dist/components/wizard/step-settings.test.js +14 -15
- package/dist/components/wizard/step-settings.test.js.map +1 -1
- package/dist/components/wizard/step-sources.js +11 -12
- package/dist/components/wizard/step-sources.test.js +17 -19
- package/dist/components/wizard/step-sources.test.js.map +1 -1
- package/dist/components/wizard/step-stack.js +12 -14
- package/dist/components/wizard/step-stack.test.js +26 -25
- package/dist/components/wizard/step-stack.test.js.map +1 -1
- package/dist/components/wizard/view-title.js +21 -3
- package/dist/components/wizard/view-title.js.map +1 -1
- package/dist/components/wizard/wizard-layout.js +12 -11
- package/dist/components/wizard/wizard-tabs.js +1 -1
- package/dist/components/wizard/wizard-tabs.test.js +1 -1
- package/dist/components/wizard/wizard.js +26 -26
- package/dist/config-exports.js +1 -1
- package/dist/hooks/init.js +28 -28
- package/dist/{loader-7RQ4G4TH.js → loader-JMOO2A7C.js} +4 -4
- package/dist/{source-loader-CXCIDGWV.js → source-loader-D3VIG3GM.js} +7 -7
- package/dist/source-manager-FPYFJRR7.js +19 -0
- package/dist/source-manager-FPYFJRR7.js.map +1 -0
- package/dist/stores/wizard-store.js +7 -7
- package/dist/stores/wizard-store.test.js +12 -12
- package/dist/stores/wizard-store.test.js.map +1 -1
- package/package.json +1 -1
- package/dist/chunk-2I5SXGXR.js.map +0 -1
- package/dist/chunk-7NACNRFG.js.map +0 -1
- package/dist/chunk-7PMFIL5L.js.map +0 -1
- package/dist/chunk-7PZFDI46.js +0 -40
- package/dist/chunk-7XUKTYVD.js.map +0 -1
- package/dist/chunk-AE2QHAFO.js.map +0 -1
- package/dist/chunk-CBJTSEI2.js.map +0 -1
- package/dist/chunk-CBYRFAUN.js.map +0 -1
- package/dist/chunk-EEZSCHS2.js.map +0 -1
- package/dist/chunk-EWBNSS5Y.js +0 -113
- package/dist/chunk-EWBNSS5Y.js.map +0 -1
- package/dist/chunk-I2SUTL7S.js.map +0 -1
- package/dist/chunk-JNQKCZA3.js +0 -28
- package/dist/chunk-JNQKCZA3.js.map +0 -1
- package/dist/chunk-JWMYAJHD.js.map +0 -1
- package/dist/chunk-LO5QGAP2.js.map +0 -1
- package/dist/chunk-PRG7PKZM.js.map +0 -1
- package/dist/chunk-Q4PJSAMP.js.map +0 -1
- package/dist/chunk-R7F5YQMI.js.map +0 -1
- package/dist/chunk-WS3TL2AO.js.map +0 -1
- package/dist/chunk-WZ5S4LGX.js.map +0 -1
- package/dist/source-manager-TPLO2DVS.js +0 -19
- /package/dist/{chunk-CKU7FJNV.js.map → chunk-7HGMFJ4Y.js.map} +0 -0
- /package/dist/{chunk-UBNHVBSV.js.map → chunk-7JQIMEUX.js.map} +0 -0
- /package/dist/{chunk-XYZ7B5BY.js.map → chunk-7LBYURQR.js.map} +0 -0
- /package/dist/{chunk-NWW3OJH5.js.map → chunk-A5JSBU65.js.map} +0 -0
- /package/dist/{chunk-IDN2OZJY.js.map → chunk-C22ACAL2.js.map} +0 -0
- /package/dist/{chunk-I534EWJQ.js.map → chunk-IFCASC6R.js.map} +0 -0
- /package/dist/{chunk-CCSU4R65.js.map → chunk-MG55NDVG.js.map} +0 -0
- /package/dist/{chunk-M4ZDKHJV.js.map → chunk-MUCQ27HV.js.map} +0 -0
- /package/dist/{chunk-O5CPXIC4.js.map → chunk-Q755X6QF.js.map} +0 -0
- /package/dist/{chunk-36YW5E7G.js.map → chunk-QD3GQ2CH.js.map} +0 -0
- /package/dist/{chunk-VQV3DSHD.js.map → chunk-SJNUTUSJ.js.map} +0 -0
- /package/dist/{chunk-KPRCP3MZ.js.map → chunk-U2KFFRRX.js.map} +0 -0
- /package/dist/{chunk-6F3CZLD6.js.map → chunk-XA7WF3BI.js.map} +0 -0
- /package/dist/{chunk-WN2TUP4M.js.map → chunk-XYPAOBBV.js.map} +0 -0
- /package/dist/{loader-7RQ4G4TH.js.map → components/wizard/stats-panel.js.map} +0 -0
- /package/dist/{source-loader-CXCIDGWV.js.map → loader-JMOO2A7C.js.map} +0 -0
- /package/dist/{source-manager-TPLO2DVS.js.map → source-loader-D3VIG3GM.js.map} +0 -0
|
@@ -10,7 +10,7 @@ import {
|
|
|
10
10
|
} from "../../chunk-66UDJBF6.js";
|
|
11
11
|
import {
|
|
12
12
|
buildSkillConfigs
|
|
13
|
-
} from "../../chunk-
|
|
13
|
+
} from "../../chunk-FUWUCKES.js";
|
|
14
14
|
import {
|
|
15
15
|
afterEach,
|
|
16
16
|
describe,
|
|
@@ -20,18 +20,16 @@ import {
|
|
|
20
20
|
} from "../../chunk-XY3XDVMI.js";
|
|
21
21
|
import {
|
|
22
22
|
StepConfirm
|
|
23
|
-
} from "../../chunk-
|
|
24
|
-
import "../../chunk-
|
|
25
|
-
import "../../chunk-
|
|
26
|
-
import "../../chunk-
|
|
27
|
-
import "../../chunk-
|
|
28
|
-
import "../../chunk-
|
|
29
|
-
import "../../chunk-
|
|
30
|
-
import "../../chunk-
|
|
31
|
-
import "../../chunk-WN2TUP4M.js";
|
|
32
|
-
import "../../chunk-Q4PJSAMP.js";
|
|
23
|
+
} from "../../chunk-NKLNT7N7.js";
|
|
24
|
+
import "../../chunk-7JQIMEUX.js";
|
|
25
|
+
import "../../chunk-N34D3ROY.js";
|
|
26
|
+
import "../../chunk-OIHZ2YH3.js";
|
|
27
|
+
import "../../chunk-IFCASC6R.js";
|
|
28
|
+
import "../../chunk-FSK4TQX7.js";
|
|
29
|
+
import "../../chunk-XYPAOBBV.js";
|
|
30
|
+
import "../../chunk-32HX6UYI.js";
|
|
33
31
|
import "../../chunk-FMYAYX6W.js";
|
|
34
|
-
import "../../chunk-
|
|
32
|
+
import "../../chunk-EO6KJI5D.js";
|
|
35
33
|
import {
|
|
36
34
|
init_esm_shims
|
|
37
35
|
} from "../../chunk-DHET7RCE.js";
|
|
@@ -46,7 +44,7 @@ describe("StepConfirm component", () => {
|
|
|
46
44
|
cleanup = void 0;
|
|
47
45
|
});
|
|
48
46
|
describe("stack path", () => {
|
|
49
|
-
it("should render
|
|
47
|
+
it("should render technology and skill counts for stack", () => {
|
|
50
48
|
const onComplete = vi.fn();
|
|
51
49
|
const onBack = vi.fn();
|
|
52
50
|
const { lastFrame, unmount } = render(
|
|
@@ -63,7 +61,8 @@ describe("StepConfirm component", () => {
|
|
|
63
61
|
);
|
|
64
62
|
cleanup = unmount;
|
|
65
63
|
const output = lastFrame();
|
|
66
|
-
globalExpect(output).toContain("
|
|
64
|
+
globalExpect(output).toContain("Technologies:");
|
|
65
|
+
globalExpect(output).toContain("12");
|
|
67
66
|
});
|
|
68
67
|
it("should show technology count", () => {
|
|
69
68
|
const onComplete = vi.fn();
|
|
@@ -149,7 +148,7 @@ describe("StepConfirm component", () => {
|
|
|
149
148
|
globalExpect(output).toContain("Install mode:");
|
|
150
149
|
globalExpect(output).toContain("Local");
|
|
151
150
|
});
|
|
152
|
-
it("should render confirm step content", () => {
|
|
151
|
+
it("should render confirm step stats content", () => {
|
|
153
152
|
const onComplete = vi.fn();
|
|
154
153
|
const onBack = vi.fn();
|
|
155
154
|
const { lastFrame, unmount } = render(
|
|
@@ -166,11 +165,12 @@ describe("StepConfirm component", () => {
|
|
|
166
165
|
);
|
|
167
166
|
cleanup = unmount;
|
|
168
167
|
const output = lastFrame();
|
|
169
|
-
globalExpect(output).toContain("
|
|
168
|
+
globalExpect(output).toContain("Technologies:");
|
|
169
|
+
globalExpect(output).toContain("Skills:");
|
|
170
170
|
});
|
|
171
171
|
});
|
|
172
172
|
describe("scratch path", () => {
|
|
173
|
-
it("should render
|
|
173
|
+
it("should render domain breakdown with technologies for custom stack", () => {
|
|
174
174
|
const onComplete = vi.fn();
|
|
175
175
|
const onBack = vi.fn();
|
|
176
176
|
const { lastFrame, unmount } = render(
|
|
@@ -194,8 +194,8 @@ describe("StepConfirm component", () => {
|
|
|
194
194
|
);
|
|
195
195
|
cleanup = unmount;
|
|
196
196
|
const output = lastFrame();
|
|
197
|
-
globalExpect(output).toContain("
|
|
198
|
-
globalExpect(output).toContain("
|
|
197
|
+
globalExpect(output).toContain("Web:");
|
|
198
|
+
globalExpect(output).toContain("API:");
|
|
199
199
|
});
|
|
200
200
|
it("should show domain breakdown with technologies", () => {
|
|
201
201
|
const onComplete = vi.fn();
|
|
@@ -227,7 +227,7 @@ describe("StepConfirm component", () => {
|
|
|
227
227
|
globalExpect(output).toContain("API:");
|
|
228
228
|
globalExpect(output).toContain("hono");
|
|
229
229
|
});
|
|
230
|
-
it("should
|
|
230
|
+
it("should render single domain breakdown without plus sign", () => {
|
|
231
231
|
const onComplete = vi.fn();
|
|
232
232
|
const onBack = vi.fn();
|
|
233
233
|
const { lastFrame, unmount } = render(
|
|
@@ -247,7 +247,8 @@ describe("StepConfirm component", () => {
|
|
|
247
247
|
);
|
|
248
248
|
cleanup = unmount;
|
|
249
249
|
const output = lastFrame();
|
|
250
|
-
globalExpect(output).toContain("
|
|
250
|
+
globalExpect(output).toContain("Web:");
|
|
251
|
+
globalExpect(output).toContain("react");
|
|
251
252
|
globalExpect(output).not.toContain("+");
|
|
252
253
|
});
|
|
253
254
|
it("should skip domains with no selections", () => {
|
|
@@ -409,12 +410,12 @@ describe("StepConfirm component", () => {
|
|
|
409
410
|
});
|
|
410
411
|
});
|
|
411
412
|
describe("default props", () => {
|
|
412
|
-
it("should render
|
|
413
|
+
it("should render without crashing when no stack name provided", () => {
|
|
413
414
|
const onComplete = vi.fn();
|
|
414
415
|
const { lastFrame, unmount } = render(/* @__PURE__ */ jsx(StepConfirm, { onComplete }));
|
|
415
416
|
cleanup = unmount;
|
|
416
417
|
const output = lastFrame();
|
|
417
|
-
globalExpect(output).
|
|
418
|
+
globalExpect(output).toBeDefined();
|
|
418
419
|
});
|
|
419
420
|
it("should not show stats when not provided", () => {
|
|
420
421
|
const onComplete = vi.fn();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/cli/components/wizard/step-confirm.test.tsx"],"sourcesContent":["import { render } from \"ink-testing-library\";\nimport { afterEach, describe, expect, it, vi } from \"vitest\";\nimport { StepConfirm } from \"./step-confirm\";\nimport { ENTER, ESCAPE, RENDER_DELAY_MS, delay } from \"../../lib/__tests__/test-constants\";\nimport { buildSkillConfigs } from \"../../lib/__tests__/helpers\";\n\ndescribe(\"StepConfirm component\", () => {\n let cleanup: (() => void) | undefined;\n\n afterEach(() => {\n cleanup?.();\n cleanup = undefined;\n });\n\n describe(\"stack path\", () => {\n it(\"should render stack name in title\", () => {\n const onComplete = vi.fn();\n const onBack = vi.fn();\n\n const { lastFrame, unmount } = render(\n <StepConfirm\n onComplete={onComplete}\n stackName=\"nextjs-fullstack\"\n technologyCount={12}\n skillCount={12}\n onBack={onBack}\n />,\n );\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Ready to install nextjs-fullstack\");\n });\n\n it(\"should show technology count\", () => {\n const onComplete = vi.fn();\n const onBack = vi.fn();\n\n const { lastFrame, unmount } = render(\n <StepConfirm\n onComplete={onComplete}\n stackName=\"nextjs-fullstack\"\n technologyCount={12}\n skillCount={12}\n onBack={onBack}\n />,\n );\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Technologies:\");\n expect(output).toContain(\"12\");\n });\n\n it(\"should show skill count with verified label\", () => {\n const onComplete = vi.fn();\n const onBack = vi.fn();\n\n const { lastFrame, unmount } = render(\n <StepConfirm\n onComplete={onComplete}\n stackName=\"nextjs-fullstack\"\n technologyCount={12}\n skillCount={12}\n onBack={onBack}\n />,\n );\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Skills:\");\n expect(output).toContain(\"(all verified)\");\n });\n\n it(\"should show install mode as Plugin\", () => {\n const onComplete = vi.fn();\n const onBack = vi.fn();\n\n const { lastFrame, unmount } = render(\n <StepConfirm\n onComplete={onComplete}\n stackName=\"nextjs-fullstack\"\n technologyCount={12}\n skillCount={12}\n skillConfigs={buildSkillConfigs([\"web-framework-react\", \"web-styling-scss-modules\"], {\n source: \"agents-inc\",\n })}\n onBack={onBack}\n />,\n );\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Install mode:\");\n expect(output).toContain(\"Plugin\");\n });\n\n it(\"should show install mode as Local\", () => {\n const onComplete = vi.fn();\n const onBack = vi.fn();\n\n const { lastFrame, unmount } = render(\n <StepConfirm\n onComplete={onComplete}\n stackName=\"nextjs-fullstack\"\n technologyCount={12}\n skillCount={12}\n skillConfigs={buildSkillConfigs([\"web-framework-react\", \"web-styling-scss-modules\"])}\n onBack={onBack}\n />,\n );\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Install mode:\");\n expect(output).toContain(\"Local\");\n });\n\n it(\"should render confirm step content\", () => {\n const onComplete = vi.fn();\n const onBack = vi.fn();\n\n const { lastFrame, unmount } = render(\n <StepConfirm\n onComplete={onComplete}\n stackName=\"nextjs-fullstack\"\n technologyCount={12}\n skillCount={12}\n onBack={onBack}\n />,\n );\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Ready to install\");\n });\n });\n\n describe(\"scratch path\", () => {\n it(\"should render custom stack title with domain names\", () => {\n const onComplete = vi.fn();\n const onBack = vi.fn();\n\n const { lastFrame, unmount } = render(\n <StepConfirm\n onComplete={onComplete}\n selectedDomains={[\"web\", \"api\"]}\n domainSelections={{\n web: {\n \"web-framework\": [\"web-framework-react\"],\n \"web-styling\": [\"web-styling-scss-modules\"],\n },\n api: { \"api-api\": [\"api-framework-hono\"] },\n }}\n technologyCount={3}\n skillCount={3}\n onBack={onBack}\n />,\n );\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Ready to install your custom stack\");\n expect(output).toContain(\"Web + API\");\n });\n\n it(\"should show domain breakdown with technologies\", () => {\n const onComplete = vi.fn();\n const onBack = vi.fn();\n\n const { lastFrame, unmount } = render(\n <StepConfirm\n onComplete={onComplete}\n selectedDomains={[\"web\", \"api\"]}\n domainSelections={{\n web: {\n \"web-framework\": [\"web-framework-react\"],\n \"web-styling\": [\"web-styling-scss-modules\"],\n },\n api: { \"api-api\": [\"api-framework-hono\"] },\n }}\n technologyCount={3}\n skillCount={3}\n onBack={onBack}\n />,\n );\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Web:\");\n expect(output).toContain(\"react\");\n expect(output).toContain(\"scss-modules\");\n expect(output).toContain(\"API:\");\n expect(output).toContain(\"hono\");\n });\n\n it(\"should handle single domain without plus sign\", () => {\n const onComplete = vi.fn();\n const onBack = vi.fn();\n\n const { lastFrame, unmount } = render(\n <StepConfirm\n onComplete={onComplete}\n selectedDomains={[\"web\"]}\n domainSelections={{\n web: { \"web-framework\": [\"web-framework-react\"] },\n }}\n technologyCount={1}\n skillCount={1}\n onBack={onBack}\n />,\n );\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"(Web)\");\n expect(output).not.toContain(\"+\");\n });\n\n it(\"should skip domains with no selections\", () => {\n const onComplete = vi.fn();\n const onBack = vi.fn();\n\n const { lastFrame, unmount } = render(\n <StepConfirm\n onComplete={onComplete}\n selectedDomains={[\"web\", \"api\"]}\n domainSelections={{\n web: { \"web-framework\": [\"web-framework-react\"] },\n api: {}, // Empty selections\n }}\n technologyCount={1}\n skillCount={1}\n onBack={onBack}\n />,\n );\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Web:\");\n expect(output).toContain(\"react\");\n // API section should not appear since no technologies selected\n const lines = output?.split(\"\\n\") || [];\n const apiLine = lines.find((line) => line.includes(\"API:\") && line.includes(\"hono\"));\n expect(apiLine).toBeUndefined();\n });\n });\n\n describe(\"keyboard navigation\", () => {\n it(\"should call onComplete when Enter is pressed\", async () => {\n const onComplete = vi.fn();\n const onBack = vi.fn();\n\n const { stdin, unmount } = render(\n <StepConfirm\n onComplete={onComplete}\n stackName=\"nextjs-fullstack\"\n technologyCount={12}\n skillCount={12}\n onBack={onBack}\n />,\n );\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(ENTER);\n await delay(RENDER_DELAY_MS);\n\n expect(onComplete).toHaveBeenCalled();\n });\n\n it(\"should call onBack when Escape is pressed\", async () => {\n const onComplete = vi.fn();\n const onBack = vi.fn();\n\n const { stdin, unmount } = render(\n <StepConfirm\n onComplete={onComplete}\n stackName=\"nextjs-fullstack\"\n technologyCount={12}\n skillCount={12}\n onBack={onBack}\n />,\n );\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(ESCAPE);\n await delay(RENDER_DELAY_MS);\n\n expect(onBack).toHaveBeenCalled();\n expect(onComplete).not.toHaveBeenCalled();\n });\n\n it(\"should not call onBack when Escape is pressed but onBack is not provided\", async () => {\n const onComplete = vi.fn();\n\n const { stdin, unmount } = render(\n <StepConfirm\n onComplete={onComplete}\n stackName=\"nextjs-fullstack\"\n technologyCount={12}\n skillCount={12}\n // No onBack provided\n />,\n );\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(ESCAPE);\n await delay(RENDER_DELAY_MS);\n\n // Should not crash and onComplete should not be called\n expect(onComplete).not.toHaveBeenCalled();\n });\n });\n\n describe(\"install mode display\", () => {\n it('should show \"Plugin\" when all skills use non-local source', () => {\n const onComplete = vi.fn();\n\n const { lastFrame, unmount } = render(\n <StepConfirm\n onComplete={onComplete}\n skillConfigs={buildSkillConfigs([\"web-framework-react\", \"web-styling-scss-modules\"], {\n source: \"agents-inc\",\n })}\n />,\n );\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Install mode:\");\n expect(output).toContain(\"Plugin\");\n });\n\n it('should show \"Local (editable copies)\" when all skills are local', () => {\n const onComplete = vi.fn();\n\n const { lastFrame, unmount } = render(\n <StepConfirm\n onComplete={onComplete}\n skillConfigs={buildSkillConfigs([\"web-framework-react\", \"web-styling-scss-modules\"])}\n />,\n );\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Install mode:\");\n expect(output).toContain(\"Local (editable copies)\");\n });\n\n it('should show \"Mixed\" with counts when skills have mixed sources', () => {\n const onComplete = vi.fn();\n\n const { lastFrame, unmount } = render(\n <StepConfirm\n onComplete={onComplete}\n skillConfigs={[\n ...buildSkillConfigs([\"web-framework-react\"]),\n ...buildSkillConfigs([\"web-styling-scss-modules\"], { source: \"agents-inc\" }),\n ...buildSkillConfigs([\"web-state-zustand\"]),\n ]}\n />,\n );\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Install mode:\");\n expect(output).toContain(\"Mixed\");\n expect(output).toContain(\"2 local\");\n expect(output).toContain(\"1 plugin\");\n });\n\n it(\"should not show install mode when skillConfigs is not provided\", () => {\n const onComplete = vi.fn();\n\n const { lastFrame, unmount } = render(<StepConfirm onComplete={onComplete} />);\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).not.toContain(\"Install mode:\");\n });\n });\n\n describe(\"default props\", () => {\n it(\"should render custom stack title when no stack name provided\", () => {\n const onComplete = vi.fn();\n\n const { lastFrame, unmount } = render(<StepConfirm onComplete={onComplete} />);\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Ready to install your custom stack\");\n });\n\n it(\"should not show stats when not provided\", () => {\n const onComplete = vi.fn();\n\n const { lastFrame, unmount } = render(<StepConfirm onComplete={onComplete} />);\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).not.toContain(\"Technologies:\");\n expect(output).not.toContain(\"Skills:\");\n expect(output).not.toContain(\"Install mode:\");\n });\n });\n});\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../src/cli/components/wizard/step-confirm.test.tsx"],"sourcesContent":["import { render } from \"ink-testing-library\";\nimport { afterEach, describe, expect, it, vi } from \"vitest\";\nimport { StepConfirm } from \"./step-confirm\";\nimport { ENTER, ESCAPE, RENDER_DELAY_MS, delay } from \"../../lib/__tests__/test-constants\";\nimport { buildSkillConfigs } from \"../../lib/__tests__/helpers\";\n\ndescribe(\"StepConfirm component\", () => {\n let cleanup: (() => void) | undefined;\n\n afterEach(() => {\n cleanup?.();\n cleanup = undefined;\n });\n\n describe(\"stack path\", () => {\n it(\"should render technology and skill counts for stack\", () => {\n const onComplete = vi.fn();\n const onBack = vi.fn();\n\n const { lastFrame, unmount } = render(\n <StepConfirm\n onComplete={onComplete}\n stackName=\"nextjs-fullstack\"\n technologyCount={12}\n skillCount={12}\n onBack={onBack}\n />,\n );\n cleanup = unmount;\n\n const output = lastFrame();\n // ViewTitle removed; verify stats render (title shown by wizard-layout)\n expect(output).toContain(\"Technologies:\");\n expect(output).toContain(\"12\");\n });\n\n it(\"should show technology count\", () => {\n const onComplete = vi.fn();\n const onBack = vi.fn();\n\n const { lastFrame, unmount } = render(\n <StepConfirm\n onComplete={onComplete}\n stackName=\"nextjs-fullstack\"\n technologyCount={12}\n skillCount={12}\n onBack={onBack}\n />,\n );\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Technologies:\");\n expect(output).toContain(\"12\");\n });\n\n it(\"should show skill count with verified label\", () => {\n const onComplete = vi.fn();\n const onBack = vi.fn();\n\n const { lastFrame, unmount } = render(\n <StepConfirm\n onComplete={onComplete}\n stackName=\"nextjs-fullstack\"\n technologyCount={12}\n skillCount={12}\n onBack={onBack}\n />,\n );\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Skills:\");\n expect(output).toContain(\"(all verified)\");\n });\n\n it(\"should show install mode as Plugin\", () => {\n const onComplete = vi.fn();\n const onBack = vi.fn();\n\n const { lastFrame, unmount } = render(\n <StepConfirm\n onComplete={onComplete}\n stackName=\"nextjs-fullstack\"\n technologyCount={12}\n skillCount={12}\n skillConfigs={buildSkillConfigs([\"web-framework-react\", \"web-styling-scss-modules\"], {\n source: \"agents-inc\",\n })}\n onBack={onBack}\n />,\n );\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Install mode:\");\n expect(output).toContain(\"Plugin\");\n });\n\n it(\"should show install mode as Local\", () => {\n const onComplete = vi.fn();\n const onBack = vi.fn();\n\n const { lastFrame, unmount } = render(\n <StepConfirm\n onComplete={onComplete}\n stackName=\"nextjs-fullstack\"\n technologyCount={12}\n skillCount={12}\n skillConfigs={buildSkillConfigs([\"web-framework-react\", \"web-styling-scss-modules\"])}\n onBack={onBack}\n />,\n );\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Install mode:\");\n expect(output).toContain(\"Local\");\n });\n\n it(\"should render confirm step stats content\", () => {\n const onComplete = vi.fn();\n const onBack = vi.fn();\n\n const { lastFrame, unmount } = render(\n <StepConfirm\n onComplete={onComplete}\n stackName=\"nextjs-fullstack\"\n technologyCount={12}\n skillCount={12}\n onBack={onBack}\n />,\n );\n cleanup = unmount;\n\n const output = lastFrame();\n // ViewTitle removed; verify stats are shown (title shown by wizard-layout)\n expect(output).toContain(\"Technologies:\");\n expect(output).toContain(\"Skills:\");\n });\n });\n\n describe(\"scratch path\", () => {\n it(\"should render domain breakdown with technologies for custom stack\", () => {\n const onComplete = vi.fn();\n const onBack = vi.fn();\n\n const { lastFrame, unmount } = render(\n <StepConfirm\n onComplete={onComplete}\n selectedDomains={[\"web\", \"api\"]}\n domainSelections={{\n web: {\n \"web-framework\": [\"web-framework-react\"],\n \"web-styling\": [\"web-styling-scss-modules\"],\n },\n api: { \"api-api\": [\"api-framework-hono\"] },\n }}\n technologyCount={3}\n skillCount={3}\n onBack={onBack}\n />,\n );\n cleanup = unmount;\n\n const output = lastFrame();\n // ViewTitle removed; verify domain breakdown renders (title shown by wizard-layout)\n expect(output).toContain(\"Web:\");\n expect(output).toContain(\"API:\");\n });\n\n it(\"should show domain breakdown with technologies\", () => {\n const onComplete = vi.fn();\n const onBack = vi.fn();\n\n const { lastFrame, unmount } = render(\n <StepConfirm\n onComplete={onComplete}\n selectedDomains={[\"web\", \"api\"]}\n domainSelections={{\n web: {\n \"web-framework\": [\"web-framework-react\"],\n \"web-styling\": [\"web-styling-scss-modules\"],\n },\n api: { \"api-api\": [\"api-framework-hono\"] },\n }}\n technologyCount={3}\n skillCount={3}\n onBack={onBack}\n />,\n );\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Web:\");\n expect(output).toContain(\"react\");\n expect(output).toContain(\"scss-modules\");\n expect(output).toContain(\"API:\");\n expect(output).toContain(\"hono\");\n });\n\n it(\"should render single domain breakdown without plus sign\", () => {\n const onComplete = vi.fn();\n const onBack = vi.fn();\n\n const { lastFrame, unmount } = render(\n <StepConfirm\n onComplete={onComplete}\n selectedDomains={[\"web\"]}\n domainSelections={{\n web: { \"web-framework\": [\"web-framework-react\"] },\n }}\n technologyCount={1}\n skillCount={1}\n onBack={onBack}\n />,\n );\n cleanup = unmount;\n\n const output = lastFrame();\n // ViewTitle removed; verify domain breakdown renders\n expect(output).toContain(\"Web:\");\n expect(output).toContain(\"react\");\n expect(output).not.toContain(\"+\");\n });\n\n it(\"should skip domains with no selections\", () => {\n const onComplete = vi.fn();\n const onBack = vi.fn();\n\n const { lastFrame, unmount } = render(\n <StepConfirm\n onComplete={onComplete}\n selectedDomains={[\"web\", \"api\"]}\n domainSelections={{\n web: { \"web-framework\": [\"web-framework-react\"] },\n api: {}, // Empty selections\n }}\n technologyCount={1}\n skillCount={1}\n onBack={onBack}\n />,\n );\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Web:\");\n expect(output).toContain(\"react\");\n // API section should not appear since no technologies selected\n const lines = output?.split(\"\\n\") || [];\n const apiLine = lines.find((line) => line.includes(\"API:\") && line.includes(\"hono\"));\n expect(apiLine).toBeUndefined();\n });\n });\n\n describe(\"keyboard navigation\", () => {\n it(\"should call onComplete when Enter is pressed\", async () => {\n const onComplete = vi.fn();\n const onBack = vi.fn();\n\n const { stdin, unmount } = render(\n <StepConfirm\n onComplete={onComplete}\n stackName=\"nextjs-fullstack\"\n technologyCount={12}\n skillCount={12}\n onBack={onBack}\n />,\n );\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(ENTER);\n await delay(RENDER_DELAY_MS);\n\n expect(onComplete).toHaveBeenCalled();\n });\n\n it(\"should call onBack when Escape is pressed\", async () => {\n const onComplete = vi.fn();\n const onBack = vi.fn();\n\n const { stdin, unmount } = render(\n <StepConfirm\n onComplete={onComplete}\n stackName=\"nextjs-fullstack\"\n technologyCount={12}\n skillCount={12}\n onBack={onBack}\n />,\n );\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(ESCAPE);\n await delay(RENDER_DELAY_MS);\n\n expect(onBack).toHaveBeenCalled();\n expect(onComplete).not.toHaveBeenCalled();\n });\n\n it(\"should not call onBack when Escape is pressed but onBack is not provided\", async () => {\n const onComplete = vi.fn();\n\n const { stdin, unmount } = render(\n <StepConfirm\n onComplete={onComplete}\n stackName=\"nextjs-fullstack\"\n technologyCount={12}\n skillCount={12}\n // No onBack provided\n />,\n );\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(ESCAPE);\n await delay(RENDER_DELAY_MS);\n\n // Should not crash and onComplete should not be called\n expect(onComplete).not.toHaveBeenCalled();\n });\n });\n\n describe(\"install mode display\", () => {\n it('should show \"Plugin\" when all skills use non-local source', () => {\n const onComplete = vi.fn();\n\n const { lastFrame, unmount } = render(\n <StepConfirm\n onComplete={onComplete}\n skillConfigs={buildSkillConfigs([\"web-framework-react\", \"web-styling-scss-modules\"], {\n source: \"agents-inc\",\n })}\n />,\n );\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Install mode:\");\n expect(output).toContain(\"Plugin\");\n });\n\n it('should show \"Local (editable copies)\" when all skills are local', () => {\n const onComplete = vi.fn();\n\n const { lastFrame, unmount } = render(\n <StepConfirm\n onComplete={onComplete}\n skillConfigs={buildSkillConfigs([\"web-framework-react\", \"web-styling-scss-modules\"])}\n />,\n );\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Install mode:\");\n expect(output).toContain(\"Local (editable copies)\");\n });\n\n it('should show \"Mixed\" with counts when skills have mixed sources', () => {\n const onComplete = vi.fn();\n\n const { lastFrame, unmount } = render(\n <StepConfirm\n onComplete={onComplete}\n skillConfigs={[\n ...buildSkillConfigs([\"web-framework-react\"]),\n ...buildSkillConfigs([\"web-styling-scss-modules\"], { source: \"agents-inc\" }),\n ...buildSkillConfigs([\"web-state-zustand\"]),\n ]}\n />,\n );\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Install mode:\");\n expect(output).toContain(\"Mixed\");\n expect(output).toContain(\"2 local\");\n expect(output).toContain(\"1 plugin\");\n });\n\n it(\"should not show install mode when skillConfigs is not provided\", () => {\n const onComplete = vi.fn();\n\n const { lastFrame, unmount } = render(<StepConfirm onComplete={onComplete} />);\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).not.toContain(\"Install mode:\");\n });\n });\n\n describe(\"default props\", () => {\n it(\"should render without crashing when no stack name provided\", () => {\n const onComplete = vi.fn();\n\n const { lastFrame, unmount } = render(<StepConfirm onComplete={onComplete} />);\n cleanup = unmount;\n\n const output = lastFrame();\n // ViewTitle removed; component renders empty when no stats provided\n expect(output).toBeDefined();\n });\n\n it(\"should not show stats when not provided\", () => {\n const onComplete = vi.fn();\n\n const { lastFrame, unmount } = render(<StepConfirm onComplete={onComplete} />);\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).not.toContain(\"Technologies:\");\n expect(output).not.toContain(\"Skills:\");\n expect(output).not.toContain(\"Install mode:\");\n });\n });\n});\n"],"mappings":"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","names":[]}
|
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
StepRefine
|
|
4
|
-
} from "../../chunk-
|
|
5
|
-
import "../../chunk-
|
|
6
|
-
import "../../chunk-CBYRFAUN.js";
|
|
4
|
+
} from "../../chunk-LVBRC2CP.js";
|
|
5
|
+
import "../../chunk-HK53FRMU.js";
|
|
7
6
|
import "../../chunk-FMYAYX6W.js";
|
|
8
7
|
import "../../chunk-DHET7RCE.js";
|
|
9
8
|
export {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
StepRefine
|
|
4
|
-
} from "../../chunk-
|
|
4
|
+
} from "../../chunk-LVBRC2CP.js";
|
|
5
5
|
import {
|
|
6
6
|
ARROW_DOWN,
|
|
7
7
|
ARROW_UP,
|
|
@@ -21,8 +21,7 @@ import {
|
|
|
21
21
|
it,
|
|
22
22
|
vi
|
|
23
23
|
} from "../../chunk-XY3XDVMI.js";
|
|
24
|
-
import "../../chunk-
|
|
25
|
-
import "../../chunk-CBYRFAUN.js";
|
|
24
|
+
import "../../chunk-HK53FRMU.js";
|
|
26
25
|
import {
|
|
27
26
|
DEFAULT_BRANDING
|
|
28
27
|
} from "../../chunk-FMYAYX6W.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/cli/components/wizard/step-refine.test.tsx"],"sourcesContent":["import { render } from \"ink-testing-library\";\nimport { describe, expect, it, afterEach, vi } from \"vitest\";\nimport { StepRefine, type StepRefineProps } from \"./step-refine\";\nimport {\n ENTER,\n ESCAPE,\n ARROW_UP,\n ARROW_DOWN,\n RENDER_DELAY_MS,\n INPUT_DELAY_MS,\n delay,\n} from \"../../lib/__tests__/test-constants\";\nimport { DEFAULT_BRANDING } from \"../../consts\";\n\nconst defaultProps: StepRefineProps = {\n technologyCount: 12,\n refineAction: \"all-recommended\",\n onSelectAction: vi.fn(),\n onContinue: vi.fn(),\n onBack: vi.fn(),\n};\n\nconst renderStepRefine = (props: Partial<StepRefineProps> = {}) => {\n return render(<StepRefine {...defaultProps} {...props} />);\n};\n\ndescribe(\"StepRefine component\", () => {\n let cleanup: (() => void) | undefined;\n\n afterEach(() => {\n cleanup?.();\n cleanup = undefined;\n });\n\n describe(\"rendering\", () => {\n it(\"should render technology count correctly\", () => {\n const { lastFrame, unmount } = renderStepRefine({ technologyCount: 12 });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"12\");\n expect(output).toContain(\"technologies\");\n });\n\n it(\"should render different technology count\", () => {\n const { lastFrame, unmount } = renderStepRefine({ technologyCount: 5 });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"5\");\n expect(output).toContain(\"technologies\");\n });\n\n it(\"should render 'Use all recommended' option\", () => {\n const { lastFrame, unmount } = renderStepRefine();\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Use all recommended skills (verified)\");\n });\n\n it(\"should show 'Use all recommended' option as highlighted\", () => {\n const { lastFrame, unmount } = renderStepRefine({\n refineAction: \"all-recommended\",\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // The option should have the \">\" indicator\n expect(output).toContain(\">\");\n expect(output).toContain(\"Use all recommended skills\");\n });\n\n it(\"should render verification description\", () => {\n const { lastFrame, unmount } = renderStepRefine();\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"fastest option\");\n expect(output).toContain(\"verified\");\n expect(output).toContain(DEFAULT_BRANDING.NAME);\n });\n });\n\n describe(\"customize option\", () => {\n it(\"should show 'Customize' option as disabled/grayed\", () => {\n const { lastFrame, unmount } = renderStepRefine();\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Customize skill sources\");\n });\n\n it(\"should show customize option without coming soon label\", () => {\n const { lastFrame, unmount } = renderStepRefine();\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Customize skill sources\");\n expect(output).not.toContain(\"(coming soon)\");\n });\n\n it(\"should show customize description\", () => {\n const { lastFrame, unmount } = renderStepRefine();\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Choose alternative skills for each technology\");\n });\n });\n\n describe(\"keyboard shortcuts display\", () => {\n it(\"should render recommended option content\", () => {\n const { lastFrame, unmount } = renderStepRefine();\n cleanup = unmount;\n\n const output = lastFrame();\n // Keyboard hints are now in WizardLayout footer, not in StepRefine\n // Verify core content renders\n expect(output).toContain(\"Use all recommended\");\n expect(output).toContain(\"Customize skill sources\");\n });\n });\n\n describe(\"keyboard navigation\", () => {\n it(\"should call onContinue when Enter key is pressed\", async () => {\n const onContinue = vi.fn();\n const { stdin, unmount } = renderStepRefine({ onContinue });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n stdin.write(ENTER);\n await delay(INPUT_DELAY_MS);\n\n expect(onContinue).toHaveBeenCalledTimes(1);\n });\n\n it(\"should call onBack when Escape key is pressed\", async () => {\n const onBack = vi.fn();\n const { stdin, unmount } = renderStepRefine({ onBack });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n stdin.write(ESCAPE);\n await delay(INPUT_DELAY_MS);\n\n expect(onBack).toHaveBeenCalledTimes(1);\n });\n\n it(\"should toggle to 'customize' on arrow up when recommended is selected\", async () => {\n const onSelectAction = vi.fn();\n const { stdin, unmount } = renderStepRefine({\n onSelectAction,\n refineAction: \"all-recommended\",\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n stdin.write(ARROW_UP);\n await delay(INPUT_DELAY_MS);\n\n expect(onSelectAction).toHaveBeenCalledWith(\"customize\");\n });\n\n it(\"should toggle to 'all-recommended' on arrow down when customize is selected\", async () => {\n const onSelectAction = vi.fn();\n const { stdin, unmount } = renderStepRefine({\n onSelectAction,\n refineAction: \"customize\",\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n stdin.write(ARROW_DOWN);\n await delay(INPUT_DELAY_MS);\n\n expect(onSelectAction).toHaveBeenCalledWith(\"all-recommended\");\n });\n });\n\n describe(\"selection state\", () => {\n it(\"should handle null refineAction (defaults to recommended)\", () => {\n const { lastFrame, unmount } = renderStepRefine({ refineAction: null });\n cleanup = unmount;\n\n const output = lastFrame();\n // Should still show the recommended option with indicator\n expect(output).toContain(\">\");\n expect(output).toContain(\"Use all recommended\");\n });\n\n it(\"should handle 'all-recommended' refineAction\", () => {\n const { lastFrame, unmount } = renderStepRefine({\n refineAction: \"all-recommended\",\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Use all recommended\");\n });\n\n it(\"should handle 'customize' refineAction (even though disabled)\", () => {\n const { lastFrame, unmount } = renderStepRefine({\n refineAction: \"customize\",\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // Should still render, even if customize is selected\n expect(output).toContain(\"Use all recommended\");\n expect(output).toContain(\"Customize skill sources\");\n });\n });\n\n describe(\"edge cases\", () => {\n it(\"should handle zero technology count\", () => {\n const { lastFrame, unmount } = renderStepRefine({ technologyCount: 0 });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"0\");\n expect(output).toContain(\"technologies\");\n });\n\n it(\"should handle single technology count\", () => {\n const { lastFrame, unmount } = renderStepRefine({ technologyCount: 1 });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"1\");\n // Note: \"technologies\" is plural even for 1 (simple implementation)\n expect(output).toContain(\"technologies\");\n });\n\n it(\"should handle large technology count\", () => {\n const { lastFrame, unmount } = renderStepRefine({ technologyCount: 100 });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"100\");\n expect(output).toContain(\"technologies\");\n });\n });\n\n describe(\"multiple keyboard events\", () => {\n it(\"should allow multiple Enter presses\", async () => {\n const onContinue = vi.fn();\n const { stdin, unmount } = renderStepRefine({ 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 it(\"should allow multiple Escape presses\", async () => {\n const onBack = vi.fn();\n const { stdin, unmount } = renderStepRefine({ onBack });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n stdin.write(ESCAPE);\n await delay(INPUT_DELAY_MS);\n stdin.write(ESCAPE);\n await delay(INPUT_DELAY_MS);\n\n expect(onBack).toHaveBeenCalledTimes(2);\n });\n });\n});\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../src/cli/components/wizard/step-refine.test.tsx"],"sourcesContent":["import { render } from \"ink-testing-library\";\nimport { describe, expect, it, afterEach, vi } from \"vitest\";\nimport { StepRefine, type StepRefineProps } from \"./step-refine\";\nimport {\n ENTER,\n ESCAPE,\n ARROW_UP,\n ARROW_DOWN,\n RENDER_DELAY_MS,\n INPUT_DELAY_MS,\n delay,\n} from \"../../lib/__tests__/test-constants\";\nimport { DEFAULT_BRANDING } from \"../../consts\";\n\nconst defaultProps: StepRefineProps = {\n technologyCount: 12,\n refineAction: \"all-recommended\",\n onSelectAction: vi.fn(),\n onContinue: vi.fn(),\n onBack: vi.fn(),\n};\n\nconst renderStepRefine = (props: Partial<StepRefineProps> = {}) => {\n return render(<StepRefine {...defaultProps} {...props} />);\n};\n\ndescribe(\"StepRefine component\", () => {\n let cleanup: (() => void) | undefined;\n\n afterEach(() => {\n cleanup?.();\n cleanup = undefined;\n });\n\n describe(\"rendering\", () => {\n it(\"should render technology count correctly\", () => {\n const { lastFrame, unmount } = renderStepRefine({ technologyCount: 12 });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"12\");\n expect(output).toContain(\"technologies\");\n });\n\n it(\"should render different technology count\", () => {\n const { lastFrame, unmount } = renderStepRefine({ technologyCount: 5 });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"5\");\n expect(output).toContain(\"technologies\");\n });\n\n it(\"should render 'Use all recommended' option\", () => {\n const { lastFrame, unmount } = renderStepRefine();\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Use all recommended skills (verified)\");\n });\n\n it(\"should show 'Use all recommended' option as highlighted\", () => {\n const { lastFrame, unmount } = renderStepRefine({\n refineAction: \"all-recommended\",\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // The option should have the \">\" indicator\n expect(output).toContain(\">\");\n expect(output).toContain(\"Use all recommended skills\");\n });\n\n it(\"should render verification description\", () => {\n const { lastFrame, unmount } = renderStepRefine();\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"fastest option\");\n expect(output).toContain(\"verified\");\n expect(output).toContain(DEFAULT_BRANDING.NAME);\n });\n });\n\n describe(\"customize option\", () => {\n it(\"should show 'Customize' option as disabled/grayed\", () => {\n const { lastFrame, unmount } = renderStepRefine();\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Customize skill sources\");\n });\n\n it(\"should show customize option without coming soon label\", () => {\n const { lastFrame, unmount } = renderStepRefine();\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Customize skill sources\");\n expect(output).not.toContain(\"(coming soon)\");\n });\n\n it(\"should show customize description\", () => {\n const { lastFrame, unmount } = renderStepRefine();\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Choose alternative skills for each technology\");\n });\n });\n\n describe(\"keyboard shortcuts display\", () => {\n it(\"should render recommended option content\", () => {\n const { lastFrame, unmount } = renderStepRefine();\n cleanup = unmount;\n\n const output = lastFrame();\n // Keyboard hints are now in WizardLayout footer, not in StepRefine\n // Verify core content renders\n expect(output).toContain(\"Use all recommended\");\n expect(output).toContain(\"Customize skill sources\");\n });\n });\n\n describe(\"keyboard navigation\", () => {\n it(\"should call onContinue when Enter key is pressed\", async () => {\n const onContinue = vi.fn();\n const { stdin, unmount } = renderStepRefine({ onContinue });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n stdin.write(ENTER);\n await delay(INPUT_DELAY_MS);\n\n expect(onContinue).toHaveBeenCalledTimes(1);\n });\n\n it(\"should call onBack when Escape key is pressed\", async () => {\n const onBack = vi.fn();\n const { stdin, unmount } = renderStepRefine({ onBack });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n stdin.write(ESCAPE);\n await delay(INPUT_DELAY_MS);\n\n expect(onBack).toHaveBeenCalledTimes(1);\n });\n\n it(\"should toggle to 'customize' on arrow up when recommended is selected\", async () => {\n const onSelectAction = vi.fn();\n const { stdin, unmount } = renderStepRefine({\n onSelectAction,\n refineAction: \"all-recommended\",\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n stdin.write(ARROW_UP);\n await delay(INPUT_DELAY_MS);\n\n expect(onSelectAction).toHaveBeenCalledWith(\"customize\");\n });\n\n it(\"should toggle to 'all-recommended' on arrow down when customize is selected\", async () => {\n const onSelectAction = vi.fn();\n const { stdin, unmount } = renderStepRefine({\n onSelectAction,\n refineAction: \"customize\",\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n stdin.write(ARROW_DOWN);\n await delay(INPUT_DELAY_MS);\n\n expect(onSelectAction).toHaveBeenCalledWith(\"all-recommended\");\n });\n });\n\n describe(\"selection state\", () => {\n it(\"should handle null refineAction (defaults to recommended)\", () => {\n const { lastFrame, unmount } = renderStepRefine({ refineAction: null });\n cleanup = unmount;\n\n const output = lastFrame();\n // Should still show the recommended option with indicator\n expect(output).toContain(\">\");\n expect(output).toContain(\"Use all recommended\");\n });\n\n it(\"should handle 'all-recommended' refineAction\", () => {\n const { lastFrame, unmount } = renderStepRefine({\n refineAction: \"all-recommended\",\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Use all recommended\");\n });\n\n it(\"should handle 'customize' refineAction (even though disabled)\", () => {\n const { lastFrame, unmount } = renderStepRefine({\n refineAction: \"customize\",\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // Should still render, even if customize is selected\n expect(output).toContain(\"Use all recommended\");\n expect(output).toContain(\"Customize skill sources\");\n });\n });\n\n describe(\"edge cases\", () => {\n it(\"should handle zero technology count\", () => {\n const { lastFrame, unmount } = renderStepRefine({ technologyCount: 0 });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"0\");\n expect(output).toContain(\"technologies\");\n });\n\n it(\"should handle single technology count\", () => {\n const { lastFrame, unmount } = renderStepRefine({ technologyCount: 1 });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"1\");\n // Note: \"technologies\" is plural even for 1 (simple implementation)\n expect(output).toContain(\"technologies\");\n });\n\n it(\"should handle large technology count\", () => {\n const { lastFrame, unmount } = renderStepRefine({ technologyCount: 100 });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"100\");\n expect(output).toContain(\"technologies\");\n });\n });\n\n describe(\"multiple keyboard events\", () => {\n it(\"should allow multiple Enter presses\", async () => {\n const onContinue = vi.fn();\n const { stdin, unmount } = renderStepRefine({ 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 it(\"should allow multiple Escape presses\", async () => {\n const onBack = vi.fn();\n const { stdin, unmount } = renderStepRefine({ onBack });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n stdin.write(ESCAPE);\n await delay(INPUT_DELAY_MS);\n stdin.write(ESCAPE);\n await delay(INPUT_DELAY_MS);\n\n expect(onBack).toHaveBeenCalledTimes(2);\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
|
StepSettings
|
|
4
|
-
} from "../../chunk-
|
|
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
|
-
import "../../chunk-
|
|
12
|
-
import "../../chunk-
|
|
13
|
-
import "../../chunk-
|
|
14
|
-
import "../../chunk-
|
|
15
|
-
import "../../chunk-
|
|
16
|
-
import "../../chunk-
|
|
10
|
+
import "../../chunk-HK53FRMU.js";
|
|
11
|
+
import "../../chunk-OIHZ2YH3.js";
|
|
12
|
+
import "../../chunk-IFCASC6R.js";
|
|
13
|
+
import "../../chunk-FSK4TQX7.js";
|
|
14
|
+
import "../../chunk-XYPAOBBV.js";
|
|
15
|
+
import "../../chunk-32HX6UYI.js";
|
|
17
16
|
import "../../chunk-FMYAYX6W.js";
|
|
18
|
-
import "../../chunk-
|
|
17
|
+
import "../../chunk-EO6KJI5D.js";
|
|
19
18
|
import "../../chunk-DHET7RCE.js";
|
|
20
19
|
export {
|
|
21
20
|
StepSettings
|
|
@@ -19,21 +19,20 @@ import {
|
|
|
19
19
|
} from "../../chunk-XY3XDVMI.js";
|
|
20
20
|
import {
|
|
21
21
|
StepSettings
|
|
22
|
-
} from "../../chunk-
|
|
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
|
-
import "../../chunk-
|
|
30
|
-
import "../../chunk-
|
|
31
|
-
import "../../chunk-
|
|
32
|
-
import "../../chunk-
|
|
33
|
-
import "../../chunk-
|
|
34
|
-
import "../../chunk-
|
|
28
|
+
import "../../chunk-HK53FRMU.js";
|
|
29
|
+
import "../../chunk-OIHZ2YH3.js";
|
|
30
|
+
import "../../chunk-IFCASC6R.js";
|
|
31
|
+
import "../../chunk-FSK4TQX7.js";
|
|
32
|
+
import "../../chunk-XYPAOBBV.js";
|
|
33
|
+
import "../../chunk-32HX6UYI.js";
|
|
35
34
|
import "../../chunk-FMYAYX6W.js";
|
|
36
|
-
import "../../chunk-
|
|
35
|
+
import "../../chunk-EO6KJI5D.js";
|
|
37
36
|
import {
|
|
38
37
|
init_esm_shims
|
|
39
38
|
} from "../../chunk-DHET7RCE.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-
|
|
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
|
|
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("
|
|
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("
|
|
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-
|
|
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-
|
|
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,27 +1,26 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
StepSources
|
|
4
|
-
} from "../../chunk-
|
|
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-
|
|
8
|
+
import "../../chunk-D4T3HHE7.js";
|
|
9
9
|
import "../../chunk-7SOPVGDV.js";
|
|
10
|
-
import "../../chunk-
|
|
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-
|
|
17
|
-
import "../../chunk-
|
|
18
|
-
import "../../chunk-
|
|
19
|
-
import "../../chunk-
|
|
20
|
-
import "../../chunk-
|
|
21
|
-
import "../../chunk-
|
|
22
|
-
import "../../chunk-
|
|
15
|
+
import "../../chunk-N34D3ROY.js";
|
|
16
|
+
import "../../chunk-HK53FRMU.js";
|
|
17
|
+
import "../../chunk-OIHZ2YH3.js";
|
|
18
|
+
import "../../chunk-IFCASC6R.js";
|
|
19
|
+
import "../../chunk-FSK4TQX7.js";
|
|
20
|
+
import "../../chunk-XYPAOBBV.js";
|
|
21
|
+
import "../../chunk-32HX6UYI.js";
|
|
23
22
|
import "../../chunk-FMYAYX6W.js";
|
|
24
|
-
import "../../chunk-
|
|
23
|
+
import "../../chunk-EO6KJI5D.js";
|
|
25
24
|
import "../../chunk-DHET7RCE.js";
|
|
26
25
|
export {
|
|
27
26
|
StepSources
|