@claude-collective/cli 0.21.0 → 0.25.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (292) hide show
  1. package/CHANGELOG.md +174 -0
  2. package/README.md +41 -27
  3. package/config/skills-matrix.yaml +38 -37
  4. package/config/stacks.yaml +8 -14
  5. package/dist/{chunk-ZNIDWLL5.js → chunk-3X5D7RM5.js} +4 -3
  6. package/dist/chunk-3X5D7RM5.js.map +1 -0
  7. package/dist/chunk-4S4FCAA2.js +100 -0
  8. package/dist/chunk-4S4FCAA2.js.map +1 -0
  9. package/dist/chunk-4WGN6SUE.js +197 -0
  10. package/dist/chunk-4WGN6SUE.js.map +1 -0
  11. package/dist/{chunk-DHET7RCE.js → chunk-AWKZ5BDL.js} +9 -2
  12. package/dist/{chunk-DHET7RCE.js.map → chunk-AWKZ5BDL.js.map} +1 -1
  13. package/dist/{chunk-6Q3Y7KVB.js → chunk-DBRUQQUF.js} +8 -2
  14. package/dist/chunk-DBRUQQUF.js.map +1 -0
  15. package/dist/{chunk-OQYYMQJR.js → chunk-ETCVEV3S.js} +8 -11
  16. package/dist/chunk-ETCVEV3S.js.map +1 -0
  17. package/dist/{chunk-ZSVMS677.js → chunk-F4RD5FYM.js} +2 -2
  18. package/dist/chunk-F4RD5FYM.js.map +1 -0
  19. package/dist/{chunk-5KXUDHAB.js → chunk-GGFOD5PK.js} +6 -9
  20. package/dist/chunk-GGFOD5PK.js.map +1 -0
  21. package/dist/{chunk-UMORK7OK.js → chunk-H7SSBSPR.js} +2 -2
  22. package/dist/chunk-H7SSBSPR.js.map +1 -0
  23. package/dist/chunk-HWD32NP7.js +19 -0
  24. package/dist/chunk-HWD32NP7.js.map +1 -0
  25. package/dist/{chunk-HGCBZUH5.js → chunk-IAYAE6MG.js} +9 -10
  26. package/dist/chunk-IAYAE6MG.js.map +1 -0
  27. package/dist/{chunk-RTE64SJA.js → chunk-IXBCRT3F.js} +2 -2
  28. package/dist/chunk-IXBCRT3F.js.map +1 -0
  29. package/dist/{chunk-WFEFICFM.js → chunk-KWYO3M5Q.js} +5 -5
  30. package/dist/chunk-KWYO3M5Q.js.map +1 -0
  31. package/dist/{chunk-HEOHU5EZ.js → chunk-MCTSHLAF.js} +22 -11
  32. package/dist/chunk-MCTSHLAF.js.map +1 -0
  33. package/dist/chunk-MH66WDFV.js +251 -0
  34. package/dist/chunk-MH66WDFV.js.map +1 -0
  35. package/dist/{chunk-2LSGX6R4.js → chunk-MTPM7BX5.js} +83 -25
  36. package/dist/chunk-MTPM7BX5.js.map +1 -0
  37. package/dist/chunk-NQJ47R4N.js +1092 -0
  38. package/dist/chunk-NQJ47R4N.js.map +1 -0
  39. package/dist/chunk-NRC7XYCI.js +211 -0
  40. package/dist/chunk-NRC7XYCI.js.map +1 -0
  41. package/dist/{chunk-FJFEKPXF.js → chunk-O6ZTD7ZI.js} +14 -3
  42. package/dist/chunk-O6ZTD7ZI.js.map +1 -0
  43. package/dist/chunk-OBXAY23Y.js +56 -0
  44. package/dist/chunk-OBXAY23Y.js.map +1 -0
  45. package/dist/{chunk-XY3XDVMI.js → chunk-QR2EBWL2.js} +3 -3
  46. package/dist/{chunk-66UDJBF6.js → chunk-REJGRCVQ.js} +2 -2
  47. package/dist/{chunk-CBLPAMZO.js → chunk-TMED5DQ2.js} +68 -42
  48. package/dist/chunk-TMED5DQ2.js.map +1 -0
  49. package/dist/{chunk-Q3J43SF3.js → chunk-U7HFKR74.js} +2 -2
  50. package/dist/chunk-U7HFKR74.js.map +1 -0
  51. package/dist/{chunk-3EHUF54X.js → chunk-UEMRJI2K.js} +17 -4
  52. package/dist/chunk-UEMRJI2K.js.map +1 -0
  53. package/dist/{chunk-Z2CWURZ6.js → chunk-UNN7523L.js} +2 -2
  54. package/dist/chunk-V2ZIH7HV.js +29 -0
  55. package/dist/chunk-V2ZIH7HV.js.map +1 -0
  56. package/dist/{chunk-ZEI3ZUDU.js → chunk-VVYNZZUX.js} +7 -15
  57. package/dist/chunk-VVYNZZUX.js.map +1 -0
  58. package/dist/chunk-WXS4S3MA.js +220 -0
  59. package/dist/chunk-WXS4S3MA.js.map +1 -0
  60. package/dist/{chunk-A46TPNBJ.js → chunk-XENOESJZ.js} +7 -16
  61. package/dist/chunk-XENOESJZ.js.map +1 -0
  62. package/dist/chunk-YDBSSAJ6.js +4207 -0
  63. package/dist/chunk-YDBSSAJ6.js.map +1 -0
  64. package/dist/chunk-ZDREFYD2.js +696 -0
  65. package/dist/chunk-ZDREFYD2.js.map +1 -0
  66. package/dist/chunk-ZW2PELOH.js +197 -0
  67. package/dist/chunk-ZW2PELOH.js.map +1 -0
  68. package/dist/cli/defaults/agent-mappings.yaml +0 -1
  69. package/dist/commands/build/marketplace.js +15 -13
  70. package/dist/commands/build/marketplace.js.map +1 -1
  71. package/dist/commands/build/plugins.js +13 -229
  72. package/dist/commands/build/plugins.js.map +1 -1
  73. package/dist/commands/build/stack.js +11 -18
  74. package/dist/commands/build/stack.js.map +1 -1
  75. package/dist/commands/compile.js +36 -58
  76. package/dist/commands/compile.js.map +1 -1
  77. package/dist/commands/config/get.js +8 -8
  78. package/dist/commands/config/get.js.map +1 -1
  79. package/dist/commands/config/index.js +7 -7
  80. package/dist/commands/config/index.js.map +1 -1
  81. package/dist/commands/config/path.js +6 -6
  82. package/dist/commands/config/path.js.map +1 -1
  83. package/dist/commands/config/set-project.js +8 -8
  84. package/dist/commands/config/set-project.js.map +1 -1
  85. package/dist/commands/config/show.js +7 -7
  86. package/dist/commands/config/unset-project.js +8 -8
  87. package/dist/commands/config/unset-project.js.map +1 -1
  88. package/dist/commands/diff.js +10 -16
  89. package/dist/commands/diff.js.map +1 -1
  90. package/dist/commands/doctor.js +18 -51
  91. package/dist/commands/doctor.js.map +1 -1
  92. package/dist/commands/edit.js +87 -57
  93. package/dist/commands/edit.js.map +1 -1
  94. package/dist/commands/eject.js +17 -49
  95. package/dist/commands/eject.js.map +1 -1
  96. package/dist/commands/import/skill.js +26 -26
  97. package/dist/commands/import/skill.js.map +1 -1
  98. package/dist/commands/info.js +15 -17
  99. package/dist/commands/info.js.map +1 -1
  100. package/dist/commands/init.js +45 -722
  101. package/dist/commands/init.js.map +1 -1
  102. package/dist/commands/list.js +8 -87
  103. package/dist/commands/list.js.map +1 -1
  104. package/dist/commands/new/agent.js +8 -12
  105. package/dist/commands/new/agent.js.map +1 -1
  106. package/dist/commands/new/skill.js +6 -6
  107. package/dist/commands/new/skill.js.map +1 -1
  108. package/dist/commands/outdated.js +15 -19
  109. package/dist/commands/outdated.js.map +1 -1
  110. package/dist/commands/search.js +21 -34
  111. package/dist/commands/search.js.map +1 -1
  112. package/dist/commands/uninstall.js +15 -14
  113. package/dist/commands/uninstall.js.map +1 -1
  114. package/dist/commands/update.js +13 -24
  115. package/dist/commands/update.js.map +1 -1
  116. package/dist/commands/validate.js +44 -487
  117. package/dist/commands/validate.js.map +1 -1
  118. package/dist/commands/version/bump.js +11 -11
  119. package/dist/commands/version/bump.js.map +1 -1
  120. package/dist/commands/version/index.js +9 -10
  121. package/dist/commands/version/index.js.map +1 -1
  122. package/dist/commands/version/set.js +10 -8
  123. package/dist/commands/version/set.js.map +1 -1
  124. package/dist/commands/version/show.js +9 -10
  125. package/dist/commands/version/show.js.map +1 -1
  126. package/dist/components/common/confirm.js +2 -2
  127. package/dist/components/common/confirm.test.js +203 -0
  128. package/dist/components/common/confirm.test.js.map +1 -0
  129. package/dist/components/common/message.js +1 -1
  130. package/dist/components/common/spinner.js +1 -1
  131. package/dist/components/common/spinner.js.map +1 -1
  132. package/dist/components/skill-search/skill-search.js +3 -3
  133. package/dist/components/wizard/category-grid.js +2 -2
  134. package/dist/components/wizard/category-grid.test.js +132 -78
  135. package/dist/components/wizard/category-grid.test.js.map +1 -1
  136. package/dist/components/wizard/menu-item.js +2 -2
  137. package/dist/components/wizard/search-modal.js +9 -0
  138. package/dist/components/wizard/search-modal.js.map +1 -0
  139. package/dist/components/wizard/search-modal.test.js +216 -0
  140. package/dist/components/wizard/search-modal.test.js.map +1 -0
  141. package/dist/components/wizard/section-progress.js +2 -2
  142. package/dist/components/wizard/section-progress.test.js +4 -4
  143. package/dist/components/wizard/section-progress.test.js.map +1 -1
  144. package/dist/components/wizard/source-grid.js +10 -0
  145. package/dist/components/wizard/source-grid.js.map +1 -0
  146. package/dist/components/wizard/source-grid.test.js +500 -0
  147. package/dist/components/wizard/source-grid.test.js.map +1 -0
  148. package/dist/components/wizard/step-approach.js +7 -6
  149. package/dist/components/wizard/step-approach.test.js +115 -0
  150. package/dist/components/wizard/step-approach.test.js.map +1 -0
  151. package/dist/components/wizard/step-build.js +9 -4
  152. package/dist/components/wizard/step-build.test.js +103 -122
  153. package/dist/components/wizard/step-build.test.js.map +1 -1
  154. package/dist/components/wizard/step-confirm.js +3 -2
  155. package/dist/components/wizard/step-confirm.test.js +364 -0
  156. package/dist/components/wizard/step-confirm.test.js.map +1 -0
  157. package/dist/components/wizard/step-refine.js +2 -2
  158. package/dist/components/wizard/step-refine.test.js +19 -13
  159. package/dist/components/wizard/step-refine.test.js.map +1 -1
  160. package/dist/components/wizard/step-settings.js +14 -0
  161. package/dist/components/wizard/step-settings.js.map +1 -0
  162. package/dist/components/wizard/step-settings.test.js +240 -0
  163. package/dist/components/wizard/step-settings.test.js.map +1 -0
  164. package/dist/components/wizard/step-sources.js +17 -0
  165. package/dist/components/wizard/step-sources.js.map +1 -0
  166. package/dist/components/wizard/step-sources.test.js +290 -0
  167. package/dist/components/wizard/step-sources.test.js.map +1 -0
  168. package/dist/components/wizard/step-stack.js +7 -6
  169. package/dist/components/wizard/step-stack.test.js +344 -0
  170. package/dist/components/wizard/step-stack.test.js.map +1 -0
  171. package/dist/components/wizard/view-title.js +2 -2
  172. package/dist/components/wizard/wizard-layout.js +6 -5
  173. package/dist/components/wizard/wizard-tabs.js +2 -2
  174. package/dist/components/wizard/wizard-tabs.test.js +292 -0
  175. package/dist/components/wizard/wizard-tabs.test.js.map +1 -0
  176. package/dist/components/wizard/wizard.js +22 -14
  177. package/dist/config/skills-matrix.yaml +38 -37
  178. package/dist/config/stacks.yaml +8 -14
  179. package/dist/hooks/init.js +5 -5
  180. package/dist/hooks/init.js.map +1 -1
  181. package/dist/index.js +1 -1
  182. package/dist/index.js.map +1 -1
  183. package/dist/{magic-string.es-RGXYGAW3.js → magic-string.es-PAH2SOTR.js} +2 -2
  184. package/dist/source-manager-DSYZEVGZ.js +16 -0
  185. package/dist/source-manager-DSYZEVGZ.js.map +1 -0
  186. package/dist/src/agents/developer/api-developer/agent.yaml +1 -1
  187. package/dist/src/agents/developer/cli-developer/agent.yaml +1 -1
  188. package/dist/src/agents/developer/web-architecture/agent.yaml +1 -1
  189. package/dist/src/agents/developer/web-developer/agent.yaml +1 -1
  190. package/dist/src/agents/meta/agent-summoner/agent.yaml +1 -1
  191. package/dist/src/agents/meta/documentor/agent.yaml +1 -1
  192. package/dist/src/agents/meta/skill-summoner/agent.yaml +1 -1
  193. package/dist/src/agents/migration/cli-migrator/agent.yaml +1 -1
  194. package/dist/src/agents/pattern/pattern-scout/agent.yaml +1 -1
  195. package/dist/src/agents/pattern/web-pattern-critique/agent.yaml +1 -1
  196. package/dist/src/agents/planning/web-pm/agent.yaml +1 -1
  197. package/dist/src/agents/researcher/api-researcher/agent.yaml +1 -1
  198. package/dist/src/agents/researcher/web-researcher/agent.yaml +1 -1
  199. package/dist/src/agents/reviewer/api-reviewer/agent.yaml +1 -1
  200. package/dist/src/agents/reviewer/cli-reviewer/agent.yaml +1 -1
  201. package/dist/src/agents/reviewer/web-reviewer/agent.yaml +1 -1
  202. package/dist/src/agents/tester/cli-tester/agent.yaml +1 -1
  203. package/dist/src/agents/tester/web-tester/agent.yaml +1 -1
  204. package/dist/stores/wizard-store.js +4 -3
  205. package/dist/stores/wizard-store.test.js +51 -82
  206. package/dist/stores/wizard-store.test.js.map +1 -1
  207. package/package.json +5 -3
  208. package/src/agents/developer/api-developer/agent.yaml +1 -1
  209. package/src/agents/developer/cli-developer/agent.yaml +1 -1
  210. package/src/agents/developer/web-architecture/agent.yaml +1 -1
  211. package/src/agents/developer/web-developer/agent.yaml +1 -1
  212. package/src/agents/meta/agent-summoner/agent.yaml +1 -1
  213. package/src/agents/meta/documentor/agent.yaml +1 -1
  214. package/src/agents/meta/skill-summoner/agent.yaml +1 -1
  215. package/src/agents/migration/cli-migrator/agent.yaml +1 -1
  216. package/src/agents/pattern/pattern-scout/agent.yaml +1 -1
  217. package/src/agents/pattern/web-pattern-critique/agent.yaml +1 -1
  218. package/src/agents/planning/web-pm/agent.yaml +1 -1
  219. package/src/agents/researcher/api-researcher/agent.yaml +1 -1
  220. package/src/agents/researcher/web-researcher/agent.yaml +1 -1
  221. package/src/agents/reviewer/api-reviewer/agent.yaml +1 -1
  222. package/src/agents/reviewer/cli-reviewer/agent.yaml +1 -1
  223. package/src/agents/reviewer/web-reviewer/agent.yaml +1 -1
  224. package/src/agents/tester/cli-tester/agent.yaml +1 -1
  225. package/src/agents/tester/web-tester/agent.yaml +1 -1
  226. package/dist/chunk-2LSGX6R4.js.map +0 -1
  227. package/dist/chunk-2OKUEELH.js +0 -32
  228. package/dist/chunk-2OKUEELH.js.map +0 -1
  229. package/dist/chunk-374JNMR6.js +0 -212
  230. package/dist/chunk-374JNMR6.js.map +0 -1
  231. package/dist/chunk-3EHUF54X.js.map +0 -1
  232. package/dist/chunk-3XR4PALU.js +0 -529
  233. package/dist/chunk-3XR4PALU.js.map +0 -1
  234. package/dist/chunk-5K2ZLUO5.js +0 -57
  235. package/dist/chunk-5K2ZLUO5.js.map +0 -1
  236. package/dist/chunk-5KXUDHAB.js.map +0 -1
  237. package/dist/chunk-6Q3Y7KVB.js.map +0 -1
  238. package/dist/chunk-7SLV7CMF.js +0 -615
  239. package/dist/chunk-7SLV7CMF.js.map +0 -1
  240. package/dist/chunk-A46TPNBJ.js.map +0 -1
  241. package/dist/chunk-AL74GBW4.js +0 -69
  242. package/dist/chunk-AL74GBW4.js.map +0 -1
  243. package/dist/chunk-BQX23RBV.js +0 -191
  244. package/dist/chunk-BQX23RBV.js.map +0 -1
  245. package/dist/chunk-CA4LH4LI.js +0 -132
  246. package/dist/chunk-CA4LH4LI.js.map +0 -1
  247. package/dist/chunk-CBLPAMZO.js.map +0 -1
  248. package/dist/chunk-CKPQHGXR.js +0 -417
  249. package/dist/chunk-CKPQHGXR.js.map +0 -1
  250. package/dist/chunk-CXOFOJCN.js +0 -80
  251. package/dist/chunk-CXOFOJCN.js.map +0 -1
  252. package/dist/chunk-EHGD7HIE.js +0 -104
  253. package/dist/chunk-EHGD7HIE.js.map +0 -1
  254. package/dist/chunk-EHS3TWWP.js +0 -95
  255. package/dist/chunk-EHS3TWWP.js.map +0 -1
  256. package/dist/chunk-FJFEKPXF.js.map +0 -1
  257. package/dist/chunk-HEOHU5EZ.js.map +0 -1
  258. package/dist/chunk-HGCBZUH5.js.map +0 -1
  259. package/dist/chunk-HPGFY5ZN.js +0 -114
  260. package/dist/chunk-HPGFY5ZN.js.map +0 -1
  261. package/dist/chunk-INJ2EFRW.js +0 -127
  262. package/dist/chunk-INJ2EFRW.js.map +0 -1
  263. package/dist/chunk-IOBFMF6X.js +0 -61
  264. package/dist/chunk-IOBFMF6X.js.map +0 -1
  265. package/dist/chunk-KH3HA7J7.js +0 -116
  266. package/dist/chunk-KH3HA7J7.js.map +0 -1
  267. package/dist/chunk-N6JNE326.js +0 -261
  268. package/dist/chunk-N6JNE326.js.map +0 -1
  269. package/dist/chunk-NAGU7TVZ.js +0 -36
  270. package/dist/chunk-NAGU7TVZ.js.map +0 -1
  271. package/dist/chunk-OQYYMQJR.js.map +0 -1
  272. package/dist/chunk-PLZOUVDD.js +0 -419
  273. package/dist/chunk-PLZOUVDD.js.map +0 -1
  274. package/dist/chunk-Q3J43SF3.js.map +0 -1
  275. package/dist/chunk-RTE64SJA.js.map +0 -1
  276. package/dist/chunk-T25OEQFI.js +0 -26
  277. package/dist/chunk-T25OEQFI.js.map +0 -1
  278. package/dist/chunk-UMORK7OK.js.map +0 -1
  279. package/dist/chunk-VFHWU7JU.js +0 -287
  280. package/dist/chunk-VFHWU7JU.js.map +0 -1
  281. package/dist/chunk-VS4GVTZE.js +0 -91
  282. package/dist/chunk-VS4GVTZE.js.map +0 -1
  283. package/dist/chunk-WFEFICFM.js.map +0 -1
  284. package/dist/chunk-WG6KIAPK.js +0 -54
  285. package/dist/chunk-WG6KIAPK.js.map +0 -1
  286. package/dist/chunk-ZEI3ZUDU.js.map +0 -1
  287. package/dist/chunk-ZNIDWLL5.js.map +0 -1
  288. package/dist/chunk-ZSVMS677.js.map +0 -1
  289. /package/dist/{chunk-XY3XDVMI.js.map → chunk-QR2EBWL2.js.map} +0 -0
  290. /package/dist/{chunk-66UDJBF6.js.map → chunk-REJGRCVQ.js.map} +0 -0
  291. /package/dist/{chunk-Z2CWURZ6.js.map → chunk-UNN7523L.js.map} +0 -0
  292. /package/dist/{magic-string.es-RGXYGAW3.js.map → magic-string.es-PAH2SOTR.js.map} +0 -0
