@agents-inc/cli 0.60.1 → 0.64.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 (212) hide show
  1. package/CHANGELOG.md +48 -0
  2. package/README.md +23 -172
  3. package/dist/{chunk-G6WHCALR.js → chunk-3YNT3NX3.js} +13 -11
  4. package/dist/chunk-3YNT3NX3.js.map +1 -0
  5. package/dist/{chunk-WF6RM73R.js → chunk-4C7CSZC5.js} +27 -149
  6. package/dist/chunk-4C7CSZC5.js.map +1 -0
  7. package/dist/{chunk-EMIUPGPL.js → chunk-4KVBH2X4.js} +33 -14
  8. package/dist/chunk-4KVBH2X4.js.map +1 -0
  9. package/dist/{chunk-KIWFEBKH.js → chunk-52THXN5G.js} +14 -5
  10. package/dist/chunk-52THXN5G.js.map +1 -0
  11. package/dist/{chunk-TZXYBG3R.js → chunk-53URJ5XK.js} +448 -153
  12. package/dist/chunk-53URJ5XK.js.map +1 -0
  13. package/dist/{chunk-MKCHLXMY.js → chunk-6DEK3TDF.js} +10 -10
  14. package/dist/chunk-6DEK3TDF.js.map +1 -0
  15. package/dist/{chunk-SDKCQXWE.js → chunk-6IK2TCK7.js} +13 -6
  16. package/dist/chunk-6IK2TCK7.js.map +1 -0
  17. package/dist/chunk-6VIOO74O.js +51 -0
  18. package/dist/chunk-6VIOO74O.js.map +1 -0
  19. package/dist/{chunk-52XO4ULK.js → chunk-7DI3HGKL.js} +32 -14
  20. package/dist/chunk-7DI3HGKL.js.map +1 -0
  21. package/dist/{chunk-MGNYPVOJ.js → chunk-AQYAVLZK.js} +2 -2
  22. package/dist/{chunk-BNQ5O6LE.js → chunk-AUNBGZS4.js} +2 -2
  23. package/dist/chunk-BGPGQF35.js +248 -0
  24. package/dist/chunk-BGPGQF35.js.map +1 -0
  25. package/dist/chunk-BKL3DF2Q.js +45 -0
  26. package/dist/chunk-BKL3DF2Q.js.map +1 -0
  27. package/dist/{chunk-AX3SZZWA.js → chunk-BKTPEATV.js} +13 -6
  28. package/dist/chunk-BKTPEATV.js.map +1 -0
  29. package/dist/{chunk-H7WJK7NJ.js → chunk-CKPJTMNC.js} +13 -6
  30. package/dist/chunk-CKPJTMNC.js.map +1 -0
  31. package/dist/{chunk-MR6OBL3B.js → chunk-CXRVM7BA.js} +2 -4
  32. package/dist/chunk-CXRVM7BA.js.map +1 -0
  33. package/dist/{chunk-VR3CDXDT.js → chunk-EE5EPS32.js} +2 -2
  34. package/dist/{chunk-6OWHQ7HM.js → chunk-EGMQ3SXN.js} +2 -11
  35. package/dist/{chunk-6OWHQ7HM.js.map → chunk-EGMQ3SXN.js.map} +1 -1
  36. package/dist/{chunk-BMJZBLP7.js → chunk-EZ35IPXZ.js} +10 -7
  37. package/dist/chunk-EZ35IPXZ.js.map +1 -0
  38. package/dist/{chunk-OCEFD7V6.js → chunk-F3REOP7N.js} +3 -3
  39. package/dist/{chunk-C577AJE7.js → chunk-FGLUQSVU.js} +3 -3
  40. package/dist/{chunk-SEJF7CGJ.js → chunk-J4POGAJF.js} +24 -24
  41. package/dist/chunk-J4POGAJF.js.map +1 -0
  42. package/dist/{chunk-O6BA7Q2B.js → chunk-KFDTVSIC.js} +18 -8
  43. package/dist/chunk-KFDTVSIC.js.map +1 -0
  44. package/dist/{chunk-LWXRUR6B.js → chunk-LMZXL5RQ.js} +2 -2
  45. package/dist/{chunk-LWXRUR6B.js.map → chunk-LMZXL5RQ.js.map} +1 -1
  46. package/dist/{chunk-7FMEMXJ4.js → chunk-MOMI77PL.js} +100 -59
  47. package/dist/chunk-MOMI77PL.js.map +1 -0
  48. package/dist/{chunk-BFD5NZQ4.js → chunk-MVYJVKVT.js} +19 -11
  49. package/dist/chunk-MVYJVKVT.js.map +1 -0
  50. package/dist/{chunk-X5EG4EFP.js → chunk-MWGDG4QN.js} +2 -2
  51. package/dist/{chunk-TGLRDEEL.js → chunk-O2HK3NTG.js} +10 -6
  52. package/dist/chunk-O2HK3NTG.js.map +1 -0
  53. package/dist/{chunk-6G3KZSO4.js → chunk-OORWBS6F.js} +45 -52
  54. package/dist/chunk-OORWBS6F.js.map +1 -0
  55. package/dist/{chunk-CIG7IKX3.js → chunk-OV5UJWS5.js} +4 -4
  56. package/dist/{chunk-RO6LX3UV.js → chunk-R46CB36B.js} +5 -5
  57. package/dist/{chunk-52M2XF3W.js → chunk-RG3KDXMR.js} +16 -8
  58. package/dist/chunk-RG3KDXMR.js.map +1 -0
  59. package/dist/{chunk-MMFQNJPE.js → chunk-SXGBPQY6.js} +3 -3
  60. package/dist/chunk-SXGBPQY6.js.map +1 -0
  61. package/dist/{chunk-XUDTFI4M.js → chunk-T5DJCIUP.js} +2 -2
  62. package/dist/{chunk-AJJJE7F7.js → chunk-TQLDQ3XZ.js} +2 -2
  63. package/dist/{chunk-SZRK3VOR.js → chunk-WSMQ5GAP.js} +33 -21
  64. package/dist/chunk-WSMQ5GAP.js.map +1 -0
  65. package/dist/{chunk-WYVDNGJB.js → chunk-XMLCXRTS.js} +3 -3
  66. package/dist/{chunk-K6OLORQL.js → chunk-YEGPTBX5.js} +4 -4
  67. package/dist/{chunk-YHCYKUA3.js → chunk-ZFY5EMDV.js} +5 -5
  68. package/dist/{chunk-BKJHAJQW.js → chunk-ZYUASJUN.js} +7 -4
  69. package/dist/chunk-ZYUASJUN.js.map +1 -0
  70. package/dist/commands/build/marketplace.js +4 -4
  71. package/dist/commands/build/plugins.js +7 -6
  72. package/dist/commands/build/plugins.js.map +1 -1
  73. package/dist/commands/build/stack.js +7 -6
  74. package/dist/commands/build/stack.js.map +1 -1
  75. package/dist/commands/compile.js +79 -138
  76. package/dist/commands/compile.js.map +1 -1
  77. package/dist/commands/config/index.js +7 -6
  78. package/dist/commands/config/index.js.map +1 -1
  79. package/dist/commands/config/path.js +6 -5
  80. package/dist/commands/config/path.js.map +1 -1
  81. package/dist/commands/config/show.js +7 -6
  82. package/dist/commands/diff.js +6 -5
  83. package/dist/commands/diff.js.map +1 -1
  84. package/dist/commands/doctor.js +11 -15
  85. package/dist/commands/doctor.js.map +1 -1
  86. package/dist/commands/edit.js +63 -69
  87. package/dist/commands/edit.js.map +1 -1
  88. package/dist/commands/eject.js +13 -13
  89. package/dist/commands/eject.js.map +1 -1
  90. package/dist/commands/import/skill.js +7 -6
  91. package/dist/commands/import/skill.js.map +1 -1
  92. package/dist/commands/info.js +14 -16
  93. package/dist/commands/info.js.map +1 -1
  94. package/dist/commands/init.js +32 -30
  95. package/dist/commands/list.js +6 -5
  96. package/dist/commands/list.js.map +1 -1
  97. package/dist/commands/new/agent.js +7 -6
  98. package/dist/commands/new/agent.js.map +1 -1
  99. package/dist/commands/new/marketplace.js +28 -11
  100. package/dist/commands/new/marketplace.js.map +1 -1
  101. package/dist/commands/new/skill.js +7 -6
  102. package/dist/commands/outdated.js +6 -5
  103. package/dist/commands/outdated.js.map +1 -1
  104. package/dist/commands/search.js +13 -11
  105. package/dist/commands/search.js.map +1 -1
  106. package/dist/commands/uninstall.js +9 -10
  107. package/dist/commands/uninstall.js.map +1 -1
  108. package/dist/commands/update.js +12 -8
  109. package/dist/commands/update.js.map +1 -1
  110. package/dist/commands/validate.js +20 -42
  111. package/dist/commands/validate.js.map +1 -1
  112. package/dist/components/skill-search/skill-search.js +4 -3
  113. package/dist/components/wizard/category-grid.js +5 -3
  114. package/dist/components/wizard/category-grid.test.js +242 -194
  115. package/dist/components/wizard/category-grid.test.js.map +1 -1
  116. package/dist/components/wizard/checkbox-grid.js +5 -5
  117. package/dist/components/wizard/checkbox-grid.test.js +5 -5
  118. package/dist/components/wizard/domain-selection.js +12 -11
  119. package/dist/components/wizard/help-modal.js +3 -2
  120. package/dist/components/wizard/menu-item.js +1 -1
  121. package/dist/components/wizard/search-modal.js +3 -2
  122. package/dist/components/wizard/search-modal.test.js +3 -2
  123. package/dist/components/wizard/search-modal.test.js.map +1 -1
  124. package/dist/components/wizard/section-progress.js +2 -2
  125. package/dist/components/wizard/section-progress.test.js +3 -3
  126. package/dist/components/wizard/section-progress.test.js.map +1 -1
  127. package/dist/components/wizard/selection-card.js +2 -2
  128. package/dist/components/wizard/source-grid.js +6 -4
  129. package/dist/components/wizard/source-grid.test.js +65 -40
  130. package/dist/components/wizard/source-grid.test.js.map +1 -1
  131. package/dist/components/wizard/stack-selection.js +9 -8
  132. package/dist/components/wizard/step-agents.js +11 -10
  133. package/dist/components/wizard/step-agents.test.js +28 -25
  134. package/dist/components/wizard/step-agents.test.js.map +1 -1
  135. package/dist/components/wizard/step-build.js +12 -10
  136. package/dist/components/wizard/step-build.test.js +28 -34
  137. package/dist/components/wizard/step-build.test.js.map +1 -1
  138. package/dist/components/wizard/step-confirm.js +6 -4
  139. package/dist/components/wizard/step-confirm.test.js +11 -15
  140. package/dist/components/wizard/step-confirm.test.js.map +1 -1
  141. package/dist/components/wizard/step-refine.js +3 -2
  142. package/dist/components/wizard/step-refine.test.js +3 -2
  143. package/dist/components/wizard/step-refine.test.js.map +1 -1
  144. package/dist/components/wizard/step-settings.js +10 -8
  145. package/dist/components/wizard/step-settings.test.js +17 -13
  146. package/dist/components/wizard/step-settings.test.js.map +1 -1
  147. package/dist/components/wizard/step-sources.js +13 -11
  148. package/dist/components/wizard/step-sources.test.js +17 -14
  149. package/dist/components/wizard/step-sources.test.js.map +1 -1
  150. package/dist/components/wizard/step-stack.js +15 -14
  151. package/dist/components/wizard/step-stack.test.js +42 -38
  152. package/dist/components/wizard/step-stack.test.js.map +1 -1
  153. package/dist/components/wizard/view-title.js +2 -2
  154. package/dist/components/wizard/wizard-layout.js +10 -8
  155. package/dist/components/wizard/wizard-tabs.js +2 -2
  156. package/dist/components/wizard/wizard-tabs.test.js +2 -2
  157. package/dist/components/wizard/wizard.js +29 -27
  158. package/dist/hooks/init.js +32 -30
  159. package/dist/hooks/init.js.map +1 -1
  160. package/dist/{loader-2O32KKAQ.js → loader-4YOZCFIP.js} +4 -4
  161. package/dist/plugins/dummy-skill/.claude-plugin/.content-hash +1 -0
  162. package/dist/plugins/dummy-skill/.claude-plugin/plugin.json +13 -0
  163. package/dist/{source-loader-A6B3NDI4.js → source-loader-O5RMYUBW.js} +6 -5
  164. package/dist/{source-manager-Q7IQSGIX.js → source-manager-NKLL6HCL.js} +6 -5
  165. package/dist/stores/matrix-store.js +15 -0
  166. package/dist/stores/matrix-store.js.map +1 -0
  167. package/dist/stores/matrix-store.test.js +146 -0
  168. package/dist/stores/matrix-store.test.js.map +1 -0
  169. package/dist/stores/wizard-store.js +6 -5
  170. package/dist/stores/wizard-store.test.js +159 -107
  171. package/dist/stores/wizard-store.test.js.map +1 -1
  172. package/package.json +1 -1
  173. package/dist/chunk-52M2XF3W.js.map +0 -1
  174. package/dist/chunk-52XO4ULK.js.map +0 -1
  175. package/dist/chunk-6G3KZSO4.js.map +0 -1
  176. package/dist/chunk-7FMEMXJ4.js.map +0 -1
  177. package/dist/chunk-AX3SZZWA.js.map +0 -1
  178. package/dist/chunk-BFD5NZQ4.js.map +0 -1
  179. package/dist/chunk-BKJHAJQW.js.map +0 -1
  180. package/dist/chunk-BMJZBLP7.js.map +0 -1
  181. package/dist/chunk-EMIUPGPL.js.map +0 -1
  182. package/dist/chunk-G6WHCALR.js.map +0 -1
  183. package/dist/chunk-H7WJK7NJ.js.map +0 -1
  184. package/dist/chunk-KIWFEBKH.js.map +0 -1
  185. package/dist/chunk-MKCHLXMY.js.map +0 -1
  186. package/dist/chunk-MMFQNJPE.js.map +0 -1
  187. package/dist/chunk-MR6OBL3B.js.map +0 -1
  188. package/dist/chunk-O6BA7Q2B.js.map +0 -1
  189. package/dist/chunk-SDKCQXWE.js.map +0 -1
  190. package/dist/chunk-SEJF7CGJ.js.map +0 -1
  191. package/dist/chunk-SZRK3VOR.js.map +0 -1
  192. package/dist/chunk-TC3NHO34.js +0 -151
  193. package/dist/chunk-TC3NHO34.js.map +0 -1
  194. package/dist/chunk-TGLRDEEL.js.map +0 -1
  195. package/dist/chunk-TZXYBG3R.js.map +0 -1
  196. package/dist/chunk-WF6RM73R.js.map +0 -1
  197. /package/dist/{chunk-MGNYPVOJ.js.map → chunk-AQYAVLZK.js.map} +0 -0
  198. /package/dist/{chunk-BNQ5O6LE.js.map → chunk-AUNBGZS4.js.map} +0 -0
  199. /package/dist/{chunk-VR3CDXDT.js.map → chunk-EE5EPS32.js.map} +0 -0
  200. /package/dist/{chunk-OCEFD7V6.js.map → chunk-F3REOP7N.js.map} +0 -0
  201. /package/dist/{chunk-C577AJE7.js.map → chunk-FGLUQSVU.js.map} +0 -0
  202. /package/dist/{chunk-X5EG4EFP.js.map → chunk-MWGDG4QN.js.map} +0 -0
  203. /package/dist/{chunk-CIG7IKX3.js.map → chunk-OV5UJWS5.js.map} +0 -0
  204. /package/dist/{chunk-RO6LX3UV.js.map → chunk-R46CB36B.js.map} +0 -0
  205. /package/dist/{chunk-XUDTFI4M.js.map → chunk-T5DJCIUP.js.map} +0 -0
  206. /package/dist/{chunk-AJJJE7F7.js.map → chunk-TQLDQ3XZ.js.map} +0 -0
  207. /package/dist/{chunk-WYVDNGJB.js.map → chunk-XMLCXRTS.js.map} +0 -0
  208. /package/dist/{chunk-K6OLORQL.js.map → chunk-YEGPTBX5.js.map} +0 -0
  209. /package/dist/{chunk-YHCYKUA3.js.map → chunk-ZFY5EMDV.js.map} +0 -0
  210. /package/dist/{loader-2O32KKAQ.js.map → loader-4YOZCFIP.js.map} +0 -0
  211. /package/dist/{source-loader-A6B3NDI4.js.map → source-loader-O5RMYUBW.js.map} +0 -0
  212. /package/dist/{source-manager-Q7IQSGIX.js.map → source-manager-NKLL6HCL.js.map} +0 -0
