@claude-collective/cli 0.13.4 → 0.25.1

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 (314) hide show
  1. package/CHANGELOG.md +357 -0
  2. package/README.md +41 -27
  3. package/config/skills-matrix.yaml +202 -134
  4. package/config/stacks.yaml +14 -20
  5. package/dist/chunk-3X5D7RM5.js +69 -0
  6. package/dist/chunk-3X5D7RM5.js.map +1 -0
  7. package/dist/chunk-4S4FCAA2.js +100 -0
  8. package/dist/chunk-4S4FCAA2.js.map +1 -0
  9. package/dist/chunk-4WGN6SUE.js +197 -0
  10. package/dist/chunk-4WGN6SUE.js.map +1 -0
  11. package/dist/{chunk-DHET7RCE.js → chunk-AWKZ5BDL.js} +9 -2
  12. package/dist/{chunk-DHET7RCE.js.map → chunk-AWKZ5BDL.js.map} +1 -1
  13. package/dist/{chunk-6Q3Y7KVB.js → chunk-DBRUQQUF.js} +8 -2
  14. package/dist/chunk-DBRUQQUF.js.map +1 -0
  15. package/dist/{chunk-Z7G4B5HJ.js → chunk-ETCVEV3S.js} +73 -150
  16. package/dist/chunk-ETCVEV3S.js.map +1 -0
  17. package/dist/chunk-F4RD5FYM.js +45 -0
  18. package/dist/chunk-F4RD5FYM.js.map +1 -0
  19. package/dist/{chunk-ACNBKXXJ.js → chunk-GGFOD5PK.js} +13 -44
  20. package/dist/chunk-GGFOD5PK.js.map +1 -0
  21. package/dist/chunk-H7SSBSPR.js +29 -0
  22. package/dist/chunk-H7SSBSPR.js.map +1 -0
  23. package/dist/chunk-HWD32NP7.js +19 -0
  24. package/dist/chunk-HWD32NP7.js.map +1 -0
  25. package/dist/{chunk-JIPWV2FX.js → chunk-IAYAE6MG.js} +12 -34
  26. package/dist/chunk-IAYAE6MG.js.map +1 -0
  27. package/dist/{chunk-RTE64SJA.js → chunk-IXBCRT3F.js} +2 -2
  28. package/dist/chunk-IXBCRT3F.js.map +1 -0
  29. package/dist/chunk-KWYO3M5Q.js +67 -0
  30. package/dist/chunk-KWYO3M5Q.js.map +1 -0
  31. package/dist/{chunk-E3FJH4TF.js → chunk-MCTSHLAF.js} +18 -18
  32. package/dist/chunk-MCTSHLAF.js.map +1 -0
  33. package/dist/chunk-MH66WDFV.js +251 -0
  34. package/dist/chunk-MH66WDFV.js.map +1 -0
  35. package/dist/{chunk-K3NB6DSG.js → chunk-MTPM7BX5.js} +108 -110
  36. package/dist/chunk-MTPM7BX5.js.map +1 -0
  37. package/dist/chunk-NQJ47R4N.js +1092 -0
  38. package/dist/chunk-NQJ47R4N.js.map +1 -0
  39. package/dist/chunk-NRC7XYCI.js +211 -0
  40. package/dist/chunk-NRC7XYCI.js.map +1 -0
  41. package/dist/{chunk-76DWXGQE.js → chunk-O6ZTD7ZI.js} +14 -3
  42. package/dist/chunk-O6ZTD7ZI.js.map +1 -0
  43. package/dist/chunk-OBXAY23Y.js +56 -0
  44. package/dist/chunk-OBXAY23Y.js.map +1 -0
  45. package/dist/{chunk-XY3XDVMI.js → chunk-QR2EBWL2.js} +3 -3
  46. package/dist/{chunk-66UDJBF6.js → chunk-REJGRCVQ.js} +2 -2
  47. package/dist/{chunk-D237EVNB.js → chunk-TMED5DQ2.js} +71 -48
  48. package/dist/chunk-TMED5DQ2.js.map +1 -0
  49. package/dist/chunk-U7HFKR74.js +21 -0
  50. package/dist/chunk-U7HFKR74.js.map +1 -0
  51. package/dist/chunk-UEMRJI2K.js +146 -0
  52. package/dist/chunk-UEMRJI2K.js.map +1 -0
  53. package/dist/{chunk-Z2CWURZ6.js → chunk-UNN7523L.js} +2 -2
  54. package/dist/chunk-V2ZIH7HV.js +29 -0
  55. package/dist/chunk-V2ZIH7HV.js.map +1 -0
  56. package/dist/{chunk-X6QONICW.js → chunk-VVYNZZUX.js} +7 -19
  57. package/dist/chunk-VVYNZZUX.js.map +1 -0
  58. package/dist/chunk-WXS4S3MA.js +220 -0
  59. package/dist/chunk-WXS4S3MA.js.map +1 -0
  60. package/dist/{chunk-CDX4W4DM.js → chunk-XENOESJZ.js} +53 -33
  61. package/dist/chunk-XENOESJZ.js.map +1 -0
  62. package/dist/chunk-YDBSSAJ6.js +4207 -0
  63. package/dist/chunk-YDBSSAJ6.js.map +1 -0
  64. package/dist/chunk-ZDREFYD2.js +696 -0
  65. package/dist/chunk-ZDREFYD2.js.map +1 -0
  66. package/dist/chunk-ZW2PELOH.js +197 -0
  67. package/dist/chunk-ZW2PELOH.js.map +1 -0
  68. package/dist/cli/defaults/agent-mappings.yaml +13 -14
  69. package/dist/commands/build/marketplace.js +19 -23
  70. package/dist/commands/build/marketplace.js.map +1 -1
  71. package/dist/commands/build/plugins.js +13 -240
  72. package/dist/commands/build/plugins.js.map +1 -1
  73. package/dist/commands/build/stack.js +13 -25
  74. package/dist/commands/build/stack.js.map +1 -1
  75. package/dist/commands/compile.js +45 -82
  76. package/dist/commands/compile.js.map +1 -1
  77. package/dist/commands/config/get.js +9 -9
  78. package/dist/commands/config/get.js.map +1 -1
  79. package/dist/commands/config/index.js +8 -8
  80. package/dist/commands/config/index.js.map +1 -1
  81. package/dist/commands/config/path.js +7 -9
  82. package/dist/commands/config/path.js.map +1 -1
  83. package/dist/commands/config/set-project.js +12 -13
  84. package/dist/commands/config/set-project.js.map +1 -1
  85. package/dist/commands/config/show.js +7 -7
  86. package/dist/commands/config/unset-project.js +12 -13
  87. package/dist/commands/config/unset-project.js.map +1 -1
  88. package/dist/commands/diff.js +15 -44
  89. package/dist/commands/diff.js.map +1 -1
  90. package/dist/commands/doctor.js +23 -67
  91. package/dist/commands/doctor.js.map +1 -1
  92. package/dist/commands/edit.js +98 -81
  93. package/dist/commands/edit.js.map +1 -1
  94. package/dist/commands/eject.js +27 -79
  95. package/dist/commands/eject.js.map +1 -1
  96. package/dist/commands/import/skill.js +38 -58
  97. package/dist/commands/import/skill.js.map +1 -1
  98. package/dist/commands/info.js +17 -24
  99. package/dist/commands/info.js.map +1 -1
  100. package/dist/commands/init.js +103 -779
  101. package/dist/commands/init.js.map +1 -1
  102. package/dist/commands/list.js +8 -11
  103. package/dist/commands/list.js.map +1 -1
  104. package/dist/commands/new/agent.js +11 -16
  105. package/dist/commands/new/agent.js.map +1 -1
  106. package/dist/commands/new/skill.js +14 -18
  107. package/dist/commands/new/skill.js.map +1 -1
  108. package/dist/commands/outdated.js +16 -97
  109. package/dist/commands/outdated.js.map +1 -1
  110. package/dist/commands/search.js +24 -43
  111. package/dist/commands/search.js.map +1 -1
  112. package/dist/commands/uninstall.js +22 -30
  113. package/dist/commands/uninstall.js.map +1 -1
  114. package/dist/commands/update.js +23 -154
  115. package/dist/commands/update.js.map +1 -1
  116. package/dist/commands/validate.js +38 -89
  117. package/dist/commands/validate.js.map +1 -1
  118. package/dist/commands/version/bump.js +12 -28
  119. package/dist/commands/version/bump.js.map +1 -1
  120. package/dist/commands/version/index.js +8 -24
  121. package/dist/commands/version/index.js.map +1 -1
  122. package/dist/commands/version/set.js +11 -26
  123. package/dist/commands/version/set.js.map +1 -1
  124. package/dist/commands/version/show.js +8 -24
  125. package/dist/commands/version/show.js.map +1 -1
  126. package/dist/components/common/confirm.js +2 -2
  127. package/dist/components/common/confirm.test.js +203 -0
  128. package/dist/components/common/confirm.test.js.map +1 -0
  129. package/dist/components/common/message.js +3 -7
  130. package/dist/components/common/message.js.map +1 -1
  131. package/dist/components/common/spinner.js +1 -1
  132. package/dist/components/common/spinner.js.map +1 -1
  133. package/dist/components/skill-search/skill-search.js +3 -3
  134. package/dist/components/wizard/category-grid.js +2 -2
  135. package/dist/components/wizard/category-grid.test.js +138 -156
  136. package/dist/components/wizard/category-grid.test.js.map +1 -1
  137. package/dist/components/wizard/menu-item.js +9 -0
  138. package/dist/components/wizard/search-modal.js +9 -0
  139. package/dist/components/wizard/search-modal.test.js +216 -0
  140. package/dist/components/wizard/search-modal.test.js.map +1 -0
  141. package/dist/components/wizard/section-progress.js +2 -2
  142. package/dist/components/wizard/section-progress.test.js +16 -106
  143. package/dist/components/wizard/section-progress.test.js.map +1 -1
  144. package/dist/components/wizard/source-grid.js +10 -0
  145. package/dist/components/wizard/source-grid.js.map +1 -0
  146. package/dist/components/wizard/source-grid.test.js +500 -0
  147. package/dist/components/wizard/source-grid.test.js.map +1 -0
  148. package/dist/components/wizard/step-approach.js +7 -5
  149. package/dist/components/wizard/step-approach.test.js +115 -0
  150. package/dist/components/wizard/step-approach.test.js.map +1 -0
  151. package/dist/components/wizard/step-build.js +9 -5
  152. package/dist/components/wizard/step-build.test.js +160 -284
  153. package/dist/components/wizard/step-build.test.js.map +1 -1
  154. package/dist/components/wizard/step-confirm.js +3 -3
  155. package/dist/components/wizard/step-confirm.test.js +364 -0
  156. package/dist/components/wizard/step-confirm.test.js.map +1 -0
  157. package/dist/components/wizard/step-refine.js +2 -3
  158. package/dist/components/wizard/step-refine.test.js +24 -26
  159. package/dist/components/wizard/step-refine.test.js.map +1 -1
  160. package/dist/components/wizard/step-settings.js +14 -0
  161. package/dist/components/wizard/step-settings.js.map +1 -0
  162. package/dist/components/wizard/step-settings.test.js +240 -0
  163. package/dist/components/wizard/step-settings.test.js.map +1 -0
  164. package/dist/components/wizard/step-sources.js +17 -0
  165. package/dist/components/wizard/step-sources.js.map +1 -0
  166. package/dist/components/wizard/step-sources.test.js +290 -0
  167. package/dist/components/wizard/step-sources.test.js.map +1 -0
  168. package/dist/components/wizard/step-stack.js +7 -4
  169. package/dist/components/wizard/step-stack.test.js +344 -0
  170. package/dist/components/wizard/step-stack.test.js.map +1 -0
  171. package/dist/components/wizard/view-title.js +9 -0
  172. package/dist/components/wizard/view-title.js.map +1 -0
  173. package/dist/components/wizard/wizard-layout.js +17 -0
  174. package/dist/components/wizard/wizard-layout.js.map +1 -0
  175. package/dist/components/wizard/wizard-tabs.js +2 -2
  176. package/dist/components/wizard/wizard-tabs.test.js +292 -0
  177. package/dist/components/wizard/wizard-tabs.test.js.map +1 -0
  178. package/dist/components/wizard/wizard.js +22 -15
  179. package/dist/config/skills-matrix.yaml +202 -134
  180. package/dist/config/stacks.yaml +14 -20
  181. package/dist/hooks/init.js +6 -8
  182. package/dist/hooks/init.js.map +1 -1
  183. package/dist/index.js +1 -1
  184. package/dist/index.js.map +1 -1
  185. package/dist/{magic-string.es-RGXYGAW3.js → magic-string.es-PAH2SOTR.js} +2 -2
  186. package/dist/source-manager-DSYZEVGZ.js +16 -0
  187. package/dist/source-manager-DSYZEVGZ.js.map +1 -0
  188. package/dist/src/agents/developer/api-developer/agent.yaml +1 -1
  189. package/dist/src/agents/developer/cli-developer/agent.yaml +1 -1
  190. package/dist/src/agents/developer/web-architecture/agent.yaml +1 -1
  191. package/dist/src/agents/developer/web-developer/agent.yaml +1 -1
  192. package/dist/src/agents/developer/web-developer/examples.md +1 -6
  193. package/dist/src/agents/meta/agent-summoner/agent.yaml +1 -1
  194. package/dist/src/agents/meta/documentor/agent.yaml +1 -1
  195. package/dist/src/agents/meta/documentor/workflow.md +1 -5
  196. package/dist/src/agents/meta/skill-summoner/agent.yaml +1 -1
  197. package/dist/src/agents/migration/cli-migrator/agent.yaml +1 -1
  198. package/dist/src/agents/migration/cli-migrator/anti-patterns.md +1 -3
  199. package/dist/src/agents/pattern/pattern-scout/agent.yaml +1 -1
  200. package/dist/src/agents/pattern/web-pattern-critique/agent.yaml +1 -1
  201. package/dist/src/agents/planning/web-pm/agent.yaml +1 -1
  202. package/dist/src/agents/researcher/api-researcher/agent.yaml +1 -1
  203. package/dist/src/agents/researcher/web-researcher/agent.yaml +1 -1
  204. package/dist/src/agents/reviewer/api-reviewer/agent.yaml +1 -1
  205. package/dist/src/agents/reviewer/cli-reviewer/agent.yaml +1 -1
  206. package/dist/src/agents/reviewer/web-reviewer/agent.yaml +1 -1
  207. package/dist/src/agents/tester/cli-tester/agent.yaml +1 -1
  208. package/dist/src/agents/tester/web-tester/agent.yaml +1 -1
  209. package/dist/src/agents/tester/web-tester/output-format.md +1 -3
  210. package/dist/stores/wizard-store.js +4 -3
  211. package/dist/stores/wizard-store.test.js +94 -88
  212. package/dist/stores/wizard-store.test.js.map +1 -1
  213. package/package.json +5 -3
  214. package/src/agents/developer/api-developer/agent.yaml +1 -1
  215. package/src/agents/developer/cli-developer/agent.yaml +1 -1
  216. package/src/agents/developer/web-architecture/agent.yaml +1 -1
  217. package/src/agents/developer/web-developer/agent.yaml +1 -1
  218. package/src/agents/developer/web-developer/examples.md +1 -6
  219. package/src/agents/meta/agent-summoner/agent.yaml +1 -1
  220. package/src/agents/meta/documentor/agent.yaml +1 -1
  221. package/src/agents/meta/documentor/workflow.md +1 -5
  222. package/src/agents/meta/skill-summoner/agent.yaml +1 -1
  223. package/src/agents/migration/cli-migrator/agent.yaml +1 -1
  224. package/src/agents/migration/cli-migrator/anti-patterns.md +1 -3
  225. package/src/agents/pattern/pattern-scout/agent.yaml +1 -1
  226. package/src/agents/pattern/web-pattern-critique/agent.yaml +1 -1
  227. package/src/agents/planning/web-pm/agent.yaml +1 -1
  228. package/src/agents/researcher/api-researcher/agent.yaml +1 -1
  229. package/src/agents/researcher/web-researcher/agent.yaml +1 -1
  230. package/src/agents/reviewer/api-reviewer/agent.yaml +1 -1
  231. package/src/agents/reviewer/cli-reviewer/agent.yaml +1 -1
  232. package/src/agents/reviewer/web-reviewer/agent.yaml +1 -1
  233. package/src/agents/tester/cli-tester/agent.yaml +1 -1
  234. package/src/agents/tester/web-tester/agent.yaml +1 -1
  235. package/src/agents/tester/web-tester/output-format.md +1 -3
  236. package/dist/chunk-3U3R4NCG.js +0 -22
  237. package/dist/chunk-3U3R4NCG.js.map +0 -1
  238. package/dist/chunk-4K4ZXQRM.js +0 -317
  239. package/dist/chunk-4K4ZXQRM.js.map +0 -1
  240. package/dist/chunk-6Q3Y7KVB.js.map +0 -1
  241. package/dist/chunk-76DWXGQE.js.map +0 -1
  242. package/dist/chunk-7Q44DMSP.js +0 -582
  243. package/dist/chunk-7Q44DMSP.js.map +0 -1
  244. package/dist/chunk-ACNBKXXJ.js.map +0 -1
  245. package/dist/chunk-B7CCVP6Q.js +0 -639
  246. package/dist/chunk-B7CCVP6Q.js.map +0 -1
  247. package/dist/chunk-BDLUZVKU.js +0 -54
  248. package/dist/chunk-BDLUZVKU.js.map +0 -1
  249. package/dist/chunk-CDX4W4DM.js.map +0 -1
  250. package/dist/chunk-D237EVNB.js.map +0 -1
  251. package/dist/chunk-DRXPNNPB.js +0 -393
  252. package/dist/chunk-DRXPNNPB.js.map +0 -1
  253. package/dist/chunk-E3FJH4TF.js.map +0 -1
  254. package/dist/chunk-ED4E6Q2T.js +0 -114
  255. package/dist/chunk-ED4E6Q2T.js.map +0 -1
  256. package/dist/chunk-EHS3TWWP.js +0 -95
  257. package/dist/chunk-EHS3TWWP.js.map +0 -1
  258. package/dist/chunk-GDH553MV.js +0 -91
  259. package/dist/chunk-GDH553MV.js.map +0 -1
  260. package/dist/chunk-HLJX2FTL.js +0 -95
  261. package/dist/chunk-HLJX2FTL.js.map +0 -1
  262. package/dist/chunk-I2DSLOXZ.js +0 -75
  263. package/dist/chunk-I2DSLOXZ.js.map +0 -1
  264. package/dist/chunk-I4TPKIYX.js +0 -493
  265. package/dist/chunk-I4TPKIYX.js.map +0 -1
  266. package/dist/chunk-IAUAQJQ2.js +0 -57
  267. package/dist/chunk-IAUAQJQ2.js.map +0 -1
  268. package/dist/chunk-IBE7JIAG.js +0 -129
  269. package/dist/chunk-IBE7JIAG.js.map +0 -1
  270. package/dist/chunk-IMDW5ZUP.js +0 -132
  271. package/dist/chunk-IMDW5ZUP.js.map +0 -1
  272. package/dist/chunk-JIPWV2FX.js.map +0 -1
  273. package/dist/chunk-K3NB6DSG.js.map +0 -1
  274. package/dist/chunk-K7EVM5LY.js +0 -141
  275. package/dist/chunk-K7EVM5LY.js.map +0 -1
  276. package/dist/chunk-KAAEN2PO.js +0 -57
  277. package/dist/chunk-KAAEN2PO.js.map +0 -1
  278. package/dist/chunk-NDY25DTL.js +0 -453
  279. package/dist/chunk-NDY25DTL.js.map +0 -1
  280. package/dist/chunk-P26A2K5N.js +0 -64
  281. package/dist/chunk-P26A2K5N.js.map +0 -1
  282. package/dist/chunk-RFTSZDHV.js +0 -313
  283. package/dist/chunk-RFTSZDHV.js.map +0 -1
  284. package/dist/chunk-RTE64SJA.js.map +0 -1
  285. package/dist/chunk-SVYPSDWY.js +0 -84
  286. package/dist/chunk-SVYPSDWY.js.map +0 -1
  287. package/dist/chunk-TKFPKEV3.js +0 -69
  288. package/dist/chunk-TKFPKEV3.js.map +0 -1
  289. package/dist/chunk-UQTEPWU7.js +0 -108
  290. package/dist/chunk-UQTEPWU7.js.map +0 -1
  291. package/dist/chunk-V46GGCCI.js +0 -294
  292. package/dist/chunk-V46GGCCI.js.map +0 -1
  293. package/dist/chunk-X6QONICW.js.map +0 -1
  294. package/dist/chunk-Y2LW7R3Y.js +0 -23
  295. package/dist/chunk-Y2LW7R3Y.js.map +0 -1
  296. package/dist/chunk-Z7G4B5HJ.js.map +0 -1
  297. package/dist/chunk-ZENYS6KW.js +0 -90
  298. package/dist/chunk-ZENYS6KW.js.map +0 -1
  299. package/dist/chunk-ZFPSUQOU.js +0 -396
  300. package/dist/chunk-ZFPSUQOU.js.map +0 -1
  301. package/dist/commands/config/set.js +0 -61
  302. package/dist/commands/config/set.js.map +0 -1
  303. package/dist/commands/config/unset.js +0 -57
  304. package/dist/commands/config/unset.js.map +0 -1
  305. package/dist/commands/test-imports.js +0 -92
  306. package/dist/commands/test-imports.js.map +0 -1
  307. package/dist/components/wizard/step-stack-options.js +0 -11
  308. package/dist/components/wizard/wizard-footer.js +0 -9
  309. /package/dist/{chunk-XY3XDVMI.js.map → chunk-QR2EBWL2.js.map} +0 -0
  310. /package/dist/{chunk-66UDJBF6.js.map → chunk-REJGRCVQ.js.map} +0 -0
  311. /package/dist/{chunk-Z2CWURZ6.js.map → chunk-UNN7523L.js.map} +0 -0
  312. /package/dist/components/wizard/{step-stack-options.js.map → menu-item.js.map} +0 -0
  313. /package/dist/components/wizard/{wizard-footer.js.map → search-modal.js.map} +0 -0
  314. /package/dist/{magic-string.es-RGXYGAW3.js.map → magic-string.es-PAH2SOTR.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/cli/components/common/confirm.test.tsx"],"sourcesContent":["// ConfirmInput requires longer delays than other components for useInput processing\nimport React from \"react\";\nimport { render } from \"ink-testing-library\";\nimport { afterEach, describe, expect, it, vi } from \"vitest\";\nimport { Confirm } from \"./confirm\";\nimport { KEY_Y, KEY_N, ENTER, RENDER_DELAY_MS, delay } from \"../../lib/__tests__/test-constants\";\n\nconst CONFIRM_INPUT_DELAY_MS = 100;\n\ndescribe(\"Confirm component\", () => {\n let cleanup: (() => void) | undefined;\n\n afterEach(() => {\n cleanup?.();\n cleanup = undefined;\n });\n\n describe(\"rendering\", () => {\n it(\"should render the message\", () => {\n const { lastFrame, unmount } = render(\n <Confirm message=\"Do you want to proceed?\" onConfirm={() => {}} onCancel={() => {}} />,\n );\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Do you want to proceed?\");\n });\n\n it(\"should show y/n prompt\", () => {\n const { lastFrame, unmount } = render(\n <Confirm message=\"Continue?\" onConfirm={() => {}} onCancel={() => {}} />,\n );\n cleanup = unmount;\n\n const output = lastFrame();\n // ConfirmInput shows (Y/n) or (y/N) depending on default\n expect(output?.toLowerCase()).toMatch(/[yn]/);\n });\n\n it(\"should show Y/n when default is confirm (true)\", () => {\n const { lastFrame, unmount } = render(\n <Confirm message=\"Confirm?\" onConfirm={() => {}} onCancel={() => {}} defaultValue={true} />,\n );\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Y/n\");\n });\n\n it(\"should show y/N when default is cancel (false)\", () => {\n const { lastFrame, unmount } = render(\n <Confirm\n message=\"Confirm?\"\n onConfirm={() => {}}\n onCancel={() => {}}\n defaultValue={false}\n />,\n );\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"y/N\");\n });\n });\n\n describe(\"keyboard interactions\", () => {\n it(\"should call onConfirm when pressing y\", async () => {\n const onConfirm = vi.fn();\n const onCancel = vi.fn();\n\n const { stdin, unmount } = render(\n <Confirm message=\"Confirm?\" onConfirm={onConfirm} onCancel={onCancel} />,\n );\n cleanup = unmount;\n\n // Wait for component to mount and set up input handler\n await delay(RENDER_DELAY_MS);\n\n await stdin.write(KEY_Y);\n await delay(CONFIRM_INPUT_DELAY_MS);\n\n expect(onConfirm).toHaveBeenCalled();\n expect(onCancel).not.toHaveBeenCalled();\n });\n\n it(\"should call onCancel when pressing n\", async () => {\n const onConfirm = vi.fn();\n const onCancel = vi.fn();\n\n const { stdin, unmount } = render(\n <Confirm message=\"Confirm?\" onConfirm={onConfirm} onCancel={onCancel} />,\n );\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n await stdin.write(KEY_N);\n await delay(CONFIRM_INPUT_DELAY_MS);\n\n expect(onCancel).toHaveBeenCalled();\n expect(onConfirm).not.toHaveBeenCalled();\n });\n\n it(\"should call onConfirm when default is true and enter pressed\", async () => {\n const onConfirm = vi.fn();\n const onCancel = vi.fn();\n\n const { stdin, unmount } = render(\n <Confirm\n message=\"Confirm?\"\n onConfirm={onConfirm}\n onCancel={onCancel}\n defaultValue={true}\n />,\n );\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n await stdin.write(ENTER);\n await delay(CONFIRM_INPUT_DELAY_MS);\n\n expect(onConfirm).toHaveBeenCalled();\n expect(onCancel).not.toHaveBeenCalled();\n });\n\n it(\"should call onCancel when default is false and enter pressed\", async () => {\n const onConfirm = vi.fn();\n const onCancel = vi.fn();\n\n const { stdin, unmount } = render(\n <Confirm\n message=\"Confirm?\"\n onConfirm={onConfirm}\n onCancel={onCancel}\n defaultValue={false}\n />,\n );\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n await stdin.write(ENTER);\n await delay(CONFIRM_INPUT_DELAY_MS);\n\n expect(onCancel).toHaveBeenCalled();\n expect(onConfirm).not.toHaveBeenCalled();\n });\n\n it(\"should handle uppercase Y\", async () => {\n const onConfirm = vi.fn();\n\n const { stdin, unmount } = render(\n <Confirm message=\"Confirm?\" onConfirm={onConfirm} onCancel={() => {}} />,\n );\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n await stdin.write(\"Y\");\n await delay(CONFIRM_INPUT_DELAY_MS);\n\n expect(onConfirm).toHaveBeenCalled();\n });\n\n it(\"should handle uppercase N\", async () => {\n const onCancel = vi.fn();\n\n const { stdin, unmount } = render(\n <Confirm message=\"Confirm?\" onConfirm={() => {}} onCancel={onCancel} />,\n );\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n await stdin.write(\"N\");\n await delay(CONFIRM_INPUT_DELAY_MS);\n\n expect(onCancel).toHaveBeenCalled();\n });\n });\n\n describe(\"default value\", () => {\n it(\"should default to false when not specified\", () => {\n const { lastFrame, unmount } = render(\n <Confirm message=\"Confirm?\" onConfirm={() => {}} onCancel={() => {}} />,\n );\n cleanup = unmount;\n\n const output = lastFrame();\n // When default is false, N is capitalized (y/N)\n expect(output).toContain(\"y/N\");\n });\n\n it(\"should render with specified default value of true\", () => {\n const { lastFrame, unmount } = render(\n <Confirm message=\"Confirm?\" onConfirm={() => {}} onCancel={() => {}} defaultValue={true} />,\n );\n cleanup = unmount;\n\n const output = lastFrame();\n // When default is true, Y is capitalized (Y/n)\n expect(output).toContain(\"Y/n\");\n });\n });\n});\n"],"mappings":"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","names":[]}
@@ -1,20 +1,16 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  init_esm_shims
4
- } from "../../chunk-DHET7RCE.js";
4
+ } from "../../chunk-AWKZ5BDL.js";
5
5
 