@@ -12,7 +12,7 @@ stacks:
12
12
  client-state: zustand
13
13
  server-state: react-query
14
14
  testing: vitest
15
- mocks: msw
15
+ mocking: msw
16
16
  accessibility: accessibility
17
17
  api-developer:
18
18
  api: hono
@@ -24,7 +24,7 @@ stacks:
24
24
  ci-cd: github-actions
25
25
  testing: api-testing
26
26
  cli-developer:
27
- cli: cli-commander
27
+ cli-framework: cli-commander
28
28
  web-reviewer:
29
29
  reviewing: reviewing
30
30
  api-reviewer:
@@ -32,8 +32,7 @@ stacks:
32
32
  cli-reviewer:
33
33
  reviewing: cli-reviewing
34
34
  web-tester:
35
- testing: vitest
36
- e2e: playwright-e2e
35
+ testing: playwright-e2e
37
36
  cli-tester: {}
38
37
  web-pm: {}
39
38
  skill-summoner: {}
@@ -75,8 +74,7 @@ stacks:
75
74
  skill-summoner: {}
76
75
  documentor: {}
77
76
  web-tester:
78
- testing: vitest
79
- e2e: playwright-e2e
77
+ testing: playwright-e2e
80
78
  philosophy: Enterprise-grade and type-safe