@@ -1,19 +1,19 @@
1
1
  #!/usr/bin/env node
2
+ import {
3
+ StackSelection
4
+ } from "./chunk-EZ35IPXZ.js";
2
5
  import {
3
6
  useMeasuredHeight
4
7
  } from "./chunk-K77I4XGL.js";
5
- import {
6
- StackSelection
7
- } from "./chunk-BMJZBLP7.js";
8
8
  import {
9
9
  DomainSelection
10
- } from "./chunk-TGLRDEEL.js";
10
+ } from "./chunk-O2HK3NTG.js";
11
11
  import {
12
12
  ViewTitle
13
- } from "./chunk-MGNYPVOJ.js";
13
+ } from "./chunk-AQYAVLZK.js";
14
14
  import {
15
15
  useWizardStore
16
- } from "./chunk-WF6RM73R.js";
16
+ } from "./chunk-4C7CSZC5.js";
17
17
  import {
18
18
  init_esm_shims
19
19
  } from "./chunk-DHET7RCE.js";
@@ -22,19 +22,19 @@ import {
22
22
  init_esm_shims();
23
23
  import { Box } from "ink";
24
24
  import { jsx, jsxs } from "react/jsx-runtime";
25
- var StepStack = ({ matrix, onCancel }) => {
25
+ var StepStack = ({ onCancel }) => {
26
26
  const { approach } = useWizardStore();
27
27
  const { ref: containerRef, measuredHeight } = useMeasuredHeight();
28
28
  if (approach !== null) {
29
- return /* @__PURE__ */ jsx(DomainSelection, { matrix });
29
+ return /* @__PURE__ */ jsx(DomainSelection, {});
30
30
  }
31
31
  return /* @__PURE__ */ jsxs(Box, { flexDirection: "column", width: "100%", flexGrow: 1, flexBasis: 0, children: [
32
32
  /* @__PURE__ */ jsx(ViewTitle, { children: "Choose a stack" }),
33
- /* @__PURE__ */ jsx(Box, { ref: containerRef, flexGrow: 1, flexBasis: 0, children: /* @__PURE__ */ jsx(StackSelection, { matrix, availableHeight: measuredHeight, onCancel }) })
33
+ /* @__PURE__ */ jsx(Box, { ref: containerRef, flexGrow: 1, flexBasis: 0, children: /* @__PURE__ */ jsx(StackSelection, { availableHeight: measuredHeight, onCancel }) })
34
34
  ] });
35
35
  };
36
36
 
37
37
  export {
38
38
  StepStack
39
39
  };
40
- //# sourceMappingURL=chunk-MKCHLXMY.js.map
40
+ //# sourceMappingURL=chunk-6DEK3TDF.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/components/wizard/step-stack.tsx"],"sourcesContent":["import { Box } from \"ink\";\nimport React from \"react\";\nimport { useWizardStore } from \"../../stores/wizard-store.js\";\nimport { useMeasuredHeight } from \"../hooks/use-measured-height.js\";\nimport { StackSelection } from \"./stack-selection.js\";\nimport { DomainSelection } from \"./domain-selection.js\";\nimport { ViewTitle } from \"./view-title.js\";\n\ntype StepStackProps = {\n onCancel?: () => void;\n};\n\n/**\n * Unified first step of the wizard.\n *\n * Sub-step 1 (approach is null): Shows stacks + \"Start from scratch\" in a single list.\n * Sub-step 2 (approach is set): Shows domain selection with pre-selected domains.\n *\n * After domain selection, proceeds to the \"build\" step.\n */\nexport const StepStack: React.FC<StepStackProps> = ({ onCancel }) => {\n const { approach } = useWizardStore();\n const { ref: containerRef, measuredHeight } = useMeasuredHeight();\n\n if (approach !== null) {\n return <DomainSelection />;\n }\n\n return (\n <Box flexDirection=\"column\" width=\"100%\" flexGrow={1} flexBasis={0}>\n <ViewTitle>Choose a stack</ViewTitle>\n <Box ref={containerRef} flexGrow={1} flexBasis={0}>\n <StackSelection availableHeight={measuredHeight} onCancel={onCancel} />\n </Box>\n </Box>\n );\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA;AAAA,SAAS,WAAW;AAyBT,cAIP,YAJO;AALJ,IAAM,YAAsC,CAAC,EAAE,SAAS,MAAM;AACnE,QAAM,EAAE,SAAS,IAAI,eAAe;AACpC,QAAM,EAAE,KAAK,cAAc,eAAe,IAAI,kBAAkB;AAEhE,MAAI,aAAa,MAAM;AACrB,WAAO,oBAAC,mBAAgB;AAAA,EAC1B;AAEA,SACE,qBAAC,OAAI,eAAc,UAAS,OAAM,QAAO,UAAU,GAAG,WAAW,GAC/D;AAAA,wBAAC,aAAU,4BAAc;AAAA,IACzB,oBAAC,OAAI,KAAK,cAAc,UAAU,GAAG,WAAW,GAC9C,8BAAC,kBAAe,iBAAiB,gBAAgB,UAAoB,GACvE;AAAA,KACF;AAEJ;","names":[]}
@@ -2,9 +2,14 @@
2
2
  import {
3
3
  useKeyboardNavigation
4
4
  } from "./chunk-KUV24B5M.js";
5
+ import {
6
+ KEY_LABEL_ARROWS_VERT,
7
+ KEY_LABEL_ENTER,
8
+ KEY_LABEL_ESC
9
+ } from "./chunk-6VIOO74O.js";
5
10
  import {
6
11
  CLI_COLORS
7
- } from "./chunk-6OWHQ7HM.js";
12
+ } from "./chunk-EGMQ3SXN.js";
8
13
  import {
9
14
  init_esm_shims
10
15
  } from "./chunk-DHET7RCE.js";
@@ -74,10 +79,12 @@ var SearchModal = ({ results, alias, onBind, onClose }) => {
74
79
  )),