6
6
  // src/cli/components/common/message.tsx
7
7
  init_esm_shims();
8
8
  import { Alert } from "@inkjs/ui";
9
9
  import { jsx } from "react/jsx-runtime";
10
10
  var InfoMessage = ({ children }) => /* @__PURE__ */ jsx(Alert, { variant: "info", children });
11
- var WarningMessage = ({
12
- children
13
- }) => /* @__PURE__ */ jsx(Alert, { variant: "warning", children });
11
+ var WarningMessage = ({ children }) => /* @__PURE__ */ jsx(Alert, { variant: "warning", children });
14
12
  var ErrorMessage = ({ children }) => /* @__PURE__ */ jsx(Alert, { variant: "error", children });
15
- var SuccessMessage = ({
16
- children
17
- }) => /* @__PURE__ */ jsx(Alert, { variant: "success", children });
13
+ var SuccessMessage = ({ children }) => /* @__PURE__ */ jsx(Alert, { variant: "success", children });
18
14
  export {
19
15
  ErrorMessage,
20
16
  InfoMessage,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/cli/components/common/message.tsx"],"sourcesContent":["import React from \"react\";\nimport { Alert } from \"@inkjs/ui\";\n\nexport const InfoMessage: React.FC<{ children: string }> = ({ children }) => (\n <Alert variant=\"info\">{children}</Alert>\n);\n\nexport const WarningMessage: React.FC<{ children: string }> = ({\n children,\n}) => <Alert variant=\"warning\">{children}</Alert>;\n\nexport const ErrorMessage: React.FC<{ children: string }> = ({ children }) => (\n <Alert variant=\"error\">{children}</Alert>\n);\n\nexport const SuccessMessage: React.FC<{ children: string }> = ({\n children,\n}) => <Alert variant=\"success\">{children}</Alert>;\n"],"mappings":";;;;;;AAAA;AACA,SAAS,aAAa;AAGpB;AADK,IAAM,cAA8C,CAAC,EAAE,SAAS,MACrE,oBAAC,SAAM,SAAQ,QAAQ,UAAS;AAG3B,IAAM,iBAAiD,CAAC;AAAA,EAC7D;AACF,MAAM,oBAAC,SAAM,SAAQ,WAAW,UAAS;AAElC,IAAM,eAA+C,CAAC,EAAE,SAAS,MACtE,oBAAC,SAAM,SAAQ,SAAS,UAAS;AAG5B,IAAM,iBAAiD,CAAC;AAAA,EAC7D;AACF,MAAM,oBAAC,SAAM,SAAQ,WAAW,UAAS;","names":[]}