81
79
 
82
80
  - id: nuxt-stack
@@ -108,8 +106,7 @@ stacks:
108
106
  skill-summoner: {}
109
107
  documentor: {}
110
108
  web-tester:
111
- testing: vitest
112
- e2e: playwright-e2e
109
+ testing: playwright-e2e
113
110
  philosophy: Progressive Vue with Nuxt power
114
111
 
115
112
  - id: remix-stack
@@ -140,8 +137,7 @@ stacks:
140
137
  skill-summoner: {}
141
138
  documentor: {}
142
139
  web-tester:
143
- testing: vitest
144
- e2e: playwright-e2e
140
+ testing: playwright-e2e
145
141
  philosophy: Web standards and excellent forms handling
146
142
 
147
143
  - id: vue-stack
@@ -172,8 +168,7 @@ stacks:
172
168
  skill-summoner: {}
173
169
  documentor: {}
174
170
  web-tester:
175
- testing: vitest
176
- e2e: playwright-e2e
171
+ testing: playwright-e2e
177
172
  philosophy: Progressive and approachable
178
173
 
179
174
  - id: solidjs-stack
@@ -203,8 +198,7 @@ stacks:
203
198
  skill-summoner: {}
204
199
  documentor: {}
205
200
  web-tester:
206
- testing: vitest
207
- e2e: playwright-e2e
201
+ testing: playwright-e2e
208
202
  philosophy: Maximum performance with minimal overhead
209
203
 
210
204
  - id: react-native-stack
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  init_esm_shims
4
- } from "./chunk-DHET7RCE.js";
4
+ } from "./chunk-AWKZ5BDL.js";
5
5
 
6
6
  // src/cli/components/wizard/wizard-tabs.tsx
7
7
  init_esm_shims();
@@ -11,7 +11,8 @@ var WIZARD_STEPS = [
11
11
  { id: "approach", label: "Intro", number: 1 },
12
12
  { id: "stack", label: "Stack", number: 2 },
13
13
  { id: "build", label: "Build", number: 3 },
14
- { id: "confirm", label: "Confirm", number: 4 }
14
+ { id: "sources", label: "Sources", number: 4 },
15
+ { id: "confirm", label: "Confirm", number: 5 }
15
16
  ];
