agents-inc 0.151.0 → 0.152.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 (254) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/README.md +25 -25
  3. package/dist/{chunk-YA4QQKKE.js → chunk-5GUOIJSG.js} +3 -7
  4. package/dist/{chunk-YA4QQKKE.js.map → chunk-5GUOIJSG.js.map} +1 -1
  5. package/dist/{chunk-44LLPS2N.js → chunk-5UWKOOIS.js} +6 -26
  6. package/dist/chunk-5UWKOOIS.js.map +1 -0
  7. package/dist/{chunk-O5ASLZ2K.js → chunk-76ADG7LQ.js} +1 -5
  8. package/dist/{chunk-O5ASLZ2K.js.map → chunk-76ADG7LQ.js.map} +1 -1
  9. package/dist/{chunk-WK4J2CHH.js → chunk-BNSRA6HL.js} +13 -18
  10. package/dist/{chunk-WK4J2CHH.js.map → chunk-BNSRA6HL.js.map} +1 -1
  11. package/dist/{chunk-FYPUUYSG.js → chunk-DTSG5XZB.js} +3 -7
  12. package/dist/{chunk-FYPUUYSG.js.map → chunk-DTSG5XZB.js.map} +1 -1
  13. package/dist/{chunk-NGLQ5W7U.js → chunk-E5X6RJ4E.js} +5 -15
  14. package/dist/chunk-E5X6RJ4E.js.map +1 -0
  15. package/dist/{chunk-TVHRMRD3.js → chunk-EEPELKOM.js} +4008 -4084
  16. package/dist/chunk-EEPELKOM.js.map +1 -0
  17. package/dist/{chunk-NIKUMXE7.js → chunk-F7T5AFFN.js} +1 -5
  18. package/dist/{chunk-NIKUMXE7.js.map → chunk-F7T5AFFN.js.map} +1 -1
  19. package/dist/{chunk-LAXAQ3PZ.js → chunk-FVDKAVOL.js} +10 -14
  20. package/dist/{chunk-LAXAQ3PZ.js.map → chunk-FVDKAVOL.js.map} +1 -1
  21. package/dist/{chunk-BNE4HHIH.js → chunk-GRVKW3CC.js} +2 -6
  22. package/dist/{chunk-BNE4HHIH.js.map → chunk-GRVKW3CC.js.map} +1 -1
  23. package/dist/{chunk-3XFUQ6OL.js → chunk-IHUY4M22.js} +4 -8
  24. package/dist/{chunk-3XFUQ6OL.js.map → chunk-IHUY4M22.js.map} +1 -1
  25. package/dist/{chunk-OZZGXBCN.js → chunk-IUQBOCSU.js} +1 -5
  26. package/dist/{chunk-OZZGXBCN.js.map → chunk-IUQBOCSU.js.map} +1 -1
  27. package/dist/{chunk-LYYXX2W5.js → chunk-J27W6TXS.js} +4 -6
  28. package/dist/{chunk-LYYXX2W5.js.map → chunk-J27W6TXS.js.map} +1 -1
  29. package/dist/chunk-JFLVEFFP.js +16 -0
  30. package/dist/chunk-JFLVEFFP.js.map +1 -0
  31. package/dist/{chunk-PV2HNW4I.js → chunk-KFB5CRXZ.js} +7 -12
  32. package/dist/{chunk-PV2HNW4I.js.map → chunk-KFB5CRXZ.js.map} +1 -1
  33. package/dist/{chunk-SYUOXSPU.js → chunk-KR65TPKC.js} +168 -14
  34. package/dist/chunk-KR65TPKC.js.map +1 -0
  35. package/dist/{chunk-KOPEM3Q7.js → chunk-KXYVJGJP.js} +2 -6
  36. package/dist/{chunk-KOPEM3Q7.js.map → chunk-KXYVJGJP.js.map} +1 -1
  37. package/dist/{chunk-TYJLR32W.js → chunk-L7SZXUBJ.js} +9 -14
  38. package/dist/{chunk-TYJLR32W.js.map → chunk-L7SZXUBJ.js.map} +1 -1
  39. package/dist/{chunk-NHCGC6DG.js → chunk-LASI35KT.js} +4 -9
  40. package/dist/{chunk-NHCGC6DG.js.map → chunk-LASI35KT.js.map} +1 -1
  41. package/dist/{chunk-VG2TVBFN.js → chunk-LDP5ASDM.js} +2 -6
  42. package/dist/{chunk-VG2TVBFN.js.map → chunk-LDP5ASDM.js.map} +1 -1
  43. package/dist/{chunk-5V2O6C3T.js → chunk-LZ52XEPR.js} +4 -8
  44. package/dist/{chunk-5V2O6C3T.js.map → chunk-LZ52XEPR.js.map} +1 -1
  45. package/dist/{chunk-WFWCZEMS.js → chunk-M7HO7NBK.js} +4 -8
  46. package/dist/{chunk-WFWCZEMS.js.map → chunk-M7HO7NBK.js.map} +1 -1
  47. package/dist/{chunk-XA57SX4T.js → chunk-MJ2KHG24.js} +4 -8
  48. package/dist/{chunk-XA57SX4T.js.map → chunk-MJ2KHG24.js.map} +1 -1
  49. package/dist/{chunk-DAG2ULNF.js → chunk-MM7CTTAV.js} +2 -6
  50. package/dist/chunk-MM7CTTAV.js.map +1 -0
  51. package/dist/{chunk-UFURYGD3.js → chunk-MQ7FLIYS.js} +2 -6
  52. package/dist/{chunk-UFURYGD3.js.map → chunk-MQ7FLIYS.js.map} +1 -1
  53. package/dist/{chunk-SI5FOARI.js → chunk-MVR3SYMN.js} +6 -8
  54. package/dist/chunk-MVR3SYMN.js.map +1 -0
  55. package/dist/{chunk-UTFN6UJS.js → chunk-MWG4VU64.js} +12 -17
  56. package/dist/{chunk-UTFN6UJS.js.map → chunk-MWG4VU64.js.map} +1 -1
  57. package/dist/{chunk-ES3NJZON.js → chunk-NR3OZGL4.js} +1 -5
  58. package/dist/{chunk-ES3NJZON.js.map → chunk-NR3OZGL4.js.map} +1 -1
  59. package/dist/{chunk-GYG5SE2D.js → chunk-ODNDXQH2.js} +2 -6
  60. package/dist/{chunk-GYG5SE2D.js.map → chunk-ODNDXQH2.js.map} +1 -1
  61. package/dist/{chunk-2RSNKBXC.js → chunk-P44SXVH3.js} +6 -10
  62. package/dist/{chunk-2RSNKBXC.js.map → chunk-P44SXVH3.js.map} +1 -1
  63. package/dist/{chunk-3LIU2ZEF.js → chunk-PMM2MYMA.js} +3 -16
  64. package/dist/{chunk-3LIU2ZEF.js.map → chunk-PMM2MYMA.js.map} +1 -1
  65. package/dist/{chunk-QTFQEYDA.js → chunk-PZIZNMHK.js} +24 -36
  66. package/dist/chunk-PZIZNMHK.js.map +1 -0
  67. package/dist/{chunk-C55DN7GE.js → chunk-Q2KG7UV3.js} +3 -5
  68. package/dist/chunk-Q2KG7UV3.js.map +1 -0
  69. package/dist/{chunk-QQLRX4KI.js → chunk-Q45ZU6HD.js} +2 -6
  70. package/dist/{chunk-QQLRX4KI.js.map → chunk-Q45ZU6HD.js.map} +1 -1
  71. package/dist/{chunk-6RBQBOBS.js → chunk-QRDTLVXG.js} +9 -14
  72. package/dist/{chunk-6RBQBOBS.js.map → chunk-QRDTLVXG.js.map} +1 -1
  73. package/dist/{chunk-YBVA7GPW.js → chunk-QZZJFYUQ.js} +3 -7
  74. package/dist/{chunk-YBVA7GPW.js.map → chunk-QZZJFYUQ.js.map} +1 -1
  75. package/dist/{chunk-OJIESW5B.js → chunk-R5NOI2LP.js} +13 -17
  76. package/dist/{chunk-OJIESW5B.js.map → chunk-R5NOI2LP.js.map} +1 -1
  77. package/dist/{chunk-DUVWGO6E.js → chunk-RNJWAKMO.js} +3 -7
  78. package/dist/{chunk-DUVWGO6E.js.map → chunk-RNJWAKMO.js.map} +1 -1
  79. package/dist/{chunk-4R6PGHQQ.js → chunk-SBHBBZKF.js} +7 -23
  80. package/dist/chunk-SBHBBZKF.js.map +1 -0
  81. package/dist/{chunk-NM3EDGB5.js → chunk-SKQWRUPX.js} +10 -14
  82. package/dist/{chunk-NM3EDGB5.js.map → chunk-SKQWRUPX.js.map} +1 -1
  83. package/dist/{chunk-Y4CXDA3I.js → chunk-STMHDOZD.js} +4 -21
  84. package/dist/chunk-STMHDOZD.js.map +1 -0
  85. package/dist/{chunk-SHHOMVWC.js → chunk-SX5H6TSC.js} +7 -11
  86. package/dist/chunk-SX5H6TSC.js.map +1 -0
  87. package/dist/{chunk-RBHYLCUB.js → chunk-TJJPWUMA.js} +2 -6
  88. package/dist/{chunk-RBHYLCUB.js.map → chunk-TJJPWUMA.js.map} +1 -1
  89. package/dist/{chunk-IOJR5TOY.js → chunk-TSIU7DME.js} +1 -5
  90. package/dist/{chunk-IOJR5TOY.js.map → chunk-TSIU7DME.js.map} +1 -1
  91. package/dist/{chunk-EVXG3X6G.js → chunk-TUPYW2IQ.js} +3 -7
  92. package/dist/{chunk-EVXG3X6G.js.map → chunk-TUPYW2IQ.js.map} +1 -1
  93. package/dist/{chunk-YU2VGX5R.js → chunk-UBEDZ4FD.js} +1 -8
  94. package/dist/{chunk-YU2VGX5R.js.map → chunk-UBEDZ4FD.js.map} +1 -1
  95. package/dist/{chunk-VEP23B5W.js → chunk-VASLW636.js} +1 -5
  96. package/dist/{chunk-VEP23B5W.js.map → chunk-VASLW636.js.map} +1 -1
  97. package/dist/{chunk-PG4G4IIK.js → chunk-VY6MNOXL.js} +2 -6
  98. package/dist/{chunk-PG4G4IIK.js.map → chunk-VY6MNOXL.js.map} +1 -1
  99. package/dist/{chunk-IHO75PMZ.js → chunk-WBCPLH66.js} +15 -13
  100. package/dist/chunk-WBCPLH66.js.map +1 -0
  101. package/dist/{chunk-DG2NGZ7S.js → chunk-WKTHWQKM.js} +2 -7
  102. package/dist/{chunk-DG2NGZ7S.js.map → chunk-WKTHWQKM.js.map} +1 -1
  103. package/dist/{chunk-EZ7STXUV.js → chunk-XHUODHZ4.js} +19 -25
  104. package/dist/{chunk-EZ7STXUV.js.map → chunk-XHUODHZ4.js.map} +1 -1
  105. package/dist/{chunk-KIR7VYQD.js → chunk-XVAQG2CV.js} +1 -5
  106. package/dist/{chunk-KIR7VYQD.js.map → chunk-XVAQG2CV.js.map} +1 -1
  107. package/dist/{chunk-P3PN5SVI.js → chunk-ZL7PFNHN.js} +2 -6
  108. package/dist/{chunk-P3PN5SVI.js.map → chunk-ZL7PFNHN.js.map} +1 -1
  109. package/dist/{chunk-3YGUHWLR.js → chunk-ZPPHXXAP.js} +9 -15
  110. package/dist/{chunk-3YGUHWLR.js.map → chunk-ZPPHXXAP.js.map} +1 -1
  111. package/dist/commands/build/marketplace.js +10 -15
  112. package/dist/commands/build/marketplace.js.map +1 -1
  113. package/dist/commands/build/plugins.js +9 -14
  114. package/dist/commands/build/plugins.js.map +1 -1
  115. package/dist/commands/compile.js +14 -19
  116. package/dist/commands/compile.js.map +1 -1
  117. package/dist/commands/doctor.js +13 -18
  118. package/dist/commands/doctor.js.map +1 -1
  119. package/dist/commands/edit.js +51 -55
  120. package/dist/commands/edit.js.map +1 -1
  121. package/dist/commands/eject.js +13 -18
  122. package/dist/commands/eject.js.map +1 -1
  123. package/dist/commands/import/skill.js +9 -14
  124. package/dist/commands/import/skill.js.map +1 -1
  125. package/dist/commands/init.js +50 -51
  126. package/dist/commands/list.js +14 -16
  127. package/dist/commands/list.js.map +1 -1
  128. package/dist/commands/new/agent.js +12 -16
  129. package/dist/commands/new/agent.js.map +1 -1
  130. package/dist/commands/new/marketplace.js +15 -20
  131. package/dist/commands/new/marketplace.js.map +1 -1
  132. package/dist/commands/new/skill.js +11 -13
  133. package/dist/commands/search.js +14 -19
  134. package/dist/commands/search.js.map +1 -1
  135. package/dist/commands/uninstall.js +17 -21
  136. package/dist/commands/uninstall.js.map +1 -1
  137. package/dist/commands/update.js +17 -21
  138. package/dist/commands/update.js.map +1 -1
  139. package/dist/commands/validate.js +10 -16
  140. package/dist/commands/validate.js.map +1 -1
  141. package/dist/components/common/confirm.js +1 -2
  142. package/dist/components/common/prompt-confirm.js +2 -2
  143. package/dist/components/common/select-list.js +3 -4
  144. package/dist/components/common/spinner.js +1 -2
  145. package/dist/components/wizard/category-grid.js +8 -9
  146. package/dist/components/wizard/checkbox-grid.js +6 -7
  147. package/dist/components/wizard/domain-selection.js +14 -15
  148. package/dist/components/wizard/run-wizard-session.js +40 -40
  149. package/dist/components/wizard/scroll-affordance.js +2 -3
  150. package/dist/components/wizard/search-modal.js +6 -7
  151. package/dist/components/wizard/selection-card.js +2 -3
  152. package/dist/components/wizard/skill-agent-summary.js +8 -9
  153. package/dist/components/wizard/source-grid.js +13 -14
  154. package/dist/components/wizard/stack-selection.js +12 -13
  155. package/dist/components/wizard/step-agents.js +14 -15
  156. package/dist/components/wizard/step-build.js +14 -15
  157. package/dist/components/wizard/step-confirm.js +13 -14
  158. package/dist/components/wizard/step-settings.js +11 -12
  159. package/dist/components/wizard/step-sources.js +20 -21
  160. package/dist/components/wizard/step-stack.js +13 -14
  161. package/dist/components/wizard/summary-panel.js +12 -13
  162. package/dist/components/wizard/toast.js +2 -3
  163. package/dist/components/wizard/wizard-layout.js +18 -19
  164. package/dist/components/wizard/wizard-tabs.js +8 -9
  165. package/dist/components/wizard/wizard.js +38 -39
  166. package/dist/config-exports.js +1 -7
  167. package/dist/config-exports.js.map +1 -1
  168. package/dist/copy-local-skills-6EMVN7RB.js +14 -0
  169. package/dist/hooks/init.js +50 -54
  170. package/dist/hooks/init.js.map +1 -1
  171. package/dist/index.js +0 -4
  172. package/dist/index.js.map +1 -1
  173. package/dist/load-agent-defs-BWOUVEAR.js +15 -0
  174. package/dist/{loader-E2ERJYVA.js → loader-5JP4S7CJ.js} +4 -5
  175. package/dist/recompile-project-agents-6DL45TDI.js +19 -0
  176. package/dist/{source-loader-5UNRU7EZ.js → source-loader-MZYCPL2S.js} +7 -8
  177. package/dist/stores/wizard-store.js +7 -8
  178. package/package.json +15 -14
  179. package/dist/chunk-44LLPS2N.js.map +0 -1
  180. package/dist/chunk-4R6PGHQQ.js.map +0 -1
  181. package/dist/chunk-7QIHKQL5.js +0 -181
  182. package/dist/chunk-7QIHKQL5.js.map +0 -1
  183. package/dist/chunk-C55DN7GE.js.map +0 -1
  184. package/dist/chunk-DAG2ULNF.js.map +0 -1
  185. package/dist/chunk-DIBCRIMR.js +0 -36
  186. package/dist/chunk-DIBCRIMR.js.map +0 -1
  187. package/dist/chunk-EKWAUOQB.js +0 -96
  188. package/dist/chunk-EKWAUOQB.js.map +0 -1
  189. package/dist/chunk-I3XKEGHM.js +0 -16383
  190. package/dist/chunk-I3XKEGHM.js.map +0 -1
  191. package/dist/chunk-IHO75PMZ.js.map +0 -1
  192. package/dist/chunk-K3OU6TGX.js +0 -77
  193. package/dist/chunk-K3OU6TGX.js.map +0 -1
  194. package/dist/chunk-KSZ6PCY4.js +0 -43
  195. package/dist/chunk-KSZ6PCY4.js.map +0 -1
  196. package/dist/chunk-NGLQ5W7U.js.map +0 -1
  197. package/dist/chunk-P56WJ5FA.js +0 -50
  198. package/dist/chunk-P56WJ5FA.js.map +0 -1
  199. package/dist/chunk-QTFQEYDA.js.map +0 -1
  200. package/dist/chunk-SHHOMVWC.js.map +0 -1
  201. package/dist/chunk-SI5FOARI.js.map +0 -1
  202. package/dist/chunk-SYUOXSPU.js.map +0 -1
  203. package/dist/chunk-THKIOI32.js +0 -939
  204. package/dist/chunk-THKIOI32.js.map +0 -1
  205. package/dist/chunk-TVHRMRD3.js.map +0 -1
  206. package/dist/chunk-V7QOSGQA.js +0 -298
  207. package/dist/chunk-V7QOSGQA.js.map +0 -1
  208. package/dist/chunk-Y4CXDA3I.js.map +0 -1
  209. package/dist/components/common/confirm.test.js +0 -203
  210. package/dist/components/common/confirm.test.js.map +0 -1
  211. package/dist/components/wizard/category-grid.test.js +0 -1253
  212. package/dist/components/wizard/category-grid.test.js.map +0 -1
  213. package/dist/components/wizard/checkbox-grid.test.js +0 -264
  214. package/dist/components/wizard/checkbox-grid.test.js.map +0 -1
  215. package/dist/components/wizard/search-modal.test.js +0 -212
  216. package/dist/components/wizard/search-modal.test.js.map +0 -1
  217. package/dist/components/wizard/source-grid.test.js +0 -1094
  218. package/dist/components/wizard/source-grid.test.js.map +0 -1
  219. package/dist/components/wizard/step-agents.test.js +0 -204
  220. package/dist/components/wizard/step-agents.test.js.map +0 -1
  221. package/dist/components/wizard/step-build.test.js +0 -552
  222. package/dist/components/wizard/step-build.test.js.map +0 -1
  223. package/dist/components/wizard/step-confirm.test.js +0 -744
  224. package/dist/components/wizard/step-confirm.test.js.map +0 -1
  225. package/dist/components/wizard/step-settings.test.js +0 -244
  226. package/dist/components/wizard/step-settings.test.js.map +0 -1
  227. package/dist/components/wizard/step-sources.test.js +0 -155
  228. package/dist/components/wizard/step-sources.test.js.map +0 -1
  229. package/dist/components/wizard/step-stack.test.js +0 -262
  230. package/dist/components/wizard/step-stack.test.js.map +0 -1
  231. package/dist/components/wizard/summary-panel.test.js +0 -317
  232. package/dist/components/wizard/summary-panel.test.js.map +0 -1
  233. package/dist/components/wizard/wizard-layout.test.js +0 -200
  234. package/dist/components/wizard/wizard-layout.test.js.map +0 -1
  235. package/dist/components/wizard/wizard-tabs.test.js +0 -290
  236. package/dist/components/wizard/wizard-tabs.test.js.map +0 -1
  237. package/dist/copy-local-skills-UPA2GUZV.js +0 -15
  238. package/dist/dist-VNJNNJK7.js +0 -550
  239. package/dist/dist-VNJNNJK7.js.map +0 -1
  240. package/dist/load-agent-defs-SB4XAOVB.js +0 -16
  241. package/dist/magic-string.es-5TV73NJD.js +0 -1316
  242. package/dist/magic-string.es-5TV73NJD.js.map +0 -1
  243. package/dist/recompile-project-agents-U4ZY2GDX.js +0 -20
  244. package/dist/source-manager-3O54SIIB.js +0 -18
  245. package/dist/source-manager-3O54SIIB.js.map +0 -1
  246. package/dist/stores/d227-same-scope-tombstone-duplicate.test.js +0 -118
  247. package/dist/stores/d227-same-scope-tombstone-duplicate.test.js.map +0 -1
  248. package/dist/stores/wizard-store.test.js +0 -3053
  249. package/dist/stores/wizard-store.test.js.map +0 -1
  250. /package/dist/{copy-local-skills-UPA2GUZV.js.map → copy-local-skills-6EMVN7RB.js.map} +0 -0
  251. /package/dist/{load-agent-defs-SB4XAOVB.js.map → load-agent-defs-BWOUVEAR.js.map} +0 -0
  252. /package/dist/{loader-E2ERJYVA.js.map → loader-5JP4S7CJ.js.map} +0 -0
  253. /package/dist/{recompile-project-agents-U4ZY2GDX.js.map → recompile-project-agents-6DL45TDI.js.map} +0 -0
  254. /package/dist/{source-loader-5UNRU7EZ.js.map → source-loader-MZYCPL2S.js.map} +0 -0