1
+ {"version":3,"sources":["../../../src/cli/components/common/message.tsx"],"sourcesContent":["import React from \"react\";\nimport { Alert } from \"@inkjs/ui\";\n\nexport const InfoMessage: React.FC<{ children: string }> = ({ children }) => (\n <Alert variant=\"info\">{children}</Alert>\n);\n\nexport const WarningMessage: React.FC<{ children: string }> = ({ children }) => (\n <Alert variant=\"warning\">{children}</Alert>\n);\n\nexport const ErrorMessage: React.FC<{ children: string }> = ({ children }) => (\n <Alert variant=\"error\">{children}</Alert>\n);\n\nexport const SuccessMessage: React.FC<{ children: string }> = ({ children }) => (\n <Alert variant=\"success\">{children}</Alert>\n);\n"],"mappings":";;;;;;AAAA;AACA,SAAS,aAAa;AAGpB;AADK,IAAM,cAA8C,CAAC,EAAE,SAAS,MACrE,oBAAC,SAAM,SAAQ,QAAQ,UAAS;AAG3B,IAAM,iBAAiD,CAAC,EAAE,SAAS,MACxE,oBAAC,SAAM,SAAQ,WAAW,UAAS;AAG9B,IAAM,eAA+C,CAAC,EAAE,SAAS,MACtE,oBAAC,SAAM,SAAQ,SAAS,UAAS;AAG5B,IAAM,iBAAiD,CAAC,EAAE,SAAS,MACxE,oBAAC,SAAM,SAAQ,WAAW,UAAS;","names":[]}
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  init_esm_shims
4
- } from "../../chunk-DHET7RCE.js";
4
+ } from "../../chunk-AWKZ5BDL.js";
5
5
 
