@agents-inc/cli 0.38.0 → 0.41.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +77 -0
- package/README.md +1 -1
- package/config/skills-matrix.yaml +115 -123
- package/config/stacks.yaml +687 -687
- package/dist/{chunk-YHQNTBBN.js → chunk-2D6LKRHW.js} +2 -2
- package/dist/{chunk-CYFU3ARY.js → chunk-342YB6TQ.js} +15 -17
- package/dist/chunk-342YB6TQ.js.map +1 -0
- package/dist/{chunk-HRMQ2RGY.js → chunk-423MJ6DT.js} +31 -56
- package/dist/chunk-423MJ6DT.js.map +1 -0
- package/dist/{chunk-NFV4SKH5.js → chunk-4LT6RXMY.js} +4 -4
- package/dist/{chunk-IVIK776Y.js → chunk-4SYXPG7L.js} +2 -2
- package/dist/{chunk-DUQFF45G.js → chunk-4UTPJXUX.js} +8 -8
- package/dist/{chunk-3E2V5YL3.js → chunk-5TMB53BV.js} +3 -3
- package/dist/{chunk-NI2RSNWB.js → chunk-7FBM7V3E.js} +10 -22
- package/dist/chunk-7FBM7V3E.js.map +1 -0
- package/dist/chunk-ACVJVYMC.js +111 -0
- package/dist/chunk-ACVJVYMC.js.map +1 -0
- package/dist/{chunk-FWQK3HWB.js → chunk-AH7XHAKN.js} +11 -11
- package/dist/chunk-AH7XHAKN.js.map +1 -0
- package/dist/{chunk-VAHVSQIG.js → chunk-AVVYFEMF.js} +2 -2
- package/dist/{chunk-EISBUEBL.js → chunk-BFISETQG.js} +3 -3
- package/dist/{chunk-ZBJQXDQN.js → chunk-BK7TANUV.js} +4 -2
- package/dist/chunk-BK7TANUV.js.map +1 -0
- package/dist/{chunk-VAK5PX72.js → chunk-DV4ALU5I.js} +6 -6
- package/dist/{chunk-OEX5JDQD.js → chunk-FHBICUXB.js} +4 -4
- package/dist/{chunk-TA6IIQI4.js → chunk-GEDWVX6Y.js} +3 -3
- package/dist/chunk-GEDWVX6Y.js.map +1 -0
- package/dist/{chunk-M6PGIZNS.js → chunk-H6H3COI5.js} +5 -5
- package/dist/{chunk-54ZZCWN4.js → chunk-KC2SIUIA.js} +3 -8
- package/dist/chunk-KC2SIUIA.js.map +1 -0
- package/dist/{chunk-2XX4TMCI.js → chunk-KXM7KOPE.js} +2 -2
- package/dist/{chunk-HKDE4LJW.js → chunk-LJRP4SWY.js} +6 -5
- package/dist/chunk-LJRP4SWY.js.map +1 -0
- package/dist/{chunk-TBDIR6LY.js → chunk-MNPPGIZQ.js} +5 -5
- package/dist/{chunk-3NQJOJZL.js → chunk-NYP5SB2V.js} +2 -2
- package/dist/{chunk-UOMMQ5M6.js → chunk-NZYKDVRL.js} +2 -2
- package/dist/{chunk-UV6JUGIY.js → chunk-PURJZ72D.js} +2 -2
- package/dist/{chunk-ATLRUR3B.js → chunk-R52N7DBG.js} +2 -2
- package/dist/{chunk-WSGGJKD5.js → chunk-SILUTTV7.js} +6 -6
- package/dist/chunk-SILUTTV7.js.map +1 -0
- package/dist/{chunk-IZRVFC2Z.js → chunk-TJAZ7QCF.js} +4 -4
- package/dist/{chunk-U5OB5ADP.js → chunk-TTXV55NQ.js} +57 -16
- package/dist/chunk-TTXV55NQ.js.map +1 -0
- package/dist/{chunk-TY5GELDB.js → chunk-UKTYDNWJ.js} +2 -2
- package/dist/{chunk-HRW7BIDE.js → chunk-WS6OQIEN.js} +2 -2
- package/dist/{chunk-YJIJTBSX.js → chunk-XJXJZ2MJ.js} +42 -54
- package/dist/chunk-XJXJZ2MJ.js.map +1 -0
- package/dist/chunk-YLJYAQSG.js +210 -0
- package/dist/chunk-YLJYAQSG.js.map +1 -0
- package/dist/{chunk-MZB3GGOH.js → chunk-YRVTXSXP.js} +1 -2
- package/dist/chunk-YRVTXSXP.js.map +1 -0
- package/dist/{chunk-TNFACSWF.js → chunk-ZLHGJSRK.js} +3 -3
- package/dist/cli/defaults/agent-mappings.yaml +14 -70
- package/dist/commands/build/marketplace.js +3 -3
- package/dist/commands/build/plugins.js +5 -5
- package/dist/commands/build/stack.js +5 -5
- package/dist/commands/compile.js +8 -7
- package/dist/commands/compile.js.map +1 -1
- package/dist/commands/config/get.js +4 -4
- package/dist/commands/config/index.js +5 -5
- package/dist/commands/config/path.js +4 -4
- package/dist/commands/config/set-project.js +4 -4
- package/dist/commands/config/show.js +5 -5
- package/dist/commands/config/unset-project.js +4 -4
- package/dist/commands/diff.js +8 -5
- package/dist/commands/diff.js.map +1 -1
- package/dist/commands/doctor.js +8 -7
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/edit.js +33 -30
- package/dist/commands/edit.js.map +1 -1
- package/dist/commands/eject.js +4 -4
- package/dist/commands/import/skill.js +5 -5
- package/dist/commands/info.js +7 -6
- package/dist/commands/info.js.map +1 -1
- package/dist/commands/init.js +40 -32
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/list.js +6 -5
- package/dist/commands/list.js.map +1 -1
- package/dist/commands/new/agent.js +5 -5
- package/dist/commands/new/skill.js +8 -5
- package/dist/commands/new/skill.js.map +1 -1
- package/dist/commands/outdated.js +8 -5
- package/dist/commands/outdated.js.map +1 -1
- package/dist/commands/search.js +7 -7
- package/dist/commands/uninstall.js +19 -7
- package/dist/commands/uninstall.js.map +1 -1
- package/dist/commands/update.js +8 -7
- package/dist/commands/update.js.map +1 -1
- package/dist/commands/validate.js +5 -5
- package/dist/commands/version/bump.js +4 -4
- package/dist/commands/version/index.js +4 -4
- package/dist/commands/version/set.js +4 -4
- package/dist/commands/version/show.js +4 -4
- package/dist/components/skill-search/skill-search.js +3 -3
- package/dist/components/wizard/category-grid.js +2 -2
- package/dist/components/wizard/category-grid.test.js +40 -40
- package/dist/components/wizard/category-grid.test.js.map +1 -1
- package/dist/components/wizard/checkbox-grid.js +2 -2
- package/dist/components/wizard/checkbox-grid.test.js +16 -6
- package/dist/components/wizard/checkbox-grid.test.js.map +1 -1
- package/dist/components/wizard/domain-selection.js +7 -7
- package/dist/components/wizard/help-modal.js +2 -2
- package/dist/components/wizard/menu-item.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/section-progress.js +2 -2
- package/dist/components/wizard/section-progress.test.js +2 -2
- package/dist/components/wizard/source-grid.js +3 -3
- package/dist/components/wizard/source-grid.test.js +3 -3
- package/dist/components/wizard/stack-selection.js +9 -9
- package/dist/components/wizard/step-agents.js +7 -7
- package/dist/components/wizard/step-agents.test.js +24 -19
- package/dist/components/wizard/step-agents.test.js.map +1 -1
- package/dist/components/wizard/step-build.js +8 -8
- package/dist/components/wizard/step-build.test.js +40 -39
- package/dist/components/wizard/step-build.test.js.map +1 -1
- package/dist/components/wizard/step-confirm.js +3 -3
- package/dist/components/wizard/step-confirm.test.js +19 -13
- package/dist/components/wizard/step-confirm.test.js.map +1 -1
- package/dist/components/wizard/step-refine.js +2 -2
- package/dist/components/wizard/step-refine.test.js +2 -2
- package/dist/components/wizard/step-settings.js +5 -5
- package/dist/components/wizard/step-settings.test.js +8 -8
- package/dist/components/wizard/step-sources.js +9 -9
- package/dist/components/wizard/step-sources.test.js +13 -13
- package/dist/components/wizard/step-sources.test.js.map +1 -1
- package/dist/components/wizard/step-stack.js +12 -12
- package/dist/components/wizard/step-stack.test.js +19 -21
- package/dist/components/wizard/step-stack.test.js.map +1 -1
- package/dist/components/wizard/view-title.js +2 -2
- package/dist/components/wizard/wizard-layout.js +8 -8
- package/dist/components/wizard/wizard-tabs.js +2 -2
- package/dist/components/wizard/wizard-tabs.test.js +2 -2
- package/dist/components/wizard/wizard.js +25 -25
- package/dist/config/skills-matrix.yaml +115 -123
- package/dist/config/stacks.yaml +687 -687
- package/dist/hooks/init.js +3 -3
- package/dist/{source-manager-FEGVYDFZ.js → source-manager-PPABS6BC.js} +4 -4
- package/dist/stores/wizard-store.js +5 -5
- package/dist/stores/wizard-store.test.js +115 -187
- package/dist/stores/wizard-store.test.js.map +1 -1
- package/package.json +1 -1
- package/src/schemas/metadata.schema.json +41 -1
- package/src/schemas/project-config.schema.json +34 -35
- package/src/schemas/skills-matrix.schema.json +100 -101
- package/src/schemas/stacks.schema.json +34 -35
- package/dist/chunk-54ZZCWN4.js.map +0 -1
- package/dist/chunk-CYFU3ARY.js.map +0 -1
- package/dist/chunk-EXFVAEPY.js +0 -80
- package/dist/chunk-EXFVAEPY.js.map +0 -1
- package/dist/chunk-FWQK3HWB.js.map +0 -1
- package/dist/chunk-HKDE4LJW.js.map +0 -1
- package/dist/chunk-HRMQ2RGY.js.map +0 -1
- package/dist/chunk-IWNPFIGY.js +0 -110
- package/dist/chunk-IWNPFIGY.js.map +0 -1
- package/dist/chunk-MZB3GGOH.js.map +0 -1
- package/dist/chunk-NI2RSNWB.js.map +0 -1
- package/dist/chunk-TA6IIQI4.js.map +0 -1
- package/dist/chunk-U5OB5ADP.js.map +0 -1
- package/dist/chunk-WSGGJKD5.js.map +0 -1
- package/dist/chunk-YJIJTBSX.js.map +0 -1
- package/dist/chunk-ZBJQXDQN.js.map +0 -1
- /package/dist/{chunk-YHQNTBBN.js.map → chunk-2D6LKRHW.js.map} +0 -0
- /package/dist/{chunk-NFV4SKH5.js.map → chunk-4LT6RXMY.js.map} +0 -0
- /package/dist/{chunk-IVIK776Y.js.map → chunk-4SYXPG7L.js.map} +0 -0
- /package/dist/{chunk-DUQFF45G.js.map → chunk-4UTPJXUX.js.map} +0 -0
- /package/dist/{chunk-3E2V5YL3.js.map → chunk-5TMB53BV.js.map} +0 -0
- /package/dist/{chunk-VAHVSQIG.js.map → chunk-AVVYFEMF.js.map} +0 -0
- /package/dist/{chunk-EISBUEBL.js.map → chunk-BFISETQG.js.map} +0 -0
- /package/dist/{chunk-VAK5PX72.js.map → chunk-DV4ALU5I.js.map} +0 -0
- /package/dist/{chunk-OEX5JDQD.js.map → chunk-FHBICUXB.js.map} +0 -0
- /package/dist/{chunk-M6PGIZNS.js.map → chunk-H6H3COI5.js.map} +0 -0
- /package/dist/{chunk-2XX4TMCI.js.map → chunk-KXM7KOPE.js.map} +0 -0
- /package/dist/{chunk-TBDIR6LY.js.map → chunk-MNPPGIZQ.js.map} +0 -0
- /package/dist/{chunk-3NQJOJZL.js.map → chunk-NYP5SB2V.js.map} +0 -0
- /package/dist/{chunk-UOMMQ5M6.js.map → chunk-NZYKDVRL.js.map} +0 -0
- /package/dist/{chunk-UV6JUGIY.js.map → chunk-PURJZ72D.js.map} +0 -0
- /package/dist/{chunk-ATLRUR3B.js.map → chunk-R52N7DBG.js.map} +0 -0
- /package/dist/{chunk-IZRVFC2Z.js.map → chunk-TJAZ7QCF.js.map} +0 -0
- /package/dist/{chunk-TY5GELDB.js.map → chunk-UKTYDNWJ.js.map} +0 -0
- /package/dist/{chunk-HRW7BIDE.js.map → chunk-WS6OQIEN.js.map} +0 -0
- /package/dist/{chunk-TNFACSWF.js.map → chunk-ZLHGJSRK.js.map} +0 -0
- /package/dist/{source-manager-FEGVYDFZ.js.map → source-manager-PPABS6BC.js.map} +0 -0
|
@@ -21,9 +21,9 @@ import {
|
|
|
21
21
|
} from "../../chunk-XY3XDVMI.js";
|
|
22
22
|
import {
|
|
23
23
|
CategoryGrid
|
|
24
|
-
} from "../../chunk-
|
|
24
|
+
} from "../../chunk-GEDWVX6Y.js";
|
|
25
25
|
import "../../chunk-GG4BSB6S.js";
|
|
26
|
-
import "../../chunk-
|
|
26
|
+
import "../../chunk-BK7TANUV.js";
|
|
27
27
|
import {
|
|
28
28
|
init_esm_shims
|
|
29
29
|
} from "../../chunk-DHET7RCE.js";
|
|
@@ -48,7 +48,7 @@ var createCategory = (id, displayName, options, overrides = {}) => ({
|
|
|
48
48
|
});
|
|
49
49
|
var defaultCategories = [
|
|
50
50
|
createCategory(
|
|
51
|
-
"framework",
|
|
51
|
+
"web-framework",
|
|
52
52
|
"Framework",
|
|
53
53
|
[
|
|
54
54
|
createOption("web-test-react", "React", {
|
|
@@ -62,7 +62,7 @@ var defaultCategories = [
|
|
|
62
62
|
{ required: true }
|
|
63
63
|
),
|
|
64
64
|
createCategory(
|
|
65
|
-
"styling",
|
|
65
|
+
"web-styling",
|
|
66
66
|
"Styling",
|
|
67
67
|
[
|
|
68
68
|
createOption("web-scss-mod", "SCSS Modules", { selected: true }),
|
|
@@ -72,7 +72,7 @@ var defaultCategories = [
|
|
|
72
72
|
],
|
|
73
73
|
{ required: true }
|
|
74
74
|
),
|
|
75
|
-
createCategory("client-state", "Client State", [
|
|
75
|
+
createCategory("web-client-state", "Client State", [
|
|
76
76
|
createOption("web-test-zustand", "Zustand", { state: "recommended" }),
|
|
77
77
|
createOption("web-test-jotai", "Jotai"),
|
|
78
78
|
createOption("web-test-redux", "Redux", {
|
|
@@ -81,16 +81,16 @@ var defaultCategories = [
|
|
|
81
81
|
}),
|
|
82
82
|
createOption("web-test-mobx", "MobX")
|
|
83
83
|
]),
|
|
84
|
-
createCategory("server-state", "Server State", [
|
|
84
|
+
createCategory("web-server-state", "Server State", [
|
|
85
85
|
createOption("web-react-query", "React Query", { selected: true }),
|
|
86
86
|
createOption("web-test-swr", "SWR"),
|
|
87
87
|
createOption("web-test-apollo", "Apollo")
|
|
88
88
|
]),
|
|
89
|
-
createCategory("analytics", "Analytics", [createOption("web-test-posthog", "PostHog")])
|
|
89
|
+
createCategory("api-analytics", "Analytics", [createOption("web-test-posthog", "PostHog")])
|
|
90
90
|
];
|
|
91
91
|
var categoriesWithFramework = [
|
|
92
92
|
createCategory(
|
|
93
|
-
"framework",
|
|
93
|
+
"web-framework",
|
|
94
94
|
"Framework",
|
|
95
95
|
[
|
|
96
96
|
createOption("web-test-react", "React", {
|
|
@@ -106,7 +106,7 @@ var categoriesWithFramework = [
|
|
|
106
106
|
{ required: true }
|
|
107
107
|
),
|
|
108
108
|
createCategory(
|
|
109
|
-
"styling",
|
|
109
|
+
"web-styling",
|
|
110
110
|
"Styling",
|
|
111
111
|
[
|
|
112
112
|
createOption("web-scss-mod", "SCSS Modules"),
|
|
@@ -116,7 +116,7 @@ var categoriesWithFramework = [
|
|
|
116
116
|
],
|
|
117
117
|
{ required: true }
|
|
118
118
|
),
|
|
119
|
-
createCategory("client-state", "Client State", [
|
|
119
|
+
createCategory("web-client-state", "Client State", [
|
|
120
120
|
createOption("web-test-zustand", "Zustand", { state: "recommended" }),
|
|
121
121
|
createOption("web-test-jotai", "Jotai"),
|
|
122
122
|
createOption("web-test-redux", "Redux", { state: "discouraged" }),
|
|
@@ -218,7 +218,7 @@ describe("CategoryGrid component", () => {
|
|
|
218
218
|
});
|
|
219
219
|
it("should show disabled options with dimmed styling", () => {
|
|
220
220
|
const categories = [
|
|
221
|
-
createCategory("testing", "Test", [
|
|
221
|
+
createCategory("web-testing", "Test", [
|
|
222
222
|
createOption("web-test-opt1", "Option 1"),
|
|
223
223
|
createOption("web-test-opt2", "Option 2", { state: "disabled" })
|
|
224
224
|
])
|
|
@@ -230,7 +230,7 @@ describe("CategoryGrid component", () => {
|
|
|
230
230
|
});
|
|
231
231
|
it("should render selected skills with label text", () => {
|
|
232
232
|
const categories = [
|
|
233
|
-
createCategory("forms", "Forms", [
|
|
233
|
+
createCategory("web-forms", "Forms", [
|
|
234
234
|
createOption("web-test-opt1", "Selected Skill", { selected: true })
|
|
235
235
|
])
|
|
236
236
|
];
|
|
@@ -241,7 +241,7 @@ describe("CategoryGrid component", () => {
|
|
|
241
241
|
});
|
|
242
242
|
it("should render unselected skills with label text", () => {
|
|
243
243
|
const categories = [
|
|
244
|
-
createCategory("forms", "Forms", [
|
|
244
|
+
createCategory("web-forms", "Forms", [
|
|
245
245
|
createOption("web-test-opt1", "Unselected Skill", { state: "normal", selected: false })
|
|
246
246
|
])
|
|
247
247
|
];
|
|
@@ -252,7 +252,7 @@ describe("CategoryGrid component", () => {
|
|
|
252
252
|
});
|
|
253
253
|
it("should render disabled skills with label text", () => {
|
|
254
254
|
const categories = [
|
|
255
|
-
createCategory("forms", "Forms", [
|
|
255
|
+
createCategory("web-forms", "Forms", [
|
|
256
256
|
createOption("web-test-opt1", "Disabled Skill", { state: "disabled" })
|
|
257
257
|
])
|
|
258
258
|
];
|
|
@@ -263,7 +263,7 @@ describe("CategoryGrid component", () => {
|
|
|
263
263
|
});
|
|
264
264
|
it("should render discouraged skills with label text", () => {
|
|
265
265
|
const categories = [
|
|
266
|
-
createCategory("forms", "Forms", [
|
|
266
|
+
createCategory("web-forms", "Forms", [
|
|
267
267
|
createOption("web-test-opt1", "Discouraged Skill", { state: "discouraged" })
|
|
268
268
|
])
|
|
269
269
|
];
|
|
@@ -274,7 +274,7 @@ describe("CategoryGrid component", () => {
|
|
|
274
274
|
});
|
|
275
275
|
it("should render both selected and unselected skills with labels", () => {
|
|
276
276
|
const categories = [
|
|
277
|
-
createCategory("forms", "Forms", [
|
|
277
|
+
createCategory("web-forms", "Forms", [
|
|
278
278
|
createOption("web-test-opt1", "Active", { selected: true }),
|
|
279
279
|
createOption("web-test-opt2", "Inactive", { selected: false })
|
|
280
280
|
])
|
|
@@ -287,7 +287,7 @@ describe("CategoryGrid component", () => {
|
|
|
287
287
|
});
|
|
288
288
|
it("should render skill label regardless of selection state", () => {
|
|
289
289
|
const categories1 = [
|
|
290
|
-
createCategory("forms", "Forms", [
|
|
290
|
+
createCategory("web-forms", "Forms", [
|
|
291
291
|
createOption("web-test-opt1", "Toggle Skill", { selected: false })
|
|
292
292
|
])
|
|
293
293
|
];
|
|
@@ -295,7 +295,7 @@ describe("CategoryGrid component", () => {
|
|
|
295
295
|
const output1 = frame1();
|
|
296
296
|
unmount1();
|
|
297
297
|
const categories2 = [
|
|
298
|
-
createCategory("forms", "Forms", [
|
|
298
|
+
createCategory("web-forms", "Forms", [
|
|
299
299
|
createOption("web-test-opt1", "Toggle Skill", { selected: true })
|
|
300
300
|
])
|
|
301
301
|
];
|
|
@@ -327,11 +327,11 @@ describe("CategoryGrid component", () => {
|
|
|
327
327
|
});
|
|
328
328
|
it("should not lock any sections when no framework category exists", () => {
|
|
329
329
|
const categoriesNoFramework = [
|
|
330
|
-
createCategory("styling", "Styling", [
|
|
330
|
+
createCategory("web-styling", "Styling", [
|
|
331
331
|
createOption("web-test-scss", "SCSS"),
|
|
332
332
|
createOption("web-test-tailwind", "Tailwind")
|
|
333
333
|
]),
|
|
334
|
-
createCategory("client-state", "State", [createOption("web-test-zustand", "Zustand")])
|
|
334
|
+
createCategory("web-client-state", "State", [createOption("web-test-zustand", "Zustand")])
|
|
335
335
|
];
|
|
336
336
|
const { lastFrame, unmount } = renderGrid({
|
|
337
337
|
categories: categoriesNoFramework
|
|
@@ -546,13 +546,13 @@ describe("CategoryGrid component", () => {
|
|
|
546
546
|
await delay(RENDER_DELAY_MS);
|
|
547
547
|
await stdin.write(" ");
|
|
548
548
|
await delay(INPUT_DELAY_MS);
|
|
549
|
-
globalExpect(onToggle).toHaveBeenCalledWith("framework", "web-test-vue");
|
|
549
|
+
globalExpect(onToggle).toHaveBeenCalledWith("web-framework", "web-test-vue");
|
|
550
550
|
});
|
|
551
551
|
it("should call onToggle when pressing space on a selected option", async () => {
|
|
552
552
|
const onToggle = vi.fn();
|
|
553
553
|
const categories = [
|
|
554
554
|
createCategory(
|
|
555
|
-
"framework",
|
|
555
|
+
"web-framework",
|
|
556
556
|
"Framework",
|
|
557
557
|
[
|
|
558
558
|
createOption("web-test-react", "React", { selected: true }),
|
|
@@ -573,12 +573,12 @@ describe("CategoryGrid component", () => {
|
|
|
573
573
|
await delay(RENDER_DELAY_MS);
|
|
574
574
|
await stdin.write(" ");
|
|
575
575
|
await delay(INPUT_DELAY_MS);
|
|
576
|
-
globalExpect(onToggle).toHaveBeenCalledWith("framework", "web-test-react");
|
|
576
|
+
globalExpect(onToggle).toHaveBeenCalledWith("web-framework", "web-test-react");
|
|
577
577
|
});
|
|
578
578
|
it("should NOT call onToggle when all options in a category are disabled", async () => {
|
|
579
579
|
const onToggle = vi.fn();
|
|
580
580
|
const categories = [
|
|
581
|
-
createCategory("testing", "Test", [
|
|
581
|
+
createCategory("web-testing", "Test", [
|
|
582
582
|
createOption("web-test-opt1", "Option 1", { state: "disabled" }),
|
|
583
583
|
createOption("web-test-opt2", "Option 2", { state: "disabled" })
|
|
584
584
|
])
|
|
@@ -613,7 +613,7 @@ describe("CategoryGrid component", () => {
|
|
|
613
613
|
it("should navigate to disabled options when navigating right", async () => {
|
|
614
614
|
const onFocusChange = vi.fn();
|
|
615
615
|
const categories = [
|
|
616
|
-
createCategory("testing", "Test", [
|
|
616
|
+
createCategory("web-testing", "Test", [
|
|
617
617
|
createOption("web-test-opt1", "Option 1"),
|
|
618
618
|
createOption("web-test-opt2", "Option 2", { state: "disabled" }),
|
|
619
619
|
createOption("web-test-opt3", "Option 3")
|
|
@@ -635,7 +635,7 @@ describe("CategoryGrid component", () => {
|
|
|
635
635
|
it("should navigate to disabled options when navigating left", async () => {
|
|
636
636
|
const onFocusChange = vi.fn();
|
|
637
637
|
const categories = [
|
|
638
|
-
createCategory("testing", "Test", [
|
|
638
|
+
createCategory("web-testing", "Test", [
|
|
639
639
|
createOption("web-test-opt1", "Option 1"),
|
|
640
640
|
createOption("web-test-opt2", "Option 2", { state: "disabled" }),
|
|
641
641
|
createOption("web-test-opt3", "Option 3")
|
|
@@ -658,7 +658,7 @@ describe("CategoryGrid component", () => {
|
|
|
658
658
|
it("should navigate between all-disabled options in a row", async () => {
|
|
659
659
|
const onFocusChange = vi.fn();
|
|
660
660
|
const categories = [
|
|
661
|
-
createCategory("testing", "Test", [
|
|
661
|
+
createCategory("web-testing", "Test", [
|
|
662
662
|
createOption("web-test-opt1", "Option 1", { state: "disabled" }),
|
|
663
663
|
createOption("web-test-opt2", "Option 2", { state: "disabled" })
|
|
664
664
|
])
|
|
@@ -758,7 +758,7 @@ describe("CategoryGrid component", () => {
|
|
|
758
758
|
});
|
|
759
759
|
it("should show Disabled label for disabled options when showLabels is true", () => {
|
|
760
760
|
const categories = [
|
|
761
|
-
createCategory("testing", "Test", [
|
|
761
|
+
createCategory("web-testing", "Test", [
|
|
762
762
|
createOption("web-test-opt1", "Option 1"),
|
|
763
763
|
createOption("web-test-opt2", "Option 2", { state: "disabled" })
|
|
764
764
|
])
|
|
@@ -794,7 +794,7 @@ describe("CategoryGrid component", () => {
|
|
|
794
794
|
describe("edge cases", () => {
|
|
795
795
|
it("should handle single category", () => {
|
|
796
796
|
const categories = [
|
|
797
|
-
createCategory("forms", "Single Category", [createOption("web-test-opt1", "Option 1")])
|
|
797
|
+
createCategory("web-forms", "Single Category", [createOption("web-test-opt1", "Option 1")])
|
|
798
798
|
];
|
|
799
799
|
const { lastFrame, unmount } = renderGrid({ categories });
|
|
800
800
|
cleanup = unmount;
|
|
@@ -804,7 +804,7 @@ describe("CategoryGrid component", () => {
|
|
|
804
804
|
});
|
|
805
805
|
it("should handle single option in category", () => {
|
|
806
806
|
const categories = [
|
|
807
|
-
createCategory("forms", "Single", [createOption("web-test-only", "Only Option")])
|
|
807
|
+
createCategory("web-forms", "Single", [createOption("web-test-only", "Only Option")])
|
|
808
808
|
];
|
|
809
809
|
const { lastFrame, unmount } = renderGrid({ categories });
|
|
810
810
|
cleanup = unmount;
|
|
@@ -816,7 +816,7 @@ describe("CategoryGrid component", () => {
|
|
|
816
816
|
{ length: 10 },
|
|
817
817
|
(_, i) => createOption(`web-test-opt${i}`, `Option ${i}`)
|
|
818
818
|
);
|
|
819
|
-
const categories = [createCategory("mocking", "Many Options", options)];
|
|
819
|
+
const categories = [createCategory("web-mocking", "Many Options", options)];
|
|
820
820
|
const { lastFrame, unmount } = renderGrid({ categories });
|
|
821
821
|
cleanup = unmount;
|
|
822
822
|
const output = lastFrame();
|
|
@@ -826,7 +826,7 @@ describe("CategoryGrid component", () => {
|
|
|
826
826
|
});
|
|
827
827
|
it("should handle long option labels", () => {
|
|
828
828
|
const categories = [
|
|
829
|
-
createCategory("i18n", "Long Labels", [
|
|
829
|
+
createCategory("web-i18n", "Long Labels", [
|
|
830
830
|
createOption("web-test-long1", "Very Long Option Name"),
|
|
831
831
|
createOption("web-test-long2", "Another Long Name")
|
|
832
832
|
])
|
|
@@ -838,12 +838,12 @@ describe("CategoryGrid component", () => {
|
|
|
838
838
|
});
|
|
839
839
|
it("should handle categories with different option counts", () => {
|
|
840
840
|
const categories = [
|
|
841
|
-
createCategory("framework", "Category 1", [
|
|
841
|
+
createCategory("web-framework", "Category 1", [
|
|
842
842
|
createOption("web-test-opt1", "Option 1"),
|
|
843
843
|
createOption("web-test-opt2", "Option 2")
|
|
844
844
|
]),
|
|
845
|
-
createCategory("styling", "Category 2", [createOption("web-test-opt3", "Option 3")]),
|
|
846
|
-
createCategory("client-state", "Category 3", [
|
|
845
|
+
createCategory("web-styling", "Category 2", [createOption("web-test-opt3", "Option 3")]),
|
|
846
|
+
createCategory("web-client-state", "Category 3", [
|
|
847
847
|
createOption("web-test-opt4", "Option 4"),
|
|
848
848
|
createOption("web-test-opt5", "Option 5"),
|
|
849
849
|
createOption("web-test-opt6", "Option 6")
|
|
@@ -862,7 +862,7 @@ describe("CategoryGrid component", () => {
|
|
|
862
862
|
const onFocusChange = vi.fn();
|
|
863
863
|
const categories = [
|
|
864
864
|
createCategory(
|
|
865
|
-
"framework",
|
|
865
|
+
"web-framework",
|
|
866
866
|
"Framework",
|
|
867
867
|
[
|
|
868
868
|
createOption("web-test-opt1", "Option 1", { selected: true }),
|
|
@@ -872,7 +872,7 @@ describe("CategoryGrid component", () => {
|
|
|
872
872
|
],
|
|
873
873
|
{ required: true }
|
|
874
874
|
),
|
|
875
|
-
createCategory("styling", "Category 2", [createOption("web-test-opt4", "Option 4")])
|
|
875
|
+
createCategory("web-styling", "Category 2", [createOption("web-test-opt4", "Option 4")])
|
|
876
876
|
];
|
|
877
877
|
const { stdin, unmount } = renderGrid({
|
|
878
878
|
categories,
|
|
@@ -891,7 +891,7 @@ describe("CategoryGrid component", () => {
|
|
|
891
891
|
describe("installed skills", () => {
|
|
892
892
|
it("should render installed skill with label only (no checkmark icon)", () => {
|
|
893
893
|
const categories = [
|
|
894
|
-
createCategory("forms", "Forms", [
|
|
894
|
+
createCategory("web-forms", "Forms", [
|
|
895
895
|
createOption("web-test-opt1", "Option 1", { installed: true })
|
|
896
896
|
])
|
|
897
897
|
];
|
|
@@ -903,7 +903,7 @@ describe("CategoryGrid component", () => {
|
|
|
903
903
|
});
|
|
904
904
|
it("should render installed and selected skill with label only", () => {
|
|
905
905
|
const categories = [
|
|
906
|
-
createCategory("forms", "Forms", [
|
|
906
|
+
createCategory("web-forms", "Forms", [
|
|
907
907
|
createOption("web-test-opt1", "Option 1", { installed: true, selected: true })
|
|
908
908
|
])
|
|
909
909
|
];
|
|
@@ -915,7 +915,7 @@ describe("CategoryGrid component", () => {
|
|
|
915
915
|
});
|
|
916
916
|
it("should render local installed skill without L badge or checkmark", () => {
|
|
917
917
|
const categories = [
|
|
918
|
-
createCategory("forms", "Forms", [
|
|
918
|
+
createCategory("web-forms", "Forms", [
|
|
919
919
|
createOption("web-test-opt1", "Option 1", { local: true, installed: true })
|
|
920
920
|
])
|
|
921
921
|
];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/cli/components/wizard/category-grid.test.tsx"],"sourcesContent":["import { render } from \"ink-testing-library\";\nimport { describe, expect, it, afterEach, vi } from \"vitest\";\nimport {\n CategoryGrid,\n type CategoryGridProps,\n type CategoryRow,\n type CategoryOption,\n} from \"./category-grid\";\nimport type { SkillId, Subcategory } from \"../../types\";\nimport {\n ARROW_UP,\n ARROW_DOWN,\n ARROW_LEFT,\n ARROW_RIGHT,\n TAB,\n RENDER_DELAY_MS,\n INPUT_DELAY_MS,\n delay,\n} from \"../../lib/__tests__/test-constants\";\n\nconst createOption = (\n id: SkillId,\n label: string,\n overrides: Partial<CategoryOption> = {},\n): CategoryOption => ({\n id,\n label,\n state: \"normal\",\n selected: false,\n ...overrides,\n});\n\nconst createCategory = (\n id: Subcategory,\n displayName: string,\n options: CategoryOption[],\n overrides: Partial<CategoryRow> = {},\n): CategoryRow => ({\n id,\n displayName,\n required: false,\n exclusive: true,\n options,\n ...overrides,\n});\n\nconst defaultCategories: CategoryRow[] = [\n createCategory(\n \"framework\",\n \"Framework\",\n [\n createOption(\"web-test-react\", \"React\", {\n state: \"recommended\",\n stateReason: \"Popular choice\",\n }),\n createOption(\"web-test-vue\", \"Vue\"),\n createOption(\"web-test-angular\", \"Angular\"),\n createOption(\"web-test-svelte\", \"Svelte\"),\n ],\n { required: true },\n ),\n createCategory(\n \"styling\",\n \"Styling\",\n [\n createOption(\"web-scss-mod\", \"SCSS Modules\", { selected: true }),\n createOption(\"web-test-tailwind\", \"Tailwind\", { state: \"recommended\" }),\n createOption(\"web-test-styled\", \"Styled Components\"),\n createOption(\"web-test-vanilla\", \"Vanilla CSS\"),\n ],\n { required: true },\n ),\n createCategory(\"client-state\", \"Client State\", [\n createOption(\"web-test-zustand\", \"Zustand\", { state: \"recommended\" }),\n createOption(\"web-test-jotai\", \"Jotai\"),\n createOption(\"web-test-redux\", \"Redux\", {\n state: \"discouraged\",\n stateReason: \"Complex for most apps\",\n }),\n createOption(\"web-test-mobx\", \"MobX\"),\n ]),\n createCategory(\"server-state\", \"Server State\", [\n createOption(\"web-react-query\", \"React Query\", { selected: true }),\n createOption(\"web-test-swr\", \"SWR\"),\n createOption(\"web-test-apollo\", \"Apollo\"),\n ]),\n createCategory(\"analytics\", \"Analytics\", [createOption(\"web-test-posthog\", \"PostHog\")]),\n];\n\nconst categoriesWithFramework: CategoryRow[] = [\n createCategory(\n \"framework\",\n \"Framework\",\n [\n createOption(\"web-test-react\", \"React\", {\n state: \"recommended\",\n stateReason: \"Popular choice\",\n selected: true, // Framework selected\n }),\n createOption(\"web-test-vue\", \"Vue\"),\n createOption(\"web-test-angular\", \"Angular\"),\n createOption(\"web-test-svelte\", \"Svelte\"),\n ],\n { required: true },\n ),\n createCategory(\n \"styling\",\n \"Styling\",\n [\n createOption(\"web-scss-mod\", \"SCSS Modules\"),\n createOption(\"web-test-tailwind\", \"Tailwind\", { state: \"recommended\" }),\n createOption(\"web-test-styled\", \"Styled Components\"),\n createOption(\"web-test-vanilla\", \"Vanilla CSS\"),\n ],\n { required: true },\n ),\n createCategory(\"client-state\", \"Client State\", [\n createOption(\"web-test-zustand\", \"Zustand\", { state: \"recommended\" }),\n createOption(\"web-test-jotai\", \"Jotai\"),\n createOption(\"web-test-redux\", \"Redux\", { state: \"discouraged\" }),\n createOption(\"web-test-mobx\", \"MobX\"),\n ]),\n];\n\nconst defaultProps: CategoryGridProps = {\n categories: defaultCategories,\n defaultFocusedRow: 0,\n defaultFocusedCol: 0,\n showLabels: false,\n expertMode: false,\n onToggle: vi.fn(),\n onFocusChange: vi.fn(),\n onToggleLabels: vi.fn(),\n};\n\nconst renderGrid = (props: Partial<CategoryGridProps> = {}) => {\n return render(<CategoryGrid {...defaultProps} {...props} />);\n};\n\ndescribe(\"CategoryGrid component\", () => {\n let cleanup: (() => void) | undefined;\n\n afterEach(() => {\n cleanup?.();\n cleanup = undefined;\n });\n\n describe(\"rendering\", () => {\n it(\"should render all categories as sections\", () => {\n const { lastFrame, unmount } = renderGrid();\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Framework\");\n expect(output).toContain(\"Styling\");\n expect(output).toContain(\"Client State\");\n expect(output).toContain(\"Server State\");\n expect(output).toContain(\"Analytics\");\n });\n\n it(\"should render all options in each category\", () => {\n const { lastFrame, unmount } = renderGrid();\n cleanup = unmount;\n\n const output = lastFrame();\n // Framework options\n expect(output).toContain(\"React\");\n expect(output).toContain(\"Vue\");\n expect(output).toContain(\"Angular\");\n expect(output).toContain(\"Svelte\");\n // Styling options\n expect(output).toContain(\"SCSS Modules\");\n expect(output).toContain(\"Tailwind\");\n });\n\n it(\"should show required indicator (*) for required categories\", () => {\n const { lastFrame, unmount } = renderGrid();\n cleanup = unmount;\n\n const output = lastFrame();\n // Framework and Styling are required\n // The * should appear after their names\n expect(output).toContain(\"*\");\n });\n\n it(\"should NOT show (optional) for non-required categories\", () => {\n const { lastFrame, unmount } = renderGrid();\n cleanup = unmount;\n\n const output = lastFrame();\n // Optional is assumed by default, so we don't show the label\n expect(output).not.toContain(\"(optional)\");\n });\n\n it(\"should handle empty categories array\", () => {\n const { lastFrame, unmount } = renderGrid({ categories: [] });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"No categories to display\");\n });\n\n it(\"should render section underlines\", () => {\n const { lastFrame, unmount } = renderGrid();\n cleanup = unmount;\n\n const output = lastFrame();\n // Unicode horizontal line character used for underlines\n expect(output).toContain(\"\\u2500\");\n });\n });\n\n describe(\"visual states\", () => {\n it(\"should show selected options with label text\", () => {\n const { lastFrame, unmount } = renderGrid();\n cleanup = unmount;\n\n const output = lastFrame();\n // scss-mod and react-query are selected in defaultCategories\n expect(output).toContain(\"SCSS Modules\");\n expect(output).toContain(\"React Query\");\n });\n\n it(\"should show unselected options with label text\", () => {\n const { lastFrame, unmount } = renderGrid();\n cleanup = unmount;\n\n const output = lastFrame();\n // Unselected options should display their labels\n expect(output).toContain(\"Vue\");\n expect(output).toContain(\"Angular\");\n });\n\n it(\"should NOT show star indicator for recommended options (uses background instead)\", () => {\n const { lastFrame, unmount } = renderGrid();\n cleanup = unmount;\n\n const output = lastFrame();\n // Should NOT contain star (⭐) for recommended\n expect(output).not.toContain(\"\\u2B50\");\n });\n\n it(\"should NOT show warning indicator for discouraged options (uses color instead)\", () => {\n const { lastFrame, unmount } = renderGrid();\n cleanup = unmount;\n\n const output = lastFrame();\n // Should NOT contain warning (⚠) for discouraged\n expect(output).not.toContain(\"\\u26A0\");\n });\n\n it(\"should show disabled options with dimmed styling\", () => {\n const categories: CategoryRow[] = [\n createCategory(\"testing\", \"Test\", [\n createOption(\"web-test-opt1\", \"Option 1\"),\n createOption(\"web-test-opt2\", \"Option 2\", { state: \"disabled\" }),\n ]),\n ];\n\n const { lastFrame, unmount } = renderGrid({ categories });\n cleanup = unmount;\n\n const output = lastFrame();\n // Disabled options should show label (dimmed text)\n expect(output).toContain(\"Option 2\");\n });\n\n it(\"should render selected skills with label text\", () => {\n const categories: CategoryRow[] = [\n createCategory(\"forms\", \"Forms\", [\n createOption(\"web-test-opt1\", \"Selected Skill\", { selected: true }),\n ]),\n ];\n\n const { lastFrame, unmount } = renderGrid({ categories });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Selected Skill\");\n });\n\n it(\"should render unselected skills with label text\", () => {\n const categories: CategoryRow[] = [\n createCategory(\"forms\", \"Forms\", [\n createOption(\"web-test-opt1\", \"Unselected Skill\", { state: \"normal\", selected: false }),\n ]),\n ];\n\n const { lastFrame, unmount } = renderGrid({ categories });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Unselected Skill\");\n });\n\n it(\"should render disabled skills with label text\", () => {\n const categories: CategoryRow[] = [\n createCategory(\"forms\", \"Forms\", [\n createOption(\"web-test-opt1\", \"Disabled Skill\", { state: \"disabled\" }),\n ]),\n ];\n\n const { lastFrame, unmount } = renderGrid({ categories });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Disabled Skill\");\n });\n\n it(\"should render discouraged skills with label text\", () => {\n const categories: CategoryRow[] = [\n createCategory(\"forms\", \"Forms\", [\n createOption(\"web-test-opt1\", \"Discouraged Skill\", { state: \"discouraged\" }),\n ]),\n ];\n\n const { lastFrame, unmount } = renderGrid({ categories });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Discouraged Skill\");\n });\n\n it(\"should render both selected and unselected skills with labels\", () => {\n const categories: CategoryRow[] = [\n createCategory(\"forms\", \"Forms\", [\n createOption(\"web-test-opt1\", \"Active\", { selected: true }),\n createOption(\"web-test-opt2\", \"Inactive\", { selected: false }),\n ]),\n ];\n\n const { lastFrame, unmount } = renderGrid({ categories, expertMode: true });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Active\");\n expect(output).toContain(\"Inactive\");\n });\n\n it(\"should render skill label regardless of selection state\", () => {\n const categories1: CategoryRow[] = [\n createCategory(\"forms\", \"Forms\", [\n createOption(\"web-test-opt1\", \"Toggle Skill\", { selected: false }),\n ]),\n ];\n\n const { lastFrame: frame1, unmount: unmount1 } = renderGrid({ categories: categories1 });\n const output1 = frame1();\n unmount1();\n\n // Second render: same option selected\n const categories2: CategoryRow[] = [\n createCategory(\"forms\", \"Forms\", [\n createOption(\"web-test-opt1\", \"Toggle Skill\", { selected: true }),\n ]),\n ];\n\n const { lastFrame: frame2, unmount: unmount2 } = renderGrid({ categories: categories2 });\n cleanup = unmount2;\n const output2 = frame2();\n\n // Both states should render the label\n expect(output1).toContain(\"Toggle Skill\");\n expect(output2).toContain(\"Toggle Skill\");\n });\n });\n\n describe(\"locked sections\", () => {\n it(\"should show all categories including locked ones\", () => {\n // No framework selected, so non-framework sections should be locked but visible\n const { lastFrame, unmount } = renderGrid();\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Framework\");\n expect(output).toContain(\"Styling\");\n expect(output).toContain(\"Client State\");\n });\n\n it(\"should unlock sections when framework is selected\", () => {\n const { lastFrame, unmount } = renderGrid({\n categories: categoriesWithFramework,\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // All sections should be visible and navigable\n expect(output).toContain(\"Framework\");\n expect(output).toContain(\"Styling\");\n expect(output).toContain(\"Client State\");\n });\n\n it(\"should not lock any sections when no framework category exists\", () => {\n const categoriesNoFramework: CategoryRow[] = [\n createCategory(\"styling\", \"Styling\", [\n createOption(\"web-test-scss\", \"SCSS\"),\n createOption(\"web-test-tailwind\", \"Tailwind\"),\n ]),\n createCategory(\"client-state\", \"State\", [createOption(\"web-test-zustand\", \"Zustand\")]),\n ];\n\n const { lastFrame, unmount } = renderGrid({\n categories: categoriesNoFramework,\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Styling\");\n expect(output).toContain(\"State\");\n });\n });\n\n describe(\"focus indicator\", () => {\n it(\"should render focused option with label text\", () => {\n const { lastFrame, unmount } = renderGrid({\n defaultFocusedRow: 0,\n defaultFocusedCol: 0,\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // Focused option should be visible (background highlighting is visual-only)\n expect(output).toContain(\"React\");\n });\n\n it(\"should render correctly when focusedRow changes\", () => {\n const { lastFrame: frame1, unmount: unmount1 } = renderGrid({\n categories: categoriesWithFramework,\n defaultFocusedRow: 0,\n defaultFocusedCol: 0,\n });\n const output1 = frame1();\n unmount1();\n\n const { lastFrame: frame2, unmount: unmount2 } = renderGrid({\n categories: categoriesWithFramework,\n defaultFocusedRow: 1,\n defaultFocusedCol: 0,\n });\n cleanup = unmount2;\n const output2 = frame2();\n\n // Both should render the focused category options\n expect(output1).toContain(\"Framework\");\n expect(output2).toContain(\"Styling\");\n });\n\n it(\"should highlight focused category name\", () => {\n const { lastFrame, unmount } = renderGrid({\n categories: categoriesWithFramework,\n defaultFocusedRow: 1,\n defaultFocusedCol: 0,\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // Styling row should be focused (index 1)\n expect(output).toContain(\"Styling\");\n });\n });\n\n describe(\"keyboard navigation - arrow keys\", () => {\n it(\"should call onFocusChange when pressing left arrow\", async () => {\n const onFocusChange = vi.fn();\n const { stdin, unmount } = renderGrid({\n defaultFocusedRow: 0,\n defaultFocusedCol: 1,\n onFocusChange,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(ARROW_LEFT);\n await delay(INPUT_DELAY_MS);\n\n expect(onFocusChange).toHaveBeenCalledWith(0, 0);\n });\n\n it(\"should call onFocusChange when pressing right arrow\", async () => {\n const onFocusChange = vi.fn();\n const { stdin, unmount } = renderGrid({\n defaultFocusedRow: 0,\n defaultFocusedCol: 0,\n onFocusChange,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(ARROW_RIGHT);\n await delay(INPUT_DELAY_MS);\n\n expect(onFocusChange).toHaveBeenCalledWith(0, 1);\n });\n\n it(\"should call onFocusChange when pressing up arrow (wraps to framework when locked)\", async () => {\n const onFocusChange = vi.fn();\n // No framework selected, so navigation stays on framework row\n const { stdin, unmount } = renderGrid({\n defaultFocusedRow: 0,\n defaultFocusedCol: 0,\n onFocusChange,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(ARROW_UP);\n await delay(INPUT_DELAY_MS);\n\n // Should stay on row 0 (framework) since other rows are locked\n expect(onFocusChange).toHaveBeenCalledWith(0, 0);\n });\n\n it(\"should navigate between sections when unlocked\", async () => {\n const onFocusChange = vi.fn();\n const { stdin, unmount } = renderGrid({\n categories: categoriesWithFramework,\n defaultFocusedRow: 0,\n defaultFocusedCol: 0,\n onFocusChange,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(ARROW_DOWN);\n await delay(INPUT_DELAY_MS);\n\n // Should move to row 1 (Styling) since framework is selected\n expect(onFocusChange).toHaveBeenCalledWith(1, 0);\n });\n\n it(\"should wrap horizontally when pressing left at first column\", async () => {\n const onFocusChange = vi.fn();\n const { stdin, unmount } = renderGrid({\n defaultFocusedRow: 0,\n defaultFocusedCol: 0,\n onFocusChange,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(ARROW_LEFT);\n await delay(INPUT_DELAY_MS);\n\n // Should wrap to last column (index 3 for framework with 4 options)\n expect(onFocusChange).toHaveBeenCalledWith(0, 3);\n });\n\n it(\"should wrap horizontally when pressing right at last column\", async () => {\n const onFocusChange = vi.fn();\n const { stdin, unmount } = renderGrid({\n defaultFocusedRow: 0,\n defaultFocusedCol: 3, // Last option in framework\n onFocusChange,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(ARROW_RIGHT);\n await delay(INPUT_DELAY_MS);\n\n // Should wrap to first column\n expect(onFocusChange).toHaveBeenCalledWith(0, 0);\n });\n\n it(\"should wrap vertically when all sections are unlocked\", async () => {\n const onFocusChange = vi.fn();\n const { stdin, unmount } = renderGrid({\n categories: categoriesWithFramework,\n defaultFocusedRow: 0,\n defaultFocusedCol: 0,\n onFocusChange,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(ARROW_UP);\n await delay(INPUT_DELAY_MS);\n\n // Should wrap to last row (index 2 for 3 categories)\n expect(onFocusChange).toHaveBeenCalledWith(2, 0);\n });\n });\n\n describe(\"keyboard navigation - vim keys\", () => {\n it(\"should move left with h key\", async () => {\n const onFocusChange = vi.fn();\n const { stdin, unmount } = renderGrid({\n defaultFocusedRow: 0,\n defaultFocusedCol: 1,\n onFocusChange,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(\"h\");\n await delay(INPUT_DELAY_MS);\n\n expect(onFocusChange).toHaveBeenCalledWith(0, 0);\n });\n\n it(\"should move right with l key\", async () => {\n const onFocusChange = vi.fn();\n const { stdin, unmount } = renderGrid({\n defaultFocusedRow: 0,\n defaultFocusedCol: 0,\n onFocusChange,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(\"l\");\n await delay(INPUT_DELAY_MS);\n\n expect(onFocusChange).toHaveBeenCalledWith(0, 1);\n });\n\n it(\"should move up with k key\", async () => {\n const onFocusChange = vi.fn();\n const { stdin, unmount } = renderGrid({\n categories: categoriesWithFramework,\n defaultFocusedRow: 1,\n defaultFocusedCol: 0,\n onFocusChange,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(\"k\");\n await delay(INPUT_DELAY_MS);\n\n expect(onFocusChange).toHaveBeenCalledWith(0, 0);\n });\n\n it(\"should move down with j key\", async () => {\n const onFocusChange = vi.fn();\n const { stdin, unmount } = renderGrid({\n categories: categoriesWithFramework,\n defaultFocusedRow: 0,\n defaultFocusedCol: 0,\n onFocusChange,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(\"j\");\n await delay(INPUT_DELAY_MS);\n\n expect(onFocusChange).toHaveBeenCalledWith(1, 0);\n });\n });\n\n describe(\"selection toggle\", () => {\n it(\"should call onToggle when pressing space on a normal option\", async () => {\n const onToggle = vi.fn();\n const { stdin, unmount } = renderGrid({\n defaultFocusedRow: 0,\n defaultFocusedCol: 1, // vue (normal state)\n onToggle,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(\" \"); // Space\n await delay(INPUT_DELAY_MS);\n\n expect(onToggle).toHaveBeenCalledWith(\"framework\", \"web-test-vue\");\n });\n\n it(\"should call onToggle when pressing space on a selected option\", async () => {\n const onToggle = vi.fn();\n // Use expertMode to preserve original option order\n const categories: CategoryRow[] = [\n createCategory(\n \"framework\",\n \"Framework\",\n [\n createOption(\"web-test-react\", \"React\", { selected: true }),\n createOption(\"web-test-vue\", \"Vue\"),\n ],\n { required: true },\n ),\n ];\n const { stdin, unmount } = renderGrid({\n categories,\n defaultFocusedRow: 0,\n defaultFocusedCol: 0, // react (selected)\n expertMode: true,\n onToggle,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(\" \");\n await delay(INPUT_DELAY_MS);\n\n expect(onToggle).toHaveBeenCalledWith(\"framework\", \"web-test-react\");\n });\n\n it(\"should NOT call onToggle when all options in a category are disabled\", async () => {\n const onToggle = vi.fn();\n const categories: CategoryRow[] = [\n createCategory(\"testing\", \"Test\", [\n createOption(\"web-test-opt1\", \"Option 1\", { state: \"disabled\" }),\n createOption(\"web-test-opt2\", \"Option 2\", { state: \"disabled\" }),\n ]),\n ];\n\n const { stdin, unmount } = renderGrid({\n categories,\n defaultFocusedRow: 0,\n defaultFocusedCol: 0,\n expertMode: true,\n onToggle,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(\" \");\n await delay(INPUT_DELAY_MS);\n\n expect(onToggle).not.toHaveBeenCalled();\n });\n\n it(\"should bounce focus away from locked sections on mount\", async () => {\n const onFocusChange = vi.fn();\n // No framework selected, styling section is locked\n const { unmount } = renderGrid({\n defaultFocusedRow: 1, // Styling (locked)\n defaultFocusedCol: 0,\n onFocusChange,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n // Focus should have bounced from locked row 1 to unlocked row 0 (framework)\n expect(onFocusChange).toHaveBeenCalledWith(0, 0);\n });\n });\n\n describe(\"disabled options navigation\", () => {\n it(\"should navigate to disabled options when navigating right\", async () => {\n const onFocusChange = vi.fn();\n const categories: CategoryRow[] = [\n createCategory(\"testing\", \"Test\", [\n createOption(\"web-test-opt1\", \"Option 1\"),\n createOption(\"web-test-opt2\", \"Option 2\", { state: \"disabled\" }),\n createOption(\"web-test-opt3\", \"Option 3\"),\n ]),\n ];\n\n // Initial sort moves disabled options to end: [opt1, opt3, opt2(disabled)]\n const { stdin, unmount } = renderGrid({\n categories,\n defaultFocusedRow: 0,\n defaultFocusedCol: 0,\n expertMode: true,\n onFocusChange,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(ARROW_RIGHT);\n await delay(INPUT_DELAY_MS);\n\n // opt3 is now at index 1 (after initial state-based sort), so navigating right goes to 1\n expect(onFocusChange).toHaveBeenCalledWith(0, 1);\n });\n\n it(\"should navigate to disabled options when navigating left\", async () => {\n const onFocusChange = vi.fn();\n const categories: CategoryRow[] = [\n createCategory(\"testing\", \"Test\", [\n createOption(\"web-test-opt1\", \"Option 1\"),\n createOption(\"web-test-opt2\", \"Option 2\", { state: \"disabled\" }),\n createOption(\"web-test-opt3\", \"Option 3\"),\n ]),\n ];\n\n // Initial sort: [opt1, opt3, opt2(disabled)] — disabled moves to end\n const { stdin, unmount } = renderGrid({\n categories,\n defaultFocusedRow: 0,\n defaultFocusedCol: 2, // Start at opt2 (disabled, sorted to end)\n expertMode: true,\n onFocusChange,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(ARROW_LEFT);\n await delay(INPUT_DELAY_MS);\n\n // Disabled options are hoverable — navigates to index 1 (opt3)\n expect(onFocusChange).toHaveBeenCalledWith(0, 1);\n });\n\n it(\"should navigate between all-disabled options in a row\", async () => {\n const onFocusChange = vi.fn();\n const categories: CategoryRow[] = [\n createCategory(\"testing\", \"Test\", [\n createOption(\"web-test-opt1\", \"Option 1\", { state: \"disabled\" }),\n createOption(\"web-test-opt2\", \"Option 2\", { state: \"disabled\" }),\n ]),\n ];\n\n // Use expertMode to preserve original option order\n const { stdin, unmount } = renderGrid({\n categories,\n defaultFocusedRow: 0,\n defaultFocusedCol: 0,\n expertMode: true,\n onFocusChange,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(ARROW_RIGHT);\n await delay(INPUT_DELAY_MS);\n\n // Disabled options are hoverable — navigates to index 1\n expect(onFocusChange).toHaveBeenCalledWith(0, 1);\n });\n });\n\n describe(\"exclusive categories\", () => {\n it(\"should render exclusive category correctly\", () => {\n const { lastFrame, unmount } = renderGrid();\n cleanup = unmount;\n\n const output = lastFrame();\n // All default categories are exclusive, should render normally\n expect(output).toContain(\"Framework\");\n });\n\n // Note: The actual exclusivity logic (only one selection) is handled\n // by the parent component via onToggle. CategoryGrid just displays\n // the current state.\n });\n\n describe(\"tab navigation\", () => {\n it(\"should jump to next section when pressing Tab\", async () => {\n const onFocusChange = vi.fn();\n const { stdin, unmount } = renderGrid({\n categories: categoriesWithFramework,\n defaultFocusedRow: 0,\n defaultFocusedCol: 0,\n onFocusChange,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(TAB);\n await delay(INPUT_DELAY_MS);\n\n // Should jump to next section (row 1)\n expect(onFocusChange).toHaveBeenCalledWith(1, 0);\n });\n\n it(\"should only jump to unlocked sections\", async () => {\n const onFocusChange = vi.fn();\n // No framework selected, so Tab should stay on framework\n const { stdin, unmount } = renderGrid({\n defaultFocusedRow: 0,\n defaultFocusedCol: 0,\n onFocusChange,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(TAB);\n await delay(INPUT_DELAY_MS);\n\n // Should NOT call onFocusChange since there's nowhere to go (all others locked)\n expect(onFocusChange).not.toHaveBeenCalled();\n });\n });\n\n describe(\"compatibility labels toggle\", () => {\n it(\"should call onToggleLabels when pressing d key\", async () => {\n const onToggleLabels = vi.fn();\n const { stdin, unmount } = renderGrid({\n onToggleLabels,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(\"d\");\n await delay(INPUT_DELAY_MS);\n\n expect(onToggleLabels).toHaveBeenCalled();\n });\n\n it(\"should show compatibility labels when showLabels is true\", () => {\n const { lastFrame, unmount } = renderGrid({ showLabels: true });\n cleanup = unmount;\n\n const output = lastFrame();\n // Should show compatibility label suffixes on skill tags\n expect(output).toContain(\"(recommended)\"); // react has state: \"recommended\"\n });\n\n it(\"should show Selected label for selected skills when showLabels is true\", () => {\n const { lastFrame, unmount } = renderGrid({ showLabels: true });\n cleanup = unmount;\n\n const output = lastFrame();\n // SCSS Modules is selected in defaultCategories\n expect(output).toContain(\"(selected)\");\n });\n\n it(\"should show Discouraged label when showLabels is true\", () => {\n // Use categoriesWithFramework so Client State section is unlocked\n const { lastFrame, unmount } = renderGrid({\n categories: categoriesWithFramework,\n showLabels: true,\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // Redux has state: \"discouraged\" in categoriesWithFramework\n expect(output).toContain(\"(discouraged)\");\n });\n\n it(\"should hide compatibility labels when showLabels is false\", () => {\n const { lastFrame, unmount } = renderGrid({ showLabels: false });\n cleanup = unmount;\n\n const output = lastFrame();\n // Labels should not be visible when toggle is off\n expect(output).not.toContain(\"(recommended)\");\n expect(output).not.toContain(\"(selected)\");\n expect(output).not.toContain(\"(discouraged)\");\n expect(output).not.toContain(\"(disabled)\");\n });\n\n it(\"should show Disabled label for disabled options when showLabels is true\", () => {\n const categories: CategoryRow[] = [\n createCategory(\"testing\", \"Test\", [\n createOption(\"web-test-opt1\", \"Option 1\"),\n createOption(\"web-test-opt2\", \"Option 2\", { state: \"disabled\" }),\n ]),\n ];\n\n const { lastFrame, unmount } = renderGrid({ categories, showLabels: true });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"(disabled)\");\n });\n });\n\n describe(\"expert mode\", () => {\n it(\"should not handle expert mode toggle locally (handled globally)\", () => {\n // Expert mode toggle is now handled at wizard.tsx level via global useInput\n // CategoryGrid no longer has onToggleExpertMode prop\n const { lastFrame, unmount } = renderGrid();\n cleanup = unmount;\n\n const output = lastFrame();\n // Header should not show expert mode toggle hint\n expect(output).not.toContain(\"[e] Expert Mode\");\n });\n });\n\n describe(\"option ordering\", () => {\n it(\"should preserve original order regardless of state\", () => {\n // Options should never reorder based on recommended/discouraged/disabled state\n const { lastFrame, unmount } = renderGrid({ expertMode: false });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toBeDefined();\n });\n\n it(\"should preserve original order in expert mode\", () => {\n const { lastFrame, unmount } = renderGrid({ expertMode: true });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toBeDefined();\n });\n });\n\n describe(\"edge cases\", () => {\n it(\"should handle single category\", () => {\n const categories: CategoryRow[] = [\n createCategory(\"forms\", \"Single Category\", [createOption(\"web-test-opt1\", \"Option 1\")]),\n ];\n\n const { lastFrame, unmount } = renderGrid({ categories });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Single Category\");\n expect(output).toContain(\"Option 1\");\n });\n\n it(\"should handle single option in category\", () => {\n const categories: CategoryRow[] = [\n createCategory(\"forms\", \"Single\", [createOption(\"web-test-only\", \"Only Option\")]),\n ];\n\n const { lastFrame, unmount } = renderGrid({ categories });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Only Option\");\n });\n\n it(\"should handle category with many options (flows naturally)\", () => {\n const options = Array.from({ length: 10 }, (_, i) =>\n createOption(`web-test-opt${i}`, `Option ${i}`),\n );\n const categories: CategoryRow[] = [createCategory(\"mocking\", \"Many Options\", options)];\n\n const { lastFrame, unmount } = renderGrid({ categories });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Many Options\");\n // All options should be present (no fixed row limit)\n expect(output).toContain(\"Option 0\");\n expect(output).toContain(\"Option 9\");\n });\n\n it(\"should handle long option labels\", () => {\n const categories: CategoryRow[] = [\n createCategory(\"i18n\", \"Long Labels\", [\n createOption(\"web-test-long1\", \"Very Long Option Name\"),\n createOption(\"web-test-long2\", \"Another Long Name\"),\n ]),\n ];\n\n const { lastFrame, unmount } = renderGrid({ categories });\n cleanup = unmount;\n\n const output = lastFrame();\n // Labels should be rendered (flowing layout handles long labels)\n expect(output).toContain(\"Very Long Option Name\");\n });\n\n it(\"should handle categories with different option counts\", () => {\n const categories: CategoryRow[] = [\n createCategory(\"framework\", \"Category 1\", [\n createOption(\"web-test-opt1\", \"Option 1\"),\n createOption(\"web-test-opt2\", \"Option 2\"),\n ]),\n createCategory(\"styling\", \"Category 2\", [createOption(\"web-test-opt3\", \"Option 3\")]),\n createCategory(\"client-state\", \"Category 3\", [\n createOption(\"web-test-opt4\", \"Option 4\"),\n createOption(\"web-test-opt5\", \"Option 5\"),\n createOption(\"web-test-opt6\", \"Option 6\"),\n ]),\n ];\n\n const { lastFrame, unmount } = renderGrid({ categories });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Category 1\");\n expect(output).toContain(\"Category 2\");\n expect(output).toContain(\"Category 3\");\n });\n });\n\n describe(\"column adjustment\", () => {\n it(\"should adjust focusedCol when changing to row with fewer options\", async () => {\n const onFocusChange = vi.fn();\n const categories: CategoryRow[] = [\n createCategory(\n \"framework\",\n \"Framework\",\n [\n createOption(\"web-test-opt1\", \"Option 1\", { selected: true }), // Framework selected\n createOption(\"web-test-opt2\", \"Option 2\"),\n createOption(\"web-test-opt3\", \"Option 3\"),\n ],\n { required: true },\n ),\n createCategory(\"styling\", \"Category 2\", [createOption(\"web-test-opt4\", \"Option 4\")]),\n ];\n\n const { stdin, unmount } = renderGrid({\n categories,\n defaultFocusedRow: 0,\n defaultFocusedCol: 2, // Last option in first row\n onFocusChange,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(ARROW_DOWN);\n await delay(INPUT_DELAY_MS);\n\n // Should move to row 1, and col should be clamped to 0 (only option)\n expect(onFocusChange).toHaveBeenCalledWith(1, 0);\n });\n });\n\n describe(\"installed skills\", () => {\n it(\"should render installed skill with label only (no checkmark icon)\", () => {\n const categories: CategoryRow[] = [\n createCategory(\"forms\", \"Forms\", [\n createOption(\"web-test-opt1\", \"Option 1\", { installed: true }),\n ]),\n ];\n\n const { lastFrame, unmount } = renderGrid({ categories });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).not.toContain(\"✓\");\n expect(output).toContain(\"Option 1\");\n });\n\n it(\"should render installed and selected skill with label only\", () => {\n const categories: CategoryRow[] = [\n createCategory(\"forms\", \"Forms\", [\n createOption(\"web-test-opt1\", \"Option 1\", { installed: true, selected: true }),\n ]),\n ];\n\n const { lastFrame, unmount } = renderGrid({ categories });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).not.toContain(\"✓\");\n expect(output).toContain(\"Option 1\");\n });\n\n it(\"should render local installed skill without L badge or checkmark\", () => {\n const categories: CategoryRow[] = [\n createCategory(\"forms\", \"Forms\", [\n createOption(\"web-test-opt1\", \"Option 1\", { local: true, installed: true }),\n ]),\n ];\n\n const { lastFrame, unmount } = renderGrid({ categories });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).not.toContain(\"✓\");\n expect(output).toContain(\"Option 1\");\n });\n });\n\n describe(\"natural flow (no virtual scroll)\", () => {\n it(\"should render all categories without scroll indicators\", () => {\n const { lastFrame, unmount } = renderGrid();\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Framework\");\n expect(output).toContain(\"Styling\");\n expect(output).toContain(\"Client State\");\n expect(output).toContain(\"Server State\");\n expect(output).toContain(\"Analytics\");\n expect(output).not.toContain(\"more categories\");\n });\n\n it(\"should render all categories even with many entries\", () => {\n const manyCategories: CategoryRow[] = Array.from({ length: 8 }, (_, i) =>\n createCategory(`cat-${i}` as Subcategory, `Category ${i}`, [\n createOption(`web-test-opt${i}-a`, `Option ${i}A`),\n createOption(`web-test-opt${i}-b`, `Option ${i}B`),\n createOption(`web-test-opt${i}-c`, `Option ${i}C`),\n ]),\n );\n\n const { lastFrame, unmount } = renderGrid({\n categories: manyCategories,\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // All 8 categories should be rendered\n for (let i = 0; i < 8; i++) {\n expect(output).toContain(`Category ${i}`);\n }\n expect(output).not.toContain(\"more categories\");\n });\n\n it(\"should keep focused category visible when navigating down\", async () => {\n const onFocusChange = vi.fn();\n const manyCategories: CategoryRow[] = Array.from({ length: 6 }, (_, i) =>\n createCategory(`cat-${i}` as Subcategory, `Category ${i}`, [\n createOption(`web-test-opt${i}-a`, `Option ${i}A`),\n ]),\n );\n\n const { stdin, lastFrame, unmount } = renderGrid({\n categories: manyCategories,\n defaultFocusedRow: 0,\n onFocusChange,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(ARROW_DOWN);\n await delay(INPUT_DELAY_MS);\n await stdin.write(ARROW_DOWN);\n await delay(INPUT_DELAY_MS);\n await stdin.write(ARROW_DOWN);\n await delay(INPUT_DELAY_MS);\n\n const output = lastFrame();\n expect(output).toContain(\"Category 3\");\n });\n });\n});\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../src/cli/components/wizard/category-grid.test.tsx"],"sourcesContent":["import { render } from \"ink-testing-library\";\nimport { describe, expect, it, afterEach, vi } from \"vitest\";\nimport {\n CategoryGrid,\n type CategoryGridProps,\n type CategoryRow,\n type CategoryOption,\n} from \"./category-grid\";\nimport type { SkillId, Subcategory } from \"../../types\";\nimport {\n ARROW_UP,\n ARROW_DOWN,\n ARROW_LEFT,\n ARROW_RIGHT,\n TAB,\n RENDER_DELAY_MS,\n INPUT_DELAY_MS,\n delay,\n} from \"../../lib/__tests__/test-constants\";\n\nconst createOption = (\n id: SkillId,\n label: string,\n overrides: Partial<CategoryOption> = {},\n): CategoryOption => ({\n id,\n label,\n state: \"normal\",\n selected: false,\n ...overrides,\n});\n\nconst createCategory = (\n id: Subcategory,\n displayName: string,\n options: CategoryOption[],\n overrides: Partial<CategoryRow> = {},\n): CategoryRow => ({\n id,\n displayName,\n required: false,\n exclusive: true,\n options,\n ...overrides,\n});\n\nconst defaultCategories: CategoryRow[] = [\n createCategory(\n \"web-framework\",\n \"Framework\",\n [\n createOption(\"web-test-react\", \"React\", {\n state: \"recommended\",\n stateReason: \"Popular choice\",\n }),\n createOption(\"web-test-vue\", \"Vue\"),\n createOption(\"web-test-angular\", \"Angular\"),\n createOption(\"web-test-svelte\", \"Svelte\"),\n ],\n { required: true },\n ),\n createCategory(\n \"web-styling\",\n \"Styling\",\n [\n createOption(\"web-scss-mod\", \"SCSS Modules\", { selected: true }),\n createOption(\"web-test-tailwind\", \"Tailwind\", { state: \"recommended\" }),\n createOption(\"web-test-styled\", \"Styled Components\"),\n createOption(\"web-test-vanilla\", \"Vanilla CSS\"),\n ],\n { required: true },\n ),\n createCategory(\"web-client-state\", \"Client State\", [\n createOption(\"web-test-zustand\", \"Zustand\", { state: \"recommended\" }),\n createOption(\"web-test-jotai\", \"Jotai\"),\n createOption(\"web-test-redux\", \"Redux\", {\n state: \"discouraged\",\n stateReason: \"Complex for most apps\",\n }),\n createOption(\"web-test-mobx\", \"MobX\"),\n ]),\n createCategory(\"web-server-state\", \"Server State\", [\n createOption(\"web-react-query\", \"React Query\", { selected: true }),\n createOption(\"web-test-swr\", \"SWR\"),\n createOption(\"web-test-apollo\", \"Apollo\"),\n ]),\n createCategory(\"api-analytics\", \"Analytics\", [createOption(\"web-test-posthog\", \"PostHog\")]),\n];\n\nconst categoriesWithFramework: CategoryRow[] = [\n createCategory(\n \"web-framework\",\n \"Framework\",\n [\n createOption(\"web-test-react\", \"React\", {\n state: \"recommended\",\n stateReason: \"Popular choice\",\n selected: true, // Framework selected\n }),\n createOption(\"web-test-vue\", \"Vue\"),\n createOption(\"web-test-angular\", \"Angular\"),\n createOption(\"web-test-svelte\", \"Svelte\"),\n ],\n { required: true },\n ),\n createCategory(\n \"web-styling\",\n \"Styling\",\n [\n createOption(\"web-scss-mod\", \"SCSS Modules\"),\n createOption(\"web-test-tailwind\", \"Tailwind\", { state: \"recommended\" }),\n createOption(\"web-test-styled\", \"Styled Components\"),\n createOption(\"web-test-vanilla\", \"Vanilla CSS\"),\n ],\n { required: true },\n ),\n createCategory(\"web-client-state\", \"Client State\", [\n createOption(\"web-test-zustand\", \"Zustand\", { state: \"recommended\" }),\n createOption(\"web-test-jotai\", \"Jotai\"),\n createOption(\"web-test-redux\", \"Redux\", { state: \"discouraged\" }),\n createOption(\"web-test-mobx\", \"MobX\"),\n ]),\n];\n\nconst defaultProps: CategoryGridProps = {\n categories: defaultCategories,\n defaultFocusedRow: 0,\n defaultFocusedCol: 0,\n showLabels: false,\n expertMode: false,\n onToggle: vi.fn(),\n onFocusChange: vi.fn(),\n onToggleLabels: vi.fn(),\n};\n\nconst renderGrid = (props: Partial<CategoryGridProps> = {}) => {\n return render(<CategoryGrid {...defaultProps} {...props} />);\n};\n\ndescribe(\"CategoryGrid component\", () => {\n let cleanup: (() => void) | undefined;\n\n afterEach(() => {\n cleanup?.();\n cleanup = undefined;\n });\n\n describe(\"rendering\", () => {\n it(\"should render all categories as sections\", () => {\n const { lastFrame, unmount } = renderGrid();\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Framework\");\n expect(output).toContain(\"Styling\");\n expect(output).toContain(\"Client State\");\n expect(output).toContain(\"Server State\");\n expect(output).toContain(\"Analytics\");\n });\n\n it(\"should render all options in each category\", () => {\n const { lastFrame, unmount } = renderGrid();\n cleanup = unmount;\n\n const output = lastFrame();\n // Framework options\n expect(output).toContain(\"React\");\n expect(output).toContain(\"Vue\");\n expect(output).toContain(\"Angular\");\n expect(output).toContain(\"Svelte\");\n // Styling options\n expect(output).toContain(\"SCSS Modules\");\n expect(output).toContain(\"Tailwind\");\n });\n\n it(\"should show required indicator (*) for required categories\", () => {\n const { lastFrame, unmount } = renderGrid();\n cleanup = unmount;\n\n const output = lastFrame();\n // Framework and Styling are required\n // The * should appear after their names\n expect(output).toContain(\"*\");\n });\n\n it(\"should NOT show (optional) for non-required categories\", () => {\n const { lastFrame, unmount } = renderGrid();\n cleanup = unmount;\n\n const output = lastFrame();\n // Optional is assumed by default, so we don't show the label\n expect(output).not.toContain(\"(optional)\");\n });\n\n it(\"should handle empty categories array\", () => {\n const { lastFrame, unmount } = renderGrid({ categories: [] });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"No categories to display\");\n });\n\n it(\"should render section underlines\", () => {\n const { lastFrame, unmount } = renderGrid();\n cleanup = unmount;\n\n const output = lastFrame();\n // Unicode horizontal line character used for underlines\n expect(output).toContain(\"\\u2500\");\n });\n });\n\n describe(\"visual states\", () => {\n it(\"should show selected options with label text\", () => {\n const { lastFrame, unmount } = renderGrid();\n cleanup = unmount;\n\n const output = lastFrame();\n // scss-mod and react-query are selected in defaultCategories\n expect(output).toContain(\"SCSS Modules\");\n expect(output).toContain(\"React Query\");\n });\n\n it(\"should show unselected options with label text\", () => {\n const { lastFrame, unmount } = renderGrid();\n cleanup = unmount;\n\n const output = lastFrame();\n // Unselected options should display their labels\n expect(output).toContain(\"Vue\");\n expect(output).toContain(\"Angular\");\n });\n\n it(\"should NOT show star indicator for recommended options (uses background instead)\", () => {\n const { lastFrame, unmount } = renderGrid();\n cleanup = unmount;\n\n const output = lastFrame();\n // Should NOT contain star (⭐) for recommended\n expect(output).not.toContain(\"\\u2B50\");\n });\n\n it(\"should NOT show warning indicator for discouraged options (uses color instead)\", () => {\n const { lastFrame, unmount } = renderGrid();\n cleanup = unmount;\n\n const output = lastFrame();\n // Should NOT contain warning (⚠) for discouraged\n expect(output).not.toContain(\"\\u26A0\");\n });\n\n it(\"should show disabled options with dimmed styling\", () => {\n const categories: CategoryRow[] = [\n createCategory(\"web-testing\", \"Test\", [\n createOption(\"web-test-opt1\", \"Option 1\"),\n createOption(\"web-test-opt2\", \"Option 2\", { state: \"disabled\" }),\n ]),\n ];\n\n const { lastFrame, unmount } = renderGrid({ categories });\n cleanup = unmount;\n\n const output = lastFrame();\n // Disabled options should show label (dimmed text)\n expect(output).toContain(\"Option 2\");\n });\n\n it(\"should render selected skills with label text\", () => {\n const categories: CategoryRow[] = [\n createCategory(\"web-forms\", \"Forms\", [\n createOption(\"web-test-opt1\", \"Selected Skill\", { selected: true }),\n ]),\n ];\n\n const { lastFrame, unmount } = renderGrid({ categories });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Selected Skill\");\n });\n\n it(\"should render unselected skills with label text\", () => {\n const categories: CategoryRow[] = [\n createCategory(\"web-forms\", \"Forms\", [\n createOption(\"web-test-opt1\", \"Unselected Skill\", { state: \"normal\", selected: false }),\n ]),\n ];\n\n const { lastFrame, unmount } = renderGrid({ categories });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Unselected Skill\");\n });\n\n it(\"should render disabled skills with label text\", () => {\n const categories: CategoryRow[] = [\n createCategory(\"web-forms\", \"Forms\", [\n createOption(\"web-test-opt1\", \"Disabled Skill\", { state: \"disabled\" }),\n ]),\n ];\n\n const { lastFrame, unmount } = renderGrid({ categories });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Disabled Skill\");\n });\n\n it(\"should render discouraged skills with label text\", () => {\n const categories: CategoryRow[] = [\n createCategory(\"web-forms\", \"Forms\", [\n createOption(\"web-test-opt1\", \"Discouraged Skill\", { state: \"discouraged\" }),\n ]),\n ];\n\n const { lastFrame, unmount } = renderGrid({ categories });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Discouraged Skill\");\n });\n\n it(\"should render both selected and unselected skills with labels\", () => {\n const categories: CategoryRow[] = [\n createCategory(\"web-forms\", \"Forms\", [\n createOption(\"web-test-opt1\", \"Active\", { selected: true }),\n createOption(\"web-test-opt2\", \"Inactive\", { selected: false }),\n ]),\n ];\n\n const { lastFrame, unmount } = renderGrid({ categories, expertMode: true });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Active\");\n expect(output).toContain(\"Inactive\");\n });\n\n it(\"should render skill label regardless of selection state\", () => {\n const categories1: CategoryRow[] = [\n createCategory(\"web-forms\", \"Forms\", [\n createOption(\"web-test-opt1\", \"Toggle Skill\", { selected: false }),\n ]),\n ];\n\n const { lastFrame: frame1, unmount: unmount1 } = renderGrid({ categories: categories1 });\n const output1 = frame1();\n unmount1();\n\n // Second render: same option selected\n const categories2: CategoryRow[] = [\n createCategory(\"web-forms\", \"Forms\", [\n createOption(\"web-test-opt1\", \"Toggle Skill\", { selected: true }),\n ]),\n ];\n\n const { lastFrame: frame2, unmount: unmount2 } = renderGrid({ categories: categories2 });\n cleanup = unmount2;\n const output2 = frame2();\n\n // Both states should render the label\n expect(output1).toContain(\"Toggle Skill\");\n expect(output2).toContain(\"Toggle Skill\");\n });\n });\n\n describe(\"locked sections\", () => {\n it(\"should show all categories including locked ones\", () => {\n // No framework selected, so non-framework sections should be locked but visible\n const { lastFrame, unmount } = renderGrid();\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Framework\");\n expect(output).toContain(\"Styling\");\n expect(output).toContain(\"Client State\");\n });\n\n it(\"should unlock sections when framework is selected\", () => {\n const { lastFrame, unmount } = renderGrid({\n categories: categoriesWithFramework,\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // All sections should be visible and navigable\n expect(output).toContain(\"Framework\");\n expect(output).toContain(\"Styling\");\n expect(output).toContain(\"Client State\");\n });\n\n it(\"should not lock any sections when no framework category exists\", () => {\n const categoriesNoFramework: CategoryRow[] = [\n createCategory(\"web-styling\", \"Styling\", [\n createOption(\"web-test-scss\", \"SCSS\"),\n createOption(\"web-test-tailwind\", \"Tailwind\"),\n ]),\n createCategory(\"web-client-state\", \"State\", [createOption(\"web-test-zustand\", \"Zustand\")]),\n ];\n\n const { lastFrame, unmount } = renderGrid({\n categories: categoriesNoFramework,\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Styling\");\n expect(output).toContain(\"State\");\n });\n });\n\n describe(\"focus indicator\", () => {\n it(\"should render focused option with label text\", () => {\n const { lastFrame, unmount } = renderGrid({\n defaultFocusedRow: 0,\n defaultFocusedCol: 0,\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // Focused option should be visible (background highlighting is visual-only)\n expect(output).toContain(\"React\");\n });\n\n it(\"should render correctly when focusedRow changes\", () => {\n const { lastFrame: frame1, unmount: unmount1 } = renderGrid({\n categories: categoriesWithFramework,\n defaultFocusedRow: 0,\n defaultFocusedCol: 0,\n });\n const output1 = frame1();\n unmount1();\n\n const { lastFrame: frame2, unmount: unmount2 } = renderGrid({\n categories: categoriesWithFramework,\n defaultFocusedRow: 1,\n defaultFocusedCol: 0,\n });\n cleanup = unmount2;\n const output2 = frame2();\n\n // Both should render the focused category options\n expect(output1).toContain(\"Framework\");\n expect(output2).toContain(\"Styling\");\n });\n\n it(\"should highlight focused category name\", () => {\n const { lastFrame, unmount } = renderGrid({\n categories: categoriesWithFramework,\n defaultFocusedRow: 1,\n defaultFocusedCol: 0,\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // Styling row should be focused (index 1)\n expect(output).toContain(\"Styling\");\n });\n });\n\n describe(\"keyboard navigation - arrow keys\", () => {\n it(\"should call onFocusChange when pressing left arrow\", async () => {\n const onFocusChange = vi.fn();\n const { stdin, unmount } = renderGrid({\n defaultFocusedRow: 0,\n defaultFocusedCol: 1,\n onFocusChange,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(ARROW_LEFT);\n await delay(INPUT_DELAY_MS);\n\n expect(onFocusChange).toHaveBeenCalledWith(0, 0);\n });\n\n it(\"should call onFocusChange when pressing right arrow\", async () => {\n const onFocusChange = vi.fn();\n const { stdin, unmount } = renderGrid({\n defaultFocusedRow: 0,\n defaultFocusedCol: 0,\n onFocusChange,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(ARROW_RIGHT);\n await delay(INPUT_DELAY_MS);\n\n expect(onFocusChange).toHaveBeenCalledWith(0, 1);\n });\n\n it(\"should call onFocusChange when pressing up arrow (wraps to framework when locked)\", async () => {\n const onFocusChange = vi.fn();\n // No framework selected, so navigation stays on framework row\n const { stdin, unmount } = renderGrid({\n defaultFocusedRow: 0,\n defaultFocusedCol: 0,\n onFocusChange,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(ARROW_UP);\n await delay(INPUT_DELAY_MS);\n\n // Should stay on row 0 (framework) since other rows are locked\n expect(onFocusChange).toHaveBeenCalledWith(0, 0);\n });\n\n it(\"should navigate between sections when unlocked\", async () => {\n const onFocusChange = vi.fn();\n const { stdin, unmount } = renderGrid({\n categories: categoriesWithFramework,\n defaultFocusedRow: 0,\n defaultFocusedCol: 0,\n onFocusChange,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(ARROW_DOWN);\n await delay(INPUT_DELAY_MS);\n\n // Should move to row 1 (Styling) since framework is selected\n expect(onFocusChange).toHaveBeenCalledWith(1, 0);\n });\n\n it(\"should wrap horizontally when pressing left at first column\", async () => {\n const onFocusChange = vi.fn();\n const { stdin, unmount } = renderGrid({\n defaultFocusedRow: 0,\n defaultFocusedCol: 0,\n onFocusChange,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(ARROW_LEFT);\n await delay(INPUT_DELAY_MS);\n\n // Should wrap to last column (index 3 for framework with 4 options)\n expect(onFocusChange).toHaveBeenCalledWith(0, 3);\n });\n\n it(\"should wrap horizontally when pressing right at last column\", async () => {\n const onFocusChange = vi.fn();\n const { stdin, unmount } = renderGrid({\n defaultFocusedRow: 0,\n defaultFocusedCol: 3, // Last option in framework\n onFocusChange,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(ARROW_RIGHT);\n await delay(INPUT_DELAY_MS);\n\n // Should wrap to first column\n expect(onFocusChange).toHaveBeenCalledWith(0, 0);\n });\n\n it(\"should wrap vertically when all sections are unlocked\", async () => {\n const onFocusChange = vi.fn();\n const { stdin, unmount } = renderGrid({\n categories: categoriesWithFramework,\n defaultFocusedRow: 0,\n defaultFocusedCol: 0,\n onFocusChange,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(ARROW_UP);\n await delay(INPUT_DELAY_MS);\n\n // Should wrap to last row (index 2 for 3 categories)\n expect(onFocusChange).toHaveBeenCalledWith(2, 0);\n });\n });\n\n describe(\"keyboard navigation - vim keys\", () => {\n it(\"should move left with h key\", async () => {\n const onFocusChange = vi.fn();\n const { stdin, unmount } = renderGrid({\n defaultFocusedRow: 0,\n defaultFocusedCol: 1,\n onFocusChange,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(\"h\");\n await delay(INPUT_DELAY_MS);\n\n expect(onFocusChange).toHaveBeenCalledWith(0, 0);\n });\n\n it(\"should move right with l key\", async () => {\n const onFocusChange = vi.fn();\n const { stdin, unmount } = renderGrid({\n defaultFocusedRow: 0,\n defaultFocusedCol: 0,\n onFocusChange,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(\"l\");\n await delay(INPUT_DELAY_MS);\n\n expect(onFocusChange).toHaveBeenCalledWith(0, 1);\n });\n\n it(\"should move up with k key\", async () => {\n const onFocusChange = vi.fn();\n const { stdin, unmount } = renderGrid({\n categories: categoriesWithFramework,\n defaultFocusedRow: 1,\n defaultFocusedCol: 0,\n onFocusChange,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(\"k\");\n await delay(INPUT_DELAY_MS);\n\n expect(onFocusChange).toHaveBeenCalledWith(0, 0);\n });\n\n it(\"should move down with j key\", async () => {\n const onFocusChange = vi.fn();\n const { stdin, unmount } = renderGrid({\n categories: categoriesWithFramework,\n defaultFocusedRow: 0,\n defaultFocusedCol: 0,\n onFocusChange,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(\"j\");\n await delay(INPUT_DELAY_MS);\n\n expect(onFocusChange).toHaveBeenCalledWith(1, 0);\n });\n });\n\n describe(\"selection toggle\", () => {\n it(\"should call onToggle when pressing space on a normal option\", async () => {\n const onToggle = vi.fn();\n const { stdin, unmount } = renderGrid({\n defaultFocusedRow: 0,\n defaultFocusedCol: 1, // vue (normal state)\n onToggle,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(\" \"); // Space\n await delay(INPUT_DELAY_MS);\n\n expect(onToggle).toHaveBeenCalledWith(\"web-framework\", \"web-test-vue\");\n });\n\n it(\"should call onToggle when pressing space on a selected option\", async () => {\n const onToggle = vi.fn();\n // Use expertMode to preserve original option order\n const categories: CategoryRow[] = [\n createCategory(\n \"web-framework\",\n \"Framework\",\n [\n createOption(\"web-test-react\", \"React\", { selected: true }),\n createOption(\"web-test-vue\", \"Vue\"),\n ],\n { required: true },\n ),\n ];\n const { stdin, unmount } = renderGrid({\n categories,\n defaultFocusedRow: 0,\n defaultFocusedCol: 0, // react (selected)\n expertMode: true,\n onToggle,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(\" \");\n await delay(INPUT_DELAY_MS);\n\n expect(onToggle).toHaveBeenCalledWith(\"web-framework\", \"web-test-react\");\n });\n\n it(\"should NOT call onToggle when all options in a category are disabled\", async () => {\n const onToggle = vi.fn();\n const categories: CategoryRow[] = [\n createCategory(\"web-testing\", \"Test\", [\n createOption(\"web-test-opt1\", \"Option 1\", { state: \"disabled\" }),\n createOption(\"web-test-opt2\", \"Option 2\", { state: \"disabled\" }),\n ]),\n ];\n\n const { stdin, unmount } = renderGrid({\n categories,\n defaultFocusedRow: 0,\n defaultFocusedCol: 0,\n expertMode: true,\n onToggle,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(\" \");\n await delay(INPUT_DELAY_MS);\n\n expect(onToggle).not.toHaveBeenCalled();\n });\n\n it(\"should bounce focus away from locked sections on mount\", async () => {\n const onFocusChange = vi.fn();\n // No framework selected, styling section is locked\n const { unmount } = renderGrid({\n defaultFocusedRow: 1, // Styling (locked)\n defaultFocusedCol: 0,\n onFocusChange,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n // Focus should have bounced from locked row 1 to unlocked row 0 (framework)\n expect(onFocusChange).toHaveBeenCalledWith(0, 0);\n });\n });\n\n describe(\"disabled options navigation\", () => {\n it(\"should navigate to disabled options when navigating right\", async () => {\n const onFocusChange = vi.fn();\n const categories: CategoryRow[] = [\n createCategory(\"web-testing\", \"Test\", [\n createOption(\"web-test-opt1\", \"Option 1\"),\n createOption(\"web-test-opt2\", \"Option 2\", { state: \"disabled\" }),\n createOption(\"web-test-opt3\", \"Option 3\"),\n ]),\n ];\n\n // Initial sort moves disabled options to end: [opt1, opt3, opt2(disabled)]\n const { stdin, unmount } = renderGrid({\n categories,\n defaultFocusedRow: 0,\n defaultFocusedCol: 0,\n expertMode: true,\n onFocusChange,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(ARROW_RIGHT);\n await delay(INPUT_DELAY_MS);\n\n // opt3 is now at index 1 (after initial state-based sort), so navigating right goes to 1\n expect(onFocusChange).toHaveBeenCalledWith(0, 1);\n });\n\n it(\"should navigate to disabled options when navigating left\", async () => {\n const onFocusChange = vi.fn();\n const categories: CategoryRow[] = [\n createCategory(\"web-testing\", \"Test\", [\n createOption(\"web-test-opt1\", \"Option 1\"),\n createOption(\"web-test-opt2\", \"Option 2\", { state: \"disabled\" }),\n createOption(\"web-test-opt3\", \"Option 3\"),\n ]),\n ];\n\n // Initial sort: [opt1, opt3, opt2(disabled)] — disabled moves to end\n const { stdin, unmount } = renderGrid({\n categories,\n defaultFocusedRow: 0,\n defaultFocusedCol: 2, // Start at opt2 (disabled, sorted to end)\n expertMode: true,\n onFocusChange,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(ARROW_LEFT);\n await delay(INPUT_DELAY_MS);\n\n // Disabled options are hoverable — navigates to index 1 (opt3)\n expect(onFocusChange).toHaveBeenCalledWith(0, 1);\n });\n\n it(\"should navigate between all-disabled options in a row\", async () => {\n const onFocusChange = vi.fn();\n const categories: CategoryRow[] = [\n createCategory(\"web-testing\", \"Test\", [\n createOption(\"web-test-opt1\", \"Option 1\", { state: \"disabled\" }),\n createOption(\"web-test-opt2\", \"Option 2\", { state: \"disabled\" }),\n ]),\n ];\n\n // Use expertMode to preserve original option order\n const { stdin, unmount } = renderGrid({\n categories,\n defaultFocusedRow: 0,\n defaultFocusedCol: 0,\n expertMode: true,\n onFocusChange,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(ARROW_RIGHT);\n await delay(INPUT_DELAY_MS);\n\n // Disabled options are hoverable — navigates to index 1\n expect(onFocusChange).toHaveBeenCalledWith(0, 1);\n });\n });\n\n describe(\"exclusive categories\", () => {\n it(\"should render exclusive category correctly\", () => {\n const { lastFrame, unmount } = renderGrid();\n cleanup = unmount;\n\n const output = lastFrame();\n // All default categories are exclusive, should render normally\n expect(output).toContain(\"Framework\");\n });\n\n // Note: The actual exclusivity logic (only one selection) is handled\n // by the parent component via onToggle. CategoryGrid just displays\n // the current state.\n });\n\n describe(\"tab navigation\", () => {\n it(\"should jump to next section when pressing Tab\", async () => {\n const onFocusChange = vi.fn();\n const { stdin, unmount } = renderGrid({\n categories: categoriesWithFramework,\n defaultFocusedRow: 0,\n defaultFocusedCol: 0,\n onFocusChange,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(TAB);\n await delay(INPUT_DELAY_MS);\n\n // Should jump to next section (row 1)\n expect(onFocusChange).toHaveBeenCalledWith(1, 0);\n });\n\n it(\"should only jump to unlocked sections\", async () => {\n const onFocusChange = vi.fn();\n // No framework selected, so Tab should stay on framework\n const { stdin, unmount } = renderGrid({\n defaultFocusedRow: 0,\n defaultFocusedCol: 0,\n onFocusChange,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(TAB);\n await delay(INPUT_DELAY_MS);\n\n // Should NOT call onFocusChange since there's nowhere to go (all others locked)\n expect(onFocusChange).not.toHaveBeenCalled();\n });\n });\n\n describe(\"compatibility labels toggle\", () => {\n it(\"should call onToggleLabels when pressing d key\", async () => {\n const onToggleLabels = vi.fn();\n const { stdin, unmount } = renderGrid({\n onToggleLabels,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(\"d\");\n await delay(INPUT_DELAY_MS);\n\n expect(onToggleLabels).toHaveBeenCalled();\n });\n\n it(\"should show compatibility labels when showLabels is true\", () => {\n const { lastFrame, unmount } = renderGrid({ showLabels: true });\n cleanup = unmount;\n\n const output = lastFrame();\n // Should show compatibility label suffixes on skill tags\n expect(output).toContain(\"(recommended)\"); // react has state: \"recommended\"\n });\n\n it(\"should show Selected label for selected skills when showLabels is true\", () => {\n const { lastFrame, unmount } = renderGrid({ showLabels: true });\n cleanup = unmount;\n\n const output = lastFrame();\n // SCSS Modules is selected in defaultCategories\n expect(output).toContain(\"(selected)\");\n });\n\n it(\"should show Discouraged label when showLabels is true\", () => {\n // Use categoriesWithFramework so Client State section is unlocked\n const { lastFrame, unmount } = renderGrid({\n categories: categoriesWithFramework,\n showLabels: true,\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // Redux has state: \"discouraged\" in categoriesWithFramework\n expect(output).toContain(\"(discouraged)\");\n });\n\n it(\"should hide compatibility labels when showLabels is false\", () => {\n const { lastFrame, unmount } = renderGrid({ showLabels: false });\n cleanup = unmount;\n\n const output = lastFrame();\n // Labels should not be visible when toggle is off\n expect(output).not.toContain(\"(recommended)\");\n expect(output).not.toContain(\"(selected)\");\n expect(output).not.toContain(\"(discouraged)\");\n expect(output).not.toContain(\"(disabled)\");\n });\n\n it(\"should show Disabled label for disabled options when showLabels is true\", () => {\n const categories: CategoryRow[] = [\n createCategory(\"web-testing\", \"Test\", [\n createOption(\"web-test-opt1\", \"Option 1\"),\n createOption(\"web-test-opt2\", \"Option 2\", { state: \"disabled\" }),\n ]),\n ];\n\n const { lastFrame, unmount } = renderGrid({ categories, showLabels: true });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"(disabled)\");\n });\n });\n\n describe(\"expert mode\", () => {\n it(\"should not handle expert mode toggle locally (handled globally)\", () => {\n // Expert mode toggle is now handled at wizard.tsx level via global useInput\n // CategoryGrid no longer has onToggleExpertMode prop\n const { lastFrame, unmount } = renderGrid();\n cleanup = unmount;\n\n const output = lastFrame();\n // Header should not show expert mode toggle hint\n expect(output).not.toContain(\"[e] Expert Mode\");\n });\n });\n\n describe(\"option ordering\", () => {\n it(\"should preserve original order regardless of state\", () => {\n // Options should never reorder based on recommended/discouraged/disabled state\n const { lastFrame, unmount } = renderGrid({ expertMode: false });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toBeDefined();\n });\n\n it(\"should preserve original order in expert mode\", () => {\n const { lastFrame, unmount } = renderGrid({ expertMode: true });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toBeDefined();\n });\n });\n\n describe(\"edge cases\", () => {\n it(\"should handle single category\", () => {\n const categories: CategoryRow[] = [\n createCategory(\"web-forms\", \"Single Category\", [createOption(\"web-test-opt1\", \"Option 1\")]),\n ];\n\n const { lastFrame, unmount } = renderGrid({ categories });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Single Category\");\n expect(output).toContain(\"Option 1\");\n });\n\n it(\"should handle single option in category\", () => {\n const categories: CategoryRow[] = [\n createCategory(\"web-forms\", \"Single\", [createOption(\"web-test-only\", \"Only Option\")]),\n ];\n\n const { lastFrame, unmount } = renderGrid({ categories });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Only Option\");\n });\n\n it(\"should handle category with many options (flows naturally)\", () => {\n const options = Array.from({ length: 10 }, (_, i) =>\n createOption(`web-test-opt${i}`, `Option ${i}`),\n );\n const categories: CategoryRow[] = [createCategory(\"web-mocking\", \"Many Options\", options)];\n\n const { lastFrame, unmount } = renderGrid({ categories });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Many Options\");\n // All options should be present (no fixed row limit)\n expect(output).toContain(\"Option 0\");\n expect(output).toContain(\"Option 9\");\n });\n\n it(\"should handle long option labels\", () => {\n const categories: CategoryRow[] = [\n createCategory(\"web-i18n\", \"Long Labels\", [\n createOption(\"web-test-long1\", \"Very Long Option Name\"),\n createOption(\"web-test-long2\", \"Another Long Name\"),\n ]),\n ];\n\n const { lastFrame, unmount } = renderGrid({ categories });\n cleanup = unmount;\n\n const output = lastFrame();\n // Labels should be rendered (flowing layout handles long labels)\n expect(output).toContain(\"Very Long Option Name\");\n });\n\n it(\"should handle categories with different option counts\", () => {\n const categories: CategoryRow[] = [\n createCategory(\"web-framework\", \"Category 1\", [\n createOption(\"web-test-opt1\", \"Option 1\"),\n createOption(\"web-test-opt2\", \"Option 2\"),\n ]),\n createCategory(\"web-styling\", \"Category 2\", [createOption(\"web-test-opt3\", \"Option 3\")]),\n createCategory(\"web-client-state\", \"Category 3\", [\n createOption(\"web-test-opt4\", \"Option 4\"),\n createOption(\"web-test-opt5\", \"Option 5\"),\n createOption(\"web-test-opt6\", \"Option 6\"),\n ]),\n ];\n\n const { lastFrame, unmount } = renderGrid({ categories });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Category 1\");\n expect(output).toContain(\"Category 2\");\n expect(output).toContain(\"Category 3\");\n });\n });\n\n describe(\"column adjustment\", () => {\n it(\"should adjust focusedCol when changing to row with fewer options\", async () => {\n const onFocusChange = vi.fn();\n const categories: CategoryRow[] = [\n createCategory(\n \"web-framework\",\n \"Framework\",\n [\n createOption(\"web-test-opt1\", \"Option 1\", { selected: true }), // Framework selected\n createOption(\"web-test-opt2\", \"Option 2\"),\n createOption(\"web-test-opt3\", \"Option 3\"),\n ],\n { required: true },\n ),\n createCategory(\"web-styling\", \"Category 2\", [createOption(\"web-test-opt4\", \"Option 4\")]),\n ];\n\n const { stdin, unmount } = renderGrid({\n categories,\n defaultFocusedRow: 0,\n defaultFocusedCol: 2, // Last option in first row\n onFocusChange,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(ARROW_DOWN);\n await delay(INPUT_DELAY_MS);\n\n // Should move to row 1, and col should be clamped to 0 (only option)\n expect(onFocusChange).toHaveBeenCalledWith(1, 0);\n });\n });\n\n describe(\"installed skills\", () => {\n it(\"should render installed skill with label only (no checkmark icon)\", () => {\n const categories: CategoryRow[] = [\n createCategory(\"web-forms\", \"Forms\", [\n createOption(\"web-test-opt1\", \"Option 1\", { installed: true }),\n ]),\n ];\n\n const { lastFrame, unmount } = renderGrid({ categories });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).not.toContain(\"✓\");\n expect(output).toContain(\"Option 1\");\n });\n\n it(\"should render installed and selected skill with label only\", () => {\n const categories: CategoryRow[] = [\n createCategory(\"web-forms\", \"Forms\", [\n createOption(\"web-test-opt1\", \"Option 1\", { installed: true, selected: true }),\n ]),\n ];\n\n const { lastFrame, unmount } = renderGrid({ categories });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).not.toContain(\"✓\");\n expect(output).toContain(\"Option 1\");\n });\n\n it(\"should render local installed skill without L badge or checkmark\", () => {\n const categories: CategoryRow[] = [\n createCategory(\"web-forms\", \"Forms\", [\n createOption(\"web-test-opt1\", \"Option 1\", { local: true, installed: true }),\n ]),\n ];\n\n const { lastFrame, unmount } = renderGrid({ categories });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).not.toContain(\"✓\");\n expect(output).toContain(\"Option 1\");\n });\n });\n\n describe(\"natural flow (no virtual scroll)\", () => {\n it(\"should render all categories without scroll indicators\", () => {\n const { lastFrame, unmount } = renderGrid();\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Framework\");\n expect(output).toContain(\"Styling\");\n expect(output).toContain(\"Client State\");\n expect(output).toContain(\"Server State\");\n expect(output).toContain(\"Analytics\");\n expect(output).not.toContain(\"more categories\");\n });\n\n it(\"should render all categories even with many entries\", () => {\n const manyCategories: CategoryRow[] = Array.from({ length: 8 }, (_, i) =>\n createCategory(`cat-${i}` as Subcategory, `Category ${i}`, [\n createOption(`web-test-opt${i}-a`, `Option ${i}A`),\n createOption(`web-test-opt${i}-b`, `Option ${i}B`),\n createOption(`web-test-opt${i}-c`, `Option ${i}C`),\n ]),\n );\n\n const { lastFrame, unmount } = renderGrid({\n categories: manyCategories,\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // All 8 categories should be rendered\n for (let i = 0; i < 8; i++) {\n expect(output).toContain(`Category ${i}`);\n }\n expect(output).not.toContain(\"more categories\");\n });\n\n it(\"should keep focused category visible when navigating down\", async () => {\n const onFocusChange = vi.fn();\n const manyCategories: CategoryRow[] = Array.from({ length: 6 }, (_, i) =>\n createCategory(`cat-${i}` as Subcategory, `Category ${i}`, [\n createOption(`web-test-opt${i}-a`, `Option ${i}A`),\n ]),\n );\n\n const { stdin, lastFrame, unmount } = renderGrid({\n categories: manyCategories,\n defaultFocusedRow: 0,\n onFocusChange,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n await stdin.write(ARROW_DOWN);\n await delay(INPUT_DELAY_MS);\n await stdin.write(ARROW_DOWN);\n await delay(INPUT_DELAY_MS);\n await stdin.write(ARROW_DOWN);\n await delay(INPUT_DELAY_MS);\n\n const output = lastFrame();\n expect(output).toContain(\"Category 3\");\n });\n });\n});\n"],"mappings":"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","names":[]}
|