@claude-collective/cli 0.2.0 → 0.8.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 (190) hide show
  1. package/CHANGELOG.md +178 -0
  2. package/README.md +1 -1
  3. package/dist/chunk-3HBTELJN.js +114 -0
  4. package/dist/chunk-3HBTELJN.js.map +1 -0
  5. package/dist/chunk-3ZCB5K33.js +54 -0
  6. package/dist/chunk-3ZCB5K33.js.map +1 -0
  7. package/dist/chunk-66UDJBF6.js +96 -0
  8. package/dist/chunk-66UDJBF6.js.map +1 -0
  9. package/dist/chunk-6LS7XO3H.js +31 -0
  10. package/dist/chunk-6LS7XO3H.js.map +1 -0
  11. package/dist/chunk-A3J6IAXK.js +57 -0
  12. package/dist/chunk-A3J6IAXK.js.map +1 -0
  13. package/dist/chunk-A65SBAAJ.js +69 -0
  14. package/dist/chunk-A65SBAAJ.js.map +1 -0
  15. package/dist/chunk-ALEPJ6YN.js +80 -0
  16. package/dist/chunk-ALEPJ6YN.js.map +1 -0
  17. package/dist/chunk-C4ZTIYFR.js +84 -0
  18. package/dist/chunk-C4ZTIYFR.js.map +1 -0
  19. package/dist/chunk-CIY5UBRB.js +453 -0
  20. package/dist/chunk-CIY5UBRB.js.map +1 -0
  21. package/dist/chunk-DHET7RCE.js +50 -0
  22. package/dist/chunk-DHET7RCE.js.map +1 -0
  23. package/dist/chunk-DHFFRMF6.js +31 -0
  24. package/dist/chunk-DHFFRMF6.js.map +1 -0
  25. package/dist/chunk-DKGL77IY.js +307 -0
  26. package/dist/chunk-DKGL77IY.js.map +1 -0
  27. package/dist/chunk-ED73HCW2.js +315 -0
  28. package/dist/chunk-ED73HCW2.js.map +1 -0
  29. package/dist/chunk-FNOYEXUE.js +308 -0
  30. package/dist/chunk-FNOYEXUE.js.map +1 -0
  31. package/dist/chunk-G2FBJOZG.js +141 -0
  32. package/dist/chunk-G2FBJOZG.js.map +1 -0
  33. package/dist/chunk-HNDT5QRB.js +120 -0
  34. package/dist/chunk-HNDT5QRB.js.map +1 -0
  35. package/dist/chunk-K7PTOVX4.js +158 -0
  36. package/dist/chunk-K7PTOVX4.js.map +1 -0
  37. package/dist/chunk-LQTST4WY.js +91 -0
  38. package/dist/chunk-LQTST4WY.js.map +1 -0
  39. package/dist/chunk-LVKRVFYR.js +54 -0
  40. package/dist/chunk-LVKRVFYR.js.map +1 -0
  41. package/dist/chunk-M7YCPFIX.js +108 -0
  42. package/dist/chunk-M7YCPFIX.js.map +1 -0
  43. package/dist/chunk-MJSFR562.js +57 -0
  44. package/dist/chunk-MJSFR562.js.map +1 -0
  45. package/dist/chunk-MMDXNZPF.js +69 -0
  46. package/dist/chunk-MMDXNZPF.js.map +1 -0
  47. package/dist/chunk-MYAVQ23U.js +356 -0
  48. package/dist/chunk-MYAVQ23U.js.map +1 -0
  49. package/dist/chunk-NGBFJJ7Q.js +124 -0
  50. package/dist/chunk-NGBFJJ7Q.js.map +1 -0
  51. package/dist/chunk-OLBOTK3O.js +64 -0
  52. package/dist/chunk-OLBOTK3O.js.map +1 -0
  53. package/dist/chunk-PPNTD5LO.js +330 -0
  54. package/dist/chunk-PPNTD5LO.js.map +1 -0
  55. package/dist/chunk-Q2LH2DAB.js +392 -0
  56. package/dist/chunk-Q2LH2DAB.js.map +1 -0
  57. package/dist/chunk-Q6DR5QUH.js +547 -0
  58. package/dist/chunk-Q6DR5QUH.js.map +1 -0
  59. package/dist/chunk-QESUUPOE.js +241 -0
  60. package/dist/chunk-QESUUPOE.js.map +1 -0
  61. package/dist/chunk-QGGSLMO3.js +607 -0
  62. package/dist/chunk-QGGSLMO3.js.map +1 -0
  63. package/dist/chunk-SEBPPFUW.js +478 -0
  64. package/dist/chunk-SEBPPFUW.js.map +1 -0
  65. package/dist/chunk-SYQ7R2JO.js +95 -0
  66. package/dist/chunk-SYQ7R2JO.js.map +1 -0
  67. package/dist/chunk-TOPAIL5W.js +22 -0
  68. package/dist/chunk-TOPAIL5W.js.map +1 -0
  69. package/dist/chunk-U4VYHKPM.js +110 -0
  70. package/dist/chunk-U4VYHKPM.js.map +1 -0
  71. package/dist/chunk-UOWHJ6BE.js +83 -0
  72. package/dist/chunk-UOWHJ6BE.js.map +1 -0
  73. package/dist/chunk-XKEG3SCV.js +86 -0
  74. package/dist/chunk-XKEG3SCV.js.map +1 -0
  75. package/dist/chunk-XY3XDVMI.js +15599 -0
  76. package/dist/chunk-XY3XDVMI.js.map +1 -0
  77. package/dist/chunk-Y3V43XCU.js +76 -0
  78. package/dist/chunk-Y3V43XCU.js.map +1 -0
  79. package/dist/chunk-YKXBGCFD.js +129 -0
  80. package/dist/chunk-YKXBGCFD.js.map +1 -0
  81. package/dist/cli-v2/defaults/agent-mappings.yaml +185 -0
  82. package/dist/commands/build/marketplace.js +254 -0
  83. package/dist/commands/build/marketplace.js.map +1 -0
  84. package/dist/commands/build/plugins.js +324 -0
  85. package/dist/commands/build/plugins.js.map +1 -0
  86. package/dist/commands/build/stack.js +169 -0
  87. package/dist/commands/build/stack.js.map +1 -0
  88. package/dist/commands/compile.js +461 -0
  89. package/dist/commands/compile.js.map +1 -0
  90. package/dist/commands/config/get.js +60 -0
  91. package/dist/commands/config/get.js.map +1 -0
  92. package/dist/commands/config/index.js +22 -0
  93. package/dist/commands/config/index.js.map +1 -0
  94. package/dist/commands/config/path.js +35 -0
  95. package/dist/commands/config/path.js.map +1 -0
  96. package/dist/commands/config/set-project.js +61 -0
  97. package/dist/commands/config/set-project.js.map +1 -0
  98. package/dist/commands/config/set.js +60 -0
  99. package/dist/commands/config/set.js.map +1 -0
  100. package/dist/commands/config/show.js +13 -0
  101. package/dist/commands/config/show.js.map +1 -0
  102. package/dist/commands/config/unset-project.js +57 -0
  103. package/dist/commands/config/unset-project.js.map +1 -0
  104. package/dist/commands/config/unset.js +56 -0
  105. package/dist/commands/config/unset.js.map +1 -0
  106. package/dist/commands/diff.js +755 -0
  107. package/dist/commands/diff.js.map +1 -0
  108. package/dist/commands/doctor.js +413 -0
  109. package/dist/commands/doctor.js.map +1 -0
  110. package/dist/commands/edit.js +254 -0
  111. package/dist/commands/edit.js.map +1 -0
  112. package/dist/commands/eject.js +208 -0
  113. package/dist/commands/eject.js.map +1 -0
  114. package/dist/commands/info.js +205 -0
  115. package/dist/commands/info.js.map +1 -0
  116. package/dist/commands/init.js +915 -0
  117. package/dist/commands/init.js.map +1 -0
  118. package/dist/commands/list.js +44 -0
  119. package/dist/commands/list.js.map +1 -0
  120. package/dist/commands/new/agent.js +230 -0
  121. package/dist/commands/new/agent.js.map +1 -0
  122. package/dist/commands/new/skill.js +204 -0
  123. package/dist/commands/new/skill.js.map +1 -0
  124. package/dist/commands/outdated.js +242 -0
  125. package/dist/commands/outdated.js.map +1 -0
  126. package/dist/commands/search.js +115 -0
  127. package/dist/commands/search.js.map +1 -0
  128. package/dist/commands/test-imports.js +92 -0
  129. package/dist/commands/test-imports.js.map +1 -0
  130. package/dist/commands/uninstall.js +309 -0
  131. package/dist/commands/uninstall.js.map +1 -0
  132. package/dist/commands/update.js +428 -0
  133. package/dist/commands/update.js.map +1 -0
  134. package/dist/commands/validate.js +375 -0
  135. package/dist/commands/validate.js.map +1 -0
  136. package/dist/commands/version/bump.js +95 -0
  137. package/dist/commands/version/bump.js.map +1 -0
  138. package/dist/commands/version/index.js +70 -0
  139. package/dist/commands/version/index.js.map +1 -0
  140. package/dist/commands/version/set.js +101 -0
  141. package/dist/commands/version/set.js.map +1 -0
  142. package/dist/commands/version/show.js +70 -0
  143. package/dist/commands/version/show.js.map +1 -0
  144. package/dist/components/common/confirm.js +9 -0
  145. package/dist/components/common/confirm.js.map +1 -0
  146. package/dist/components/common/message.js +24 -0
  147. package/dist/components/common/message.js.map +1 -0
  148. package/dist/components/common/spinner.js +14 -0
  149. package/dist/components/common/spinner.js.map +1 -0
  150. package/dist/components/wizard/category-grid.js +9 -0
  151. package/dist/components/wizard/category-grid.js.map +1 -0
  152. package/dist/components/wizard/category-grid.test.js +728 -0
  153. package/dist/components/wizard/category-grid.test.js.map +1 -0
  154. package/dist/components/wizard/section-progress.js +9 -0
  155. package/dist/components/wizard/section-progress.js.map +1 -0
  156. package/dist/components/wizard/section-progress.test.js +281 -0
  157. package/dist/components/wizard/section-progress.test.js.map +1 -0
  158. package/dist/components/wizard/step-approach.js +11 -0
  159. package/dist/components/wizard/step-approach.js.map +1 -0
  160. package/dist/components/wizard/step-build.js +15 -0
  161. package/dist/components/wizard/step-build.js.map +1 -0
  162. package/dist/components/wizard/step-build.test.js +729 -0
  163. package/dist/components/wizard/step-build.test.js.map +1 -0
  164. package/dist/components/wizard/step-confirm.js +9 -0
  165. package/dist/components/wizard/step-confirm.js.map +1 -0
  166. package/dist/components/wizard/step-refine.js +9 -0
  167. package/dist/components/wizard/step-refine.js.map +1 -0
  168. package/dist/components/wizard/step-refine.test.js +235 -0
  169. package/dist/components/wizard/step-refine.test.js.map +1 -0
  170. package/dist/components/wizard/step-stack-options.js +11 -0
  171. package/dist/components/wizard/step-stack-options.js.map +1 -0
  172. package/dist/components/wizard/step-stack.js +11 -0
  173. package/dist/components/wizard/step-stack.js.map +1 -0
  174. package/dist/components/wizard/wizard-tabs.js +11 -0
  175. package/dist/components/wizard/wizard-tabs.js.map +1 -0
  176. package/dist/components/wizard/wizard.js +20 -0
  177. package/dist/components/wizard/wizard.js.map +1 -0
  178. package/dist/hooks/init.js +41 -0
  179. package/dist/hooks/init.js.map +1 -0
  180. package/dist/index.js +10 -0
  181. package/dist/index.js.map +1 -0
  182. package/dist/magic-string.es-RGXYGAW3.js +1316 -0
  183. package/dist/magic-string.es-RGXYGAW3.js.map +1 -0
  184. package/dist/stores/wizard-store.js +10 -0
  185. package/dist/stores/wizard-store.js.map +1 -0
  186. package/dist/stores/wizard-store.test.js +405 -0
  187. package/dist/stores/wizard-store.test.js.map +1 -0
  188. package/package.json +44 -25
  189. package/dist/cli/index.js +0 -6314
  190. package/dist/cli/index.js.map +0 -1
