@agents-inc/cli 0.48.0 → 0.60.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 (306) hide show
  1. package/CHANGELOG.md +181 -5
  2. package/README.md +1 -2
  3. package/dist/{chunk-2DNDAXF6.js → chunk-52M2XF3W.js} +57 -27
  4. package/dist/chunk-52M2XF3W.js.map +1 -0
  5. package/dist/{chunk-WSGKCBY5.js → chunk-52XO4ULK.js} +6 -9
  6. package/dist/chunk-52XO4ULK.js.map +1 -0
  7. package/dist/{chunk-AMNCCZSG.js → chunk-6G3KZSO4.js} +82 -63
  8. package/dist/chunk-6G3KZSO4.js.map +1 -0
  9. package/dist/{chunk-LESHL6SM.js → chunk-6OWHQ7HM.js} +21 -13
  10. package/dist/chunk-6OWHQ7HM.js.map +1 -0
  11. package/dist/{chunk-X3SZIBVW.js → chunk-7FMEMXJ4.js} +71 -71
  12. package/dist/chunk-7FMEMXJ4.js.map +1 -0
  13. package/dist/{chunk-I52THVF6.js → chunk-AJJJE7F7.js} +2 -2
  14. package/dist/{chunk-ZML3OCYA.js → chunk-AX3SZZWA.js} +2 -2
  15. package/dist/{chunk-NJVJ7VO5.js → chunk-BFD5NZQ4.js} +5 -4
  16. package/dist/chunk-BFD5NZQ4.js.map +1 -0
  17. package/dist/{chunk-GSPPOXMG.js → chunk-BKJHAJQW.js} +2 -2
  18. package/dist/{chunk-GSPPOXMG.js.map → chunk-BKJHAJQW.js.map} +1 -1
  19. package/dist/{chunk-FPTUCWBY.js → chunk-BMJZBLP7.js} +46 -30
  20. package/dist/chunk-BMJZBLP7.js.map +1 -0
  21. package/dist/chunk-BNQ5O6LE.js +74 -0
  22. package/dist/chunk-BNQ5O6LE.js.map +1 -0
  23. package/dist/{chunk-W62XVWXB.js → chunk-C577AJE7.js} +3 -3
  24. package/dist/chunk-CIG7IKX3.js +118 -0
  25. package/dist/chunk-CIG7IKX3.js.map +1 -0
  26. package/dist/chunk-EC3UJRKZ.js +1534 -0
  27. package/dist/chunk-EC3UJRKZ.js.map +1 -0
  28. package/dist/{chunk-IS7GP6XC.js → chunk-EMIUPGPL.js} +57 -52
  29. package/dist/chunk-EMIUPGPL.js.map +1 -0
  30. package/dist/chunk-G6WHCALR.js +593 -0
  31. package/dist/chunk-G6WHCALR.js.map +1 -0
  32. package/dist/{chunk-OTTITQ7C.js → chunk-H7WJK7NJ.js} +48 -95
  33. package/dist/chunk-H7WJK7NJ.js.map +1 -0
  34. package/dist/chunk-HGTC76BX.js +16 -0
  35. package/dist/chunk-HGTC76BX.js.map +1 -0
  36. package/dist/{chunk-G5OZQ376.js → chunk-K6OLORQL.js} +6 -6
  37. package/dist/{chunk-OHDEJEYB.js → chunk-KIWFEBKH.js} +41 -11
  38. package/dist/chunk-KIWFEBKH.js.map +1 -0
  39. package/dist/{chunk-YMUWTPOM.js → chunk-LWXRUR6B.js} +92 -100
  40. package/dist/chunk-LWXRUR6B.js.map +1 -0
  41. package/dist/{chunk-U2AEK4ZL.js → chunk-MGNYPVOJ.js} +2 -2
  42. package/dist/chunk-MKCHLXMY.js +40 -0
  43. package/dist/chunk-MKCHLXMY.js.map +1 -0
  44. package/dist/{chunk-37QYD33C.js → chunk-MMFQNJPE.js} +2 -2
  45. package/dist/{chunk-DG2U2WY3.js → chunk-MR6OBL3B.js} +3 -11
  46. package/dist/{chunk-DG2U2WY3.js.map → chunk-MR6OBL3B.js.map} +1 -1
  47. package/dist/{chunk-7IAKVZL5.js → chunk-O6BA7Q2B.js} +28 -59
  48. package/dist/chunk-O6BA7Q2B.js.map +1 -0
  49. package/dist/chunk-OCEFD7V6.js +201 -0
  50. package/dist/chunk-OCEFD7V6.js.map +1 -0
  51. package/dist/{chunk-YZTWZVGX.js → chunk-PUT7X3GA.js} +1 -1
  52. package/dist/chunk-PUT7X3GA.js.map +1 -0
  53. package/dist/chunk-RO6LX3UV.js +342 -0
  54. package/dist/chunk-RO6LX3UV.js.map +1 -0
  55. package/dist/{chunk-34BP5BC4.js → chunk-SDKCQXWE.js} +2 -2
  56. package/dist/{chunk-VBAAATPU.js → chunk-SEJF7CGJ.js} +41 -28
  57. package/dist/chunk-SEJF7CGJ.js.map +1 -0
  58. package/dist/{chunk-5O6GKXAN.js → chunk-SZRK3VOR.js} +24 -14
  59. package/dist/chunk-SZRK3VOR.js.map +1 -0
  60. package/dist/{chunk-5MN5S3DV.js → chunk-TC3NHO34.js} +22 -17
  61. package/dist/chunk-TC3NHO34.js.map +1 -0
  62. package/dist/{chunk-SPVSWDFM.js → chunk-TGLRDEEL.js} +8 -14
  63. package/dist/chunk-TGLRDEEL.js.map +1 -0
  64. package/dist/{chunk-P2SFRDWI.js → chunk-TZXYBG3R.js} +3634 -2875
  65. package/dist/chunk-TZXYBG3R.js.map +1 -0
  66. package/dist/{chunk-2BVZOYJP.js → chunk-VR3CDXDT.js} +2 -6
  67. package/dist/chunk-VR3CDXDT.js.map +1 -0
  68. package/dist/{chunk-KPJJOLAQ.js → chunk-WF6RM73R.js} +272 -40
  69. package/dist/chunk-WF6RM73R.js.map +1 -0
  70. package/dist/chunk-WYVDNGJB.js +31 -0
  71. package/dist/chunk-WYVDNGJB.js.map +1 -0
  72. package/dist/{chunk-F7KTUFGU.js → chunk-X5EG4EFP.js} +3 -2
  73. package/dist/chunk-X5EG4EFP.js.map +1 -0
  74. package/dist/{chunk-FHKNG3UA.js → chunk-XUDTFI4M.js} +2 -2
  75. package/dist/{chunk-AXV7NFFJ.js → chunk-YHCYKUA3.js} +14 -10
  76. package/dist/chunk-YHCYKUA3.js.map +1 -0
  77. package/dist/commands/build/marketplace.js +4 -4
  78. package/dist/commands/build/plugins.js +9 -7
  79. package/dist/commands/build/plugins.js.map +1 -1
  80. package/dist/commands/build/stack.js +13 -10
  81. package/dist/commands/build/stack.js.map +1 -1
  82. package/dist/commands/compile.js +45 -72
  83. package/dist/commands/compile.js.map +1 -1
  84. package/dist/commands/config/index.js +7 -5
  85. package/dist/commands/config/index.js.map +1 -1
  86. package/dist/commands/config/path.js +8 -6
  87. package/dist/commands/config/path.js.map +1 -1
  88. package/dist/commands/config/show.js +7 -5
  89. package/dist/commands/diff.js +9 -7
  90. package/dist/commands/diff.js.map +1 -1
  91. package/dist/commands/doctor.js +20 -16
  92. package/dist/commands/doctor.js.map +1 -1
  93. package/dist/commands/edit.js +196 -94
  94. package/dist/commands/edit.js.map +1 -1
  95. package/dist/commands/eject.js +20 -41
  96. package/dist/commands/eject.js.map +1 -1
  97. package/dist/commands/import/skill.js +10 -18
  98. package/dist/commands/import/skill.js.map +1 -1
  99. package/dist/commands/info.js +21 -20
  100. package/dist/commands/info.js.map +1 -1
  101. package/dist/commands/init.js +41 -435
  102. package/dist/commands/init.js.map +1 -1
  103. package/dist/commands/list.js +8 -6
  104. package/dist/commands/list.js.map +1 -1
  105. package/dist/commands/new/agent.js +28 -15
  106. package/dist/commands/new/agent.js.map +1 -1
  107. package/dist/commands/new/marketplace.js +67 -31
  108. package/dist/commands/new/marketplace.js.map +1 -1
  109. package/dist/commands/new/skill.js +17 -208
  110. package/dist/commands/new/skill.js.map +1 -1
  111. package/dist/commands/outdated.js +16 -10
  112. package/dist/commands/outdated.js.map +1 -1
  113. package/dist/commands/search.js +45 -35
  114. package/dist/commands/search.js.map +1 -1
  115. package/dist/commands/uninstall.js +93 -123
  116. package/dist/commands/uninstall.js.map +1 -1
  117. package/dist/commands/update.js +11 -9
  118. package/dist/commands/update.js.map +1 -1
  119. package/dist/commands/validate.js +42 -267
  120. package/dist/commands/validate.js.map +1 -1
  121. package/dist/components/common/confirm.test.js +4 -4
  122. package/dist/components/skill-search/skill-search.js +3 -3
  123. package/dist/components/wizard/category-grid.js +3 -2
  124. package/dist/components/wizard/category-grid.test.js +113 -59
  125. package/dist/components/wizard/category-grid.test.js.map +1 -1
  126. package/dist/components/wizard/checkbox-grid.js +5 -3
  127. package/dist/components/wizard/checkbox-grid.test.js +6 -5
  128. package/dist/components/wizard/checkbox-grid.test.js.map +1 -1
  129. package/dist/components/wizard/domain-selection.js +12 -9
  130. package/dist/components/wizard/help-modal.js +2 -2
  131. package/dist/components/wizard/menu-item.js +1 -1
  132. package/dist/components/wizard/search-modal.js +2 -2
  133. package/dist/components/wizard/search-modal.test.js +3 -3
  134. package/dist/components/wizard/search-modal.test.js.map +1 -1
  135. package/dist/components/wizard/section-progress.js +2 -2
  136. package/dist/components/wizard/section-progress.test.js +4 -4
  137. package/dist/components/wizard/section-progress.test.js.map +1 -1
  138. package/dist/components/wizard/selection-card.js +2 -2
  139. package/dist/components/wizard/source-grid.js +4 -3
  140. package/dist/components/wizard/source-grid.test.js +5 -4
  141. package/dist/components/wizard/source-grid.test.js.map +1 -1
  142. package/dist/components/wizard/stack-selection.js +9 -8
  143. package/dist/components/wizard/step-agents.js +11 -8
  144. package/dist/components/wizard/step-agents.test.js +20 -18
  145. package/dist/components/wizard/step-agents.test.js.map +1 -1
  146. package/dist/components/wizard/step-build.js +11 -8
  147. package/dist/components/wizard/step-build.test.js +18 -36
  148. package/dist/components/wizard/step-build.test.js.map +1 -1
  149. package/dist/components/wizard/step-confirm.js +4 -4
  150. package/dist/components/wizard/step-confirm.test.js +83 -23
  151. package/dist/components/wizard/step-confirm.test.js.map +1 -1
  152. package/dist/components/wizard/step-refine.js +2 -2
  153. package/dist/components/wizard/step-refine.test.js +3 -3
  154. package/dist/components/wizard/step-settings.js +9 -5
  155. package/dist/components/wizard/step-settings.test.js +13 -9
  156. package/dist/components/wizard/step-settings.test.js.map +1 -1
  157. package/dist/components/wizard/step-sources.js +13 -10
  158. package/dist/components/wizard/step-sources.test.js +19 -16
  159. package/dist/components/wizard/step-sources.test.js.map +1 -1
  160. package/dist/components/wizard/step-stack.js +16 -12
  161. package/dist/components/wizard/step-stack.test.js +18 -14
  162. package/dist/components/wizard/step-stack.test.js.map +1 -1
  163. package/dist/components/wizard/view-title.js +2 -2
  164. package/dist/components/wizard/wizard-layout.js +10 -8
  165. package/dist/components/wizard/wizard-tabs.js +2 -2
  166. package/dist/components/wizard/wizard-tabs.test.js +2 -2
  167. package/dist/components/wizard/wizard.js +29 -25
  168. package/dist/config-exports.js +20 -0
  169. package/dist/config-exports.js.map +1 -0
  170. package/dist/hooks/init.js +56 -3
  171. package/dist/hooks/init.js.map +1 -1
  172. package/dist/loader-2O32KKAQ.js +19 -0
  173. package/dist/source-loader-A6B3NDI4.js +16 -0
  174. package/dist/source-loader-A6B3NDI4.js.map +1 -0
  175. package/dist/source-manager-Q7IQSGIX.js +18 -0
  176. package/dist/source-manager-Q7IQSGIX.js.map +1 -0
  177. package/dist/src/agents/meta/agent-summoner/critical-reminders.md +1 -1
  178. package/dist/src/agents/meta/agent-summoner/critical-requirements.md +1 -1
  179. package/dist/src/agents/meta/agent-summoner/examples.md +2 -2
  180. package/dist/src/agents/meta/agent-summoner/output-format.md +1 -1
  181. package/dist/src/agents/meta/agent-summoner/workflow.md +8 -10
  182. package/{src/agents/meta/documentor/agent.yaml → dist/src/agents/meta/documentor/metadata.yaml} +1 -0
  183. package/dist/src/agents/meta/skill-summoner/critical-reminders.md +2 -2
  184. package/dist/src/agents/meta/skill-summoner/critical-requirements.md +1 -1
  185. package/dist/src/agents/meta/skill-summoner/intro.md +1 -1
  186. package/dist/src/agents/meta/skill-summoner/output-format.md +3 -3
  187. package/dist/src/agents/meta/skill-summoner/workflow.md +8 -8
  188. package/dist/stores/wizard-store.js +6 -5
  189. package/dist/stores/wizard-store.test.js +367 -75
  190. package/dist/stores/wizard-store.test.js.map +1 -1
  191. package/package.json +5 -1
  192. package/src/agents/meta/agent-summoner/critical-reminders.md +1 -1
  193. package/src/agents/meta/agent-summoner/critical-requirements.md +1 -1
  194. package/src/agents/meta/agent-summoner/examples.md +2 -2
  195. package/src/agents/meta/agent-summoner/output-format.md +1 -1
  196. package/src/agents/meta/agent-summoner/workflow.md +8 -10
  197. package/{dist/src/agents/meta/documentor/agent.yaml → src/agents/meta/documentor/metadata.yaml} +1 -0
  198. package/src/agents/meta/skill-summoner/critical-reminders.md +2 -2
  199. package/src/agents/meta/skill-summoner/critical-requirements.md +1 -1
  200. package/src/agents/meta/skill-summoner/intro.md +1 -1
  201. package/src/agents/meta/skill-summoner/output-format.md +3 -3
  202. package/src/agents/meta/skill-summoner/workflow.md +8 -8
  203. package/src/schemas/agent.schema.json +1 -1
  204. package/src/schemas/metadata.schema.json +6 -0
  205. package/src/schemas/project-config.schema.json +0 -3
  206. package/src/schemas/stacks.schema.json +1 -1
  207. package/config/skill-categories.yaml +0 -344
  208. package/config/skill-rules.yaml +0 -740
  209. package/config/stacks.yaml +0 -1865
  210. package/dist/chunk-2BVZOYJP.js.map +0 -1
  211. package/dist/chunk-2DNDAXF6.js.map +0 -1
  212. package/dist/chunk-5MN5S3DV.js.map +0 -1
  213. package/dist/chunk-5O6GKXAN.js.map +0 -1
  214. package/dist/chunk-7IAKVZL5.js.map +0 -1
  215. package/dist/chunk-AMNCCZSG.js.map +0 -1
  216. package/dist/chunk-AXV7NFFJ.js.map +0 -1
  217. package/dist/chunk-AXZNJ5PN.js +0 -99
  218. package/dist/chunk-AXZNJ5PN.js.map +0 -1
  219. package/dist/chunk-C7DLY64D.js +0 -115
  220. package/dist/chunk-C7DLY64D.js.map +0 -1
  221. package/dist/chunk-F7KTUFGU.js.map +0 -1
  222. package/dist/chunk-FPTUCWBY.js.map +0 -1
  223. package/dist/chunk-IS7GP6XC.js.map +0 -1
  224. package/dist/chunk-KPJJOLAQ.js.map +0 -1
  225. package/dist/chunk-LESHL6SM.js.map +0 -1
  226. package/dist/chunk-NJVJ7VO5.js.map +0 -1
  227. package/dist/chunk-OHDEJEYB.js.map +0 -1
  228. package/dist/chunk-OTTITQ7C.js.map +0 -1
  229. package/dist/chunk-P2SFRDWI.js.map +0 -1
  230. package/dist/chunk-PY2XZUBF.js +0 -29
  231. package/dist/chunk-PY2XZUBF.js.map +0 -1
  232. package/dist/chunk-SPVSWDFM.js.map +0 -1
  233. package/dist/chunk-VBAAATPU.js.map +0 -1
  234. package/dist/chunk-WSGKCBY5.js.map +0 -1
  235. package/dist/chunk-X3SZIBVW.js.map +0 -1
  236. package/dist/chunk-YDASDMTH.js +0 -183
  237. package/dist/chunk-YDASDMTH.js.map +0 -1
  238. package/dist/chunk-YMUWTPOM.js.map +0 -1
  239. package/dist/chunk-YZTWZVGX.js.map +0 -1
  240. package/dist/commands/config/get.js +0 -61
  241. package/dist/commands/config/get.js.map +0 -1
  242. package/dist/commands/config/set-project.js +0 -61
  243. package/dist/commands/config/set-project.js.map +0 -1
  244. package/dist/commands/config/unset-project.js +0 -57
  245. package/dist/commands/config/unset-project.js.map +0 -1
  246. package/dist/config/skill-categories.yaml +0 -344
  247. package/dist/config/skill-rules.yaml +0 -740
  248. package/dist/config/stacks.yaml +0 -1865
  249. package/dist/source-manager-Y7R6WPOW.js +0 -16
  250. package/dist/src/agents/migration/cli-migrator/agent.yaml +0 -12
  251. package/dist/src/agents/migration/cli-migrator/anti-patterns.md +0 -158
  252. package/dist/src/agents/migration/cli-migrator/conversion-mappings.md +0 -63
  253. package/dist/src/agents/migration/cli-migrator/critical-reminders.md +0 -17
  254. package/dist/src/agents/migration/cli-migrator/critical-requirements.md +0 -13
  255. package/dist/src/agents/migration/cli-migrator/intro.md +0 -15
  256. package/dist/src/agents/migration/cli-migrator/output-format.md +0 -164
  257. package/dist/src/agents/migration/cli-migrator/workflow.md +0 -230
  258. package/src/agents/migration/cli-migrator/agent.yaml +0 -12
  259. package/src/agents/migration/cli-migrator/anti-patterns.md +0 -158
  260. package/src/agents/migration/cli-migrator/conversion-mappings.md +0 -63
  261. package/src/agents/migration/cli-migrator/critical-reminders.md +0 -17
  262. package/src/agents/migration/cli-migrator/critical-requirements.md +0 -13
  263. package/src/agents/migration/cli-migrator/intro.md +0 -15
  264. package/src/agents/migration/cli-migrator/output-format.md +0 -164
  265. package/src/agents/migration/cli-migrator/workflow.md +0 -230
  266. /package/dist/{chunk-I52THVF6.js.map → chunk-AJJJE7F7.js.map} +0 -0
  267. /package/dist/{chunk-ZML3OCYA.js.map → chunk-AX3SZZWA.js.map} +0 -0
  268. /package/dist/{chunk-W62XVWXB.js.map → chunk-C577AJE7.js.map} +0 -0
  269. /package/dist/{chunk-G5OZQ376.js.map → chunk-K6OLORQL.js.map} +0 -0
  270. /package/dist/{chunk-U2AEK4ZL.js.map → chunk-MGNYPVOJ.js.map} +0 -0
  271. /package/dist/{chunk-37QYD33C.js.map → chunk-MMFQNJPE.js.map} +0 -0
  272. /package/dist/{chunk-34BP5BC4.js.map → chunk-SDKCQXWE.js.map} +0 -0
  273. /package/dist/{chunk-FHKNG3UA.js.map → chunk-XUDTFI4M.js.map} +0 -0
  274. /package/dist/{source-manager-Y7R6WPOW.js.map → loader-2O32KKAQ.js.map} +0 -0
  275. /package/dist/src/agents/developer/api-developer/{agent.yaml → metadata.yaml} +0 -0
  276. /package/dist/src/agents/developer/cli-developer/{agent.yaml → metadata.yaml} +0 -0
  277. /package/dist/src/agents/developer/web-architecture/{agent.yaml → metadata.yaml} +0 -0
  278. /package/dist/src/agents/developer/web-developer/{agent.yaml → metadata.yaml} +0 -0
  279. /package/dist/src/agents/meta/agent-summoner/{agent.yaml → metadata.yaml} +0 -0
  280. /package/dist/src/agents/meta/skill-summoner/{agent.yaml → metadata.yaml} +0 -0
  281. /package/dist/src/agents/pattern/pattern-scout/{agent.yaml → metadata.yaml} +0 -0
  282. /package/dist/src/agents/pattern/web-pattern-critique/{agent.yaml → metadata.yaml} +0 -0
  283. /package/dist/src/agents/planning/web-pm/{agent.yaml → metadata.yaml} +0 -0
  284. /package/dist/src/agents/researcher/api-researcher/{agent.yaml → metadata.yaml} +0 -0
  285. /package/dist/src/agents/researcher/web-researcher/{agent.yaml → metadata.yaml} +0 -0
  286. /package/dist/src/agents/reviewer/api-reviewer/{agent.yaml → metadata.yaml} +0 -0
  287. /package/dist/src/agents/reviewer/cli-reviewer/{agent.yaml → metadata.yaml} +0 -0
  288. /package/dist/src/agents/reviewer/web-reviewer/{agent.yaml → metadata.yaml} +0 -0
  289. /package/dist/src/agents/tester/cli-tester/{agent.yaml → metadata.yaml} +0 -0
  290. /package/dist/src/agents/tester/web-tester/{agent.yaml → metadata.yaml} +0 -0
  291. /package/src/agents/developer/api-developer/{agent.yaml → metadata.yaml} +0 -0
  292. /package/src/agents/developer/cli-developer/{agent.yaml → metadata.yaml} +0 -0
  293. /package/src/agents/developer/web-architecture/{agent.yaml → metadata.yaml} +0 -0
  294. /package/src/agents/developer/web-developer/{agent.yaml → metadata.yaml} +0 -0
  295. /package/src/agents/meta/agent-summoner/{agent.yaml → metadata.yaml} +0 -0
  296. /package/src/agents/meta/skill-summoner/{agent.yaml → metadata.yaml} +0 -0
  297. /package/src/agents/pattern/pattern-scout/{agent.yaml → metadata.yaml} +0 -0
  298. /package/src/agents/pattern/web-pattern-critique/{agent.yaml → metadata.yaml} +0 -0
  299. /package/src/agents/planning/web-pm/{agent.yaml → metadata.yaml} +0 -0
  300. /package/src/agents/researcher/api-researcher/{agent.yaml → metadata.yaml} +0 -0
  301. /package/src/agents/researcher/web-researcher/{agent.yaml → metadata.yaml} +0 -0
  302. /package/src/agents/reviewer/api-reviewer/{agent.yaml → metadata.yaml} +0 -0
  303. /package/src/agents/reviewer/cli-reviewer/{agent.yaml → metadata.yaml} +0 -0
  304. /package/src/agents/reviewer/web-reviewer/{agent.yaml → metadata.yaml} +0 -0
  305. /package/src/agents/tester/cli-tester/{agent.yaml → metadata.yaml} +0 -0
  306. /package/src/agents/tester/web-tester/{agent.yaml → metadata.yaml} +0 -0
