@agents-inc/cli 0.32.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 (497) hide show
  1. package/CHANGELOG.md +462 -0
  2. package/LICENSE +21 -0
  3. package/README.md +179 -0
  4. package/config/skills-matrix.yaml +926 -0
  5. package/config/stacks.yaml +2186 -0
  6. package/dist/chunk-3ZOIOVKT.js +365 -0
  7. package/dist/chunk-3ZOIOVKT.js.map +1 -0
  8. package/dist/chunk-4RAY5AOI.js +78 -0
  9. package/dist/chunk-4RAY5AOI.js.map +1 -0
  10. package/dist/chunk-5PIKNCZX.js +234 -0
  11. package/dist/chunk-5PIKNCZX.js.map +1 -0
  12. package/dist/chunk-66UDJBF6.js +96 -0
  13. package/dist/chunk-66UDJBF6.js.map +1 -0
  14. package/dist/chunk-7SOPVGDV.js +24 -0
  15. package/dist/chunk-7SOPVGDV.js.map +1 -0
  16. package/dist/chunk-A27LOC4Z.js +95 -0
  17. package/dist/chunk-A27LOC4Z.js.map +1 -0
  18. package/dist/chunk-B2UBHA66.js +301 -0
  19. package/dist/chunk-B2UBHA66.js.map +1 -0
  20. package/dist/chunk-BZN2Z5P7.js +882 -0
  21. package/dist/chunk-BZN2Z5P7.js.map +1 -0
  22. package/dist/chunk-BZQBJP34.js +186 -0
  23. package/dist/chunk-BZQBJP34.js.map +1 -0
  24. package/dist/chunk-DC5AK3LW.js +105 -0
  25. package/dist/chunk-DC5AK3LW.js.map +1 -0
  26. package/dist/chunk-DHET7RCE.js +50 -0
  27. package/dist/chunk-DHET7RCE.js.map +1 -0
  28. package/dist/chunk-EMJ2ZKS7.js +346 -0
  29. package/dist/chunk-EMJ2ZKS7.js.map +1 -0
  30. package/dist/chunk-FJQRVFMB.js +48 -0
  31. package/dist/chunk-FJQRVFMB.js.map +1 -0
  32. package/dist/chunk-FZGYSLJL.js +85 -0
  33. package/dist/chunk-FZGYSLJL.js.map +1 -0
  34. package/dist/chunk-H566H3MQ.js +87 -0
  35. package/dist/chunk-H566H3MQ.js.map +1 -0
  36. package/dist/chunk-IYG2LAIM.js +90 -0
  37. package/dist/chunk-IYG2LAIM.js.map +1 -0
  38. package/dist/chunk-IZZ4IIEG.js +29 -0
  39. package/dist/chunk-IZZ4IIEG.js.map +1 -0
  40. package/dist/chunk-JMVWYAHT.js +63 -0
  41. package/dist/chunk-JMVWYAHT.js.map +1 -0
  42. package/dist/chunk-LAPCUV4D.js +191 -0
  43. package/dist/chunk-LAPCUV4D.js.map +1 -0
  44. package/dist/chunk-LGUI3PMO.js +109 -0
  45. package/dist/chunk-LGUI3PMO.js.map +1 -0
  46. package/dist/chunk-MM7NK5N2.js +4542 -0
  47. package/dist/chunk-MM7NK5N2.js.map +1 -0
  48. package/dist/chunk-N6S7ZRIL.js +31 -0
  49. package/dist/chunk-N6S7ZRIL.js.map +1 -0
  50. package/dist/chunk-O4D67NN7.js +24 -0
  51. package/dist/chunk-O4D67NN7.js.map +1 -0
  52. package/dist/chunk-ODUOU55D.js +56 -0
  53. package/dist/chunk-ODUOU55D.js.map +1 -0
  54. package/dist/chunk-OGJIZ6QH.js +497 -0
  55. package/dist/chunk-OGJIZ6QH.js.map +1 -0
  56. package/dist/chunk-OMV7TLWD.js +340 -0
  57. package/dist/chunk-OMV7TLWD.js.map +1 -0
  58. package/dist/chunk-PBEHPQLK.js +146 -0
  59. package/dist/chunk-PBEHPQLK.js.map +1 -0
  60. package/dist/chunk-QPTOIZAT.js +32 -0
  61. package/dist/chunk-QPTOIZAT.js.map +1 -0
  62. package/dist/chunk-R3XFQKPG.js +111 -0
  63. package/dist/chunk-R3XFQKPG.js.map +1 -0
  64. package/dist/chunk-R74PZWQS.js +69 -0
  65. package/dist/chunk-R74PZWQS.js.map +1 -0
  66. package/dist/chunk-SO22IQPY.js +45 -0
  67. package/dist/chunk-SO22IQPY.js.map +1 -0
  68. package/dist/chunk-T4EXUIBY.js +19 -0
  69. package/dist/chunk-T4EXUIBY.js.map +1 -0
  70. package/dist/chunk-U3IGFMCY.js +31 -0
  71. package/dist/chunk-U3IGFMCY.js.map +1 -0
  72. package/dist/chunk-UICL22RT.js +318 -0
  73. package/dist/chunk-UICL22RT.js.map +1 -0
  74. package/dist/chunk-UX2H2K2G.js +183 -0
  75. package/dist/chunk-UX2H2K2G.js.map +1 -0
  76. package/dist/chunk-W2ZSCZ2U.js +93 -0
  77. package/dist/chunk-W2ZSCZ2U.js.map +1 -0
  78. package/dist/chunk-WEUVWHMA.js +189 -0
  79. package/dist/chunk-WEUVWHMA.js.map +1 -0
  80. package/dist/chunk-XY3XDVMI.js +15599 -0
  81. package/dist/chunk-XY3XDVMI.js.map +1 -0
  82. package/dist/chunk-YND42IXK.js +233 -0
  83. package/dist/chunk-YND42IXK.js.map +1 -0
  84. package/dist/chunk-YZTWZVGX.js +41 -0
  85. package/dist/chunk-YZTWZVGX.js.map +1 -0
  86. package/dist/chunk-Z4TWOP3H.js +81 -0
  87. package/dist/chunk-Z4TWOP3H.js.map +1 -0
  88. package/dist/cli/defaults/agent-mappings.yaml +271 -0
  89. package/dist/commands/build/marketplace.js +252 -0
  90. package/dist/commands/build/marketplace.js.map +1 -0
  91. package/dist/commands/build/plugins.js +114 -0
  92. package/dist/commands/build/plugins.js.map +1 -0
  93. package/dist/commands/build/stack.js +153 -0
  94. package/dist/commands/build/stack.js.map +1 -0
  95. package/dist/commands/compile.js +354 -0
  96. package/dist/commands/compile.js.map +1 -0
  97. package/dist/commands/config/get.js +61 -0
  98. package/dist/commands/config/get.js.map +1 -0
  99. package/dist/commands/config/index.js +23 -0
  100. package/dist/commands/config/index.js.map +1 -0
  101. package/dist/commands/config/path.js +34 -0
  102. package/dist/commands/config/path.js.map +1 -0
  103. package/dist/commands/config/set-project.js +61 -0
  104. package/dist/commands/config/set-project.js.map +1 -0
  105. package/dist/commands/config/show.js +14 -0
  106. package/dist/commands/config/show.js.map +1 -0
  107. package/dist/commands/config/unset-project.js +57 -0
  108. package/dist/commands/config/unset-project.js.map +1 -0
  109. package/dist/commands/diff.js +742 -0
  110. package/dist/commands/diff.js.map +1 -0
  111. package/dist/commands/doctor.js +370 -0
  112. package/dist/commands/doctor.js.map +1 -0
  113. package/dist/commands/edit.js +301 -0
  114. package/dist/commands/edit.js.map +1 -0
  115. package/dist/commands/eject.js +262 -0
  116. package/dist/commands/eject.js.map +1 -0
  117. package/dist/commands/import/skill.js +361 -0
  118. package/dist/commands/import/skill.js.map +1 -0
  119. package/dist/commands/info.js +217 -0
  120. package/dist/commands/info.js.map +1 -0
  121. package/dist/commands/init.js +443 -0
  122. package/dist/commands/init.js.map +1 -0
  123. package/dist/commands/list.js +49 -0
  124. package/dist/commands/list.js.map +1 -0
  125. package/dist/commands/new/agent.js +224 -0
  126. package/dist/commands/new/agent.js.map +1 -0
  127. package/dist/commands/new/skill.js +199 -0
  128. package/dist/commands/new/skill.js.map +1 -0
  129. package/dist/commands/outdated.js +176 -0
  130. package/dist/commands/outdated.js.map +1 -0
  131. package/dist/commands/search.js +288 -0
  132. package/dist/commands/search.js.map +1 -0
  133. package/dist/commands/uninstall.js +302 -0
  134. package/dist/commands/uninstall.js.map +1 -0
  135. package/dist/commands/update.js +304 -0
  136. package/dist/commands/update.js.map +1 -0
  137. package/dist/commands/validate.js +389 -0
  138. package/dist/commands/validate.js.map +1 -0
  139. package/dist/commands/version/bump.js +79 -0
  140. package/dist/commands/version/bump.js.map +1 -0
  141. package/dist/commands/version/index.js +54 -0
  142. package/dist/commands/version/index.js.map +1 -0
  143. package/dist/commands/version/set.js +86 -0
  144. package/dist/commands/version/set.js.map +1 -0
  145. package/dist/commands/version/show.js +54 -0
  146. package/dist/commands/version/show.js.map +1 -0
  147. package/dist/components/common/confirm.js +9 -0
  148. package/dist/components/common/confirm.js.map +1 -0
  149. package/dist/components/common/confirm.test.js +203 -0
  150. package/dist/components/common/confirm.test.js.map +1 -0
  151. package/dist/components/common/message.js +20 -0
  152. package/dist/components/common/message.js.map +1 -0
  153. package/dist/components/common/spinner.js +14 -0
  154. package/dist/components/common/spinner.js.map +1 -0
  155. package/dist/components/skill-search/skill-search.js +12 -0
  156. package/dist/components/skill-search/skill-search.js.map +1 -0
  157. package/dist/components/wizard/category-grid.js +11 -0
  158. package/dist/components/wizard/category-grid.js.map +1 -0
  159. package/dist/components/wizard/category-grid.test.js +997 -0
  160. package/dist/components/wizard/category-grid.test.js.map +1 -0
  161. package/dist/components/wizard/domain-selection.js +14 -0
  162. package/dist/components/wizard/domain-selection.js.map +1 -0
  163. package/dist/components/wizard/help-modal.js +10 -0
  164. package/dist/components/wizard/help-modal.js.map +1 -0
  165. package/dist/components/wizard/menu-item.js +10 -0
  166. package/dist/components/wizard/menu-item.js.map +1 -0
  167. package/dist/components/wizard/search-modal.js +11 -0
  168. package/dist/components/wizard/search-modal.js.map +1 -0
  169. package/dist/components/wizard/search-modal.test.js +218 -0
  170. package/dist/components/wizard/search-modal.test.js.map +1 -0
  171. package/dist/components/wizard/section-progress.js +10 -0
  172. package/dist/components/wizard/section-progress.js.map +1 -0
  173. package/dist/components/wizard/section-progress.test.js +192 -0
  174. package/dist/components/wizard/section-progress.test.js.map +1 -0
  175. package/dist/components/wizard/source-grid.js +14 -0
  176. package/dist/components/wizard/source-grid.js.map +1 -0
  177. package/dist/components/wizard/source-grid.test.js +504 -0
  178. package/dist/components/wizard/source-grid.test.js.map +1 -0
  179. package/dist/components/wizard/stack-selection.js +17 -0
  180. package/dist/components/wizard/stack-selection.js.map +1 -0
  181. package/dist/components/wizard/step-build.js +17 -0
  182. package/dist/components/wizard/step-build.js.map +1 -0
  183. package/dist/components/wizard/step-build.test.js +600 -0
  184. package/dist/components/wizard/step-build.test.js.map +1 -0
  185. package/dist/components/wizard/step-confirm.js +12 -0
  186. package/dist/components/wizard/step-confirm.js.map +1 -0
  187. package/dist/components/wizard/step-confirm.test.js +366 -0
  188. package/dist/components/wizard/step-confirm.test.js.map +1 -0
  189. package/dist/components/wizard/step-refine.js +10 -0
  190. package/dist/components/wizard/step-refine.js.map +1 -0
  191. package/dist/components/wizard/step-refine.test.js +237 -0
  192. package/dist/components/wizard/step-refine.test.js.map +1 -0
  193. package/dist/components/wizard/step-settings.js +17 -0
  194. package/dist/components/wizard/step-settings.js.map +1 -0
  195. package/dist/components/wizard/step-settings.test.js +243 -0
  196. package/dist/components/wizard/step-settings.test.js.map +1 -0
  197. package/dist/components/wizard/step-sources.js +20 -0
  198. package/dist/components/wizard/step-sources.js.map +1 -0
  199. package/dist/components/wizard/step-sources.test.js +294 -0
  200. package/dist/components/wizard/step-sources.test.js.map +1 -0
  201. package/dist/components/wizard/step-stack.js +19 -0
  202. package/dist/components/wizard/step-stack.js.map +1 -0
  203. package/dist/components/wizard/step-stack.test.js +357 -0
  204. package/dist/components/wizard/step-stack.test.js.map +1 -0
  205. package/dist/components/wizard/view-title.js +10 -0
  206. package/dist/components/wizard/view-title.js.map +1 -0
  207. package/dist/components/wizard/wizard-layout.js +16 -0
  208. package/dist/components/wizard/wizard-layout.js.map +1 -0
  209. package/dist/components/wizard/wizard-tabs.js +14 -0
  210. package/dist/components/wizard/wizard-tabs.js.map +1 -0
  211. package/dist/components/wizard/wizard-tabs.test.js +294 -0
  212. package/dist/components/wizard/wizard-tabs.test.js.map +1 -0
  213. package/dist/components/wizard/wizard.js +35 -0
  214. package/dist/components/wizard/wizard.js.map +1 -0
  215. package/dist/config/skills-matrix.yaml +926 -0
  216. package/dist/config/stacks.yaml +2186 -0
  217. package/dist/hooks/init.js +40 -0
  218. package/dist/hooks/init.js.map +1 -0
  219. package/dist/index.js +10 -0
  220. package/dist/index.js.map +1 -0
  221. package/dist/magic-string.es-RGXYGAW3.js +1316 -0
  222. package/dist/magic-string.es-RGXYGAW3.js.map +1 -0
  223. package/dist/source-manager-SBPPLOQQ.js +16 -0
  224. package/dist/source-manager-SBPPLOQQ.js.map +1 -0
  225. package/dist/src/agents/_templates/agent.liquid +140 -0
  226. package/dist/src/agents/developer/api-developer/agent.yaml +12 -0
  227. package/dist/src/agents/developer/api-developer/critical-reminders.md +23 -0
  228. package/dist/src/agents/developer/api-developer/critical-requirements.md +11 -0
  229. package/dist/src/agents/developer/api-developer/examples.md +72 -0
  230. package/dist/src/agents/developer/api-developer/intro.md +22 -0
  231. package/dist/src/agents/developer/api-developer/output-format.md +359 -0
  232. package/dist/src/agents/developer/api-developer/workflow.md +471 -0
  233. package/dist/src/agents/developer/cli-developer/agent.yaml +12 -0
  234. package/dist/src/agents/developer/cli-developer/critical-reminders.md +28 -0
  235. package/dist/src/agents/developer/cli-developer/critical-requirements.md +15 -0
  236. package/dist/src/agents/developer/cli-developer/examples.md +68 -0
  237. package/dist/src/agents/developer/cli-developer/intro.md +23 -0
  238. package/dist/src/agents/developer/cli-developer/output-format.md +216 -0
  239. package/dist/src/agents/developer/cli-developer/workflow.md +509 -0
  240. package/dist/src/agents/developer/web-architecture/agent.yaml +12 -0
  241. package/dist/src/agents/developer/web-architecture/critical-reminders.md +27 -0
  242. package/dist/src/agents/developer/web-architecture/critical-requirements.md +35 -0
  243. package/dist/src/agents/developer/web-architecture/examples.md +187 -0
  244. package/dist/src/agents/developer/web-architecture/intro.md +35 -0
  245. package/dist/src/agents/developer/web-architecture/output-format.md +261 -0
  246. package/dist/src/agents/developer/web-architecture/workflow.md +599 -0
  247. package/dist/src/agents/developer/web-developer/agent.yaml +12 -0
  248. package/dist/src/agents/developer/web-developer/critical-reminders.md +17 -0
  249. package/dist/src/agents/developer/web-developer/critical-requirements.md +15 -0
  250. package/dist/src/agents/developer/web-developer/examples.md +109 -0
  251. package/dist/src/agents/developer/web-developer/intro.md +5 -0
  252. package/dist/src/agents/developer/web-developer/output-format.md +213 -0
  253. package/dist/src/agents/developer/web-developer/workflow.md +459 -0
  254. package/dist/src/agents/meta/agent-summoner/agent.yaml +12 -0
  255. package/dist/src/agents/meta/agent-summoner/critical-reminders.md +31 -0
  256. package/dist/src/agents/meta/agent-summoner/critical-requirements.md +27 -0
  257. package/dist/src/agents/meta/agent-summoner/examples.md +176 -0
  258. package/dist/src/agents/meta/agent-summoner/intro.md +9 -0
  259. package/dist/src/agents/meta/agent-summoner/output-format.md +115 -0
  260. package/dist/src/agents/meta/agent-summoner/workflow.md +1540 -0
  261. package/dist/src/agents/meta/documentor/agent.yaml +11 -0
  262. package/dist/src/agents/meta/documentor/critical-reminders.md +23 -0
  263. package/dist/src/agents/meta/documentor/critical-requirements.md +13 -0
  264. package/dist/src/agents/meta/documentor/examples.md +147 -0
  265. package/dist/src/agents/meta/documentor/intro.md +11 -0
  266. package/dist/src/agents/meta/documentor/output-format.md +237 -0
  267. package/dist/src/agents/meta/documentor/workflow.md +1271 -0
  268. package/dist/src/agents/meta/skill-summoner/agent.yaml +13 -0
  269. package/dist/src/agents/meta/skill-summoner/critical-reminders.md +73 -0
  270. package/dist/src/agents/meta/skill-summoner/critical-requirements.md +62 -0
  271. package/dist/src/agents/meta/skill-summoner/examples.md +116 -0
  272. package/dist/src/agents/meta/skill-summoner/intro.md +5 -0
  273. package/dist/src/agents/meta/skill-summoner/output-format.md +279 -0
  274. package/dist/src/agents/meta/skill-summoner/workflow.md +1485 -0
  275. package/dist/src/agents/migration/cli-migrator/agent.yaml +12 -0
  276. package/dist/src/agents/migration/cli-migrator/anti-patterns.md +158 -0
  277. package/dist/src/agents/migration/cli-migrator/conversion-mappings.md +63 -0
  278. package/dist/src/agents/migration/cli-migrator/critical-reminders.md +17 -0
  279. package/dist/src/agents/migration/cli-migrator/critical-requirements.md +13 -0
  280. package/dist/src/agents/migration/cli-migrator/intro.md +15 -0
  281. package/dist/src/agents/migration/cli-migrator/output-format.md +164 -0
  282. package/dist/src/agents/migration/cli-migrator/workflow.md +230 -0
  283. package/dist/src/agents/pattern/pattern-scout/agent.yaml +10 -0
  284. package/dist/src/agents/pattern/pattern-scout/critical-reminders.md +58 -0
  285. package/dist/src/agents/pattern/pattern-scout/critical-requirements.md +17 -0
  286. package/dist/src/agents/pattern/pattern-scout/examples.md +93 -0
  287. package/dist/src/agents/pattern/pattern-scout/intro.md +3 -0
  288. package/dist/src/agents/pattern/pattern-scout/output-format.md +196 -0
  289. package/dist/src/agents/pattern/pattern-scout/workflow.md +1901 -0
  290. package/dist/src/agents/pattern/web-pattern-critique/agent.yaml +12 -0
  291. package/dist/src/agents/pattern/web-pattern-critique/critical-reminders.md +13 -0
  292. package/dist/src/agents/pattern/web-pattern-critique/critical-requirements.md +11 -0
  293. package/dist/src/agents/pattern/web-pattern-critique/examples.md +56 -0
  294. package/dist/src/agents/pattern/web-pattern-critique/intro.md +5 -0
  295. package/dist/src/agents/pattern/web-pattern-critique/output-format.md +257 -0
  296. package/dist/src/agents/pattern/web-pattern-critique/workflow.md +674 -0
  297. package/dist/src/agents/planning/web-pm/agent.yaml +12 -0
  298. package/dist/src/agents/planning/web-pm/critical-reminders.md +21 -0
  299. package/dist/src/agents/planning/web-pm/critical-requirements.md +17 -0
  300. package/dist/src/agents/planning/web-pm/examples.md +85 -0
  301. package/dist/src/agents/planning/web-pm/intro.md +3 -0
  302. package/dist/src/agents/planning/web-pm/output-format.md +228 -0
  303. package/dist/src/agents/planning/web-pm/workflow.md +393 -0
  304. package/dist/src/agents/researcher/api-researcher/agent.yaml +10 -0
  305. package/dist/src/agents/researcher/api-researcher/critical-reminders.md +27 -0
  306. package/dist/src/agents/researcher/api-researcher/critical-requirements.md +13 -0
  307. package/dist/src/agents/researcher/api-researcher/examples.md +116 -0
  308. package/dist/src/agents/researcher/api-researcher/intro.md +32 -0
  309. package/dist/src/agents/researcher/api-researcher/output-format.md +135 -0
  310. package/dist/src/agents/researcher/api-researcher/workflow.md +261 -0
  311. package/dist/src/agents/researcher/web-researcher/agent.yaml +10 -0
  312. package/dist/src/agents/researcher/web-researcher/critical-reminders.md +23 -0
  313. package/dist/src/agents/researcher/web-researcher/critical-requirements.md +11 -0
  314. package/dist/src/agents/researcher/web-researcher/examples.md +126 -0
  315. package/dist/src/agents/researcher/web-researcher/intro.md +31 -0
  316. package/dist/src/agents/researcher/web-researcher/output-format.md +112 -0
  317. package/dist/src/agents/researcher/web-researcher/workflow.md +322 -0
  318. package/dist/src/agents/reviewer/api-reviewer/agent.yaml +12 -0
  319. package/dist/src/agents/reviewer/api-reviewer/critical-reminders.md +16 -0
  320. package/dist/src/agents/reviewer/api-reviewer/critical-requirements.md +13 -0
  321. package/dist/src/agents/reviewer/api-reviewer/examples.md +54 -0
  322. package/dist/src/agents/reviewer/api-reviewer/intro.md +22 -0
  323. package/dist/src/agents/reviewer/api-reviewer/output-format.md +288 -0
  324. package/dist/src/agents/reviewer/api-reviewer/workflow.md +369 -0
  325. package/dist/src/agents/reviewer/cli-reviewer/agent.yaml +12 -0
  326. package/dist/src/agents/reviewer/cli-reviewer/critical-reminders.md +17 -0
  327. package/dist/src/agents/reviewer/cli-reviewer/critical-requirements.md +13 -0
  328. package/dist/src/agents/reviewer/cli-reviewer/examples.md +83 -0
  329. package/dist/src/agents/reviewer/cli-reviewer/intro.md +21 -0
  330. package/dist/src/agents/reviewer/cli-reviewer/output-format.md +330 -0
  331. package/dist/src/agents/reviewer/cli-reviewer/workflow.md +294 -0
  332. package/dist/src/agents/reviewer/web-reviewer/agent.yaml +12 -0
  333. package/dist/src/agents/reviewer/web-reviewer/critical-reminders.md +17 -0
  334. package/dist/src/agents/reviewer/web-reviewer/critical-requirements.md +11 -0
  335. package/dist/src/agents/reviewer/web-reviewer/examples.md +79 -0
  336. package/dist/src/agents/reviewer/web-reviewer/intro.md +20 -0
  337. package/dist/src/agents/reviewer/web-reviewer/output-format.md +253 -0
  338. package/dist/src/agents/reviewer/web-reviewer/workflow.md +228 -0
  339. package/dist/src/agents/tester/cli-tester/agent.yaml +12 -0
  340. package/dist/src/agents/tester/cli-tester/critical-reminders.md +19 -0
  341. package/dist/src/agents/tester/cli-tester/critical-requirements.md +17 -0
  342. package/dist/src/agents/tester/cli-tester/examples.md +80 -0
  343. package/dist/src/agents/tester/cli-tester/intro.md +19 -0
  344. package/dist/src/agents/tester/cli-tester/output-format.md +232 -0
  345. package/dist/src/agents/tester/cli-tester/workflow.md +304 -0
  346. package/dist/src/agents/tester/web-tester/agent.yaml +12 -0
  347. package/dist/src/agents/tester/web-tester/critical-reminders.md +15 -0
  348. package/dist/src/agents/tester/web-tester/critical-requirements.md +11 -0
  349. package/dist/src/agents/tester/web-tester/examples.md +68 -0
  350. package/dist/src/agents/tester/web-tester/intro.md +18 -0
  351. package/dist/src/agents/tester/web-tester/output-format.md +252 -0
  352. package/dist/src/agents/tester/web-tester/workflow.md +507 -0
  353. package/dist/stores/wizard-store.js +13 -0
  354. package/dist/stores/wizard-store.js.map +1 -0
  355. package/dist/stores/wizard-store.test.js +689 -0
  356. package/dist/stores/wizard-store.test.js.map +1 -0
  357. package/package.json +134 -0
  358. package/src/agents/_templates/agent.liquid +140 -0
  359. package/src/agents/developer/api-developer/agent.yaml +12 -0
  360. package/src/agents/developer/api-developer/critical-reminders.md +23 -0
  361. package/src/agents/developer/api-developer/critical-requirements.md +11 -0
  362. package/src/agents/developer/api-developer/examples.md +72 -0
  363. package/src/agents/developer/api-developer/intro.md +22 -0
  364. package/src/agents/developer/api-developer/output-format.md +359 -0
  365. package/src/agents/developer/api-developer/workflow.md +471 -0
  366. package/src/agents/developer/cli-developer/agent.yaml +12 -0
  367. package/src/agents/developer/cli-developer/critical-reminders.md +28 -0
  368. package/src/agents/developer/cli-developer/critical-requirements.md +15 -0
  369. package/src/agents/developer/cli-developer/examples.md +68 -0
  370. package/src/agents/developer/cli-developer/intro.md +23 -0
  371. package/src/agents/developer/cli-developer/output-format.md +216 -0
  372. package/src/agents/developer/cli-developer/workflow.md +509 -0
  373. package/src/agents/developer/web-architecture/agent.yaml +12 -0
  374. package/src/agents/developer/web-architecture/critical-reminders.md +27 -0
  375. package/src/agents/developer/web-architecture/critical-requirements.md +35 -0
  376. package/src/agents/developer/web-architecture/examples.md +187 -0
  377. package/src/agents/developer/web-architecture/intro.md +35 -0
  378. package/src/agents/developer/web-architecture/output-format.md +261 -0
  379. package/src/agents/developer/web-architecture/workflow.md +599 -0
  380. package/src/agents/developer/web-developer/agent.yaml +12 -0
  381. package/src/agents/developer/web-developer/critical-reminders.md +17 -0
  382. package/src/agents/developer/web-developer/critical-requirements.md +15 -0
  383. package/src/agents/developer/web-developer/examples.md +109 -0
  384. package/src/agents/developer/web-developer/intro.md +5 -0
  385. package/src/agents/developer/web-developer/output-format.md +213 -0
  386. package/src/agents/developer/web-developer/workflow.md +459 -0
  387. package/src/agents/meta/agent-summoner/agent.yaml +12 -0
  388. package/src/agents/meta/agent-summoner/critical-reminders.md +31 -0
  389. package/src/agents/meta/agent-summoner/critical-requirements.md +27 -0
  390. package/src/agents/meta/agent-summoner/examples.md +176 -0
  391. package/src/agents/meta/agent-summoner/intro.md +9 -0
  392. package/src/agents/meta/agent-summoner/output-format.md +115 -0
  393. package/src/agents/meta/agent-summoner/workflow.md +1540 -0
  394. package/src/agents/meta/documentor/agent.yaml +11 -0
  395. package/src/agents/meta/documentor/critical-reminders.md +23 -0
  396. package/src/agents/meta/documentor/critical-requirements.md +13 -0
  397. package/src/agents/meta/documentor/examples.md +147 -0
  398. package/src/agents/meta/documentor/intro.md +11 -0
  399. package/src/agents/meta/documentor/output-format.md +237 -0
  400. package/src/agents/meta/documentor/workflow.md +1271 -0
  401. package/src/agents/meta/skill-summoner/agent.yaml +13 -0
  402. package/src/agents/meta/skill-summoner/critical-reminders.md +73 -0
  403. package/src/agents/meta/skill-summoner/critical-requirements.md +62 -0
  404. package/src/agents/meta/skill-summoner/examples.md +116 -0
  405. package/src/agents/meta/skill-summoner/intro.md +5 -0
  406. package/src/agents/meta/skill-summoner/output-format.md +279 -0
  407. package/src/agents/meta/skill-summoner/workflow.md +1485 -0
  408. package/src/agents/migration/cli-migrator/agent.yaml +12 -0
  409. package/src/agents/migration/cli-migrator/anti-patterns.md +158 -0
  410. package/src/agents/migration/cli-migrator/conversion-mappings.md +63 -0
  411. package/src/agents/migration/cli-migrator/critical-reminders.md +17 -0
  412. package/src/agents/migration/cli-migrator/critical-requirements.md +13 -0
  413. package/src/agents/migration/cli-migrator/intro.md +15 -0
  414. package/src/agents/migration/cli-migrator/output-format.md +164 -0
  415. package/src/agents/migration/cli-migrator/workflow.md +230 -0
  416. package/src/agents/pattern/pattern-scout/agent.yaml +10 -0
  417. package/src/agents/pattern/pattern-scout/critical-reminders.md +58 -0
  418. package/src/agents/pattern/pattern-scout/critical-requirements.md +17 -0
  419. package/src/agents/pattern/pattern-scout/examples.md +93 -0
  420. package/src/agents/pattern/pattern-scout/intro.md +3 -0
  421. package/src/agents/pattern/pattern-scout/output-format.md +196 -0
  422. package/src/agents/pattern/pattern-scout/workflow.md +1901 -0
  423. package/src/agents/pattern/web-pattern-critique/agent.yaml +12 -0
  424. package/src/agents/pattern/web-pattern-critique/critical-reminders.md +13 -0
  425. package/src/agents/pattern/web-pattern-critique/critical-requirements.md +11 -0
  426. package/src/agents/pattern/web-pattern-critique/examples.md +56 -0
  427. package/src/agents/pattern/web-pattern-critique/intro.md +5 -0
  428. package/src/agents/pattern/web-pattern-critique/output-format.md +257 -0
  429. package/src/agents/pattern/web-pattern-critique/workflow.md +674 -0
  430. package/src/agents/planning/web-pm/agent.yaml +12 -0
  431. package/src/agents/planning/web-pm/critical-reminders.md +21 -0
  432. package/src/agents/planning/web-pm/critical-requirements.md +17 -0
  433. package/src/agents/planning/web-pm/examples.md +85 -0
  434. package/src/agents/planning/web-pm/intro.md +3 -0
  435. package/src/agents/planning/web-pm/output-format.md +228 -0
  436. package/src/agents/planning/web-pm/workflow.md +393 -0
  437. package/src/agents/researcher/api-researcher/agent.yaml +10 -0
  438. package/src/agents/researcher/api-researcher/critical-reminders.md +27 -0
  439. package/src/agents/researcher/api-researcher/critical-requirements.md +13 -0
  440. package/src/agents/researcher/api-researcher/examples.md +116 -0
  441. package/src/agents/researcher/api-researcher/intro.md +32 -0
  442. package/src/agents/researcher/api-researcher/output-format.md +135 -0
  443. package/src/agents/researcher/api-researcher/workflow.md +261 -0
  444. package/src/agents/researcher/web-researcher/agent.yaml +10 -0
  445. package/src/agents/researcher/web-researcher/critical-reminders.md +23 -0
  446. package/src/agents/researcher/web-researcher/critical-requirements.md +11 -0
  447. package/src/agents/researcher/web-researcher/examples.md +126 -0
  448. package/src/agents/researcher/web-researcher/intro.md +31 -0
  449. package/src/agents/researcher/web-researcher/output-format.md +112 -0
  450. package/src/agents/researcher/web-researcher/workflow.md +322 -0
  451. package/src/agents/reviewer/api-reviewer/agent.yaml +12 -0
  452. package/src/agents/reviewer/api-reviewer/critical-reminders.md +16 -0
  453. package/src/agents/reviewer/api-reviewer/critical-requirements.md +13 -0
  454. package/src/agents/reviewer/api-reviewer/examples.md +54 -0
  455. package/src/agents/reviewer/api-reviewer/intro.md +22 -0
  456. package/src/agents/reviewer/api-reviewer/output-format.md +288 -0
  457. package/src/agents/reviewer/api-reviewer/workflow.md +369 -0
  458. package/src/agents/reviewer/cli-reviewer/agent.yaml +12 -0
  459. package/src/agents/reviewer/cli-reviewer/critical-reminders.md +17 -0
  460. package/src/agents/reviewer/cli-reviewer/critical-requirements.md +13 -0
  461. package/src/agents/reviewer/cli-reviewer/examples.md +83 -0
  462. package/src/agents/reviewer/cli-reviewer/intro.md +21 -0
  463. package/src/agents/reviewer/cli-reviewer/output-format.md +330 -0
  464. package/src/agents/reviewer/cli-reviewer/workflow.md +294 -0
  465. package/src/agents/reviewer/web-reviewer/agent.yaml +12 -0
  466. package/src/agents/reviewer/web-reviewer/critical-reminders.md +17 -0
  467. package/src/agents/reviewer/web-reviewer/critical-requirements.md +11 -0
  468. package/src/agents/reviewer/web-reviewer/examples.md +79 -0
  469. package/src/agents/reviewer/web-reviewer/intro.md +20 -0
  470. package/src/agents/reviewer/web-reviewer/output-format.md +253 -0
  471. package/src/agents/reviewer/web-reviewer/workflow.md +228 -0
  472. package/src/agents/tester/cli-tester/agent.yaml +12 -0
  473. package/src/agents/tester/cli-tester/critical-reminders.md +19 -0
  474. package/src/agents/tester/cli-tester/critical-requirements.md +17 -0
  475. package/src/agents/tester/cli-tester/examples.md +80 -0
  476. package/src/agents/tester/cli-tester/intro.md +19 -0
  477. package/src/agents/tester/cli-tester/output-format.md +232 -0
  478. package/src/agents/tester/cli-tester/workflow.md +304 -0
  479. package/src/agents/tester/web-tester/agent.yaml +12 -0
  480. package/src/agents/tester/web-tester/critical-reminders.md +15 -0
  481. package/src/agents/tester/web-tester/critical-requirements.md +11 -0
  482. package/src/agents/tester/web-tester/examples.md +68 -0
  483. package/src/agents/tester/web-tester/intro.md +18 -0
  484. package/src/agents/tester/web-tester/output-format.md +252 -0
  485. package/src/agents/tester/web-tester/workflow.md +507 -0
  486. package/src/schemas/agent-frontmatter.schema.json +84 -0
  487. package/src/schemas/agent.schema.json +93 -0
  488. package/src/schemas/hooks.schema.json +47 -0
  489. package/src/schemas/marketplace.schema.json +119 -0
  490. package/src/schemas/metadata.schema.json +113 -0
  491. package/src/schemas/plugin.schema.json +130 -0
  492. package/src/schemas/project-config.schema.json +125 -0
  493. package/src/schemas/project-source-config.schema.json +81 -0
  494. package/src/schemas/skill-frontmatter.schema.json +42 -0
  495. package/src/schemas/skills-matrix.schema.json +467 -0
  496. package/src/schemas/stack.schema.json +191 -0
  497. package/src/schemas/stacks.schema.json +111 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/cli/components/wizard/step-refine.test.tsx"],"sourcesContent":["import { render } from \"ink-testing-library\";\nimport { describe, expect, it, afterEach, vi } from \"vitest\";\nimport { StepRefine, type StepRefineProps } from \"./step-refine\";\nimport {\n ENTER,\n ESCAPE,\n ARROW_UP,\n ARROW_DOWN,\n RENDER_DELAY_MS,\n INPUT_DELAY_MS,\n delay,\n} from \"../../lib/__tests__/test-constants\";\nimport { DEFAULT_BRANDING } from \"../../consts\";\n\nconst defaultProps: StepRefineProps = {\n technologyCount: 12,\n refineAction: \"all-recommended\",\n onSelectAction: vi.fn(),\n onContinue: vi.fn(),\n onBack: vi.fn(),\n};\n\nconst renderStepRefine = (props: Partial<StepRefineProps> = {}) => {\n return render(<StepRefine {...defaultProps} {...props} />);\n};\n\ndescribe(\"StepRefine component\", () => {\n let cleanup: (() => void) | undefined;\n\n afterEach(() => {\n cleanup?.();\n cleanup = undefined;\n });\n\n describe(\"rendering\", () => {\n it(\"should render technology count correctly\", () => {\n const { lastFrame, unmount } = renderStepRefine({ technologyCount: 12 });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"12\");\n expect(output).toContain(\"technologies\");\n });\n\n it(\"should render different technology count\", () => {\n const { lastFrame, unmount } = renderStepRefine({ technologyCount: 5 });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"5\");\n expect(output).toContain(\"technologies\");\n });\n\n it(\"should render 'Use all recommended' option\", () => {\n const { lastFrame, unmount } = renderStepRefine();\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Use all recommended skills (verified)\");\n });\n\n it(\"should show 'Use all recommended' option as highlighted\", () => {\n const { lastFrame, unmount } = renderStepRefine({\n refineAction: \"all-recommended\",\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // The option should have the \">\" indicator\n expect(output).toContain(\">\");\n expect(output).toContain(\"Use all recommended skills\");\n });\n\n it(\"should render verification description\", () => {\n const { lastFrame, unmount } = renderStepRefine();\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"fastest option\");\n expect(output).toContain(\"verified\");\n expect(output).toContain(DEFAULT_BRANDING.NAME);\n });\n });\n\n describe(\"customize option\", () => {\n it(\"should show 'Customize' option as disabled/grayed\", () => {\n const { lastFrame, unmount } = renderStepRefine();\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Customize skill sources\");\n });\n\n it(\"should show customize option without coming soon label\", () => {\n const { lastFrame, unmount } = renderStepRefine();\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Customize skill sources\");\n expect(output).not.toContain(\"(coming soon)\");\n });\n\n it(\"should show customize description\", () => {\n const { lastFrame, unmount } = renderStepRefine();\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Choose alternative skills for each technology\");\n });\n });\n\n describe(\"keyboard shortcuts display\", () => {\n it(\"should render recommended option content\", () => {\n const { lastFrame, unmount } = renderStepRefine();\n cleanup = unmount;\n\n const output = lastFrame();\n // Keyboard hints are now in WizardLayout footer, not in StepRefine\n // Verify core content renders\n expect(output).toContain(\"Use all recommended\");\n expect(output).toContain(\"Customize skill sources\");\n });\n });\n\n describe(\"keyboard navigation\", () => {\n it(\"should call onContinue when Enter key is pressed\", async () => {\n const onContinue = vi.fn();\n const { stdin, unmount } = renderStepRefine({ onContinue });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n stdin.write(ENTER);\n await delay(INPUT_DELAY_MS);\n\n expect(onContinue).toHaveBeenCalledTimes(1);\n });\n\n it(\"should call onBack when Escape key is pressed\", async () => {\n const onBack = vi.fn();\n const { stdin, unmount } = renderStepRefine({ onBack });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n stdin.write(ESCAPE);\n await delay(INPUT_DELAY_MS);\n\n expect(onBack).toHaveBeenCalledTimes(1);\n });\n\n it(\"should toggle to 'customize' on arrow up when recommended is selected\", async () => {\n const onSelectAction = vi.fn();\n const { stdin, unmount } = renderStepRefine({\n onSelectAction,\n refineAction: \"all-recommended\",\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(onSelectAction).toHaveBeenCalledWith(\"customize\");\n });\n\n it(\"should toggle to 'all-recommended' on arrow down when customize is selected\", async () => {\n const onSelectAction = vi.fn();\n const { stdin, unmount } = renderStepRefine({\n onSelectAction,\n refineAction: \"customize\",\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(onSelectAction).toHaveBeenCalledWith(\"all-recommended\");\n });\n });\n\n describe(\"selection state\", () => {\n it(\"should handle null refineAction (defaults to recommended)\", () => {\n const { lastFrame, unmount } = renderStepRefine({ refineAction: null });\n cleanup = unmount;\n\n const output = lastFrame();\n // Should still show the recommended option with indicator\n expect(output).toContain(\">\");\n expect(output).toContain(\"Use all recommended\");\n });\n\n it(\"should handle 'all-recommended' refineAction\", () => {\n const { lastFrame, unmount } = renderStepRefine({\n refineAction: \"all-recommended\",\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Use all recommended\");\n });\n\n it(\"should handle 'customize' refineAction (even though disabled)\", () => {\n const { lastFrame, unmount } = renderStepRefine({\n refineAction: \"customize\",\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // Should still render, even if customize is selected\n expect(output).toContain(\"Use all recommended\");\n expect(output).toContain(\"Customize skill sources\");\n });\n });\n\n describe(\"edge cases\", () => {\n it(\"should handle zero technology count\", () => {\n const { lastFrame, unmount } = renderStepRefine({ technologyCount: 0 });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"0\");\n expect(output).toContain(\"technologies\");\n });\n\n it(\"should handle single technology count\", () => {\n const { lastFrame, unmount } = renderStepRefine({ technologyCount: 1 });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"1\");\n // Note: \"technologies\" is plural even for 1 (simple implementation)\n expect(output).toContain(\"technologies\");\n });\n\n it(\"should handle large technology count\", () => {\n const { lastFrame, unmount } = renderStepRefine({ technologyCount: 100 });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"100\");\n expect(output).toContain(\"technologies\");\n });\n });\n\n describe(\"multiple keyboard events\", () => {\n it(\"should allow multiple Enter presses\", async () => {\n const onContinue = vi.fn();\n const { stdin, unmount } = renderStepRefine({ onContinue });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n stdin.write(ENTER);\n await delay(INPUT_DELAY_MS);\n stdin.write(ENTER);\n await delay(INPUT_DELAY_MS);\n\n expect(onContinue).toHaveBeenCalledTimes(2);\n });\n\n it(\"should allow multiple Escape presses\", async () => {\n const onBack = vi.fn();\n const { stdin, unmount } = renderStepRefine({ onBack });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n stdin.write(ESCAPE);\n await delay(INPUT_DELAY_MS);\n stdin.write(ESCAPE);\n await delay(INPUT_DELAY_MS);\n\n expect(onBack).toHaveBeenCalledTimes(2);\n });\n });\n});\n"],"mappings":"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","names":[]}