6
6
  // src/cli/components/common/spinner.tsx
7
7
  init_esm_shims();
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/cli/components/common/spinner.tsx"],"sourcesContent":["import React from \"react\";\nimport { Spinner as InkSpinner } from \"@inkjs/ui\";\n\ninterface SpinnerProps {\n label: string;\n}\n\nexport const Spinner: React.FC<SpinnerProps> = ({ label }) => (\n <InkSpinner label={label} />\n);\n"],"mappings":";;;;;;AAAA;AACA,SAAS,WAAW,kBAAkB;AAOpC;AADK,IAAM,UAAkC,CAAC,EAAE,MAAM,MACtD,oBAAC,cAAW,OAAc;","names":[]}
1
+ {"version":3,"sources":["../../../src/cli/components/common/spinner.tsx"],"sourcesContent":["import React from \"react\";\nimport { Spinner as InkSpinner } from \"@inkjs/ui\";\n\ntype SpinnerProps = {\n label: string;\n};\n\nexport const Spinner: React.FC<SpinnerProps> = ({ label }) => <InkSpinner label={label} />;\n"],"mappings":";;;;;;AAAA;AACA,SAAS,WAAW,kBAAkB;AAMwB;AAAvD,IAAM,UAAkC,CAAC,EAAE,MAAM,MAAM,oBAAC,cAAW,OAAc;","names":[]}
@@ -1,9 +1,9 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  SkillSearch
4
- } from "../../chunk-ACNBKXXJ.js";
5
- import "../../chunk-Z2CWURZ6.js";
6
- import "../../chunk-DHET7RCE.js";
4
+ } from "../../chunk-GGFOD5PK.js";
5
+ import "../../chunk-UNN7523L.js";
6
+ import "../../chunk-AWKZ5BDL.js";
7
7
  export {
8
8
  SkillSearch
9
9
  };
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  CategoryGrid
4
- } from "../../chunk-Z7G4B5HJ.js";
5
- import "../../chunk-DHET7RCE.js";
4
+ } from "../../chunk-ETCVEV3S.js";
5
+ import "../../chunk-AWKZ5BDL.js";
6
6
  export {
7
7
  CategoryGrid
8
8
  };
