@claude-collective/cli 0.21.0 → 0.26.0

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 (294) hide show
  1. package/CHANGELOG.md +192 -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-4357L7VK.js +251 -0
  8. package/dist/chunk-4357L7VK.js.map +1 -0
  9. package/dist/chunk-4S4FCAA2.js +100 -0
  10. package/dist/chunk-4S4FCAA2.js.map +1 -0
  11. package/dist/chunk-7UPXT32F.js +197 -0
  12. package/dist/chunk-7UPXT32F.js.map +1 -0
  13. package/dist/{chunk-DHET7RCE.js → chunk-AWKZ5BDL.js} +9 -2
  14. package/dist/{chunk-DHET7RCE.js.map → chunk-AWKZ5BDL.js.map} +1 -1
  15. package/dist/{chunk-6Q3Y7KVB.js → chunk-DBRUQQUF.js} +8 -2
  16. package/dist/chunk-DBRUQQUF.js.map +1 -0
  17. package/dist/{chunk-OQYYMQJR.js → chunk-ETCVEV3S.js} +8 -11
  18. package/dist/chunk-ETCVEV3S.js.map +1 -0
  19. package/dist/chunk-ETQ3BPGU.js +4204 -0
  20. package/dist/chunk-ETQ3BPGU.js.map +1 -0
  21. package/dist/{chunk-ZSVMS677.js → chunk-F4RD5FYM.js} +2 -2
  22. package/dist/chunk-F4RD5FYM.js.map +1 -0
  23. package/dist/{chunk-5KXUDHAB.js → chunk-GGFOD5PK.js} +6 -9
  24. package/dist/chunk-GGFOD5PK.js.map +1 -0
  25. package/dist/{chunk-UMORK7OK.js → chunk-H7SSBSPR.js} +2 -2
  26. package/dist/chunk-H7SSBSPR.js.map +1 -0
  27. package/dist/chunk-HWD32NP7.js +19 -0
  28. package/dist/chunk-HWD32NP7.js.map +1 -0
  29. package/dist/{chunk-HGCBZUH5.js → chunk-I3YYG5IO.js} +9 -10
  30. package/dist/chunk-I3YYG5IO.js.map +1 -0
  31. package/dist/{chunk-RTE64SJA.js → chunk-IXBCRT3F.js} +2 -2
  32. package/dist/chunk-IXBCRT3F.js.map +1 -0
  33. package/dist/{chunk-WFEFICFM.js → chunk-KWYO3M5Q.js} +5 -5
  34. package/dist/chunk-KWYO3M5Q.js.map +1 -0
  35. package/dist/{chunk-HEOHU5EZ.js → chunk-MCTSHLAF.js} +22 -11
  36. package/dist/chunk-MCTSHLAF.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-FJFEKPXF.js → chunk-O6ZTD7ZI.js} +14 -3
  40. package/dist/chunk-O6ZTD7ZI.js.map +1 -0
  41. package/dist/chunk-OBXAY23Y.js +56 -0
  42. package/dist/chunk-OBXAY23Y.js.map +1 -0
  43. package/dist/{chunk-XY3XDVMI.js → chunk-QR2EBWL2.js} +3 -3
  44. package/dist/chunk-R5KJVI54.js +311 -0
  45. package/dist/chunk-R5KJVI54.js.map +1 -0
  46. package/dist/{chunk-2LSGX6R4.js → chunk-R7B63JAP.js} +83 -25
  47. package/dist/chunk-R7B63JAP.js.map +1 -0
  48. package/dist/{chunk-66UDJBF6.js → chunk-REJGRCVQ.js} +2 -2
  49. package/dist/chunk-TDZE4TDG.js +220 -0
  50. package/dist/chunk-TDZE4TDG.js.map +1 -0
  51. package/dist/{chunk-CBLPAMZO.js → chunk-TMED5DQ2.js} +68 -42
  52. package/dist/chunk-TMED5DQ2.js.map +1 -0
  53. package/dist/{chunk-Q3J43SF3.js → chunk-U7HFKR74.js} +2 -2
  54. package/dist/chunk-U7HFKR74.js.map +1 -0
  55. package/dist/{chunk-3EHUF54X.js → chunk-UEMRJI2K.js} +17 -4
  56. package/dist/chunk-UEMRJI2K.js.map +1 -0
  57. package/dist/{chunk-Z2CWURZ6.js → chunk-UNN7523L.js} +2 -2
  58. package/dist/chunk-V2ZIH7HV.js +29 -0
  59. package/dist/chunk-V2ZIH7HV.js.map +1 -0
  60. package/dist/{chunk-ZEI3ZUDU.js → chunk-VVYNZZUX.js} +7 -15
  61. package/dist/chunk-VVYNZZUX.js.map +1 -0
  62. package/dist/{chunk-A46TPNBJ.js → chunk-XENOESJZ.js} +7 -16
  63. package/dist/chunk-XENOESJZ.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 +22 -21
  70. package/dist/commands/build/marketplace.js.map +1 -1
  71. package/dist/commands/build/plugins.js +35 -231
  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 +112 -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 +103 -727
  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-EYO3F2DV.js +16 -0
  185. package/dist/source-manager-EYO3F2DV.js.map +1 -0
  186. package/dist/src/agents/_templates/agent.liquid +1 -1
  187. package/dist/src/agents/developer/api-developer/agent.yaml +1 -1
  188. package/dist/src/agents/developer/cli-developer/agent.yaml +1 -1
  189. package/dist/src/agents/developer/web-architecture/agent.yaml +1 -1
  190. package/dist/src/agents/developer/web-developer/agent.yaml +1 -1
  191. package/dist/src/agents/meta/agent-summoner/agent.yaml +1 -1
  192. package/dist/src/agents/meta/documentor/agent.yaml +1 -1
  193. package/dist/src/agents/meta/skill-summoner/agent.yaml +1 -1
  194. package/dist/src/agents/migration/cli-migrator/agent.yaml +1 -1
  195. package/dist/src/agents/pattern/pattern-scout/agent.yaml +1 -1
  196. package/dist/src/agents/pattern/web-pattern-critique/agent.yaml +1 -1
  197. package/dist/src/agents/planning/web-pm/agent.yaml +1 -1
  198. package/dist/src/agents/researcher/api-researcher/agent.yaml +1 -1
  199. package/dist/src/agents/researcher/web-researcher/agent.yaml +1 -1
  200. package/dist/src/agents/reviewer/api-reviewer/agent.yaml +1 -1
  201. package/dist/src/agents/reviewer/cli-reviewer/agent.yaml +1 -1
  202. package/dist/src/agents/reviewer/web-reviewer/agent.yaml +1 -1
  203. package/dist/src/agents/tester/cli-tester/agent.yaml +1 -1
  204. package/dist/src/agents/tester/web-tester/agent.yaml +1 -1
  205. package/dist/stores/wizard-store.js +4 -3
  206. package/dist/stores/wizard-store.test.js +51 -82
  207. package/dist/stores/wizard-store.test.js.map +1 -1
  208. package/package.json +5 -3
  209. package/src/agents/_templates/agent.liquid +1 -1
  210. package/src/agents/developer/api-developer/agent.yaml +1 -1
  211. package/src/agents/developer/cli-developer/agent.yaml +1 -1
  212. package/src/agents/developer/web-architecture/agent.yaml +1 -1
  213. package/src/agents/developer/web-developer/agent.yaml +1 -1
  214. package/src/agents/meta/agent-summoner/agent.yaml +1 -1
  215. package/src/agents/meta/documentor/agent.yaml +1 -1
  216. package/src/agents/meta/skill-summoner/agent.yaml +1 -1
  217. package/src/agents/migration/cli-migrator/agent.yaml +1 -1
  218. package/src/agents/pattern/pattern-scout/agent.yaml +1 -1
  219. package/src/agents/pattern/web-pattern-critique/agent.yaml +1 -1
  220. package/src/agents/planning/web-pm/agent.yaml +1 -1
  221. package/src/agents/researcher/api-researcher/agent.yaml +1 -1
  222. package/src/agents/researcher/web-researcher/agent.yaml +1 -1
  223. package/src/agents/reviewer/api-reviewer/agent.yaml +1 -1
  224. package/src/agents/reviewer/cli-reviewer/agent.yaml +1 -1
  225. package/src/agents/reviewer/web-reviewer/agent.yaml +1 -1
  226. package/src/agents/tester/cli-tester/agent.yaml +1 -1
  227. package/src/agents/tester/web-tester/agent.yaml +1 -1
  228. package/dist/chunk-2LSGX6R4.js.map +0 -1
  229. package/dist/chunk-2OKUEELH.js +0 -32
  230. package/dist/chunk-2OKUEELH.js.map +0 -1
  231. package/dist/chunk-374JNMR6.js +0 -212
  232. package/dist/chunk-374JNMR6.js.map +0 -1
  233. package/dist/chunk-3EHUF54X.js.map +0 -1
  234. package/dist/chunk-3XR4PALU.js +0 -529
  235. package/dist/chunk-3XR4PALU.js.map +0 -1
  236. package/dist/chunk-5K2ZLUO5.js +0 -57
  237. package/dist/chunk-5K2ZLUO5.js.map +0 -1
  238. package/dist/chunk-5KXUDHAB.js.map +0 -1
  239. package/dist/chunk-6Q3Y7KVB.js.map +0 -1
  240. package/dist/chunk-7SLV7CMF.js +0 -615
  241. package/dist/chunk-7SLV7CMF.js.map +0 -1
  242. package/dist/chunk-A46TPNBJ.js.map +0 -1
  243. package/dist/chunk-AL74GBW4.js +0 -69
  244. package/dist/chunk-AL74GBW4.js.map +0 -1
  245. package/dist/chunk-BQX23RBV.js +0 -191
  246. package/dist/chunk-BQX23RBV.js.map +0 -1
  247. package/dist/chunk-CA4LH4LI.js +0 -132
  248. package/dist/chunk-CA4LH4LI.js.map +0 -1
  249. package/dist/chunk-CBLPAMZO.js.map +0 -1
  250. package/dist/chunk-CKPQHGXR.js +0 -417
  251. package/dist/chunk-CKPQHGXR.js.map +0 -1
  252. package/dist/chunk-CXOFOJCN.js +0 -80
  253. package/dist/chunk-CXOFOJCN.js.map +0 -1
  254. package/dist/chunk-EHGD7HIE.js +0 -104
  255. package/dist/chunk-EHGD7HIE.js.map +0 -1
  256. package/dist/chunk-EHS3TWWP.js +0 -95
  257. package/dist/chunk-EHS3TWWP.js.map +0 -1
  258. package/dist/chunk-FJFEKPXF.js.map +0 -1
  259. package/dist/chunk-HEOHU5EZ.js.map +0 -1
  260. package/dist/chunk-HGCBZUH5.js.map +0 -1
  261. package/dist/chunk-HPGFY5ZN.js +0 -114
  262. package/dist/chunk-HPGFY5ZN.js.map +0 -1
  263. package/dist/chunk-INJ2EFRW.js +0 -127
  264. package/dist/chunk-INJ2EFRW.js.map +0 -1
  265. package/dist/chunk-IOBFMF6X.js +0 -61
  266. package/dist/chunk-IOBFMF6X.js.map +0 -1
  267. package/dist/chunk-KH3HA7J7.js +0 -116
  268. package/dist/chunk-KH3HA7J7.js.map +0 -1
  269. package/dist/chunk-N6JNE326.js +0 -261
  270. package/dist/chunk-N6JNE326.js.map +0 -1
  271. package/dist/chunk-NAGU7TVZ.js +0 -36
  272. package/dist/chunk-NAGU7TVZ.js.map +0 -1
  273. package/dist/chunk-OQYYMQJR.js.map +0 -1
  274. package/dist/chunk-PLZOUVDD.js +0 -419
  275. package/dist/chunk-PLZOUVDD.js.map +0 -1
  276. package/dist/chunk-Q3J43SF3.js.map +0 -1
  277. package/dist/chunk-RTE64SJA.js.map +0 -1
  278. package/dist/chunk-T25OEQFI.js +0 -26
  279. package/dist/chunk-T25OEQFI.js.map +0 -1
  280. package/dist/chunk-UMORK7OK.js.map +0 -1
  281. package/dist/chunk-VFHWU7JU.js +0 -287
  282. package/dist/chunk-VFHWU7JU.js.map +0 -1
  283. package/dist/chunk-VS4GVTZE.js +0 -91
  284. package/dist/chunk-VS4GVTZE.js.map +0 -1
  285. package/dist/chunk-WFEFICFM.js.map +0 -1
  286. package/dist/chunk-WG6KIAPK.js +0 -54
  287. package/dist/chunk-WG6KIAPK.js.map +0 -1
  288. package/dist/chunk-ZEI3ZUDU.js.map +0 -1
  289. package/dist/chunk-ZNIDWLL5.js.map +0 -1
  290. package/dist/chunk-ZSVMS677.js.map +0 -1
  291. /package/dist/{chunk-XY3XDVMI.js.map → chunk-QR2EBWL2.js.map} +0 -0
  292. /package/dist/{chunk-66UDJBF6.js.map → chunk-REJGRCVQ.js.map} +0 -0
  293. /package/dist/{chunk-Z2CWURZ6.js.map → chunk-UNN7523L.js.map} +0 -0
  294. /package/dist/{magic-string.es-RGXYGAW3.js.map → magic-string.es-PAH2SOTR.js.map} +0 -0
@@ -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-ETQ3BPGU.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-7UPXT32F.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":[]}