75
80
  /* @__PURE__ */ jsx(Text, { children: " " }),
76
81
  /* @__PURE__ */ jsxs(Text, { dimColor: true, children: [
77
- "\u2191",
78
- "/",
79
- "\u2193",
80
- " navigate ENTER bind ESC close"
82
+ KEY_LABEL_ARROWS_VERT,
83
+ " navigate ",
84
+ KEY_LABEL_ENTER,
85
+ " bind ",
86
+ KEY_LABEL_ESC,
87
+ " close"
81
88
  ] })
82
89
  ]
83
90
  }
@@ -87,4 +94,4 @@ var SearchModal = ({ results, alias, onBind, onClose }) => {
87
94
  export {
88
95
  SearchModal
89
96
  };
90
- //# sourceMappingURL=chunk-SDKCQXWE.js.map
97
+ //# sourceMappingURL=chunk-6IK2TCK7.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/components/wizard/search-modal.tsx"],"sourcesContent":["import React, { useCallback } from \"react\";\nimport { Box, Text } from \"ink\";\nimport type { BoundSkillCandidate } from \"../../types/index.js\";\nimport { CLI_COLORS } from \"../../consts.js\";\nimport { useKeyboardNavigation } from \"../hooks/use-keyboard-navigation.js\";\nimport { KEY_LABEL_ARROWS_VERT, KEY_LABEL_ENTER, KEY_LABEL_ESC } from \"./hotkeys.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 sourceLabel = `${candidate.sourceName}/${candidate.id}`;\n\n return (\n <Box>\n <Text bold={isFocused} color={isFocused ? CLI_COLORS.PRIMARY : undefined}>\n {marker}{\" \"}\n </Text>\n <Text bold={isFocused} color={isFocused ? CLI_COLORS.PRIMARY : undefined}>\n {sourceLabel}\n </Text>\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 handleEnter = useCallback(\n (index: number) => {\n if (results.length > 0) {\n const selected = results[index];\n if (selected) {\n onBind(selected);\n }\n }\n },\n [results, onBind],\n );\n\n const { focusedIndex } = useKeyboardNavigation(\n results.length,\n { onEnter: handleEnter, onEscape: onClose },\n { vimKeys: false },\n );\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"single\"\n borderColor={CLI_COLORS.NEUTRAL}\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 {KEY_LABEL_ARROWS_VERT} navigate {KEY_LABEL_ENTER} bind {KEY_LABEL_ESC} close\n </Text>\n </Box>\n );\n};\n"],"mappings":";;;;;;;;;;;;;;;;;AAAA;AAAA,SAAgB,mBAAmB;AACnC,SAAS,KAAK,YAAY;AA2BpB,SAGA,KAHA;AAdN,IAAM,iBAAiB;AACvB,IAAM,gBAAgB;AAOtB,IAAM,YAAsC,CAAC,EAAE,WAAW,UAAU,MAAM;AACxE,QAAM,SAAS,YAAY,iBAAiB;AAC5C,QAAM,cAAc,GAAG,UAAU,UAAU,IAAI,UAAU,EAAE;AAE3D,SACE,qBAAC,OACC;AAAA,yBAAC,QAAK,MAAM,WAAW,OAAO,YAAY,WAAW,UAAU,QAC5D;AAAA;AAAA,MAAQ;AAAA,OACX;AAAA,IACA,oBAAC,QAAK,MAAM,WAAW,OAAO,YAAY,WAAW,UAAU,QAC5D,uBACH;AAAA,IACC,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;AAAA,IAClB,CAAC,UAAkB;AACjB,UAAI,QAAQ,SAAS,GAAG;AACtB,cAAM,WAAW,QAAQ,KAAK;AAC9B,YAAI,UAAU;AACZ,iBAAO,QAAQ;AAAA,QACjB;AAAA,MACF;AAAA,IACF;AAAA,IACA,CAAC,SAAS,MAAM;AAAA,EAClB;AAEA,QAAM,EAAE,aAAa,IAAI;AAAA,IACvB,QAAQ;AAAA,IACR,EAAE,SAAS,aAAa,UAAU,QAAQ;AAAA,IAC1C,EAAE,SAAS,MAAM;AAAA,EACnB;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAc;AAAA,MACd,aAAY;AAAA,MACZ,aAAa,WAAW;AAAA,MACxB,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,UAAsB;AAAA,UAAW;AAAA,UAAgB;AAAA,UAAO;AAAA,UAAc;AAAA,WACzE;AAAA;AAAA;AAAA,EACF;AAEJ;","names":[]}
@@ -0,0 +1,51 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ init_esm_shims
4
+ } from "./chunk-DHET7RCE.js";
5
+
6
+ // src/cli/components/wizard/hotkeys.ts
7
+ init_esm_shims();
8
+ var HOTKEY_HELP = { key: "?", label: "?" };
9
+ var HOTKEY_ACCEPT_DEFAULTS = { key: "a", label: "A" };
10
+ var HOTKEY_SCOPE = { key: "s", label: "S" };
11
+ var HOTKEY_SETTINGS = { key: "s", label: "S" };
12
+ var HOTKEY_TOGGLE_LABELS = { key: "d", label: "D" };
13
+ var HOTKEY_SET_ALL_LOCAL = { key: "l", label: "L" };
14
+ var HOTKEY_SET_ALL_PLUGIN = { key: "p", label: "P" };
15
+ var HOTKEY_ADD_SOURCE = { key: "a", label: "A" };
16
+ var HOTKEY_COPY_LINK = { key: "c", label: "C" };
17
+ var KEY_LABEL_ENTER = "ENTER";
18
+ var KEY_LABEL_ESC = "ESC";
19
+ var KEY_LABEL_SPACE = "SPACE";
20
+ var KEY_LABEL_TAB = "TAB";
21
+ var KEY_LABEL_DEL = "DEL";
22
+ var KEY_LABEL_ARROWS = "\u2190/\u2192";
23
+ var KEY_LABEL_ARROWS_VERT = "\u2191/\u2193";
24
+ var KEY_LABEL_VIM = "h/j/k/l";
25
+ var KEY_LABEL_VIM_VERT = "j/k";
26
+ function isHotkey(input, hotkey) {
27
+ return input.toLowerCase() === hotkey.key.toLowerCase();
28
+ }
29
+
30
+ export {
31
+ HOTKEY_HELP,
32
+ HOTKEY_ACCEPT_DEFAULTS,
33
+ HOTKEY_SCOPE,
34
+ HOTKEY_SETTINGS,
35
+ HOTKEY_TOGGLE_LABELS,
36
+ HOTKEY_SET_ALL_LOCAL,
37
+ HOTKEY_SET_ALL_PLUGIN,
38
+ HOTKEY_ADD_SOURCE,
39
+ HOTKEY_COPY_LINK,
40
+ KEY_LABEL_ENTER,
41
+ KEY_LABEL_ESC,
42
+ KEY_LABEL_SPACE,
43
+ KEY_LABEL_TAB,
44
+ KEY_LABEL_DEL,
45
+ KEY_LABEL_ARROWS,
46
+ KEY_LABEL_ARROWS_VERT,
47
+ KEY_LABEL_VIM,
48
+ KEY_LABEL_VIM_VERT,
49
+ isHotkey
50
+ };
51
+ //# sourceMappingURL=chunk-6VIOO74O.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/components/wizard/hotkeys.ts"],"sourcesContent":["/**\n * Centralized hotkey registry for wizard components.\n *\n * Every character-based hotkey and its display label lives here so that\n * changing a binding updates the key check, the footer hint, and the\n * help modal in one place.\n */\n\n// ---------------------------------------------------------------------------\n// Global hotkeys (active across multiple wizard steps)\n// ---------------------------------------------------------------------------\n\nexport const HOTKEY_HELP = { key: \"?\", label: \"?\" } as const;\nexport const HOTKEY_ACCEPT_DEFAULTS = { key: \"a\", label: \"A\" } as const;\nexport const HOTKEY_SCOPE = { key: \"s\", label: \"S\" } as const;\nexport const HOTKEY_SETTINGS = { key: \"s\", label: \"S\" } as const;\n\n// ---------------------------------------------------------------------------\n// Build step hotkeys\n// ---------------------------------------------------------------------------\n\nexport const HOTKEY_TOGGLE_LABELS = { key: \"d\", label: \"D\" } as const;\n\n// ---------------------------------------------------------------------------\n// Sources step hotkeys (customize view)\n// ---------------------------------------------------------------------------\n\nexport const HOTKEY_SET_ALL_LOCAL = { key: \"l\", label: \"L\" } as const;\nexport const HOTKEY_SET_ALL_PLUGIN = { key: \"p\", label: \"P\" } as const;\n\n// ---------------------------------------------------------------------------\n// Settings step hotkeys\n// ---------------------------------------------------------------------------\n\nexport const HOTKEY_ADD_SOURCE = { key: \"a\", label: \"A\" } as const;\n\n// ---------------------------------------------------------------------------\n// Skill search hotkey\n// ---------------------------------------------------------------------------\n\nexport const HOTKEY_COPY_LINK = { key: \"c\", label: \"C\" } as const;\n\n// ---------------------------------------------------------------------------\n// Common key labels (for structural keys handled via Ink key objects)\n// ---------------------------------------------------------------------------\n\nexport const KEY_LABEL_ENTER = \"ENTER\" as const;\nexport const KEY_LABEL_ESC = \"ESC\" as const;\nexport const KEY_LABEL_SPACE = \"SPACE\" as const;\nexport const KEY_LABEL_TAB = \"TAB\" as const;\nexport const KEY_LABEL_DEL = \"DEL\" as const;\nexport const KEY_LABEL_ARROWS = \"\\u2190/\\u2192\" as const;\nexport const KEY_LABEL_ARROWS_VERT = \"\\u2191/\\u2193\" as const;\nexport const KEY_LABEL_VIM = \"h/j/k/l\" as const;\nexport const KEY_LABEL_VIM_VERT = \"j/k\" as const;\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/** Case-insensitive check for a character hotkey. */\nexport function isHotkey(input: string, hotkey: { key: string }): boolean {\n return input.toLowerCase() === hotkey.key.toLowerCase();\n}\n"],"mappings":";;;;;;AAAA;AAYO,IAAM,cAAc,EAAE,KAAK,KAAK,OAAO,IAAI;AAC3C,IAAM,yBAAyB,EAAE,KAAK,KAAK,OAAO,IAAI;AACtD,IAAM,eAAe,EAAE,KAAK,KAAK,OAAO,IAAI;AAC5C,IAAM,kBAAkB,EAAE,KAAK,KAAK,OAAO,IAAI;AAM/C,IAAM,uBAAuB,EAAE,KAAK,KAAK,OAAO,IAAI;AAMpD,IAAM,uBAAuB,EAAE,KAAK,KAAK,OAAO,IAAI;AACpD,IAAM,wBAAwB,EAAE,KAAK,KAAK,OAAO,IAAI;AAMrD,IAAM,oBAAoB,EAAE,KAAK,KAAK,OAAO,IAAI;AAMjD,IAAM,mBAAmB,EAAE,KAAK,KAAK,OAAO,IAAI;AAMhD,IAAM,kBAAkB;AACxB,IAAM,gBAAgB;AACtB,IAAM,kBAAkB;AACxB,IAAM,gBAAgB;AACtB,IAAM,gBAAgB;AACtB,IAAM,mBAAmB;AACzB,IAAM,wBAAwB;AAC9B,IAAM,gBAAgB;AACtB,IAAM,qBAAqB;AAO3B,SAAS,SAAS,OAAe,QAAkC;AACxE,SAAO,MAAM,YAAY,MAAM,OAAO,IAAI,YAAY;AACxD;","names":[]}
@@ -1,7 +1,19 @@
1
1
  #!/usr/bin/env node
