@agents-inc/cli 0.50.0 → 0.61.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 (237) hide show
  1. package/CHANGELOG.md +167 -5
  2. package/dist/{chunk-KQOU4POU.js → chunk-46DQG2N7.js} +72 -51
  3. package/dist/chunk-46DQG2N7.js.map +1 -0
  4. package/dist/{chunk-2BWCR762.js → chunk-52XO4ULK.js} +6 -8
  5. package/dist/chunk-52XO4ULK.js.map +1 -0
  6. package/dist/{chunk-DCE423KO.js → chunk-6DAZG54T.js} +5 -5
  7. package/dist/{chunk-AWP5A6IM.js → chunk-6OWHQ7HM.js} +14 -12
  8. package/dist/chunk-6OWHQ7HM.js.map +1 -0
  9. package/dist/{chunk-D72AFYQR.js → chunk-7FMEMXJ4.js} +71 -71
  10. package/dist/chunk-7FMEMXJ4.js.map +1 -0
  11. package/dist/{chunk-RA2IPRO2.js → chunk-AJJJE7F7.js} +2 -2
  12. package/dist/{chunk-4R52TQ3K.js → chunk-AX3SZZWA.js} +2 -2
  13. package/dist/{chunk-U2W5SENM.js → chunk-BFD5NZQ4.js} +5 -4
  14. package/dist/chunk-BFD5NZQ4.js.map +1 -0
  15. package/dist/{chunk-HYEUETIC.js → chunk-BKJHAJQW.js} +2 -2
  16. package/dist/{chunk-HYEUETIC.js.map → chunk-BKJHAJQW.js.map} +1 -1
  17. package/dist/{chunk-GBOW6FUW.js → chunk-BNQ5O6LE.js} +2 -2
  18. package/dist/{chunk-KAO3LKB5.js → chunk-C577AJE7.js} +3 -3
  19. package/dist/{chunk-C3Q43WLC.js → chunk-CIG7IKX3.js} +4 -4
  20. package/dist/chunk-EC3UJRKZ.js +1534 -0
  21. package/dist/chunk-EC3UJRKZ.js.map +1 -0
  22. package/dist/{chunk-HMSHB5EQ.js → chunk-FWMWWE3X.js} +3543 -3037
  23. package/dist/chunk-FWMWWE3X.js.map +1 -0
  24. package/dist/{chunk-YDYRAXSY.js → chunk-GH2RQ4MI.js} +6 -6
  25. package/dist/{chunk-5FPIKTSA.js → chunk-H5DASUX5.js} +7 -7
  26. package/dist/{chunk-JFF7P4LC.js → chunk-H7WJK7NJ.js} +22 -6
  27. package/dist/chunk-H7WJK7NJ.js.map +1 -0
  28. package/dist/chunk-HGTC76BX.js +16 -0
  29. package/dist/chunk-HGTC76BX.js.map +1 -0
  30. package/dist/{chunk-WFFV254H.js → chunk-IEEVXLJB.js} +110 -82
  31. package/dist/chunk-IEEVXLJB.js.map +1 -0
  32. package/dist/{chunk-5FCHJLM7.js → chunk-IGM6HA3S.js} +252 -38
  33. package/dist/chunk-IGM6HA3S.js.map +1 -0
  34. package/dist/{chunk-QB5HHTAA.js → chunk-KD2YS76O.js} +28 -12
  35. package/dist/chunk-KD2YS76O.js.map +1 -0
  36. package/dist/{chunk-5L724R4C.js → chunk-KDO6WU76.js} +8 -13
  37. package/dist/chunk-KDO6WU76.js.map +1 -0
  38. package/dist/{chunk-XDSVV5GZ.js → chunk-KIWFEBKH.js} +41 -11
  39. package/dist/chunk-KIWFEBKH.js.map +1 -0
  40. package/dist/{chunk-WBHPCBVN.js → chunk-LWXRUR6B.js} +66 -94
  41. package/dist/chunk-LWXRUR6B.js.map +1 -0
  42. package/dist/{chunk-SPFHPHYL.js → chunk-M6YWRMXH.js} +24 -14
  43. package/dist/chunk-M6YWRMXH.js.map +1 -0
  44. package/dist/{chunk-CMNKHDOX.js → chunk-MGNYPVOJ.js} +2 -2
  45. package/dist/{chunk-U7X4V4HE.js → chunk-MMFQNJPE.js} +2 -2
  46. package/dist/{chunk-WLZHCM7O.js → chunk-MR6OBL3B.js} +3 -11
  47. package/dist/{chunk-WLZHCM7O.js.map → chunk-MR6OBL3B.js.map} +1 -1
  48. package/dist/{chunk-RFKDGJAJ.js → chunk-O6BA7Q2B.js} +6 -6
  49. package/dist/chunk-O6BA7Q2B.js.map +1 -0
  50. package/dist/chunk-OCEFD7V6.js +201 -0
  51. package/dist/chunk-OCEFD7V6.js.map +1 -0
  52. package/dist/{chunk-YZTWZVGX.js → chunk-PUT7X3GA.js} +1 -1
  53. package/dist/chunk-PUT7X3GA.js.map +1 -0
  54. package/dist/{chunk-QYLCINGC.js → chunk-SDKCQXWE.js} +2 -2
  55. package/dist/{chunk-RDWGYKDY.js → chunk-SDLDPFNV.js} +6 -6
  56. package/dist/{chunk-7LV4V6A4.js → chunk-SRBN6RRD.js} +14 -10
  57. package/dist/chunk-SRBN6RRD.js.map +1 -0
  58. package/dist/{chunk-PGY5XROM.js → chunk-VR3CDXDT.js} +2 -6
  59. package/dist/chunk-VR3CDXDT.js.map +1 -0
  60. package/dist/{chunk-I6IOGZSZ.js → chunk-WHISPMAQ.js} +11 -15
  61. package/dist/chunk-WHISPMAQ.js.map +1 -0
  62. package/dist/{chunk-3VOL4WEG.js → chunk-WYVDNGJB.js} +3 -3
  63. package/dist/{chunk-WJHFV6RI.js → chunk-X5EG4EFP.js} +2 -2
  64. package/dist/{chunk-JWYRXE6C.js → chunk-XUDTFI4M.js} +2 -2
  65. package/dist/{chunk-4QWDB2MD.js → chunk-YHOHLNHM.js} +127 -105
  66. package/dist/chunk-YHOHLNHM.js.map +1 -0
  67. package/dist/{chunk-M3GQ2R3E.js → chunk-Z3TM4N37.js} +19 -7
  68. package/dist/chunk-Z3TM4N37.js.map +1 -0
  69. package/dist/commands/build/marketplace.js +4 -4
  70. package/dist/commands/build/plugins.js +9 -7
  71. package/dist/commands/build/plugins.js.map +1 -1
  72. package/dist/commands/build/stack.js +13 -10
  73. package/dist/commands/build/stack.js.map +1 -1
  74. package/dist/commands/compile.js +110 -129
  75. package/dist/commands/compile.js.map +1 -1
  76. package/dist/commands/config/index.js +7 -5
  77. package/dist/commands/config/index.js.map +1 -1
  78. package/dist/commands/config/path.js +8 -6
  79. package/dist/commands/config/path.js.map +1 -1
  80. package/dist/commands/config/show.js +7 -5
  81. package/dist/commands/diff.js +9 -7
  82. package/dist/commands/diff.js.map +1 -1
  83. package/dist/commands/doctor.js +20 -16
  84. package/dist/commands/doctor.js.map +1 -1
  85. package/dist/commands/edit.js +175 -79
  86. package/dist/commands/edit.js.map +1 -1
  87. package/dist/commands/eject.js +20 -41
  88. package/dist/commands/eject.js.map +1 -1
  89. package/dist/commands/import/skill.js +10 -18
  90. package/dist/commands/import/skill.js.map +1 -1
  91. package/dist/commands/info.js +21 -20
  92. package/dist/commands/info.js.map +1 -1
  93. package/dist/commands/init.js +32 -31
  94. package/dist/commands/list.js +8 -6
  95. package/dist/commands/list.js.map +1 -1
  96. package/dist/commands/new/agent.js +23 -11
  97. package/dist/commands/new/agent.js.map +1 -1
  98. package/dist/commands/new/marketplace.js +63 -46
  99. package/dist/commands/new/marketplace.js.map +1 -1
  100. package/dist/commands/new/skill.js +11 -9
  101. package/dist/commands/outdated.js +9 -7
  102. package/dist/commands/outdated.js.map +1 -1
  103. package/dist/commands/search.js +45 -35
  104. package/dist/commands/search.js.map +1 -1
  105. package/dist/commands/uninstall.js +93 -123
  106. package/dist/commands/uninstall.js.map +1 -1
  107. package/dist/commands/update.js +11 -9
  108. package/dist/commands/update.js.map +1 -1
  109. package/dist/commands/validate.js +23 -27
  110. package/dist/commands/validate.js.map +1 -1
  111. package/dist/components/common/confirm.test.js +4 -4
  112. package/dist/components/skill-search/skill-search.js +3 -3
  113. package/dist/components/wizard/category-grid.js +3 -3
  114. package/dist/components/wizard/category-grid.test.js +4 -4
  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 +6 -6
  118. package/dist/components/wizard/domain-selection.js +12 -11
  119. package/dist/components/wizard/help-modal.js +2 -2
  120. package/dist/components/wizard/menu-item.js +1 -1
  121. package/dist/components/wizard/search-modal.js +2 -2
  122. package/dist/components/wizard/search-modal.test.js +3 -3
  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 +4 -4
  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 +4 -4
  129. package/dist/components/wizard/source-grid.test.js +5 -5
  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 +13 -12
  134. package/dist/components/wizard/step-agents.test.js.map +1 -1
  135. package/dist/components/wizard/step-build.js +11 -9
  136. package/dist/components/wizard/step-build.test.js +18 -22
  137. package/dist/components/wizard/step-build.test.js.map +1 -1
  138. package/dist/components/wizard/step-confirm.js +4 -4
  139. package/dist/components/wizard/step-confirm.test.js +83 -23
  140. package/dist/components/wizard/step-confirm.test.js.map +1 -1
  141. package/dist/components/wizard/step-refine.js +2 -2
  142. package/dist/components/wizard/step-refine.test.js +3 -3
  143. package/dist/components/wizard/step-settings.js +9 -7
  144. package/dist/components/wizard/step-settings.test.js +13 -11
  145. package/dist/components/wizard/step-settings.test.js.map +1 -1
  146. package/dist/components/wizard/step-sources.js +13 -11
  147. package/dist/components/wizard/step-sources.test.js +19 -17
  148. package/dist/components/wizard/step-sources.test.js.map +1 -1
  149. package/dist/components/wizard/step-stack.js +15 -14
  150. package/dist/components/wizard/step-stack.test.js +17 -16
  151. package/dist/components/wizard/step-stack.test.js.map +1 -1
  152. package/dist/components/wizard/view-title.js +2 -2
  153. package/dist/components/wizard/wizard-layout.js +10 -8
  154. package/dist/components/wizard/wizard-tabs.js +2 -2
  155. package/dist/components/wizard/wizard-tabs.test.js +2 -2
  156. package/dist/components/wizard/wizard.js +29 -27
  157. package/dist/config-exports.js +20 -0
  158. package/dist/config-exports.js.map +1 -0
  159. package/dist/hooks/init.js +34 -33
  160. package/dist/hooks/init.js.map +1 -1
  161. package/dist/loader-2O32KKAQ.js +19 -0
  162. package/dist/source-loader-KMEBBZCQ.js +16 -0
  163. package/dist/source-loader-KMEBBZCQ.js.map +1 -0
  164. package/dist/source-manager-5XBSPJNR.js +18 -0
  165. package/dist/source-manager-5XBSPJNR.js.map +1 -0
  166. package/dist/src/agents/meta/agent-summoner/workflow.md +3 -3
  167. package/dist/src/agents/meta/skill-summoner/critical-reminders.md +2 -2
  168. package/dist/src/agents/meta/skill-summoner/critical-requirements.md +1 -1
  169. package/dist/src/agents/meta/skill-summoner/intro.md +1 -1
  170. package/dist/src/agents/meta/skill-summoner/output-format.md +3 -3
  171. package/dist/src/agents/meta/skill-summoner/workflow.md +8 -8
  172. package/dist/stores/wizard-store.js +6 -5
  173. package/dist/stores/wizard-store.test.js +299 -59
  174. package/dist/stores/wizard-store.test.js.map +1 -1
  175. package/package.json +5 -1
  176. package/src/agents/meta/agent-summoner/workflow.md +3 -3
  177. package/src/agents/meta/skill-summoner/critical-reminders.md +2 -2
  178. package/src/agents/meta/skill-summoner/critical-requirements.md +1 -1
  179. package/src/agents/meta/skill-summoner/intro.md +1 -1
  180. package/src/agents/meta/skill-summoner/output-format.md +3 -3
  181. package/src/agents/meta/skill-summoner/workflow.md +8 -8
  182. package/src/schemas/metadata.schema.json +6 -0
  183. package/src/schemas/stacks.schema.json +1 -1
  184. package/config/skill-categories.yaml +0 -344
  185. package/config/skill-rules.yaml +0 -740
  186. package/config/stacks.yaml +0 -1864
  187. package/dist/chunk-26MXZUHU.js +0 -183
  188. package/dist/chunk-26MXZUHU.js.map +0 -1
  189. package/dist/chunk-2BWCR762.js.map +0 -1
  190. package/dist/chunk-4QWDB2MD.js.map +0 -1
  191. package/dist/chunk-5FCHJLM7.js.map +0 -1
  192. package/dist/chunk-5L724R4C.js.map +0 -1
  193. package/dist/chunk-7LV4V6A4.js.map +0 -1
  194. package/dist/chunk-AWP5A6IM.js.map +0 -1
  195. package/dist/chunk-D72AFYQR.js.map +0 -1
  196. package/dist/chunk-HMSHB5EQ.js.map +0 -1
  197. package/dist/chunk-I6IOGZSZ.js.map +0 -1
  198. package/dist/chunk-JFF7P4LC.js.map +0 -1
  199. package/dist/chunk-KQOU4POU.js.map +0 -1
  200. package/dist/chunk-M3GQ2R3E.js.map +0 -1
  201. package/dist/chunk-PGY5XROM.js.map +0 -1
  202. package/dist/chunk-QB5HHTAA.js.map +0 -1
  203. package/dist/chunk-RFKDGJAJ.js.map +0 -1
  204. package/dist/chunk-SPFHPHYL.js.map +0 -1
  205. package/dist/chunk-U2W5SENM.js.map +0 -1
  206. package/dist/chunk-UAD3SC27.js +0 -107
  207. package/dist/chunk-UAD3SC27.js.map +0 -1
  208. package/dist/chunk-WBHPCBVN.js.map +0 -1
  209. package/dist/chunk-WFFV254H.js.map +0 -1
  210. package/dist/chunk-XDSVV5GZ.js.map +0 -1
  211. package/dist/chunk-YZTWZVGX.js.map +0 -1
  212. package/dist/commands/config/get.js +0 -61
  213. package/dist/commands/config/get.js.map +0 -1
  214. package/dist/commands/config/set-project.js +0 -61
  215. package/dist/commands/config/set-project.js.map +0 -1
  216. package/dist/commands/config/unset-project.js +0 -57
  217. package/dist/commands/config/unset-project.js.map +0 -1
  218. package/dist/config/skill-categories.yaml +0 -344
  219. package/dist/config/skill-rules.yaml +0 -740
  220. package/dist/config/stacks.yaml +0 -1864
  221. package/dist/source-manager-BVB2SG73.js +0 -16
  222. /package/dist/{chunk-DCE423KO.js.map → chunk-6DAZG54T.js.map} +0 -0
  223. /package/dist/{chunk-RA2IPRO2.js.map → chunk-AJJJE7F7.js.map} +0 -0
  224. /package/dist/{chunk-4R52TQ3K.js.map → chunk-AX3SZZWA.js.map} +0 -0
  225. /package/dist/{chunk-GBOW6FUW.js.map → chunk-BNQ5O6LE.js.map} +0 -0
  226. /package/dist/{chunk-KAO3LKB5.js.map → chunk-C577AJE7.js.map} +0 -0
  227. /package/dist/{chunk-C3Q43WLC.js.map → chunk-CIG7IKX3.js.map} +0 -0
  228. /package/dist/{chunk-YDYRAXSY.js.map → chunk-GH2RQ4MI.js.map} +0 -0
  229. /package/dist/{chunk-5FPIKTSA.js.map → chunk-H5DASUX5.js.map} +0 -0
  230. /package/dist/{chunk-CMNKHDOX.js.map → chunk-MGNYPVOJ.js.map} +0 -0
  231. /package/dist/{chunk-U7X4V4HE.js.map → chunk-MMFQNJPE.js.map} +0 -0
  232. /package/dist/{chunk-QYLCINGC.js.map → chunk-SDKCQXWE.js.map} +0 -0
  233. /package/dist/{chunk-RDWGYKDY.js.map → chunk-SDLDPFNV.js.map} +0 -0
  234. /package/dist/{chunk-3VOL4WEG.js.map → chunk-WYVDNGJB.js.map} +0 -0
  235. /package/dist/{chunk-WJHFV6RI.js.map → chunk-X5EG4EFP.js.map} +0 -0
  236. /package/dist/{chunk-JWYRXE6C.js.map → chunk-XUDTFI4M.js.map} +0 -0
  237. /package/dist/{source-manager-BVB2SG73.js.map → loader-2O32KKAQ.js.map} +0 -0