@@ -1,262 +0,0 @@
1
- #!/usr/bin/env node
2
- import {
3
- ARROW_DOWN,
4
- ARROW_UP,
5
- ENTER,
6
- ESCAPE,
7
- RENDER_DELAY_MS,
8
- SELECT_NAV_DELAY_MS,
9
- delay
10
- } from "../../chunk-KSZ6PCY4.js";
11
- import {
12
- render
13
- } from "../../chunk-EKWAUOQB.js";
14
- import {
15
- SKILLS,
16
- TEST_CATEGORIES,
17
- createMockMatrix,
18
- createMockResolvedStack
19
- } from "../../chunk-V7QOSGQA.js";
20
- import {
21
- afterEach,
22
- beforeEach,
23
- describe,
24
- globalExpect,
25
- it,
26
- vi
27
- } from "../../chunk-I3XKEGHM.js";
28
- import {
29
- StepStack
30
- } from "../../chunk-UFURYGD3.js";
31
- import "../../chunk-LAXAQ3PZ.js";
32
- import "../../chunk-IOJR5TOY.js";
33
- import "../../chunk-KIR7VYQD.js";
34
- import "../../chunk-FYPUUYSG.js";
35
- import "../../chunk-DAG2ULNF.js";
36
- import {
37
- useWizardStore
38
- } from "../../chunk-44LLPS2N.js";
39
- import "../../chunk-TVHRMRD3.js";
40
- import "../../chunk-3LIU2ZEF.js";
41
- import {
42
- initializeMatrix
43
- } from "../../chunk-DG2NGZ7S.js";
44
- import "../../chunk-VEP23B5W.js";
45
- import "../../chunk-O5ASLZ2K.js";
46
- import "../../chunk-YU2VGX5R.js";
47
- import {
48
- init_esm_shims
49
- } from "../../chunk-P56WJ5FA.js";
50
-
51
- // src/cli/components/wizard/step-stack.test.tsx
52
- init_esm_shims();
53
- import { jsx } from "react/jsx-runtime";
54
- var createMockStackWithSkills = () => {
55
- const suggestedStacks = [
56
- createMockResolvedStack("react-fullstack", "React Fullstack", {
57
- description: "Full React stack with Zustand and Hono",
58
- allSkillIds: ["web-framework-react", "web-state-zustand", "api-framework-hono"]
59
- }),
60
- createMockResolvedStack("react-minimal", "React Minimal", {
61
- allSkillIds: ["web-framework-react"]
62
- })
63
- ];
64
- return createMockMatrix(SKILLS.react, SKILLS.zustand, SKILLS.hono, {
65
- suggestedStacks,
66
- categories: {
67
- "web-framework": { ...TEST_CATEGORIES.framework, domain: "web", exclusive: false },
68
- "api-api": { ...TEST_CATEGORIES.api, domain: "api", exclusive: false, order: 1 },
69
- "cli-framework": {
70
- ...TEST_CATEGORIES.cliFramework,
71
- domain: "cli",
72
- exclusive: false,
73
- order: 2
74
- },
75
- "mobile-framework": {
76
- ...TEST_CATEGORIES.mobileFramework,
77
- domain: "mobile",
78
- exclusive: false,
79
- order: 3
80
- }
81
- }
82
- });
83
- };
84
- describe("StepStack component", () => {
85
- let cleanup;
86
- let mockMatrix;
87
- beforeEach(() => {
88
- mockMatrix = createMockStackWithSkills();
89
- initializeMatrix(mockMatrix);
90
- });
91
- afterEach(() => {
92
- cleanup?.();
93
- cleanup = void 0;
94
- });
95
- describe("stack/scratch selection", () => {
96
- describe("rendering", () => {
97
- it("should render stack options and scratch option", () => {
98
- const { lastFrame, unmount } = render(/* @__PURE__ */ jsx(StepStack, {}));
99
- cleanup = unmount;
100
- const output = lastFrame();
101
- globalExpect(output).toContain("React Fullstack");
102
- globalExpect(output).toContain("React Minimal");
103
- globalExpect(output).toContain("Start from scratch");
104
- });
105
- it("should render focused stack description (only focused item shows description)", () => {
106
- const { lastFrame, unmount } = render(/* @__PURE__ */ jsx(StepStack, {}));
107
- cleanup = unmount;
108
- const output = lastFrame();
109
- globalExpect(output).toContain("Full React stack");
110
- });
111
- it("should render stack selection content (title rendered by wizard-layout)", () => {
112
- const { lastFrame, unmount } = render(/* @__PURE__ */ jsx(StepStack, {}));
113
- cleanup = unmount;
114
- const output = lastFrame();
115
- globalExpect(output).toContain("React Fullstack");
116
- globalExpect(output).toContain("Start from scratch");
117
- });
118
- it("should render section structure with scratch option", () => {
119
- const { lastFrame, unmount } = render(/* @__PURE__ */ jsx(StepStack, {}));
120
- cleanup = unmount;
121
- const output = lastFrame();
122
- globalExpect(output).toContain("Start from scratch");
123
- globalExpect(output).toContain("Select domains and skills manually");
124
- });
125
- });
126
- describe("stack selection", () => {
127
- it("should set approach and transition to domains step on Enter", async () => {
128
- const { stdin, unmount } = render(/* @__PURE__ */ jsx(StepStack, {}));
129
- cleanup = unmount;
130
- await delay(RENDER_DELAY_MS);
131
- stdin.write(ENTER);
132
- await delay(SELECT_NAV_DELAY_MS);
133
- const { approach, selectedStackId, step } = useWizardStore.getState();
134
- globalExpect(approach).toBe("stack");
135
- globalExpect(selectedStackId).toBe("react-fullstack");
136
- globalExpect(step).toBe("domains");
137
- });
138
- it("should select second stack when navigated to", async () => {
139
- const { stdin, unmount } = render(/* @__PURE__ */ jsx(StepStack, {}));
140
- cleanup = unmount;
141
- await delay(RENDER_DELAY_MS);
142
- stdin.write(ARROW_DOWN);
143
- await delay(SELECT_NAV_DELAY_MS);
144
- stdin.write(ENTER);
145
- await delay(SELECT_NAV_DELAY_MS);
146
- const { selectedStackId } = useWizardStore.getState();
147
- globalExpect(selectedStackId).toBe("react-minimal");
148
- });
149
- });
150
- describe("scratch selection", () => {
151
- it("should set approach and transition to domains step when scratch is selected", async () => {
152
- const { stdin, unmount } = render(/* @__PURE__ */ jsx(StepStack, {}));
153
- cleanup = unmount;
154
- await delay(RENDER_DELAY_MS);
155
- stdin.write(ARROW_DOWN);
156
- await delay(SELECT_NAV_DELAY_MS);
157
- stdin.write(ARROW_DOWN);
158
- await delay(SELECT_NAV_DELAY_MS);
159
- stdin.write(ENTER);
160
- await delay(SELECT_NAV_DELAY_MS);
161
- const { approach, selectedStackId, step } = useWizardStore.getState();
162
- globalExpect(approach).toBe("scratch");
163
- globalExpect(selectedStackId).toBeNull();
164
- globalExpect(step).toBe("domains");
165
- });
166
- it("should pre-select domains except CLI when scratch is chosen", async () => {
167
- const { stdin, unmount } = render(/* @__PURE__ */ jsx(StepStack, {}));
168
- cleanup = unmount;
169
- await delay(RENDER_DELAY_MS);
170
- stdin.write(ARROW_DOWN);
171
- await delay(SELECT_NAV_DELAY_MS);
172
- stdin.write(ARROW_DOWN);
173
- await delay(SELECT_NAV_DELAY_MS);
174
- stdin.write(ENTER);
175
- await delay(SELECT_NAV_DELAY_MS);
176
- const { selectedDomains } = useWizardStore.getState();
177
- globalExpect(selectedDomains).toContain("web");
178
- globalExpect(selectedDomains).toContain("api");
179
- globalExpect(selectedDomains).toContain("mobile");
180
- globalExpect(selectedDomains).not.toContain("cli");
181
- });
182
- });
183
- describe("cancel navigation", () => {
184
- it("should call onCancel when pressing Escape at initial view", async () => {
185
- const onCancel = vi.fn();
186
- const { stdin, unmount } = render(/* @__PURE__ */ jsx(StepStack, { onCancel }));
187
- cleanup = unmount;
188
- await delay(RENDER_DELAY_MS);
189
- stdin.write(ESCAPE);
190
- await delay(SELECT_NAV_DELAY_MS);
191
- globalExpect(onCancel).toHaveBeenCalledTimes(1);
192
- });
193
- });
194
- describe("arrow key navigation", () => {
195
- it("should navigate down to second stack card", async () => {
196
- const { stdin, unmount } = render(/* @__PURE__ */ jsx(StepStack, {}));
197
- cleanup = unmount;
198
- await delay(RENDER_DELAY_MS);
199
- stdin.write(ARROW_DOWN);
200
- await delay(SELECT_NAV_DELAY_MS);
201
- stdin.write(ENTER);
202
- await delay(SELECT_NAV_DELAY_MS);
203
- const { selectedStackId } = useWizardStore.getState();
204
- globalExpect(selectedStackId).toBe("react-minimal");
205
- });
206
- it("should navigate down then up back to first stack", async () => {
207
- const { stdin, unmount } = render(/* @__PURE__ */ jsx(StepStack, {}));
208
- cleanup = unmount;
209
- await delay(RENDER_DELAY_MS);
210
- stdin.write(ARROW_DOWN);
211
- await delay(SELECT_NAV_DELAY_MS);
212
- stdin.write(ARROW_UP);
213
- await delay(SELECT_NAV_DELAY_MS);
214
- stdin.write(ENTER);
215
- await delay(SELECT_NAV_DELAY_MS);
216
- const { selectedStackId } = useWizardStore.getState();
217
- globalExpect(selectedStackId).toBe("react-fullstack");
218
- });
219
- it("should wrap to last item when pressing up from first item", async () => {
220
- const { stdin, unmount } = render(/* @__PURE__ */ jsx(StepStack, {}));
221
- cleanup = unmount;
222
- await delay(RENDER_DELAY_MS);
223
- stdin.write(ARROW_UP);
224
- await delay(SELECT_NAV_DELAY_MS);
225
- stdin.write(ARROW_UP);
226
- await delay(SELECT_NAV_DELAY_MS);
227
- stdin.write(ENTER);
228
- await delay(SELECT_NAV_DELAY_MS);
229
- const { selectedStackId } = useWizardStore.getState();
230
- globalExpect(selectedStackId).toBe("react-minimal");
231
- });
232
- it("should wrap to first item when pressing down past last item", async () => {
233
- const { stdin, unmount } = render(/* @__PURE__ */ jsx(StepStack, {}));
234
- cleanup = unmount;
235
- await delay(RENDER_DELAY_MS);
236
- stdin.write(ARROW_DOWN);
237
- await delay(SELECT_NAV_DELAY_MS);
238
- stdin.write(ARROW_DOWN);
239
- await delay(SELECT_NAV_DELAY_MS);
240
- stdin.write(ARROW_DOWN);
241
- await delay(SELECT_NAV_DELAY_MS);
242
- stdin.write(ARROW_DOWN);
243
- await delay(SELECT_NAV_DELAY_MS);
244
- stdin.write(ENTER);
245
- await delay(SELECT_NAV_DELAY_MS);
246
- const { selectedStackId } = useWizardStore.getState();
247
- globalExpect(selectedStackId).toBe("react-minimal");
248
- });
249
- });
250
- describe("empty state", () => {
251
- it("should still show scratch option with no stacks available", () => {
252
- const emptyMatrix = createMockMatrix({}, { suggestedStacks: [] });
253
- initializeMatrix(emptyMatrix);
254
- const { lastFrame, unmount } = render(/* @__PURE__ */ jsx(StepStack, {}));
255
- cleanup = unmount;
256
- const output = lastFrame();
257
- globalExpect(output).toContain("Start from scratch");
258
- });
259
- });
260
- });
261
- });
262
- //# sourceMappingURL=step-stack.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/cli/components/wizard/step-stack.test.tsx"],"sourcesContent":["import { render } from \"ink-testing-library\";\nimport { afterEach, beforeEach, describe, expect, it, vi } from \"vitest\";\nimport { StepStack } from \"./step-stack\";\nimport { useWizardStore } from \"../../stores/wizard-store\";\nimport { initializeMatrix } from \"../../lib/matrix/matrix-provider\";\nimport { SKILLS } from \"../../lib/__tests__/test-fixtures\";\nimport { createMockMatrix } from \"../../lib/__tests__/factories/matrix-factories\";\nimport { createMockResolvedStack } from \"../../lib/__tests__/factories/stack-factories\";\nimport { TEST_CATEGORIES } from \"../../lib/__tests__/test-fixtures\";\n\nimport type { MergedSkillsMatrix } from \"../../types\";\nimport {\n ARROW_DOWN,\n ARROW_UP,\n ENTER,\n ESCAPE,\n RENDER_DELAY_MS,\n SELECT_NAV_DELAY_MS,\n delay,\n} from \"../../lib/__tests__/test-constants\";\n\nconst createMockStackWithSkills = (): MergedSkillsMatrix => {\n const suggestedStacks = [\n createMockResolvedStack(\"react-fullstack\", \"React Fullstack\", {\n description: \"Full React stack with Zustand and Hono\",\n allSkillIds: [\"web-framework-react\", \"web-state-zustand\", \"api-framework-hono\"],\n }),\n createMockResolvedStack(\"react-minimal\", \"React Minimal\", {\n allSkillIds: [\"web-framework-react\"],\n }),\n ];\n\n return createMockMatrix(SKILLS.react, SKILLS.zustand, SKILLS.hono, {\n suggestedStacks,\n categories: {\n \"web-framework\": { ...TEST_CATEGORIES.framework, domain: \"web\" as const, exclusive: false },\n \"api-api\": { ...TEST_CATEGORIES.api, domain: \"api\" as const, exclusive: false, order: 1 },\n \"cli-framework\": {\n ...TEST_CATEGORIES.cliFramework,\n domain: \"cli\" as const,\n exclusive: false,\n order: 2,\n },\n \"mobile-framework\": {\n ...TEST_CATEGORIES.mobileFramework,\n domain: \"mobile\" as const,\n exclusive: false,\n order: 3,\n },\n },\n });\n};\n\ndescribe(\"StepStack component\", () => {\n let cleanup: (() => void) | undefined;\n let mockMatrix: MergedSkillsMatrix;\n\n beforeEach(() => {\n mockMatrix = createMockStackWithSkills();\n initializeMatrix(mockMatrix);\n });\n\n afterEach(() => {\n cleanup?.();\n cleanup = undefined;\n });\n\n describe(\"stack/scratch selection\", () => {\n describe(\"rendering\", () => {\n it(\"should render stack options and scratch option\", () => {\n const { lastFrame, unmount } = render(<StepStack />);\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"React Fullstack\");\n expect(output).toContain(\"React Minimal\");\n expect(output).toContain(\"Start from scratch\");\n });\n\n it(\"should render focused stack description (only focused item shows description)\", () => {\n const { lastFrame, unmount } = render(<StepStack />);\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Full React stack\");\n });\n\n it(\"should render stack selection content (title rendered by wizard-layout)\", () => {\n const { lastFrame, unmount } = render(<StepStack />);\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"React Fullstack\");\n expect(output).toContain(\"Start from scratch\");\n });\n\n it(\"should render section structure with scratch option\", () => {\n const { lastFrame, unmount } = render(<StepStack />);\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Start from scratch\");\n expect(output).toContain(\"Select domains and skills manually\");\n });\n });\n\n describe(\"stack selection\", () => {\n it(\"should set approach and transition to domains step on Enter\", async () => {\n const { stdin, unmount } = render(<StepStack />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n stdin.write(ENTER);\n await delay(SELECT_NAV_DELAY_MS);\n\n const { approach, selectedStackId, step } = useWizardStore.getState();\n expect(approach).toBe(\"stack\");\n expect(selectedStackId).toBe(\"react-fullstack\");\n expect(step).toBe(\"domains\");\n });\n\n it(\"should select second stack when navigated to\", async () => {\n const { stdin, unmount } = render(<StepStack />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n stdin.write(ARROW_DOWN);\n await delay(SELECT_NAV_DELAY_MS);\n stdin.write(ENTER);\n await delay(SELECT_NAV_DELAY_MS);\n\n const { selectedStackId } = useWizardStore.getState();\n expect(selectedStackId).toBe(\"react-minimal\");\n });\n });\n\n describe(\"scratch selection\", () => {\n it(\"should set approach and transition to domains step when scratch is selected\", async () => {\n const { stdin, unmount } = render(<StepStack />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n stdin.write(ARROW_DOWN);\n await delay(SELECT_NAV_DELAY_MS);\n stdin.write(ARROW_DOWN);\n await delay(SELECT_NAV_DELAY_MS);\n stdin.write(ENTER);\n await delay(SELECT_NAV_DELAY_MS);\n\n const { approach, selectedStackId, step } = useWizardStore.getState();\n expect(approach).toBe(\"scratch\");\n expect(selectedStackId).toBeNull();\n expect(step).toBe(\"domains\");\n });\n\n it(\"should pre-select domains except CLI when scratch is chosen\", async () => {\n const { stdin, unmount } = render(<StepStack />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n stdin.write(ARROW_DOWN);\n await delay(SELECT_NAV_DELAY_MS);\n stdin.write(ARROW_DOWN);\n await delay(SELECT_NAV_DELAY_MS);\n stdin.write(ENTER);\n await delay(SELECT_NAV_DELAY_MS);\n\n const { selectedDomains } = useWizardStore.getState();\n expect(selectedDomains).toContain(\"web\");\n expect(selectedDomains).toContain(\"api\");\n expect(selectedDomains).toContain(\"mobile\");\n expect(selectedDomains).not.toContain(\"cli\");\n });\n });\n\n describe(\"cancel navigation\", () => {\n it(\"should call onCancel when pressing Escape at initial view\", async () => {\n const onCancel = vi.fn();\n const { stdin, unmount } = render(<StepStack onCancel={onCancel} />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n stdin.write(ESCAPE);\n await delay(SELECT_NAV_DELAY_MS);\n\n expect(onCancel).toHaveBeenCalledTimes(1);\n });\n });\n\n describe(\"arrow key navigation\", () => {\n it(\"should navigate down to second stack card\", async () => {\n const { stdin, unmount } = render(<StepStack />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n stdin.write(ARROW_DOWN);\n await delay(SELECT_NAV_DELAY_MS);\n stdin.write(ENTER);\n await delay(SELECT_NAV_DELAY_MS);\n\n const { selectedStackId } = useWizardStore.getState();\n expect(selectedStackId).toBe(\"react-minimal\");\n });\n\n it(\"should navigate down then up back to first stack\", async () => {\n const { stdin, unmount } = render(<StepStack />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n stdin.write(ARROW_DOWN);\n await delay(SELECT_NAV_DELAY_MS);\n stdin.write(ARROW_UP);\n await delay(SELECT_NAV_DELAY_MS);\n stdin.write(ENTER);\n await delay(SELECT_NAV_DELAY_MS);\n\n const { selectedStackId } = useWizardStore.getState();\n expect(selectedStackId).toBe(\"react-fullstack\");\n });\n\n it(\"should wrap to last item when pressing up from first item\", async () => {\n const { stdin, unmount } = render(<StepStack />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n // From index 0, UP wraps to scratch (index 2), UP again goes to react-minimal (index 1)\n stdin.write(ARROW_UP);\n await delay(SELECT_NAV_DELAY_MS);\n stdin.write(ARROW_UP);\n await delay(SELECT_NAV_DELAY_MS);\n stdin.write(ENTER);\n await delay(SELECT_NAV_DELAY_MS);\n\n const { selectedStackId } = useWizardStore.getState();\n expect(selectedStackId).toBe(\"react-minimal\");\n });\n\n it(\"should wrap to first item when pressing down past last item\", async () => {\n const { stdin, unmount } = render(<StepStack />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n // From index 0, DOWN x4: 0->1->2->0->1 (react-minimal)\n stdin.write(ARROW_DOWN);\n await delay(SELECT_NAV_DELAY_MS);\n stdin.write(ARROW_DOWN);\n await delay(SELECT_NAV_DELAY_MS);\n stdin.write(ARROW_DOWN);\n await delay(SELECT_NAV_DELAY_MS);\n stdin.write(ARROW_DOWN);\n await delay(SELECT_NAV_DELAY_MS);\n stdin.write(ENTER);\n await delay(SELECT_NAV_DELAY_MS);\n\n const { selectedStackId } = useWizardStore.getState();\n expect(selectedStackId).toBe(\"react-minimal\");\n });\n });\n\n describe(\"empty state\", () => {\n it(\"should still show scratch option with no stacks available\", () => {\n const emptyMatrix = createMockMatrix({}, { suggestedStacks: [] });\n initializeMatrix(emptyMatrix);\n\n const { lastFrame, unmount } = render(<StepStack />);\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Start from scratch\");\n });\n });\n });\n});\n"],"mappings":"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","names":[]}
@@ -1,317 +0,0 @@
1
- #!/usr/bin/env node
2
- import {
3
- ARROW_DOWN,
4
- ARROW_UP,
5
- INPUT_DELAY_MS,
6
- RENDER_DELAY_MS,
7
- delay
8
- } from "../../chunk-KSZ6PCY4.js";
9
- import {
10
- render
11
- } from "../../chunk-EKWAUOQB.js";
12
- import {
13
- buildAgentConfigs,
14
- buildSkillConfigs
15
- } from "../../chunk-DIBCRIMR.js";
16
- import {
17
- SKILLS,
18
- createMockMatrix,
19
- createMockResolvedStack
20
- } from "../../chunk-V7QOSGQA.js";
21
- import {
22
- afterEach,
23
- beforeEach,
24
- describe,
25
- globalExpect,
26
- it,
27
- vi
28
- } from "../../chunk-I3XKEGHM.js";
29
- import "../../chunk-EZ7STXUV.js";
30
- import "../../chunk-UTFN6UJS.js";
31
- import "../../chunk-EVXG3X6G.js";
32
- import "../../chunk-OJIESW5B.js";
33
- import "../../chunk-UFURYGD3.js";
34
- import "../../chunk-RBHYLCUB.js";
35
- import "../../chunk-LAXAQ3PZ.js";
36
- import "../../chunk-NM3EDGB5.js";
37
- import "../../chunk-NHCGC6DG.js";
38
- import "../../chunk-BNE4HHIH.js";
39
- import {
40
- SummaryPanel
41
- } from "../../chunk-TYJLR32W.js";
42
- import "../../chunk-IOJR5TOY.js";
43
- import "../../chunk-3YGUHWLR.js";
44
- import "../../chunk-QQLRX4KI.js";
45
- import "../../chunk-WK4J2CHH.js";
46
- import "../../chunk-NIKUMXE7.js";
47
- import "../../chunk-KOPEM3Q7.js";
48
- import "../../chunk-2RSNKBXC.js";
49
- import "../../chunk-DUVWGO6E.js";
50
- import "../../chunk-KIR7VYQD.js";
51
- import "../../chunk-6RBQBOBS.js";
52
- import "../../chunk-LYYXX2W5.js";
53
- import "../../chunk-SHHOMVWC.js";
54
- import "../../chunk-YA4QQKKE.js";
55
- import "../../chunk-XA57SX4T.js";
56
- import "../../chunk-FYPUUYSG.js";
57
- import "../../chunk-DAG2ULNF.js";
58
- import "../../chunk-VG2TVBFN.js";
59
- import "../../chunk-IHO75PMZ.js";
60
- import "../../chunk-5V2O6C3T.js";
61
- import {
62
- useWizardStore
63
- } from "../../chunk-44LLPS2N.js";
64
- import "../../chunk-P3PN5SVI.js";
65
- import "../../chunk-TVHRMRD3.js";
66
- import "../../chunk-3LIU2ZEF.js";
67
- import {
68
- initializeMatrix
69
- } from "../../chunk-DG2NGZ7S.js";
70
- import "../../chunk-VEP23B5W.js";
71
- import {
72
- ALL_SKILLS_EJECTED_LABEL,
73
- DEFAULT_PUBLIC_SOURCE_NAME,
74
- EJECT_SOURCE,
75
- formatSourceDisplayName
76
- } from "../../chunk-O5ASLZ2K.js";
77
- import "../../chunk-YU2VGX5R.js";
78
- import {
79
- init_esm_shims
80
- } from "../../chunk-P56WJ5FA.js";
81
-
82
- // src/cli/components/wizard/summary-panel.test.tsx
83
- init_esm_shims();
84
- import { Box } from "ink";
85
-
86
- // src/cli/lib/__tests__/helpers/silence-console.ts
87
- init_esm_shims();
88
- var DEFAULT_METHODS = ["log", "warn", "error"];
89
- function silenceConsole(methods = DEFAULT_METHODS) {
90
- const spies = {};
91
- beforeEach(() => {
92
- for (const method of methods) {
93
- spies[method] = vi.spyOn(console, method).mockImplementation(() => {
94
- });
95
- }
96
- });
97
- afterEach(() => {
98
- for (const method of methods) {
99
- spies[method]?.mockRestore();
100
- }
101
- });
102
- return spies;
103
- }
104
-
105
- // src/cli/components/wizard/summary-panel.test.tsx
106
- import { jsx } from "react/jsx-runtime";
107
- var STACK_ID = "nextjs-fullstack";
108
- var STACK_NAME = "Next.js Full-Stack";
109
- var UNKNOWN_STACK_ID = "ghost-stack";
110
- var DEFAULT_MARKETPLACE_LABEL = formatSourceDisplayName(DEFAULT_PUBLIC_SOURCE_NAME);
111
- var CUSTOM_MARKETPLACE = "acme-skills";
112
- var OTHER_MARKETPLACE = "zeta-skills";
113
- var JOINED_MARKETPLACES = `${CUSTOM_MARKETPLACE} \xB7 ${OTHER_MARKETPLACE}`;
114
- var CLIPPING_HEIGHT_ROWS = 8;
115
- var CLIPPED_LINES = 4;
116
- var renderInClippedViewport = () => render(
117
- /* @__PURE__ */ jsx(Box, { flexDirection: "column", height: CLIPPING_HEIGHT_ROWS, children: /* @__PURE__ */ jsx(SummaryPanel, {}) })
118
- );
119
- describe("SummaryPanel component", () => {
120
- let cleanup;
121
- beforeEach(() => {
122
- initializeMatrix(
123
- createMockMatrix(SKILLS.react, SKILLS.vitest, {
124
- suggestedStacks: [createMockResolvedStack(STACK_ID, STACK_NAME)]
125
- })
126
- );
127
- useWizardStore.setState({
128
- installedSkillConfigs: null,
129
- installedAgentConfigs: null,
130
- isInitMode: false,
131
- selectedStackId: null,
132
- skillConfigs: []
133
- });
134
- });
135
- afterEach(() => {
136
- cleanup?.();
137
- cleanup = void 0;
138
- });
139
- describe("header", () => {
140
- it("should name the default public marketplace when nothing is selected", () => {
141
- const { lastFrame, unmount } = render(/* @__PURE__ */ jsx(SummaryPanel, {}));
142
- cleanup = unmount;
143
- const output = lastFrame();
144
- globalExpect(output).toContain(`Marketplace ${DEFAULT_MARKETPLACE_LABEL}`);
145
- globalExpect(output).not.toContain(ALL_SKILLS_EJECTED_LABEL);
146
- });
147
- it("should say every skill is ejected when no selected skill names a marketplace", () => {
148
- useWizardStore.setState({
149
- skillConfigs: buildSkillConfigs([SKILLS.react.id], { source: EJECT_SOURCE })
150
- });
151
- const { lastFrame, unmount } = render(/* @__PURE__ */ jsx(SummaryPanel, {}));
152
- cleanup = unmount;
153
- const output = lastFrame();
154
- globalExpect(output).toContain(`Marketplace ${ALL_SKILLS_EJECTED_LABEL}`);
155
- globalExpect(output).not.toContain(DEFAULT_MARKETPLACE_LABEL);
156
- });
157
- it("should name the marketplace the selected skills come from", () => {
158
- useWizardStore.setState({
159
- skillConfigs: buildSkillConfigs([SKILLS.react.id], { source: CUSTOM_MARKETPLACE })
160
- });
161
- const { lastFrame, unmount } = render(/* @__PURE__ */ jsx(SummaryPanel, {}));
162
- cleanup = unmount;
163
- const output = lastFrame();
164
- globalExpect(output).toContain(`Marketplace ${CUSTOM_MARKETPLACE}`);
165
- globalExpect(output).not.toContain(DEFAULT_MARKETPLACE_LABEL);
166
- });
167
- it("should join every distinct marketplace in play", () => {
168
- useWizardStore.setState({
169
- skillConfigs: [
170
- ...buildSkillConfigs([SKILLS.react.id], { source: CUSTOM_MARKETPLACE }),
171
- ...buildSkillConfigs([SKILLS.vitest.id], { source: OTHER_MARKETPLACE })
172
- ]
173
- });
174
- const { lastFrame, unmount } = render(/* @__PURE__ */ jsx(SummaryPanel, {}));
175
- cleanup = unmount;
176
- globalExpect(lastFrame()).toContain(`Marketplace ${JOINED_MARKETPLACES}`);
177
- });
178
- it("should order the marketplaces the same way whatever order the configs hold", () => {
179
- useWizardStore.setState({
180
- skillConfigs: [
181
- ...buildSkillConfigs([SKILLS.vitest.id], { source: OTHER_MARKETPLACE }),
182
- ...buildSkillConfigs([SKILLS.react.id], { source: CUSTOM_MARKETPLACE })
183
- ]
184
- });
185
- const { lastFrame, unmount } = render(/* @__PURE__ */ jsx(SummaryPanel, {}));
186
- cleanup = unmount;
187
- globalExpect(lastFrame()).toContain(`Marketplace ${JOINED_MARKETPLACES}`);
188
- });
189
- it("should name a shared marketplace once", () => {
190
- useWizardStore.setState({
191
- skillConfigs: buildSkillConfigs([SKILLS.react.id, SKILLS.vitest.id], {
192
- source: CUSTOM_MARKETPLACE
193
- })
194
- });
195
- const { lastFrame, unmount } = render(/* @__PURE__ */ jsx(SummaryPanel, {}));
196
- cleanup = unmount;
197
- const output = lastFrame();
198
- globalExpect(output).toContain(`Marketplace ${CUSTOM_MARKETPLACE}`);
199
- globalExpect(output).not.toContain(`${CUSTOM_MARKETPLACE} \xB7 ${CUSTOM_MARKETPLACE}`);
200
- });
201
- it("should keep naming a marketplace when only some of the skills are ejected", () => {
202
- useWizardStore.setState({
203
- skillConfigs: [
204
- ...buildSkillConfigs([SKILLS.react.id], { source: EJECT_SOURCE }),
205
- ...buildSkillConfigs([SKILLS.vitest.id], { source: CUSTOM_MARKETPLACE })
206
- ]
207
- });
208
- const { lastFrame, unmount } = render(/* @__PURE__ */ jsx(SummaryPanel, {}));
209
- cleanup = unmount;
210
- const output = lastFrame();
211
- globalExpect(output).toContain(`Marketplace ${CUSTOM_MARKETPLACE}`);
212
- globalExpect(output).not.toContain(ALL_SKILLS_EJECTED_LABEL);
213
- });
214
- it("should name the marketplace of a masked global install", () => {
215
- useWizardStore.setState({
216
- skillConfigs: buildSkillConfigs([SKILLS.react.id], {
217
- scope: "global",
218
- source: CUSTOM_MARKETPLACE,
219
- excluded: true
220
- })
221
- });
222
- const { lastFrame, unmount } = render(/* @__PURE__ */ jsx(SummaryPanel, {}));
223
- cleanup = unmount;
224
- globalExpect(lastFrame()).toContain(`Marketplace ${CUSTOM_MARKETPLACE}`);
225
- });
226
- it("should resolve the selected stack id to its display name", () => {
227
- useWizardStore.setState({ selectedStackId: STACK_ID });
228
- const { lastFrame, unmount } = render(/* @__PURE__ */ jsx(SummaryPanel, {}));
229
- cleanup = unmount;
230
- globalExpect(lastFrame()).toContain(`Stack ${STACK_NAME}`);
231
- });
232
- it("should render a stack of none when no stack is selected", () => {
233
- useWizardStore.setState({ selectedStackId: null });
234
- const { lastFrame, unmount } = render(/* @__PURE__ */ jsx(SummaryPanel, {}));
235
- cleanup = unmount;
236
- globalExpect(lastFrame()).toContain("Stack none");
237
- });
238
- describe("stack id the matrix does not hold", () => {
239
- silenceConsole(["error"]);
240
- it("should surface it as an error instead of labelling the row with the raw id", () => {
241
- useWizardStore.setState({ selectedStackId: UNKNOWN_STACK_ID });
242
- const { frames, unmount } = render(/* @__PURE__ */ jsx(SummaryPanel, {}));
243
- cleanup = unmount;
244
- const paintedFrames = frames.join("\n");
245
- globalExpect(paintedFrames).toContain(`Stack not found: ${UNKNOWN_STACK_ID}`);
246
- globalExpect(paintedFrames).not.toContain(`Stack ${UNKNOWN_STACK_ID}`);
247
- });
248
- });
249
- });
250
- describe("summary", () => {
251
- it("should render the skills and agents held in the store", () => {
252
- useWizardStore.setState({
253
- skillConfigs: buildSkillConfigs(["web-framework-react"]),
254
- agentConfigs: buildAgentConfigs(["web-developer"])
255
- });
256
- const { lastFrame, unmount } = render(/* @__PURE__ */ jsx(SummaryPanel, {}));
257
- cleanup = unmount;
258
- const output = lastFrame();
259
- globalExpect(output).toContain("+ React");
260
- globalExpect(output).toContain("+ web-developer");
261
- });
262
- it("should render the header even when there is nothing to summarize", () => {
263
- const { lastFrame, unmount } = render(/* @__PURE__ */ jsx(SummaryPanel, {}));
264
- cleanup = unmount;
265
- const output = lastFrame();
266
- globalExpect(output).toContain(`Marketplace ${DEFAULT_MARKETPLACE_LABEL}`);
267
- globalExpect(output).not.toContain("Skills");
268
- });
269
- });
270
- describe("scrolling", () => {
271
- beforeEach(() => {
272
- useWizardStore.setState({
273
- skillConfigs: buildSkillConfigs(["web-framework-react"]),
274
- agentConfigs: buildAgentConfigs(["web-developer"])
275
- });
276
- });
277
- it("should count the lines it clips when the content outgrows the viewport", async () => {
278
- const { lastFrame, unmount } = renderInClippedViewport();
279
- cleanup = unmount;
280
- await delay(RENDER_DELAY_MS);
281
- globalExpect(lastFrame()).toContain(`${CLIPPED_LINES} more below`);
282
- });
283
- it("should move the content up one line per down-arrow press", async () => {
284
- const { stdin, lastFrame, unmount } = renderInClippedViewport();
285
- cleanup = unmount;
286
- await delay(RENDER_DELAY_MS);
287
- stdin.write(ARROW_DOWN);
288
- await delay(INPUT_DELAY_MS);
289
- const output = lastFrame();
290
- globalExpect(output).toContain("1 more above");
291
- globalExpect(output).toContain(`${CLIPPED_LINES - 1} more below`);
292
- });
293
- it("should stop at the top of the content on up-arrow", async () => {
294
- const { stdin, lastFrame, unmount } = renderInClippedViewport();
295
- cleanup = unmount;
296
- await delay(RENDER_DELAY_MS);
297
- stdin.write(ARROW_UP);
298
- await delay(INPUT_DELAY_MS);
299
- const output = lastFrame();
300
- globalExpect(output).not.toContain("more above");
301
- globalExpect(output).toContain(`${CLIPPED_LINES} more below`);
302
- });
303
- it("should stop at the last line of the content on further down-arrows", async () => {
304
- const { stdin, lastFrame, unmount } = renderInClippedViewport();
305
- cleanup = unmount;
306
- await delay(RENDER_DELAY_MS);
307
- for (let press = 0; press < CLIPPED_LINES + 1; press++) {
308
- stdin.write(ARROW_DOWN);
309
- await delay(INPUT_DELAY_MS);
310
- }
311
- const output = lastFrame();
312
- globalExpect(output).toContain(`${CLIPPED_LINES} more above`);
313
- globalExpect(output).not.toContain("more below");
314
- });
315
- });
316
- });
317
- //# sourceMappingURL=summary-panel.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/cli/components/wizard/summary-panel.test.tsx","../../../src/cli/lib/__tests__/helpers/silence-console.ts"],"sourcesContent":["import { Box } from \"ink\";\nimport { render } from \"ink-testing-library\";\nimport { afterEach, beforeEach, describe, expect, it } from \"vitest\";\nimport { SummaryPanel } from \"./summary-panel\";\nimport {\n ALL_SKILLS_EJECTED_LABEL,\n DEFAULT_PUBLIC_SOURCE_NAME,\n EJECT_SOURCE,\n formatSourceDisplayName,\n} from \"../../consts\";\nimport { buildAgentConfigs } from \"../../lib/__tests__/factories/config-factories\";\nimport { createMockMatrix } from \"../../lib/__tests__/factories/matrix-factories\";\nimport { createMockResolvedStack } from \"../../lib/__tests__/factories/stack-factories\";\nimport { silenceConsole } from \"../../lib/__tests__/helpers/silence-console\";\nimport { buildSkillConfigs } from \"../../lib/__tests__/helpers/wizard-simulation\";\nimport { initializeMatrix } from \"../../lib/matrix/matrix-provider\";\nimport { SKILLS } from \"../../lib/__tests__/test-fixtures\";\nimport {\n ARROW_DOWN,\n ARROW_UP,\n INPUT_DELAY_MS,\n RENDER_DELAY_MS,\n delay,\n} from \"../../lib/__tests__/test-constants\";\nimport { useWizardStore } from \"../../stores/wizard-store\";\n\nconst STACK_ID = \"nextjs-fullstack\";\nconst STACK_NAME = \"Next.js Full-Stack\";\nconst UNKNOWN_STACK_ID = \"ghost-stack\";\n\n/** The label the default public marketplace resolves to — `SOURCE_DISPLAY_NAMES` maps its name. */\nconst DEFAULT_MARKETPLACE_LABEL = formatSourceDisplayName(DEFAULT_PUBLIC_SOURCE_NAME);\n\n/**\n * Marketplaces `SOURCE_DISPLAY_NAMES` holds no label for, so each must render its own name\n * unchanged — the custom-marketplace case. Both lowercase and alphabetically ordered as written,\n * so the joined expectation reads in the same order the row sorts them into.\n */\nconst CUSTOM_MARKETPLACE = \"acme-skills\";\nconst OTHER_MARKETPLACE = \"zeta-skills\";\nconst JOINED_MARKETPLACES = `${CUSTOM_MARKETPLACE} · ${OTHER_MARKETPLACE}`;\n\n/** Shorter than the header plus summary, so the panel has to clip and say so. */\nconst CLIPPING_HEIGHT_ROWS = 8;\n/** Content lines the panel cannot show at {@link CLIPPING_HEIGHT_ROWS}, and so the travel a full scroll takes. */\nconst CLIPPED_LINES = 4;\n\nconst renderInClippedViewport = () =>\n render(\n <Box flexDirection=\"column\" height={CLIPPING_HEIGHT_ROWS}>\n <SummaryPanel />\n </Box>,\n );\n\ndescribe(\"SummaryPanel component\", () => {\n let cleanup: (() => void) | undefined;\n\n beforeEach(() => {\n initializeMatrix(\n createMockMatrix(SKILLS.react, SKILLS.vitest, {\n suggestedStacks: [createMockResolvedStack(STACK_ID, STACK_NAME)],\n }),\n );\n useWizardStore.setState({\n installedSkillConfigs: null,\n installedAgentConfigs: null,\n isInitMode: false,\n selectedStackId: null,\n skillConfigs: [],\n });\n });\n\n afterEach(() => {\n cleanup?.();\n cleanup = undefined;\n });\n\n describe(\"header\", () => {\n it(\"should name the default public marketplace when nothing is selected\", () => {\n const { lastFrame, unmount } = render(<SummaryPanel />);\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(`Marketplace ${DEFAULT_MARKETPLACE_LABEL}`);\n expect(output).not.toContain(ALL_SKILLS_EJECTED_LABEL);\n });\n\n it(\"should say every skill is ejected when no selected skill names a marketplace\", () => {\n useWizardStore.setState({\n skillConfigs: buildSkillConfigs([SKILLS.react.id], { source: EJECT_SOURCE }),\n });\n\n const { lastFrame, unmount } = render(<SummaryPanel />);\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(`Marketplace ${ALL_SKILLS_EJECTED_LABEL}`);\n expect(output).not.toContain(DEFAULT_MARKETPLACE_LABEL);\n });\n\n it(\"should name the marketplace the selected skills come from\", () => {\n useWizardStore.setState({\n skillConfigs: buildSkillConfigs([SKILLS.react.id], { source: CUSTOM_MARKETPLACE }),\n });\n\n const { lastFrame, unmount } = render(<SummaryPanel />);\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(`Marketplace ${CUSTOM_MARKETPLACE}`);\n expect(output).not.toContain(DEFAULT_MARKETPLACE_LABEL);\n });\n\n it(\"should join every distinct marketplace in play\", () => {\n useWizardStore.setState({\n skillConfigs: [\n ...buildSkillConfigs([SKILLS.react.id], { source: CUSTOM_MARKETPLACE }),\n ...buildSkillConfigs([SKILLS.vitest.id], { source: OTHER_MARKETPLACE }),\n ],\n });\n\n const { lastFrame, unmount } = render(<SummaryPanel />);\n cleanup = unmount;\n\n expect(lastFrame()).toContain(`Marketplace ${JOINED_MARKETPLACES}`);\n });\n\n it(\"should order the marketplaces the same way whatever order the configs hold\", () => {\n useWizardStore.setState({\n skillConfigs: [\n ...buildSkillConfigs([SKILLS.vitest.id], { source: OTHER_MARKETPLACE }),\n ...buildSkillConfigs([SKILLS.react.id], { source: CUSTOM_MARKETPLACE }),\n ],\n });\n\n const { lastFrame, unmount } = render(<SummaryPanel />);\n cleanup = unmount;\n\n expect(lastFrame()).toContain(`Marketplace ${JOINED_MARKETPLACES}`);\n });\n\n it(\"should name a shared marketplace once\", () => {\n useWizardStore.setState({\n skillConfigs: buildSkillConfigs([SKILLS.react.id, SKILLS.vitest.id], {\n source: CUSTOM_MARKETPLACE,\n }),\n });\n\n const { lastFrame, unmount } = render(<SummaryPanel />);\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(`Marketplace ${CUSTOM_MARKETPLACE}`);\n expect(output).not.toContain(`${CUSTOM_MARKETPLACE} · ${CUSTOM_MARKETPLACE}`);\n });\n\n it(\"should keep naming a marketplace when only some of the skills are ejected\", () => {\n useWizardStore.setState({\n skillConfigs: [\n ...buildSkillConfigs([SKILLS.react.id], { source: EJECT_SOURCE }),\n ...buildSkillConfigs([SKILLS.vitest.id], { source: CUSTOM_MARKETPLACE }),\n ],\n });\n\n const { lastFrame, unmount } = render(<SummaryPanel />);\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(`Marketplace ${CUSTOM_MARKETPLACE}`);\n expect(output).not.toContain(ALL_SKILLS_EJECTED_LABEL);\n });\n\n it(\"should name the marketplace of a masked global install\", () => {\n // A tombstone still records a real global install and where it came from, and the summary\n // below renders it as a row — so the header has to own it too.\n useWizardStore.setState({\n skillConfigs: buildSkillConfigs([SKILLS.react.id], {\n scope: \"global\",\n source: CUSTOM_MARKETPLACE,\n excluded: true,\n }),\n });\n\n const { lastFrame, unmount } = render(<SummaryPanel />);\n cleanup = unmount;\n\n expect(lastFrame()).toContain(`Marketplace ${CUSTOM_MARKETPLACE}`);\n });\n\n it(\"should resolve the selected stack id to its display name\", () => {\n useWizardStore.setState({ selectedStackId: STACK_ID });\n\n const { lastFrame, unmount } = render(<SummaryPanel />);\n cleanup = unmount;\n\n expect(lastFrame()).toContain(`Stack ${STACK_NAME}`);\n });\n\n it(\"should render a stack of none when no stack is selected\", () => {\n useWizardStore.setState({ selectedStackId: null });\n\n const { lastFrame, unmount } = render(<SummaryPanel />);\n cleanup = unmount;\n\n expect(lastFrame()).toContain(\"Stack none\");\n });\n\n describe(\"stack id the matrix does not hold\", () => {\n silenceConsole([\"error\"]);\n\n it(\"should surface it as an error instead of labelling the row with the raw id\", () => {\n useWizardStore.setState({ selectedStackId: UNKNOWN_STACK_ID });\n\n // Ink's error boundary catches the throw and paints the message, so the\n // frames — not a rejected render() — are where the assertion lands.\n // Every frame, though, and never `lastFrame()`: catching the throw also\n // exits the app, and Ink's exit path appends a bare \"\\n\" of its own\n // whenever `CI` is set in the environment (`unmount` in ink.js guards\n // that write with `is-in-ci`). It is the last frame written without\n // being one the panel painted, so `lastFrame()` reads Ink's teardown\n // under CI and the painted error everywhere else. Nothing here is\n // timing-dependent — both writes land synchronously inside `render`.\n const { frames, unmount } = render(<SummaryPanel />);\n cleanup = unmount;\n\n const paintedFrames = frames.join(\"\\n\");\n expect(paintedFrames).toContain(`Stack not found: ${UNKNOWN_STACK_ID}`);\n expect(paintedFrames).not.toContain(`Stack ${UNKNOWN_STACK_ID}`);\n });\n });\n });\n\n describe(\"summary\", () => {\n it(\"should render the skills and agents held in the store\", () => {\n useWizardStore.setState({\n skillConfigs: buildSkillConfigs([\"web-framework-react\"]),\n agentConfigs: buildAgentConfigs([\"web-developer\"]),\n });\n\n const { lastFrame, unmount } = render(<SummaryPanel />);\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"+ React\");\n expect(output).toContain(\"+ web-developer\");\n });\n\n it(\"should render the header even when there is nothing to summarize\", () => {\n const { lastFrame, unmount } = render(<SummaryPanel />);\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(`Marketplace ${DEFAULT_MARKETPLACE_LABEL}`);\n expect(output).not.toContain(\"Skills\");\n });\n });\n\n describe(\"scrolling\", () => {\n beforeEach(() => {\n useWizardStore.setState({\n skillConfigs: buildSkillConfigs([\"web-framework-react\"]),\n agentConfigs: buildAgentConfigs([\"web-developer\"]),\n });\n });\n\n it(\"should count the lines it clips when the content outgrows the viewport\", async () => {\n const { lastFrame, unmount } = renderInClippedViewport();\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n expect(lastFrame()).toContain(`${CLIPPED_LINES} more below`);\n });\n\n it(\"should move the content up one line per down-arrow press\", async () => {\n const { stdin, lastFrame, unmount } = renderInClippedViewport();\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n stdin.write(ARROW_DOWN);\n await delay(INPUT_DELAY_MS);\n\n const output = lastFrame();\n expect(output).toContain(\"1 more above\");\n expect(output).toContain(`${CLIPPED_LINES - 1} more below`);\n });\n\n it(\"should stop at the top of the content on up-arrow\", async () => {\n const { stdin, lastFrame, unmount } = renderInClippedViewport();\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n stdin.write(ARROW_UP);\n await delay(INPUT_DELAY_MS);\n\n const output = lastFrame();\n expect(output).not.toContain(\"more above\");\n expect(output).toContain(`${CLIPPED_LINES} more below`);\n });\n\n it(\"should stop at the last line of the content on further down-arrows\", async () => {\n const { stdin, lastFrame, unmount } = renderInClippedViewport();\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n for (let press = 0; press < CLIPPED_LINES + 1; press++) {\n stdin.write(ARROW_DOWN);\n await delay(INPUT_DELAY_MS);\n }\n\n const output = lastFrame();\n expect(output).toContain(`${CLIPPED_LINES} more above`);\n expect(output).not.toContain(\"more below\");\n });\n });\n});\n","import { afterEach, beforeEach, vi, type MockInstance } from \"vitest\";\n\ntype ConsoleMethod = \"log\" | \"warn\" | \"error\" | \"info\" | \"debug\";\n\nconst DEFAULT_METHODS: ConsoleMethod[] = [\"log\", \"warn\", \"error\"];\n\n/**\n * Registers a `beforeEach` that replaces the given console methods (default\n * log/warn/error) with no-op spies, and an `afterEach` that restores them via\n * `mockRestore`. Returns a live record of the spies so a test can assert on\n * the captured calls (e.g. `spies.log`). Only the requested `methods` get an\n * entry — the rest stay `undefined`.\n *\n * Call once at the top of a describe block. Only restores the console spies it\n * created — unlike `vi.restoreAllMocks()`, it leaves unrelated spies untouched.\n */\nexport function silenceConsole(\n methods: ConsoleMethod[] = DEFAULT_METHODS,\n): Partial<Record<ConsoleMethod, MockInstance>> {\n const spies: Partial<Record<ConsoleMethod, MockInstance>> = {};\n\n beforeEach(() => {\n for (const method of methods) {\n spies[method] = vi.spyOn(console, method).mockImplementation(() => {});\n }\n });\n\n afterEach(() => {\n for (const method of methods) {\n spies[method]?.mockRestore();\n }\n });\n\n return spies;\n}\n"],"mappings":"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","names":[]}