2
+ import {
3
+ HOTKEY_ACCEPT_DEFAULTS,
4
+ HOTKEY_HELP,
5
+ HOTKEY_SCOPE,
6
+ HOTKEY_SETTINGS,
7
+ HOTKEY_TOGGLE_LABELS,
8
+ KEY_LABEL_ENTER,
9
+ KEY_LABEL_ESC,
10
+ KEY_LABEL_SPACE,
11
+ KEY_LABEL_TAB,
12
+ KEY_LABEL_VIM
13
+ } from "./chunk-6VIOO74O.js";
2
14
  import {
3
15
  CLI_COLORS
4
- } from "./chunk-6OWHQ7HM.js";
16
+ } from "./chunk-EGMQ3SXN.js";
5
17
  import {
6
18
  init_esm_shims
7
19
  } from "./chunk-DHET7RCE.js";
@@ -14,28 +26,28 @@ var GLOBAL_KEYS = {
14
26
  title: "Navigation",
15
27
  keys: [
16
28
  { key: "Arrow keys", description: "Move focus" },
17
- { key: "SPACE", description: "Toggle selection" },
18
- { key: "ENTER", description: "Confirm / continue" },
19
- { key: "ESC", description: "Go back" },
20
- { key: "TAB", description: "Jump to next section" }
29
+ { key: KEY_LABEL_SPACE, description: "Toggle selection" },
30
+ { key: KEY_LABEL_ENTER, description: "Confirm / continue" },
31
+ { key: KEY_LABEL_ESC, description: "Go back" },
32
+ { key: KEY_LABEL_TAB, description: "Jump to next section" }
21
33
  ]
22
34
  };
23
35
  var GLOBAL_TOGGLES = {
24
36
  title: "Toggles",
25
- keys: [{ key: "?", description: "Toggle this help" }]
37
+ keys: [{ key: HOTKEY_HELP.label, description: "Toggle this help" }]
26
38
  };
27
39
  var BUILD_KEYS = {
28
- title: "Build Step",
40
+ title: "Skills Step",
29
41
  keys: [
30
- { key: "D", description: "Toggle compatibility labels" },
31
- { key: "S", description: "Toggle skill scope (project/global)" },
32
- { key: "A", description: "Accept stack defaults (stack path only)" },
33
- { key: "h/j/k/l", description: "Vim-style navigation" }
42
+ { key: HOTKEY_TOGGLE_LABELS.label, description: "Toggle compatibility labels" },
43
+ { key: HOTKEY_SCOPE.label, description: "Toggle skill scope (project/global)" },
44
+ { key: HOTKEY_ACCEPT_DEFAULTS.label, description: "Accept stack defaults (stack path only)" },
45
+ { key: KEY_LABEL_VIM, description: "Vim-style navigation" }
34
46
  ]
35
47
  };
36
48
  var SOURCES_KEYS = {
37
49
  title: "Sources Step",
38
- keys: [{ key: "S", description: "Toggle source settings" }]
50
+ keys: [{ key: HOTKEY_SETTINGS.label, description: "Toggle source settings" }]
39
51
  };
