@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,500 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ ARROW_DOWN,
4
+ ARROW_LEFT,
5
+ ARROW_RIGHT,
6
+ ARROW_UP,
7
+ ENTER,
8
+ ESCAPE,
9
+ INPUT_DELAY_MS,
10
+ RENDER_DELAY_MS,
11
+ SPACE,
12
+ delay
13
+ } from "../../chunk-DBRUQQUF.js";
14
+ import {
15
+ render
16
+ } from "../../chunk-REJGRCVQ.js";
17
+ import {
18
+ afterEach,
19
+ describe,
20
+ globalExpect,
21
+ it,
22
+ vi
23
+ } from "../../chunk-QR2EBWL2.js";
24
+ import {
25
+ SourceGrid
26
+ } from "../../chunk-ZW2PELOH.js";
27
+ import "../../chunk-4S4FCAA2.js";
28
+ import {
29
+ init_esm_shims
30
+ } from "../../chunk-AWKZ5BDL.js";
31
+
32
+ // src/cli/components/wizard/source-grid.test.tsx
33
+ init_esm_shims();
34
+ import { jsx } from "react/jsx-runtime";
35
+ var createSourceOption = (id, label, overrides = {}) => ({
36
+ id,
37
+ label,
38
+ selected: false,
39
+ installed: false,
40
+ ...overrides
41
+ });
42
+ var createSourceRow = (skillId, displayName, options) => ({
43
+ skillId,
44
+ displayName,
45
+ alias: displayName,
46
+ options
47
+ });
48
+ var defaultRows = [
49
+ createSourceRow("web-framework-react", "react", [
50
+ createSourceOption("public", "Public", { selected: true })
51
+ ]),
52
+ createSourceRow("web-state-zustand", "zustand", [
53
+ createSourceOption("public", "Public", { selected: true })
54
+ ]),
55
+ createSourceRow("web-testing-vitest", "vitest", [
56
+ createSourceOption("public", "Public", { selected: true })
57
+ ])
58
+ ];
59
+ var multiSourceRows = [
60
+ createSourceRow("web-framework-react", "react", [
61
+ createSourceOption("public", "Public", { selected: true }),
62
+ createSourceOption("acme-corp", "Acme Corp")
63
+ ]),
64
+ createSourceRow("web-state-zustand", "zustand", [
65
+ createSourceOption("public", "Public", { selected: true }),
66
+ createSourceOption("acme-corp", "Acme Corp"),
67
+ createSourceOption("internal", "Internal")
68
+ ])
69
+ ];
70
+ var defaultProps = {
71
+ rows: defaultRows,
72
+ focusedRow: 0,
73
+ focusedCol: 0,
74
+ onSelect: vi.fn(),
75
+ onFocusChange: vi.fn()
76
+ };
77
+ var renderGrid = (props = {}) => {
78
+ return render(/* @__PURE__ */ jsx(SourceGrid, { ...defaultProps, ...props }));
79
+ };
80
+ describe("SourceGrid component", () => {
81
+ let cleanup;
82
+ afterEach(() => {
83
+ cleanup?.();
84
+ cleanup = void 0;
85
+ });
86
+ describe("rendering", () => {
87
+ it("should render all skill rows", () => {
88
+ const { lastFrame, unmount } = renderGrid();
89
+ cleanup = unmount;
90
+ const output = lastFrame();
91
+ globalExpect(output).toContain("react");
92
+ globalExpect(output).toContain("zustand");
93
+ globalExpect(output).toContain("vitest");
94
+ });
95
+ it("should render source option labels", () => {
96
+ const { lastFrame, unmount } = renderGrid();
97
+ cleanup = unmount;
98
+ const output = lastFrame();
99
+ globalExpect(output).toContain("Public");
100
+ });
101
+ it("should render multiple source options per row", () => {
102
+ const { lastFrame, unmount } = renderGrid({ rows: multiSourceRows });
103
+ cleanup = unmount;
104
+ const output = lastFrame();
105
+ globalExpect(output).toContain("Public");
106
+ globalExpect(output).toContain("Acme Corp");
107
+ });
108
+ it("should handle empty rows array", () => {
109
+ const { lastFrame, unmount } = renderGrid({ rows: [] });
110
+ cleanup = unmount;
111
+ const output = lastFrame();
112
+ globalExpect(output).toContain("No skills to display");
113
+ });
114
+ it("should render single row", () => {
115
+ const rows = [
116
+ createSourceRow("web-framework-react", "react", [
117
+ createSourceOption("public", "Public", { selected: true })
118
+ ])
119
+ ];
120
+ const { lastFrame, unmount } = renderGrid({ rows });
121
+ cleanup = unmount;
122
+ const output = lastFrame();
123
+ globalExpect(output).toContain("react");
124
+ globalExpect(output).toContain("Public");
125
+ });
126
+ });
127
+ describe("keyboard navigation - vertical", () => {
128
+ it("should move down with arrow down", async () => {
129
+ const onFocusChange = vi.fn();
130
+ const { stdin, unmount } = renderGrid({
131
+ focusedRow: 0,
132
+ focusedCol: 0,
133
+ onFocusChange
134
+ });
135
+ cleanup = unmount;
136
+ await delay(RENDER_DELAY_MS);
137
+ stdin.write(ARROW_DOWN);
138
+ await delay(INPUT_DELAY_MS);
139
+ globalExpect(onFocusChange).toHaveBeenCalledWith(1, 0);
140
+ });
141
+ it("should move up with arrow up", async () => {
142
+ const onFocusChange = vi.fn();
143
+ const { stdin, unmount } = renderGrid({
144
+ focusedRow: 1,
145
+ focusedCol: 0,
146
+ onFocusChange
147
+ });
148
+ cleanup = unmount;
149
+ await delay(RENDER_DELAY_MS);
150
+ stdin.write(ARROW_UP);
151
+ await delay(INPUT_DELAY_MS);
152
+ globalExpect(onFocusChange).toHaveBeenCalledWith(0, 0);
153
+ });
154
+ it("should wrap down to first row from last row", async () => {
155
+ const onFocusChange = vi.fn();
156
+ const { stdin, unmount } = renderGrid({
157
+ focusedRow: 2,
158
+ // Last row (Vitest)
159
+ focusedCol: 0,
160
+ onFocusChange
161
+ });
162
+ cleanup = unmount;
163
+ await delay(RENDER_DELAY_MS);
164
+ stdin.write(ARROW_DOWN);
165
+ await delay(INPUT_DELAY_MS);
166
+ globalExpect(onFocusChange).toHaveBeenCalledWith(0, 0);
167
+ });
168
+ it("should wrap up to last row from first row", async () => {
169
+ const onFocusChange = vi.fn();
170
+ const { stdin, unmount } = renderGrid({
171
+ focusedRow: 0,
172
+ focusedCol: 0,
173
+ onFocusChange
174
+ });
175
+ cleanup = unmount;
176
+ await delay(RENDER_DELAY_MS);
177
+ stdin.write(ARROW_UP);
178
+ await delay(INPUT_DELAY_MS);
179
+ globalExpect(onFocusChange).toHaveBeenCalledWith(2, 0);
180
+ });
181
+ it("should clamp column when moving to row with fewer options", async () => {
182
+ const onFocusChange = vi.fn();
183
+ const { stdin, unmount } = renderGrid({
184
+ rows: multiSourceRows,
185
+ focusedRow: 1,
186
+ // Zustand has 3 options
187
+ focusedCol: 2,
188
+ // Internal (index 2)
189
+ onFocusChange
190
+ });
191
+ cleanup = unmount;
192
+ await delay(RENDER_DELAY_MS);
193
+ stdin.write(ARROW_UP);
194
+ await delay(INPUT_DELAY_MS);
195
+ globalExpect(onFocusChange).toHaveBeenCalledWith(0, 1);
196
+ });
197
+ });
198
+ describe("keyboard navigation - horizontal", () => {
199
+ it("should move right with arrow right", async () => {
200
+ const onFocusChange = vi.fn();
201
+ const { stdin, unmount } = renderGrid({
202
+ rows: multiSourceRows,
203
+ focusedRow: 0,
204
+ focusedCol: 0,
205
+ onFocusChange
206
+ });
207
+ cleanup = unmount;
208
+ await delay(RENDER_DELAY_MS);
209
+ stdin.write(ARROW_RIGHT);
210
+ await delay(INPUT_DELAY_MS);
211
+ globalExpect(onFocusChange).toHaveBeenCalledWith(0, 1);
212
+ });
213
+ it("should move left with arrow left", async () => {
214
+ const onFocusChange = vi.fn();
215
+ const { stdin, unmount } = renderGrid({
216
+ rows: multiSourceRows,
217
+ focusedRow: 0,
218
+ focusedCol: 1,
219
+ onFocusChange
220
+ });
221
+ cleanup = unmount;
222
+ await delay(RENDER_DELAY_MS);
223
+ stdin.write(ARROW_LEFT);
224
+ await delay(INPUT_DELAY_MS);
225
+ globalExpect(onFocusChange).toHaveBeenCalledWith(0, 0);
226
+ });
227
+ it("should wrap right to first column from last column", async () => {
228
+ const onFocusChange = vi.fn();
229
+ const { stdin, unmount } = renderGrid({
230
+ rows: multiSourceRows,
231
+ focusedRow: 0,
232
+ focusedCol: 1,
233
+ // Last option in React row
234
+ onFocusChange
235
+ });
236
+ cleanup = unmount;
237
+ await delay(RENDER_DELAY_MS);
238
+ stdin.write(ARROW_RIGHT);
239
+ await delay(INPUT_DELAY_MS);
240
+ globalExpect(onFocusChange).toHaveBeenCalledWith(0, 0);
241
+ });
242
+ it("should wrap left to last column from first column", async () => {
243
+ const onFocusChange = vi.fn();
244
+ const { stdin, unmount } = renderGrid({
245
+ rows: multiSourceRows,
246
+ focusedRow: 0,
247
+ focusedCol: 0,
248
+ onFocusChange
249
+ });
250
+ cleanup = unmount;
251
+ await delay(RENDER_DELAY_MS);
252
+ stdin.write(ARROW_LEFT);
253
+ await delay(INPUT_DELAY_MS);
254
+ globalExpect(onFocusChange).toHaveBeenCalledWith(0, 1);
255
+ });
256
+ });
257
+ describe("selection", () => {
258
+ it("should call onSelect when pressing space", async () => {
259
+ const onSelect = vi.fn();
260
+ const { stdin, unmount } = renderGrid({
261
+ focusedRow: 0,
262
+ focusedCol: 0,
263
+ onSelect
264
+ });
265
+ cleanup = unmount;
266
+ await delay(RENDER_DELAY_MS);
267
+ stdin.write(" ");
268
+ await delay(INPUT_DELAY_MS);
269
+ globalExpect(onSelect).toHaveBeenCalledWith("web-framework-react", "public");
270
+ });
271
+ it("should call onSelect with correct skill and source IDs", async () => {
272
+ const onSelect = vi.fn();
273
+ const { stdin, unmount } = renderGrid({
274
+ rows: multiSourceRows,
275
+ focusedRow: 0,
276
+ focusedCol: 1,
277
+ // Acme Corp
278
+ onSelect
279
+ });
280
+ cleanup = unmount;
281
+ await delay(RENDER_DELAY_MS);
282
+ stdin.write(" ");
283
+ await delay(INPUT_DELAY_MS);
284
+ globalExpect(onSelect).toHaveBeenCalledWith("web-framework-react", "acme-corp");
285
+ });
286
+ it("should call onSelect on second row", async () => {
287
+ const onSelect = vi.fn();
288
+ const { stdin, unmount } = renderGrid({
289
+ rows: multiSourceRows,
290
+ focusedRow: 1,
291
+ focusedCol: 2,
292
+ // Internal
293
+ onSelect
294
+ });
295
+ cleanup = unmount;
296
+ await delay(RENDER_DELAY_MS);
297
+ stdin.write(" ");
298
+ await delay(INPUT_DELAY_MS);
299
+ globalExpect(onSelect).toHaveBeenCalledWith("web-state-zustand", "internal");
300
+ });
301
+ });
302
+ describe("edge cases", () => {
303
+ it("should handle single option per row", async () => {
304
+ const onFocusChange = vi.fn();
305
+ const { stdin, unmount } = renderGrid({
306
+ focusedRow: 0,
307
+ focusedCol: 0,
308
+ onFocusChange
309
+ });
310
+ cleanup = unmount;
311
+ await delay(RENDER_DELAY_MS);
312
+ stdin.write(ARROW_RIGHT);
313
+ await delay(INPUT_DELAY_MS);
314
+ globalExpect(onFocusChange).toHaveBeenCalledWith(0, 0);
315
+ });
316
+ it("should handle many rows", () => {
317
+ const rows = Array.from(
318
+ { length: 10 },
319
+ (_, i) => createSourceRow(`web-test-${i}`, `test-${i}`, [
320
+ createSourceOption("public", "Public", { selected: true })
321
+ ])
322
+ );
323
+ const { lastFrame, unmount } = renderGrid({ rows });
324
+ cleanup = unmount;
325
+ const output = lastFrame();
326
+ globalExpect(output).toContain("test-0");
327
+ globalExpect(output).toContain("test-9");
328
+ });
329
+ });
330
+ describe("search pill", () => {
331
+ const mockSearch = vi.fn();
332
+ const mockBind = vi.fn();
333
+ const mockSearchStateChange = vi.fn();
334
+ const searchCandidates = [
335
+ {
336
+ id: "web-framework-react-pro",
337
+ sourceUrl: "github:awesome-dev/skills",
338
+ sourceName: "awesome-dev",
339
+ alias: "react",
340
+ version: 3,
341
+ description: "Opinionated React with strict TS"
342
+ },
343
+ {
344
+ id: "web-framework-react-strict",
345
+ sourceUrl: "github:team-xyz/skills",
346
+ sourceName: "team-xyz",
347
+ alias: "react",
348
+ version: 1,
349
+ description: "Strict mode React"
350
+ }
351
+ ];
352
+ afterEach(() => {
353
+ mockSearch.mockReset();
354
+ mockBind.mockReset();
355
+ mockSearchStateChange.mockReset();
356
+ });
357
+ it("should render search pill at end of each row when onSearch is provided", () => {
358
+ const { lastFrame, unmount } = renderGrid({
359
+ onSearch: mockSearch
360
+ });
361
+ cleanup = unmount;
362
+ const output = lastFrame();
363
+ globalExpect(output).toContain("Search");
364
+ });
365
+ it("should not render search pill when onSearch is not provided", () => {
366
+ const { lastFrame, unmount } = renderGrid();
367
+ cleanup = unmount;
368
+ const output = lastFrame();
369
+ globalExpect(output).not.toContain("Search");
370
+ });
371
+ it("should navigate to search pill with arrow right", async () => {
372
+ const onFocusChange = vi.fn();
373
+ const { stdin, unmount } = renderGrid({
374
+ rows: defaultRows,
375
+ focusedRow: 0,
376
+ focusedCol: 0,
377
+ // On the only option (Public)
378
+ onFocusChange,
379
+ onSearch: mockSearch
380
+ });
381
+ cleanup = unmount;
382
+ await delay(RENDER_DELAY_MS);
383
+ stdin.write(ARROW_RIGHT);
384
+ await delay(INPUT_DELAY_MS);
385
+ globalExpect(onFocusChange).toHaveBeenCalledWith(0, 1);
386
+ });
387
+ it("should not call onSelect when space is pressed on search pill", async () => {
388
+ const onSelect = vi.fn();
389
+ const { stdin, unmount } = renderGrid({
390
+ rows: defaultRows,
391
+ focusedRow: 0,
392
+ focusedCol: 1,
393
+ // Search pill position (after Public)
394
+ onSelect,
395
+ onSearch: mockSearch
396
+ });
397
+ cleanup = unmount;
398
+ await delay(RENDER_DELAY_MS);
399
+ stdin.write(" ");
400
+ await delay(INPUT_DELAY_MS);
401
+ globalExpect(onSelect).not.toHaveBeenCalled();
402
+ });
403
+ it("should trigger search on Space when search pill is focused", async () => {
404
+ mockSearch.mockResolvedValue(searchCandidates);
405
+ const { stdin, unmount } = renderGrid({
406
+ rows: defaultRows,
407
+ focusedRow: 0,
408
+ focusedCol: 1,
409
+ // Search pill position
410
+ onSearch: mockSearch,
411
+ onSearchStateChange: mockSearchStateChange
412
+ });
413
+ cleanup = unmount;
414
+ await delay(RENDER_DELAY_MS);
415
+ stdin.write(SPACE);
416
+ await delay(INPUT_DELAY_MS);
417
+ globalExpect(mockSearch).toHaveBeenCalledWith("react");
418
+ globalExpect(mockSearchStateChange).toHaveBeenCalledWith(true);
419
+ });
420
+ it("should render modal with results after search completes", async () => {
421
+ mockSearch.mockResolvedValue(searchCandidates);
422
+ const { stdin, lastFrame, unmount } = renderGrid({
423
+ rows: defaultRows,
424
+ focusedRow: 0,
425
+ focusedCol: 1,
426
+ onSearch: mockSearch
427
+ });
428
+ cleanup = unmount;
429
+ await delay(RENDER_DELAY_MS);
430
+ stdin.write(SPACE);
431
+ await delay(RENDER_DELAY_MS);
432
+ const output = lastFrame();
433
+ globalExpect(output).toContain("react");
434
+ globalExpect(output).toContain("awesome-dev");
435
+ globalExpect(output).toContain("team-xyz");
436
+ });
437
+ it("should close modal on Escape without binding", async () => {
438
+ mockSearch.mockResolvedValue(searchCandidates);
439
+ const { stdin, lastFrame, unmount } = renderGrid({
440
+ rows: defaultRows,
441
+ focusedRow: 0,
442
+ focusedCol: 1,
443
+ onSearch: mockSearch,
444
+ onBind: mockBind,
445
+ onSearchStateChange: mockSearchStateChange
446
+ });
447
+ cleanup = unmount;
448
+ await delay(RENDER_DELAY_MS);
449
+ stdin.write(SPACE);
450
+ await delay(RENDER_DELAY_MS);
451
+ stdin.write(ESCAPE);
452
+ await delay(INPUT_DELAY_MS);
453
+ globalExpect(mockBind).not.toHaveBeenCalled();
454
+ globalExpect(mockSearchStateChange).toHaveBeenLastCalledWith(false);
455
+ const output = lastFrame();
456
+ globalExpect(output).not.toContain("awesome-dev");
457
+ });
458
+ it("should not respond to grid navigation while modal is open", async () => {
459
+ mockSearch.mockResolvedValue(searchCandidates);
460
+ const onFocusChange = vi.fn();
461
+ const { stdin, unmount } = renderGrid({
462
+ rows: defaultRows,
463
+ focusedRow: 0,
464
+ focusedCol: 1,
465
+ onSearch: mockSearch,
466
+ onFocusChange
467
+ });
468
+ cleanup = unmount;
469
+ await delay(RENDER_DELAY_MS);
470
+ stdin.write(SPACE);
471
+ await delay(RENDER_DELAY_MS);
472
+ onFocusChange.mockClear();
473
+ stdin.write(ARROW_LEFT);
474
+ await delay(INPUT_DELAY_MS);
475
+ stdin.write(ARROW_RIGHT);
476
+ await delay(INPUT_DELAY_MS);
477
+ globalExpect(onFocusChange).not.toHaveBeenCalled();
478
+ });
479
+ it("should bind result on Enter in modal", async () => {
480
+ mockSearch.mockResolvedValue(searchCandidates);
481
+ const { stdin, unmount } = renderGrid({
482
+ rows: defaultRows,
483
+ focusedRow: 0,
484
+ focusedCol: 1,
485
+ onSearch: mockSearch,
486
+ onBind: mockBind,
487
+ onSearchStateChange: mockSearchStateChange
488
+ });
489
+ cleanup = unmount;
490
+ await delay(RENDER_DELAY_MS);
491
+ stdin.write(SPACE);
492
+ await delay(RENDER_DELAY_MS);
493
+ stdin.write(ENTER);
494
+ await delay(INPUT_DELAY_MS);
495
+ globalExpect(mockBind).toHaveBeenCalledWith(searchCandidates[0]);
496
+ globalExpect(mockSearchStateChange).toHaveBeenLastCalledWith(false);
497
+ });
498
+ });
499
+ });
500
+ //# sourceMappingURL=source-grid.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/cli/components/wizard/source-grid.test.tsx"],"sourcesContent":["import React from \"react\";\nimport { render } from \"ink-testing-library\";\nimport { describe, expect, it, afterEach, vi } from \"vitest\";\nimport { SourceGrid, type SourceGridProps, type SourceRow, type SourceOption } from \"./source-grid\";\nimport type { BoundSkillCandidate, SkillId } from \"../../types\";\nimport {\n ARROW_UP,\n ARROW_DOWN,\n ARROW_LEFT,\n ARROW_RIGHT,\n ENTER,\n SPACE,\n ESCAPE,\n RENDER_DELAY_MS,\n INPUT_DELAY_MS,\n delay,\n} from \"../../lib/__tests__/test-constants\";\n\nconst createSourceOption = (\n id: string,\n label: string,\n overrides: Partial<SourceOption> = {},\n): SourceOption => ({\n id,\n label,\n selected: false,\n installed: false,\n ...overrides,\n});\n\nconst createSourceRow = (\n skillId: SkillId,\n displayName: string,\n options: SourceOption[],\n): SourceRow => ({\n skillId,\n displayName,\n alias: displayName,\n options,\n});\n\nconst defaultRows: SourceRow[] = [\n createSourceRow(\"web-framework-react\", \"react\", [\n createSourceOption(\"public\", \"Public\", { selected: true }),\n ]),\n createSourceRow(\"web-state-zustand\", \"zustand\", [\n createSourceOption(\"public\", \"Public\", { selected: true }),\n ]),\n createSourceRow(\"web-testing-vitest\", \"vitest\", [\n createSourceOption(\"public\", \"Public\", { selected: true }),\n ]),\n];\n\nconst multiSourceRows: SourceRow[] = [\n createSourceRow(\"web-framework-react\", \"react\", [\n createSourceOption(\"public\", \"Public\", { selected: true }),\n createSourceOption(\"acme-corp\", \"Acme Corp\"),\n ]),\n createSourceRow(\"web-state-zustand\", \"zustand\", [\n createSourceOption(\"public\", \"Public\", { selected: true }),\n createSourceOption(\"acme-corp\", \"Acme Corp\"),\n createSourceOption(\"internal\", \"Internal\"),\n ]),\n];\n\nconst defaultProps: SourceGridProps = {\n rows: defaultRows,\n focusedRow: 0,\n focusedCol: 0,\n onSelect: vi.fn(),\n onFocusChange: vi.fn(),\n};\n\nconst renderGrid = (props: Partial<SourceGridProps> = {}) => {\n return render(<SourceGrid {...defaultProps} {...props} />);\n};\n\ndescribe(\"SourceGrid component\", () => {\n let cleanup: (() => void) | undefined;\n\n afterEach(() => {\n cleanup?.();\n cleanup = undefined;\n });\n\n describe(\"rendering\", () => {\n it(\"should render all skill rows\", () => {\n const { lastFrame, unmount } = renderGrid();\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"react\");\n expect(output).toContain(\"zustand\");\n expect(output).toContain(\"vitest\");\n });\n\n it(\"should render source option labels\", () => {\n const { lastFrame, unmount } = renderGrid();\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Public\");\n });\n\n it(\"should render multiple source options per row\", () => {\n const { lastFrame, unmount } = renderGrid({ rows: multiSourceRows });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Public\");\n expect(output).toContain(\"Acme Corp\");\n });\n\n it(\"should handle empty rows array\", () => {\n const { lastFrame, unmount } = renderGrid({ rows: [] });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"No skills to display\");\n });\n\n it(\"should render single row\", () => {\n const rows: SourceRow[] = [\n createSourceRow(\"web-framework-react\", \"react\", [\n createSourceOption(\"public\", \"Public\", { selected: true }),\n ]),\n ];\n\n const { lastFrame, unmount } = renderGrid({ rows });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"react\");\n expect(output).toContain(\"Public\");\n });\n });\n\n describe(\"keyboard navigation - vertical\", () => {\n it(\"should move down with arrow down\", async () => {\n const onFocusChange = vi.fn();\n const { stdin, unmount } = renderGrid({\n focusedRow: 0,\n focusedCol: 0,\n onFocusChange,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n stdin.write(ARROW_DOWN);\n await delay(INPUT_DELAY_MS);\n\n expect(onFocusChange).toHaveBeenCalledWith(1, 0);\n });\n\n it(\"should move up with arrow up\", async () => {\n const onFocusChange = vi.fn();\n const { stdin, unmount } = renderGrid({\n focusedRow: 1,\n focusedCol: 0,\n onFocusChange,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n stdin.write(ARROW_UP);\n await delay(INPUT_DELAY_MS);\n\n expect(onFocusChange).toHaveBeenCalledWith(0, 0);\n });\n\n it(\"should wrap down to first row from last row\", async () => {\n const onFocusChange = vi.fn();\n const { stdin, unmount } = renderGrid({\n focusedRow: 2, // Last row (Vitest)\n focusedCol: 0,\n onFocusChange,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n stdin.write(ARROW_DOWN);\n await delay(INPUT_DELAY_MS);\n\n expect(onFocusChange).toHaveBeenCalledWith(0, 0);\n });\n\n it(\"should wrap up to last row from first row\", async () => {\n const onFocusChange = vi.fn();\n const { stdin, unmount } = renderGrid({\n focusedRow: 0,\n focusedCol: 0,\n onFocusChange,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n stdin.write(ARROW_UP);\n await delay(INPUT_DELAY_MS);\n\n expect(onFocusChange).toHaveBeenCalledWith(2, 0);\n });\n\n it(\"should clamp column when moving to row with fewer options\", async () => {\n const onFocusChange = vi.fn();\n const { stdin, unmount } = renderGrid({\n rows: multiSourceRows,\n focusedRow: 1, // Zustand has 3 options\n focusedCol: 2, // Internal (index 2)\n onFocusChange,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n stdin.write(ARROW_UP);\n await delay(INPUT_DELAY_MS);\n\n // React only has 2 options, so col should be clamped to 1\n expect(onFocusChange).toHaveBeenCalledWith(0, 1);\n });\n });\n\n describe(\"keyboard navigation - horizontal\", () => {\n it(\"should move right with arrow right\", async () => {\n const onFocusChange = vi.fn();\n const { stdin, unmount } = renderGrid({\n rows: multiSourceRows,\n focusedRow: 0,\n focusedCol: 0,\n onFocusChange,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n stdin.write(ARROW_RIGHT);\n await delay(INPUT_DELAY_MS);\n\n expect(onFocusChange).toHaveBeenCalledWith(0, 1);\n });\n\n it(\"should move left with arrow left\", async () => {\n const onFocusChange = vi.fn();\n const { stdin, unmount } = renderGrid({\n rows: multiSourceRows,\n focusedRow: 0,\n focusedCol: 1,\n onFocusChange,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n stdin.write(ARROW_LEFT);\n await delay(INPUT_DELAY_MS);\n\n expect(onFocusChange).toHaveBeenCalledWith(0, 0);\n });\n\n it(\"should wrap right to first column from last column\", async () => {\n const onFocusChange = vi.fn();\n const { stdin, unmount } = renderGrid({\n rows: multiSourceRows,\n focusedRow: 0,\n focusedCol: 1, // Last option in React row\n onFocusChange,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n stdin.write(ARROW_RIGHT);\n await delay(INPUT_DELAY_MS);\n\n expect(onFocusChange).toHaveBeenCalledWith(0, 0);\n });\n\n it(\"should wrap left to last column from first column\", async () => {\n const onFocusChange = vi.fn();\n const { stdin, unmount } = renderGrid({\n rows: multiSourceRows,\n focusedRow: 0,\n focusedCol: 0,\n onFocusChange,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n stdin.write(ARROW_LEFT);\n await delay(INPUT_DELAY_MS);\n\n expect(onFocusChange).toHaveBeenCalledWith(0, 1);\n });\n });\n\n describe(\"selection\", () => {\n it(\"should call onSelect when pressing space\", async () => {\n const onSelect = vi.fn();\n const { stdin, unmount } = renderGrid({\n focusedRow: 0,\n focusedCol: 0,\n onSelect,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n stdin.write(\" \");\n await delay(INPUT_DELAY_MS);\n\n expect(onSelect).toHaveBeenCalledWith(\"web-framework-react\", \"public\");\n });\n\n it(\"should call onSelect with correct skill and source IDs\", async () => {\n const onSelect = vi.fn();\n const { stdin, unmount } = renderGrid({\n rows: multiSourceRows,\n focusedRow: 0,\n focusedCol: 1, // Acme Corp\n onSelect,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n stdin.write(\" \");\n await delay(INPUT_DELAY_MS);\n\n expect(onSelect).toHaveBeenCalledWith(\"web-framework-react\", \"acme-corp\");\n });\n\n it(\"should call onSelect on second row\", async () => {\n const onSelect = vi.fn();\n const { stdin, unmount } = renderGrid({\n rows: multiSourceRows,\n focusedRow: 1,\n focusedCol: 2, // Internal\n onSelect,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n stdin.write(\" \");\n await delay(INPUT_DELAY_MS);\n\n expect(onSelect).toHaveBeenCalledWith(\"web-state-zustand\", \"internal\");\n });\n });\n\n describe(\"edge cases\", () => {\n it(\"should handle single option per row\", async () => {\n const onFocusChange = vi.fn();\n const { stdin, unmount } = renderGrid({\n focusedRow: 0,\n focusedCol: 0,\n onFocusChange,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n stdin.write(ARROW_RIGHT);\n await delay(INPUT_DELAY_MS);\n\n // Should wrap to 0 (only one option)\n expect(onFocusChange).toHaveBeenCalledWith(0, 0);\n });\n\n it(\"should handle many rows\", () => {\n const rows: SourceRow[] = Array.from({ length: 10 }, (_, i) =>\n createSourceRow(`web-test-${i}`, `test-${i}`, [\n createSourceOption(\"public\", \"Public\", { selected: true }),\n ]),\n );\n\n const { lastFrame, unmount } = renderGrid({ rows });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"test-0\");\n expect(output).toContain(\"test-9\");\n });\n });\n\n describe(\"search pill\", () => {\n const mockSearch = vi.fn<(alias: string) => Promise<BoundSkillCandidate[]>>();\n const mockBind = vi.fn();\n const mockSearchStateChange = vi.fn();\n\n const searchCandidates: BoundSkillCandidate[] = [\n {\n id: \"web-framework-react-pro\" as SkillId,\n sourceUrl: \"github:awesome-dev/skills\",\n sourceName: \"awesome-dev\",\n alias: \"react\",\n version: 3,\n description: \"Opinionated React with strict TS\",\n },\n {\n id: \"web-framework-react-strict\" as SkillId,\n sourceUrl: \"github:team-xyz/skills\",\n sourceName: \"team-xyz\",\n alias: \"react\",\n version: 1,\n description: \"Strict mode React\",\n },\n ];\n\n afterEach(() => {\n mockSearch.mockReset();\n mockBind.mockReset();\n mockSearchStateChange.mockReset();\n });\n\n it(\"should render search pill at end of each row when onSearch is provided\", () => {\n const { lastFrame, unmount } = renderGrid({\n onSearch: mockSearch,\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Search\");\n });\n\n it(\"should not render search pill when onSearch is not provided\", () => {\n const { lastFrame, unmount } = renderGrid();\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).not.toContain(\"Search\");\n });\n\n it(\"should navigate to search pill with arrow right\", async () => {\n const onFocusChange = vi.fn();\n const { stdin, unmount } = renderGrid({\n rows: defaultRows,\n focusedRow: 0,\n focusedCol: 0, // On the only option (Public)\n onFocusChange,\n onSearch: mockSearch,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n stdin.write(ARROW_RIGHT);\n await delay(INPUT_DELAY_MS);\n\n // Public is at index 0, search pill at index 1\n expect(onFocusChange).toHaveBeenCalledWith(0, 1);\n });\n\n it(\"should not call onSelect when space is pressed on search pill\", async () => {\n const onSelect = vi.fn();\n const { stdin, unmount } = renderGrid({\n rows: defaultRows,\n focusedRow: 0,\n focusedCol: 1, // Search pill position (after Public)\n onSelect,\n onSearch: mockSearch,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n stdin.write(\" \");\n await delay(INPUT_DELAY_MS);\n\n expect(onSelect).not.toHaveBeenCalled();\n });\n\n it(\"should trigger search on Space when search pill is focused\", async () => {\n mockSearch.mockResolvedValue(searchCandidates);\n\n const { stdin, unmount } = renderGrid({\n rows: defaultRows,\n focusedRow: 0,\n focusedCol: 1, // Search pill position\n onSearch: mockSearch,\n onSearchStateChange: mockSearchStateChange,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n stdin.write(SPACE);\n await delay(INPUT_DELAY_MS);\n\n expect(mockSearch).toHaveBeenCalledWith(\"react\");\n expect(mockSearchStateChange).toHaveBeenCalledWith(true);\n });\n\n it(\"should render modal with results after search completes\", async () => {\n mockSearch.mockResolvedValue(searchCandidates);\n\n const { stdin, lastFrame, unmount } = renderGrid({\n rows: defaultRows,\n focusedRow: 0,\n focusedCol: 1,\n onSearch: mockSearch,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n stdin.write(SPACE);\n // Wait for async search to resolve\n await delay(RENDER_DELAY_MS);\n\n const output = lastFrame();\n expect(output).toContain(\"react\");\n expect(output).toContain(\"awesome-dev\");\n expect(output).toContain(\"team-xyz\");\n });\n\n it(\"should close modal on Escape without binding\", async () => {\n mockSearch.mockResolvedValue(searchCandidates);\n\n const { stdin, lastFrame, unmount } = renderGrid({\n rows: defaultRows,\n focusedRow: 0,\n focusedCol: 1,\n onSearch: mockSearch,\n onBind: mockBind,\n onSearchStateChange: mockSearchStateChange,\n });\n cleanup = unmount;\n\n // Open modal\n await delay(RENDER_DELAY_MS);\n stdin.write(SPACE);\n await delay(RENDER_DELAY_MS);\n\n // Close modal\n stdin.write(ESCAPE);\n await delay(INPUT_DELAY_MS);\n\n expect(mockBind).not.toHaveBeenCalled();\n expect(mockSearchStateChange).toHaveBeenLastCalledWith(false);\n\n const output = lastFrame();\n expect(output).not.toContain(\"awesome-dev\");\n });\n\n it(\"should not respond to grid navigation while modal is open\", async () => {\n mockSearch.mockResolvedValue(searchCandidates);\n const onFocusChange = vi.fn();\n\n const { stdin, unmount } = renderGrid({\n rows: defaultRows,\n focusedRow: 0,\n focusedCol: 1,\n onSearch: mockSearch,\n onFocusChange,\n });\n cleanup = unmount;\n\n // Open modal\n await delay(RENDER_DELAY_MS);\n stdin.write(SPACE);\n await delay(RENDER_DELAY_MS);\n\n // Try grid navigation while modal is open\n onFocusChange.mockClear();\n stdin.write(ARROW_LEFT);\n await delay(INPUT_DELAY_MS);\n stdin.write(ARROW_RIGHT);\n await delay(INPUT_DELAY_MS);\n\n expect(onFocusChange).not.toHaveBeenCalled();\n });\n\n it(\"should bind result on Enter in modal\", async () => {\n mockSearch.mockResolvedValue(searchCandidates);\n\n const { stdin, unmount } = renderGrid({\n rows: defaultRows,\n focusedRow: 0,\n focusedCol: 1,\n onSearch: mockSearch,\n onBind: mockBind,\n onSearchStateChange: mockSearchStateChange,\n });\n cleanup = unmount;\n\n // Open modal with Space\n await delay(RENDER_DELAY_MS);\n stdin.write(SPACE);\n await delay(RENDER_DELAY_MS);\n\n // Bind first result\n stdin.write(ENTER);\n await delay(INPUT_DELAY_MS);\n\n expect(mockBind).toHaveBeenCalledWith(searchCandidates[0]);\n expect(mockSearchStateChange).toHaveBeenLastCalledWith(false);\n });\n });\n});\n"],"mappings":"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","names":[]}
@@ -1,11 +1,13 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  StepApproach
4
- } from "../../chunk-ZENYS6KW.js";
5
- import "../../chunk-Y2LW7R3Y.js";
6
- import "../../chunk-D237EVNB.js";
7
- import "../../chunk-76DWXGQE.js";
8
- import "../../chunk-DHET7RCE.js";
4
+ } from "../../chunk-KWYO3M5Q.js";
5
+ import "../../chunk-U7HFKR74.js";
6
+ import "../../chunk-H7SSBSPR.js";
7
+ import "../../chunk-TMED5DQ2.js";
8
+ import "../../chunk-HWD32NP7.js";
9
+ import "../../chunk-O6ZTD7ZI.js";
10
+ import "../../chunk-AWKZ5BDL.js";
9
11
  export {
10
12
  StepApproach
11
13
  };