@agents-inc/cli 0.42.1 → 0.46.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +52 -0
- package/README.md +128 -113
- package/assets/logo.png +0 -0
- package/assets/logo.svg +75 -0
- package/dist/{chunk-ZHJEZ7AU.js → chunk-3WKFSTG6.js} +2 -2
- package/dist/{chunk-IUYU2TP6.js → chunk-4C7PDDLY.js} +7 -7
- package/dist/{chunk-AQANPOLS.js → chunk-5M6JI76P.js} +2 -2
- package/dist/{chunk-UXNHU7Y7.js → chunk-5QRJUBK7.js} +133 -56
- package/dist/chunk-5QRJUBK7.js.map +1 -0
- package/dist/{chunk-33D24DAF.js → chunk-72GS6PIH.js} +10 -10
- package/dist/{chunk-PP7NDFFE.js → chunk-74HSA7C4.js} +10 -1
- package/dist/chunk-74HSA7C4.js.map +1 -0
- package/dist/chunk-7LDSHHKN.js +132 -0
- package/dist/chunk-7LDSHHKN.js.map +1 -0
- package/dist/{chunk-52SI5XJH.js → chunk-C7BO2ASM.js} +2 -7
- package/dist/chunk-C7BO2ASM.js.map +1 -0
- package/dist/{chunk-53K3URKF.js → chunk-CD64ZNYI.js} +5 -3
- package/dist/chunk-CD64ZNYI.js.map +1 -0
- package/dist/chunk-CDGHSTB6.js +69 -0
- package/dist/chunk-CDGHSTB6.js.map +1 -0
- package/dist/{chunk-FF4Z7MHY.js → chunk-CTQHZELA.js} +28 -20
- package/dist/chunk-CTQHZELA.js.map +1 -0
- package/dist/{chunk-44QCEK7E.js → chunk-D7JTL3DJ.js} +2 -2
- package/dist/{chunk-MMD26LKJ.js → chunk-DO5OZHSS.js} +2 -2
- package/dist/{chunk-ORJPGZVD.js → chunk-FKBCYT7B.js} +7 -7
- package/dist/chunk-FKBCYT7B.js.map +1 -0
- package/dist/{chunk-WMAALRQI.js → chunk-FUEZQ2H6.js} +5 -5
- package/dist/{chunk-WMAALRQI.js.map → chunk-FUEZQ2H6.js.map} +1 -1
- package/dist/{chunk-HMGWGWFT.js → chunk-G2WNOT3R.js} +2 -2
- package/dist/{chunk-BKW34TKI.js → chunk-GVLYNP2I.js} +4 -4
- package/dist/{chunk-VHGIQN5O.js → chunk-HM3DHMW7.js} +70 -24
- package/dist/chunk-HM3DHMW7.js.map +1 -0
- package/dist/{chunk-MI4NWOWD.js → chunk-I26YP2Q3.js} +5 -12
- package/dist/chunk-I26YP2Q3.js.map +1 -0
- package/dist/{chunk-FDY6SGSA.js → chunk-J64CA4V6.js} +5 -3
- package/dist/chunk-J64CA4V6.js.map +1 -0
- package/dist/{chunk-EFZN22TO.js → chunk-KWQ2BQXF.js} +3 -3
- package/dist/{chunk-ALWLM5MC.js → chunk-LFZXMQOH.js} +2 -2
- package/dist/{chunk-2TWELY5M.js → chunk-NMXNHRAK.js} +3 -3
- package/dist/{chunk-GCN7GGWE.js → chunk-ODQ2BKWU.js} +3 -3
- package/dist/{chunk-KA253GGY.js → chunk-PZLUO4OY.js} +4 -4
- package/dist/{chunk-X34RGEFX.js → chunk-QBUOZVNZ.js} +2 -2
- package/dist/{chunk-SYHRJG5G.js → chunk-RT6IBH37.js} +3498 -3592
- package/dist/chunk-RT6IBH37.js.map +1 -0
- package/dist/{chunk-YRVTXSXP.js → chunk-RWR56UVK.js} +3 -18
- package/dist/chunk-RWR56UVK.js.map +1 -0
- package/dist/{chunk-PEAPABFI.js → chunk-SGXUMZWL.js} +2 -2
- package/dist/{chunk-MHET2RG2.js → chunk-TOWP4T5L.js} +2 -2
- package/dist/{chunk-XRA4LHTJ.js → chunk-UK3AMBR7.js} +18 -14
- package/dist/chunk-UK3AMBR7.js.map +1 -0
- package/dist/{chunk-GIZ6DENW.js → chunk-VH3PI43B.js} +4 -4
- package/dist/{chunk-J73KIP6Z.js → chunk-XE6RTHUD.js} +66 -5
- package/dist/chunk-XE6RTHUD.js.map +1 -0
- package/dist/{chunk-EPJ2GJNJ.js → chunk-YT7UHV67.js} +10 -10
- package/dist/{chunk-UVVNWF43.js → chunk-YVMYQSED.js} +2 -2
- package/dist/commands/build/marketplace.js +12 -126
- package/dist/commands/build/marketplace.js.map +1 -1
- package/dist/commands/build/plugins.js +5 -5
- package/dist/commands/build/stack.js +5 -5
- package/dist/commands/compile.js +6 -6
- 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 +4 -4
- package/dist/commands/doctor.js +4 -4
- package/dist/commands/edit.js +33 -30
- package/dist/commands/edit.js.map +1 -1
- package/dist/commands/eject.js +54 -33
- package/dist/commands/eject.js.map +1 -1
- package/dist/commands/import/skill.js +5 -5
- package/dist/commands/info.js +5 -5
- package/dist/commands/init.js +33 -37
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/list.js +4 -4
- package/dist/commands/new/agent.js +52 -38
- package/dist/commands/new/agent.js.map +1 -1
- package/dist/commands/new/marketplace.js +252 -0
- package/dist/commands/new/marketplace.js.map +1 -0
- package/dist/commands/new/skill.js +30 -15
- package/dist/commands/new/skill.js.map +1 -1
- package/dist/commands/outdated.js +4 -4
- package/dist/commands/search.js +7 -7
- package/dist/commands/uninstall.js +6 -6
- package/dist/commands/update.js +6 -6
- package/dist/commands/validate.js +5 -5
- 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 +184 -98
- package/dist/components/wizard/category-grid.test.js.map +1 -1
- package/dist/components/wizard/checkbox-grid.js +3 -3
- package/dist/components/wizard/checkbox-grid.test.js +3 -3
- package/dist/components/wizard/domain-selection.js +9 -8
- package/dist/components/wizard/help-modal.js +2 -2
- package/dist/components/wizard/menu-item.js +1 -1
- package/dist/components/wizard/search-modal.js +2 -2
- package/dist/components/wizard/search-modal.test.js +2 -11
- package/dist/components/wizard/search-modal.test.js.map +1 -1
- package/dist/components/wizard/section-progress.js +2 -2
- package/dist/components/wizard/section-progress.test.js +2 -2
- package/dist/components/wizard/selection-card.js +2 -2
- package/dist/components/wizard/source-grid.js +3 -3
- package/dist/components/wizard/source-grid.test.js +5 -9
- package/dist/components/wizard/source-grid.test.js.map +1 -1
- package/dist/components/wizard/stack-selection.js +8 -9
- package/dist/components/wizard/step-agents.js +8 -7
- package/dist/components/wizard/step-agents.test.js +25 -20
- 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 +25 -40
- package/dist/components/wizard/step-build.test.js.map +1 -1
- package/dist/components/wizard/step-confirm.js +4 -4
- package/dist/components/wizard/step-confirm.test.js +8 -8
- 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 +11 -11
- package/dist/components/wizard/step-sources.test.js +14 -20
- 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 +32 -29
- 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 +26 -26
- package/dist/hooks/init.js +3 -5
- package/dist/hooks/init.js.map +1 -1
- package/dist/{source-manager-ABK5COKX.js → source-manager-6QZ2GDUA.js} +4 -4
- package/dist/stores/wizard-store.js +5 -5
- package/dist/stores/wizard-store.test.js +29 -49
- package/dist/stores/wizard-store.test.js.map +1 -1
- package/package.json +3 -1
- package/src/schemas/agent.schema.json +3 -0
- package/src/schemas/metadata.schema.json +4 -46
- package/src/schemas/project-config.schema.json +8 -4
- package/src/schemas/skills-matrix.schema.json +11 -298
- package/src/schemas/stacks.schema.json +2 -4
- package/dist/chunk-52SI5XJH.js.map +0 -1
- package/dist/chunk-53K3URKF.js.map +0 -1
- package/dist/chunk-FDY6SGSA.js.map +0 -1
- package/dist/chunk-FF4Z7MHY.js.map +0 -1
- package/dist/chunk-GVRZY5KI.js +0 -45
- package/dist/chunk-GVRZY5KI.js.map +0 -1
- package/dist/chunk-J73KIP6Z.js.map +0 -1
- package/dist/chunk-MI4NWOWD.js.map +0 -1
- package/dist/chunk-ORJPGZVD.js.map +0 -1
- package/dist/chunk-PP7NDFFE.js.map +0 -1
- package/dist/chunk-SYHRJG5G.js.map +0 -1
- package/dist/chunk-UXNHU7Y7.js.map +0 -1
- package/dist/chunk-VHGIQN5O.js.map +0 -1
- package/dist/chunk-XRA4LHTJ.js.map +0 -1
- package/dist/chunk-YRVTXSXP.js.map +0 -1
- package/dist/cli/defaults/agent-mappings.yaml +0 -215
- package/dist/commands/version/bump.js +0 -79
- package/dist/commands/version/bump.js.map +0 -1
- package/dist/commands/version/index.js +0 -54
- package/dist/commands/version/index.js.map +0 -1
- package/dist/commands/version/set.js +0 -86
- package/dist/commands/version/set.js.map +0 -1
- package/dist/commands/version/show.js +0 -54
- package/dist/commands/version/show.js.map +0 -1
- /package/dist/{chunk-ZHJEZ7AU.js.map → chunk-3WKFSTG6.js.map} +0 -0
- /package/dist/{chunk-IUYU2TP6.js.map → chunk-4C7PDDLY.js.map} +0 -0
- /package/dist/{chunk-AQANPOLS.js.map → chunk-5M6JI76P.js.map} +0 -0
- /package/dist/{chunk-33D24DAF.js.map → chunk-72GS6PIH.js.map} +0 -0
- /package/dist/{chunk-44QCEK7E.js.map → chunk-D7JTL3DJ.js.map} +0 -0
- /package/dist/{chunk-MMD26LKJ.js.map → chunk-DO5OZHSS.js.map} +0 -0
- /package/dist/{chunk-HMGWGWFT.js.map → chunk-G2WNOT3R.js.map} +0 -0
- /package/dist/{chunk-BKW34TKI.js.map → chunk-GVLYNP2I.js.map} +0 -0
- /package/dist/{chunk-EFZN22TO.js.map → chunk-KWQ2BQXF.js.map} +0 -0
- /package/dist/{chunk-ALWLM5MC.js.map → chunk-LFZXMQOH.js.map} +0 -0
- /package/dist/{chunk-2TWELY5M.js.map → chunk-NMXNHRAK.js.map} +0 -0
- /package/dist/{chunk-GCN7GGWE.js.map → chunk-ODQ2BKWU.js.map} +0 -0
- /package/dist/{chunk-KA253GGY.js.map → chunk-PZLUO4OY.js.map} +0 -0
- /package/dist/{chunk-X34RGEFX.js.map → chunk-QBUOZVNZ.js.map} +0 -0
- /package/dist/{chunk-PEAPABFI.js.map → chunk-SGXUMZWL.js.map} +0 -0
- /package/dist/{chunk-MHET2RG2.js.map → chunk-TOWP4T5L.js.map} +0 -0
- /package/dist/{chunk-GIZ6DENW.js.map → chunk-VH3PI43B.js.map} +0 -0
- /package/dist/{chunk-EPJ2GJNJ.js.map → chunk-YT7UHV67.js.map} +0 -0
- /package/dist/{chunk-UVVNWF43.js.map → chunk-YVMYQSED.js.map} +0 -0
- /package/dist/{source-manager-ABK5COKX.js.map → source-manager-6QZ2GDUA.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-CD64ZNYI.js";
|
|
25
25
|
import "../../chunk-GG4BSB6S.js";
|
|
26
|
-
import "../../chunk-
|
|
26
|
+
import "../../chunk-74HSA7C4.js";
|
|
27
27
|
import {
|
|
28
28
|
init_esm_shims
|
|
29
29
|
} from "../../chunk-DHET7RCE.js";
|
|
@@ -51,13 +51,13 @@ var defaultCategories = [
|
|
|
51
51
|
"web-framework",
|
|
52
52
|
"Framework",
|
|
53
53
|
[
|
|
54
|
-
createOption("web-
|
|
54
|
+
createOption("web-framework-react", "React", {
|
|
55
55
|
state: "recommended",
|
|
56
56
|
stateReason: "Popular choice"
|
|
57
57
|
}),
|
|
58
|
-
createOption("web-
|
|
59
|
-
createOption("web-
|
|
60
|
-
createOption("web-
|
|
58
|
+
createOption("web-framework-vue-composition-api", "Vue"),
|
|
59
|
+
createOption("web-framework-angular-standalone", "Angular"),
|
|
60
|
+
createOption("web-framework-solidjs", "SolidJS")
|
|
61
61
|
],
|
|
62
62
|
{ required: true }
|
|
63
63
|
),
|
|
@@ -65,43 +65,45 @@ var defaultCategories = [
|
|
|
65
65
|
"web-styling",
|
|
66
66
|
"Styling",
|
|
67
67
|
[
|
|
68
|
-
createOption("web-scss-
|
|
69
|
-
createOption("web-
|
|
70
|
-
createOption("web-
|
|
71
|
-
createOption("web-
|
|
68
|
+
createOption("web-styling-scss-modules", "SCSS Modules", { selected: true }),
|
|
69
|
+
createOption("web-styling-tailwind", "Tailwind", { state: "recommended" }),
|
|
70
|
+
createOption("web-styling-cva", "CVA"),
|
|
71
|
+
createOption("web-framework-nuxt", "Nuxt")
|
|
72
72
|
],
|
|
73
73
|
{ required: true }
|
|
74
74
|
),
|
|
75
75
|
createCategory("web-client-state", "Client State", [
|
|
76
|
-
createOption("web-
|
|
77
|
-
createOption("web-
|
|
78
|
-
createOption("web-
|
|
76
|
+
createOption("web-state-zustand", "Zustand", { state: "recommended" }),
|
|
77
|
+
createOption("web-state-jotai", "Jotai"),
|
|
78
|
+
createOption("web-state-redux-toolkit", "Redux", {
|
|
79
79
|
state: "discouraged",
|
|
80
80
|
stateReason: "Complex for most apps"
|
|
81
81
|
}),
|
|
82
|
-
createOption("web-
|
|
82
|
+
createOption("web-state-mobx", "MobX")
|
|
83
83
|
]),
|
|
84
84
|
createCategory("web-server-state", "Server State", [
|
|
85
|
-
createOption("web-react-query", "React Query", { selected: true }),
|
|
86
|
-
createOption("web-
|
|
87
|
-
createOption("web-
|
|
85
|
+
createOption("web-server-state-react-query", "React Query", { selected: true }),
|
|
86
|
+
createOption("web-data-fetching-swr", "SWR"),
|
|
87
|
+
createOption("web-data-fetching-graphql-apollo", "Apollo")
|
|
88
88
|
]),
|
|
89
|
-
createCategory("api-analytics", "Analytics", [
|
|
89
|
+
createCategory("api-analytics", "Analytics", [
|
|
90
|
+
createOption("api-analytics-posthog-analytics", "PostHog")
|
|
91
|
+
])
|
|
90
92
|
];
|
|
91
93
|
var categoriesWithFramework = [
|
|
92
94
|
createCategory(
|
|
93
95
|
"web-framework",
|
|
94
96
|
"Framework",
|
|
95
97
|
[
|
|
96
|
-
createOption("web-
|
|
98
|
+
createOption("web-framework-react", "React", {
|
|
97
99
|
state: "recommended",
|
|
98
100
|
stateReason: "Popular choice",
|
|
99
101
|
selected: true
|
|
100
102
|
// Framework selected
|
|
101
103
|
}),
|
|
102
|
-
createOption("web-
|
|
103
|
-
createOption("web-
|
|
104
|
-
createOption("web-
|
|
104
|
+
createOption("web-framework-vue-composition-api", "Vue"),
|
|
105
|
+
createOption("web-framework-angular-standalone", "Angular"),
|
|
106
|
+
createOption("web-framework-solidjs", "SolidJS")
|
|
105
107
|
],
|
|
106
108
|
{ required: true }
|
|
107
109
|
),
|
|
@@ -109,20 +111,76 @@ var categoriesWithFramework = [
|
|
|
109
111
|
"web-styling",
|
|
110
112
|
"Styling",
|
|
111
113
|
[
|
|
112
|
-
createOption("web-scss-
|
|
113
|
-
createOption("web-
|
|
114
|
-
createOption("web-
|
|
115
|
-
createOption("web-
|
|
114
|
+
createOption("web-styling-scss-modules", "SCSS Modules"),
|
|
115
|
+
createOption("web-styling-tailwind", "Tailwind", { state: "recommended" }),
|
|
116
|
+
createOption("web-styling-cva", "CVA"),
|
|
117
|
+
createOption("web-framework-nuxt", "Nuxt")
|
|
116
118
|
],
|
|
117
119
|
{ required: true }
|
|
118
120
|
),
|
|
119
121
|
createCategory("web-client-state", "Client State", [
|
|
120
|
-
createOption("web-
|
|
121
|
-
createOption("web-
|
|
122
|
-
createOption("web-
|
|
123
|
-
createOption("web-
|
|
122
|
+
createOption("web-state-zustand", "Zustand", { state: "recommended" }),
|
|
123
|
+
createOption("web-state-jotai", "Jotai"),
|
|
124
|
+
createOption("web-state-redux-toolkit", "Redux", { state: "discouraged" }),
|
|
125
|
+
createOption("web-state-mobx", "MobX")
|
|
124
126
|
])
|
|
125
127
|
];
|
|
128
|
+
var manyCategories = [
|
|
129
|
+
createCategory("web-framework", "Category 0", [
|
|
130
|
+
createOption("web-framework-react", "Option 0A"),
|
|
131
|
+
createOption("web-framework-vue-composition-api", "Option 0B"),
|
|
132
|
+
createOption("web-framework-angular-standalone", "Option 0C")
|
|
133
|
+
]),
|
|
134
|
+
createCategory("web-styling", "Category 1", [
|
|
135
|
+
createOption("web-styling-tailwind", "Option 1A"),
|
|
136
|
+
createOption("web-styling-scss-modules", "Option 1B"),
|
|
137
|
+
createOption("web-styling-cva", "Option 1C")
|
|
138
|
+
]),
|
|
139
|
+
createCategory("web-client-state", "Category 2", [
|
|
140
|
+
createOption("web-state-zustand", "Option 2A"),
|
|
141
|
+
createOption("web-state-jotai", "Option 2B"),
|
|
142
|
+
createOption("web-state-mobx", "Option 2C")
|
|
143
|
+
]),
|
|
144
|
+
createCategory("web-server-state", "Category 3", [
|
|
145
|
+
createOption("web-server-state-react-query", "Option 3A"),
|
|
146
|
+
createOption("web-data-fetching-swr", "Option 3B"),
|
|
147
|
+
createOption("web-data-fetching-graphql-apollo", "Option 3C")
|
|
148
|
+
]),
|
|
149
|
+
createCategory("web-forms", "Category 4", [
|
|
150
|
+
createOption("web-forms-react-hook-form", "Option 4A"),
|
|
151
|
+
createOption("web-forms-vee-validate", "Option 4B"),
|
|
152
|
+
createOption("web-forms-zod-validation", "Option 4C")
|
|
153
|
+
]),
|
|
154
|
+
createCategory("web-testing", "Category 5", [
|
|
155
|
+
createOption("web-testing-vitest", "Option 5A"),
|
|
156
|
+
createOption("web-testing-playwright-e2e", "Option 5B"),
|
|
157
|
+
createOption("web-testing-cypress-e2e", "Option 5C")
|
|
158
|
+
]),
|
|
159
|
+
createCategory("web-mocking", "Category 6", [
|
|
160
|
+
createOption("web-mocks-msw", "Option 6A"),
|
|
161
|
+
createOption("web-testing-react-testing-library", "Option 6B"),
|
|
162
|
+
createOption("web-testing-vue-test-utils", "Option 6C")
|
|
163
|
+
]),
|
|
164
|
+
createCategory("web-i18n", "Category 7", [
|
|
165
|
+
createOption("web-i18n-next-intl", "Option 7A"),
|
|
166
|
+
createOption("web-i18n-react-intl", "Option 7B"),
|
|
167
|
+
createOption("web-i18n-vue-i18n", "Option 7C")
|
|
168
|
+
])
|
|
169
|
+
];
|
|
170
|
+
var navCategories = [
|
|
171
|
+
createCategory("web-framework", "Category 0", [createOption("web-framework-react", "Option 0A")]),
|
|
172
|
+
createCategory("web-styling", "Category 1", [createOption("web-styling-tailwind", "Option 1A")]),
|
|
173
|
+
createCategory("web-client-state", "Category 2", [
|
|
174
|
+
createOption("web-state-zustand", "Option 2A")
|
|
175
|
+
]),
|
|
176
|
+
createCategory("web-server-state", "Category 3", [
|
|
177
|
+
createOption("web-server-state-react-query", "Option 3A")
|
|
178
|
+
]),
|
|
179
|
+
createCategory("web-forms", "Category 4", [
|
|
180
|
+
createOption("web-forms-react-hook-form", "Option 4A")
|
|
181
|
+
]),
|
|
182
|
+
createCategory("web-testing", "Category 5", [createOption("web-testing-vitest", "Option 5A")])
|
|
183
|
+
];
|
|
126
184
|
var defaultProps = {
|
|
127
185
|
categories: defaultCategories,
|
|
128
186
|
defaultFocusedRow: 0,
|
|
@@ -160,7 +218,7 @@ describe("CategoryGrid component", () => {
|
|
|
160
218
|
globalExpect(output).toContain("React");
|
|
161
219
|
globalExpect(output).toContain("Vue");
|
|
162
220
|
globalExpect(output).toContain("Angular");
|
|
163
|
-
globalExpect(output).toContain("
|
|
221
|
+
globalExpect(output).toContain("SolidJS");
|
|
164
222
|
globalExpect(output).toContain("SCSS Modules");
|
|
165
223
|
globalExpect(output).toContain("Tailwind");
|
|
166
224
|
});
|
|
@@ -219,8 +277,8 @@ describe("CategoryGrid component", () => {
|
|
|
219
277
|
it("should show disabled options with dimmed styling", () => {
|
|
220
278
|
const categories = [
|
|
221
279
|
createCategory("web-testing", "Test", [
|
|
222
|
-
createOption("web-
|
|
223
|
-
createOption("web-
|
|
280
|
+
createOption("web-forms-react-hook-form", "Option 1"),
|
|
281
|
+
createOption("web-forms-vee-validate", "Option 2", { state: "disabled" })
|
|
224
282
|
])
|
|
225
283
|
];
|
|
226
284
|
const { lastFrame, unmount } = renderGrid({ categories });
|
|
@@ -231,7 +289,7 @@ describe("CategoryGrid component", () => {
|
|
|
231
289
|
it("should render selected skills with label text", () => {
|
|
232
290
|
const categories = [
|
|
233
291
|
createCategory("web-forms", "Forms", [
|
|
234
|
-
createOption("web-
|
|
292
|
+
createOption("web-forms-react-hook-form", "Selected Skill", { selected: true })
|
|
235
293
|
])
|
|
236
294
|
];
|
|
237
295
|
const { lastFrame, unmount } = renderGrid({ categories });
|
|
@@ -242,7 +300,10 @@ describe("CategoryGrid component", () => {
|
|
|
242
300
|
it("should render unselected skills with label text", () => {
|
|
243
301
|
const categories = [
|
|
244
302
|
createCategory("web-forms", "Forms", [
|
|
245
|
-
createOption("web-
|
|
303
|
+
createOption("web-forms-react-hook-form", "Unselected Skill", {
|
|
304
|
+
state: "normal",
|
|
305
|
+
selected: false
|
|
306
|
+
})
|
|
246
307
|
])
|
|
247
308
|
];
|
|
248
309
|
const { lastFrame, unmount } = renderGrid({ categories });
|
|
@@ -253,7 +314,7 @@ describe("CategoryGrid component", () => {
|
|
|
253
314
|
it("should render disabled skills with label text", () => {
|
|
254
315
|
const categories = [
|
|
255
316
|
createCategory("web-forms", "Forms", [
|
|
256
|
-
createOption("web-
|
|
317
|
+
createOption("web-forms-react-hook-form", "Disabled Skill", { state: "disabled" })
|
|
257
318
|
])
|
|
258
319
|
];
|
|
259
320
|
const { lastFrame, unmount } = renderGrid({ categories });
|
|
@@ -261,10 +322,29 @@ describe("CategoryGrid component", () => {
|
|
|
261
322
|
const output = lastFrame();
|
|
262
323
|
globalExpect(output).toContain("Disabled Skill");
|
|
263
324
|
});
|
|
325
|
+
it("should render disabled+selected skills with label text", () => {
|
|
326
|
+
const categories = [
|
|
327
|
+
createCategory("web-forms", "Forms", [
|
|
328
|
+
createOption("web-forms-react-hook-form", "Disabled Selected", {
|
|
329
|
+
state: "disabled",
|
|
330
|
+
selected: true
|
|
331
|
+
}),
|
|
332
|
+
createOption("web-forms-vee-validate", "Disabled Only", {
|
|
333
|
+
state: "disabled",
|
|
334
|
+
selected: false
|
|
335
|
+
})
|
|
336
|
+
])
|
|
337
|
+
];
|
|
338
|
+
const { lastFrame, unmount } = renderGrid({ categories });
|
|
339
|
+
cleanup = unmount;
|
|
340
|
+
const output = lastFrame();
|
|
341
|
+
globalExpect(output).toContain("Disabled Selected");
|
|
342
|
+
globalExpect(output).toContain("Disabled Only");
|
|
343
|
+
});
|
|
264
344
|
it("should render discouraged skills with label text", () => {
|
|
265
345
|
const categories = [
|
|
266
346
|
createCategory("web-forms", "Forms", [
|
|
267
|
-
createOption("web-
|
|
347
|
+
createOption("web-forms-react-hook-form", "Discouraged Skill", { state: "discouraged" })
|
|
268
348
|
])
|
|
269
349
|
];
|
|
270
350
|
const { lastFrame, unmount } = renderGrid({ categories });
|
|
@@ -275,8 +355,8 @@ describe("CategoryGrid component", () => {
|
|
|
275
355
|
it("should render both selected and unselected skills with labels", () => {
|
|
276
356
|
const categories = [
|
|
277
357
|
createCategory("web-forms", "Forms", [
|
|
278
|
-
createOption("web-
|
|
279
|
-
createOption("web-
|
|
358
|
+
createOption("web-forms-react-hook-form", "Active", { selected: true }),
|
|
359
|
+
createOption("web-forms-vee-validate", "Inactive", { selected: false })
|
|
280
360
|
])
|
|
281
361
|
];
|
|
282
362
|
const { lastFrame, unmount } = renderGrid({ categories, expertMode: true });
|
|
@@ -288,7 +368,7 @@ describe("CategoryGrid component", () => {
|
|
|
288
368
|
it("should render skill label regardless of selection state", () => {
|
|
289
369
|
const categories1 = [
|
|
290
370
|
createCategory("web-forms", "Forms", [
|
|
291
|
-
createOption("web-
|
|
371
|
+
createOption("web-forms-react-hook-form", "Toggle Skill", { selected: false })
|
|
292
372
|
])
|
|
293
373
|
];
|
|
294
374
|
const { lastFrame: frame1, unmount: unmount1 } = renderGrid({ categories: categories1 });
|
|
@@ -296,7 +376,7 @@ describe("CategoryGrid component", () => {
|
|
|
296
376
|
unmount1();
|
|
297
377
|
const categories2 = [
|
|
298
378
|
createCategory("web-forms", "Forms", [
|
|
299
|
-
createOption("web-
|
|
379
|
+
createOption("web-forms-react-hook-form", "Toggle Skill", { selected: true })
|
|
300
380
|
])
|
|
301
381
|
];
|
|
302
382
|
const { lastFrame: frame2, unmount: unmount2 } = renderGrid({ categories: categories2 });
|
|
@@ -328,10 +408,10 @@ describe("CategoryGrid component", () => {
|
|
|
328
408
|
it("should not lock any sections when no framework category exists", () => {
|
|
329
409
|
const categoriesNoFramework = [
|
|
330
410
|
createCategory("web-styling", "Styling", [
|
|
331
|
-
createOption("web-
|
|
332
|
-
createOption("web-
|
|
411
|
+
createOption("web-styling-scss-modules", "SCSS"),
|
|
412
|
+
createOption("web-styling-tailwind", "Tailwind")
|
|
333
413
|
]),
|
|
334
|
-
createCategory("web-client-state", "State", [createOption("web-
|
|
414
|
+
createCategory("web-client-state", "State", [createOption("web-state-zustand", "Zustand")])
|
|
335
415
|
];
|
|
336
416
|
const { lastFrame, unmount } = renderGrid({
|
|
337
417
|
categories: categoriesNoFramework
|
|
@@ -546,7 +626,7 @@ describe("CategoryGrid component", () => {
|
|
|
546
626
|
await delay(RENDER_DELAY_MS);
|
|
547
627
|
await stdin.write(" ");
|
|
548
628
|
await delay(INPUT_DELAY_MS);
|
|
549
|
-
globalExpect(onToggle).toHaveBeenCalledWith("web-framework", "web-
|
|
629
|
+
globalExpect(onToggle).toHaveBeenCalledWith("web-framework", "web-framework-vue-composition-api");
|
|
550
630
|
});
|
|
551
631
|
it("should call onToggle when pressing space on a selected option", async () => {
|
|
552
632
|
const onToggle = vi.fn();
|
|
@@ -555,8 +635,8 @@ describe("CategoryGrid component", () => {
|
|
|
555
635
|
"web-framework",
|
|
556
636
|
"Framework",
|
|
557
637
|
[
|
|
558
|
-
createOption("web-
|
|
559
|
-
createOption("web-
|
|
638
|
+
createOption("web-framework-react", "React", { selected: true }),
|
|
639
|
+
createOption("web-framework-vue-composition-api", "Vue")
|
|
560
640
|
],
|
|
561
641
|
{ required: true }
|
|
562
642
|
)
|
|
@@ -573,14 +653,14 @@ describe("CategoryGrid component", () => {
|
|
|
573
653
|
await delay(RENDER_DELAY_MS);
|
|
574
654
|
await stdin.write(" ");
|
|
575
655
|
await delay(INPUT_DELAY_MS);
|
|
576
|
-
globalExpect(onToggle).toHaveBeenCalledWith("web-framework", "web-
|
|
656
|
+
globalExpect(onToggle).toHaveBeenCalledWith("web-framework", "web-framework-react");
|
|
577
657
|
});
|
|
578
658
|
it("should NOT call onToggle when all options in a category are disabled", async () => {
|
|
579
659
|
const onToggle = vi.fn();
|
|
580
660
|
const categories = [
|
|
581
661
|
createCategory("web-testing", "Test", [
|
|
582
|
-
createOption("web-
|
|
583
|
-
createOption("web-
|
|
662
|
+
createOption("web-forms-react-hook-form", "Option 1", { state: "disabled" }),
|
|
663
|
+
createOption("web-forms-vee-validate", "Option 2", { state: "disabled" })
|
|
584
664
|
])
|
|
585
665
|
];
|
|
586
666
|
const { stdin, unmount } = renderGrid({
|
|
@@ -614,9 +694,9 @@ describe("CategoryGrid component", () => {
|
|
|
614
694
|
const onFocusChange = vi.fn();
|
|
615
695
|
const categories = [
|
|
616
696
|
createCategory("web-testing", "Test", [
|
|
617
|
-
createOption("web-
|
|
618
|
-
createOption("web-
|
|
619
|
-
createOption("web-
|
|
697
|
+
createOption("web-forms-react-hook-form", "Option 1"),
|
|
698
|
+
createOption("web-forms-vee-validate", "Option 2", { state: "disabled" }),
|
|
699
|
+
createOption("web-forms-zod-validation", "Option 3")
|
|
620
700
|
])
|
|
621
701
|
];
|
|
622
702
|
const { stdin, unmount } = renderGrid({
|
|
@@ -636,9 +716,9 @@ describe("CategoryGrid component", () => {
|
|
|
636
716
|
const onFocusChange = vi.fn();
|
|
637
717
|
const categories = [
|
|
638
718
|
createCategory("web-testing", "Test", [
|
|
639
|
-
createOption("web-
|
|
640
|
-
createOption("web-
|
|
641
|
-
createOption("web-
|
|
719
|
+
createOption("web-forms-react-hook-form", "Option 1"),
|
|
720
|
+
createOption("web-forms-vee-validate", "Option 2", { state: "disabled" }),
|
|
721
|
+
createOption("web-forms-zod-validation", "Option 3")
|
|
642
722
|
])
|
|
643
723
|
];
|
|
644
724
|
const { stdin, unmount } = renderGrid({
|
|
@@ -659,8 +739,8 @@ describe("CategoryGrid component", () => {
|
|
|
659
739
|
const onFocusChange = vi.fn();
|
|
660
740
|
const categories = [
|
|
661
741
|
createCategory("web-testing", "Test", [
|
|
662
|
-
createOption("web-
|
|
663
|
-
createOption("web-
|
|
742
|
+
createOption("web-forms-react-hook-form", "Option 1", { state: "disabled" }),
|
|
743
|
+
createOption("web-forms-vee-validate", "Option 2", { state: "disabled" })
|
|
664
744
|
])
|
|
665
745
|
];
|
|
666
746
|
const { stdin, unmount } = renderGrid({
|
|
@@ -759,8 +839,8 @@ describe("CategoryGrid component", () => {
|
|
|
759
839
|
it("should show Disabled label for disabled options when showLabels is true", () => {
|
|
760
840
|
const categories = [
|
|
761
841
|
createCategory("web-testing", "Test", [
|
|
762
|
-
createOption("web-
|
|
763
|
-
createOption("web-
|
|
842
|
+
createOption("web-forms-react-hook-form", "Option 1"),
|
|
843
|
+
createOption("web-forms-vee-validate", "Option 2", { state: "disabled" })
|
|
764
844
|
])
|
|
765
845
|
];
|
|
766
846
|
const { lastFrame, unmount } = renderGrid({ categories, showLabels: true });
|
|
@@ -794,7 +874,9 @@ describe("CategoryGrid component", () => {
|
|
|
794
874
|
describe("edge cases", () => {
|
|
795
875
|
it("should handle single category", () => {
|
|
796
876
|
const categories = [
|
|
797
|
-
createCategory("web-forms", "Single Category", [
|
|
877
|
+
createCategory("web-forms", "Single Category", [
|
|
878
|
+
createOption("web-forms-react-hook-form", "Option 1")
|
|
879
|
+
])
|
|
798
880
|
];
|
|
799
881
|
const { lastFrame, unmount } = renderGrid({ categories });
|
|
800
882
|
cleanup = unmount;
|
|
@@ -804,7 +886,9 @@ describe("CategoryGrid component", () => {
|
|
|
804
886
|
});
|
|
805
887
|
it("should handle single option in category", () => {
|
|
806
888
|
const categories = [
|
|
807
|
-
createCategory("web-forms", "Single", [
|
|
889
|
+
createCategory("web-forms", "Single", [
|
|
890
|
+
createOption("web-forms-react-hook-form", "Only Option")
|
|
891
|
+
])
|
|
808
892
|
];
|
|
809
893
|
const { lastFrame, unmount } = renderGrid({ categories });
|
|
810
894
|
cleanup = unmount;
|
|
@@ -812,10 +896,19 @@ describe("CategoryGrid component", () => {
|
|
|
812
896
|
globalExpect(output).toContain("Only Option");
|
|
813
897
|
});
|
|
814
898
|
it("should handle category with many options (flows naturally)", () => {
|
|
815
|
-
const
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
899
|
+
const manySkillIds = [
|
|
900
|
+
"web-framework-react",
|
|
901
|
+
"web-framework-vue-composition-api",
|
|
902
|
+
"web-framework-angular-standalone",
|
|
903
|
+
"web-framework-solidjs",
|
|
904
|
+
"web-framework-nuxt",
|
|
905
|
+
"web-framework-remix",
|
|
906
|
+
"web-framework-nextjs-app-router",
|
|
907
|
+
"web-framework-nextjs-server-actions",
|
|
908
|
+
"web-styling-tailwind",
|
|
909
|
+
"web-styling-scss-modules"
|
|
910
|
+
];
|
|
911
|
+
const options = manySkillIds.map((id, i) => createOption(id, `Option ${i}`));
|
|
819
912
|
const categories = [createCategory("web-mocking", "Many Options", options)];
|
|
820
913
|
const { lastFrame, unmount } = renderGrid({ categories });
|
|
821
914
|
cleanup = unmount;
|
|
@@ -827,8 +920,8 @@ describe("CategoryGrid component", () => {
|
|
|
827
920
|
it("should handle long option labels", () => {
|
|
828
921
|
const categories = [
|
|
829
922
|
createCategory("web-i18n", "Long Labels", [
|
|
830
|
-
createOption("web-
|
|
831
|
-
createOption("web-
|
|
923
|
+
createOption("web-i18n-next-intl", "Very Long Option Name"),
|
|
924
|
+
createOption("web-i18n-react-intl", "Another Long Name")
|
|
832
925
|
])
|
|
833
926
|
];
|
|
834
927
|
const { lastFrame, unmount } = renderGrid({ categories });
|
|
@@ -839,14 +932,16 @@ describe("CategoryGrid component", () => {
|
|
|
839
932
|
it("should handle categories with different option counts", () => {
|
|
840
933
|
const categories = [
|
|
841
934
|
createCategory("web-framework", "Category 1", [
|
|
842
|
-
createOption("web-
|
|
843
|
-
createOption("web-
|
|
935
|
+
createOption("web-forms-react-hook-form", "Option 1"),
|
|
936
|
+
createOption("web-forms-vee-validate", "Option 2")
|
|
937
|
+
]),
|
|
938
|
+
createCategory("web-styling", "Category 2", [
|
|
939
|
+
createOption("web-forms-zod-validation", "Option 3")
|
|
844
940
|
]),
|
|
845
|
-
createCategory("web-styling", "Category 2", [createOption("web-test-opt3", "Option 3")]),
|
|
846
941
|
createCategory("web-client-state", "Category 3", [
|
|
847
|
-
createOption("web-
|
|
848
|
-
createOption("web-
|
|
849
|
-
createOption("web-
|
|
942
|
+
createOption("web-testing-vitest", "Option 4"),
|
|
943
|
+
createOption("web-testing-playwright-e2e", "Option 5"),
|
|
944
|
+
createOption("web-testing-react-testing-library", "Option 6")
|
|
850
945
|
])
|
|
851
946
|
];
|
|
852
947
|
const { lastFrame, unmount } = renderGrid({ categories });
|
|
@@ -865,14 +960,16 @@ describe("CategoryGrid component", () => {
|
|
|
865
960
|
"web-framework",
|
|
866
961
|
"Framework",
|
|
867
962
|
[
|
|
868
|
-
createOption("web-
|
|
963
|
+
createOption("web-forms-react-hook-form", "Option 1", { selected: true }),
|
|
869
964
|
// Framework selected
|
|
870
|
-
createOption("web-
|
|
871
|
-
createOption("web-
|
|
965
|
+
createOption("web-forms-vee-validate", "Option 2"),
|
|
966
|
+
createOption("web-forms-zod-validation", "Option 3")
|
|
872
967
|
],
|
|
873
968
|
{ required: true }
|
|
874
969
|
),
|
|
875
|
-
createCategory("web-styling", "Category 2", [
|
|
970
|
+
createCategory("web-styling", "Category 2", [
|
|
971
|
+
createOption("web-testing-vitest", "Option 4")
|
|
972
|
+
])
|
|
876
973
|
];
|
|
877
974
|
const { stdin, unmount } = renderGrid({
|
|
878
975
|
categories,
|
|
@@ -892,7 +989,7 @@ describe("CategoryGrid component", () => {
|
|
|
892
989
|
it("should render installed skill with label only (no checkmark icon)", () => {
|
|
893
990
|
const categories = [
|
|
894
991
|
createCategory("web-forms", "Forms", [
|
|
895
|
-
createOption("web-
|
|
992
|
+
createOption("web-forms-react-hook-form", "Option 1", { installed: true })
|
|
896
993
|
])
|
|
897
994
|
];
|
|
898
995
|
const { lastFrame, unmount } = renderGrid({ categories });
|
|
@@ -904,7 +1001,10 @@ describe("CategoryGrid component", () => {
|
|
|
904
1001
|
it("should render installed and selected skill with label only", () => {
|
|
905
1002
|
const categories = [
|
|
906
1003
|
createCategory("web-forms", "Forms", [
|
|
907
|
-
createOption("web-
|
|
1004
|
+
createOption("web-forms-react-hook-form", "Option 1", {
|
|
1005
|
+
installed: true,
|
|
1006
|
+
selected: true
|
|
1007
|
+
})
|
|
908
1008
|
])
|
|
909
1009
|
];
|
|
910
1010
|
const { lastFrame, unmount } = renderGrid({ categories });
|
|
@@ -916,7 +1016,7 @@ describe("CategoryGrid component", () => {
|
|
|
916
1016
|
it("should render local installed skill without L badge or checkmark", () => {
|
|
917
1017
|
const categories = [
|
|
918
1018
|
createCategory("web-forms", "Forms", [
|
|
919
|
-
createOption("web-
|
|
1019
|
+
createOption("web-forms-react-hook-form", "Option 1", { local: true, installed: true })
|
|
920
1020
|
])
|
|
921
1021
|
];
|
|
922
1022
|
const { lastFrame, unmount } = renderGrid({ categories });
|
|
@@ -939,34 +1039,20 @@ describe("CategoryGrid component", () => {
|
|
|
939
1039
|
globalExpect(output).not.toContain("more categories");
|
|
940
1040
|
});
|
|
941
1041
|
it("should render all categories even with many entries", () => {
|
|
942
|
-
const manyCategories = Array.from(
|
|
943
|
-
{ length: 8 },
|
|
944
|
-
(_, i) => createCategory(`cat-${i}`, `Category ${i}`, [
|
|
945
|
-
createOption(`web-test-opt${i}-a`, `Option ${i}A`),
|
|
946
|
-
createOption(`web-test-opt${i}-b`, `Option ${i}B`),
|
|
947
|
-
createOption(`web-test-opt${i}-c`, `Option ${i}C`)
|
|
948
|
-
])
|
|
949
|
-
);
|
|
950
1042
|
const { lastFrame, unmount } = renderGrid({
|
|
951
1043
|
categories: manyCategories
|
|
952
1044
|
});
|
|
953
1045
|
cleanup = unmount;
|
|
954
1046
|
const output = lastFrame();
|
|
955
|
-
for (
|
|
956
|
-
globalExpect(output).toContain(
|
|
1047
|
+
for (const category of manyCategories) {
|
|
1048
|
+
globalExpect(output).toContain(category.displayName);
|
|
957
1049
|
}
|
|
958
1050
|
globalExpect(output).not.toContain("more categories");
|
|
959
1051
|
});
|
|
960
1052
|
it("should keep focused category visible when navigating down", async () => {
|
|
961
1053
|
const onFocusChange = vi.fn();
|
|
962
|
-
const manyCategories = Array.from(
|
|
963
|
-
{ length: 6 },
|
|
964
|
-
(_, i) => createCategory(`cat-${i}`, `Category ${i}`, [
|
|
965
|
-
createOption(`web-test-opt${i}-a`, `Option ${i}A`)
|
|
966
|
-
])
|
|
967
|
-
);
|
|
968
1054
|
const { stdin, lastFrame, unmount } = renderGrid({
|
|
969
|
-
categories:
|
|
1055
|
+
categories: navCategories,
|
|
970
1056
|
defaultFocusedRow: 0,
|
|
971
1057
|
onFocusChange
|
|
972
1058
|
});
|