40
52
  var AGENTS_KEYS = {
41
53
  title: "Agents Step",
@@ -75,7 +87,13 @@ var HelpModal = ({ currentStep }) => {
75
87
  /* @__PURE__ */ jsx(HelpSectionView, { section: GLOBAL_KEYS }),
76
88
  /* @__PURE__ */ jsx(HelpSectionView, { section: GLOBAL_TOGGLES }),
77
89
  stepSection && /* @__PURE__ */ jsx(HelpSectionView, { section: stepSection }),
78
- /* @__PURE__ */ jsx(Text, { dimColor: true, children: "Press ESC or ? to close" })
90
+ /* @__PURE__ */ jsxs(Text, { dimColor: true, children: [
91
+ "Press ",
92
+ KEY_LABEL_ESC,
93
+ " or ",
94
+ HOTKEY_HELP.label,
95
+ " to close"
96
+ ] })
79
97
  ]
80
98
  }
81
99
  );
@@ -84,4 +102,4 @@ var HelpModal = ({ currentStep }) => {
84
102
  export {
85
103
  HelpModal
86
104
  };
87
- //# sourceMappingURL=chunk-52XO4ULK.js.map
105
+ //# sourceMappingURL=chunk-7DI3HGKL.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/components/wizard/help-modal.tsx"],"sourcesContent":["import { Box, Text } from \"ink\";\nimport React from \"react\";\nimport { CLI_COLORS } from \"../../consts.js\";\nimport type { WizardStep } from \"../../stores/wizard-store.js\";\nimport {\n HOTKEY_ACCEPT_DEFAULTS,\n HOTKEY_HELP,\n HOTKEY_SCOPE,\n HOTKEY_SETTINGS,\n HOTKEY_TOGGLE_LABELS,\n KEY_LABEL_ENTER,\n KEY_LABEL_ESC,\n KEY_LABEL_SPACE,\n KEY_LABEL_TAB,\n KEY_LABEL_VIM,\n} from \"./hotkeys.js\";\n\ntype HelpSection = {\n title: string;\n keys: { key: string; description: string }[];\n};\n\nconst GLOBAL_KEYS: HelpSection = {\n title: \"Navigation\",\n keys: [\n { key: \"Arrow keys\", description: \"Move focus\" },\n { key: KEY_LABEL_SPACE, description: \"Toggle selection\" },\n { key: KEY_LABEL_ENTER, description: \"Confirm / continue\" },\n { key: KEY_LABEL_ESC, description: \"Go back\" },\n { key: KEY_LABEL_TAB, description: \"Jump to next section\" },\n ],\n};\n\nconst GLOBAL_TOGGLES: HelpSection = {\n title: \"Toggles\",\n keys: [{ key: HOTKEY_HELP.label, description: \"Toggle this help\" }],\n};\n\nconst BUILD_KEYS: HelpSection = {\n title: \"Skills Step\",\n keys: [\n { key: HOTKEY_TOGGLE_LABELS.label, description: \"Toggle compatibility labels\" },\n { key: HOTKEY_SCOPE.label, description: \"Toggle skill scope (project/global)\" },\n { key: HOTKEY_ACCEPT_DEFAULTS.label, description: \"Accept stack defaults (stack path only)\" },\n { key: KEY_LABEL_VIM, description: \"Vim-style navigation\" },\n ],\n};\n\nconst SOURCES_KEYS: HelpSection = {\n title: \"Sources Step\",\n keys: [{ key: HOTKEY_SETTINGS.label, description: \"Toggle source settings\" }],\n};\n\nconst AGENTS_KEYS: HelpSection = {\n title: \"Agents Step\",\n keys: [],\n};\n\nconst STEP_SECTIONS: Partial<Record<WizardStep, HelpSection>> = {\n build: BUILD_KEYS,\n sources: SOURCES_KEYS,\n agents: AGENTS_KEYS,\n};\n\nconst KEY_COLUMN_WIDTH = 14;\n\ntype HelpSectionViewProps = {\n section: HelpSection;\n};\n\nconst HelpSectionView: React.FC<HelpSectionViewProps> = ({ section }) => (\n <Box flexDirection=\"column\" marginTop={1} marginBottom={1}>\n <Text bold>{section.title}</Text>\n {section.keys.map(({ key, description }) => (\n <Box key={key} marginTop={1}>\n <Box width={KEY_COLUMN_WIDTH}>\n <Text backgroundColor=\"black\" color={CLI_COLORS.UNFOCUSED}>\n {\" \"}\n {key}{\" \"}\n </Text>\n </Box>\n <Text>{description}</Text>\n </Box>\n ))}\n </Box>\n);\n\nexport type HelpModalProps = {\n currentStep: WizardStep;\n};\n\nexport const HelpModal: React.FC<HelpModalProps> = ({ currentStep }) => {\n const stepSection = STEP_SECTIONS[currentStep];\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"single\"\n borderColor={CLI_COLORS.PRIMARY}\n paddingX={2}\n paddingY={1}\n marginTop={1}\n >\n <Text bold color={CLI_COLORS.PRIMARY}>\n Keyboard Shortcuts\n </Text>\n <Text> </Text>\n\n <HelpSectionView section={GLOBAL_KEYS} />\n <HelpSectionView section={GLOBAL_TOGGLES} />\n {stepSection && <HelpSectionView section={stepSection} />}\n\n <Text dimColor>\n Press {KEY_LABEL_ESC} or {HOTKEY_HELP.label} to close\n </Text>\n </Box>\n );\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA;AAAA,SAAS,KAAK,YAAY;AAwEtB,cAIM,YAJN;AAlDJ,IAAM,cAA2B;AAAA,EAC/B,OAAO;AAAA,EACP,MAAM;AAAA,IACJ,EAAE,KAAK,cAAc,aAAa,aAAa;AAAA,IAC/C,EAAE,KAAK,iBAAiB,aAAa,mBAAmB;AAAA,IACxD,EAAE,KAAK,iBAAiB,aAAa,qBAAqB;AAAA,IAC1D,EAAE,KAAK,eAAe,aAAa,UAAU;AAAA,IAC7C,EAAE,KAAK,eAAe,aAAa,uBAAuB;AAAA,EAC5D;AACF;AAEA,IAAM,iBAA8B;AAAA,EAClC,OAAO;AAAA,EACP,MAAM,CAAC,EAAE,KAAK,YAAY,OAAO,aAAa,mBAAmB,CAAC;AACpE;AAEA,IAAM,aAA0B;AAAA,EAC9B,OAAO;AAAA,EACP,MAAM;AAAA,IACJ,EAAE,KAAK,qBAAqB,OAAO,aAAa,8BAA8B;AAAA,IAC9E,EAAE,KAAK,aAAa,OAAO,aAAa,sCAAsC;AAAA,IAC9E,EAAE,KAAK,uBAAuB,OAAO,aAAa,0CAA0C;AAAA,IAC5F,EAAE,KAAK,eAAe,aAAa,uBAAuB;AAAA,EAC5D;AACF;AAEA,IAAM,eAA4B;AAAA,EAChC,OAAO;AAAA,EACP,MAAM,CAAC,EAAE,KAAK,gBAAgB,OAAO,aAAa,yBAAyB,CAAC;AAC9E;AAEA,IAAM,cAA2B;AAAA,EAC/B,OAAO;AAAA,EACP,MAAM,CAAC;AACT;AAEA,IAAM,gBAA0D;AAAA,EAC9D,OAAO;AAAA,EACP,SAAS;AAAA,EACT,QAAQ;AACV;AAEA,IAAM,mBAAmB;AAMzB,IAAM,kBAAkD,CAAC,EAAE,QAAQ,MACjE,qBAAC,OAAI,eAAc,UAAS,WAAW,GAAG,cAAc,GACtD;AAAA,sBAAC,QAAK,MAAI,MAAE,kBAAQ,OAAM;AAAA,EACzB,QAAQ,KAAK,IAAI,CAAC,EAAE,KAAK,YAAY,MACpC,qBAAC,OAAc,WAAW,GACxB;AAAA,wBAAC,OAAI,OAAO,kBACV,+BAAC,QAAK,iBAAgB,SAAQ,OAAO,WAAW,WAC7C;AAAA;AAAA,MACA;AAAA,MAAK;AAAA,OACR,GACF;AAAA,IACA,oBAAC,QAAM,uBAAY;AAAA,OAPX,GAQV,CACD;AAAA,GACH;AAOK,IAAM,YAAsC,CAAC,EAAE,YAAY,MAAM;AACtE,QAAM,cAAc,cAAc,WAAW;AAE7C,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAc;AAAA,MACd,aAAY;AAAA,MACZ,aAAa,WAAW;AAAA,MACxB,UAAU;AAAA,MACV,UAAU;AAAA,MACV,WAAW;AAAA,MAEX;AAAA,4BAAC,QAAK,MAAI,MAAC,OAAO,WAAW,SAAS,gCAEtC;AAAA,QACA,oBAAC,QAAK,eAAC;AAAA,QAEP,oBAAC,mBAAgB,SAAS,aAAa;AAAA,QACvC,oBAAC,mBAAgB,SAAS,gBAAgB;AAAA,QACzC,eAAe,oBAAC,mBAAgB,SAAS,aAAa;AAAA,QAEvD,qBAAC,QAAK,UAAQ,MAAC;AAAA;AAAA,UACN;AAAA,UAAc;AAAA,UAAK,YAAY;AAAA,UAAM;AAAA,WAC9C;AAAA;AAAA;AAAA,EACF;AAEJ;","names":[]}
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  CLI_COLORS
4
- } from "./chunk-6OWHQ7HM.js";
4
+ } from "./chunk-EGMQ3SXN.js";
5
5
  import {
6
6
  init_esm_shims
7
7
  } from "./chunk-DHET7RCE.js";