16
17
  var getStepState = (stepId, currentStep, completedSteps, skippedSteps) => {
17
18
  if (completedSteps.includes(stepId)) return "completed";
@@ -65,4 +66,4 @@ export {
65
66
  WIZARD_STEPS,
66
67
  WizardTabs
67
68
  };
68
- //# sourceMappingURL=chunk-ZNIDWLL5.js.map
69
+ //# sourceMappingURL=chunk-3X5D7RM5.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/components/wizard/wizard-tabs.tsx"],"sourcesContent":["import React from \"react\";\nimport { Box, Text } from \"ink\";\n\nexport type WizardTabStep = {\n id: string;\n label: string;\n number: number;\n};\n\nexport type WizardTabsProps = {\n steps: WizardTabStep[];\n currentStep: string;\n completedSteps: string[];\n skippedSteps?: string[];\n version?: string;\n};\n\nexport const WIZARD_STEPS: WizardTabStep[] = [\n { id: \"approach\", label: \"Intro\", number: 1 },\n { id: \"stack\", label: \"Stack\", number: 2 },\n { id: \"build\", label: \"Build\", number: 3 },\n { id: \"sources\", label: \"Sources\", number: 4 },\n { id: \"confirm\", label: \"Confirm\", number: 5 },\n];\n\ntype StepState = \"completed\" | \"current\" | \"pending\" | \"skipped\";\n\nconst getStepState = (\n stepId: string,\n currentStep: string,\n completedSteps: string[],\n skippedSteps: string[],\n): StepState => {\n if (completedSteps.includes(stepId)) return \"completed\";\n if (stepId === currentStep) return \"current\";\n if (skippedSteps.includes(stepId)) return \"skipped\";\n return \"pending\";\n};\n\ntype TabProps = {\n step: WizardTabStep;\n state: StepState;\n};\n\nconst Tab: React.FC<TabProps> = ({ step, state }) => {\n const label = `[${step.number}] ${step.label}`;\n\n switch (state) {\n case \"current\":\n return <Text color=\"cyan\">{label}</Text>;\n case \"completed\":\n return <Text>{label}</Text>;\n case \"skipped\":\n return <Text dimColor>{label}</Text>;\n case \"pending\":\n default:\n return <Text color=\"white\">{label}</Text>;\n }\n};\n\nexport const WizardTabs: React.FC<WizardTabsProps> = ({\n steps,\n currentStep,\n completedSteps,\n skippedSteps = [],\n version,\n}) => {\n return (\n <Box\n flexDirection=\"row\"\n columnGap={2}\n borderRight={false}\n borderLeft={false}\n borderColor=\"blackBright\"\n borderStyle=\"single\"\n paddingRight={1}\n >\n {steps.map((step) => {\n const state = getStepState(step.id, currentStep, completedSteps, skippedSteps);\n\n return <Tab key={step.id} step={step} state={state} />;\n })}\n <Box flexGrow={1} justifyContent=\"flex-end\">\n <Text dimColor>{`v${version}`}</Text>\n </Box>\n </Box>\n );\n};\n"],"mappings":";;;;;;AAAA;AACA,SAAS,KAAK,YAAY;AAgDb,cAmBT,YAnBS;AAhCN,IAAM,eAAgC;AAAA,EAC3C,EAAE,IAAI,YAAY,OAAO,SAAS,QAAQ,EAAE;AAAA,EAC5C,EAAE,IAAI,SAAS,OAAO,SAAS,QAAQ,EAAE;AAAA,EACzC,EAAE,IAAI,SAAS,OAAO,SAAS,QAAQ,EAAE;AAAA,EACzC,EAAE,IAAI,WAAW,OAAO,WAAW,QAAQ,EAAE;AAAA,EAC7C,EAAE,IAAI,WAAW,OAAO,WAAW,QAAQ,EAAE;AAC/C;AAIA,IAAM,eAAe,CACnB,QACA,aACA,gBACA,iBACc;AACd,MAAI,eAAe,SAAS,MAAM,EAAG,QAAO;AAC5C,MAAI,WAAW,YAAa,QAAO;AACnC,MAAI,aAAa,SAAS,MAAM,EAAG,QAAO;AAC1C,SAAO;AACT;AAOA,IAAM,MAA0B,CAAC,EAAE,MAAM,MAAM,MAAM;AACnD,QAAM,QAAQ,IAAI,KAAK,MAAM,KAAK,KAAK,KAAK;AAE5C,UAAQ,OAAO;AAAA,IACb,KAAK;AACH,aAAO,oBAAC,QAAK,OAAM,QAAQ,iBAAM;AAAA,IACnC,KAAK;AACH,aAAO,oBAAC,QAAM,iBAAM;AAAA,IACtB,KAAK;AACH,aAAO,oBAAC,QAAK,UAAQ,MAAE,iBAAM;AAAA,IAC/B,KAAK;AAAA,IACL;AACE,aAAO,oBAAC,QAAK,OAAM,SAAS,iBAAM;AAAA,EACtC;AACF;AAEO,IAAM,aAAwC,CAAC;AAAA,EACpD;AAAA,EACA;AAAA,EACA;AAAA,EACA,eAAe,CAAC;AAAA,EAChB;AACF,MAAM;AACJ,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAc;AAAA,MACd,WAAW;AAAA,MACX,aAAa;AAAA,MACb,YAAY;AAAA,MACZ,aAAY;AAAA,MACZ,aAAY;AAAA,MACZ,cAAc;AAAA,MAEb;AAAA,cAAM,IAAI,CAAC,SAAS;AACnB,gBAAM,QAAQ,aAAa,KAAK,IAAI,aAAa,gBAAgB,YAAY;AAE7E,iBAAO,oBAAC,OAAkB,MAAY,SAArB,KAAK,EAA8B;AAAA,QACtD,CAAC;AAAA,QACD,oBAAC,OAAI,UAAU,GAAG,gBAAe,YAC/B,8BAAC,QAAK,UAAQ,MAAE,cAAI,OAAO,IAAG,GAChC;AAAA;AAAA;AAAA,EACF;AAEJ;","names":[]}
@@ -0,0 +1,100 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ init_esm_shims
4
+ } from "./chunk-AWKZ5BDL.js";
5
+
6
+ // src/cli/components/wizard/search-modal.tsx
7
+ init_esm_shims();
8
+ import { useCallback, useState } from "react";
9
+ import { Box, Text, useInput } from "ink";
10
+ import { jsx, jsxs } from "react/jsx-runtime";
11
+ var MARKER_FOCUSED = "\u25B8";
12
+ var MARKER_SPACER = " ";
13
+ var ResultRow = ({ candidate, isFocused }) => {
14
+ const marker = isFocused ? MARKER_FOCUSED : MARKER_SPACER;
15
+ const versionLabel = candidate.version != null ? `v${candidate.version}` : "";
16
+ const sourceLabel = `${candidate.sourceName}/${candidate.id}`;
17
+ return /* @__PURE__ */ jsxs(Box, { children: [
18
+ /* @__PURE__ */ jsxs(Text, { bold: isFocused, color: isFocused ? "cyan" : void 0, children: [
19
+ marker,
20
+ " "
21
+ ] }),
22
+ /* @__PURE__ */ jsx(Text, { bold: isFocused, color: isFocused ? "cyan" : void 0, children: sourceLabel }),
23
+ versionLabel && /* @__PURE__ */ jsxs(Text, { dimColor: true, children: [
24
+ " ",
25
+ versionLabel
26
+ ] }),
27
+ candidate.description && /* @__PURE__ */ jsxs(Text, { dimColor: true, children: [
28
+ " ",
29
+ candidate.description
30
+ ] })
31
+ ] });
32
+ };
33
+ var SearchModal = ({ results, alias, onBind, onClose }) => {
34
+ const [focusedIndex, setFocusedIndex] = useState(0);
35
+ useInput(
36
+ useCallback(
37
+ (_input, key) => {
38
+ if (key.escape) {
39
+ onClose();
40
+ return;
41
+ }
42
+ if (key.return && results.length > 0) {
43
+ const selected = results[focusedIndex];
44
+ if (selected) {
45
+ onBind(selected);
46
+ }
47
+ return;
48
+ }
49
+ if (key.upArrow) {
50
+ setFocusedIndex((prev) => prev <= 0 ? results.length - 1 : prev - 1);
51
+ return;
52
+ }
53
+ if (key.downArrow) {
54
+ setFocusedIndex((prev) => prev >= results.length - 1 ? 0 : prev + 1);
55
+ return;
56
+ }
57
+ },
58
+ [results, focusedIndex, onBind, onClose]
59
+ )
60
+ );
61
+ return /* @__PURE__ */ jsxs(
62
+ Box,
63
+ {
64
+ flexDirection: "column",
65
+ borderStyle: "single",
66
+ borderColor: "gray",
67
+ paddingX: 1,
68
+ paddingY: 0,
69
+ marginTop: 1,
70
+ children: [
71
+ /* @__PURE__ */ jsxs(Text, { bold: true, children: [
72
+ 'Search results for "',
73
+ alias,
74
+ '"'
75
+ ] }),
76
+ /* @__PURE__ */ jsx(Text, { children: " " }),
77
+ results.length === 0 ? /* @__PURE__ */ jsx(Text, { dimColor: true, children: "No results found" }) : results.map((candidate, index) => /* @__PURE__ */ jsx(
78
+ ResultRow,
79
+ {
80
+ candidate,
81
+ isFocused: index === focusedIndex
82
+ },
83
+ `${candidate.sourceName}-${candidate.id}`
84
+ )),
85
+ /* @__PURE__ */ jsx(Text, { children: " " }),
86
+ /* @__PURE__ */ jsxs(Text, { dimColor: true, children: [
87
+ "\u2191",
88
+ "/",
89
+ "\u2193",
90
+ " navigate ENTER bind ESC close"
91
+ ] })
92
+ ]
93
+ }
94
+ );
95
+ };
96
+
97
+ export {
98
+ SearchModal
99
+ };
100
+ //# sourceMappingURL=chunk-4S4FCAA2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/components/wizard/search-modal.tsx"],"sourcesContent":["import React, { useCallback, useState } from \"react\";\nimport { Box, Text, useInput } from \"ink\";\nimport type { BoundSkillCandidate } from \"../../types/index.js\";\n\nexport type SearchModalProps = {\n results: BoundSkillCandidate[];\n alias: string;\n onBind: (candidate: BoundSkillCandidate) => void;\n onClose: () => void;\n};\n\nconst MARKER_FOCUSED = \"\\u25B8\";\nconst MARKER_SPACER = \" \";\n\ntype ResultRowProps = {\n candidate: BoundSkillCandidate;\n isFocused: boolean;\n};\n\nconst ResultRow: React.FC<ResultRowProps> = ({ candidate, isFocused }) => {\n const marker = isFocused ? MARKER_FOCUSED : MARKER_SPACER;\n const versionLabel = candidate.version != null ? `v${candidate.version}` : \"\";\n const sourceLabel = `${candidate.sourceName}/${candidate.id}`;\n\n return (\n <Box>\n <Text bold={isFocused} color={isFocused ? \"cyan\" : undefined}>\n {marker}{\" \"}\n </Text>\n <Text bold={isFocused} color={isFocused ? \"cyan\" : undefined}>\n {sourceLabel}\n </Text>\n {versionLabel && (\n <Text dimColor>\n {\" \"}\n {versionLabel}\n </Text>\n )}\n {candidate.description && (\n <Text dimColor>\n {\" \"}\n {candidate.description}\n </Text>\n )}\n </Box>\n );\n};\n\nexport const SearchModal: React.FC<SearchModalProps> = ({ results, alias, onBind, onClose }) => {\n const [focusedIndex, setFocusedIndex] = useState(0);\n\n useInput(\n useCallback(\n (\n _input: string,\n key: { upArrow: boolean; downArrow: boolean; return: boolean; escape: boolean },\n ) => {\n if (key.escape) {\n onClose();\n return;\n }\n\n if (key.return && results.length > 0) {\n const selected = results[focusedIndex];\n if (selected) {\n onBind(selected);\n }\n return;\n }\n\n if (key.upArrow) {\n setFocusedIndex((prev) => (prev <= 0 ? results.length - 1 : prev - 1));\n return;\n }\n\n if (key.downArrow) {\n setFocusedIndex((prev) => (prev >= results.length - 1 ? 0 : prev + 1));\n return;\n }\n },\n [results, focusedIndex, onBind, onClose],\n ),\n );\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"single\"\n borderColor=\"gray\"\n paddingX={1}\n paddingY={0}\n marginTop={1}\n >\n <Text bold>Search results for &quot;{alias}&quot;</Text>\n <Text> </Text>\n\n {results.length === 0 ? (\n <Text dimColor>No results found</Text>\n ) : (\n results.map((candidate, index) => (\n <ResultRow\n key={`${candidate.sourceName}-${candidate.id}`}\n candidate={candidate}\n isFocused={index === focusedIndex}\n />\n ))\n )}\n\n <Text> </Text>\n <Text dimColor>\n {\"\\u2191\"}/{\"\\u2193\"} navigate ENTER bind ESC close\n </Text>\n </Box>\n );\n};\n"],"mappings":";;;;;;AAAA;AAAA,SAAgB,aAAa,gBAAgB;AAC7C,SAAS,KAAK,MAAM,gBAAgB;AAyB9B,SAGA,KAHA;AAfN,IAAM,iBAAiB;AACvB,IAAM,gBAAgB;AAOtB,IAAM,YAAsC,CAAC,EAAE,WAAW,UAAU,MAAM;AACxE,QAAM,SAAS,YAAY,iBAAiB;AAC5C,QAAM,eAAe,UAAU,WAAW,OAAO,IAAI,UAAU,OAAO,KAAK;AAC3E,QAAM,cAAc,GAAG,UAAU,UAAU,IAAI,UAAU,EAAE;AAE3D,SACE,qBAAC,OACC;AAAA,yBAAC,QAAK,MAAM,WAAW,OAAO,YAAY,SAAS,QAChD;AAAA;AAAA,MAAQ;AAAA,OACX;AAAA,IACA,oBAAC,QAAK,MAAM,WAAW,OAAO,YAAY,SAAS,QAChD,uBACH;AAAA,IACC,gBACC,qBAAC,QAAK,UAAQ,MACX;AAAA;AAAA,MACA;AAAA,OACH;AAAA,IAED,UAAU,eACT,qBAAC,QAAK,UAAQ,MACX;AAAA;AAAA,MACA,UAAU;AAAA,OACb;AAAA,KAEJ;AAEJ;AAEO,IAAM,cAA0C,CAAC,EAAE,SAAS,OAAO,QAAQ,QAAQ,MAAM;AAC9F,QAAM,CAAC,cAAc,eAAe,IAAI,SAAS,CAAC;AAElD;AAAA,IACE;AAAA,MACE,CACE,QACA,QACG;AACH,YAAI,IAAI,QAAQ;AACd,kBAAQ;AACR;AAAA,QACF;AAEA,YAAI,IAAI,UAAU,QAAQ,SAAS,GAAG;AACpC,gBAAM,WAAW,QAAQ,YAAY;AACrC,cAAI,UAAU;AACZ,mBAAO,QAAQ;AAAA,UACjB;AACA;AAAA,QACF;AAEA,YAAI,IAAI,SAAS;AACf,0BAAgB,CAAC,SAAU,QAAQ,IAAI,QAAQ,SAAS,IAAI,OAAO,CAAE;AACrE;AAAA,QACF;AAEA,YAAI,IAAI,WAAW;AACjB,0BAAgB,CAAC,SAAU,QAAQ,QAAQ,SAAS,IAAI,IAAI,OAAO,CAAE;AACrE;AAAA,QACF;AAAA,MACF;AAAA,MACA,CAAC,SAAS,cAAc,QAAQ,OAAO;AAAA,IACzC;AAAA,EACF;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAc;AAAA,MACd,aAAY;AAAA,MACZ,aAAY;AAAA,MACZ,UAAU;AAAA,MACV,UAAU;AAAA,MACV,WAAW;AAAA,MAEX;AAAA,6BAAC,QAAK,MAAI,MAAC;AAAA;AAAA,UAA0B;AAAA,UAAM;AAAA,WAAM;AAAA,QACjD,oBAAC,QAAK,eAAC;AAAA,QAEN,QAAQ,WAAW,IAClB,oBAAC,QAAK,UAAQ,MAAC,8BAAgB,IAE/B,QAAQ,IAAI,CAAC,WAAW,UACtB;AAAA,UAAC;AAAA;AAAA,YAEC;AAAA,YACA,WAAW,UAAU;AAAA;AAAA,UAFhB,GAAG,UAAU,UAAU,IAAI,UAAU,EAAE;AAAA,QAG9C,CACD;AAAA,QAGH,oBAAC,QAAK,eAAC;AAAA,QACP,qBAAC,QAAK,UAAQ,MACX;AAAA;AAAA,UAAS;AAAA,UAAE;AAAA,UAAS;AAAA,WACvB;AAAA;AAAA;AAAA,EACF;AAEJ;","names":[]}
@@ -0,0 +1,197 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ ViewTitle
4
+ } from "./chunk-U7HFKR74.js";
5
+ import {
6
+ DEFAULT_SOURCE,
7
+ addSource,
8
+ getSourceSummary,
9
+ removeSource
10
+ } from "./chunk-YDBSSAJ6.js";
11
+ import {
12
+ init_esm_shims
13
+ } from "./chunk-AWKZ5BDL.js";
14
+
15
+ // src/cli/components/wizard/step-settings.tsx
16
+ init_esm_shims();
17
+ import { useState, useEffect, useCallback } from "react";
18
+ import { Box, Text, useInput } from "ink";
19
+ import { jsx, jsxs } from "react/jsx-runtime";
20
+ var DEFAULT_SOURCE_NAME = "public";
21
+ var MIN_PRINTABLE_CHAR_CODE = 32;
22
+ var MAX_PRINTABLE_CHAR_CODE = 126;
23
+ var StepSettings = ({ projectDir, onClose }) => {
24
+ const [summary, setSummary] = useState(null);
25
+ const [focusedIndex, setFocusedIndex] = useState(0);
26
+ const [isAddingSource, setIsAddingSource] = useState(false);
27
+ const [addSourceInput, setAddSourceInput] = useState("");
28
+ const [statusMessage, setStatusMessage] = useState(null);
29
+ const [isLoading, setIsLoading] = useState(true);
30
+ const loadSummary = useCallback(async () => {
31
+ try {
32
+ const result = await getSourceSummary(projectDir);
33
+ setSummary(result);
34
+ } catch {
35
+ setSummary({
36
+ sources: [{ name: DEFAULT_SOURCE_NAME, url: DEFAULT_SOURCE, enabled: true }],
37
+ localSkillCount: 0,
38
+ pluginSkillCount: 0
39
+ });
40
+ }
41
+ setIsLoading(false);
42
+ }, [projectDir]);
43
+ useEffect(() => {
44
+ void loadSummary();
45
+ }, [loadSummary]);
46
+ const sourceCount = summary?.sources.length ?? 0;
47
+ useInput((input, key) => {
48
+ if (statusMessage) {
49
+ setStatusMessage(null);
50
+ }
51
+ if (isAddingSource) {
52
+ if (key.escape) {
53
+ setIsAddingSource(false);
54
+ setAddSourceInput("");
55
+ return;
56
+ }
57
+ if (key.return) {
58
+ if (addSourceInput.trim()) {
59
+ void handleAddSource(addSourceInput.trim());
60
+ }
61
+ return;
62
+ }
63
+ if (key.backspace || key.delete) {
64
+ setAddSourceInput((prev) => prev.slice(0, -1));
65
+ return;
66
+ }
67
+ if (input && input.length === 1) {
68
+ const code = input.charCodeAt(0);
69
+ if (code >= MIN_PRINTABLE_CHAR_CODE && code <= MAX_PRINTABLE_CHAR_CODE) {
70
+ setAddSourceInput((prev) => prev + input);
71
+ }
72
+ }
73
+ return;
74
+ }
75
+ if (key.escape) {
76
+ onClose();
77
+ return;
78
+ }
79
+ if (key.upArrow) {
80
+ setFocusedIndex((prev) => Math.max(0, prev - 1));
81
+ return;
82
+ }
83
+ if (key.downArrow) {
84
+ setFocusedIndex((prev) => Math.min(sourceCount - 1, prev - 0 + 1));
85
+ return;
86
+ }
87
+ if (key.return) {
88
+ return;
89
+ }
90
+ if (key.backspace || key.delete) {
91
+ if (summary && summary.sources[focusedIndex]) {
92
+ const source = summary.sources[focusedIndex];
93
+ if (source.name !== DEFAULT_SOURCE_NAME) {
94
+ void handleRemoveSource(source.name);
95
+ }
96
+ }
97
+ return;
98
+ }
99
+ if (input === "a" || input === "A") {
100
+ setIsAddingSource(true);
101
+ setAddSourceInput("");
102
+ return;
103
+ }
104
+ });
105
+ const handleAddSource = async (url) => {
106
+ setIsAddingSource(false);
107
+ setAddSourceInput("");
108
+ try {
109
+ const result = await addSource(projectDir, url);
110
+ setStatusMessage({
111
+ text: `Added "${result.name}" (${result.skillCount} skills)`,
112
+ color: "green"
113
+ });
114
+ await loadSummary();
115
+ } catch (error) {
116
+ const message = error instanceof Error ? error.message : String(error);
117
+ setStatusMessage({ text: `Failed to add source: ${message}`, color: "red" });
118
+ }
119
+ };
120
+ const handleRemoveSource = async (name) => {
121
+ try {
122
+ await removeSource(projectDir, name);
123
+ setStatusMessage({ text: `Removed "${name}"`, color: "green" });
124
+ setFocusedIndex((prev) => Math.max(0, prev - 1));
125
+ await loadSummary();
126
+ } catch (error) {
127
+ const message = error instanceof Error ? error.message : String(error);
128
+ setStatusMessage({ text: `Failed to remove: ${message}`, color: "red" });
129
+ }
130
+ };
131
+ if (isLoading) {
132
+ return /* @__PURE__ */ jsxs(Box, { flexDirection: "column", paddingX: 2, children: [
133
+ /* @__PURE__ */ jsx(ViewTitle, { children: "Skill Sources" }),
134
+ /* @__PURE__ */ jsx(Text, { dimColor: true, children: "Loading sources..." })
135
+ ] });
136
+ }
137
+ return /* @__PURE__ */ jsxs(Box, { flexDirection: "column", paddingX: 2, children: [
138
+ /* @__PURE__ */ jsx(ViewTitle, { children: "Skill Sources" }),
139
+ /* @__PURE__ */ jsx(Box, { marginTop: 1 }),
140
+ /* @__PURE__ */ jsx(Text, { bold: true, children: "Configured marketplaces:" }),
141
+ /* @__PURE__ */ jsx(Box, { flexDirection: "column", borderStyle: "round", borderColor: "gray", paddingX: 1, marginTop: 1, children: summary?.sources.map((source, index) => {
142
+ const isFocused = index === focusedIndex && !isAddingSource;
143
+ const isDefault = source.name === DEFAULT_SOURCE_NAME;
144
+ const checkmark = source.enabled ? "\u2713" : " ";
145
+ const displayName = isDefault ? "Public" : source.name;
146
+ const suffix = isDefault ? " (default)" : "";
147
+ return /* @__PURE__ */ jsxs(Box, { children: [
148
+ /* @__PURE__ */ jsxs(Text, { color: isFocused ? "cyan" : void 0, bold: isFocused, children: [
149
+ isFocused ? ">" : " ",
150
+ " ",
151
+ checkmark,
152
+ " ",
153
+ displayName
154
+ ] }),
155
+ /* @__PURE__ */ jsxs(Text, { dimColor: true, children: [
156
+ " ",
157
+ source.url,
158
+ suffix
159
+ ] })
160
+ ] }, source.name);
161
+ }) }),
162
+ /* @__PURE__ */ jsx(
163
+ Box,
164
+ {
165
+ flexDirection: "column",
166
+ borderStyle: "round",
167
+ borderColor: isAddingSource ? "cyan" : "gray",
168
+ paddingX: 1,
169
+ marginTop: 1,
170
+ children: /* @__PURE__ */ jsxs(Text, { color: isAddingSource ? "cyan" : void 0, children: [
171
+ "+ Add source: ",
172
+ isAddingSource ? addSourceInput : "",
173
+ isAddingSource ? "\u2588" : ""
174
+ ] })
175
+ }
176
+ ),
177
+ statusMessage && /* @__PURE__ */ jsx(Box, { marginTop: 1, children: /* @__PURE__ */ jsx(Text, { color: statusMessage.color, children: statusMessage.text }) }),
178
+ /* @__PURE__ */ jsxs(Box, { marginTop: 1, flexDirection: "column", children: [
179
+ /* @__PURE__ */ jsxs(Text, { dimColor: true, children: [
180
+ "Local skills: ",
181
+ summary?.localSkillCount ?? 0,
182
+ " in .claude/skills/"
183
+ ] }),
184
+ /* @__PURE__ */ jsxs(Text, { dimColor: true, children: [
185
+ "Plugins: ",
186
+ summary?.pluginSkillCount ?? 0,
187
+ " in .claude/plugins/"
188
+ ] })
189
+ ] }),
190
+ /* @__PURE__ */ jsx(Box, { marginTop: 1, children: /* @__PURE__ */ jsx(Text, { dimColor: true, children: isAddingSource ? "ENTER submit ESC cancel" : "A add DEL remove ESC close" }) })
191
+ ] });
192
+ };
193
+
194
+ export {
195
+ StepSettings
196
+ };
197
+ //# sourceMappingURL=chunk-4WGN6SUE.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/components/wizard/step-settings.tsx"],"sourcesContent":["import React, { useState, useEffect, useCallback } from \"react\";\nimport { Box, Text, useInput } from \"ink\";\nimport { ViewTitle } from \"./view-title.js\";\nimport { getSourceSummary, type SourceSummary } from \"../../lib/configuration/source-manager.js\";\nimport { addSource, removeSource } from \"../../lib/configuration/source-manager.js\";\nimport { DEFAULT_SOURCE } from \"../../lib/configuration/config.js\";\n\nconst DEFAULT_SOURCE_NAME = \"public\";\nconst MIN_PRINTABLE_CHAR_CODE = 32;\nconst MAX_PRINTABLE_CHAR_CODE = 126;\n\nexport type StepSettingsProps = {\n projectDir: string;\n onClose: () => void;\n};\n\nexport const StepSettings: React.FC<StepSettingsProps> = ({ projectDir, onClose }) => {\n const [summary, setSummary] = useState<SourceSummary | null>(null);\n const [focusedIndex, setFocusedIndex] = useState(0);\n const [isAddingSource, setIsAddingSource] = useState(false);\n const [addSourceInput, setAddSourceInput] = useState(\"\");\n const [statusMessage, setStatusMessage] = useState<{ text: string; color: string } | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n\n const loadSummary = useCallback(async () => {\n try {\n const result = await getSourceSummary(projectDir);\n setSummary(result);\n } catch {\n setSummary({\n sources: [{ name: DEFAULT_SOURCE_NAME, url: DEFAULT_SOURCE, enabled: true }],\n localSkillCount: 0,\n pluginSkillCount: 0,\n });\n }\n setIsLoading(false);\n }, [projectDir]);\n\n useEffect(() => {\n void loadSummary();\n }, [loadSummary]);\n\n const sourceCount = summary?.sources.length ?? 0;\n\n useInput((input, key) => {\n // Clear status message on any input\n if (statusMessage) {\n setStatusMessage(null);\n }\n\n if (isAddingSource) {\n if (key.escape) {\n setIsAddingSource(false);\n setAddSourceInput(\"\");\n return;\n }\n\n if (key.return) {\n if (addSourceInput.trim()) {\n void handleAddSource(addSourceInput.trim());\n }\n return;\n }\n\n if (key.backspace || key.delete) {\n setAddSourceInput((prev) => prev.slice(0, -1));\n return;\n }\n\n // Capture printable characters\n if (input && input.length === 1) {\n const code = input.charCodeAt(0);\n if (code >= MIN_PRINTABLE_CHAR_CODE && code <= MAX_PRINTABLE_CHAR_CODE) {\n setAddSourceInput((prev) => prev + input);\n }\n }\n return;\n }\n\n // Non-adding mode keyboard handling\n if (key.escape) {\n onClose();\n return;\n }\n\n if (key.upArrow) {\n setFocusedIndex((prev) => Math.max(0, prev - 1));\n return;\n }\n\n if (key.downArrow) {\n setFocusedIndex((prev) => Math.min(sourceCount - 1, prev - 0 + 1));\n return;\n }\n\n if (key.return) {\n // Toggle enabled/disabled is a placeholder for future enabledSources store integration\n return;\n }\n\n if (key.backspace || key.delete) {\n if (summary && summary.sources[focusedIndex]) {\n const source = summary.sources[focusedIndex];\n if (source.name !== DEFAULT_SOURCE_NAME) {\n void handleRemoveSource(source.name);\n }\n }\n return;\n }\n\n if (input === \"a\" || input === \"A\") {\n setIsAddingSource(true);\n setAddSourceInput(\"\");\n return;\n }\n });\n\n const handleAddSource = async (url: string) => {\n setIsAddingSource(false);\n setAddSourceInput(\"\");\n try {\n const result = await addSource(projectDir, url);\n setStatusMessage({\n text: `Added \"${result.name}\" (${result.skillCount} skills)`,\n color: \"green\",\n });\n await loadSummary();\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n setStatusMessage({ text: `Failed to add source: ${message}`, color: \"red\" });\n }\n };\n\n const handleRemoveSource = async (name: string) => {\n try {\n await removeSource(projectDir, name);\n setStatusMessage({ text: `Removed \"${name}\"`, color: \"green\" });\n setFocusedIndex((prev) => Math.max(0, prev - 1));\n await loadSummary();\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n setStatusMessage({ text: `Failed to remove: ${message}`, color: \"red\" });\n }\n };\n\n if (isLoading) {\n return (\n <Box flexDirection=\"column\" paddingX={2}>\n <ViewTitle>Skill Sources</ViewTitle>\n <Text dimColor>Loading sources...</Text>\n </Box>\n );\n }\n\n return (\n <Box flexDirection=\"column\" paddingX={2}>\n <ViewTitle>Skill Sources</ViewTitle>\n <Box marginTop={1} />\n\n <Text bold>Configured marketplaces:</Text>\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor=\"gray\" paddingX={1} marginTop={1}>\n {summary?.sources.map((source, index) => {\n const isFocused = index === focusedIndex && !isAddingSource;\n const isDefault = source.name === DEFAULT_SOURCE_NAME;\n const checkmark = source.enabled ? \"\\u2713\" : \" \";\n const displayName = isDefault ? \"Public\" : source.name;\n const suffix = isDefault ? \" (default)\" : \"\";\n\n return (\n <Box key={source.name}>\n <Text color={isFocused ? \"cyan\" : undefined} bold={isFocused}>\n {isFocused ? \">\" : \" \"} {checkmark} {displayName}\n </Text>\n <Text dimColor>\n {\" \"}\n {source.url}\n {suffix}\n </Text>\n </Box>\n );\n })}\n </Box>\n\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={isAddingSource ? \"cyan\" : \"gray\"}\n paddingX={1}\n marginTop={1}\n >\n <Text color={isAddingSource ? \"cyan\" : undefined}>\n + Add source: {isAddingSource ? addSourceInput : \"\"}\n {isAddingSource ? \"\\u2588\" : \"\"}\n </Text>\n </Box>\n\n {statusMessage && (\n <Box marginTop={1}>\n <Text color={statusMessage.color as \"red\" | \"green\"}>{statusMessage.text}</Text>\n </Box>\n )}\n\n <Box marginTop={1} flexDirection=\"column\">\n <Text dimColor>Local skills: {summary?.localSkillCount ?? 0} in .claude/skills/</Text>\n <Text dimColor>Plugins: {summary?.pluginSkillCount ?? 0} in .claude/plugins/</Text>\n </Box>\n\n <Box marginTop={1}>\n <Text dimColor>\n {isAddingSource ? \"ENTER submit ESC cancel\" : \"A add DEL remove ESC close\"}\n </Text>\n </Box>\n </Box>\n );\n};\n"],"mappings":"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","names":[]}
@@ -5,10 +5,16 @@ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
5
  var __getOwnPropNames = Object.getOwnPropertyNames;