@@ -8,23 +8,23 @@ import {
8
8
  RENDER_DELAY_MS,
9
9
  TAB,
10
10
  delay
11
- } from "../../chunk-6Q3Y7KVB.js";
11
+ } from "../../chunk-DBRUQQUF.js";
12
12
  import {
13
13
  render
14
- } from "../../chunk-66UDJBF6.js";
14
+ } from "../../chunk-REJGRCVQ.js";
15
15
  import {
16
16
  afterEach,
17
17
  describe,
18
18
  globalExpect,
19
19
  it,
20
20
  vi
21
- } from "../../chunk-XY3XDVMI.js";
21
+ } from "../../chunk-QR2EBWL2.js";
22
22
  import {
23
23
  CategoryGrid
24
- } from "../../chunk-Z7G4B5HJ.js";
24
+ } from "../../chunk-ETCVEV3S.js";
25
25
  import {
26
26
  init_esm_shims
27
- } from "../../chunk-DHET7RCE.js";
27
+ } from "../../chunk-AWKZ5BDL.js";
28
28
 
29
29
  // src/cli/components/wizard/category-grid.test.tsx
30
30
  init_esm_shims();
@@ -36,9 +36,9 @@ var createOption = (id, label, overrides = {}) => ({
36
36
  selected: false,
37
37
  ...overrides
38
38
  });