@@ -17,4 +17,4 @@ var ViewTitle = ({ children }) => {
17
17
  export {
18
18
  ViewTitle
19
19
  };
20
- //# sourceMappingURL=chunk-MGNYPVOJ.js.map
20
+ //# sourceMappingURL=chunk-AQYAVLZK.js.map
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  SCROLL_VIEWPORT
4
- } from "./chunk-6OWHQ7HM.js";
4
+ } from "./chunk-EGMQ3SXN.js";
5
5
  import {
6
6
  init_esm_shims
7
7
  } from "./chunk-DHET7RCE.js";
@@ -71,4 +71,4 @@ export {
71
71
  useSectionScroll,
72
72
  computeRowScrollTop
73
73
  };
74
- //# sourceMappingURL=chunk-BNQ5O6LE.js.map
74
+ //# sourceMappingURL=chunk-AUNBGZS4.js.map
@@ -0,0 +1,248 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ useMeasuredHeight
4
+ } from "./chunk-K77I4XGL.js";
5
+ import {
6
+ CategoryGrid
7
+ } from "./chunk-CKPJTMNC.js";
8
+ import {
9
+ getDomainDisplayName,
10
+ orderDomains
11
+ } from "./chunk-ZYUASJUN.js";
12
+ import {
13
+ ViewTitle
14
+ } from "./chunk-AQYAVLZK.js";
15
+ import {
16
+ useWizardStore
17
+ } from "./chunk-4C7CSZC5.js";
18
+ import {
19
+ KEY_LABEL_ENTER,
20
+ KEY_LABEL_ESC
21
+ } from "./chunk-6VIOO74O.js";
22
+ import {
23
+ getAvailableSkills,
24
+ resolveAlias
25
+ } from "./chunk-53URJ5XK.js";
26
+ import {
27
+ findSkill,
28
+ getMatrix
29
+ } from "./chunk-BKL3DF2Q.js";
30
+ import {
31
+ CLI_COLORS
32
+ } from "./chunk-EGMQ3SXN.js";
33
+ import {
34
+ init_esm_shims
35
+ } from "./chunk-DHET7RCE.js";
36
+
37
+ // src/cli/components/wizard/step-build.tsx
38
+ init_esm_shims();
39
+ import { Box, Text, useInput } from "ink";
40
+ import { useCallback, useMemo as useMemo2, useState } from "react";
41
+
42
+ // src/cli/lib/wizard/index.ts
43
+ init_esm_shims();
44
+
45
+ // src/cli/lib/wizard/build-step-logic.ts
46
+ init_esm_shims();
47
+ import { sortBy } from "remeda";
48
+ var FRAMEWORK_CATEGORY_ID = "web-framework";
49
+ var WEB_DOMAIN_ID = "web";
50
+ function validateBuildStep(categories, selections) {
51
+ for (const category of categories) {
52
+ if (category.required) {
53
+ const categorySelections = selections[category.id] || [];
54
+ if (categorySelections.length === 0) {
55
+ return {
56
+ valid: false,
57
+ message: `Select at least one skill from the ${category.displayName} category. Use arrow keys to navigate, then SPACE to select.`
58
+ };
59
+ }
60
+ }
61
+ }
62
+ return { valid: true };
63
+ }
64
+ function computeOptionState(skill) {
65
+ if (skill.discouraged) {
66
+ return "discouraged";
67
+ }
68
+ if (skill.recommended) {
69
+ return "recommended";
70
+ }
71
+ return "normal";
72
+ }
73
+ function getStateReason(skill) {
74
+ if (skill.discouraged && skill.discouragedReason) {
75
+ return skill.discouragedReason;
76
+ }
77
+ if (skill.recommended && skill.recommendedReason) {
78
+ return skill.recommendedReason;
79
+ }
80
+ return void 0;
81
+ }
82
+ function isFrameworkSelected(selections) {
83
+ const frameworkSelections = selections[FRAMEWORK_CATEGORY_ID] ?? [];
84
+ return frameworkSelections.length > 0;
85
+ }
86
+ function getSelectedFrameworks(selections) {
87
+ const frameworkSelections = selections[FRAMEWORK_CATEGORY_ID] ?? [];
88
+ return frameworkSelections.map((alias) => resolveAlias(alias));
89
+ }
90
+ function isCompatibleWithSelectedFrameworks(skillId, selectedFrameworkIds) {
91
+ const skill = findSkill(skillId);
92
+ if (!skill) return false;
93
+ if (skill.compatibleWith.length === 0) {
94
+ return true;
95
+ }
96
+ return selectedFrameworkIds.some((frameworkId) => skill.compatibleWith.includes(frameworkId));
97
+ }
98
+ function buildCategoriesForDomain(domain, allSelections, selections, installedSkillIds, skillConfigs) {
99
+ const matrix = getMatrix();
100
+ const frameworkSource = selections;
101
+ const frameworkSelected = isFrameworkSelected(frameworkSource);
102
+ const selectedFrameworkIds = frameworkSelected ? getSelectedFrameworks(frameworkSource) : [];
103
+ const categories = sortBy(
104
+ Object.values(matrix.categories).filter(
105
+ (cat) => cat.domain === domain
106
+ ),
107
+ (cat) => cat.order ?? 0
108
+ );
109
+ const categoryRows = categories.map((cat) => {
110
+ const skillOptions = getAvailableSkills(cat.id, allSelections);
111
+ const useFrameworkFilter = domain === WEB_DOMAIN_ID && cat.id !== FRAMEWORK_CATEGORY_ID && frameworkSelected;
112
+ const filteredSkillOptions = useFrameworkFilter ? skillOptions.filter(
113
+ (skill) => isCompatibleWithSelectedFrameworks(skill.id, selectedFrameworkIds)
114
+ ) : skillOptions;
115
+ const options = filteredSkillOptions.map((skill) => ({
116
+ id: skill.id,
117
+ state: computeOptionState(skill),
118
+ stateReason: getStateReason(skill),
119
+ selected: skill.selected,
120
+ local: findSkill(skill.id)?.local,
121
+ installed: installedSkillIds?.includes(skill.id) || false,
122
+ scope: skillConfigs?.find((sc) => sc.id === skill.id)?.scope
123
+ }));
124
+ return {
125
+ id: cat.id,
126
+ displayName: cat.displayName,
127
+ required: cat.required ?? false,
128
+ exclusive: cat.exclusive ?? true,
129
+ options
130
+ };
131
+ });
132
+ return categoryRows.filter((row) => row.options.length > 0);
133
+ }
134
+
135
+ // src/cli/components/hooks/use-framework-filtering.ts
136
+ init_esm_shims();
137
+ import { useMemo } from "react";
138
+ function useFrameworkFiltering({
139
+ domain,
140
+ allSelections,
141
+ selections,
142
+ installedSkillIds,
143
+ skillConfigs
144
+ }) {
145
+ return useMemo(
146
+ () => buildCategoriesForDomain(domain, allSelections, selections, installedSkillIds, skillConfigs),
147
+ [domain, allSelections, selections, installedSkillIds, skillConfigs]
148
+ );
149
+ }
150
+
151
+ // src/cli/components/wizard/step-build.tsx
152
+ import { jsx, jsxs } from "react/jsx-runtime";
153
+ var Footer = ({ validationError }) => {
154
+ return /* @__PURE__ */ jsx(Box, { flexDirection: "column", marginTop: 1, children: validationError && /* @__PURE__ */ jsxs(Box, { flexDirection: "column", marginBottom: 1, children: [
155
+ /* @__PURE__ */ jsx(Text, { color: CLI_COLORS.WARNING, children: validationError }),
156
+ /* @__PURE__ */ jsxs(Text, { dimColor: true, children: [
157
+ "Press ",
158
+ KEY_LABEL_ESC,
159
+ " to go back, or select a skill and press ",
160
+ KEY_LABEL_ENTER,
161
+ " to continue."
162
+ ] })
163
+ ] }) });
164
+ };
165
+ var StepBuild = ({
166
+ domain: activeDomain,
167
+ selectedDomains,
168
+ selections,
169
+ allSelections,
170
+ showLabels,
171
+ installedSkillIds,
172
+ onToggle,
173
+ onToggleLabels,
174
+ onContinue,
175
+ onBack
176
+ }) => {
177
+ const [validationError, setValidationError] = useState(void 0);
178
+ const { ref: gridRef, measuredHeight: gridHeight } = useMeasuredHeight();
179
+ const skillConfigs = useWizardStore((s) => s.skillConfigs);
180
+ const handleFocusedSkillChange = useCallback(
181
+ (id) => useWizardStore.getState().setFocusedSkillId(id),
182
+ []
183
+ );
184
+ const orderedDomains = useMemo2(() => orderDomains(selectedDomains), [selectedDomains]);
185
+ const categories = useFrameworkFiltering({
186
+ domain: activeDomain,
187
+ allSelections,
188
+ selections,
189
+ installedSkillIds,
190
+ skillConfigs
191
+ });
192
+ useInput((_input, key) => {
193
+ if (key.return) {
194
+ const validation = validateBuildStep(categories, selections);
195
+ if (validation.valid) {
196
+ setValidationError(void 0);
197
+ onContinue();
198
+ } else {
199
+ setValidationError(validation.message);
200
+ }
201
+ } else if (key.escape) {
202
+ setValidationError(void 0);
203
+ onBack();
204
+ }
205
+ });
206
+ return /* @__PURE__ */ jsxs(Box, { flexDirection: "column", width: "100%", flexGrow: 1, flexBasis: 0, children: [
207
+ /* @__PURE__ */ jsx(
208
+ Box,
209
+ {
210
+ columnGap: 2,
211
+ flexDirection: "row",
212
+ justifyContent: "space-between",
213
+ marginBottom: 1,
214
+ paddingRight: 1,
215
+ marginTop: -1,
216
+ borderTop: false,
217
+ borderRight: false,
218
+ borderLeft: false,
219
+ borderColor: CLI_COLORS.NEUTRAL,
220
+ borderStyle: "single",
221
+ children: /* @__PURE__ */ jsx(Box, { columnGap: 2, flexDirection: "row", children: orderedDomains.map((domain) => {
222
+ const isActive = domain === activeDomain;
223
+ return /* @__PURE__ */ jsx(Text, { color: isActive ? CLI_COLORS.WARNING : void 0, bold: isActive, children: getDomainDisplayName(domain) }, domain);
224
+ }) })
225
+ }
226
+ ),
227
+ /* @__PURE__ */ jsx(ViewTitle, { children: `Customize your ${getDomainDisplayName(activeDomain)} stack` }),
228
+ /* @__PURE__ */ jsx(Box, { ref: gridRef, flexGrow: 1, flexBasis: 0, children: /* @__PURE__ */ jsx(
229
+ CategoryGrid,
230
+ {
231
+ categories,
232
+ availableHeight: gridHeight,
233
+ showLabels,
234
+ onToggle,
235
+ onToggleLabels,
236
+ onFocusedSkillChange: handleFocusedSkillChange
237
+ },
238
+ activeDomain
239
+ ) }),
240
+ /* @__PURE__ */ jsx(Footer, { validationError })
241
+ ] });
242
+ };
243
+
244
+ export {
245
+ validateBuildStep,
246
+ StepBuild
247
+ };
248
+ //# sourceMappingURL=chunk-BGPGQF35.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/components/wizard/step-build.tsx","../src/cli/lib/wizard/index.ts","../src/cli/lib/wizard/build-step-logic.ts","../src/cli/components/hooks/use-framework-filtering.ts"],"sourcesContent":["import { Box, Text, useInput } from \"ink\";\nimport React, { useCallback, useMemo, useState } from \"react\";\nimport { CLI_COLORS } from \"../../consts.js\";\nimport { validateBuildStep } from \"../../lib/wizard/index.js\";\nimport type { Domain, SkillId, Category, CategorySelections } from \"../../types/index.js\";\nimport { useFrameworkFiltering } from \"../hooks/use-framework-filtering.js\";\nimport { useMeasuredHeight } from \"../hooks/use-measured-height.js\";\nimport { useWizardStore } from \"../../stores/wizard-store.js\";\nimport { CategoryGrid } from \"./category-grid.js\";\nimport { KEY_LABEL_ENTER, KEY_LABEL_ESC } from \"./hotkeys.js\";\nimport { getDomainDisplayName, orderDomains } from \"./utils.js\";\nimport { ViewTitle } from \"./view-title.js\";\n\nexport type StepBuildProps = {\n domain: Domain;\n selectedDomains: Domain[];\n selections: CategorySelections;\n allSelections: SkillId[];\n showLabels: boolean;\n /** Skill IDs already installed on disk, shown with a dimmed checkmark */\n installedSkillIds?: SkillId[];\n onToggle: (categoryId: Category, technologyId: SkillId) => void;\n onToggleLabels: () => void;\n onContinue: () => void;\n onBack: () => void;\n};\n\ntype FooterProps = {\n validationError?: string;\n};\n\nconst Footer: React.FC<FooterProps> = ({ validationError }) => {\n return (\n <Box flexDirection=\"column\" marginTop={1}>\n {validationError && (\n <Box flexDirection=\"column\" marginBottom={1}>\n <Text color={CLI_COLORS.WARNING}>{validationError}</Text>\n <Text dimColor>\n Press {KEY_LABEL_ESC} to go back, or select a skill and press {KEY_LABEL_ENTER} to\n continue.\n </Text>\n </Box>\n )}\n </Box>\n );\n};\n\nexport const StepBuild: React.FC<StepBuildProps> = ({\n domain: activeDomain,\n selectedDomains,\n selections,\n allSelections,\n showLabels,\n installedSkillIds,\n onToggle,\n onToggleLabels,\n onContinue,\n onBack,\n}) => {\n const [validationError, setValidationError] = useState<string | undefined>(undefined);\n const { ref: gridRef, measuredHeight: gridHeight } = useMeasuredHeight();\n const skillConfigs = useWizardStore((s) => s.skillConfigs);\n\n const handleFocusedSkillChange = useCallback(\n (id: SkillId | null) => useWizardStore.getState().setFocusedSkillId(id),\n [],\n );\n\n const orderedDomains = useMemo(() => orderDomains(selectedDomains), [selectedDomains]);\n\n const categories = useFrameworkFiltering({\n domain: activeDomain,\n allSelections,\n selections,\n installedSkillIds,\n skillConfigs,\n });\n\n useInput((_input, key) => {\n if (key.return) {\n const validation = validateBuildStep(categories, selections);\n if (validation.valid) {\n setValidationError(undefined);\n onContinue();\n } else {\n setValidationError(validation.message);\n }\n } else if (key.escape) {\n setValidationError(undefined);\n onBack();\n }\n });\n\n return (\n <Box flexDirection=\"column\" width=\"100%\" flexGrow={1} flexBasis={0}>\n <Box\n columnGap={2}\n flexDirection=\"row\"\n justifyContent=\"space-between\"\n marginBottom={1}\n paddingRight={1}\n marginTop={-1}\n borderTop={false}\n borderRight={false}\n borderLeft={false}\n borderColor={CLI_COLORS.NEUTRAL}\n borderStyle=\"single\"\n >\n <Box columnGap={2} flexDirection=\"row\">\n {orderedDomains.map((domain) => {\n const isActive = domain === activeDomain;\n return (\n <Text key={domain} color={isActive ? CLI_COLORS.WARNING : undefined} bold={isActive}>\n {getDomainDisplayName(domain)}\n </Text>\n );\n })}\n </Box>\n </Box>\n <ViewTitle>{`Customize your ${getDomainDisplayName(activeDomain)} stack`}</ViewTitle>\n\n <Box ref={gridRef} flexGrow={1} flexBasis={0}>\n <CategoryGrid\n key={activeDomain}\n categories={categories}\n availableHeight={gridHeight}\n showLabels={showLabels}\n onToggle={onToggle}\n onToggleLabels={onToggleLabels}\n onFocusedSkillChange={handleFocusedSkillChange}\n />\n </Box>\n\n <Footer validationError={validationError} />\n </Box>\n );\n};\n","export {\n type BuildStepValidation,\n validateBuildStep,\n computeOptionState,\n buildCategoriesForDomain,\n} from \"./build-step-logic\";\n","import { sortBy } from \"remeda\";\nimport type {\n CategoryDefinition,\n Domain,\n SkillId,\n SkillOption,\n CategorySelections,\n} from \"../../types/index.js\";\nimport type { SkillConfig } from \"../../types/config.js\";\nimport { getAvailableSkills, resolveAlias } from \"../matrix/index.js\";\nimport { findSkill, getMatrix } from \"../../stores/matrix-store.js\";\nimport type {\n CategoryRow,\n CategoryOption,\n OptionState,\n} from \"../../components/wizard/category-grid.js\";\n\nconst FRAMEWORK_CATEGORY_ID = \"web-framework\";\nconst WEB_DOMAIN_ID = \"web\";\n\nexport type BuildStepValidation = {\n valid: boolean;\n message?: string;\n};\n\nexport function validateBuildStep(\n categories: CategoryRow[],\n selections: CategorySelections,\n): BuildStepValidation {\n for (const category of categories) {\n if (category.required) {\n const categorySelections = selections[category.id] || [];\n if (categorySelections.length === 0) {\n return {\n valid: false,\n message: `Select at least one skill from the ${category.displayName} category. Use arrow keys to navigate, then SPACE to select.`,\n };\n }\n }\n }\n return { valid: true };\n}\n\nexport function computeOptionState(\n skill: Pick<SkillOption, \"discouraged\" | \"recommended\">,\n): OptionState {\n if (skill.discouraged) {\n return \"discouraged\";\n }\n if (skill.recommended) {\n return \"recommended\";\n }\n return \"normal\";\n}\n\nfunction getStateReason(\n skill: Pick<\n SkillOption,\n \"discouraged\" | \"discouragedReason\" | \"recommended\" | \"recommendedReason\"\n >,\n): string | undefined {\n if (skill.discouraged && skill.discouragedReason) {\n return skill.discouragedReason;\n }\n if (skill.recommended && skill.recommendedReason) {\n return skill.recommendedReason;\n }\n return undefined;\n}\n\nfunction isFrameworkSelected(selections: CategorySelections): boolean {\n const frameworkSelections = selections[FRAMEWORK_CATEGORY_ID] ?? [];\n return frameworkSelections.length > 0;\n}\n\nfunction getSelectedFrameworks(selections: CategorySelections): SkillId[] {\n const frameworkSelections = selections[FRAMEWORK_CATEGORY_ID] ?? [];\n return frameworkSelections.map((alias) => resolveAlias(alias));\n}\n\nfunction isCompatibleWithSelectedFrameworks(\n skillId: SkillId,\n selectedFrameworkIds: SkillId[],\n): boolean {\n const skill = findSkill(skillId);\n if (!skill) return false;\n\n // No compatibleWith = compatible with all (allows legacy skills to appear)\n if (skill.compatibleWith.length === 0) {\n return true;\n }\n\n return selectedFrameworkIds.some((frameworkId) => skill.compatibleWith.includes(frameworkId));\n}\n\n// Build CategoryRow[] from matrix for a domain, with framework-first filtering for web\nexport function buildCategoriesForDomain(\n domain: Domain,\n allSelections: SkillId[],\n selections: CategorySelections,\n installedSkillIds?: SkillId[],\n skillConfigs?: SkillConfig[],\n): CategoryRow[] {\n const matrix = getMatrix();\n const frameworkSource = selections;\n const frameworkSelected = isFrameworkSelected(frameworkSource);\n const selectedFrameworkIds = frameworkSelected ? getSelectedFrameworks(frameworkSource) : [];\n\n // Object.values() on a Partial record only yields values that exist — all are CategoryDefinition\n const categories = sortBy(\n (Object.values(matrix.categories) as CategoryDefinition[]).filter(\n (cat) => cat.domain === domain,\n ),\n (cat) => cat.order ?? 0,\n );\n\n const categoryRows: CategoryRow[] = categories.map((cat) => {\n const skillOptions = getAvailableSkills(cat.id, allSelections);\n\n const useFrameworkFilter =\n domain === WEB_DOMAIN_ID && cat.id !== FRAMEWORK_CATEGORY_ID && frameworkSelected;\n const filteredSkillOptions = useFrameworkFilter\n ? skillOptions.filter((skill) =>\n isCompatibleWithSelectedFrameworks(skill.id, selectedFrameworkIds),\n )\n : skillOptions;\n\n const options: CategoryOption[] = filteredSkillOptions.map((skill) => ({\n id: skill.id,\n state: computeOptionState(skill),\n stateReason: getStateReason(skill),\n selected: skill.selected,\n local: findSkill(skill.id)?.local,\n installed: installedSkillIds?.includes(skill.id) || false,\n scope: skillConfigs?.find((sc) => sc.id === skill.id)?.scope,\n }));\n\n return {\n id: cat.id,\n displayName: cat.displayName,\n required: cat.required ?? false,\n exclusive: cat.exclusive ?? true,\n options,\n };\n });\n\n return categoryRows.filter((row) => row.options.length > 0);\n}\n","import { useMemo } from \"react\";\nimport type { Domain, SkillId, CategorySelections } from \"../../types/index.js\";\nimport type { SkillConfig } from \"../../types/config.js\";\nimport { buildCategoriesForDomain } from \"../../lib/wizard/index.js\";\nimport type { CategoryRow } from \"../wizard/category-grid.js\";\n\ntype UseFrameworkFilteringOptions = {\n domain: Domain;\n allSelections: SkillId[];\n selections: CategorySelections;\n installedSkillIds?: SkillId[];\n skillConfigs?: SkillConfig[];\n};\n\nexport function useFrameworkFiltering({\n domain,\n allSelections,\n selections,\n installedSkillIds,\n skillConfigs,\n}: UseFrameworkFilteringOptions): CategoryRow[] {\n return useMemo(\n () =>\n buildCategoriesForDomain(domain, allSelections, selections, installedSkillIds, skillConfigs),\n [domain, allSelections, selections, installedSkillIds, skillConfigs],\n );\n}\n"],"mappings":"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","names":["useMemo","useMemo"]}
@@ -0,0 +1,45 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ init_esm_shims
4
+ } from "./chunk-DHET7RCE.js";
5
+
6
+ // src/cli/stores/matrix-store.ts
7
+ init_esm_shims();
8
+ import { create } from "zustand";
9
+ var useMatrixStore = create((set, get) => ({
10
+ matrix: null,
11
+ setMatrix: (matrix) => set({ matrix }),
12
+ reset: () => set({ matrix: null }),
13
+ getMatrix: () => {
14
+ const { matrix } = get();
15
+ if (!matrix) {
16
+ throw new Error("Matrix store not initialized \u2014 call setMatrix() after loading the matrix");
17
+ }
18
+ return matrix;
19
+ },
20
+ getSkill: (idOrSlug) => {
21
+ const { matrix } = get();
22
+ if (!matrix) return void 0;
23
+ const direct = matrix.skills[idOrSlug];
24
+ if (direct) return direct;
25
+ const id = matrix.slugMap.slugToId[idOrSlug];
26
+ return id ? matrix.skills[id] : void 0;
27
+ }
28
+ }));
29
+ var findSkill = (idOrSlug) => useMatrixStore.getState().getSkill(idOrSlug);
30
+ var getSkill = (idOrSlug) => {
31
+ const skill = useMatrixStore.getState().getSkill(idOrSlug);
32
+ if (!skill) {
33
+ throw new Error(`Skill '${idOrSlug}' not found in matrix store`);
34
+ }
35
+ return skill;
36
+ };
37
+ var getMatrix = () => useMatrixStore.getState().getMatrix();
38
+
39
+ export {
40
+ useMatrixStore,
41
+ findSkill,
42
+ getSkill,
43
+ getMatrix
44
+ };
45
+ //# sourceMappingURL=chunk-BKL3DF2Q.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/stores/matrix-store.ts"],"sourcesContent":["import { create } from \"zustand\";\nimport type { MergedSkillsMatrix, ResolvedSkill, SkillId, SkillSlug } from \"../types/index.js\";\n\ntype MatrixState = {\n matrix: MergedSkillsMatrix | null;\n\n setMatrix: (matrix: MergedSkillsMatrix) => void;\n reset: () => void;\n\n getMatrix: () => MergedSkillsMatrix;\n getSkill: (idOrSlug: SkillId | SkillSlug) => ResolvedSkill | undefined;\n};\n\nexport const useMatrixStore = create<MatrixState>((set, get) => ({\n matrix: null,\n\n setMatrix: (matrix) => set({ matrix }),\n reset: () => set({ matrix: null }),\n\n getMatrix: () => {\n const { matrix } = get();\n if (!matrix) {\n throw new Error(\"Matrix store not initialized — call setMatrix() after loading the matrix\");\n }\n return matrix;\n },\n\n getSkill: (idOrSlug) => {\n const { matrix } = get();\n if (!matrix) return undefined;\n const direct = matrix.skills[idOrSlug as SkillId];\n if (direct) return direct;\n const id = matrix.slugMap.slugToId[idOrSlug as SkillSlug];\n return id ? matrix.skills[id] : undefined;\n },\n}));\n\n/** Look up a skill — returns undefined if not found. Use for user input or optional lookups. */\nexport const findSkill = (idOrSlug: SkillId | SkillSlug): ResolvedSkill | undefined =>\n useMatrixStore.getState().getSkill(idOrSlug);\n\n/** Look up a skill — throws if not found. Use when the skill must exist. */\nexport const getSkill = (idOrSlug: SkillId | SkillSlug): ResolvedSkill => {\n const skill = useMatrixStore.getState().getSkill(idOrSlug);\n if (!skill) {\n throw new Error(`Skill '${idOrSlug}' not found in matrix store`);\n }\n return skill;\n};\n\nexport const getMatrix = () => useMatrixStore.getState().getMatrix();\n"],"mappings":";;;;;;AAAA;AAAA,SAAS,cAAc;AAahB,IAAM,iBAAiB,OAAoB,CAAC,KAAK,SAAS;AAAA,EAC/D,QAAQ;AAAA,EAER,WAAW,CAAC,WAAW,IAAI,EAAE,OAAO,CAAC;AAAA,EACrC,OAAO,MAAM,IAAI,EAAE,QAAQ,KAAK,CAAC;AAAA,EAEjC,WAAW,MAAM;AACf,UAAM,EAAE,OAAO,IAAI,IAAI;AACvB,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI,MAAM,+EAA0E;AAAA,IAC5F;AACA,WAAO;AAAA,EACT;AAAA,EAEA,UAAU,CAAC,aAAa;AACtB,UAAM,EAAE,OAAO,IAAI,IAAI;AACvB,QAAI,CAAC,OAAQ,QAAO;AACpB,UAAM,SAAS,OAAO,OAAO,QAAmB;AAChD,QAAI,OAAQ,QAAO;AACnB,UAAM,KAAK,OAAO,QAAQ,SAAS,QAAqB;AACxD,WAAO,KAAK,OAAO,OAAO,EAAE,IAAI;AAAA,EAClC;AACF,EAAE;AAGK,IAAM,YAAY,CAAC,aACxB,eAAe,SAAS,EAAE,SAAS,QAAQ;AAGtC,IAAM,WAAW,CAAC,aAAiD;AACxE,QAAM,QAAQ,eAAe,SAAS,EAAE,SAAS,QAAQ;AACzD,MAAI,CAAC,OAAO;AACV,UAAM,IAAI,MAAM,UAAU,QAAQ,6BAA6B;AAAA,EACjE;AACA,SAAO;AACT;AAEO,IAAM,YAAY,MAAM,eAAe,SAAS,EAAE,UAAU;","names":[]}