6
6
  var __getProtoOf = Object.getPrototypeOf;
7
7
  var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
9
+ get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
10
+ }) : x)(function(x) {
11
+ if (typeof require !== "undefined") return require.apply(this, arguments);
12
+ throw Error('Dynamic require of "' + x + '" is not supported');
13
+ });
8
14
  var __esm = (fn, res) => function __init() {
9
15
  return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
10
16
  };
11
- var __commonJS = (cb, mod) => function __require() {
17
+ var __commonJS = (cb, mod) => function __require2() {
12
18
  return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
13
19
  };
14
20
  var __export = (target, all) => {
@@ -42,9 +48,10 @@ var init_esm_shims = __esm({
42
48
  });
43
49
 
44
50
  export {
51
+ __require,
45
52
  __commonJS,
46
53
  __export,
47
54
  __toESM,
48
55
  init_esm_shims
49
56
  };
50
- //# sourceMappingURL=chunk-DHET7RCE.js.map
57
+ //# sourceMappingURL=chunk-AWKZ5BDL.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../node_modules/tsup/assets/esm_shims.js"],"sourcesContent":["// Shim globals in esm bundle\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nconst getFilename = () => fileURLToPath(import.meta.url)\nconst getDirname = () => path.dirname(getFilename())\n\nexport const __dirname = /* @__PURE__ */ getDirname()\nexport const __filename = /* @__PURE__ */ getFilename()\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,OAAO,UAAU;AACjB,SAAS,qBAAqB;AAF9B;AAAA;AAAA;AAAA;AAAA;","names":[]}
1
+ {"version":3,"sources":["../node_modules/tsup/assets/esm_shims.js"],"sourcesContent":["// Shim globals in esm bundle\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nconst getFilename = () => fileURLToPath(import.meta.url)\nconst getDirname = () => path.dirname(getFilename())\n\nexport const __dirname = /* @__PURE__ */ getDirname()\nexport const __filename = /* @__PURE__ */ getFilename()\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,OAAO,UAAU;AACjB,SAAS,qBAAqB;AAF9B;AAAA;AAAA;AAAA;AAAA;","names":[]}
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  init_esm_shims
4
- } from "./chunk-DHET7RCE.js";
4
+ } from "./chunk-AWKZ5BDL.js";
5
5
 
6
6
  // src/cli/lib/__tests__/test-constants.ts
7
7
  init_esm_shims();
@@ -12,6 +12,9 @@ var ARROW_RIGHT = "\x1B[C";
12
12
  var ENTER = "\r";
13
13
  var ESCAPE = "\x1B";
14
14
  var TAB = " ";
15
+ var SPACE = " ";
16
+ var KEY_Y = "y";
17
+ var KEY_N = "n";
15
18
  var INPUT_DELAY_MS = 50;
16
19
  var RENDER_DELAY_MS = 100;
17
20
  var delay = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
@@ -24,8 +27,11 @@ export {
24
27
  ENTER,
25
28
  ESCAPE,
26
29
  TAB,
30
+ SPACE,
31
+ KEY_Y,
32
+ KEY_N,
27
33
  INPUT_DELAY_MS,
28
34
  RENDER_DELAY_MS,
29
35
  delay
30
36
  };
31
- //# sourceMappingURL=chunk-6Q3Y7KVB.js.map
37
+ //# sourceMappingURL=chunk-DBRUQQUF.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/lib/__tests__/test-constants.ts"],"sourcesContent":["// Keyboard escape sequences\nexport const ARROW_UP = \"\\x1B[A\";\nexport const ARROW_DOWN = \"\\x1B[B\";\nexport const ARROW_LEFT = \"\\x1B[D\";\nexport const ARROW_RIGHT = \"\\x1B[C\";\nexport const ENTER = \"\\r\";\nexport const ESCAPE = \"\\x1B\";\nexport const CTRL_C = \"\\x03\";\nexport const TAB = \"\\t\";\nexport const SPACE = \" \";\nexport const BACKSPACE = \"\\x7F\";\nexport const KEY_Y = \"y\";\nexport const KEY_N = \"n\";\n\n// Timing constants (ms)\nexport const INPUT_DELAY_MS = 50;\nexport const RENDER_DELAY_MS = 100;\nexport const OPERATION_DELAY_MS = 150;\n\nexport const delay = (ms: number): Promise<void> =>\n new Promise((resolve) => setTimeout(resolve, ms));\n"],"mappings":";;;;;;AAAA;AACO,IAAM,WAAW;AACjB,IAAM,aAAa;AACnB,IAAM,aAAa;AACnB,IAAM,cAAc;AACpB,IAAM,QAAQ;AACd,IAAM,SAAS;AAEf,IAAM,MAAM;AACZ,IAAM,QAAQ;AAEd,IAAM,QAAQ;AACd,IAAM,QAAQ;AAGd,IAAM,iBAAiB;AACvB,IAAM,kBAAkB;AAGxB,IAAM,QAAQ,CAAC,OACpB,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,EAAE,CAAC;","names":[]}
@@ -1,12 +1,13 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  init_esm_shims
4
- } from "./chunk-DHET7RCE.js";
4
+ } from "./chunk-AWKZ5BDL.js";
5
5
 