@@ -1,16 +1,16 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  SelectionCard
4
- } from "./chunk-F7KTUFGU.js";
4
+ } from "./chunk-X5EG4EFP.js";
5
5
  import {
6
- ViewTitle
7
- } from "./chunk-U2AEK4ZL.js";
6
+ useSectionScroll
7
+ } from "./chunk-BNQ5O6LE.js";
8
8
  import {
9
9
  useWizardStore
10
- } from "./chunk-KPJJOLAQ.js";
10
+ } from "./chunk-WF6RM73R.js";
11
11
  import {
12
12
  DEFAULT_SCRATCH_DOMAINS
13
- } from "./chunk-LESHL6SM.js";
13
+ } from "./chunk-6OWHQ7HM.js";
14
14
  import {
15
15
  init_esm_shims
16
16
  } from "./chunk-DHET7RCE.js";
@@ -24,13 +24,22 @@ var INITIAL_FOCUSED_INDEX = 0;
24
24
  var SCRATCH_LABEL = "Start from scratch";
25
25
  var SCRATCH_DESCRIPTION = "Select domains and skills manually";
26
26
  var EXTRA_ITEMS_COUNT = 1;
27
- var StackSelection = ({ matrix, onCancel }) => {
27
+ var StackSelection = ({
28
+ matrix,
29
+ availableHeight = 0,
30
+ onCancel
31
+ }) => {
28
32
  const { selectStack, setApproach, setStackAction, populateFromSkillIds, toggleDomain } = useWizardStore();
29
33
  const [focusedIndex, setFocusedIndex] = useState(INITIAL_FOCUSED_INDEX);
30
34
  const stacks = matrix.suggestedStacks;
31
35
  const stackCount = stacks.length;
32
36
  const scratchIndex = stackCount;
33
37
  const totalItems = stackCount + EXTRA_ITEMS_COUNT;
38
+ const { setSectionRef, scrollEnabled, scrollTopPx } = useSectionScroll({
39
+ sectionCount: totalItems,
40
+ focusedIndex,
41
+ availableHeight
42
+ });
34
43
  useInput((input, key) => {
35
44
  if (key.escape) {
36
45
  if (onCancel) {
@@ -64,32 +73,39 @@ var StackSelection = ({ matrix, onCancel }) => {
64
73
  setFocusedIndex((prev) => Math.min(totalItems - 1, prev + 1));
65
74
  }
66
75
  });
67
- return /* @__PURE__ */ jsxs(Box, { flexDirection: "column", children: [
68
- /* @__PURE__ */ jsx(ViewTitle, { children: "Choose a stack" }),
69
- /* @__PURE__ */ jsxs(Box, { flexDirection: "column", children: [
70
- stacks.map((stack, index) => /* @__PURE__ */ jsx(
71
- SelectionCard,
72
- {
73
- label: stack.name,
74
- description: stack.description,
75
- isFocused: index === focusedIndex,
76
- marginBottom: 1
77
- },
78
- stack.id
79
- )),
80
- /* @__PURE__ */ jsx(
81
- SelectionCard,
82
- {
83
- label: SCRATCH_LABEL,
84
- description: SCRATCH_DESCRIPTION,
85
- isFocused: focusedIndex === scratchIndex
86
- }
87
- )
88
- ] })
89
- ] });
76
+ const noShrink = scrollEnabled ? { flexShrink: 0 } : {};
77
+ const sectionElements = stacks.map((stack, index) => /* @__PURE__ */ jsx(Box, { ref: (el) => setSectionRef(index, el), width: "100%", ...noShrink, children: /* @__PURE__ */ jsx(
78
+ SelectionCard,
79
+ {
80
+ label: stack.name,
81
+ description: stack.description,
82
+ isFocused: index === focusedIndex,
83
+ marginBottom: 1
84
+ }
85
+ ) }, stack.id));
86
+ const scratchElement = /* @__PURE__ */ jsx(Box, { ref: (el) => setSectionRef(scratchIndex, el), width: "100%", ...noShrink, children: /* @__PURE__ */ jsx(
87
+ SelectionCard,
88
+ {
89
+ label: SCRATCH_LABEL,
90
+ description: SCRATCH_DESCRIPTION,
91
+ isFocused: focusedIndex === scratchIndex
92
+ }
93
+ ) });
94
+ return /* @__PURE__ */ jsx(
95
+ Box,
96
+ {
97
+ flexDirection: "column",
98
+ width: "100%",
99
+ ...scrollEnabled ? { height: availableHeight, overflow: "hidden" } : { flexGrow: 1 },
100
+ children: /* @__PURE__ */ jsxs(Box, { flexDirection: "column", marginTop: scrollTopPx > 0 ? -scrollTopPx : 0, ...noShrink, children: [
101
+ sectionElements,
102
+ scratchElement
103
+ ] })
104
+ }
105
+ );
90
106
  };
91
107
 
92
108
  export {
93
109
  StackSelection
94
110
  };
95
- //# sourceMappingURL=chunk-FPTUCWBY.js.map
111
+ //# sourceMappingURL=chunk-BMJZBLP7.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/components/wizard/stack-selection.tsx"],"sourcesContent":["import { Box, useInput } from \"ink\";\nimport React, { useState } from \"react\";\nimport { DEFAULT_SCRATCH_DOMAINS } from \"../../consts.js\";\nimport { useWizardStore } from \"../../stores/wizard-store.js\";\nimport type { MergedSkillsMatrix } from \"../../types/index.js\";\nimport { useSectionScroll } from \"../hooks/use-section-scroll.js\";\nimport { SelectionCard } from \"./selection-card.js\";\n\nconst INITIAL_FOCUSED_INDEX = 0;\nconst SCRATCH_LABEL = \"Start from scratch\";\nconst SCRATCH_DESCRIPTION = \"Select domains and skills manually\";\n\n/** Number of extra items after the stack list (scratch option) */\nconst EXTRA_ITEMS_COUNT = 1;\n\nexport type StackSelectionProps = {\n matrix: MergedSkillsMatrix;\n /** Available height in terminal lines for the scrollable viewport. 0 = no constraint. */\n availableHeight?: number;\n onCancel?: () => void;\n};\n\nexport const StackSelection: React.FC<StackSelectionProps> = ({\n matrix,\n availableHeight = 0,\n onCancel,\n}) => {\n const { selectStack, setApproach, setStackAction, populateFromSkillIds, toggleDomain } =\n useWizardStore();\n\n const [focusedIndex, setFocusedIndex] = useState(INITIAL_FOCUSED_INDEX);\n\n const stacks = matrix.suggestedStacks;\n const stackCount = stacks.length;\n const scratchIndex = stackCount;\n const totalItems = stackCount + EXTRA_ITEMS_COUNT;\n\n const { setSectionRef, scrollEnabled, scrollTopPx } = useSectionScroll({\n sectionCount: totalItems,\n focusedIndex,\n availableHeight,\n });\n\n useInput((input, key) => {\n if (key.escape) {\n if (onCancel) {\n onCancel();\n }\n return;\n }\n\n if (key.return) {\n if (focusedIndex === scratchIndex) {\n selectStack(null);\n setApproach(\"scratch\");\n\n for (const domain of DEFAULT_SCRATCH_DOMAINS) {\n toggleDomain(domain);\n }\n return;\n }\n\n const focusedStack = stacks[focusedIndex];\n if (focusedStack) {\n selectStack(focusedStack.id);\n setStackAction(\"customize\");\n populateFromSkillIds(focusedStack.allSkillIds, matrix.skills, matrix.categories);\n setApproach(\"stack\");\n }\n return;\n }\n\n if (key.upArrow || input === \"k\") {\n setFocusedIndex((prev) => Math.max(0, prev - 1));\n return;\n }\n if (key.downArrow || input === \"j\") {\n setFocusedIndex((prev) => Math.min(totalItems - 1, prev + 1));\n }\n });\n\n const noShrink = scrollEnabled ? { flexShrink: 0 } : {};\n\n const sectionElements = stacks.map((stack, index) => (\n <Box key={stack.id} ref={(el) => setSectionRef(index, el)} width=\"100%\" {...noShrink}>\n <SelectionCard\n label={stack.name}\n description={stack.description}\n isFocused={index === focusedIndex}\n marginBottom={1}\n />\n </Box>\n ));\n\n const scratchElement = (\n <Box ref={(el) => setSectionRef(scratchIndex, el)} width=\"100%\" {...noShrink}>\n <SelectionCard\n label={SCRATCH_LABEL}\n description={SCRATCH_DESCRIPTION}\n isFocused={focusedIndex === scratchIndex}\n />\n </Box>\n );\n\n return (\n <Box\n flexDirection=\"column\"\n width=\"100%\"\n {...(scrollEnabled\n ? { height: availableHeight, overflow: \"hidden\" as const }\n : { flexGrow: 1 })}\n >\n <Box flexDirection=\"column\" marginTop={scrollTopPx > 0 ? -scrollTopPx : 0} {...noShrink}>\n {sectionElements}\n {scratchElement}\n </Box>\n </Box>\n );\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA,SAAS,KAAK,gBAAgB;AAC9B,SAAgB,gBAAgB;AAoF1B,cA2BA,YA3BA;AA7EN,IAAM,wBAAwB;AAC9B,IAAM,gBAAgB;AACtB,IAAM,sBAAsB;AAG5B,IAAM,oBAAoB;AASnB,IAAM,iBAAgD,CAAC;AAAA,EAC5D;AAAA,EACA,kBAAkB;AAAA,EAClB;AACF,MAAM;AACJ,QAAM,EAAE,aAAa,aAAa,gBAAgB,sBAAsB,aAAa,IACnF,eAAe;AAEjB,QAAM,CAAC,cAAc,eAAe,IAAI,SAAS,qBAAqB;AAEtE,QAAM,SAAS,OAAO;AACtB,QAAM,aAAa,OAAO;AAC1B,QAAM,eAAe;AACrB,QAAM,aAAa,aAAa;AAEhC,QAAM,EAAE,eAAe,eAAe,YAAY,IAAI,iBAAiB;AAAA,IACrE,cAAc;AAAA,IACd;AAAA,IACA;AAAA,EACF,CAAC;AAED,WAAS,CAAC,OAAO,QAAQ;AACvB,QAAI,IAAI,QAAQ;AACd,UAAI,UAAU;AACZ,iBAAS;AAAA,MACX;AACA;AAAA,IACF;AAEA,QAAI,IAAI,QAAQ;AACd,UAAI,iBAAiB,cAAc;AACjC,oBAAY,IAAI;AAChB,oBAAY,SAAS;AAErB,mBAAW,UAAU,yBAAyB;AAC5C,uBAAa,MAAM;AAAA,QACrB;AACA;AAAA,MACF;AAEA,YAAM,eAAe,OAAO,YAAY;AACxC,UAAI,cAAc;AAChB,oBAAY,aAAa,EAAE;AAC3B,uBAAe,WAAW;AAC1B,6BAAqB,aAAa,aAAa,OAAO,QAAQ,OAAO,UAAU;AAC/E,oBAAY,OAAO;AAAA,MACrB;AACA;AAAA,IACF;AAEA,QAAI,IAAI,WAAW,UAAU,KAAK;AAChC,sBAAgB,CAAC,SAAS,KAAK,IAAI,GAAG,OAAO,CAAC,CAAC;AAC/C;AAAA,IACF;AACA,QAAI,IAAI,aAAa,UAAU,KAAK;AAClC,sBAAgB,CAAC,SAAS,KAAK,IAAI,aAAa,GAAG,OAAO,CAAC,CAAC;AAAA,IAC9D;AAAA,EACF,CAAC;AAED,QAAM,WAAW,gBAAgB,EAAE,YAAY,EAAE,IAAI,CAAC;AAEtD,QAAM,kBAAkB,OAAO,IAAI,CAAC,OAAO,UACzC,oBAAC,OAAmB,KAAK,CAAC,OAAO,cAAc,OAAO,EAAE,GAAG,OAAM,QAAQ,GAAG,UAC1E;AAAA,IAAC;AAAA;AAAA,MACC,OAAO,MAAM;AAAA,MACb,aAAa,MAAM;AAAA,MACnB,WAAW,UAAU;AAAA,MACrB,cAAc;AAAA;AAAA,EAChB,KANQ,MAAM,EAOhB,CACD;AAED,QAAM,iBACJ,oBAAC,OAAI,KAAK,CAAC,OAAO,cAAc,cAAc,EAAE,GAAG,OAAM,QAAQ,GAAG,UAClE;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,MACP,aAAa;AAAA,MACb,WAAW,iBAAiB;AAAA;AAAA,EAC9B,GACF;AAGF,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAc;AAAA,MACd,OAAM;AAAA,MACL,GAAI,gBACD,EAAE,QAAQ,iBAAiB,UAAU,SAAkB,IACvD,EAAE,UAAU,EAAE;AAAA,MAElB,+BAAC,OAAI,eAAc,UAAS,WAAW,cAAc,IAAI,CAAC,cAAc,GAAI,GAAG,UAC5E;AAAA;AAAA,QACA;AAAA,SACH;AAAA;AAAA,EACF;AAEJ;","names":[]}
@@ -0,0 +1,74 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ SCROLL_VIEWPORT
4
+ } from "./chunk-6OWHQ7HM.js";
5
+ import {
6
+ init_esm_shims
7
+ } from "./chunk-DHET7RCE.js";
8
+
9
+ // src/cli/components/hooks/use-section-scroll.ts
10
+ init_esm_shims();
11
+ import { useCallback, useEffect, useRef, useState } from "react";
12
+ import { measureElement } from "ink";
13
+ function useSectionScroll({
14
+ sectionCount,
15
+ focusedIndex,
16
+ availableHeight
17
+ }) {
18
+ const sectionRefs = useRef([]);
19
+ const [sectionHeights, setSectionHeights] = useState([]);
20
+ const [scrollTopPx, setScrollTopPx] = useState(0);
21
+ const setSectionRef = useCallback((index, el) => {
22
+ sectionRefs.current[index] = el;
23
+ }, []);
24
+ useEffect(() => {
25
+ const heights = sectionRefs.current.map((el) => {
26
+ if (el) {
27
+ const { height } = measureElement(el);
28
+ return height;
29
+ }
30
+ return 0;
31
+ });
32
+ setSectionHeights((prev) => {
33
+ if (prev.length === heights.length && prev.every((h, i) => h === heights[i])) {
34
+ return prev;
35
+ }
36
+ return heights;
37
+ });
38
+ });
39
+ const scrollEnabled = availableHeight > 0 && availableHeight >= SCROLL_VIEWPORT.MIN_VIEWPORT_ROWS;
40
+ useEffect(() => {
41
+ if (!scrollEnabled || sectionHeights.length === 0) return;
42
+ let topOfFocused = 0;
43
+ for (let i = 0; i < focusedIndex; i++) {
44
+ topOfFocused += sectionHeights[i] ?? 0;
45
+ }
46
+ const focusedHeight = sectionHeights[focusedIndex] ?? 0;
47
+ const bottomOfFocused = topOfFocused + focusedHeight;
48
+ setScrollTopPx((prev) => {
49
+ if (topOfFocused < prev) {
50
+ return topOfFocused;
51
+ }
52
+ if (bottomOfFocused > prev + availableHeight) {
53
+ return bottomOfFocused - availableHeight;
54
+ }
55
+ return prev;
56
+ });
57
+ }, [focusedIndex, sectionHeights, scrollEnabled, availableHeight]);
58
+ return { setSectionRef, scrollEnabled, scrollTopPx };
59
+ }
60
+ function computeRowScrollTop(focusedRow, currentScrollTop, viewportHeight) {
61
+ if (focusedRow < currentScrollTop) {
62
+ return focusedRow;
63
+ }
64
+ if (focusedRow + 1 > currentScrollTop + viewportHeight) {
65
+ return focusedRow + 1 - viewportHeight;
66
+ }
67
+ return currentScrollTop;
68
+ }
69
+
70
+ export {
71
+ useSectionScroll,
72
+ computeRowScrollTop
73
+ };
74
+ //# sourceMappingURL=chunk-BNQ5O6LE.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/components/hooks/use-section-scroll.ts"],"sourcesContent":["import { useCallback, useEffect, useRef, useState } from \"react\";\nimport { type DOMElement, measureElement } from \"ink\";\nimport { SCROLL_VIEWPORT } from \"../../consts.js\";\n\nexport type UseSectionScrollOptions = {\n sectionCount: number;\n focusedIndex: number;\n availableHeight: number;\n};\n\nexport type UseSectionScrollResult = {\n setSectionRef: (index: number, el: DOMElement | null) => void;\n scrollEnabled: boolean;\n scrollTopPx: number;\n};\n\n/**\n * Shared pixel-offset scroll hook for views with variable-height sections.\n *\n * Manages section refs, height measurement, and scroll position to keep the\n * focused section visible within a constrained viewport. Extracted from the\n * identical scroll plumbing in category-grid.tsx and source-grid.tsx.\n */\nexport function useSectionScroll({\n sectionCount,\n focusedIndex,\n availableHeight,\n}: UseSectionScrollOptions): UseSectionScrollResult {\n const sectionRefs = useRef<(DOMElement | null)[]>([]);\n const [sectionHeights, setSectionHeights] = useState<number[]>([]);\n const [scrollTopPx, setScrollTopPx] = useState(0);\n\n const setSectionRef = useCallback((index: number, el: DOMElement | null) => {\n sectionRefs.current[index] = el;\n }, []);\n\n // Measure section heights on every render\n useEffect(() => {\n const heights = sectionRefs.current.map((el) => {\n if (el) {\n const { height } = measureElement(el);\n return height;\n }\n return 0;\n });\n setSectionHeights((prev) => {\n if (prev.length === heights.length && prev.every((h, i) => h === heights[i])) {\n return prev;\n }\n return heights;\n });\n });\n\n const scrollEnabled = availableHeight > 0 && availableHeight >= SCROLL_VIEWPORT.MIN_VIEWPORT_ROWS;\n\n // Keep focused section visible\n useEffect(() => {\n if (!scrollEnabled || sectionHeights.length === 0) return;\n\n let topOfFocused = 0;\n for (let i = 0; i < focusedIndex; i++) {\n topOfFocused += sectionHeights[i] ?? 0;\n }\n const focusedHeight = sectionHeights[focusedIndex] ?? 0;\n const bottomOfFocused = topOfFocused + focusedHeight;\n\n setScrollTopPx((prev) => {\n if (topOfFocused < prev) {\n return topOfFocused;\n }\n if (bottomOfFocused > prev + availableHeight) {\n return bottomOfFocused - availableHeight;\n }\n return prev;\n });\n }, [focusedIndex, sectionHeights, scrollEnabled, availableHeight]);\n\n return { setSectionRef, scrollEnabled, scrollTopPx };\n}\n\n/**\n * Pure function for row-based scroll offset computation.\n *\n * For views with uniform 1-line rows (step-agents, checkbox-grid, step-settings),\n * computes the scroll offset (in rows) to keep `focusedRow` visible within\n * a viewport of `viewportHeight` rows.\n */\nexport function computeRowScrollTop(\n focusedRow: number,\n currentScrollTop: number,\n viewportHeight: number,\n): number {\n if (focusedRow < currentScrollTop) {\n return focusedRow;\n }\n if (focusedRow + 1 > currentScrollTop + viewportHeight) {\n return focusedRow + 1 - viewportHeight;\n }\n return currentScrollTop;\n}\n"],"mappings":";;;;;;;;;AAAA;AAAA,SAAS,aAAa,WAAW,QAAQ,gBAAgB;AACzD,SAA0B,sBAAsB;AAsBzC,SAAS,iBAAiB;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AACF,GAAoD;AAClD,QAAM,cAAc,OAA8B,CAAC,CAAC;AACpD,QAAM,CAAC,gBAAgB,iBAAiB,IAAI,SAAmB,CAAC,CAAC;AACjE,QAAM,CAAC,aAAa,cAAc,IAAI,SAAS,CAAC;AAEhD,QAAM,gBAAgB,YAAY,CAAC,OAAe,OAA0B;AAC1E,gBAAY,QAAQ,KAAK,IAAI;AAAA,EAC/B,GAAG,CAAC,CAAC;AAGL,YAAU,MAAM;AACd,UAAM,UAAU,YAAY,QAAQ,IAAI,CAAC,OAAO;AAC9C,UAAI,IAAI;AACN,cAAM,EAAE,OAAO,IAAI,eAAe,EAAE;AACpC,eAAO;AAAA,MACT;AACA,aAAO;AAAA,IACT,CAAC;AACD,sBAAkB,CAAC,SAAS;AAC1B,UAAI,KAAK,WAAW,QAAQ,UAAU,KAAK,MAAM,CAAC,GAAG,MAAM,MAAM,QAAQ,CAAC,CAAC,GAAG;AAC5E,eAAO;AAAA,MACT;AACA,aAAO;AAAA,IACT,CAAC;AAAA,EACH,CAAC;AAED,QAAM,gBAAgB,kBAAkB,KAAK,mBAAmB,gBAAgB;AAGhF,YAAU,MAAM;AACd,QAAI,CAAC,iBAAiB,eAAe,WAAW,EAAG;AAEnD,QAAI,eAAe;AACnB,aAAS,IAAI,GAAG,IAAI,cAAc,KAAK;AACrC,sBAAgB,eAAe,CAAC,KAAK;AAAA,IACvC;AACA,UAAM,gBAAgB,eAAe,YAAY,KAAK;AACtD,UAAM,kBAAkB,eAAe;AAEvC,mBAAe,CAAC,SAAS;AACvB,UAAI,eAAe,MAAM;AACvB,eAAO;AAAA,MACT;AACA,UAAI,kBAAkB,OAAO,iBAAiB;AAC5C,eAAO,kBAAkB;AAAA,MAC3B;AACA,aAAO;AAAA,IACT,CAAC;AAAA,EACH,GAAG,CAAC,cAAc,gBAAgB,eAAe,eAAe,CAAC;AAEjE,SAAO,EAAE,eAAe,eAAe,YAAY;AACrD;AASO,SAAS,oBACd,YACA,kBACA,gBACQ;AACR,MAAI,aAAa,kBAAkB;AACjC,WAAO;AAAA,EACT;AACA,MAAI,aAAa,IAAI,mBAAmB,gBAAgB;AACtD,WAAO,aAAa,IAAI;AAAA,EAC1B;AACA,SAAO;AACT;","names":[]}
@@ -8,10 +8,10 @@ import {
8
8
  verbose,
9
9
  warn,
10
10
  writeFile
11
- } from "./chunk-YMUWTPOM.js";
11
+ } from "./chunk-LWXRUR6B.js";
12
12
  import {
13
13
  MAX_PLUGIN_FILE_SIZE
14
- } from "./chunk-LESHL6SM.js";
14
+ } from "./chunk-6OWHQ7HM.js";
15
15
  import {
16
16
  init_esm_shims
17
17
  } from "./chunk-DHET7RCE.js";
