@agents-inc/cli 0.42.0 → 0.45.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (166) hide show
  1. package/CHANGELOG.md +38 -0
  2. package/README.md +128 -113
  3. package/assets/logo.png +0 -0
  4. package/assets/logo.svg +75 -0
  5. package/config/stacks.yaml +0 -321
  6. package/dist/{chunk-J73KIP6Z.js → chunk-3JRWNWBF.js} +66 -4
  7. package/dist/chunk-3JRWNWBF.js.map +1 -0
  8. package/dist/{chunk-MHET2RG2.js → chunk-3S4GIO4B.js} +2 -2
  9. package/dist/{chunk-UXNHU7Y7.js → chunk-473YHDYQ.js} +3 -12
  10. package/dist/chunk-473YHDYQ.js.map +1 -0
  11. package/dist/{chunk-GVRZY5KI.js → chunk-5BDYODWP.js} +3 -3
  12. package/dist/{chunk-53K3URKF.js → chunk-ABE55TEU.js} +5 -3
  13. package/dist/chunk-ABE55TEU.js.map +1 -0
  14. package/dist/{chunk-2TWELY5M.js → chunk-ARET3NYO.js} +3 -3
  15. package/dist/{chunk-X34RGEFX.js → chunk-CLHBKFHU.js} +2 -2
  16. package/dist/{chunk-ORJPGZVD.js → chunk-DAVOSI4M.js} +7 -7
  17. package/dist/chunk-DAVOSI4M.js.map +1 -0
  18. package/dist/{chunk-IUYU2TP6.js → chunk-ELRGSZHZ.js} +7 -7
  19. package/dist/{chunk-MI4NWOWD.js → chunk-ENWMWIHP.js} +7 -7
  20. package/dist/{chunk-52SI5XJH.js → chunk-F3O5YHSI.js} +2 -7
  21. package/dist/chunk-F3O5YHSI.js.map +1 -0
  22. package/dist/{chunk-PP7NDFFE.js → chunk-FVN5PFFY.js} +8 -1
  23. package/dist/{chunk-PP7NDFFE.js.map → chunk-FVN5PFFY.js.map} +1 -1
  24. package/dist/{chunk-XRA4LHTJ.js → chunk-FYNMNY4P.js} +6 -8
  25. package/dist/chunk-FYNMNY4P.js.map +1 -0
  26. package/dist/{chunk-GCN7GGWE.js → chunk-GUIRWCKI.js} +3 -3
  27. package/dist/{chunk-AQANPOLS.js → chunk-HKRLWERR.js} +2 -2
  28. package/dist/{chunk-EPJ2GJNJ.js → chunk-KCYNTAAF.js} +9 -9
  29. package/dist/{chunk-33D24DAF.js → chunk-KVHLKPYB.js} +10 -10
  30. package/dist/{chunk-MMD26LKJ.js → chunk-KWWLPPHF.js} +2 -2
  31. package/dist/{chunk-FDY6SGSA.js → chunk-KZNPPUQG.js} +2 -2
  32. package/dist/{chunk-GIZ6DENW.js → chunk-M2XPTQDT.js} +4 -4
  33. package/dist/{chunk-BKW34TKI.js → chunk-M3AGB4TR.js} +3 -3
  34. package/dist/{chunk-ZHJEZ7AU.js → chunk-NTPHCNJO.js} +2 -2
  35. package/dist/{chunk-44QCEK7E.js → chunk-OALQWRLG.js} +2 -2
  36. package/dist/{chunk-PEAPABFI.js → chunk-OLZBZAW4.js} +2 -2
  37. package/dist/{chunk-FF4Z7MHY.js → chunk-Q5BSIARS.js} +26 -18
  38. package/dist/chunk-Q5BSIARS.js.map +1 -0
  39. package/dist/{chunk-UVVNWF43.js → chunk-SBWMSNS2.js} +2 -2
  40. package/dist/{chunk-ALWLM5MC.js → chunk-SRFNNOLC.js} +2 -2
  41. package/dist/{chunk-KA253GGY.js → chunk-SYGEV3KV.js} +4 -4
  42. package/dist/{chunk-HMGWGWFT.js → chunk-V43QDMYQ.js} +2 -2
  43. package/dist/{chunk-WMAALRQI.js → chunk-VTDEENSP.js} +4 -4
  44. package/dist/{chunk-VHGIQN5O.js → chunk-WWSKP5SR.js} +4 -4
  45. package/dist/{chunk-EFZN22TO.js → chunk-YQFU2KZ5.js} +3 -3
  46. package/dist/{chunk-SYHRJG5G.js → chunk-ZECXM7LP.js} +162 -278
  47. package/dist/chunk-ZECXM7LP.js.map +1 -0
  48. package/dist/commands/build/marketplace.js +3 -3
  49. package/dist/commands/build/plugins.js +5 -5
  50. package/dist/commands/build/stack.js +5 -5
  51. package/dist/commands/compile.js +6 -6
  52. package/dist/commands/config/get.js +4 -4
  53. package/dist/commands/config/index.js +5 -5
  54. package/dist/commands/config/path.js +4 -4
  55. package/dist/commands/config/set-project.js +4 -4
  56. package/dist/commands/config/show.js +5 -5
  57. package/dist/commands/config/unset-project.js +4 -4
  58. package/dist/commands/diff.js +4 -4
  59. package/dist/commands/doctor.js +4 -4
  60. package/dist/commands/edit.js +33 -30
  61. package/dist/commands/edit.js.map +1 -1
  62. package/dist/commands/eject.js +39 -14
  63. package/dist/commands/eject.js.map +1 -1
  64. package/dist/commands/import/skill.js +5 -5
  65. package/dist/commands/info.js +5 -5
  66. package/dist/commands/init.js +31 -36
  67. package/dist/commands/init.js.map +1 -1
  68. package/dist/commands/list.js +4 -4
  69. package/dist/commands/new/agent.js +5 -5
  70. package/dist/commands/new/skill.js +4 -5
  71. package/dist/commands/new/skill.js.map +1 -1
  72. package/dist/commands/outdated.js +4 -4
  73. package/dist/commands/search.js +7 -7
  74. package/dist/commands/uninstall.js +6 -6
  75. package/dist/commands/update.js +6 -6
  76. package/dist/commands/validate.js +5 -5
  77. package/dist/components/skill-search/skill-search.js +3 -3
  78. package/dist/components/wizard/category-grid.js +2 -2
  79. package/dist/components/wizard/category-grid.test.js +184 -98
  80. package/dist/components/wizard/category-grid.test.js.map +1 -1
  81. package/dist/components/wizard/checkbox-grid.js +3 -3
  82. package/dist/components/wizard/checkbox-grid.test.js +3 -3
  83. package/dist/components/wizard/domain-selection.js +8 -8
  84. package/dist/components/wizard/help-modal.js +2 -2
  85. package/dist/components/wizard/menu-item.js +1 -1
  86. package/dist/components/wizard/search-modal.js +2 -2
  87. package/dist/components/wizard/search-modal.test.js +2 -11
  88. package/dist/components/wizard/search-modal.test.js.map +1 -1
  89. package/dist/components/wizard/section-progress.js +2 -2
  90. package/dist/components/wizard/section-progress.test.js +2 -2
  91. package/dist/components/wizard/selection-card.js +2 -2
  92. package/dist/components/wizard/source-grid.js +3 -3
  93. package/dist/components/wizard/source-grid.test.js +5 -9
  94. package/dist/components/wizard/source-grid.test.js.map +1 -1
  95. package/dist/components/wizard/stack-selection.js +8 -8
  96. package/dist/components/wizard/step-agents.js +7 -7
  97. package/dist/components/wizard/step-agents.test.js +7 -7
  98. package/dist/components/wizard/step-build.js +8 -8
  99. package/dist/components/wizard/step-build.test.js +25 -40
  100. package/dist/components/wizard/step-build.test.js.map +1 -1
  101. package/dist/components/wizard/step-confirm.js +3 -3
  102. package/dist/components/wizard/step-confirm.test.js +7 -7
  103. package/dist/components/wizard/step-refine.js +2 -2
  104. package/dist/components/wizard/step-refine.test.js +2 -2
  105. package/dist/components/wizard/step-settings.js +5 -5
  106. package/dist/components/wizard/step-settings.test.js +8 -8
  107. package/dist/components/wizard/step-sources.js +11 -11
  108. package/dist/components/wizard/step-sources.test.js +14 -20
  109. package/dist/components/wizard/step-sources.test.js.map +1 -1
  110. package/dist/components/wizard/step-stack.js +11 -11
  111. package/dist/components/wizard/step-stack.test.js +17 -26
  112. package/dist/components/wizard/step-stack.test.js.map +1 -1
  113. package/dist/components/wizard/view-title.js +2 -2
  114. package/dist/components/wizard/wizard-layout.js +8 -8
  115. package/dist/components/wizard/wizard-tabs.js +2 -2
  116. package/dist/components/wizard/wizard-tabs.test.js +2 -2
  117. package/dist/components/wizard/wizard.js +26 -26
  118. package/dist/config/stacks.yaml +0 -321
  119. package/dist/hooks/init.js +3 -3
  120. package/dist/{source-manager-ABK5COKX.js → source-manager-HXFXBZJU.js} +4 -4
  121. package/dist/stores/wizard-store.js +5 -5
  122. package/dist/stores/wizard-store.test.js +29 -49
  123. package/dist/stores/wizard-store.test.js.map +1 -1
  124. package/package.json +3 -1
  125. package/src/schemas/metadata.schema.json +0 -5
  126. package/dist/chunk-52SI5XJH.js.map +0 -1
  127. package/dist/chunk-53K3URKF.js.map +0 -1
  128. package/dist/chunk-FF4Z7MHY.js.map +0 -1
  129. package/dist/chunk-J73KIP6Z.js.map +0 -1
  130. package/dist/chunk-ORJPGZVD.js.map +0 -1
  131. package/dist/chunk-SYHRJG5G.js.map +0 -1
  132. package/dist/chunk-UXNHU7Y7.js.map +0 -1
  133. package/dist/chunk-XRA4LHTJ.js.map +0 -1
  134. package/dist/commands/version/bump.js +0 -79
  135. package/dist/commands/version/bump.js.map +0 -1
  136. package/dist/commands/version/index.js +0 -54
  137. package/dist/commands/version/index.js.map +0 -1
  138. package/dist/commands/version/set.js +0 -86
  139. package/dist/commands/version/set.js.map +0 -1
  140. package/dist/commands/version/show.js +0 -54
  141. package/dist/commands/version/show.js.map +0 -1
  142. /package/dist/{chunk-MHET2RG2.js.map → chunk-3S4GIO4B.js.map} +0 -0
  143. /package/dist/{chunk-GVRZY5KI.js.map → chunk-5BDYODWP.js.map} +0 -0
  144. /package/dist/{chunk-2TWELY5M.js.map → chunk-ARET3NYO.js.map} +0 -0
  145. /package/dist/{chunk-X34RGEFX.js.map → chunk-CLHBKFHU.js.map} +0 -0
  146. /package/dist/{chunk-IUYU2TP6.js.map → chunk-ELRGSZHZ.js.map} +0 -0
  147. /package/dist/{chunk-MI4NWOWD.js.map → chunk-ENWMWIHP.js.map} +0 -0
  148. /package/dist/{chunk-GCN7GGWE.js.map → chunk-GUIRWCKI.js.map} +0 -0
  149. /package/dist/{chunk-AQANPOLS.js.map → chunk-HKRLWERR.js.map} +0 -0
  150. /package/dist/{chunk-EPJ2GJNJ.js.map → chunk-KCYNTAAF.js.map} +0 -0
  151. /package/dist/{chunk-33D24DAF.js.map → chunk-KVHLKPYB.js.map} +0 -0
  152. /package/dist/{chunk-MMD26LKJ.js.map → chunk-KWWLPPHF.js.map} +0 -0
  153. /package/dist/{chunk-FDY6SGSA.js.map → chunk-KZNPPUQG.js.map} +0 -0
  154. /package/dist/{chunk-GIZ6DENW.js.map → chunk-M2XPTQDT.js.map} +0 -0
  155. /package/dist/{chunk-BKW34TKI.js.map → chunk-M3AGB4TR.js.map} +0 -0
  156. /package/dist/{chunk-ZHJEZ7AU.js.map → chunk-NTPHCNJO.js.map} +0 -0
  157. /package/dist/{chunk-44QCEK7E.js.map → chunk-OALQWRLG.js.map} +0 -0
  158. /package/dist/{chunk-PEAPABFI.js.map → chunk-OLZBZAW4.js.map} +0 -0
  159. /package/dist/{chunk-UVVNWF43.js.map → chunk-SBWMSNS2.js.map} +0 -0
  160. /package/dist/{chunk-ALWLM5MC.js.map → chunk-SRFNNOLC.js.map} +0 -0
  161. /package/dist/{chunk-KA253GGY.js.map → chunk-SYGEV3KV.js.map} +0 -0
  162. /package/dist/{chunk-HMGWGWFT.js.map → chunk-V43QDMYQ.js.map} +0 -0
  163. /package/dist/{chunk-WMAALRQI.js.map → chunk-VTDEENSP.js.map} +0 -0
  164. /package/dist/{chunk-VHGIQN5O.js.map → chunk-WWSKP5SR.js.map} +0 -0
  165. /package/dist/{chunk-EFZN22TO.js.map → chunk-YQFU2KZ5.js.map} +0 -0
  166. /package/dist/{source-manager-ABK5COKX.js.map → source-manager-HXFXBZJU.js.map} +0 -0