6
6
  // src/cli/components/wizard/category-grid.tsx
7
7
  init_esm_shims();
8
8
  import { useCallback, useEffect } from "react";
9
9
  import { Box, Text, useInput } from "ink";
10
+ import { sortBy } from "remeda";
10
11
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
11
12
  var SYMBOL_REQUIRED = "*";
12
13
  var FRAMEWORK_CATEGORY_ID = "framework";
@@ -20,9 +21,7 @@ var sortOptions = (options, expertMode) => {
20
21
  discouraged: 2,
21
22
  disabled: 3
22
23
  };
23
- return [...options].sort((a, b) => {
24
- return stateOrder[a.state] - stateOrder[b.state];
25
- });
24
+ return sortBy([...options], (o) => stateOrder[o.state]);
26
25
  };
27
26
  var findNextValidOption = (options, currentIndex, direction, wrap = true) => {
28
27
  const length = options.length;
@@ -58,11 +57,8 @@ var isSectionLocked = (categoryId, categories) => {
58
57
  return false;
59
58
  }
60
59
  const frameworkCategory = categories.find((cat) => cat.id === FRAMEWORK_CATEGORY_ID);
61
- if (!frameworkCategory) {
62
- return false;
63
- }
64
- const hasFrameworkSelected = frameworkCategory.options.some((opt) => opt.selected);
65
- return !hasFrameworkSelected;
60
+ if (!frameworkCategory) return false;
61
+ return !frameworkCategory.options.some((opt) => opt.selected);
66
62
  };