@@ -129,4 +129,4 @@ export {
129
129
  writeMarketplace,
130
130
  getMarketplaceStats
131
131
  };
132
- //# sourceMappingURL=chunk-W62XVWXB.js.map
132
+ //# sourceMappingURL=chunk-C577AJE7.js.map
@@ -0,0 +1,118 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ useRowScroll
4
+ } from "./chunk-WYVDNGJB.js";
5
+ import {
6
+ ViewTitle
7
+ } from "./chunk-MGNYPVOJ.js";
8
+ import {
9
+ CLI_COLORS,
10
+ UI_SYMBOLS
11
+ } from "./chunk-6OWHQ7HM.js";
12
+ import {
13
+ init_esm_shims
14
+ } from "./chunk-DHET7RCE.js";
15
+
16
+ // src/cli/components/wizard/checkbox-grid.tsx
17
+ init_esm_shims();
18
+ import { Box, Text, useInput } from "ink";
19
+ import { useState } from "react";
20
+ import { jsx, jsxs } from "react/jsx-runtime";
21
+ var CheckboxGrid = ({
22
+ title,
23
+ subtitle,
24
+ items,
25
+ selectedIds,
26
+ availableHeight = 0,
27
+ onToggle,
28
+ onContinue,
29
+ onBack,
30
+ emptyMessage = "Please select at least one item"
31
+ }) => {
32
+ const totalItems = items.length + 1;
33
+ const [focusedIndex, setFocusedIndex] = useState(0);
34
+ useInput((input, key) => {
35
+ if (key.escape) {
36
+ onBack();
37
+ return;
38
+ }
39
+ if (key.upArrow || input === "k") {
40
+ setFocusedIndex((prev) => prev <= 0 ? totalItems - 1 : prev - 1);
41
+ return;
42
+ }
43
+ if (key.downArrow || input === "j") {
44
+ setFocusedIndex((prev) => prev >= totalItems - 1 ? 0 : prev + 1);
45
+ return;
46
+ }
47
+ if (key.return) {
48
+ onContinue();
49
+ return;
50
+ }
51
+ if (input === " ") {
52
+ const item = items[focusedIndex];
53
+ if (item) {
54
+ onToggle(item.id);
55
+ }
56
+ }
57
+ });
58
+ const continueIndex = items.length;
59
+ const effectiveRow = focusedIndex >= items.length ? items.length - 1 : focusedIndex;
60
+ const { scrollEnabled, scrollTop } = useRowScroll({
61
+ focusedIndex: effectiveRow,
62
+ itemCount: items.length,
63
+ availableHeight
64
+ });
65
+ const itemElements = items.map((item, index) => {
66
+ const isFocused = index === focusedIndex;
67
+ const isSelected = selectedIds.includes(item.id);
68
+ const checkbox = isSelected ? "[\u2713]" : "[ ]";
69
+ const pointer = isFocused ? UI_SYMBOLS.CHEVRON : UI_SYMBOLS.CHEVRON_SPACER;
70
+ return /* @__PURE__ */ jsxs(Text, { children: [
71
+ /* @__PURE__ */ jsx(Text, { color: isFocused ? CLI_COLORS.PRIMARY : void 0, children: pointer }),
72
+ /* @__PURE__ */ jsxs(Text, { color: isSelected || isFocused ? CLI_COLORS.PRIMARY : void 0, bold: isFocused, children: [
73
+ " ",
74
+ checkbox,
75
+ " ",
76
+ item.label
77
+ ] }),
78
+ isFocused && /* @__PURE__ */ jsxs(Text, { dimColor: true, children: [
79
+ " ",
80
+ item.description
81
+ ] })
82
+ ] }, item.id);
83
+ });
84
+ const footerElement = selectedIds.length > 0 ? /* @__PURE__ */ jsxs(Text, { children: [
85
+ "\n",
86
+ "Selected: ",
87
+ /* @__PURE__ */ jsx(Text, { color: CLI_COLORS.WARNING, children: selectedIds.join(", ") })
88
+ ] }) : emptyMessage ? /* @__PURE__ */ jsxs(Text, { dimColor: true, children: [
89
+ "\n",
90
+ emptyMessage
91
+ ] }) : null;
92
+ return /* @__PURE__ */ jsxs(Box, { flexDirection: "column", children: [
93
+ /* @__PURE__ */ jsx(ViewTitle, { children: title }),
94
+ subtitle && /* @__PURE__ */ jsx(Text, { dimColor: true, children: subtitle }),
95
+ /* @__PURE__ */ jsx(
96
+ Box,
97
+ {
98
+ flexDirection: "column",
99
+ ...scrollEnabled && { height: availableHeight, overflow: "hidden" },
100
+ children: /* @__PURE__ */ jsx(
101
+ Box,
102
+ {
103
+ flexDirection: "column",
104
+ marginTop: scrollTop > 0 ? -scrollTop : 0,
105
+ ...scrollEnabled && { flexShrink: 0 },
106
+ children: itemElements
107
+ }
108
+ )
109
+ }
110
+ ),
111
+ footerElement
112
+ ] });
113
+ };
114
+
115
+ export {
116
+ CheckboxGrid
117
+ };
118
+ //# sourceMappingURL=chunk-CIG7IKX3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/components/wizard/checkbox-grid.tsx"],"sourcesContent":["import { Box, Text, useInput } from \"ink\";\nimport React, { useState } from \"react\";\nimport { CLI_COLORS, UI_SYMBOLS } from \"../../consts.js\";\nimport { useRowScroll } from \"../hooks/use-row-scroll.js\";\nimport { ViewTitle } from \"./view-title.js\";\n\nexport type CheckboxItem<T extends string = string> = {\n id: T;\n label: string;\n description: string;\n};\n\nexport type CheckboxGridProps<T extends string = string> = {\n title: string;\n subtitle?: string;\n items: CheckboxItem<T>[];\n selectedIds: T[];\n /** Available height in terminal lines for the scrollable viewport. 0 = no constraint. */\n availableHeight?: number;\n onToggle: (id: T) => void;\n onContinue: () => void;\n onBack: () => void;\n /** Message shown when nothing is selected */\n emptyMessage?: string;\n};\n\nexport const CheckboxGrid = <T extends string = string>({\n title,\n subtitle,\n items,\n selectedIds,\n availableHeight = 0,\n onToggle,\n onContinue,\n onBack,\n emptyMessage = \"Please select at least one item\",\n}: CheckboxGridProps<T>): React.ReactElement => {\n // Items + continue option at the end\n const totalItems = items.length + 1;\n const [focusedIndex, setFocusedIndex] = useState(0);\n\n useInput((input, key) => {\n if (key.escape) {\n onBack();\n return;\n }\n\n if (key.upArrow || input === \"k\") {\n setFocusedIndex((prev) => (prev <= 0 ? totalItems - 1 : prev - 1));\n return;\n }\n\n if (key.downArrow || input === \"j\") {\n setFocusedIndex((prev) => (prev >= totalItems - 1 ? 0 : prev + 1));\n return;\n }\n\n if (key.return) {\n onContinue();\n return;\n }\n\n if (input === \" \") {\n const item = items[focusedIndex];\n if (item) {\n onToggle(item.id);\n }\n }\n });\n\n const continueIndex = items.length;\n\n // When focus is on continue (past items), scroll to show last items\n const effectiveRow = focusedIndex >= items.length ? items.length - 1 : focusedIndex;\n const { scrollEnabled, scrollTop } = useRowScroll({\n focusedIndex: effectiveRow,\n itemCount: items.length,\n availableHeight,\n });\n\n const itemElements = items.map((item, index) => {\n const isFocused = index === focusedIndex;\n const isSelected = selectedIds.includes(item.id);\n const checkbox = isSelected ? \"[\\u2713]\" : \"[ ]\";\n const pointer = isFocused ? UI_SYMBOLS.CHEVRON : UI_SYMBOLS.CHEVRON_SPACER;\n\n return (\n <Text key={item.id}>\n <Text color={isFocused ? CLI_COLORS.PRIMARY : undefined}>{pointer}</Text>\n <Text color={isSelected || isFocused ? CLI_COLORS.PRIMARY : undefined} bold={isFocused}>\n {\" \"}\n {checkbox} {item.label}\n </Text>\n {isFocused && (\n <Text dimColor>\n {\" \"}\n {item.description}\n </Text>\n )}\n </Text>\n );\n });\n\n const footerElement =\n selectedIds.length > 0 ? (\n <Text>\n {\"\\n\"}Selected: <Text color={CLI_COLORS.WARNING}>{selectedIds.join(\", \")}</Text>\n </Text>\n ) : emptyMessage ? (\n <Text dimColor>\n {\"\\n\"}\n {emptyMessage}\n </Text>\n ) : null;\n\n return (\n <Box flexDirection=\"column\">\n <ViewTitle>{title}</ViewTitle>\n {subtitle && <Text dimColor>{subtitle}</Text>}\n <Box\n flexDirection=\"column\"\n {...(scrollEnabled && { height: availableHeight, overflow: \"hidden\" as const })}\n >\n <Box\n flexDirection=\"column\"\n marginTop={scrollTop > 0 ? -scrollTop : 0}\n {...(scrollEnabled && { flexShrink: 0 })}\n >\n {itemElements}\n </Box>\n </Box>\n {footerElement}\n </Box>\n );\n};\n"],"mappings":";;;;;;;;;;;;;;;;AAAA;AAAA,SAAS,KAAK,MAAM,gBAAgB;AACpC,SAAgB,gBAAgB;AAuFxB,cACA,YADA;AA9DD,IAAM,eAAe,CAA4B;AAAA,EACtD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,kBAAkB;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA,EACA,eAAe;AACjB,MAAgD;AAE9C,QAAM,aAAa,MAAM,SAAS;AAClC,QAAM,CAAC,cAAc,eAAe,IAAI,SAAS,CAAC;AAElD,WAAS,CAAC,OAAO,QAAQ;AACvB,QAAI,IAAI,QAAQ;AACd,aAAO;AACP;AAAA,IACF;AAEA,QAAI,IAAI,WAAW,UAAU,KAAK;AAChC,sBAAgB,CAAC,SAAU,QAAQ,IAAI,aAAa,IAAI,OAAO,CAAE;AACjE;AAAA,IACF;AAEA,QAAI,IAAI,aAAa,UAAU,KAAK;AAClC,sBAAgB,CAAC,SAAU,QAAQ,aAAa,IAAI,IAAI,OAAO,CAAE;AACjE;AAAA,IACF;AAEA,QAAI,IAAI,QAAQ;AACd,iBAAW;AACX;AAAA,IACF;AAEA,QAAI,UAAU,KAAK;AACjB,YAAM,OAAO,MAAM,YAAY;AAC/B,UAAI,MAAM;AACR,iBAAS,KAAK,EAAE;AAAA,MAClB;AAAA,IACF;AAAA,EACF,CAAC;AAED,QAAM,gBAAgB,MAAM;AAG5B,QAAM,eAAe,gBAAgB,MAAM,SAAS,MAAM,SAAS,IAAI;AACvE,QAAM,EAAE,eAAe,UAAU,IAAI,aAAa;AAAA,IAChD,cAAc;AAAA,IACd,WAAW,MAAM;AAAA,IACjB;AAAA,EACF,CAAC;AAED,QAAM,eAAe,MAAM,IAAI,CAAC,MAAM,UAAU;AAC9C,UAAM,YAAY,UAAU;AAC5B,UAAM,aAAa,YAAY,SAAS,KAAK,EAAE;AAC/C,UAAM,WAAW,aAAa,aAAa;AAC3C,UAAM,UAAU,YAAY,WAAW,UAAU,WAAW;AAE5D,WACE,qBAAC,QACC;AAAA,0BAAC,QAAK,OAAO,YAAY,WAAW,UAAU,QAAY,mBAAQ;AAAA,MAClE,qBAAC,QAAK,OAAO,cAAc,YAAY,WAAW,UAAU,QAAW,MAAM,WAC1E;AAAA;AAAA,QACA;AAAA,QAAS;AAAA,QAAE,KAAK;AAAA,SACnB;AAAA,MACC,aACC,qBAAC,QAAK,UAAQ,MACX;AAAA;AAAA,QACA,KAAK;AAAA,SACR;AAAA,SAVO,KAAK,EAYhB;AAAA,EAEJ,CAAC;AAED,QAAM,gBACJ,YAAY,SAAS,IACnB,qBAAC,QACE;AAAA;AAAA,IAAK;AAAA,IAAU,oBAAC,QAAK,OAAO,WAAW,SAAU,sBAAY,KAAK,IAAI,GAAE;AAAA,KAC3E,IACE,eACF,qBAAC,QAAK,UAAQ,MACX;AAAA;AAAA,IACA;AAAA,KACH,IACE;AAEN,SACE,qBAAC,OAAI,eAAc,UACjB;AAAA,wBAAC,aAAW,iBAAM;AAAA,IACjB,YAAY,oBAAC,QAAK,UAAQ,MAAE,oBAAS;AAAA,IACtC;AAAA,MAAC;AAAA;AAAA,QACC,eAAc;AAAA,QACb,GAAI,iBAAiB,EAAE,QAAQ,iBAAiB,UAAU,SAAkB;AAAA,QAE7E;AAAA,UAAC;AAAA;AAAA,YACC,eAAc;AAAA,YACd,WAAW,YAAY,IAAI,CAAC,YAAY;AAAA,YACvC,GAAI,iBAAiB,EAAE,YAAY,EAAE;AAAA,YAErC;AAAA;AAAA,QACH;AAAA;AAAA,IACF;AAAA,IACC;AAAA,KACH;AAEJ;","names":[]}