39
- var createCategory = (id, name, options, overrides = {}) => ({
39
+ var createCategory = (id, displayName, options, overrides = {}) => ({
40
40
  id,
41
- name,
41
+ displayName,
42
42
  required: false,
43
43
  exclusive: true,
44
44
  options,
@@ -49,13 +49,13 @@ var defaultCategories = [
49
49
  "framework",
50
50
  "Framework",
51
51
  [
52
- createOption("react", "React", {
52
+ createOption("web-test-react", "React", {
53
53
  state: "recommended",
54
54
  stateReason: "Popular choice"
55
55
  }),
56
- createOption("vue", "Vue"),
57
- createOption("angular", "Angular"),
58
- createOption("svelte", "Svelte")
56
+ createOption("web-test-vue", "Vue"),
57
+ createOption("web-test-angular", "Angular"),
58
+ createOption("web-test-svelte", "Svelte")
59
59
  ],
60
60
  { required: true }
61
61
  ),
@@ -63,45 +63,43 @@ var defaultCategories = [
63
63
  "styling",
64
64
  "Styling",
65
65
  [
66
- createOption("scss-mod", "SCSS Modules", { selected: true }),
67
- createOption("tailwind", "Tailwind", { state: "recommended" }),
68
- createOption("styled", "Styled Components"),
69
- createOption("vanilla", "Vanilla CSS")
66
+ createOption("web-scss-mod", "SCSS Modules", { selected: true }),
67
+ createOption("web-test-tailwind", "Tailwind", { state: "recommended" }),
68
+ createOption("web-test-styled", "Styled Components"),
69
+ createOption("web-test-vanilla", "Vanilla CSS")
70
70
  ],
71
71
  { required: true }
72
72
  ),
73
73
  createCategory("client-state", "Client State", [
74
- createOption("zustand", "Zustand", { state: "recommended" }),
75
- createOption("jotai", "Jotai"),
76
- createOption("redux", "Redux", {
74
+ createOption("web-test-zustand", "Zustand", { state: "recommended" }),
75
+ createOption("web-test-jotai", "Jotai"),
76
+ createOption("web-test-redux", "Redux", {
77
77
  state: "discouraged",
78
78
  stateReason: "Complex for most apps"
79
79
  }),
80
- createOption("mobx", "MobX")
80
+ createOption("web-test-mobx", "MobX")
81
81
  ]),
82
82
  createCategory("server-state", "Server State", [
83
- createOption("react-query", "React Query", { selected: true }),
84
- createOption("swr", "SWR"),
85
- createOption("apollo", "Apollo")
83
+ createOption("web-react-query", "React Query", { selected: true }),
84
+ createOption("web-test-swr", "SWR"),
85
+ createOption("web-test-apollo", "Apollo")
86
86
  ]),
87
- createCategory("analytics", "Analytics", [
88
- createOption("posthog", "PostHog")
89
- ])
87
+ createCategory("analytics", "Analytics", [createOption("web-test-posthog", "PostHog")])
90
88
  ];
91
89
  var categoriesWithFramework = [
92
90
  createCategory(
93
91
  "framework",
94
92
  "Framework",
95
93
  [
96
- createOption("react", "React", {
94
+ createOption("web-test-react", "React", {
97
95
  state: "recommended",
98
96
  stateReason: "Popular choice",
99
97
  selected: true
100
98
  // Framework selected
101
99
  }),
102
- createOption("vue", "Vue"),
103
- createOption("angular", "Angular"),
104
- createOption("svelte", "Svelte")
100
+ createOption("web-test-vue", "Vue"),
101
+ createOption("web-test-angular", "Angular"),
102
+ createOption("web-test-svelte", "Svelte")
105
103
  ],
106
104
  { required: true }
107
105
  ),
@@ -109,18 +107,18 @@ var categoriesWithFramework = [
109
107
  "styling",
110
108
  "Styling",
111
109
  [
112
- createOption("scss-mod", "SCSS Modules"),
113
- createOption("tailwind", "Tailwind", { state: "recommended" }),
114
- createOption("styled", "Styled Components"),
115
- createOption("vanilla", "Vanilla CSS")
110
+ createOption("web-scss-mod", "SCSS Modules"),
111
+ createOption("web-test-tailwind", "Tailwind", { state: "recommended" }),
112
+ createOption("web-test-styled", "Styled Components"),
113
+ createOption("web-test-vanilla", "Vanilla CSS")
116
114
  ],
117
115
  { required: true }
118
116
  ),
119
117
  createCategory("client-state", "Client State", [
120
- createOption("zustand", "Zustand", { state: "recommended" }),
121
- createOption("jotai", "Jotai"),
122
- createOption("redux", "Redux", { state: "discouraged" }),
123
- createOption("mobx", "MobX")
118
+ createOption("web-test-zustand", "Zustand", { state: "recommended" }),
119
+ createOption("web-test-jotai", "Jotai"),
120
+ createOption("web-test-redux", "Redux", { state: "discouraged" }),
121
+ createOption("web-test-mobx", "MobX")
124
122
  ])
125
123
  ];
126
124
  var defaultProps = {
@@ -131,8 +129,7 @@ var defaultProps = {
131
129
  expertMode: false,
132
130
  onToggle: vi.fn(),
133
131
  onFocusChange: vi.fn(),
134
- onToggleDescriptions: vi.fn(),
135
- onToggleExpertMode: vi.fn()
132
+ onToggleDescriptions: vi.fn()
136
133
  };
137
134
  var renderGrid = (props = {}) => {
138
135
  return render(/* @__PURE__ */ jsx(CategoryGrid, { ...defaultProps, ...props }));
@@ -142,7 +139,6 @@ describe("CategoryGrid component", () => {
142
139
  afterEach(() => {
143
140
  cleanup?.();
144
141
  cleanup = void 0;
145
- vi.clearAllMocks();
146
142
  });
147
143
  describe("rendering", () => {
148
144
  it("should render all categories as sections", () => {
@@ -178,23 +174,6 @@ describe("CategoryGrid component", () => {
178
174
  const output = lastFrame();
179
175
  globalExpect(output).not.toContain("(optional)");
180
176
  });
181
- it("should render legend row with visual states", () => {
182
- const { lastFrame, unmount } = renderGrid();
183
- cleanup = unmount;
184
- const output = lastFrame();
185
- globalExpect(output).toContain("Legend:");
186
- globalExpect(output).toContain("selected");
187
- globalExpect(output).toContain("recommended");
188
- globalExpect(output).toContain("discouraged");
189
- globalExpect(output).toContain("disabled");
190
- });
191
- it("should render header with toggle hints", () => {
192
- const { lastFrame, unmount } = renderGrid();
193
- cleanup = unmount;
194
- const output = lastFrame();
195
- globalExpect(output).toContain("[d] Descriptions");
196
- globalExpect(output).toContain("[e] Expert Mode");
197
- });
198
177
  it("should handle empty categories array", () => {
199
178
  const { lastFrame, unmount } = renderGrid({ categories: [] });
200
179
  cleanup = unmount;
@@ -237,9 +216,9 @@ describe("CategoryGrid component", () => {
237
216
  });
238
217
  it("should show disabled options with dimmed styling", () => {
239
218
  const categories = [
240
- createCategory("test", "Test", [
241
- createOption("opt1", "Option 1"),
242
- createOption("opt2", "Option 2", { state: "disabled" })
219
+ createCategory("testing", "Test", [
220
+ createOption("web-test-opt1", "Option 1"),
221
+ createOption("web-test-opt2", "Option 2", { state: "disabled" })
243
222
  ])
244
223
  ];
245
224
  const { lastFrame, unmount } = renderGrid({ categories });
@@ -270,10 +249,10 @@ describe("CategoryGrid component", () => {
270
249
  it("should not lock any sections when no framework category exists", () => {
271
250
  const categoriesNoFramework = [
272
251
  createCategory("styling", "Styling", [
273
- createOption("scss", "SCSS"),
274
- createOption("tailwind", "Tailwind")
252
+ createOption("web-test-scss", "SCSS"),
253
+ createOption("web-test-tailwind", "Tailwind")
275
254
  ]),
276
- createCategory("state", "State", [createOption("zustand", "Zustand")])
255
+ createCategory("client-state", "State", [createOption("web-test-zustand", "Zustand")])
277
256
  ];
278
257
  const { lastFrame, unmount } = renderGrid({
279
258
  categories: categoriesNoFramework
@@ -488,7 +467,7 @@ describe("CategoryGrid component", () => {
488
467
  await delay(RENDER_DELAY_MS);
489
468
  await stdin.write(" ");
490
469
  await delay(INPUT_DELAY_MS);
491
- globalExpect(onToggle).toHaveBeenCalledWith("framework", "vue");
470
+ globalExpect(onToggle).toHaveBeenCalledWith("framework", "web-test-vue");
492
471
  });
493
472
  it("should call onToggle when pressing space on a selected option", async () => {
494
473
  const onToggle = vi.fn();
@@ -497,8 +476,8 @@ describe("CategoryGrid component", () => {
497
476
  "framework",
498
477
  "Framework",
499
478
  [
500
- createOption("react", "React", { selected: true }),
501
- createOption("vue", "Vue")
479
+ createOption("web-test-react", "React", { selected: true }),
480
+ createOption("web-test-vue", "Vue")
502
481
  ],
503
482
  { required: true }
504
483
  )
@@ -515,14 +494,14 @@ describe("CategoryGrid component", () => {
515
494
  await delay(RENDER_DELAY_MS);
516
495
  await stdin.write(" ");
517
496
  await delay(INPUT_DELAY_MS);
518
- globalExpect(onToggle).toHaveBeenCalledWith("framework", "react");
497
+ globalExpect(onToggle).toHaveBeenCalledWith("framework", "web-test-react");
519
498
  });
520
499
  it("should NOT call onToggle when pressing space on a disabled option", async () => {
521
500
  const onToggle = vi.fn();
522
501
  const categories = [
523
- createCategory("test", "Test", [
524
- createOption("opt1", "Option 1", { state: "disabled" }),
525
- createOption("opt2", "Option 2")
502
+ createCategory("testing", "Test", [
503
+ createOption("web-test-opt1", "Option 1", { state: "disabled" }),
504
+ createOption("web-test-opt2", "Option 2")
526
505
  ])
527
506
  ];
528
507
  const { stdin, unmount } = renderGrid({
@@ -558,10 +537,10 @@ describe("CategoryGrid component", () => {
558
537
  it("should skip disabled options when navigating right", async () => {
559
538
  const onFocusChange = vi.fn();
560
539
  const categories = [
561
- createCategory("test", "Test", [
562
- createOption("opt1", "Option 1"),
563
- createOption("opt2", "Option 2", { state: "disabled" }),
564
- createOption("opt3", "Option 3")
540
+ createCategory("testing", "Test", [
541
+ createOption("web-test-opt1", "Option 1"),
542
+ createOption("web-test-opt2", "Option 2", { state: "disabled" }),
543
+ createOption("web-test-opt3", "Option 3")
565
544
  ])
566
545
  ];
567
546
  const { stdin, unmount } = renderGrid({
@@ -580,10 +559,10 @@ describe("CategoryGrid component", () => {
580
559
  it("should skip disabled options when navigating left", async () => {
581
560
  const onFocusChange = vi.fn();
582
561
  const categories = [
583
- createCategory("test", "Test", [
584
- createOption("opt1", "Option 1"),
585
- createOption("opt2", "Option 2", { state: "disabled" }),
586
- createOption("opt3", "Option 3")
562
+ createCategory("testing", "Test", [
563
+ createOption("web-test-opt1", "Option 1"),
564
+ createOption("web-test-opt2", "Option 2", { state: "disabled" }),
565
+ createOption("web-test-opt3", "Option 3")
587
566
  ])
588
567
  ];
589
568
  const { stdin, unmount } = renderGrid({
@@ -603,9 +582,9 @@ describe("CategoryGrid component", () => {
603
582
  it("should handle all options disabled in a row", async () => {
604
583
  const onFocusChange = vi.fn();
605
584
  const categories = [
606
- createCategory("test", "Test", [
607
- createOption("opt1", "Option 1", { state: "disabled" }),
608
- createOption("opt2", "Option 2", { state: "disabled" })
585
+ createCategory("testing", "Test", [
586
+ createOption("web-test-opt1", "Option 1", { state: "disabled" }),
587
+ createOption("web-test-opt2", "Option 2", { state: "disabled" })
609
588
  ])
610
589
  ];
611
590
  const { stdin, unmount } = renderGrid({
@@ -683,57 +662,21 @@ describe("CategoryGrid component", () => {
683
662
  const output = lastFrame();
684
663
  globalExpect(output).toBeDefined();
685
664
  });
686
- it("should show toggle state in header", () => {
687
- const { lastFrame: frame1, unmount: unmount1 } = renderGrid({
688
- showDescriptions: false
689
- });
690
- const output1 = frame1();
691
- unmount1();
692
- const { lastFrame: frame2, unmount: unmount2 } = renderGrid({
665
+ it("should show descriptions when enabled", () => {
666
+ const { lastFrame, unmount } = renderGrid({
693
667
  showDescriptions: true
694
668
  });
695
- cleanup = unmount2;
696
- const output2 = frame2();
697
- globalExpect(output1).toContain("Descriptions: OFF");
698
- globalExpect(output2).toContain("Descriptions: ON");
699
- });
700
- });
701
- describe("expert mode toggle", () => {
702
- it("should call onToggleExpertMode when pressing e", async () => {
703
- const onToggleExpertMode = vi.fn();
704
- const { stdin, unmount } = renderGrid({
705
- onToggleExpertMode
706
- });
707
669
  cleanup = unmount;
708
- await delay(RENDER_DELAY_MS);
709
- await stdin.write("e");
710
- await delay(INPUT_DELAY_MS);
711
- globalExpect(onToggleExpertMode).toHaveBeenCalled();
670
+ const output = lastFrame();
671
+ globalExpect(output).toContain("Popular choice");
712
672
  });
713
- it("should call onToggleExpertMode when pressing E (uppercase)", async () => {
714
- const onToggleExpertMode = vi.fn();
715
- const { stdin, unmount } = renderGrid({
716
- onToggleExpertMode
717
- });
673
+ });
674
+ describe("expert mode", () => {
675
+ it("should not handle expert mode toggle locally (handled globally)", () => {
676
+ const { lastFrame, unmount } = renderGrid();
718
677
  cleanup = unmount;
719
- await delay(RENDER_DELAY_MS);
720
- await stdin.write("E");
721
- await delay(INPUT_DELAY_MS);
722
- globalExpect(onToggleExpertMode).toHaveBeenCalled();
723
- });
724
- it("should show toggle state in header", () => {
725
- const { lastFrame: frame1, unmount: unmount1 } = renderGrid({
726
- expertMode: false
727
- });
728
- const output1 = frame1();
729
- unmount1();
730
- const { lastFrame: frame2, unmount: unmount2 } = renderGrid({
731
- expertMode: true
732
- });
733
- cleanup = unmount2;
734
- const output2 = frame2();
735
- globalExpect(output1).toContain("Expert Mode: OFF");
736
- globalExpect(output2).toContain("Expert Mode: ON");
678
+ const output = lastFrame();
679
+ globalExpect(output).not.toContain("[e] Expert Mode");
737
680
  });
738
681
  });
739
682
  describe("option ordering", () => {
@@ -753,9 +696,7 @@ describe("CategoryGrid component", () => {
753
696
  describe("edge cases", () => {
754
697
  it("should handle single category", () => {
755
698
  const categories = [
756
- createCategory("single", "Single Category", [
757
- createOption("opt1", "Option 1")
758
- ])
699
+ createCategory("forms", "Single Category", [createOption("web-test-opt1", "Option 1")])
759
700
  ];
760
701
  const { lastFrame, unmount } = renderGrid({ categories });
761
702
  cleanup = unmount;
@@ -765,9 +706,7 @@ describe("CategoryGrid component", () => {
765
706
  });
766
707
  it("should handle single option in category", () => {
767
708
  const categories = [
768
- createCategory("single", "Single", [
769
- createOption("only", "Only Option")
770
- ])
709
+ createCategory("forms", "Single", [createOption("web-test-only", "Only Option")])
771
710
  ];
772
711
  const { lastFrame, unmount } = renderGrid({ categories });
773
712
  cleanup = unmount;
@@ -777,11 +716,9 @@ describe("CategoryGrid component", () => {
777
716
  it("should handle category with many options (flows naturally)", () => {
778
717
  const options = Array.from(
779
718
  { length: 10 },
780
- (_, i) => createOption(`opt${i}`, `Option ${i}`)
719
+ (_, i) => createOption(`web-test-opt${i}`, `Option ${i}`)
781
720
  );
782
- const categories = [
783
- createCategory("many", "Many Options", options)
784
- ];
721
+ const categories = [createCategory("mocking", "Many Options", options)];
785
722
  const { lastFrame, unmount } = renderGrid({ categories });
786
723
  cleanup = unmount;
787
724
  const output = lastFrame();
@@ -791,9 +728,9 @@ describe("CategoryGrid component", () => {
791
728
  });
792
729
  it("should handle long option labels", () => {
793
730
  const categories = [
794
- createCategory("long", "Long Labels", [
795
- createOption("long1", "Very Long Option Name"),
796
- createOption("long2", "Another Long Name")
731
+ createCategory("i18n", "Long Labels", [
732
+ createOption("web-test-long1", "Very Long Option Name"),
733
+ createOption("web-test-long2", "Another Long Name")
797
734
  ])
798
735
  ];
799
736
  const { lastFrame, unmount } = renderGrid({ categories });
@@ -803,17 +740,15 @@ describe("CategoryGrid component", () => {
803
740
  });
804
741
  it("should handle categories with different option counts", () => {
805
742
  const categories = [
806
- createCategory("cat1", "Category 1", [
807
- createOption("opt1", "Option 1"),
808
- createOption("opt2", "Option 2")
743
+ createCategory("framework", "Category 1", [
744
+ createOption("web-test-opt1", "Option 1"),
745
+ createOption("web-test-opt2", "Option 2")
809
746
  ]),
810
- createCategory("cat2", "Category 2", [
811
- createOption("opt3", "Option 3")
812
- ]),
813
- createCategory("cat3", "Category 3", [
814
- createOption("opt4", "Option 4"),
815
- createOption("opt5", "Option 5"),
816
- createOption("opt6", "Option 6")
747
+ createCategory("styling", "Category 2", [createOption("web-test-opt3", "Option 3")]),
748
+ createCategory("client-state", "Category 3", [
749
+ createOption("web-test-opt4", "Option 4"),
750
+ createOption("web-test-opt5", "Option 5"),
751
+ createOption("web-test-opt6", "Option 6")
817
752
  ])
818
753
  ];
819
754
  const { lastFrame, unmount } = renderGrid({ categories });
@@ -832,16 +767,14 @@ describe("CategoryGrid component", () => {
832
767
  "framework",
833
768
  "Framework",
834
769
  [
835
- createOption("opt1", "Option 1", { selected: true }),
770
+ createOption("web-test-opt1", "Option 1", { selected: true }),
836
771
  // Framework selected
837
- createOption("opt2", "Option 2"),
838
- createOption("opt3", "Option 3")
772
+ createOption("web-test-opt2", "Option 2"),
773
+ createOption("web-test-opt3", "Option 3")
839
774
  ],
840
775
  { required: true }
841
776
  ),
842
- createCategory("cat2", "Category 2", [
843
- createOption("opt4", "Option 4")
844
- ])
777
+ createCategory("styling", "Category 2", [createOption("web-test-opt4", "Option 4")])
845
778
  ];
846
779
  const { stdin, unmount } = renderGrid({
847
780
  categories,
@@ -857,5 +790,54 @@ describe("CategoryGrid component", () => {
857
790
  globalExpect(onFocusChange).toHaveBeenCalledWith(1, 0);
858
791
  });
859
792
  });
793
+ describe("installed indicator", () => {
794
+ it("should show checkmark for installed skill", () => {
795
+ const categories = [
796
+ createCategory("forms", "Forms", [
797
+ createOption("web-test-opt1", "Option 1", { installed: true })
798
+ ])
799
+ ];
800
+ const { lastFrame, unmount } = renderGrid({ categories });
801
+ cleanup = unmount;
802
+ const output = lastFrame();
803
+ globalExpect(output).toContain("\u2713");
804
+ globalExpect(output).toContain("Option 1");
805
+ });
806
+ it("should NOT show checkmark for non-installed skill", () => {
807
+ const categories = [
808
+ createCategory("forms", "Forms", [createOption("web-test-opt1", "Option 1")])
809
+ ];
810
+ const { lastFrame, unmount } = renderGrid({ categories });
811
+ cleanup = unmount;
812
+ const output = lastFrame();
813
+ globalExpect(output).not.toContain("\u2713");
814
+ globalExpect(output).toContain("Option 1");
815
+ });
816
+ it("should show both checkmark and cyan styling when installed and selected", () => {
817
+ const categories = [
818
+ createCategory("forms", "Forms", [
819
+ createOption("web-test-opt1", "Option 1", { installed: true, selected: true })
820
+ ])
821
+ ];
822
+ const { lastFrame, unmount } = renderGrid({ categories });
823
+ cleanup = unmount;
824
+ const output = lastFrame();
825
+ globalExpect(output).toContain("\u2713");
826
+ globalExpect(output).toContain("Option 1");
827
+ });
828
+ it("should show both L badge and checkmark when local and installed", () => {
829
+ const categories = [
830
+ createCategory("forms", "Forms", [
831
+ createOption("web-test-opt1", "Option 1", { local: true, installed: true })
832
+ ])
833
+ ];
834
+ const { lastFrame, unmount } = renderGrid({ categories });
835
+ cleanup = unmount;
836
+ const output = lastFrame();
837
+ globalExpect(output).toContain("L");
838
+ globalExpect(output).toContain("\u2713");
839
+ globalExpect(output).toContain("Option 1");
840
+ });
841
+ });
860
842
  });
861
843
  //# sourceMappingURL=category-grid.test.js.map