67
63
  var findNextUnlockedSection = (categories, currentIndex, direction, allCategories) => {
68
64
  const length = categories.length;
@@ -125,6 +121,7 @@ var SkillTag = ({ option, isFocused, isLocked }) => {
125
121
  /* @__PURE__ */ jsx(Text, { backgroundColor: "gray", children: " L " }),
126
122
  " "
127
123
  ] }),
124
+ option.installed && /* @__PURE__ */ jsx(Text, { dimColor: true, children: "\u2713 " }),
128
125
  option.label,
129
126
  " "
130
127
  ] })
@@ -141,7 +138,7 @@ var CategorySection = ({
141
138
  }) => {
142
139
  return /* @__PURE__ */ jsxs(Box, { flexDirection: "column", marginTop: 1, children: [
143
140
  /* @__PURE__ */ jsxs(Box, { flexDirection: "row", children: [
144
- /* @__PURE__ */ jsx(Text, { dimColor: isLocked, children: category.name }),
141
+ /* @__PURE__ */ jsx(Text, { dimColor: isLocked, children: category.displayName }),
145
142
  category.required && /* @__PURE__ */ jsxs(Text, { color: isLocked ? "gray" : "red", dimColor: isLocked, children: [
146
143
  " ",
147
144
  SYMBOL_REQUIRED
@@ -300,4 +297,4 @@ var CategoryGrid = ({
300
297
  export {
301
298
  CategoryGrid
302
299
  };
303
- //# sourceMappingURL=chunk-OQYYMQJR.js.map
300
+ //# sourceMappingURL=chunk-ETCVEV3S.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/components/wizard/category-grid.tsx"],"sourcesContent":["import React, { useCallback, useEffect } from \"react\";\nimport { Box, Text, useInput } from \"ink\";\nimport { sortBy } from \"remeda\";\nimport type { SkillId, Subcategory } from \"../../types/index.js\";\n\nexport type OptionState = \"normal\" | \"recommended\" | \"discouraged\" | \"disabled\";\n\nexport type CategoryOption = {\n id: SkillId;\n label: string;\n state: OptionState;\n stateReason?: string;\n selected: boolean;\n local?: boolean;\n installed?: boolean;\n};\n\nexport type CategoryRow = {\n id: Subcategory;\n displayName: string;\n required: boolean;\n exclusive: boolean;\n options: CategoryOption[];\n};\n\nexport type CategoryGridProps = {\n categories: CategoryRow[];\n focusedRow: number;\n focusedCol: number;\n showDescriptions: boolean;\n expertMode: boolean;\n onToggle: (categoryId: Subcategory, technologyId: SkillId) => void;\n onFocusChange: (row: number, col: number) => void;\n onToggleDescriptions: () => void;\n};\n\nconst SYMBOL_REQUIRED = \"*\";\nconst BG_SELECTED = \"cyan\";\nconst BG_FOCUSED = \"#333\";\nconst FRAMEWORK_CATEGORY_ID = \"framework\";\n\n// Recommended first, discouraged last. Expert mode preserves original order.\nconst sortOptions = (options: CategoryOption[], expertMode: boolean): CategoryOption[] => {\n if (expertMode) {\n return options;\n }\n\n const stateOrder: Record<OptionState, number> = {\n recommended: 0,\n normal: 1,\n discouraged: 2,\n disabled: 3,\n };\n\n return sortBy([...options], (o) => stateOrder[o.state]);\n};\n\nconst findNextValidOption = (\n options: CategoryOption[],\n currentIndex: number,\n direction: 1 | -1,\n wrap: boolean = true,\n): number => {\n const length = options.length;\n if (length === 0) return currentIndex;\n\n let index = currentIndex;\n let attempts = 0;\n\n while (attempts < length) {\n index += direction;\n\n if (wrap) {\n // Wrap around\n if (index < 0) index = length - 1;\n if (index >= length) index = 0;\n } else {\n // Clamp to bounds\n if (index < 0) index = 0;\n if (index >= length) index = length - 1;\n }\n\n if (options[index] && options[index].state !== \"disabled\") {\n return index;\n }\n\n attempts++;\n }\n\n // All options are disabled, return current\n return currentIndex;\n};\n\nconst findValidStartColumn = (options: CategoryOption[]): number => {\n for (let i = 0; i < options.length; i++) {\n if (options[i] && options[i].state !== \"disabled\") {\n return i;\n }\n }\n return 0;\n};\n\n// Locked = non-framework section when no framework is selected\nconst isSectionLocked = (categoryId: Subcategory, categories: CategoryRow[]): boolean => {\n if (categoryId === FRAMEWORK_CATEGORY_ID) {\n return false;\n }\n\n const frameworkCategory = categories.find((cat) => cat.id === FRAMEWORK_CATEGORY_ID);\n if (!frameworkCategory) return false;\n\n return !frameworkCategory.options.some((opt) => opt.selected);\n};\n\nconst findNextUnlockedSection = (\n categories: { id: Subcategory; sortedOptions: CategoryOption[] }[],\n currentIndex: number,\n direction: 1 | -1,\n allCategories: CategoryRow[],\n): number => {\n const length = categories.length;\n if (length === 0) return currentIndex;\n\n let index = currentIndex;\n let attempts = 0;\n\n while (attempts < length) {\n index += direction;\n\n if (index < 0) index = length - 1;\n if (index >= length) index = 0;\n\n const category = categories[index];\n if (category && !isSectionLocked(category.id, allCategories)) {\n return index;\n }\n\n attempts++;\n }\n\n return currentIndex;\n};\n\ntype SkillTagProps = {\n option: CategoryOption;\n isFocused: boolean;\n isLocked: boolean;\n};\n\nconst SkillTag: React.FC<SkillTagProps> = ({ option, isFocused, isLocked }) => {\n const getColor = (): { text: string; border: string } | undefined => {\n if (isLocked || option.state === \"disabled\") {\n return {\n text: \"gray\",\n border: \"gray\",\n };\n }\n if (option.selected) {\n return {\n text: \"cyan\",\n border: \"cyan\",\n };\n }\n if (option.state === \"recommended\") {\n return {\n text: \"white\",\n border: \"gray\",\n };\n }\n if (option.state === \"discouraged\") {\n return {\n text: \"yellow\",\n border: \"yellow\",\n };\n }\n return undefined;\n };\n\n const isBold = isFocused || option.selected;\n const isDimmed = isLocked || option.state === \"disabled\";\n const focusBorderColor = option.selected ? \"cyan\" : \"white\";\n\n return (\n <Box\n marginRight={1}\n borderColor={isFocused ? focusBorderColor : getColor()?.border}\n borderStyle=\"single\"\n borderDimColor={isDimmed}\n >\n <Text color={getColor()?.text} bold={isBold} dimColor={false}>\n {\" \"}\n {option.local && (\n <>\n <Text backgroundColor=\"gray\"> L </Text>{\" \"}\n </>\n )}\n {option.installed && <Text dimColor>✓ </Text>}\n {option.label}{\" \"}\n </Text>\n </Box>\n );\n};\n\ntype CategorySectionProps = {\n category: CategoryRow;\n options: CategoryOption[];\n isLocked: boolean;\n isFocused: boolean;\n focusedOptionIndex: number;\n showDescriptions: boolean;\n};\n\nconst CategorySection: React.FC<CategorySectionProps> = ({\n category,\n options,\n isLocked,\n isFocused,\n focusedOptionIndex,\n showDescriptions,\n}) => {\n return (\n <Box flexDirection=\"column\" marginTop={1}>\n <Box flexDirection=\"row\">\n <Text dimColor={isLocked}>{category.displayName}</Text>\n {category.required && (\n <Text color={isLocked ? \"gray\" : \"red\"} dimColor={isLocked}>\n {\" \"}\n {SYMBOL_REQUIRED}\n </Text>\n )}\n </Box>\n\n <Box flexDirection=\"row\" flexWrap=\"wrap\" marginTop={0}>\n {options.map((option, index) => (\n <Box key={option.id} flexDirection=\"column\">\n <SkillTag\n option={option}\n isFocused={isFocused && index === focusedOptionIndex && !isLocked}\n isLocked={isLocked}\n />\n {showDescriptions && option.stateReason && !isLocked && (\n <Box marginLeft={1} marginBottom={0}>\n <Text dimColor wrap=\"truncate-end\">\n {option.stateReason}\n </Text>\n </Box>\n )}\n </Box>\n ))}\n </Box>\n </Box>\n );\n};\n\nexport const CategoryGrid: React.FC<CategoryGridProps> = ({\n categories,\n focusedRow,\n focusedCol,\n showDescriptions,\n expertMode,\n onToggle,\n onFocusChange,\n onToggleDescriptions,\n}) => {\n const processedCategories = categories.map((category) => ({\n ...category,\n sortedOptions: sortOptions(category.options, expertMode),\n }));\n\n const currentRow = processedCategories[focusedRow];\n const currentOptions = currentRow?.sortedOptions || [];\n const currentLocked = currentRow ? isSectionLocked(currentRow.id, categories) : false;\n\n useEffect(() => {\n if (!currentRow) return;\n\n const maxCol = currentOptions.length - 1;\n if (focusedCol > maxCol) {\n const newCol = Math.max(0, maxCol);\n onFocusChange(focusedRow, newCol);\n } else if (currentOptions[focusedCol]?.state === \"disabled\") {\n const validCol = findValidStartColumn(currentOptions);\n if (validCol !== focusedCol) {\n onFocusChange(focusedRow, validCol);\n }\n }\n }, [focusedRow, currentOptions, focusedCol, onFocusChange, currentRow]);\n\n useEffect(() => {\n if (currentRow && currentLocked) {\n const unlockedIndex = findNextUnlockedSection(processedCategories, focusedRow, 1, categories);\n if (unlockedIndex !== focusedRow) {\n const newRowOptions = processedCategories[unlockedIndex]?.sortedOptions || [];\n const newCol = findValidStartColumn(newRowOptions);\n onFocusChange(unlockedIndex, newCol);\n }\n }\n }, [currentRow, currentLocked, focusedRow, processedCategories, categories, onFocusChange]);\n\n useInput(\n useCallback(\n (\n input: string,\n key: {\n leftArrow: boolean;\n rightArrow: boolean;\n upArrow: boolean;\n downArrow: boolean;\n tab: boolean;\n shift: boolean;\n },\n ) => {\n if (key.tab && key.shift) {\n onToggleDescriptions();\n return;\n }\n\n if (key.tab && !key.shift) {\n const nextSection = findNextUnlockedSection(\n processedCategories,\n focusedRow,\n 1,\n categories,\n );\n if (nextSection !== focusedRow) {\n const newRowOptions = processedCategories[nextSection]?.sortedOptions || [];\n const newCol = findValidStartColumn(newRowOptions);\n onFocusChange(nextSection, newCol);\n }\n return;\n }\n\n if (input === \"d\" || input === \"D\") {\n onToggleDescriptions();\n return;\n }\n\n if (input === \" \") {\n if (currentLocked) return;\n const currentOption = currentOptions[focusedCol];\n if (currentOption && currentOption.state !== \"disabled\") {\n onToggle(currentRow.id, currentOption.id);\n }\n return;\n }\n\n const isLeft = key.leftArrow || input === \"h\";\n const isRight = key.rightArrow || input === \"l\";\n const isUp = key.upArrow || input === \"k\";\n const isDown = key.downArrow || input === \"j\";\n\n if (isLeft) {\n if (currentLocked) return;\n const newCol = findNextValidOption(currentOptions, focusedCol, -1, true);\n onFocusChange(focusedRow, newCol);\n } else if (isRight) {\n if (currentLocked) return;\n const newCol = findNextValidOption(currentOptions, focusedCol, 1, true);\n onFocusChange(focusedRow, newCol);\n } else if (isUp) {\n const newRow = findNextUnlockedSection(processedCategories, focusedRow, -1, categories);\n const newRowOptions = processedCategories[newRow]?.sortedOptions || [];\n let newCol = Math.min(focusedCol, newRowOptions.length - 1);\n if (newRowOptions[newCol]?.state === \"disabled\") {\n newCol = findValidStartColumn(newRowOptions);\n }\n onFocusChange(newRow, newCol);\n } else if (isDown) {\n const newRow = findNextUnlockedSection(processedCategories, focusedRow, 1, categories);\n const newRowOptions = processedCategories[newRow]?.sortedOptions || [];\n let newCol = Math.min(focusedCol, newRowOptions.length - 1);\n if (newRowOptions[newCol]?.state === \"disabled\") {\n newCol = findValidStartColumn(newRowOptions);\n }\n onFocusChange(newRow, newCol);\n }\n },\n [\n focusedRow,\n focusedCol,\n currentOptions,\n currentRow,\n currentLocked,\n processedCategories,\n categories,\n onToggle,\n onFocusChange,\n onToggleDescriptions,\n ],\n ),\n );\n\n if (categories.length === 0) {\n return (\n <Box flexDirection=\"column\">\n <Text dimColor>No categories to display.</Text>\n </Box>\n );\n }\n\n return (\n <Box flexDirection=\"column\">\n {processedCategories.map((category, rowIndex) => {\n const isLocked = isSectionLocked(category.id, categories);\n\n return (\n <CategorySection\n key={category.id}\n category={category}\n options={category.sortedOptions}\n isLocked={isLocked}\n isFocused={rowIndex === focusedRow}\n focusedOptionIndex={focusedCol}\n showDescriptions={showDescriptions}\n />\n );\n })}\n </Box>\n );\n};\n"],"mappings":"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","names":[]}
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  init_esm_shims
4
- } from "./chunk-DHET7RCE.js";
4
+ } from "./chunk-AWKZ5BDL.js";
5
5
 
6
6
  // src/cli/components/wizard/section-progress.tsx
7
7
  init_esm_shims();
@@ -42,4 +42,4 @@ var SectionProgress = ({
42
42
  export {
43
43
  SectionProgress
44
44
  };
45
- //# sourceMappingURL=chunk-ZSVMS677.js.map
45
+ //# sourceMappingURL=chunk-F4RD5FYM.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/components/wizard/section-progress.tsx"],"sourcesContent":["import React from \"react\";\nimport { Box, Text } from \"ink\";\n\nexport type SectionProgressProps = {\n label: string;\n current: string;\n /** 1-based */\n index: number;\n total: number;\n next?: string;\n};\n\nexport const SectionProgress: React.FC<SectionProgressProps> = ({\n label,\n current,\n index,\n total,\n next,\n}) => {\n const isLast = index === total;\n const rightText = isLast ? \"Last step\" : `Next: ${next}`;\n\n return (\n <Box flexDirection=\"row\" justifyContent=\"space-between\" marginBottom={1}>\n <Text>\n <Text bold>{label}:</Text> <Text color=\"cyan\">{current}</Text>\n </Text>\n <Text>\n <Text dimColor>\n [{index}/{total}]\n </Text>{\" \"}\n <Text dimColor={isLast}>{rightText}</Text>\n </Text>\n </Box>\n );\n};\n"],"mappings":";;;;;;AAAA;AACA,SAAS,KAAK,YAAY;AAwBlB,SAA2B,KAA3B;AAbD,IAAM,kBAAkD,CAAC;AAAA,EAC9D;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,SAAS,UAAU;AACzB,QAAM,YAAY,SAAS,cAAc,SAAS,IAAI;AAEtD,SACE,qBAAC,OAAI,eAAc,OAAM,gBAAe,iBAAgB,cAAc,GACpE;AAAA,yBAAC,QACC;AAAA,2BAAC,QAAK,MAAI,MAAE;AAAA;AAAA,QAAM;AAAA,SAAC;AAAA,MAAO;AAAA,MAAC,oBAAC,QAAK,OAAM,QAAQ,mBAAQ;AAAA,OACzD;AAAA,IACA,qBAAC,QACC;AAAA,2BAAC,QAAK,UAAQ,MAAC;AAAA;AAAA,QACX;AAAA,QAAM;AAAA,QAAE;AAAA,QAAM;AAAA,SAClB;AAAA,MAAQ;AAAA,MACR,oBAAC,QAAK,UAAU,QAAS,qBAAU;AAAA,OACrC;AAAA,KACF;AAEJ;","names":[]}