@@ -0,0 +1,17 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ StepSettings
4
+ } from "../../chunk-YND42IXK.js";
5
+ import "../../chunk-O4D67NN7.js";
6
+ import "../../chunk-7SOPVGDV.js";
7
+ import "../../chunk-JMVWYAHT.js";
8
+ import "../../chunk-U3IGFMCY.js";
9
+ import "../../chunk-MM7NK5N2.js";
10
+ import "../../chunk-T4EXUIBY.js";
11
+ import "../../chunk-BZN2Z5P7.js";
12
+ import "../../chunk-LAPCUV4D.js";
13
+ import "../../chunk-DHET7RCE.js";
14
+ export {
15
+ StepSettings
16
+ };
17
+ //# sourceMappingURL=step-settings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,243 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ ARROW_DOWN,
4
+ ARROW_UP,
5
+ ESCAPE,
6
+ INPUT_DELAY_MS,
7
+ delay
8
+ } from "../../chunk-YZTWZVGX.js";
9
+ import {
10
+ render
11
+ } from "../../chunk-66UDJBF6.js";
12
+ import {
13
+ afterEach,
14
+ beforeEach,
15
+ describe,
16
+ globalExpect,
17
+ it,
18
+ vi
19
+ } from "../../chunk-XY3XDVMI.js";
20
+ import {
21
+ StepSettings
22
+ } from "../../chunk-YND42IXK.js";
23
+ import "../../chunk-O4D67NN7.js";
24
+ import "../../chunk-7SOPVGDV.js";
25
+ import "../../chunk-JMVWYAHT.js";
26
+ import "../../chunk-U3IGFMCY.js";
27
+ import "../../chunk-MM7NK5N2.js";
28
+ import "../../chunk-T4EXUIBY.js";
29
+ import "../../chunk-BZN2Z5P7.js";
30
+ import "../../chunk-LAPCUV4D.js";
31
+ import {
32
+ init_esm_shims
33
+ } from "../../chunk-DHET7RCE.js";
34
+
35
+ // src/cli/components/wizard/step-settings.test.tsx
36
+ init_esm_shims();
37
+ import { jsx } from "react/jsx-runtime";
38
+ vi.mock("../../lib/configuration/source-manager.js", () => ({
39
+ getSourceSummary: vi.fn(),
40
+ addSource: vi.fn(),
41
+ removeSource: vi.fn()
42
+ }));
43
+ vi.mock("../../lib/configuration/config.js", () => ({
44
+ DEFAULT_SOURCE: "github:claude-collective/skills"
45
+ }));
46
+ var LOADING_SETTLE_MS = 200;
47
+ var defaultProps = {
48
+ projectDir: "/test/project",
49
+ onClose: vi.fn()
50
+ };
51
+ var renderStepSettings = (props = {}) => {
52
+ return render(/* @__PURE__ */ jsx(StepSettings, { ...defaultProps, ...props }));
53
+ };
54
+ describe("StepSettings component", () => {
55
+ let cleanup;
56
+ beforeEach(async () => {
57
+ vi.resetAllMocks();
58
+ const { getSourceSummary } = await import("../../source-manager-SBPPLOQQ.js");
59
+ vi.mocked(getSourceSummary).mockResolvedValue({
60
+ sources: [
61
+ { name: "public", url: "github:claude-collective/skills", enabled: true },
62
+ { name: "acme-corp", url: "github:acme-corp/claude-skills", enabled: true }
63
+ ],
64
+ localSkillCount: 3,
65
+ pluginSkillCount: 1
66
+ });
67
+ });
68
+ afterEach(() => {
69
+ cleanup?.();
70
+ cleanup = void 0;
71
+ });
72
+ describe("rendering", () => {
73
+ it("should render the title", async () => {
74
+ const { lastFrame, unmount } = renderStepSettings();
75
+ cleanup = unmount;
76
+ await delay(LOADING_SETTLE_MS);
77
+ const output = lastFrame();
78
+ globalExpect(output).toContain("Skill Sources");
79
+ });
80
+ it("should render configured sources", async () => {
81
+ const { lastFrame, unmount } = renderStepSettings();
82
+ cleanup = unmount;
83
+ await delay(LOADING_SETTLE_MS);
84
+ const output = lastFrame();
85
+ globalExpect(output).toContain("Public");
86
+ globalExpect(output).toContain("acme-corp");
87
+ });
88
+ it("should show default label for public source", async () => {
89
+ const { lastFrame, unmount } = renderStepSettings();
90
+ cleanup = unmount;
91
+ await delay(LOADING_SETTLE_MS);
92
+ const output = lastFrame();
93
+ globalExpect(output).toContain("(default)");
94
+ });
95
+ it("should show source URLs", async () => {
96
+ const { lastFrame, unmount } = renderStepSettings();
97
+ cleanup = unmount;
98
+ await delay(LOADING_SETTLE_MS);
99
+ const output = lastFrame();
100
+ globalExpect(output).toContain("github:claude-collective/skills");
101
+ globalExpect(output).toContain("github:acme-corp/claude-skills");
102
+ });
103
+ it("should show local skill count", async () => {
104
+ const { lastFrame, unmount } = renderStepSettings();
105
+ cleanup = unmount;
106
+ await delay(LOADING_SETTLE_MS);
107
+ const output = lastFrame();
108
+ globalExpect(output).toContain("3");
109
+ globalExpect(output).toContain(".claude/skills/");
110
+ });
111
+ it("should show plugin count", async () => {
112
+ const { lastFrame, unmount } = renderStepSettings();
113
+ cleanup = unmount;
114
+ await delay(LOADING_SETTLE_MS);
115
+ const output = lastFrame();
116
+ globalExpect(output).toContain("1");
117
+ globalExpect(output).toContain("installed plugins");
118
+ });
119
+ it("should show add source input area", async () => {
120
+ const { lastFrame, unmount } = renderStepSettings();
121
+ cleanup = unmount;
122
+ await delay(LOADING_SETTLE_MS);
123
+ const output = lastFrame();
124
+ globalExpect(output).toContain("Add source");
125
+ });
126
+ it("should show loading state initially", () => {
127
+ const { lastFrame, unmount } = renderStepSettings();
128
+ cleanup = unmount;
129
+ const output = lastFrame();
130
+ globalExpect(output).toContain("Loading sources...");
131
+ });
132
+ });
133
+ describe("keyboard navigation", () => {
134
+ it("should navigate down with arrow down", async () => {
135
+ const { lastFrame, stdin, unmount } = renderStepSettings();
136
+ cleanup = unmount;
137
+ await delay(LOADING_SETTLE_MS);
138
+ stdin.write(ARROW_DOWN);
139
+ await delay(INPUT_DELAY_MS);
140
+ const output = lastFrame();
141
+ globalExpect(output).toContain("acme-corp");
142
+ });
143
+ it("should navigate up with arrow up", async () => {
144
+ const { lastFrame, stdin, unmount } = renderStepSettings();
145
+ cleanup = unmount;
146
+ await delay(LOADING_SETTLE_MS);
147
+ stdin.write(ARROW_DOWN);
148
+ await delay(INPUT_DELAY_MS);
149
+ stdin.write(ARROW_UP);
150
+ await delay(INPUT_DELAY_MS);
151
+ const output = lastFrame();
152
+ globalExpect(output).toContain("Public");
153
+ });
154
+ it("should not navigate above first item", async () => {
155
+ const { lastFrame, stdin, unmount } = renderStepSettings();
156
+ cleanup = unmount;
157
+ await delay(LOADING_SETTLE_MS);
158
+ stdin.write(ARROW_UP);
159
+ await delay(INPUT_DELAY_MS);
160
+ const output = lastFrame();
161
+ globalExpect(output).toContain("Public");
162
+ });
163
+ });
164
+ describe("escape to close", () => {
165
+ it("should call onClose when Escape is pressed", async () => {
166
+ const onClose = vi.fn();
167
+ const { stdin, unmount } = renderStepSettings({ onClose });
168
+ cleanup = unmount;
169
+ await delay(LOADING_SETTLE_MS);
170
+ stdin.write(ESCAPE);
171
+ await delay(INPUT_DELAY_MS);
172
+ globalExpect(onClose).toHaveBeenCalledTimes(1);
173
+ });
174
+ });
175
+ describe("add source input mode", () => {
176
+ it("should enter add source mode on 'a' key", async () => {
177
+ const { lastFrame, stdin, unmount } = renderStepSettings();
178
+ cleanup = unmount;
179
+ await delay(LOADING_SETTLE_MS);
180
+ stdin.write("a");
181
+ await delay(INPUT_DELAY_MS);
182
+ const output = lastFrame();
183
+ globalExpect(output).toContain("\u2588");
184
+ });
185
+ it("should exit add source mode on Escape", async () => {
186
+ const onClose = vi.fn();
187
+ const { lastFrame, stdin, unmount } = renderStepSettings({ onClose });
188
+ cleanup = unmount;
189
+ await delay(LOADING_SETTLE_MS);
190
+ stdin.write("a");
191
+ await delay(INPUT_DELAY_MS);
192
+ stdin.write(ESCAPE);
193
+ await delay(INPUT_DELAY_MS);
194
+ globalExpect(onClose).not.toHaveBeenCalled();
195
+ const output = lastFrame();
196
+ globalExpect(output).toContain("Skill Sources");
197
+ });
198
+ it("should show hint text for add mode", async () => {
199
+ const { lastFrame, stdin, unmount } = renderStepSettings();
200
+ cleanup = unmount;
201
+ await delay(LOADING_SETTLE_MS);
202
+ stdin.write("a");
203
+ await delay(INPUT_DELAY_MS);
204
+ const output = lastFrame();
205
+ globalExpect(output).toContain("ENTER submit");
206
+ globalExpect(output).toContain("ESC cancel");
207
+ });
208
+ it("should show hint text for normal mode", async () => {
209
+ const { lastFrame, unmount } = renderStepSettings();
210
+ cleanup = unmount;
211
+ await delay(LOADING_SETTLE_MS);
212
+ const output = lastFrame();
213
+ globalExpect(output).toContain("DEL remove");
214
+ globalExpect(output).toContain("close");
215
+ });
216
+ });
217
+ describe("edge cases", () => {
218
+ it("should handle empty sources list gracefully", async () => {
219
+ const { getSourceSummary } = await import("../../source-manager-SBPPLOQQ.js");
220
+ vi.mocked(getSourceSummary).mockResolvedValue({
221
+ sources: [{ name: "public", url: "github:claude-collective/skills", enabled: true }],
222
+ localSkillCount: 0,
223
+ pluginSkillCount: 0
224
+ });
225
+ const { lastFrame, unmount } = renderStepSettings();
226
+ cleanup = unmount;
227
+ await delay(LOADING_SETTLE_MS);
228
+ const output = lastFrame();
229
+ globalExpect(output).toContain("Public");
230
+ globalExpect(output).toContain("0");
231
+ });
232
+ it("should handle getSourceSummary failure gracefully", async () => {
233
+ const { getSourceSummary } = await import("../../source-manager-SBPPLOQQ.js");
234
+ vi.mocked(getSourceSummary).mockRejectedValue(new Error("Config read failed"));
235
+ const { lastFrame, unmount } = renderStepSettings();
236
+ cleanup = unmount;
237
+ await delay(LOADING_SETTLE_MS);
238
+ const output = lastFrame();
239
+ globalExpect(output).toContain("Public");
240
+ });
241
+ });
242
+ });
243
+ //# sourceMappingURL=step-settings.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/cli/components/wizard/step-settings.test.tsx"],"sourcesContent":["import { render } from \"ink-testing-library\";\nimport { describe, expect, it, afterEach, beforeEach, vi } from \"vitest\";\nimport { StepSettings, type StepSettingsProps } from \"./step-settings\";\nimport {\n ESCAPE,\n ARROW_UP,\n ARROW_DOWN,\n INPUT_DELAY_MS,\n delay,\n} from \"../../lib/__tests__/test-constants\";\n\n// Mock source-manager\nvi.mock(\"../../lib/configuration/source-manager.js\", () => ({\n getSourceSummary: vi.fn(),\n addSource: vi.fn(),\n removeSource: vi.fn(),\n}));\n\n// Mock config\nvi.mock(\"../../lib/configuration/config.js\", () => ({\n DEFAULT_SOURCE: \"github:claude-collective/skills\",\n}));\n\nconst LOADING_SETTLE_MS = 200;\n\nconst defaultProps: StepSettingsProps = {\n projectDir: \"/test/project\",\n onClose: vi.fn(),\n};\n\nconst renderStepSettings = (props: Partial<StepSettingsProps> = {}) => {\n return render(<StepSettings {...defaultProps} {...props} />);\n};\n\ndescribe(\"StepSettings component\", () => {\n let cleanup: (() => void) | undefined;\n\n beforeEach(async () => {\n vi.resetAllMocks();\n\n const { getSourceSummary } = await import(\"../../lib/configuration/source-manager.js\");\n vi.mocked(getSourceSummary).mockResolvedValue({\n sources: [\n { name: \"public\", url: \"github:claude-collective/skills\", enabled: true },\n { name: \"acme-corp\", url: \"github:acme-corp/claude-skills\", enabled: true },\n ],\n localSkillCount: 3,\n pluginSkillCount: 1,\n });\n });\n\n afterEach(() => {\n cleanup?.();\n cleanup = undefined;\n });\n\n describe(\"rendering\", () => {\n it(\"should render the title\", async () => {\n const { lastFrame, unmount } = renderStepSettings();\n cleanup = unmount;\n\n await delay(LOADING_SETTLE_MS);\n const output = lastFrame();\n expect(output).toContain(\"Skill Sources\");\n });\n\n it(\"should render configured sources\", async () => {\n const { lastFrame, unmount } = renderStepSettings();\n cleanup = unmount;\n\n await delay(LOADING_SETTLE_MS);\n const output = lastFrame();\n expect(output).toContain(\"Public\");\n expect(output).toContain(\"acme-corp\");\n });\n\n it(\"should show default label for public source\", async () => {\n const { lastFrame, unmount } = renderStepSettings();\n cleanup = unmount;\n\n await delay(LOADING_SETTLE_MS);\n const output = lastFrame();\n expect(output).toContain(\"(default)\");\n });\n\n it(\"should show source URLs\", async () => {\n const { lastFrame, unmount } = renderStepSettings();\n cleanup = unmount;\n\n await delay(LOADING_SETTLE_MS);\n const output = lastFrame();\n expect(output).toContain(\"github:claude-collective/skills\");\n expect(output).toContain(\"github:acme-corp/claude-skills\");\n });\n\n it(\"should show local skill count\", async () => {\n const { lastFrame, unmount } = renderStepSettings();\n cleanup = unmount;\n\n await delay(LOADING_SETTLE_MS);\n const output = lastFrame();\n expect(output).toContain(\"3\");\n expect(output).toContain(\".claude/skills/\");\n });\n\n it(\"should show plugin count\", async () => {\n const { lastFrame, unmount } = renderStepSettings();\n cleanup = unmount;\n\n await delay(LOADING_SETTLE_MS);\n const output = lastFrame();\n expect(output).toContain(\"1\");\n expect(output).toContain(\"installed plugins\");\n });\n\n it(\"should show add source input area\", async () => {\n const { lastFrame, unmount } = renderStepSettings();\n cleanup = unmount;\n\n await delay(LOADING_SETTLE_MS);\n const output = lastFrame();\n expect(output).toContain(\"Add source\");\n });\n\n it(\"should show loading state initially\", () => {\n const { lastFrame, unmount } = renderStepSettings();\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Loading sources...\");\n });\n });\n\n describe(\"keyboard navigation\", () => {\n it(\"should navigate down with arrow down\", async () => {\n const { lastFrame, stdin, unmount } = renderStepSettings();\n cleanup = unmount;\n\n await delay(LOADING_SETTLE_MS);\n\n // Move focus down\n stdin.write(ARROW_DOWN);\n await delay(INPUT_DELAY_MS);\n\n const output = lastFrame();\n // The second source (acme-corp) should now be focused\n expect(output).toContain(\"acme-corp\");\n });\n\n it(\"should navigate up with arrow up\", async () => {\n const { lastFrame, stdin, unmount } = renderStepSettings();\n cleanup = unmount;\n\n await delay(LOADING_SETTLE_MS);\n\n // Move down then up\n stdin.write(ARROW_DOWN);\n await delay(INPUT_DELAY_MS);\n stdin.write(ARROW_UP);\n await delay(INPUT_DELAY_MS);\n\n const output = lastFrame();\n expect(output).toContain(\"Public\");\n });\n\n it(\"should not navigate above first item\", async () => {\n const { lastFrame, stdin, unmount } = renderStepSettings();\n cleanup = unmount;\n\n await delay(LOADING_SETTLE_MS);\n\n // Try to move up from first item\n stdin.write(ARROW_UP);\n await delay(INPUT_DELAY_MS);\n\n const output = lastFrame();\n expect(output).toContain(\"Public\");\n });\n });\n\n describe(\"escape to close\", () => {\n it(\"should call onClose when Escape is pressed\", async () => {\n const onClose = vi.fn();\n const { stdin, unmount } = renderStepSettings({ onClose });\n cleanup = unmount;\n\n await delay(LOADING_SETTLE_MS);\n stdin.write(ESCAPE);\n await delay(INPUT_DELAY_MS);\n\n expect(onClose).toHaveBeenCalledTimes(1);\n });\n });\n\n describe(\"add source input mode\", () => {\n it(\"should enter add source mode on 'a' key\", async () => {\n const { lastFrame, stdin, unmount } = renderStepSettings();\n cleanup = unmount;\n\n await delay(LOADING_SETTLE_MS);\n\n stdin.write(\"a\");\n await delay(INPUT_DELAY_MS);\n\n const output = lastFrame();\n // Should show cursor block character indicating input mode\n expect(output).toContain(\"\\u2588\");\n });\n\n it(\"should exit add source mode on Escape\", async () => {\n const onClose = vi.fn();\n const { lastFrame, stdin, unmount } = renderStepSettings({ onClose });\n cleanup = unmount;\n\n await delay(LOADING_SETTLE_MS);\n\n // Enter add mode\n stdin.write(\"a\");\n await delay(INPUT_DELAY_MS);\n\n // Escape from add mode (should NOT close settings)\n stdin.write(ESCAPE);\n await delay(INPUT_DELAY_MS);\n\n expect(onClose).not.toHaveBeenCalled();\n\n const output = lastFrame();\n // Should still show the settings view\n expect(output).toContain(\"Skill Sources\");\n });\n\n it(\"should show hint text for add mode\", async () => {\n const { lastFrame, stdin, unmount } = renderStepSettings();\n cleanup = unmount;\n\n await delay(LOADING_SETTLE_MS);\n\n stdin.write(\"a\");\n await delay(INPUT_DELAY_MS);\n\n const output = lastFrame();\n expect(output).toContain(\"ENTER submit\");\n expect(output).toContain(\"ESC cancel\");\n });\n\n it(\"should show hint text for normal mode\", async () => {\n const { lastFrame, unmount } = renderStepSettings();\n cleanup = unmount;\n\n await delay(LOADING_SETTLE_MS);\n\n const output = lastFrame();\n expect(output).toContain(\"DEL remove\");\n expect(output).toContain(\"close\");\n });\n });\n\n describe(\"edge cases\", () => {\n it(\"should handle empty sources list gracefully\", async () => {\n const { getSourceSummary } = await import(\"../../lib/configuration/source-manager.js\");\n vi.mocked(getSourceSummary).mockResolvedValue({\n sources: [{ name: \"public\", url: \"github:claude-collective/skills\", enabled: true }],\n localSkillCount: 0,\n pluginSkillCount: 0,\n });\n\n const { lastFrame, unmount } = renderStepSettings();\n cleanup = unmount;\n\n await delay(LOADING_SETTLE_MS);\n\n const output = lastFrame();\n expect(output).toContain(\"Public\");\n expect(output).toContain(\"0\");\n });\n\n it(\"should handle getSourceSummary failure gracefully\", async () => {\n const { getSourceSummary } = await import(\"../../lib/configuration/source-manager.js\");\n vi.mocked(getSourceSummary).mockRejectedValue(new Error(\"Config read failed\"));\n\n const { lastFrame, unmount } = renderStepSettings();\n cleanup = unmount;\n\n await delay(LOADING_SETTLE_MS);\n\n const output = lastFrame();\n // Should show fallback with default source\n expect(output).toContain(\"Public\");\n });\n });\n});\n"],"mappings":"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","names":[]}
@@ -0,0 +1,20 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ StepSources
4
+ } from "../../chunk-WEUVWHMA.js";
5
+ import "../../chunk-O4D67NN7.js";
6
+ import "../../chunk-5PIKNCZX.js";
7
+ import "../../chunk-7SOPVGDV.js";
8
+ import "../../chunk-A27LOC4Z.js";
9
+ import "../../chunk-JMVWYAHT.js";
10
+ import "../../chunk-DC5AK3LW.js";
11
+ import "../../chunk-3ZOIOVKT.js";
12
+ import "../../chunk-MM7NK5N2.js";
13
+ import "../../chunk-T4EXUIBY.js";
14
+ import "../../chunk-BZN2Z5P7.js";
15
+ import "../../chunk-LAPCUV4D.js";
16
+ import "../../chunk-DHET7RCE.js";
17
+ export {
18
+ StepSources
19
+ };
20
+ //# sourceMappingURL=step-sources.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,294 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ ARROW_DOWN,
4
+ ARROW_UP,
5
+ ENTER,
6
+ ESCAPE,
7
+ INPUT_DELAY_MS,
8
+ RENDER_DELAY_MS,
9
+ delay
10
+ } from "../../chunk-YZTWZVGX.js";
11
+ import {
12
+ render
13
+ } from "../../chunk-66UDJBF6.js";
14
+ import {
15
+ createMockMatrix,
16
+ getTestSkill
17
+ } from "../../chunk-BZQBJP34.js";
18
+ import {
19
+ afterEach,
20
+ beforeEach,
21
+ describe,
22
+ globalExpect,
23
+ it,
24
+ vi
25
+ } from "../../chunk-XY3XDVMI.js";
26
+ import {
27
+ StepSources
28
+ } from "../../chunk-WEUVWHMA.js";
29
+ import "../../chunk-O4D67NN7.js";
30
+ import "../../chunk-5PIKNCZX.js";
31
+ import "../../chunk-7SOPVGDV.js";
32
+ import "../../chunk-A27LOC4Z.js";
33
+ import "../../chunk-JMVWYAHT.js";
34
+ import "../../chunk-DC5AK3LW.js";
35
+ import {
36
+ useWizardStore
37
+ } from "../../chunk-3ZOIOVKT.js";
38
+ import "../../chunk-MM7NK5N2.js";
39
+ import "../../chunk-T4EXUIBY.js";
40
+ import "../../chunk-BZN2Z5P7.js";
41
+ import {
42
+ DEFAULT_BRANDING
43
+ } from "../../chunk-LAPCUV4D.js";
44
+ import {
45
+ init_esm_shims
46
+ } from "../../chunk-DHET7RCE.js";
47
+
48
+ // src/cli/components/wizard/step-sources.test.tsx
49
+ init_esm_shims();
50
+ import { jsx } from "react/jsx-runtime";
51
+ var reactSkill = getTestSkill("react");
52
+ var zustandSkill = getTestSkill("zustand");
53
+ var mockMatrix = createMockMatrix({
54
+ [reactSkill.id]: reactSkill,
55
+ [zustandSkill.id]: zustandSkill
56
+ });
57
+ var defaultProps = {
58
+ matrix: mockMatrix,
59
+ onContinue: vi.fn(),
60
+ onBack: vi.fn()
61
+ };
62
+ var renderStepSources = (props = {}) => {
63
+ return render(/* @__PURE__ */ jsx(StepSources, { ...defaultProps, ...props }));
64
+ };
65
+ describe("StepSources component", () => {
66
+ let cleanup;
67
+ beforeEach(() => {
68
+ useWizardStore.getState().reset();
69
+ useWizardStore.setState({
70
+ domainSelections: {
71
+ web: {
72
+ framework: ["web-framework-react"],
73
+ "client-state": ["web-state-zustand"]
74
+ }
75
+ }
76
+ });
77
+ });
78
+ afterEach(() => {
79
+ cleanup?.();
80
+ cleanup = void 0;
81
+ });
82
+ describe("choice view rendering", () => {
83
+ it("should render technology count", () => {
84
+ const { lastFrame, unmount } = renderStepSources();
85
+ cleanup = unmount;
86
+ const output = lastFrame();
87
+ globalExpect(output).toContain("2");
88
+ globalExpect(output).toContain("technologies");
89
+ });
90
+ it("should render 'Use all recommended' option", () => {
91
+ const { lastFrame, unmount } = renderStepSources();
92
+ cleanup = unmount;
93
+ const output = lastFrame();
94
+ globalExpect(output).toContain("Use all recommended skills (verified)");
95
+ });
96
+ it("should render 'Customize skill sources' option", () => {
97
+ const { lastFrame, unmount } = renderStepSources();
98
+ cleanup = unmount;
99
+ const output = lastFrame();
100
+ globalExpect(output).toContain("Customize skill sources");
101
+ });
102
+ it("should render verification description", () => {
103
+ const { lastFrame, unmount } = renderStepSources();
104
+ cleanup = unmount;
105
+ const output = lastFrame();
106
+ globalExpect(output).toContain("fastest option");
107
+ globalExpect(output).toContain("verified");
108
+ globalExpect(output).toContain(DEFAULT_BRANDING.NAME);
109
+ });
110
+ it("should render customize description", () => {
111
+ const { lastFrame, unmount } = renderStepSources();
112
+ cleanup = unmount;
113
+ const output = lastFrame();
114
+ globalExpect(output).toContain("Choose alternative skills for each technology");
115
+ });
116
+ it("should show recommended as default selected", () => {
117
+ const { lastFrame, unmount } = renderStepSources();
118
+ cleanup = unmount;
119
+ const output = lastFrame();
120
+ globalExpect(output).toContain(">");
121
+ globalExpect(output).toContain("Use all recommended");
122
+ });
123
+ });
124
+ describe("choice view keyboard navigation", () => {
125
+ it("should toggle options with arrow up", async () => {
126
+ const { lastFrame, stdin, unmount } = renderStepSources();
127
+ cleanup = unmount;
128
+ await delay(RENDER_DELAY_MS);
129
+ let output = lastFrame();
130
+ globalExpect(output).toContain("Use all recommended");
131
+ stdin.write(ARROW_UP);
132
+ await delay(INPUT_DELAY_MS);
133
+ output = lastFrame();
134
+ globalExpect(output).toContain("Customize skill sources");
135
+ });
136
+ it("should toggle options with arrow down", async () => {
137
+ const { stdin, unmount } = renderStepSources();
138
+ cleanup = unmount;
139
+ await delay(RENDER_DELAY_MS);
140
+ stdin.write(ARROW_DOWN);
141
+ await delay(INPUT_DELAY_MS);
142
+ });
143
+ it("should call onContinue when Enter pressed on 'Use all recommended'", async () => {
144
+ const onContinue = vi.fn();
145
+ const { stdin, unmount } = renderStepSources({ onContinue });
146
+ cleanup = unmount;
147
+ await delay(RENDER_DELAY_MS);
148
+ stdin.write(ENTER);
149
+ await delay(INPUT_DELAY_MS);
150
+ globalExpect(onContinue).toHaveBeenCalledTimes(1);
151
+ });
152
+ it("should call onBack when Escape pressed", async () => {
153
+ const onBack = vi.fn();
154
+ const { stdin, unmount } = renderStepSources({ onBack });
155
+ cleanup = unmount;
156
+ await delay(RENDER_DELAY_MS);
157
+ stdin.write(ESCAPE);
158
+ await delay(INPUT_DELAY_MS);
159
+ globalExpect(onBack).toHaveBeenCalledTimes(1);
160
+ });
161
+ it("should switch to customize view when Enter pressed on 'Customize'", async () => {
162
+ const { lastFrame, stdin, unmount } = renderStepSources();
163
+ cleanup = unmount;
164
+ await delay(RENDER_DELAY_MS);
165
+ stdin.write(ARROW_DOWN);
166
+ await delay(INPUT_DELAY_MS);
167
+ stdin.write(ENTER);
168
+ await delay(INPUT_DELAY_MS);
169
+ const output = lastFrame();
170
+ globalExpect(output).toContain("Customize skill sources");
171
+ globalExpect(output).toContain("react");
172
+ globalExpect(output).toContain("zustand");
173
+ });
174
+ });
175
+ describe("customize view", () => {
176
+ it("should show source grid with selected technologies", async () => {
177
+ const { lastFrame, stdin, unmount } = renderStepSources();
178
+ cleanup = unmount;
179
+ await delay(RENDER_DELAY_MS);
180
+ stdin.write(ARROW_DOWN);
181
+ await delay(INPUT_DELAY_MS);
182
+ stdin.write(ENTER);
183
+ await delay(INPUT_DELAY_MS);
184
+ const output = lastFrame();
185
+ globalExpect(output).toContain("react");
186
+ globalExpect(output).toContain("zustand");
187
+ globalExpect(output).toContain("Public");
188
+ });
189
+ it("should call onContinue when Enter pressed in customize view", async () => {
190
+ const onContinue = vi.fn();
191
+ const { stdin, unmount } = renderStepSources({ onContinue });
192
+ cleanup = unmount;
193
+ await delay(RENDER_DELAY_MS);
194
+ stdin.write(ARROW_DOWN);
195
+ await delay(INPUT_DELAY_MS);
196
+ stdin.write(ENTER);
197
+ await delay(INPUT_DELAY_MS);
198
+ stdin.write(ENTER);
199
+ await delay(INPUT_DELAY_MS);
200
+ globalExpect(onContinue).toHaveBeenCalledTimes(1);
201
+ });
202
+ it("should go back to choice view when Escape pressed in customize view", async () => {
203
+ const onBack = vi.fn();
204
+ const { lastFrame, stdin, unmount } = renderStepSources({ onBack });
205
+ cleanup = unmount;
206
+ await delay(RENDER_DELAY_MS);
207
+ stdin.write(ARROW_DOWN);
208
+ await delay(INPUT_DELAY_MS);
209
+ stdin.write(ENTER);
210
+ await delay(INPUT_DELAY_MS);
211
+ globalExpect(lastFrame()).toContain("Customize skill sources");
212
+ stdin.write(ESCAPE);
213
+ await delay(INPUT_DELAY_MS);
214
+ const output = lastFrame();
215
+ globalExpect(output).toContain("Use all recommended skills (verified)");
216
+ globalExpect(output).toContain("Customize skill sources");
217
+ globalExpect(onBack).not.toHaveBeenCalled();
218
+ });
219
+ it("should show ViewTitle in customize view", async () => {
220
+ const { lastFrame, stdin, unmount } = renderStepSources();
221
+ cleanup = unmount;
222
+ await delay(RENDER_DELAY_MS);
223
+ stdin.write(ARROW_DOWN);
224
+ await delay(INPUT_DELAY_MS);
225
+ stdin.write(ENTER);
226
+ await delay(INPUT_DELAY_MS);
227
+ const output = lastFrame();
228
+ globalExpect(output).toContain("Customize skill sources");
229
+ });
230
+ });
231
+ describe("edge cases", () => {
232
+ it("should handle zero technologies", () => {
233
+ useWizardStore.setState({
234
+ domainSelections: {}
235
+ });
236
+ const { lastFrame, unmount } = renderStepSources();
237
+ cleanup = unmount;
238
+ const output = lastFrame();
239
+ globalExpect(output).toContain("0");
240
+ globalExpect(output).toContain("technologies");
241
+ });
242
+ it("should handle single technology", () => {
243
+ useWizardStore.setState({
244
+ domainSelections: {
245
+ web: {
246
+ framework: ["web-framework-react"]
247
+ }
248
+ }
249
+ });
250
+ const { lastFrame, unmount } = renderStepSources();
251
+ cleanup = unmount;
252
+ const output = lastFrame();
253
+ globalExpect(output).toContain("1");
254
+ globalExpect(output).toContain("technologies");
255
+ });
256
+ it("should handle multiple Enter presses on recommended", async () => {
257
+ const onContinue = vi.fn();
258
+ const { stdin, unmount } = renderStepSources({ onContinue });
259
+ cleanup = unmount;
260
+ await delay(RENDER_DELAY_MS);
261
+ stdin.write(ENTER);
262
+ await delay(INPUT_DELAY_MS);
263
+ stdin.write(ENTER);
264
+ await delay(INPUT_DELAY_MS);
265
+ globalExpect(onContinue).toHaveBeenCalledTimes(2);
266
+ });
267
+ });
268
+ describe("store integration", () => {
269
+ it("should set customizeSources when switching to customize view", async () => {
270
+ const { stdin, unmount } = renderStepSources();
271
+ cleanup = unmount;
272
+ await delay(RENDER_DELAY_MS);
273
+ stdin.write(ARROW_DOWN);
274
+ await delay(INPUT_DELAY_MS);
275
+ stdin.write(ENTER);
276
+ await delay(INPUT_DELAY_MS);
277
+ globalExpect(useWizardStore.getState().customizeSources).toBe(true);
278
+ });
279
+ it("should reset customizeSources when escaping from customize view", async () => {
280
+ const { stdin, unmount } = renderStepSources();
281
+ cleanup = unmount;
282
+ await delay(RENDER_DELAY_MS);
283
+ stdin.write(ARROW_DOWN);
284
+ await delay(INPUT_DELAY_MS);
285
+ stdin.write(ENTER);
286
+ await delay(INPUT_DELAY_MS);
287
+ globalExpect(useWizardStore.getState().customizeSources).toBe(true);
288
+ stdin.write(ESCAPE);
289
+ await delay(INPUT_DELAY_MS);
290
+ globalExpect(useWizardStore.getState().customizeSources).toBe(false);
291
+ });
292
+ });
293
+ });
294
+ //# sourceMappingURL=step-sources.test.js.map