@@ -21,9 +21,9 @@ import {
21
21
  } from "../../chunk-XY3XDVMI.js";
22
22
  import {
23
23
  CategoryGrid
24
- } from "../../chunk-53K3URKF.js";
24
+ } from "../../chunk-ABE55TEU.js";
25
25
  import "../../chunk-GG4BSB6S.js";
26
- import "../../chunk-PP7NDFFE.js";
26
+ import "../../chunk-FVN5PFFY.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-test-react", "React", {
54
+ createOption("web-framework-react", "React", {
55
55
  state: "recommended",
56
56
  stateReason: "Popular choice"
57
57
  }),
58
- createOption("web-test-vue", "Vue"),
59
- createOption("web-test-angular", "Angular"),
60
- createOption("web-test-svelte", "Svelte")
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-mod", "SCSS Modules", { selected: true }),
69
- createOption("web-test-tailwind", "Tailwind", { state: "recommended" }),
70
- createOption("web-test-styled", "Styled Components"),
71
- createOption("web-test-vanilla", "Vanilla CSS")
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-test-zustand", "Zustand", { state: "recommended" }),
77
- createOption("web-test-jotai", "Jotai"),
78
- createOption("web-test-redux", "Redux", {
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-test-mobx", "MobX")
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-test-swr", "SWR"),
87
- createOption("web-test-apollo", "Apollo")
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", [createOption("web-test-posthog", "PostHog")])
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-test-react", "React", {
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-test-vue", "Vue"),
103
- createOption("web-test-angular", "Angular"),
104
- createOption("web-test-svelte", "Svelte")
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-mod", "SCSS Modules"),
113
- createOption("web-test-tailwind", "Tailwind", { state: "recommended" }),
114
- createOption("web-test-styled", "Styled Components"),
115
- createOption("web-test-vanilla", "Vanilla CSS")
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-test-zustand", "Zustand", { state: "recommended" }),
121
- createOption("web-test-jotai", "Jotai"),
122
- createOption("web-test-redux", "Redux", { state: "discouraged" }),
123
- createOption("web-test-mobx", "MobX")
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("Svelte");
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-test-opt1", "Option 1"),
223
- createOption("web-test-opt2", "Option 2", { state: "disabled" })
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-test-opt1", "Selected Skill", { selected: true })
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-test-opt1", "Unselected Skill", { state: "normal", selected: false })
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-test-opt1", "Disabled Skill", { state: "disabled" })
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-test-opt1", "Discouraged Skill", { state: "discouraged" })
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-test-opt1", "Active", { selected: true }),
279
- createOption("web-test-opt2", "Inactive", { selected: false })
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-test-opt1", "Toggle Skill", { selected: false })
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-test-opt1", "Toggle Skill", { selected: true })
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-test-scss", "SCSS"),
332
- createOption("web-test-tailwind", "Tailwind")
411
+ createOption("web-styling-scss-modules", "SCSS"),
412
+ createOption("web-styling-tailwind", "Tailwind")
333
413
  ]),
334
- createCategory("web-client-state", "State", [createOption("web-test-zustand", "Zustand")])
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-test-vue");
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-test-react", "React", { selected: true }),
559
- createOption("web-test-vue", "Vue")
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-test-react");
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-test-opt1", "Option 1", { state: "disabled" }),
583
- createOption("web-test-opt2", "Option 2", { state: "disabled" })
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-test-opt1", "Option 1"),
618
- createOption("web-test-opt2", "Option 2", { state: "disabled" }),
619
- createOption("web-test-opt3", "Option 3")
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-test-opt1", "Option 1"),
640
- createOption("web-test-opt2", "Option 2", { state: "disabled" }),
641
- createOption("web-test-opt3", "Option 3")
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-test-opt1", "Option 1", { state: "disabled" }),
663
- createOption("web-test-opt2", "Option 2", { state: "disabled" })
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-test-opt1", "Option 1"),
763
- createOption("web-test-opt2", "Option 2", { state: "disabled" })
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", [createOption("web-test-opt1", "Option 1")])
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", [createOption("web-test-only", "Only Option")])
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 options = Array.from(
816
- { length: 10 },
817
- (_, i) => createOption(`web-test-opt${i}`, `Option ${i}`)
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-test-long1", "Very Long Option Name"),
831
- createOption("web-test-long2", "Another Long Name")
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-test-opt1", "Option 1"),
843
- createOption("web-test-opt2", "Option 2")
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-test-opt4", "Option 4"),
848
- createOption("web-test-opt5", "Option 5"),
849
- createOption("web-test-opt6", "Option 6")
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-test-opt1", "Option 1", { selected: true }),
963
+ createOption("web-forms-react-hook-form", "Option 1", { selected: true }),
869
964
  // Framework selected
870
- createOption("web-test-opt2", "Option 2"),
871
- createOption("web-test-opt3", "Option 3")
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", [createOption("web-test-opt4", "Option 4")])
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-test-opt1", "Option 1", { installed: true })
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-test-opt1", "Option 1", { installed: true, selected: true })
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-test-opt1", "Option 1", { local: true, installed: true })
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 (let i = 0; i < 8; i++) {
956
- globalExpect(output).toContain(`Category ${i}`);
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: manyCategories,
1055
+ categories: navCategories,
970
1056
  defaultFocusedRow: 0,
971
1057
  onFocusChange
972
1058
  });