@@ -0,0 +1,315 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ StepStackOptions
4
+ } from "./chunk-A65SBAAJ.js";
5
+ import {
6
+ StepStack
7
+ } from "./chunk-HNDT5QRB.js";
8
+ import {
9
+ WIZARD_STEPS,
10
+ WizardTabs
11
+ } from "./chunk-ALEPJ6YN.js";
12
+ import {
13
+ StepApproach
14
+ } from "./chunk-XKEG3SCV.js";
15
+ import {
16
+ StepBuild,
17
+ validateSelection
18
+ } from "./chunk-Q6DR5QUH.js";
19
+ import {
20
+ StepConfirm
21
+ } from "./chunk-UOWHJ6BE.js";
22
+ import {
23
+ StepRefine
24
+ } from "./chunk-Y3V43XCU.js";
25
+ import {
26
+ useWizardStore
27
+ } from "./chunk-K7PTOVX4.js";
28
+ import {
29
+ init_esm_shims
30
+ } from "./chunk-DHET7RCE.js";
31
+
32
+ // src/cli-v2/components/wizard/wizard.tsx
33
+ init_esm_shims();
34
+ import { useCallback, useMemo } from "react";
35
+ import { Box, Text, useApp, useInput, useStdout } from "ink";
36
+ import { ThemeProvider } from "@inkjs/ui";
37
+
38
+ // src/cli-v2/components/themes/default.ts
39
+ init_esm_shims();
40
+ import { extendTheme, defaultTheme } from "@inkjs/ui";
41
+ var cliTheme = extendTheme(defaultTheme, {
42
+ components: {
43
+ Spinner: {
44
+ styles: {
45
+ frame: () => ({ color: "cyan" }),
46
+ label: () => ({ color: "gray" })
47
+ }
48
+ },
49
+ Select: {
50
+ styles: {
51
+ focusIndicator: () => ({ color: "cyan" }),
52
+ label: ({ isFocused }) => ({
53
+ color: isFocused ? "cyan" : void 0
54
+ })
55
+ }
56
+ },
57
+ MultiSelect: {
58
+ styles: {
59
+ focusIndicator: () => ({ color: "cyan" }),
60
+ label: ({ isFocused, isSelected }) => ({
61
+ color: isFocused ? "cyan" : isSelected ? "green" : void 0
62
+ }),
63
+ checkboxChecked: () => ({ color: "green" })
64
+ }
65
+ },
66
+ StatusMessage: {
67
+ styles: {
68
+ container: ({ variant }) => ({
69
+ borderStyle: "round",
70
+ borderColor: variant === "error" ? "red" : variant === "warning" ? "yellow" : variant === "success" ? "green" : "blue"
71
+ })
72
+ }
73
+ },
74
+ Alert: {
75
+ styles: {
76
+ container: ({ variant }) => ({
77
+ borderColor: variant === "error" ? "red" : variant === "warning" ? "yellow" : variant === "success" ? "green" : "blue"
78
+ }),
79
+ icon: ({ variant }) => ({
80
+ color: variant === "error" ? "red" : variant === "warning" ? "yellow" : variant === "success" ? "green" : "blue"
81
+ })
82
+ }
83
+ },
84
+ TextInput: {
85
+ styles: {
86
+ container: ({ isFocused }) => ({
87
+ borderColor: isFocused ? "cyan" : "gray"
88
+ }),
89
+ cursor: () => ({ color: "cyan" })
90
+ }
91
+ },
92
+ ConfirmInput: {
93
+ styles: {
94
+ highlightedChoice: () => ({ color: "cyan" })
95
+ }
96
+ },
97
+ Badge: {
98
+ styles: {
99
+ container: ({ variant }) => ({
100
+ color: variant === "error" ? "red" : variant === "warning" ? "yellow" : variant === "success" ? "green" : variant === "info" ? "blue" : "cyan"
101
+ })
102
+ }
103
+ }
104
+ }
105
+ });
106
+
107
+ // src/cli-v2/components/wizard/wizard.tsx
108
+ import { jsx, jsxs } from "react/jsx-runtime";
109
+ var MIN_TERMINAL_WIDTH = 80;
110
+ function getStackName(stackId, matrix) {
111
+ if (!stackId) return void 0;
112
+ const stack = matrix.suggestedStacks.find((s) => s.id === stackId);
113
+ return stack?.name;
114
+ }
115
+ function getStackTechnologyCount(stackId, matrix) {
116
+ if (!stackId) return 0;
117
+ const stack = matrix.suggestedStacks.find((s) => s.id === stackId);
118
+ if (!stack) return 0;
119
+ return stack.allSkillIds.length;
120
+ }
121
+ var Wizard = ({
122
+ matrix,
123
+ onComplete,
124
+ onCancel
125
+ }) => {
126
+ const store = useWizardStore();
127
+ const { exit } = useApp();
128
+ const { stdout } = useStdout();
129
+ const terminalWidth = stdout.columns || MIN_TERMINAL_WIDTH;
130
+ const isNarrowTerminal = terminalWidth < MIN_TERMINAL_WIDTH;
131
+ const { completedSteps, skippedSteps } = useMemo(() => {
132
+ const completed = [];
133
+ const skipped = [];
134
+ if (store.step !== "approach") {
135
+ completed.push("approach");
136
+ }
137
+ if (store.step !== "approach" && store.step !== "stack" && store.step !== "stack-options") {
138
+ completed.push("stack");
139
+ }
140
+ if (store.approach === "stack" && store.selectedStackId && store.stackAction === "defaults") {
141
+ skipped.push("build");
142
+ } else if (store.step === "refine" || store.step === "confirm") {
143
+ completed.push("build");
144
+ }
145
+ if (store.step === "confirm") {
146
+ completed.push("refine");
147
+ }
148
+ return { completedSteps: completed, skippedSteps: skipped };
149
+ }, [store.step, store.approach, store.selectedStackId, store.stackAction]);
150
+ useInput((input, key) => {
151
+ if (key.escape) {
152
+ if (store.step === "approach") {
153
+ onCancel();
154
+ exit();
155
+ } else {
156
+ store.goBack();
157
+ }
158
+ }
159
+ });
160
+ const handleComplete = useCallback(() => {
161
+ let allSkills;
162
+ if (store.selectedStackId && store.stackAction === "defaults") {
163
+ const stack = matrix.suggestedStacks.find(
164
+ (s) => s.id === store.selectedStackId
165
+ );
166
+ if (!stack) {
167
+ console.warn(`Stack not found in matrix: ${store.selectedStackId}`);
168
+ }
169
+ allSkills = [...stack?.allSkillIds || []];
170
+ } else {
171
+ const techNames = store.getAllSelectedTechnologies();
172
+ allSkills = techNames.map((tech) => matrix.aliases[tech] || tech);
173
+ }
174
+ const methodologySkills = store.getSelectedSkills();
175
+ for (const skill of methodologySkills) {
176
+ if (!allSkills.includes(skill)) {
177
+ allSkills.push(skill);
178
+ }
179
+ }
180
+ const validation = validateSelection(allSkills, matrix);
181
+ const result = {
182
+ selectedSkills: allSkills,
183
+ selectedStackId: store.selectedStackId,
184
+ domainSelections: store.domainSelections,
185
+ expertMode: store.expertMode,
186
+ installMode: store.installMode,
187
+ cancelled: false,
188
+ validation
189
+ };
190
+ onComplete(result);
191
+ exit();
192
+ }, [store, matrix, onComplete, exit]);
193
+ const renderStep = () => {
194
+ switch (store.step) {
195
+ case "approach":
196
+ return /* @__PURE__ */ jsx(StepApproach, {});
197
+ case "stack":
198
+ return /* @__PURE__ */ jsx(StepStack, { matrix });
199
+ case "stack-options": {
200
+ const stackName = getStackName(store.selectedStackId, matrix) || "Selected Stack";
201
+ const techCount = getStackTechnologyCount(
202
+ store.selectedStackId,
203
+ matrix
204
+ );
205
+ return /* @__PURE__ */ jsx(StepStackOptions, { stackName, technologyCount: techCount });
206
+ }
207
+ case "build": {
208
+ const currentDomain = store.getCurrentDomain();
209
+ const effectiveDomains = store.selectedDomains.length > 0 ? store.selectedDomains : ["web"];
210
+ return /* @__PURE__ */ jsx(
211
+ StepBuild,
212
+ {
213
+ matrix,
214
+ domain: currentDomain || effectiveDomains[0] || "web",
215
+ selectedDomains: effectiveDomains,
216
+ currentDomainIndex: store.currentDomainIndex,
217
+ selections: store.domainSelections[currentDomain || "web"] || {},
218
+ allSelections: store.getAllSelectedTechnologies(),
219
+ focusedRow: store.focusedRow,
220
+ focusedCol: store.focusedCol,
221
+ showDescriptions: store.showDescriptions,
222
+ expertMode: store.expertMode,
223
+ onToggle: (subcategoryId, techId) => {
224
+ const domain = store.getCurrentDomain() || "web";
225
+ const cat = matrix.categories[subcategoryId];
226
+ store.toggleTechnology(
227
+ domain,
228
+ subcategoryId,
229
+ techId,
230
+ cat?.exclusive ?? true
231
+ );
232
+ },
233
+ onFocusChange: store.setFocus,
234
+ onToggleDescriptions: store.toggleShowDescriptions,
235
+ onToggleExpertMode: store.toggleExpertMode,
236
+ onContinue: () => {
237
+ if (!store.nextDomain()) {
238
+ store.setStep("refine");
239
+ }
240
+ },
241
+ onBack: () => {
242
+ if (!store.prevDomain()) {
243
+ store.goBack();
244
+ }
245
+ }
246
+ }
247
+ );
248
+ }
249
+ case "refine":
250
+ return /* @__PURE__ */ jsx(
251
+ StepRefine,
252
+ {
253
+ technologyCount: store.getAllSelectedTechnologies().length,
254
+ refineAction: store.refineAction,
255
+ onSelectAction: store.setRefineAction,
256
+ onContinue: () => store.setStep("confirm"),
257
+ onBack: store.goBack
258
+ }
259
+ );
260
+ case "confirm": {
261
+ const stackName = getStackName(store.selectedStackId, matrix);
262
+ return /* @__PURE__ */ jsx(
263
+ StepConfirm,
264
+ {
265
+ matrix,
266
+ onComplete: handleComplete,
267
+ stackName,
268
+ selectedDomains: store.selectedDomains,
269
+ domainSelections: store.domainSelections,
270
+ technologyCount: store.getAllSelectedTechnologies().length,
271
+ skillCount: store.getSelectedSkills().length,
272
+ installMode: store.installMode,
273
+ onBack: store.goBack
274
+ }
275
+ );
276
+ }
277
+ default:
278
+ return null;
279
+ }
280
+ };
281
+ if (isNarrowTerminal) {
282
+ return /* @__PURE__ */ jsx(ThemeProvider, { theme: cliTheme, children: /* @__PURE__ */ jsxs(Box, { flexDirection: "column", padding: 1, children: [
283
+ /* @__PURE__ */ jsxs(Text, { color: "yellow", children: [
284
+ "Terminal too narrow (",
285
+ terminalWidth,
286
+ " columns). Please resize to at least ",
287
+ MIN_TERMINAL_WIDTH,
288
+ " columns."
289
+ ] }),
290
+ /* @__PURE__ */ jsx(Box, { marginTop: 1, children: /* @__PURE__ */ jsxs(Text, { dimColor: true, children: [
291
+ "Current width: ",
292
+ terminalWidth,
293
+ " columns"
294
+ ] }) })
295
+ ] }) });
296
+ }
297
+ return /* @__PURE__ */ jsx(ThemeProvider, { theme: cliTheme, children: /* @__PURE__ */ jsxs(Box, { flexDirection: "column", padding: 1, children: [
298
+ /* @__PURE__ */ jsx(
299
+ WizardTabs,
300
+ {
301
+ steps: WIZARD_STEPS,
302
+ currentStep: store.step,
303
+ completedSteps,
304
+ skippedSteps
305
+ }
306
+ ),
307
+ renderStep(),
308
+ /* @__PURE__ */ jsx(Box, { marginTop: 1, children: /* @__PURE__ */ jsx(Text, { dimColor: true, children: "ESC to go back, Ctrl+C to cancel" }) })
309
+ ] }) });
310
+ };
311
+
312
+ export {
313
+ Wizard
314
+ };
315
+ //# sourceMappingURL=chunk-ED73HCW2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli-v2/components/wizard/wizard.tsx","../src/cli-v2/components/themes/default.ts"],"sourcesContent":["/**\n * Wizard component - Main orchestrator for the skill selection wizard.\n *\n * V2 Flow:\n * - approach: Choose stack template or build from scratch\n * - stack: Select pre-built stack (stack path) OR domains (scratch path)\n * - stack-options: Continue defaults or customize (stack path only)\n * - build: CategoryGrid for technology selection\n * - refine: Skill source selection\n * - confirm: Final confirmation\n *\n * Navigation:\n * - ESC goes back through history\n * - ESC at approach cancels wizard\n * - Ctrl+C cancels at any point\n */\nimport React, { useCallback, useMemo } from \"react\";\nimport { Box, Text, useApp, useInput, useStdout } from \"ink\";\nimport { ThemeProvider } from \"@inkjs/ui\";\nimport { useWizardStore } from \"../../stores/wizard-store.js\";\nimport { cliTheme } from \"../themes/default.js\";\nimport { WizardTabs, WIZARD_STEPS } from \"./wizard-tabs.js\";\nimport { StepApproach } from \"./step-approach.js\";\nimport { StepStack } from \"./step-stack.js\";\nimport { StepStackOptions } from \"./step-stack-options.js\";\nimport { StepBuild } from \"./step-build.js\";\nimport { StepRefine } from \"./step-refine.js\";\nimport { StepConfirm } from \"./step-confirm.js\";\nimport { validateSelection } from \"../../lib/matrix-resolver.js\";\nimport type { MergedSkillsMatrix } from \"../../types-matrix.js\";\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface WizardResultV2 {\n selectedSkills: string[];\n selectedStackId: string | null;\n domainSelections: Record<string, Record<string, string[]>>;\n expertMode: boolean;\n installMode: \"plugin\" | \"local\";\n cancelled: boolean;\n validation: {\n valid: boolean;\n errors: Array<{ message: string }>;\n warnings: Array<{ message: string }>;\n };\n}\n\n/** @deprecated Use WizardResultV2 instead */\nexport interface WizardResult {\n selectedSkills: string[];\n selectedStack: { id: string } | null;\n expertMode: boolean;\n installMode: \"plugin\" | \"local\";\n cancelled: boolean;\n validation: {\n valid: boolean;\n errors: Array<{ message: string }>;\n warnings: Array<{ message: string }>;\n };\n}\n\ninterface WizardProps {\n matrix: MergedSkillsMatrix;\n onComplete: (result: WizardResultV2 | WizardResult) => void;\n onCancel: () => void;\n /** @deprecated Initial skills no longer skip to category */\n initialSkills?: string[];\n}\n\n// =============================================================================\n// Constants\n// =============================================================================\n\n/** Minimum terminal width required for the wizard */\nconst MIN_TERMINAL_WIDTH = 80;\n\n// =============================================================================\n// Helper Functions\n// =============================================================================\n\n/**\n * Get display name for a domain.\n */\nfunction getDomainDisplayName(domain: string): string {\n const displayNames: Record<string, string> = {\n web: \"Web\",\n api: \"API\",\n cli: \"CLI\",\n mobile: \"Mobile\",\n shared: \"Shared\",\n };\n return (\n displayNames[domain] || domain.charAt(0).toUpperCase() + domain.slice(1)\n );\n}\n\n/**\n * Get stack name from matrix by stack ID.\n */\nfunction getStackName(\n stackId: string | null,\n matrix: MergedSkillsMatrix,\n): string | undefined {\n if (!stackId) return undefined;\n const stack = matrix.suggestedStacks.find((s) => s.id === stackId);\n return stack?.name;\n}\n\n/**\n * Count technologies in a stack.\n */\nfunction getStackTechnologyCount(\n stackId: string | null,\n matrix: MergedSkillsMatrix,\n): number {\n if (!stackId) return 0;\n const stack = matrix.suggestedStacks.find((s) => s.id === stackId);\n if (!stack) return 0;\n return stack.allSkillIds.length;\n}\n\n// =============================================================================\n// Main Component\n// =============================================================================\n\nexport const Wizard: React.FC<WizardProps> = ({\n matrix,\n onComplete,\n onCancel,\n}) => {\n const store = useWizardStore();\n const { exit } = useApp();\n const { stdout } = useStdout();\n\n // Check terminal width\n const terminalWidth = stdout.columns || MIN_TERMINAL_WIDTH;\n const isNarrowTerminal = terminalWidth < MIN_TERMINAL_WIDTH;\n\n // Compute completed and skipped steps for WizardTabs\n const { completedSteps, skippedSteps } = useMemo(() => {\n const completed: string[] = [];\n const skipped: string[] = [];\n\n // Approach is complete when we've moved past it\n if (store.step !== \"approach\") {\n completed.push(\"approach\");\n }\n\n // Stack step handling\n if (\n store.step !== \"approach\" &&\n store.step !== \"stack\" &&\n store.step !== \"stack-options\"\n ) {\n completed.push(\"stack\");\n }\n\n // Build step handling\n // Stack path with defaults skips build\n if (\n store.approach === \"stack\" &&\n store.selectedStackId &&\n store.stackAction === \"defaults\"\n ) {\n skipped.push(\"build\");\n } else if (store.step === \"refine\" || store.step === \"confirm\") {\n completed.push(\"build\");\n }\n\n // Refine step\n if (store.step === \"confirm\") {\n completed.push(\"refine\");\n }\n\n return { completedSteps: completed, skippedSteps: skipped };\n }, [store.step, store.approach, store.selectedStackId, store.stackAction]);\n\n // Global escape handler\n useInput((input, key) => {\n if (key.escape) {\n if (store.step === \"approach\") {\n onCancel();\n exit();\n } else {\n store.goBack();\n }\n }\n });\n\n // Handle wizard completion\n const handleComplete = useCallback(() => {\n let allSkills: string[];\n\n if (store.selectedStackId && store.stackAction === \"defaults\") {\n // Stack + defaults path: use stack's allSkillIds directly\n const stack = matrix.suggestedStacks.find(\n (s) => s.id === store.selectedStackId,\n );\n if (!stack) {\n console.warn(`Stack not found in matrix: ${store.selectedStackId}`);\n }\n allSkills = [...(stack?.allSkillIds || [])];\n } else {\n // Scratch / Customize path: resolve domainSelections via aliases\n const techNames = store.getAllSelectedTechnologies();\n // Resolve each technology name to its full skill ID via aliases\n allSkills = techNames.map((tech) => matrix.aliases[tech] || tech);\n }\n\n // Add methodology skills (always included)\n const methodologySkills = store.getSelectedSkills();\n for (const skill of methodologySkills) {\n if (!allSkills.includes(skill)) {\n allSkills.push(skill);\n }\n }\n\n const validation = validateSelection(allSkills, matrix);\n\n const result: WizardResultV2 = {\n selectedSkills: allSkills,\n selectedStackId: store.selectedStackId,\n domainSelections: store.domainSelections,\n expertMode: store.expertMode,\n installMode: store.installMode,\n cancelled: false,\n validation,\n };\n\n onComplete(result);\n exit();\n }, [store, matrix, onComplete, exit]);\n\n // Render current step\n const renderStep = () => {\n switch (store.step) {\n case \"approach\":\n return <StepApproach />;\n\n case \"stack\":\n return <StepStack matrix={matrix} />;\n\n case \"stack-options\": {\n const stackName =\n getStackName(store.selectedStackId, matrix) || \"Selected Stack\";\n const techCount = getStackTechnologyCount(\n store.selectedStackId,\n matrix,\n );\n return (\n <StepStackOptions stackName={stackName} technologyCount={techCount} />\n );\n }\n\n case \"build\": {\n const currentDomain = store.getCurrentDomain();\n // For stack path with customize, use all domains from stack\n // For scratch path, use selectedDomains\n const effectiveDomains =\n store.selectedDomains.length > 0 ? store.selectedDomains : [\"web\"]; // Default to web if no domains selected\n\n return (\n <StepBuild\n matrix={matrix}\n domain={currentDomain || effectiveDomains[0] || \"web\"}\n selectedDomains={effectiveDomains}\n currentDomainIndex={store.currentDomainIndex}\n selections={store.domainSelections[currentDomain || \"web\"] || {}}\n allSelections={store.getAllSelectedTechnologies()}\n focusedRow={store.focusedRow}\n focusedCol={store.focusedCol}\n showDescriptions={store.showDescriptions}\n expertMode={store.expertMode}\n onToggle={(subcategoryId, techId) => {\n const domain = store.getCurrentDomain() || \"web\";\n const cat = matrix.categories[subcategoryId];\n store.toggleTechnology(\n domain,\n subcategoryId,\n techId,\n cat?.exclusive ?? true,\n );\n }}\n onFocusChange={store.setFocus}\n onToggleDescriptions={store.toggleShowDescriptions}\n onToggleExpertMode={store.toggleExpertMode}\n onContinue={() => {\n if (!store.nextDomain()) {\n store.setStep(\"refine\");\n }\n }}\n onBack={() => {\n if (!store.prevDomain()) {\n store.goBack();\n }\n }}\n />\n );\n }\n\n case \"refine\":\n return (\n <StepRefine\n technologyCount={store.getAllSelectedTechnologies().length}\n refineAction={store.refineAction}\n onSelectAction={store.setRefineAction}\n onContinue={() => store.setStep(\"confirm\")}\n onBack={store.goBack}\n />\n );\n\n case \"confirm\": {\n const stackName = getStackName(store.selectedStackId, matrix);\n return (\n <StepConfirm\n matrix={matrix}\n onComplete={handleComplete}\n stackName={stackName}\n selectedDomains={store.selectedDomains}\n domainSelections={store.domainSelections}\n technologyCount={store.getAllSelectedTechnologies().length}\n skillCount={store.getSelectedSkills().length}\n installMode={store.installMode}\n onBack={store.goBack}\n />\n );\n }\n\n default:\n return null;\n }\n };\n\n // Show warning if terminal is too narrow\n if (isNarrowTerminal) {\n return (\n <ThemeProvider theme={cliTheme}>\n <Box flexDirection=\"column\" padding={1}>\n <Text color=\"yellow\">\n Terminal too narrow ({terminalWidth} columns). Please resize to at\n least {MIN_TERMINAL_WIDTH} columns.\n </Text>\n <Box marginTop={1}>\n <Text dimColor>Current width: {terminalWidth} columns</Text>\n </Box>\n </Box>\n </ThemeProvider>\n );\n }\n\n return (\n <ThemeProvider theme={cliTheme}>\n <Box flexDirection=\"column\" padding={1}>\n <WizardTabs\n steps={WIZARD_STEPS}\n currentStep={store.step}\n completedSteps={completedSteps}\n skippedSteps={skippedSteps}\n />\n {renderStep()}\n <Box marginTop={1}>\n <Text dimColor>ESC to go back, Ctrl+C to cancel</Text>\n </Box>\n </Box>\n </ThemeProvider>\n );\n};\n","import { extendTheme, defaultTheme } from \"@inkjs/ui\";\n\n/**\n * CLI theme matching existing picocolors styling\n *\n * Color scheme:\n * - Cyan: Focus/primary (headings, prompts, selected items)\n * - Green: Success states\n * - Red: Errors\n * - Yellow: Warnings\n * - Blue: Info messages\n */\nexport const cliTheme = extendTheme(defaultTheme, {\n components: {\n Spinner: {\n styles: {\n frame: () => ({ color: \"cyan\" }),\n label: () => ({ color: \"gray\" }),\n },\n },\n Select: {\n styles: {\n focusIndicator: () => ({ color: \"cyan\" }),\n label: ({ isFocused }) => ({\n color: isFocused ? \"cyan\" : undefined,\n }),\n },\n },\n MultiSelect: {\n styles: {\n focusIndicator: () => ({ color: \"cyan\" }),\n label: ({ isFocused, isSelected }) => ({\n color: isFocused ? \"cyan\" : isSelected ? \"green\" : undefined,\n }),\n checkboxChecked: () => ({ color: \"green\" }),\n },\n },\n StatusMessage: {\n styles: {\n container: ({ variant }) => ({\n borderStyle: \"round\",\n borderColor:\n variant === \"error\"\n ? \"red\"\n : variant === \"warning\"\n ? \"yellow\"\n : variant === \"success\"\n ? \"green\"\n : \"blue\",\n }),\n },\n },\n Alert: {\n styles: {\n container: ({ variant }) => ({\n borderColor:\n variant === \"error\"\n ? \"red\"\n : variant === \"warning\"\n ? \"yellow\"\n : variant === \"success\"\n ? \"green\"\n : \"blue\",\n }),\n icon: ({ variant }) => ({\n color:\n variant === \"error\"\n ? \"red\"\n : variant === \"warning\"\n ? \"yellow\"\n : variant === \"success\"\n ? \"green\"\n : \"blue\",\n }),\n },\n },\n TextInput: {\n styles: {\n container: ({ isFocused }) => ({\n borderColor: isFocused ? \"cyan\" : \"gray\",\n }),\n cursor: () => ({ color: \"cyan\" }),\n },\n },\n ConfirmInput: {\n styles: {\n highlightedChoice: () => ({ color: \"cyan\" }),\n },\n },\n Badge: {\n styles: {\n container: ({ variant }) => ({\n color:\n variant === \"error\"\n ? \"red\"\n : variant === \"warning\"\n ? \"yellow\"\n : variant === \"success\"\n ? \"green\"\n : variant === \"info\"\n ? \"blue\"\n : \"cyan\",\n }),\n },\n },\n },\n});\n"],"mappings":"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","names":[]}
@@ -0,0 +1,308 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ isLegacyStackConfig,
4
+ loadProjectConfig,
5
+ normalizeStackConfig
6
+ } from "./chunk-MYAVQ23U.js";
7
+ import {
8
+ compileAgentForPlugin
9
+ } from "./chunk-Q2LH2DAB.js";
10
+ import {
11
+ createLiquidEngine,
12
+ resolveAgents,
13
+ resolveStackSkills
14
+ } from "./chunk-SEBPPFUW.js";
15
+ import {
16
+ getPluginAgentsDir
17
+ } from "./chunk-3HBTELJN.js";
18
+ import {
19
+ loadAllAgents,
20
+ loadPluginSkills
21
+ } from "./chunk-QGGSLMO3.js";
22
+ import {
23
+ verbose
24
+ } from "./chunk-TOPAIL5W.js";
25
+ import {
26
+ ensureDir,
27
+ fileExists,
28
+ glob,
29
+ readFile,
30
+ writeFile
31
+ } from "./chunk-MMDXNZPF.js";
32
+ import {
33
+ init_esm_shims
34
+ } from "./chunk-DHET7RCE.js";
35
+
36
+ // src/cli-v2/lib/agent-recompiler.ts
37
+ init_esm_shims();
38
+ import path from "path";
39
+
40
+ // src/cli-v2/lib/custom-agent-resolver.ts
41
+ init_esm_shims();
42
+ var DEFAULT_TOOLS = ["Read", "Grep", "Glob"];
43
+ var CUSTOM_AGENT_PATH = "_custom";
44
+ function resolveCustomAgent(agentId, customConfig, builtinAgents) {
45
+ let baseAgent = {};
46
+ if (customConfig.extends) {
47
+ const base = builtinAgents[customConfig.extends];
48
+ if (!base) {
49
+ const availableAgents = Object.keys(builtinAgents);
50
+ const agentList = availableAgents.length > 0 ? `Available agents: ${availableAgents.slice(0, 5).join(", ")}${availableAgents.length > 5 ? ` (and ${availableAgents.length - 5} more)` : ""}` : "No built-in agents found";
51
+ throw new Error(
52
+ `Custom agent "${agentId}" extends unknown agent "${customConfig.extends}". ${agentList}`
53
+ );
54
+ }
55
+ baseAgent = { ...base };
56
+ }
57
+ let disallowedTools;
58
+ if (customConfig.disallowed_tools || baseAgent.disallowed_tools) {
59
+ const merged = /* @__PURE__ */ new Set([
60
+ ...baseAgent.disallowed_tools || [],
61
+ ...customConfig.disallowed_tools || []
62
+ ]);
63
+ disallowedTools = [...merged];
64
+ }
65
+ let hooks;
66
+ if (customConfig.hooks || baseAgent.hooks) {
67
+ hooks = { ...baseAgent.hooks };
68
+ if (customConfig.hooks) {
69
+ for (const [hookType, hookDefs] of Object.entries(customConfig.hooks)) {
70
+ if (hooks[hookType]) {
71
+ hooks[hookType] = [...hooks[hookType], ...hookDefs];
72
+ } else {
73
+ hooks[hookType] = hookDefs;
74
+ }
75
+ }
76
+ }
77
+ }
78
+ return {
79
+ title: customConfig.title,
80
+ description: customConfig.description,
81
+ model: customConfig.model || baseAgent.model,
82
+ tools: customConfig.tools || baseAgent.tools || DEFAULT_TOOLS,
83
+ disallowed_tools: disallowedTools,
84
+ permission_mode: customConfig.permission_mode || baseAgent.permission_mode,
85
+ hooks,
86
+ // Use extended agent's path for template resolution, or _custom for standalone
87
+ path: baseAgent.path || CUSTOM_AGENT_PATH,
88
+ sourceRoot: baseAgent.sourceRoot
89
+ };
90
+ }
91
+ function resolveCustomAgents(customAgents, builtinAgents) {
92
+ const resolved = {};
93
+ for (const [id, config] of Object.entries(customAgents)) {
94
+ resolved[id] = resolveCustomAgent(id, config, builtinAgents);
95
+ }
96
+ return resolved;
97
+ }
98
+ function hasAgentIdConflict(customAgentId, builtinAgents) {
99
+ return customAgentId in builtinAgents;
100
+ }
101
+ function validateCustomAgentIds(customAgents, builtinAgents) {
102
+ const errors = [];
103
+ for (const customId of Object.keys(customAgents)) {
104
+ if (hasAgentIdConflict(customId, builtinAgents)) {
105
+ errors.push(
106
+ `Custom agent "${customId}" conflicts with built-in agent of the same name. Choose a unique name.`
107
+ );
108
+ }
109
+ }
110
+ return errors;
111
+ }
112
+
113
+ // src/cli-v2/lib/agent-recompiler.ts
114
+ import { parse as parseYaml } from "yaml";
115
+ async function getExistingAgentNames(pluginDir) {
116
+ const agentsDir = getPluginAgentsDir(pluginDir);
117
+ const files = await glob("*.md", agentsDir);
118
+ return files.map((f) => path.basename(f, ".md"));
119
+ }
120
+ async function loadConfigWithFallback(pluginDir) {
121
+ const legacyConfigPath = path.join(pluginDir, "config.yaml");
122
+ if (await fileExists(legacyConfigPath)) {
123
+ try {
124
+ const content = await readFile(legacyConfigPath);
125
+ const parsed = parseYaml(content);
126
+ if (parsed && typeof parsed === "object") {
127
+ verbose(`Loaded config.yaml from ${legacyConfigPath}`);
128
+ if (isLegacyStackConfig(parsed)) {
129
+ const normalized = normalizeStackConfig(parsed);
130
+ return {
131
+ config: normalized,
132
+ configPath: legacyConfigPath,
133
+ isLegacy: true
134
+ };
135
+ }
136
+ return {
137
+ config: parsed,
138
+ configPath: legacyConfigPath,
139
+ isLegacy: false
140
+ };
141
+ }
142
+ } catch (error) {
143
+ verbose(`Failed to parse config.yaml: ${error}`);
144
+ }
145
+ }
146
+ return loadProjectConfig(pluginDir);
147
+ }
148
+ function projectConfigToStackLike(config) {
149
+ return {
150
+ name: config.name,
151
+ version: "1.0.0",
152
+ author: config.author ?? "@unknown",
153
+ description: config.description,
154
+ skills: config.skills?.map((s) => typeof s === "string" ? { id: s } : s) ?? [],
155
+ agents: config.agents,
156
+ agent_skills: config.agent_skills,
157
+ hooks: config.hooks,
158
+ framework: config.framework,
159
+ philosophy: config.philosophy,
160
+ principles: config.principles,
161
+ tags: config.tags
162
+ };
163
+ }
164
+ async function recompileAgents(options) {
165
+ const {
166
+ pluginDir,
167
+ sourcePath,
168
+ agents: specifiedAgents,
169
+ skills: providedSkills,
170
+ projectDir,
171
+ outputDir
172
+ } = options;
173
+ const result = {
174
+ compiled: [],
175
+ failed: [],
176
+ warnings: []
177
+ };
178
+ const loadedConfig = await loadConfigWithFallback(pluginDir);
179
+ const projectConfig = loadedConfig?.config ?? null;
180
+ const builtinAgents = await loadAllAgents(sourcePath);
181
+ let allAgents = { ...builtinAgents };
182
+ if (projectConfig?.custom_agents) {
183
+ const idConflicts = validateCustomAgentIds(
184
+ projectConfig.custom_agents,
185
+ builtinAgents
186
+ );
187
+ if (idConflicts.length > 0) {
188
+ for (const error of idConflicts) {
189
+ result.warnings.push(error);
190
+ }
191
+ }
192
+ try {
193
+ const resolvedCustomAgents = resolveCustomAgents(
194
+ projectConfig.custom_agents,
195
+ builtinAgents
196
+ );
197
+ allAgents = { ...builtinAgents, ...resolvedCustomAgents };
198
+ verbose(
199
+ `Resolved ${Object.keys(resolvedCustomAgents).length} custom agents`
200
+ );
201
+ } catch (error) {
202
+ result.warnings.push(
203
+ `Failed to resolve custom agents: ${error instanceof Error ? error.message : String(error)}`
204
+ );
205
+ }
206
+ }
207
+ const pluginConfig = projectConfig ? projectConfigToStackLike(projectConfig) : null;
208
+ let agentNames;
209
+ if (specifiedAgents) {
210
+ agentNames = specifiedAgents;
211
+ } else if (pluginConfig?.agents) {
212
+ agentNames = pluginConfig.agents;
213
+ verbose(`Using agents from config.yaml: ${agentNames.join(", ")}`);
214
+ } else if (outputDir) {
215
+ agentNames = Object.keys(allAgents);
216
+ verbose(`Using all available agents from source: ${agentNames.join(", ")}`);
217
+ } else {
218
+ agentNames = await getExistingAgentNames(pluginDir);
219
+ }
220
+ if (agentNames.length === 0) {
221
+ result.warnings.push("No agents found to recompile");
222
+ return result;
223
+ }
224
+ verbose(
225
+ `Recompiling ${agentNames.length} agents in ${outputDir ?? pluginDir}`
226
+ );
227
+ const pluginSkills = providedSkills ?? await loadPluginSkills(pluginDir);
228
+ const compileAgents = {};
229
+ for (const agentName of agentNames) {
230
+ if (allAgents[agentName]) {
231
+ const customAgentConfig = projectConfig?.custom_agents?.[agentName];
232
+ if (customAgentConfig?.skills && customAgentConfig.skills.length > 0) {
233
+ const skillRefs = customAgentConfig.skills.map(
234
+ (s) => ({
235
+ id: typeof s === "string" ? s : s.id,
236
+ usage: `when working with ${(typeof s === "string" ? s : s.id).split(" ")[0]}`,
237
+ preloaded: (typeof s === "object" && "preloaded" in s && s.preloaded) ?? false
238
+ })
239
+ );
240
+ compileAgents[agentName] = { skills: skillRefs };
241
+ verbose(
242
+ ` Agent ${agentName}: ${skillRefs.length} skills from custom_agents`
243
+ );
244
+ } else if (pluginConfig?.agent_skills?.[agentName]) {
245
+ const skillRefs = resolveStackSkills(
246
+ pluginConfig,
247
+ agentName,
248
+ pluginSkills
249
+ );
250
+ compileAgents[agentName] = { skills: skillRefs };
251
+ verbose(` Agent ${agentName}: ${skillRefs.length} skills from config`);
252
+ } else if (pluginConfig?.skills) {
253
+ const skillRefs = pluginConfig.skills.map((s) => ({
254
+ id: s.id,
255
+ usage: `when working with ${s.id.split(" ")[0]}`,
256
+ preloaded: s.preloaded ?? false
257
+ }));
258
+ compileAgents[agentName] = { skills: skillRefs };
259
+ verbose(` Agent ${agentName}: ${skillRefs.length} skills (all)`);
260
+ } else {
261
+ compileAgents[agentName] = {};
262
+ }
263
+ } else {
264
+ result.warnings.push(
265
+ `Agent "${agentName}" not found in source definitions`
266
+ );
267
+ }
268
+ }
269
+ const compileConfig = {
270
+ name: pluginConfig?.name || path.basename(pluginDir),
271
+ description: pluginConfig?.description || "Recompiled plugin",
272
+ claude_md: "",
273
+ agents: compileAgents
274
+ };
275
+ const engine = await createLiquidEngine(projectDir);
276
+ const resolvedAgents = await resolveAgents(
277
+ allAgents,
278
+ pluginSkills,
279
+ compileConfig,
280
+ sourcePath
281
+ );
282
+ const agentsDir = outputDir ?? getPluginAgentsDir(pluginDir);
283
+ await ensureDir(agentsDir);
284
+ for (const [name, agent] of Object.entries(resolvedAgents)) {
285
+ try {
286
+ const output = await compileAgentForPlugin(
287
+ name,
288
+ agent,
289
+ sourcePath,
290
+ engine
291
+ );
292
+ await writeFile(path.join(agentsDir, `${name}.md`), output);
293
+ result.compiled.push(name);
294
+ verbose(` Recompiled: ${name}`);
295
+ } catch (error) {
296
+ result.failed.push(name);
297
+ result.warnings.push(
298
+ `Failed to compile ${name}: ${error instanceof Error ? error.message : String(error)}`
299
+ );
300
+ }
301
+ }
302
+ return result;
303
+ }
304
+
305
+ export {
306
+ recompileAgents
307
+ };
308
+ //# sourceMappingURL=chunk-FNOYEXUE.js.map