@@ -4,21 +4,22 @@ import {
4
4
  } from "./chunk-K77I4XGL.js";
5
5
  import {
6
6
  CategoryGrid
7
- } from "./chunk-JFF7P4LC.js";
7
+ } from "./chunk-H7WJK7NJ.js";
8
8
  import {
9
9
  getDomainDisplayName,
10
10
  orderDomains
11
- } from "./chunk-HYEUETIC.js";
11
+ } from "./chunk-BKJHAJQW.js";
12
12
  import {
13
13
  ViewTitle
14
- } from "./chunk-CMNKHDOX.js";
14
+ } from "./chunk-MGNYPVOJ.js";
15
15
  import {
16
16
  buildCategoriesForDomain,
17
+ useWizardStore,
17
18
  validateBuildStep
18
- } from "./chunk-UAD3SC27.js";
19
+ } from "./chunk-IGM6HA3S.js";
19
20
  import {
20
21
  CLI_COLORS
21
- } from "./chunk-AWP5A6IM.js";
22
+ } from "./chunk-6OWHQ7HM.js";
22
23
  import {
23
24
  init_esm_shims
24
25
  } from "./chunk-DHET7RCE.js";
@@ -26,7 +27,7 @@ import {
26
27
  // src/cli/components/wizard/step-build.tsx
27
28
  init_esm_shims();
28
29
  import { Box, Text, useInput } from "ink";
29
- import { useMemo as useMemo2, useState } from "react";
30
+ import { useCallback, useMemo as useMemo2, useState } from "react";
30
31
 
31
32
  // src/cli/lib/wizard/index.ts
32
33
  init_esm_shims();
@@ -39,11 +40,19 @@ function useFrameworkFiltering({
39
40
  allSelections,
40
41
  matrix,
41
42
  selections,
42
- installedSkillIds
43
+ installedSkillIds,
44
+ skillConfigs
43
45
  }) {
44
46
  return useMemo(
45
- () => buildCategoriesForDomain(domain, allSelections, matrix, selections, installedSkillIds),
46
- [domain, allSelections, matrix, selections, installedSkillIds]
47
+ () => buildCategoriesForDomain(
48
+ domain,
49
+ allSelections,
50
+ matrix,
51
+ selections,
52
+ installedSkillIds,
53
+ skillConfigs
54
+ ),
55
+ [domain, allSelections, matrix, selections, installedSkillIds, skillConfigs]
47
56
  );
48
57
  }
49
58
 
@@ -70,13 +79,19 @@ var StepBuild = ({
70
79
  }) => {
71
80
  const [validationError, setValidationError] = useState(void 0);
72
81
  const { ref: gridRef, measuredHeight: gridHeight } = useMeasuredHeight();
82
+ const skillConfigs = useWizardStore((s) => s.skillConfigs);
83
+ const handleFocusedSkillChange = useCallback(
84
+ (id) => useWizardStore.getState().setFocusedSkillId(id),
85
+ []
86
+ );
73
87
  const orderedDomains = useMemo2(() => orderDomains(selectedDomains), [selectedDomains]);
74
88
  const categories = useFrameworkFiltering({
75
89
  domain: activeDomain,
76
90
  allSelections,
77
91
  matrix,
78
92
  selections,
79
- installedSkillIds
93
+ installedSkillIds,
94
+ skillConfigs
80
95
  });
81
96
  useInput((_input, key) => {
82
97
  if (key.return) {
@@ -121,7 +136,8 @@ var StepBuild = ({
121
136
  availableHeight: gridHeight,
122
137
  showLabels,
123
138
  onToggle,
124
- onToggleLabels
139
+ onToggleLabels,
140
+ onFocusedSkillChange: handleFocusedSkillChange
125
141
  },
126
142
  activeDomain
127
143
  ) }),
@@ -132,4 +148,4 @@ var StepBuild = ({
132
148
  export {
133
149
  StepBuild
134
150
  };
135
- //# sourceMappingURL=chunk-QB5HHTAA.js.map
151
+ //# sourceMappingURL=chunk-KD2YS76O.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/components/wizard/step-build.tsx","../src/cli/lib/wizard/index.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 {\n Domain,\n MergedSkillsMatrix,\n SkillId,\n Category,\n CategorySelections,\n} 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 { getDomainDisplayName, orderDomains } from \"./utils.js\";\nimport { ViewTitle } from \"./view-title.js\";\n\nexport type StepBuildProps = {\n matrix: MergedSkillsMatrix;\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>Press ESC to go back, or select a skill and press ENTER to continue.</Text>\n </Box>\n )}\n </Box>\n );\n};\n\nexport const StepBuild: React.FC<StepBuildProps> = ({\n matrix,\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 matrix,\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 getSkillDisplayLabel,\n buildCategoriesForDomain,\n} from \"./build-step-logic\";\n","import { useMemo } from \"react\";\nimport type { Domain, MergedSkillsMatrix, 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 matrix: MergedSkillsMatrix;\n selections: CategorySelections;\n installedSkillIds?: SkillId[];\n skillConfigs?: SkillConfig[];\n};\n\nexport function useFrameworkFiltering({\n domain,\n allSelections,\n matrix,\n selections,\n installedSkillIds,\n skillConfigs,\n}: UseFrameworkFilteringOptions): CategoryRow[] {\n return useMemo(\n () =>\n buildCategoriesForDomain(\n domain,\n allSelections,\n matrix,\n selections,\n installedSkillIds,\n skillConfigs,\n ),\n [domain, allSelections, matrix, selections, installedSkillIds, skillConfigs],\n );\n}\n"],"mappings":"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","names":["useMemo","useMemo"]}
@@ -1,19 +1,17 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
- getDomainDisplayName
4
- } from "./chunk-HYEUETIC.js";
3
+ getDomainDisplayName,
4
+ orderDomains
5
+ } from "./chunk-BKJHAJQW.js";
5
6
  import {
6
7
  CheckboxGrid
7
- } from "./chunk-C3Q43WLC.js";
8
+ } from "./chunk-CIG7IKX3.js";
8
9
  import {
9
10
  useWizardStore
10
- } from "./chunk-5FCHJLM7.js";
11
+ } from "./chunk-IGM6HA3S.js";
11
12
  import {
12
13
  typedEntries
13
14
  } from "./chunk-T4EXUIBY.js";
14
- import {
15
- BUILT_IN_DOMAIN_ORDER
16
- } from "./chunk-AWP5A6IM.js";
17
15
  import {
18
16
  init_esm_shims
19
17
  } from "./chunk-DHET7RCE.js";
@@ -34,12 +32,9 @@ var DomainSelection = ({ matrix }) => {
34
32
  const { selectedDomains, toggleDomain, setStep, setApproach, selectStack } = useWizardStore();
35
33
  const availableDomains = useMemo(() => {
36
34
  const matrixDomains = unique(
37
- typedEntries(matrix.categories).map(([, cat]) => cat?.domain).filter((d) => d != null && d !== "shared")
35
+ typedEntries(matrix.categories).map(([, cat]) => cat?.domain).filter((d) => d != null)
38
36
  );
39
- const ordered = [
40
- ...BUILT_IN_DOMAIN_ORDER.filter((d) => matrixDomains.includes(d)),
41
- ...matrixDomains.filter((d) => !BUILT_IN_DOMAIN_ORDER.includes(d))
42
- ];
37
+ const ordered = orderDomains(matrixDomains);
43
38
  return ordered.map((domain) => ({
44
39
  id: domain,
45
40
  label: getDomainDisplayName(domain),
@@ -67,4 +62,4 @@ var DomainSelection = ({ matrix }) => {
67
62
  export {
68
63
  DomainSelection
69
64
  };
70
- //# sourceMappingURL=chunk-5L724R4C.js.map
65
+ //# sourceMappingURL=chunk-KDO6WU76.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/components/wizard/domain-selection.tsx"],"sourcesContent":["import React, { useMemo } from \"react\";\nimport { unique } from \"remeda\";\nimport { useWizardStore } from \"../../stores/wizard-store.js\";\nimport type { Domain, MergedSkillsMatrix } from \"../../types/index.js\";\nimport { typedEntries } from \"../../utils/typed-object.js\";\nimport { CheckboxGrid, type CheckboxItem } from \"./checkbox-grid.js\";\nimport { getDomainDisplayName, orderDomains } from \"./utils.js\";\n\nconst BUILT_IN_DOMAIN_DESCRIPTIONS: Record<Domain, string> = {\n web: \"Frontend web applications\",\n api: \"Backend APIs and services\",\n cli: \"Command-line tools\",\n mobile: \"Mobile applications\",\n shared: \"Shared utilities and methodology\",\n};\n\ntype DomainSelectionProps = {\n matrix: MergedSkillsMatrix;\n};\n\nexport const DomainSelection: React.FC<DomainSelectionProps> = ({ matrix }) => {\n const { selectedDomains, toggleDomain, setStep, setApproach, selectStack } = useWizardStore();\n\n const availableDomains = useMemo((): CheckboxItem<Domain>[] => {\n const matrixDomains = unique(\n typedEntries(matrix.categories)\n .map(([, cat]) => cat?.domain)\n .filter((d): d is Domain => d != null),\n );\n\n const ordered = orderDomains(matrixDomains);\n\n return ordered.map((domain) => ({\n id: domain,\n label: getDomainDisplayName(domain),\n description: BUILT_IN_DOMAIN_DESCRIPTIONS[domain] ?? `${getDomainDisplayName(domain)} skills`,\n }));\n }, [matrix]);\n\n const handleBack = () => {\n setApproach(null);\n selectStack(null);\n };\n\n return (\n <CheckboxGrid\n title=\"Select domains to configure\"\n // subtitle=\"Select one or more domains, then continue\"\n items={availableDomains}\n selectedIds={selectedDomains}\n onToggle={toggleDomain}\n onContinue={() => setStep(\"build\")}\n onBack={handleBack}\n emptyMessage=\"Please select at least one domain\"\n />\n );\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA,SAAgB,eAAe;AAC/B,SAAS,cAAc;AA4CnB;AArCJ,IAAM,+BAAuD;AAAA,EAC3D,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,QAAQ;AACV;AAMO,IAAM,kBAAkD,CAAC,EAAE,OAAO,MAAM;AAC7E,QAAM,EAAE,iBAAiB,cAAc,SAAS,aAAa,YAAY,IAAI,eAAe;AAE5F,QAAM,mBAAmB,QAAQ,MAA8B;AAC7D,UAAM,gBAAgB;AAAA,MACpB,aAAa,OAAO,UAAU,EAC3B,IAAI,CAAC,CAAC,EAAE,GAAG,MAAM,KAAK,MAAM,EAC5B,OAAO,CAAC,MAAmB,KAAK,IAAI;AAAA,IACzC;AAEA,UAAM,UAAU,aAAa,aAAa;AAE1C,WAAO,QAAQ,IAAI,CAAC,YAAY;AAAA,MAC9B,IAAI;AAAA,MACJ,OAAO,qBAAqB,MAAM;AAAA,MAClC,aAAa,6BAA6B,MAAM,KAAK,GAAG,qBAAqB,MAAM,CAAC;AAAA,IACtF,EAAE;AAAA,EACJ,GAAG,CAAC,MAAM,CAAC;AAEX,QAAM,aAAa,MAAM;AACvB,gBAAY,IAAI;AAChB,gBAAY,IAAI;AAAA,EAClB;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAM;AAAA,MAEN,OAAO;AAAA,MACP,aAAa;AAAA,MACb,UAAU;AAAA,MACV,YAAY,MAAM,QAAQ,OAAO;AAAA,MACjC,QAAQ;AAAA,MACR,cAAa;AAAA;AAAA,EACf;AAEJ;","names":[]}
@@ -1,13 +1,13 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  getDomainDisplayName
4
- } from "./chunk-HYEUETIC.js";
4
+ } from "./chunk-BKJHAJQW.js";
5
5
  import {
6
6
  ViewTitle
7
- } from "./chunk-CMNKHDOX.js";
7
+ } from "./chunk-MGNYPVOJ.js";
8
8
  import {
9
9
  CLI_COLORS
10
- } from "./chunk-AWP5A6IM.js";
10
+ } from "./chunk-6OWHQ7HM.js";
11
11
  import {
12
12
  init_esm_shims
13
13
  } from "./chunk-DHET7RCE.js";
@@ -15,7 +15,15 @@ import {
15
15
  // src/cli/components/wizard/step-confirm.tsx
16
16
  init_esm_shims();
17
17
  import { Box, Text, useInput } from "ink";
18
- import { jsx, jsxs } from "react/jsx-runtime";
18
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
19
+ var getInstallModeLabel = (skillConfigs) => {
20
+ if (skillConfigs.length === 0) return "Local (editable copies)";
21
+ const localCount = skillConfigs.filter((s) => s.source === "local").length;
22
+ const pluginCount = skillConfigs.length - localCount;
23
+ if (localCount === 0) return "Plugin";
24
+ if (pluginCount === 0) return "Local (editable copies)";
25
+ return `Mixed (${localCount} local, ${pluginCount} plugin)`;
26
+ };
19
27
  var StepConfirm = ({
20
28
  onComplete,
21
29
  stackName,
@@ -24,7 +32,8 @@ var StepConfirm = ({
24
32
  technologyCount,
25
33
  skillCount,
26
34
  agentCount,
27
- installMode,
35
+ skillConfigs,
36
+ agentConfigs,
28
37
  onBack
29
38
  }) => {
30
39
  useInput((_input, key) => {
@@ -69,12 +78,33 @@ var StepConfirm = ({
69
78
  agentCount !== void 0 && /* @__PURE__ */ jsxs(Text, { children: [
70
79
  /* @__PURE__ */ jsx(Text, { dimColor: true, children: "Agents:" }),
71
80
  " ",
72
- /* @__PURE__ */ jsx(Text, { bold: true, children: agentCount })
81
+ /* @__PURE__ */ jsx(Text, { bold: true, children: agentCount }),
82
+ agentConfigs && agentConfigs.length > 0 && /* @__PURE__ */ jsxs(Text, { children: [
83
+ " ",
84
+ /* @__PURE__ */ jsxs(Text, { dimColor: true, children: [
85
+ "(",
86
+ agentConfigs.filter((a) => a.scope === "project").length,
87
+ " project",
88
+ agentConfigs.some((a) => a.scope === "global") && `, ${agentConfigs.filter((a) => a.scope === "global").length} global`,
89
+ ")"
90
+ ] })
91
+ ] })
73
92
  ] }),
74
- installMode && /* @__PURE__ */ jsxs(Text, { children: [
75
- /* @__PURE__ */ jsx(Text, { dimColor: true, children: "Install mode:" }),
76
- " ",
77
- /* @__PURE__ */ jsx(Text, { bold: true, children: installMode === "plugin" ? "Plugin" : "Local" })
93
+ skillConfigs && skillConfigs.length > 0 && /* @__PURE__ */ jsxs(Fragment, { children: [
94
+ /* @__PURE__ */ jsxs(Text, { children: [
95
+ /* @__PURE__ */ jsx(Text, { dimColor: true, children: "Install mode:" }),
96
+ " ",
97
+ /* @__PURE__ */ jsx(Text, { bold: true, children: getInstallModeLabel(skillConfigs) })
98
+ ] }),
99
+ /* @__PURE__ */ jsxs(Text, { children: [
100
+ /* @__PURE__ */ jsx(Text, { dimColor: true, children: "Scope:" }),
101
+ " ",
102
+ /* @__PURE__ */ jsxs(Text, { bold: true, children: [
103
+ skillConfigs.filter((s) => s.scope === "project").length,
104
+ " project",
105
+ skillConfigs.some((s) => s.scope === "global") && `, ${skillConfigs.filter((s) => s.scope === "global").length} global`
106
+ ] })
107
+ ] })
78
108
  ] })
79
109
  ] }),
80
110
  /* @__PURE__ */ jsx(Box, { marginTop: 1, children: /* @__PURE__ */ jsx(Text, { dimColor: true, children: "ENTER install ESC go back" }) })
@@ -84,4 +114,4 @@ var StepConfirm = ({
84
114
  export {
85
115
  StepConfirm
86
116
  };
87
- //# sourceMappingURL=chunk-XDSVV5GZ.js.map
117
+ //# sourceMappingURL=chunk-KIWFEBKH.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/components/wizard/step-confirm.tsx"],"sourcesContent":["import { Box, Text, useInput } from \"ink\";\nimport React from \"react\";\nimport { CLI_COLORS } from \"../../consts.js\";\nimport type { AgentScopeConfig, SkillConfig } from \"../../types/config.js\";\nimport type { Domain, DomainSelections } from \"../../types/index.js\";\nimport { getDomainDisplayName } from \"./utils.js\";\nimport { ViewTitle } from \"./view-title.js\";\n\ntype StepConfirmProps = {\n onComplete: () => void;\n stackName?: string;\n selectedDomains?: Domain[];\n domainSelections?: DomainSelections;\n technologyCount?: number;\n skillCount?: number;\n agentCount?: number;\n skillConfigs?: SkillConfig[];\n agentConfigs?: AgentScopeConfig[];\n onBack?: () => void;\n};\n\nconst getInstallModeLabel = (skillConfigs: SkillConfig[]): string => {\n if (skillConfigs.length === 0) return \"Local (editable copies)\";\n\n const localCount = skillConfigs.filter((s) => s.source === \"local\").length;\n const pluginCount = skillConfigs.length - localCount;\n\n if (localCount === 0) return \"Plugin\";\n if (pluginCount === 0) return \"Local (editable copies)\";\n return `Mixed (${localCount} local, ${pluginCount} plugin)`;\n};\n\nexport const StepConfirm: React.FC<StepConfirmProps> = ({\n onComplete,\n stackName,\n selectedDomains,\n domainSelections,\n technologyCount,\n skillCount,\n agentCount,\n skillConfigs,\n agentConfigs,\n onBack,\n}) => {\n useInput((_input, key) => {\n if (key.return) {\n onComplete();\n }\n if (key.escape && onBack) {\n onBack();\n }\n });\n\n const domainsText = selectedDomains?.map(getDomainDisplayName).join(\" + \") || \"\";\n const title = stackName\n ? `Ready to install ${stackName}`\n : `Ready to install your custom stack${domainsText ? ` (${domainsText})` : \"\"}`;\n\n return (\n <Box flexDirection=\"column\" paddingX={2}>\n <ViewTitle>{title}</ViewTitle>\n <Text> </Text>\n\n {domainSelections && selectedDomains && !stackName && (\n <Box flexDirection=\"column\" marginBottom={1}>\n {selectedDomains.map((domain) => {\n const selections = domainSelections[domain] || {};\n const techs = Object.values(selections).flat();\n if (techs.length === 0) return null;\n return (\n <Text key={domain}>\n <Text bold>{getDomainDisplayName(domain)}:</Text> <Text>{techs.join(\", \")}</Text>\n </Text>\n );\n })}\n </Box>\n )}\n\n <Box flexDirection=\"column\" marginY={1}>\n {technologyCount !== undefined && (\n <Text>\n <Text dimColor>Technologies:</Text> <Text bold>{technologyCount}</Text>\n </Text>\n )}\n {skillCount !== undefined && (\n <Text>\n <Text dimColor>Skills:</Text> <Text bold>{skillCount}</Text>{\" \"}\n <Text color={CLI_COLORS.PRIMARY}>(all verified)</Text>\n </Text>\n )}\n {agentCount !== undefined && (\n <Text>\n <Text dimColor>Agents:</Text> <Text bold>{agentCount}</Text>\n {agentConfigs && agentConfigs.length > 0 && (\n <Text>\n {\" \"}\n <Text dimColor>\n ({agentConfigs.filter((a) => a.scope === \"project\").length} project\n {agentConfigs.some((a) => a.scope === \"global\") &&\n `, ${agentConfigs.filter((a) => a.scope === \"global\").length} global`}\n )\n </Text>\n </Text>\n )}\n </Text>\n )}\n {skillConfigs && skillConfigs.length > 0 && (\n <>\n <Text>\n <Text dimColor>Install mode:</Text>{\" \"}\n <Text bold>{getInstallModeLabel(skillConfigs)}</Text>\n </Text>\n <Text>\n <Text dimColor>Scope:</Text>{\" \"}\n <Text bold>\n {skillConfigs.filter((s) => s.scope === \"project\").length} project\n {skillConfigs.some((s) => s.scope === \"global\") &&\n `, ${skillConfigs.filter((s) => s.scope === \"global\").length} global`}\n </Text>\n </Text>\n </>\n )}\n </Box>\n\n <Box marginTop={1}>\n <Text dimColor>ENTER install ESC go back</Text>\n </Box>\n </Box>\n );\n};\n"],"mappings":"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","names":[]}
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  KEBAB_CASE_PATTERN
4
- } from "./chunk-AWP5A6IM.js";
4
+ } from "./chunk-6OWHQ7HM.js";
5
5
  import {
6
6
  init_esm_shims
7
7
  } from "./chunk-DHET7RCE.js";
@@ -135,7 +135,7 @@ var boundSkillSchema = z.object({
135
135
  boundTo: z.string(),
136
136
  description: z.string().optional()
137
137
  });
138
- var SUBCATEGORY_VALUES = [
138
+ var CATEGORY_VALUES = [
139
139
  "web-framework",
140
140
  "web-styling",
141
141
  "web-client-state",
@@ -175,8 +175,8 @@ var SUBCATEGORY_VALUES = [
175
175
  "cli-prompts",
176
176
  "cli-testing"
177
177
  ];
178
- var subcategorySchema = z.enum(SUBCATEGORY_VALUES);
179
- var SUBCATEGORY_VALUES_SET = new Set(SUBCATEGORY_VALUES);
178
+ var categorySchema = z.enum(CATEGORY_VALUES);
179
+ var CATEGORY_VALUES_SET = new Set(CATEGORY_VALUES);
180
180
  var agentNameSchema = z.enum([
181
181
  "web-developer",
182
182
  "api-developer",
@@ -210,7 +210,7 @@ var permissionModeSchema = z.enum([
210
210
  "plan",
211
211
  "delegate"
212
212
  ]);
213
- var skillDisplayNameSchema = z.enum([
213
+ var skillSlugSchema = z.enum([
214
214
  "react",
215
215
  "vue",
216
216
  "angular",
@@ -279,7 +279,6 @@ var skillDisplayNameSchema = z.enum([
279
279
  "file-upload",
280
280
  "image-handling",
281
281
  "date-fns",
282
- "api-testing",
283
282
  "api-performance",
284
283
  "web-performance",
285
284
  "security",
@@ -312,9 +311,9 @@ var extensibleSkillIdSchema = z.string().refine(
312
311
  (val) => skillIdSchema.safeParse(val).success || customExtensions.skillIds.has(val),
313
312
  { message: "Must be a valid skill ID" }
314
313
  );
315
- var extensibleSubcategorySchema = z.string().refine(
316
- (val) => subcategorySchema.safeParse(val).success || customExtensions.categories.has(val),
317
- { message: "Must be a valid subcategory" }
314
+ var extensibleCategorySchema = z.string().refine(
315
+ (val) => categorySchema.safeParse(val).success || customExtensions.categories.has(val),
316
+ { message: "Must be a valid category" }
318
317
  );
319
318
  var extensibleAgentNameSchema = z.string().refine(
320
319
  (val) => agentNameSchema.safeParse(val).success || customExtensions.agentNames.has(val),
@@ -356,7 +355,7 @@ var categoryPathSchema = z.string().refine(
356
355
  (val) => {
357
356
  if (val === "local") return true;
358
357
  if (/^(web|api|cli|mobile|infra|meta|security|shared)-.+$/.test(val)) return true;
359
- if (subcategorySchema.safeParse(val).success) return true;
358
+ if (categorySchema.safeParse(val).success) return true;
360
359
  return customExtensions.categories.has(val);
361
360
  },
362
361
  {
@@ -398,10 +397,7 @@ var skillMetadataLoaderSchema = z.object({
398
397
  category: z.string().optional(),
399
398
  author: z.string().optional(),
400
399
  tags: z.array(z.string()).optional(),
401
- requires: z.array(extensibleSkillIdSchema).optional(),
402
- compatibleWith: z.array(extensibleSkillIdSchema).optional(),
403
- conflictsWith: z.array(extensibleSkillIdSchema).optional(),
404
- domain: extensibleDomainSchema.optional(),
400
+ domain: extensibleDomainSchema,
405
401
  custom: z.boolean().optional()
406
402
  }).passthrough().superRefine(validateCategoryField);
407
403
  var pluginAuthorSchema = z.object({
@@ -448,30 +444,35 @@ var stackAgentConfigSchema = z.record(
448
444
  z.string(),
449
445
  z.union([skillAssignmentElementSchema, z.array(skillAssignmentElementSchema)])
450
446
  ).superRefine(
451
- validateExtensibleRecordKeys(
452
- SUBCATEGORY_VALUES_SET,
453
- customExtensions.categories,
454
- "subcategory"
455
- )
447
+ validateExtensibleRecordKeys(CATEGORY_VALUES_SET, customExtensions.categories, "category")
456
448
  );
457
449
  var projectConfigLoaderSchema = z.object({
458
450
  version: z.literal("1").optional(),
459
451
  /** Project/plugin name in kebab-case */
460
452
  name: z.string().optional(),
461
453
  description: z.string().optional(),
462
- /** Agent IDs to compile (e.g., ["web-developer", "api-developer"]) */
463
- agents: z.array(z.string()).optional(),
464
- /** Flat list of all skill IDs used by this project */
465
- skills: z.array(extensibleSkillIdSchema).optional(),
454
+ /** Per-agent configuration with scope (e.g., [{ name: "web-developer", scope: "project" }]) */
455
+ agents: z.array(
456
+ z.object({
457
+ name: z.string(),
458
+ scope: z.enum(["project", "global"])
459
+ })
460
+ ).optional(),
461
+ /** Per-skill configuration with scope and source */
462
+ skills: z.array(
463
+ z.object({
464
+ id: extensibleSkillIdSchema,
465
+ scope: z.enum(["project", "global"]),
466
+ source: z.string()
467
+ })
468
+ ).optional(),
466
469
  /** Author handle (e.g., "@vince") */
467
470
  author: z.string().optional(),
468
- /** "local" = .claude/agents, "plugin" = .claude/plugins/ (DEFAULT_PLUGIN_NAME) */
469
- installMode: z.enum(["local", "plugin"]).optional(),
470
471
  /** Selected domains from the wizard (persisted for edit mode restoration) */
471
472
  domains: z.array(extensibleDomainSchema).optional(),
472
473
  /** Selected agents from the wizard (persisted for edit mode restoration) */
473
474
  selectedAgents: z.array(z.string()).optional(),
474
- /** Agent-to-subcategory-to-skill mappings from selected stack (accepts same formats as stacks.yaml) */
475
+ /** Agent-to-category-to-skill mappings from selected stack (accepts same formats as stacks.ts) */
475
476
  stack: z.record(z.string(), stackAgentConfigSchema).optional(),
476
477
  /** Skills source path or URL (e.g., "github:my-org/skills") */
477
478
  source: z.string().optional(),
@@ -480,42 +481,15 @@ var projectConfigLoaderSchema = z.object({
480
481
  /** Separate source for agents when different from skills source */
481
482
  agentsSource: z.string().optional()
482
483
  }).passthrough();
483
- var projectConfigValidationSchema = z.object({
484
- version: z.literal("1").optional(),
485
- /** Project/plugin name in kebab-case */
486
- name: z.string(),
487
- description: z.string().optional(),
488
- /** Agent IDs to compile (e.g., ["web-developer", "api-developer"]) */
489
- agents: z.array(z.string()),
490
- /** Flat list of all skill IDs used by this project */
491
- skills: z.array(skillIdSchema),
492
- /** Author handle (e.g., "@vince") */
493
- author: z.string().optional(),
494
- /** "local" = .claude/agents, "plugin" = .claude/plugins/ (DEFAULT_PLUGIN_NAME) */
495
- installMode: z.enum(["local", "plugin"]),
496
- /** Selected domains from the wizard (persisted for edit mode restoration) */
497
- domains: z.array(domainSchema).optional(),
498
- /** Selected agents from the wizard (persisted for edit mode restoration) */
499
- selectedAgents: z.array(z.string()).optional(),
500
- /** Agent-to-subcategory-to-skill mappings from selected stack */
501
- stack: z.record(z.string(), stackAgentConfigSchema),
502
- /** Skills source path or URL (e.g., "github:my-org/skills") */
503
- source: z.string(),
504
- /** Marketplace identifier for plugin installation */
505
- marketplace: z.string().optional(),
506
- /** Separate source for agents when different from skills source */
507
- agentsSource: z.string().optional()
508
- });
509
484
  var categoryDefinitionSchema = z.object({
510
- id: extensibleSubcategorySchema,
485
+ id: extensibleCategorySchema,
511
486
  displayName: z.string(),
512
487
  description: z.string(),
513
488
  domain: extensibleDomainSchema.optional(),
514
489
  exclusive: z.boolean(),
515
490
  required: z.boolean(),
516
491
  order: z.number(),
517
- icon: z.string().optional(),
518
- custom: z.boolean().optional()
492
+ icon: z.string().optional()
519
493
  });
520
494
  var skillRefInYaml = z.string();
521
495
  var conflictRuleSchema = z.object({
@@ -526,9 +500,17 @@ var discourageRuleSchema = z.object({
526
500
  skills: z.array(skillRefInYaml).min(2),
527
501
  reason: z.string()
528
502
  });
529
- var recommendRuleSchema = z.object({
530
- when: skillRefInYaml,
531
- suggest: z.array(skillRefInYaml).min(1),
503
+ var recommendationSchema = z.object({
504
+ skill: skillIdSchema,
505
+ reason: z.string()
506
+ });
507
+ var compatibilityGroupSchema = z.object({
508
+ skills: z.array(skillIdSchema).min(2),
509
+ reason: z.string()
510
+ });
511
+ var setupPairSchema = z.object({
512
+ setup: skillIdSchema,
513
+ configures: z.array(skillIdSchema).min(1),
532
514
  reason: z.string()
533
515
  });
534
516
  var requireRuleSchema = z.object({
@@ -544,46 +526,41 @@ var alternativeGroupSchema = z.object({
544
526
  var relationshipDefinitionsSchema = z.object({
545
527
  conflicts: z.array(conflictRuleSchema),
546
528
  discourages: z.array(discourageRuleSchema),
547
- recommends: z.array(recommendRuleSchema),
529
+ recommends: z.array(recommendationSchema),
548
530
  requires: z.array(requireRuleSchema),
549
- alternatives: z.array(alternativeGroupSchema)
531
+ alternatives: z.array(alternativeGroupSchema),
532
+ compatibleWith: z.array(compatibilityGroupSchema).optional().default([]),
533
+ setupPairs: z.array(setupPairSchema).optional().default([])
550
534
  });
551
535
  var skillCategoriesFileSchema = z.object({
552
536
  version: z.string(),
553
537
  categories: z.record(z.string(), categoryDefinitionSchema).superRefine(
554
538
  validateExtensibleRecordKeys(
555
- SUBCATEGORY_VALUES_SET,
539
+ CATEGORY_VALUES_SET,
556
540
  customExtensions.categories,
557
541
  "category key"
558
542
  )
559
543
  )
560
544
  });
561
- var perSkillRulesSchema = z.object({
562
- compatibleWith: z.array(extensibleSkillIdSchema).optional(),
563
- conflictsWith: z.array(extensibleSkillIdSchema).optional(),
564
- requires: z.array(extensibleSkillIdSchema).optional(),
565
- requiresSetup: z.array(extensibleSkillIdSchema).optional(),
566
- providesSetupFor: z.array(extensibleSkillIdSchema).optional()
567
- });
568
545
  var skillRulesFileSchema = z.object({
569
546
  version: z.string(),
570
- aliases: z.record(z.string(), extensibleSkillIdSchema).optional(),
571
- relationships: relationshipDefinitionsSchema.optional(),
572
- "per-skill": z.record(z.string(), perSkillRulesSchema).optional()
547
+ relationships: relationshipDefinitionsSchema.optional()
573
548
  });
574
549
  var localRawMetadataSchema = z.object({
575
550
  /** Short name shown in the wizard grid (e.g., "my-custom-react") */
576
- displayName: z.string().optional(),
551
+ displayName: z.string(),
552
+ /** Kebab-case short key for alias resolution (e.g., "react") */
553
+ slug: z.string(),
577
554
  /** One-line description for the wizard */
578
555
  cliDescription: z.string().optional(),
579
- /** Subcategory to place this skill in (e.g., "web-framework") */
556
+ /** Category to place this skill in (e.g., "web-framework") */
580
557
  // Field accepts any string; cross-field validation in superRefine enforces strict/custom rules
581
- category: z.string().optional(),
558
+ category: z.string(),
582
559
  /** When an AI agent should invoke this skill */
583
560
  usageGuidance: z.string().optional(),
584
561
  tags: z.array(z.string()).optional(),
585
- /** Explicit domain assignment (overrides inference from category prefix) */
586
- domain: extensibleDomainSchema.optional(),
562
+ /** Domain this skill belongs to (e.g., "web", "api", "cli") */
563
+ domain: extensibleDomainSchema,
587
564
  /** True if this skill was created outside the CLI's built-in vocabulary */
588
565
  custom: z.boolean().optional()
589
566
  }).passthrough().superRefine(validateCategoryField);
@@ -603,7 +580,7 @@ var stackSchema = z.object({
603
580
  id: z.string().min(1),
604
581
  name: z.string().min(1),
605
582
  description: z.string(),
606
- /** Maps agent IDs to their subcategory-to-skill assignments */
583
+ /** Maps agent IDs to their category-to-skill assignments */
607
584
  agents: z.record(z.string(), stackAgentConfigSchema),
608
585
  /** High-level philosophy guiding this stack's technology choices */
609
586
  philosophy: z.string().optional()
@@ -693,7 +670,7 @@ var projectSourceConfigSchema = z.object({
693
670
  ref: z.string().optional()
694
671
  })
695
672
  ).optional(),
696
- /** Skills explicitly bound to subcategories via search (from Step Sources) */
673
+ /** Skills explicitly bound to categories via search (from Step Sources) */
697
674
  boundSkills: z.array(boundSkillSchema).optional(),
698
675
  /** Branding overrides for white-labeling the CLI */
699
676
  branding: brandingConfigSchema.optional(),
@@ -701,11 +678,11 @@ var projectSourceConfigSchema = z.object({
701
678
  skillsDir: z.string().optional(),
702
679
  /** Custom agents directory override (default: "src/agents") */
703
680
  agentsDir: z.string().optional(),
704
- /** Custom stacks file path override (default: "config/stacks.yaml") */
681
+ /** Custom stacks file path override (default: "config/stacks.ts") */
705
682
  stacksFile: z.string().optional(),
706
- /** Custom categories file path override (default: "config/skill-categories.yaml") */
683
+ /** Custom categories file path override (default: "config/skill-categories.ts") */
707
684
  categoriesFile: z.string().optional(),
708
- /** Custom rules file path override (default: "config/skill-rules.yaml") */
685
+ /** Custom rules file path override (default: "config/skill-rules.ts") */
709
686
  rulesFile: z.string().optional()
710
687
  }).passthrough();
711
688
  var projectSourceConfigValidationSchema = z.object({
@@ -775,8 +752,8 @@ var skillFrontmatterValidationSchema = z.object({
775
752
  "argument-hint": z.string().optional()
776
753
  }).strict();
777
754
  var metadataValidationSchema = z.object({
778
- /** Domain-prefixed subcategory (e.g., "web-framework") */
779
- category: extensibleSubcategorySchema,
755
+ /** Domain-prefixed category (e.g., "web-framework") */
756
+ category: extensibleCategorySchema,
780
757
  /** Author handle — must start with @ (e.g., "@vince") */
781
758
  author: z.string().regex(/^@[a-z][a-z0-9-]*$/),
782
759
  /** Short display name for the wizard grid (max 30 chars) */
@@ -785,13 +762,10 @@ var metadataValidationSchema = z.object({
785
762
  cliDescription: z.string().min(1).max(60),
786
763
  /** When an AI agent should invoke this skill (min 10 chars to ensure usefulness) */
787
764
  usageGuidance: z.string().min(10),
788
- requires: z.array(z.string().min(1)).optional(),
789
- compatibleWith: z.array(z.string().min(1)).optional(),
790
- conflictsWith: z.array(z.string().min(1)).optional(),
765
+ /** Kebab-case short key for alias resolution, search, and relationship rules */
766
+ slug: z.string().regex(/^[a-z][a-z0-9-]*$/).min(1).max(50),
791
767
  /** Searchable tags — kebab-case only */
792
768
  tags: z.array(z.string().regex(/^[a-z][a-z0-9-]*$/)).optional(),
793
- requiresSetup: z.array(z.string().min(1)).optional(),
794
- providesSetupFor: z.array(z.string().min(1)).optional(),
795
769
  /** 7-char hex SHA of skill content (for change detection) */
796
770
  contentHash: z.string().regex(/^[a-f0-9]{7}$/).optional(),
797
771
  /** ISO date of last update */
@@ -809,7 +783,7 @@ var metadataValidationSchema = z.object({
809
783
  /** ISO date of the fork */
810
784
  date: z.string()
811
785
  }).optional(),
812
- /** Explicit domain assignment (overrides inference from category prefix) */
786
+ /** Domain assignment from metadata */
813
787
  domain: extensibleDomainSchema.optional(),
814
788
  /** True if this skill was created outside the CLI's built-in vocabulary */
815
789
  custom: z.boolean().optional()
@@ -836,7 +810,7 @@ var stackConfigValidationSchema = z.object({
836
810
  skills: z.array(stackSkillAssignmentSchema).min(1),
837
811
  /** Agent IDs this stack compiles (at least one required) */
838
812
  agents: z.array(z.string().regex(KEBAB_CASE_PATTERN)).min(1),
839
- /** Per-agent skill assignments: { agentId: { subcategory: [skillAssignment] } } */
813
+ /** Per-agent skill assignments: { agentId: { category: [skillAssignment] } } */
840
814
  agentSkills: z.record(z.string(), z.record(z.string(), z.array(stackSkillAssignmentSchema))).optional(),
841
815
  /** High-level philosophy guiding technology choices */
842
816
  philosophy: z.string().optional(),
@@ -930,12 +904,10 @@ export {
930
904
  remove,
931
905
  copy,
932
906
  DOMAIN_VALUES,
933
- SUBCATEGORY_VALUES,
907
+ CATEGORY_VALUES,
934
908
  agentNameSchema,
935
- skillDisplayNameSchema,
936
909
  SKILL_ID_PATTERN,
937
910
  isValidSkillId,
938
- skillIdSchema,
939
911
  extensibleDomainSchema,
940
912
  categoryPathSchema,
941
913
  hooksRecordSchema,
@@ -964,4 +936,4 @@ export {
964
936
  warnUnknownFields,
965
937
  extendSchemasWithCustomValues
966
938
  };
967
- //# sourceMappingURL=chunk-WBHPCBVN.js.map
939
+ //# sourceMappingURL=chunk-LWXRUR6B.js.map