@agents-inc/cli 0.76.0 → 0.78.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 (182) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/dist/{chunk-Q4PJSAMP.js → chunk-32HX6UYI.js} +2 -1
  3. package/dist/chunk-32HX6UYI.js.map +1 -0
  4. package/dist/{chunk-CKU7FJNV.js → chunk-7HGMFJ4Y.js} +3 -3
  5. package/dist/{chunk-UBNHVBSV.js → chunk-7JQIMEUX.js} +3 -3
  6. package/dist/{chunk-XYZ7B5BY.js → chunk-7LBYURQR.js} +2 -2
  7. package/dist/{chunk-NWW3OJH5.js → chunk-A5JSBU65.js} +2 -2
  8. package/dist/{chunk-ODVQXXEO.js → chunk-B4C2S5LP.js} +17 -43
  9. package/dist/{chunk-ODVQXXEO.js.map → chunk-B4C2S5LP.js.map} +1 -1
  10. package/dist/{chunk-IDN2OZJY.js → chunk-C22ACAL2.js} +2 -2
  11. package/dist/{chunk-I2SUTL7S.js → chunk-D4T3HHE7.js} +5 -5
  12. package/dist/chunk-D4T3HHE7.js.map +1 -0
  13. package/dist/{chunk-7XUKTYVD.js → chunk-EO6KJI5D.js} +1038 -270
  14. package/dist/chunk-EO6KJI5D.js.map +1 -0
  15. package/dist/{chunk-WZ5S4LGX.js → chunk-F4IZ3UAS.js} +16 -22
  16. package/dist/chunk-F4IZ3UAS.js.map +1 -0
  17. package/dist/{chunk-JWMYAJHD.js → chunk-FSK4TQX7.js} +1236 -354
  18. package/dist/chunk-FSK4TQX7.js.map +1 -0
  19. package/dist/{chunk-WMMU5FOO.js → chunk-FUWUCKES.js} +2 -2
  20. package/dist/{chunk-WMMU5FOO.js.map → chunk-FUWUCKES.js.map} +1 -1
  21. package/dist/{chunk-S6DKM6MJ.js → chunk-HANGA633.js} +4 -8
  22. package/dist/{chunk-S6DKM6MJ.js.map → chunk-HANGA633.js.map} +1 -1
  23. package/dist/{chunk-CBYRFAUN.js → chunk-HK53FRMU.js} +3 -1
  24. package/dist/chunk-HK53FRMU.js.map +1 -0
  25. package/dist/{chunk-I534EWJQ.js → chunk-IFCASC6R.js} +2 -2
  26. package/dist/{chunk-2I5SXGXR.js → chunk-KQDGLEBF.js} +80 -5
  27. package/dist/chunk-KQDGLEBF.js.map +1 -0
  28. package/dist/{chunk-AE2QHAFO.js → chunk-KVRR4PEJ.js} +81 -73
  29. package/dist/chunk-KVRR4PEJ.js.map +1 -0
  30. package/dist/{chunk-R7F5YQMI.js → chunk-LVBRC2CP.js} +2 -6
  31. package/dist/chunk-LVBRC2CP.js.map +1 -0
  32. package/dist/{chunk-CCSU4R65.js → chunk-MG55NDVG.js} +2 -2
  33. package/dist/{chunk-M4ZDKHJV.js → chunk-MUCQ27HV.js} +2 -2
  34. package/dist/chunk-N2XGUAJU.js +34 -0
  35. package/dist/{chunk-7PZFDI46.js.map → chunk-N2XGUAJU.js.map} +1 -1
  36. package/dist/{chunk-PRG7PKZM.js → chunk-N34D3ROY.js} +14 -13
  37. package/dist/chunk-N34D3ROY.js.map +1 -0
  38. package/dist/{chunk-7PMFIL5L.js → chunk-NKLNT7N7.js} +4 -21
  39. package/dist/chunk-NKLNT7N7.js.map +1 -0
  40. package/dist/{chunk-WS3TL2AO.js → chunk-OIHZ2YH3.js} +172 -102
  41. package/dist/chunk-OIHZ2YH3.js.map +1 -0
  42. package/dist/chunk-OOWNDQCG.js +192 -0
  43. package/dist/chunk-OOWNDQCG.js.map +1 -0
  44. package/dist/{chunk-EEZSCHS2.js → chunk-OTMIGYBB.js} +52 -10
  45. package/dist/chunk-OTMIGYBB.js.map +1 -0
  46. package/dist/chunk-PZERKWE2.js +114 -0
  47. package/dist/chunk-PZERKWE2.js.map +1 -0
  48. package/dist/{chunk-O5CPXIC4.js → chunk-Q755X6QF.js} +4 -4
  49. package/dist/{chunk-36YW5E7G.js → chunk-QD3GQ2CH.js} +5 -5
  50. package/dist/{chunk-ERHTXNIF.js → chunk-RU5XLS5Q.js} +1 -5
  51. package/dist/{chunk-ERHTXNIF.js.map → chunk-RU5XLS5Q.js.map} +1 -1
  52. package/dist/{chunk-VQV3DSHD.js → chunk-SJNUTUSJ.js} +5 -5
  53. package/dist/{chunk-KPRCP3MZ.js → chunk-U2KFFRRX.js} +2 -2
  54. package/dist/{chunk-CBJTSEI2.js → chunk-VDVLM3KB.js} +54 -6
  55. package/dist/chunk-VDVLM3KB.js.map +1 -0
  56. package/dist/{chunk-7NACNRFG.js → chunk-W46L2PXK.js} +32 -23
  57. package/dist/chunk-W46L2PXK.js.map +1 -0
  58. package/dist/{chunk-6F3CZLD6.js → chunk-XA7WF3BI.js} +3 -3
  59. package/dist/{chunk-WN2TUP4M.js → chunk-XYPAOBBV.js} +2 -2
  60. package/dist/{chunk-LO5QGAP2.js → chunk-YFHVP3VA.js} +5 -12
  61. package/dist/chunk-YFHVP3VA.js.map +1 -0
  62. package/dist/commands/build/marketplace.js +4 -4
  63. package/dist/commands/build/plugins.js +8 -8
  64. package/dist/commands/build/stack.js +8 -8
  65. package/dist/commands/compile.js +38 -22
  66. package/dist/commands/compile.js.map +1 -1
  67. package/dist/commands/config/index.js +8 -8
  68. package/dist/commands/config/path.js +7 -7
  69. package/dist/commands/config/show.js +8 -8
  70. package/dist/commands/diff.js +35 -15
  71. package/dist/commands/diff.js.map +1 -1
  72. package/dist/commands/doctor.js +24 -12
  73. package/dist/commands/doctor.js.map +1 -1
  74. package/dist/commands/edit.js +47 -37
  75. package/dist/commands/edit.js.map +1 -1
  76. package/dist/commands/eject.js +7 -7
  77. package/dist/commands/import/skill.js +7 -7
  78. package/dist/commands/info.js +7 -7
  79. package/dist/commands/init.js +28 -28
  80. package/dist/commands/list.js +7 -7
  81. package/dist/commands/new/agent.js +8 -8
  82. package/dist/commands/new/marketplace.js +9 -9
  83. package/dist/commands/new/skill.js +8 -8
  84. package/dist/commands/outdated.js +18 -10
  85. package/dist/commands/outdated.js.map +1 -1
  86. package/dist/commands/search.js +9 -9
  87. package/dist/commands/uninstall.js +15 -27
  88. package/dist/commands/uninstall.js.map +1 -1
  89. package/dist/commands/update.js +26 -16
  90. package/dist/commands/update.js.map +1 -1
  91. package/dist/commands/validate.js +7 -7
  92. package/dist/components/skill-search/skill-search.js +2 -2
  93. package/dist/components/wizard/category-grid.js +3 -3
  94. package/dist/components/wizard/category-grid.test.js +18 -19
  95. package/dist/components/wizard/category-grid.test.js.map +1 -1
  96. package/dist/components/wizard/checkbox-grid.js +1 -2
  97. package/dist/components/wizard/checkbox-grid.test.js +2 -4
  98. package/dist/components/wizard/checkbox-grid.test.js.map +1 -1
  99. package/dist/components/wizard/domain-selection.js +10 -11
  100. package/dist/components/wizard/help-modal.js +2 -2
  101. package/dist/components/wizard/search-modal.js +2 -2
  102. package/dist/components/wizard/search-modal.test.js +2 -2
  103. package/dist/components/wizard/source-grid.js +4 -4
  104. package/dist/components/wizard/source-grid.test.js +13 -13
  105. package/dist/components/wizard/stack-selection.js +10 -9
  106. package/dist/components/wizard/stats-panel.js +12 -0
  107. package/dist/components/wizard/step-agents.js +9 -10
  108. package/dist/components/wizard/step-agents.test.js +16 -15
  109. package/dist/components/wizard/step-agents.test.js.map +1 -1
  110. package/dist/components/wizard/step-build.js +11 -12
  111. package/dist/components/wizard/step-build.test.js +34 -32
  112. package/dist/components/wizard/step-build.test.js.map +1 -1
  113. package/dist/components/wizard/step-confirm.js +4 -6
  114. package/dist/components/wizard/step-confirm.test.js +24 -23
  115. package/dist/components/wizard/step-confirm.test.js.map +1 -1
  116. package/dist/components/wizard/step-refine.js +2 -3
  117. package/dist/components/wizard/step-refine.test.js +2 -3
  118. package/dist/components/wizard/step-refine.test.js.map +1 -1
  119. package/dist/components/wizard/step-settings.js +8 -9
  120. package/dist/components/wizard/step-settings.test.js +14 -15
  121. package/dist/components/wizard/step-settings.test.js.map +1 -1
  122. package/dist/components/wizard/step-sources.js +11 -12
  123. package/dist/components/wizard/step-sources.test.js +17 -19
  124. package/dist/components/wizard/step-sources.test.js.map +1 -1
  125. package/dist/components/wizard/step-stack.js +12 -14
  126. package/dist/components/wizard/step-stack.test.js +26 -25
  127. package/dist/components/wizard/step-stack.test.js.map +1 -1
  128. package/dist/components/wizard/view-title.js +21 -3
  129. package/dist/components/wizard/view-title.js.map +1 -1
  130. package/dist/components/wizard/wizard-layout.js +12 -11
  131. package/dist/components/wizard/wizard-tabs.js +1 -1
  132. package/dist/components/wizard/wizard-tabs.test.js +1 -1
  133. package/dist/components/wizard/wizard.js +26 -26
  134. package/dist/config-exports.js +1 -1
  135. package/dist/hooks/init.js +28 -28
  136. package/dist/{loader-7RQ4G4TH.js → loader-JMOO2A7C.js} +4 -4
  137. package/dist/{source-loader-CXCIDGWV.js → source-loader-D3VIG3GM.js} +7 -7
  138. package/dist/source-manager-FPYFJRR7.js +19 -0
  139. package/dist/source-manager-FPYFJRR7.js.map +1 -0
  140. package/dist/stores/wizard-store.js +7 -7
  141. package/dist/stores/wizard-store.test.js +12 -12
  142. package/dist/stores/wizard-store.test.js.map +1 -1
  143. package/package.json +1 -1
  144. package/dist/chunk-2I5SXGXR.js.map +0 -1
  145. package/dist/chunk-7NACNRFG.js.map +0 -1
  146. package/dist/chunk-7PMFIL5L.js.map +0 -1
  147. package/dist/chunk-7PZFDI46.js +0 -40
  148. package/dist/chunk-7XUKTYVD.js.map +0 -1
  149. package/dist/chunk-AE2QHAFO.js.map +0 -1
  150. package/dist/chunk-CBJTSEI2.js.map +0 -1
  151. package/dist/chunk-CBYRFAUN.js.map +0 -1
  152. package/dist/chunk-EEZSCHS2.js.map +0 -1
  153. package/dist/chunk-EWBNSS5Y.js +0 -113
  154. package/dist/chunk-EWBNSS5Y.js.map +0 -1
  155. package/dist/chunk-I2SUTL7S.js.map +0 -1
  156. package/dist/chunk-JNQKCZA3.js +0 -28
  157. package/dist/chunk-JNQKCZA3.js.map +0 -1
  158. package/dist/chunk-JWMYAJHD.js.map +0 -1
  159. package/dist/chunk-LO5QGAP2.js.map +0 -1
  160. package/dist/chunk-PRG7PKZM.js.map +0 -1
  161. package/dist/chunk-Q4PJSAMP.js.map +0 -1
  162. package/dist/chunk-R7F5YQMI.js.map +0 -1
  163. package/dist/chunk-WS3TL2AO.js.map +0 -1
  164. package/dist/chunk-WZ5S4LGX.js.map +0 -1
  165. package/dist/source-manager-TPLO2DVS.js +0 -19
  166. /package/dist/{chunk-CKU7FJNV.js.map → chunk-7HGMFJ4Y.js.map} +0 -0
  167. /package/dist/{chunk-UBNHVBSV.js.map → chunk-7JQIMEUX.js.map} +0 -0
  168. /package/dist/{chunk-XYZ7B5BY.js.map → chunk-7LBYURQR.js.map} +0 -0
  169. /package/dist/{chunk-NWW3OJH5.js.map → chunk-A5JSBU65.js.map} +0 -0
  170. /package/dist/{chunk-IDN2OZJY.js.map → chunk-C22ACAL2.js.map} +0 -0
  171. /package/dist/{chunk-I534EWJQ.js.map → chunk-IFCASC6R.js.map} +0 -0
  172. /package/dist/{chunk-CCSU4R65.js.map → chunk-MG55NDVG.js.map} +0 -0
  173. /package/dist/{chunk-M4ZDKHJV.js.map → chunk-MUCQ27HV.js.map} +0 -0
  174. /package/dist/{chunk-O5CPXIC4.js.map → chunk-Q755X6QF.js.map} +0 -0
  175. /package/dist/{chunk-36YW5E7G.js.map → chunk-QD3GQ2CH.js.map} +0 -0
  176. /package/dist/{chunk-VQV3DSHD.js.map → chunk-SJNUTUSJ.js.map} +0 -0
  177. /package/dist/{chunk-KPRCP3MZ.js.map → chunk-U2KFFRRX.js.map} +0 -0
  178. /package/dist/{chunk-6F3CZLD6.js.map → chunk-XA7WF3BI.js.map} +0 -0
  179. /package/dist/{chunk-WN2TUP4M.js.map → chunk-XYPAOBBV.js.map} +0 -0
  180. /package/dist/{loader-7RQ4G4TH.js.map → components/wizard/stats-panel.js.map} +0 -0
  181. /package/dist/{source-loader-CXCIDGWV.js.map → loader-JMOO2A7C.js.map} +0 -0
  182. /package/dist/{source-manager-TPLO2DVS.js.map → source-loader-D3VIG3GM.js.map} +0 -0
@@ -0,0 +1,192 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ useMeasuredHeight
4
+ } from "./chunk-K77I4XGL.js";
5
+ import {
6
+ useRowScroll
7
+ } from "./chunk-SQ7WINEU.js";
8
+ import {
9
+ useWizardStore
10
+ } from "./chunk-N34D3ROY.js";
11
+ import {
12
+ matrix
13
+ } from "./chunk-FSK4TQX7.js";
14
+ import {
15
+ CLI_COLORS,
16
+ DEFAULT_SCRATCH_DOMAINS,
17
+ UI_SYMBOLS
18
+ } from "./chunk-FMYAYX6W.js";
19
+ import {
20
+ init_esm_shims
21
+ } from "./chunk-DHET7RCE.js";
22
+
23
+ // src/cli/components/wizard/stack-selection.tsx
24
+ init_esm_shims();
25
+ import { Box, Text, useInput } from "ink";
26
+ import React, { useMemo, useState } from "react";
27
+ import { jsx, jsxs } from "react/jsx-runtime";
28
+ var REACT_FRAMEWORK_ID = "web-framework-react";
29
+ var SCRATCH_LABEL = "Start from scratch";
30
+ var SCRATCH_DESCRIPTION = "Select domains and skills manually";
31
+ function groupStacks(stacks) {
32
+ const reactItems = [];
33
+ const otherItems = [];
34
+ for (const stack of stacks) {
35
+ const isReact = stack.allSkillIds.some((id) => id.startsWith(REACT_FRAMEWORK_ID));
36
+ const item = { id: stack.id, name: stack.name, description: stack.description };
37
+ if (isReact) {
38
+ reactItems.push(item);
39
+ } else {
40
+ otherItems.push(item);
41
+ }
42
+ }
43
+ const groups = [];
44
+ if (reactItems.length > 0) {
45
+ groups.push({ label: "React", items: reactItems });
46
+ }
47
+ if (otherItems.length > 0) {
48
+ groups.push({ label: "Other Frameworks", items: otherItems });
49
+ }
50
+ return groups;
51
+ }
52
+ function buildFocusableIds(groups) {
53
+ return [...groups.flatMap((g) => g.items.map((i) => i.id)), "scratch"];
54
+ }
55
+ var StackSection = ({ title, items, focusedId }) => /* @__PURE__ */ jsxs(Box, { flexDirection: "column", children: [
56
+ /* @__PURE__ */ jsx(Box, { flexShrink: 0, children: /* @__PURE__ */ jsxs(Text, { dimColor: true, bold: true, children: [
57
+ " ",
58
+ title
59
+ ] }) }),
60
+ items.map((item) => {
61
+ const isFocused = item.id === focusedId;
62
+ const pointer = isFocused ? UI_SYMBOLS.CHEVRON : UI_SYMBOLS.CHEVRON_SPACER;
63
+ return /* @__PURE__ */ jsx(Box, { flexShrink: 0, children: /* @__PURE__ */ jsxs(Text, { children: [
64
+ /* @__PURE__ */ jsx(Text, { color: isFocused ? CLI_COLORS.PRIMARY : void 0, children: pointer }),
65
+ /* @__PURE__ */ jsxs(Text, { color: isFocused ? CLI_COLORS.PRIMARY : void 0, bold: isFocused, children: [
66
+ " ",
67
+ item.name
68
+ ] }),
69
+ /* @__PURE__ */ jsxs(Text, { dimColor: true, children: [
70
+ " ",
71
+ item.description
72
+ ] })
73
+ ] }) }, item.id);
74
+ })
75
+ ] });
76
+ var StackSelection = ({ onCancel }) => {
77
+ const { selectStack, setApproach, setStackAction, populateFromSkillIds, toggleDomain } = useWizardStore();
78
+ const stacks = matrix.suggestedStacks;
79
+ const groups = useMemo(() => groupStacks(stacks), [stacks]);
80
+ const focusableIds = useMemo(() => buildFocusableIds(groups), [groups]);
81
+ const [focusedId, setFocusedId] = useState(focusableIds[0] ?? "scratch");
82
+ const { ref: listRef, measuredHeight: listHeight } = useMeasuredHeight();
83
+ const totalRowCount = useMemo(() => {
84
+ const groupRows = groups.reduce(
85
+ (sum, g, i) => sum + 1 + g.items.length + (i > 0 ? 1 : 0),
86
+ 0
87
+ );
88
+ return groupRows + 1 + 1;
89
+ }, [groups]);
90
+ const focusedVisualRow = useMemo(() => {
91
+ let row = 0;
92
+ for (let gi = 0; gi < groups.length; gi++) {
93
+ if (gi > 0) row++;
94
+ row++;
95
+ for (const item of groups[gi].items) {
96
+ if (item.id === focusedId) return row;
97
+ row++;
98
+ }
99
+ }
100
+ row++;
101
+ return row;
102
+ }, [groups, focusedId]);
103
+ const { scrollEnabled, scrollTop } = useRowScroll({
104
+ focusedIndex: focusedVisualRow,
105
+ itemCount: totalRowCount,
106
+ availableHeight: listHeight
107
+ });
108
+ useInput((input, key) => {
109
+ if (key.escape) {
110
+ if (onCancel) {
111
+ onCancel();
112
+ }
113
+ return;
114
+ }
115
+ const currentIdx = focusableIds.indexOf(focusedId);
116
+ if (key.upArrow || input === "k") {
117
+ const nextIdx = currentIdx <= 0 ? focusableIds.length - 1 : currentIdx - 1;
118
+ setFocusedId(focusableIds[nextIdx]);
119
+ return;
120
+ }
121
+ if (key.downArrow || input === "j") {
122
+ const nextIdx = currentIdx >= focusableIds.length - 1 ? 0 : currentIdx + 1;
123
+ setFocusedId(focusableIds[nextIdx]);
124
+ return;
125
+ }
126
+ if (key.return) {
127
+ if (focusedId === "scratch") {
128
+ selectStack(null);
129
+ setApproach("scratch");
130
+ for (const domain of DEFAULT_SCRATCH_DOMAINS) {
131
+ toggleDomain(domain);
132
+ }
133
+ return;
134
+ }
135
+ const focusedStack = stacks.find((s) => s.id === focusedId);
136
+ if (focusedStack) {
137
+ selectStack(focusedStack.id);
138
+ setStackAction("customize");
139
+ populateFromSkillIds(focusedStack.allSkillIds);
140
+ setApproach("stack");
141
+ }
142
+ }
143
+ });
144
+ const isScratchFocused = focusedId === "scratch";
145
+ const scratchPointer = isScratchFocused ? UI_SYMBOLS.CHEVRON : UI_SYMBOLS.CHEVRON_SPACER;
146
+ return /* @__PURE__ */ jsx(Box, { ref: listRef, flexDirection: "column", flexGrow: 1, flexBasis: 0, children: /* @__PURE__ */ jsx(
147
+ Box,
148
+ {
149
+ flexDirection: "column",
150
+ flexGrow: 1,
151
+ ...scrollEnabled && { overflow: "hidden" },
152
+ children: /* @__PURE__ */ jsxs(
153
+ Box,
154
+ {
155
+ flexDirection: "column",
156
+ marginTop: scrollTop > 0 ? -scrollTop : 0,
157
+ ...scrollEnabled && { flexShrink: 0 },
158
+ children: [
159
+ groups.map((group, gi) => /* @__PURE__ */ jsxs(React.Fragment, { children: [
160
+ gi > 0 && /* @__PURE__ */ jsx(Box, { flexShrink: 0, children: /* @__PURE__ */ jsx(Text, { children: " " }) }),
161
+ /* @__PURE__ */ jsx(StackSection, { title: group.label, items: group.items, focusedId })
162
+ ] }, group.label)),
163
+ /* @__PURE__ */ jsx(Box, { flexShrink: 0, children: /* @__PURE__ */ jsx(Text, { children: " " }) }, "scratch-spacer"),
164
+ /* @__PURE__ */ jsx(Box, { flexShrink: 0, children: /* @__PURE__ */ jsxs(Text, { children: [
165
+ /* @__PURE__ */ jsx(Text, { color: isScratchFocused ? CLI_COLORS.PRIMARY : void 0, children: scratchPointer }),
166
+ /* @__PURE__ */ jsxs(
167
+ Text,
168
+ {
169
+ color: isScratchFocused ? CLI_COLORS.PRIMARY : void 0,
170
+ bold: isScratchFocused,
171
+ children: [
172
+ " ",
173
+ SCRATCH_LABEL
174
+ ]
175
+ }
176
+ ),
177
+ /* @__PURE__ */ jsxs(Text, { dimColor: true, children: [
178
+ " ",
179
+ SCRATCH_DESCRIPTION
180
+ ] })
181
+ ] }) }, "scratch")
182
+ ]
183
+ }
184
+ )
185
+ }
186
+ ) });
187
+ };
188
+
189
+ export {
190
+ StackSelection
191
+ };
192
+ //# sourceMappingURL=chunk-OOWNDQCG.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/components/wizard/stack-selection.tsx"],"sourcesContent":["import { Box, Text, useInput } from \"ink\";\nimport React, { useMemo, useState } from \"react\";\nimport { CLI_COLORS, DEFAULT_SCRATCH_DOMAINS, UI_SYMBOLS } from \"../../consts.js\";\nimport { matrix } from \"../../lib/matrix/matrix-provider.js\";\nimport { useWizardStore } from \"../../stores/wizard-store.js\";\nimport { useMeasuredHeight } from \"../hooks/use-measured-height.js\";\nimport { useRowScroll } from \"../hooks/use-row-scroll.js\";\n\nimport type { SkillId } from \"../../types/index.js\";\n\ntype StackItem = { id: string; name: string; description: string };\ntype StackGroup = { label: string; items: StackItem[] };\ntype FocusId = string | \"scratch\";\n\nconst REACT_FRAMEWORK_ID = \"web-framework-react\";\nconst SCRATCH_LABEL = \"Start from scratch\";\nconst SCRATCH_DESCRIPTION = \"Select domains and skills manually\";\n\nfunction groupStacks(\n stacks: { id: string; name: string; description: string; allSkillIds: SkillId[] }[],\n): StackGroup[] {\n const reactItems: StackItem[] = [];\n const otherItems: StackItem[] = [];\n\n for (const stack of stacks) {\n const isReact = stack.allSkillIds.some((id) => id.startsWith(REACT_FRAMEWORK_ID));\n const item: StackItem = { id: stack.id, name: stack.name, description: stack.description };\n if (isReact) {\n reactItems.push(item);\n } else {\n otherItems.push(item);\n }\n }\n\n const groups: StackGroup[] = [];\n if (reactItems.length > 0) {\n groups.push({ label: \"React\", items: reactItems });\n }\n if (otherItems.length > 0) {\n groups.push({ label: \"Other Frameworks\", items: otherItems });\n }\n return groups;\n}\n\nfunction buildFocusableIds(groups: StackGroup[]): FocusId[] {\n return [...groups.flatMap((g) => g.items.map((i) => i.id)), \"scratch\"];\n}\n\n/** Renders a section header + stack items. Focus state is managed by the parent. */\nconst StackSection: React.FC<{\n title: string;\n items: StackItem[];\n focusedId: FocusId;\n}> = ({ title, items, focusedId }) => (\n <Box flexDirection=\"column\">\n <Box flexShrink={0}>\n <Text dimColor bold>\n {\" \"}\n {title}\n </Text>\n </Box>\n {items.map((item) => {\n const isFocused = item.id === focusedId;\n const pointer = isFocused ? UI_SYMBOLS.CHEVRON : UI_SYMBOLS.CHEVRON_SPACER;\n return (\n <Box key={item.id} flexShrink={0}>\n <Text>\n <Text color={isFocused ? CLI_COLORS.PRIMARY : undefined}>{pointer}</Text>\n <Text color={isFocused ? CLI_COLORS.PRIMARY : undefined} bold={isFocused}>\n {\" \"}\n {item.name}\n </Text>\n <Text dimColor>\n {\" \"}\n {item.description}\n </Text>\n </Text>\n </Box>\n );\n })}\n </Box>\n);\n\nexport type StackSelectionProps = {\n /** Available height in terminal lines for the scrollable viewport. 0 = no constraint. */\n availableHeight?: number;\n onCancel?: () => void;\n};\n\nexport const StackSelection: React.FC<StackSelectionProps> = ({ onCancel }) => {\n const { selectStack, setApproach, setStackAction, populateFromSkillIds, toggleDomain } =\n useWizardStore();\n\n const stacks = matrix.suggestedStacks;\n const groups = useMemo(() => groupStacks(stacks), [stacks]);\n const focusableIds = useMemo(() => buildFocusableIds(groups), [groups]);\n\n const [focusedId, setFocusedId] = useState<FocusId>(focusableIds[0] ?? \"scratch\");\n const { ref: listRef, measuredHeight: listHeight } = useMeasuredHeight();\n\n // Compute visual row counts for scroll: header + items per group, spacers between groups, spacer + scratch row\n const totalRowCount = useMemo(() => {\n const groupRows = groups.reduce(\n (sum, g, i) =>\n sum + 1 /* header */ + g.items.length + (i > 0 ? 1 : 0) /* spacer between groups */,\n 0,\n );\n return groupRows + 1 /* spacer before scratch */ + 1 /* scratch row */;\n }, [groups]);\n\n // Map focusedId to a visual row index for scrolling\n const focusedVisualRow = useMemo(() => {\n let row = 0;\n for (let gi = 0; gi < groups.length; gi++) {\n if (gi > 0) row++; // spacer between groups\n row++; // header\n for (const item of groups[gi].items) {\n if (item.id === focusedId) return row;\n row++;\n }\n }\n row++; // spacer before scratch\n return row; // scratch row\n }, [groups, focusedId]);\n\n const { scrollEnabled, scrollTop } = useRowScroll({\n focusedIndex: focusedVisualRow,\n itemCount: totalRowCount,\n availableHeight: listHeight,\n });\n\n useInput((input, key) => {\n if (key.escape) {\n if (onCancel) {\n onCancel();\n }\n return;\n }\n\n const currentIdx = focusableIds.indexOf(focusedId);\n\n if (key.upArrow || input === \"k\") {\n const nextIdx = currentIdx <= 0 ? focusableIds.length - 1 : currentIdx - 1;\n setFocusedId(focusableIds[nextIdx]!);\n return;\n }\n if (key.downArrow || input === \"j\") {\n const nextIdx = currentIdx >= focusableIds.length - 1 ? 0 : currentIdx + 1;\n setFocusedId(focusableIds[nextIdx]!);\n return;\n }\n\n if (key.return) {\n if (focusedId === \"scratch\") {\n selectStack(null);\n setApproach(\"scratch\");\n for (const domain of DEFAULT_SCRATCH_DOMAINS) {\n toggleDomain(domain);\n }\n return;\n }\n const focusedStack = stacks.find((s) => s.id === focusedId);\n if (focusedStack) {\n selectStack(focusedStack.id);\n setStackAction(\"customize\");\n populateFromSkillIds(focusedStack.allSkillIds);\n setApproach(\"stack\");\n }\n }\n });\n\n const isScratchFocused = focusedId === \"scratch\";\n const scratchPointer = isScratchFocused ? UI_SYMBOLS.CHEVRON : UI_SYMBOLS.CHEVRON_SPACER;\n\n return (\n <Box ref={listRef} flexDirection=\"column\" flexGrow={1} flexBasis={0}>\n <Box\n flexDirection=\"column\"\n flexGrow={1}\n {...(scrollEnabled && { overflow: \"hidden\" as const })}\n >\n <Box\n flexDirection=\"column\"\n marginTop={scrollTop > 0 ? -scrollTop : 0}\n {...(scrollEnabled && { flexShrink: 0 })}\n >\n {groups.map((group, gi) => (\n <React.Fragment key={group.label}>\n {gi > 0 && (\n <Box flexShrink={0}>\n <Text> </Text>\n </Box>\n )}\n <StackSection title={group.label} items={group.items} focusedId={focusedId} />\n </React.Fragment>\n ))}\n\n <Box key=\"scratch-spacer\" flexShrink={0}>\n <Text> </Text>\n </Box>\n <Box key=\"scratch\" flexShrink={0}>\n <Text>\n <Text color={isScratchFocused ? CLI_COLORS.PRIMARY : undefined}>\n {scratchPointer}\n </Text>\n <Text\n color={isScratchFocused ? CLI_COLORS.PRIMARY : undefined}\n bold={isScratchFocused}\n >\n {\" \"}\n {SCRATCH_LABEL}\n </Text>\n <Text dimColor>\n {\" \"}\n {SCRATCH_DESCRIPTION}\n </Text>\n </Text>\n </Box>\n </Box>\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
  Wizard
4
- } from "./chunk-ODVQXXEO.js";
4
+ } from "./chunk-B4C2S5LP.js";
5
5
  import {
6
6
  SelectList
7
7
  } from "./chunk-MLXAZODL.js";
@@ -9,7 +9,7 @@ import {
9
9
  KEY_LABEL_ARROWS_VERT,
10
10
  KEY_LABEL_ENTER,
11
11
  KEY_LABEL_ESC
12
- } from "./chunk-CBYRFAUN.js";
12
+ } from "./chunk-HK53FRMU.js";
13
13
  import {
14
14
  STATUS_MESSAGES,
15
15
  SUCCESS_MESSAGES
@@ -18,6 +18,8 @@ import {
18
18
  claudePluginInstall,
19
19
  claudePluginMarketplaceAdd,
20
20
  claudePluginMarketplaceExists,
21
+ claudePluginMarketplaceUpdate,
22
+ copySkillsToLocalFlattened,
21
23
  deriveInstallMode,
22
24
  detectProjectInstallation,
23
25
  ensureBlankGlobalConfig,
@@ -26,26 +28,28 @@ import {
26
28
  installLocal,
27
29
  installPluginConfig,
28
30
  loadProjectConfig,
29
- loadSkillsMatrixFromSource
30
- } from "./chunk-WS3TL2AO.js";
31
+ loadSkillsMatrixFromSource,
32
+ resolveInstallPaths
33
+ } from "./chunk-OIHZ2YH3.js";
31
34
  import {
32
35
  getSkillById
33
- } from "./chunk-JWMYAJHD.js";
36
+ } from "./chunk-FSK4TQX7.js";
34
37
  import {
35
38
  BaseCommand,
36
39
  EXIT_CODES
37
- } from "./chunk-XYZ7B5BY.js";
40
+ } from "./chunk-7LBYURQR.js";
38
41
  import {
39
42
  disableBuffering,
40
43
  drainBuffer,
41
44
  enableBuffering,
45
+ ensureDir,
42
46
  fileExists,
43
47
  getErrorMessage,
44
48
  readFileSafe,
45
49
  settingsFileSchema,
46
50
  warn,
47
51
  warnUnknownFields
48
- } from "./chunk-WN2TUP4M.js";
52
+ } from "./chunk-XYPAOBBV.js";
49
53
  import {
50
54
  ASCII_LOGO,
51
55
  CLAUDE_DIR,
@@ -192,7 +196,7 @@ async function getDashboardData(projectDir) {
192
196
  return { skillCount, agentCount, mode, source };
193
197
  }
194
198
  function formatDashboardText(data) {
195
- const modeLabel = data.mode === "plugin" ? "Plugin" : "Local";
199
+ const modeLabel = data.mode === "plugin" ? "Plugin" : data.mode === "mixed" ? "Mixed" : "Local";
196
200
  const lines = [
197
201
  DEFAULT_BRANDING.NAME,
198
202
  "",
@@ -322,15 +326,47 @@ var Init = class _Init extends BaseCommand {
322
326
  async handleInstallation(result, sourceResult, flags) {
323
327
  const projectDir = process.cwd();
324
328
  const installMode = deriveInstallMode(result.skills);
329
+ const localSkills = result.skills.filter((s) => s.source === "local");
330
+ const pluginSkills = result.skills.filter((s) => s.source !== "local");
325
331
  this.log("\n");
326
332
  this.log(`Selected ${result.skills.length} skills`);
327
333
  this.log(
328
- `Install mode: ${installMode === "plugin" ? "Plugin (native install)" : "Local (copy to .claude/skills/)"}`
334
+ `Install mode: ${installMode === "plugin" ? "Plugin (native install)" : installMode === "mixed" ? `Mixed (${localSkills.length} local, ${pluginSkills.length} plugin)` : "Local (copy to .claude/skills/)"}`
329
335
  );
330
336
  if (installMode === "plugin") {
331
337
  await this.installIndividualPlugins(result, sourceResult, flags, projectDir);
332
338
  return;
333
339
  }
340
+ if (installMode === "mixed") {
341
+ const projectLocalSkills = localSkills.filter((s) => s.scope !== "global");
342
+ const globalLocalSkills = localSkills.filter((s) => s.scope === "global");
343
+ const projectPaths = resolveInstallPaths(projectDir, "project");
344
+ const globalPaths = resolveInstallPaths(projectDir, "global");
345
+ const projectCopied = projectLocalSkills.length > 0 ? (await ensureDir(projectPaths.skillsDir), await copySkillsToLocalFlattened(
346
+ projectLocalSkills.map((s) => s.id),
347
+ projectPaths.skillsDir,
348
+ sourceResult.matrix,
349
+ sourceResult
350
+ )) : [];
351
+ const globalCopied = globalLocalSkills.length > 0 ? (await ensureDir(globalPaths.skillsDir), await copySkillsToLocalFlattened(
352
+ globalLocalSkills.map((s) => s.id),
353
+ globalPaths.skillsDir,
354
+ sourceResult.matrix,
355
+ sourceResult
356
+ )) : [];
357
+ const totalCopied = projectCopied.length + globalCopied.length;
358
+ if (projectCopied.length > 0 && globalCopied.length > 0) {
359
+ this.log(
360
+ `Copied ${totalCopied} local skills (${projectCopied.length} project, ${globalCopied.length} global)`
361
+ );
362
+ } else if (globalCopied.length > 0) {
363
+ this.log(`Copied ${globalCopied.length} local skills to ~/.claude/skills/`);
364
+ } else {
365
+ this.log(`Copied ${projectCopied.length} local skills to .claude/skills/`);
366
+ }
367
+ await this.installIndividualPlugins(result, sourceResult, flags, projectDir);
368
+ return;
369
+ }
334
370
  await this.installLocalMode(result, sourceResult, flags, projectDir);
335
371
  }
336
372
  async installIndividualPlugins(result, sourceResult, flags, projectDir) {
@@ -357,6 +393,12 @@ var Init = class _Init extends BaseCommand {
357
393
  exit: EXIT_CODES.ERROR
358
394
  });
359
395
  }
396
+ } else {
397
+ try {
398
+ await claudePluginMarketplaceUpdate(marketplace);
399
+ } catch (error) {
400
+ this.warn(`Could not update marketplace \u2014 continuing with cached version`);
401
+ }
360
402
  }
361
403
  this.log("Installing skill plugins...");
362
404
  for (const skill of result.skills.filter((s) => s.source !== "local")) {
@@ -473,4 +515,4 @@ export {
473
515
  showDashboard,
474
516
  Init
475
517
  };
476
- //# sourceMappingURL=chunk-EEZSCHS2.js.map
518
+ //# sourceMappingURL=chunk-OTMIGYBB.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/commands/init.tsx","../src/cli/lib/permission-checker.tsx"],"sourcesContent":["import React from \"react\";\n\nimport { Flags } from \"@oclif/core\";\nimport { render, Box, Text, useApp } from \"ink\";\nimport fs from \"fs\";\n\nimport { BaseCommand } from \"../base-command.js\";\nimport { Wizard, type WizardResultV2 } from \"../components/wizard/wizard.js\";\nimport {\n loadSkillsMatrixFromSource,\n fetchMarketplace,\n type SourceLoadResult,\n} from \"../lib/loading/index.js\";\nimport {\n installLocal,\n installPluginConfig,\n detectProjectInstallation,\n deriveInstallMode,\n resolveInstallPaths,\n} from \"../lib/installation/index.js\";\nimport { copySkillsToLocalFlattened } from \"../lib/skills/index.js\";\nimport { ensureDir } from \"../utils/fs.js\";\nimport { checkPermissions } from \"../lib/permission-checker.js\";\nimport { getInstallationInfo } from \"../lib/plugins/plugin-info.js\";\nimport {\n claudePluginInstall,\n claudePluginMarketplaceExists,\n claudePluginMarketplaceAdd,\n claudePluginMarketplaceUpdate,\n} from \"../utils/exec.js\";\nimport {\n ASCII_LOGO,\n CLAUDE_SRC_DIR,\n CLI_BIN_NAME,\n DEFAULT_BRANDING,\n GLOBAL_INSTALL_ROOT,\n} from \"../consts.js\";\nimport { SelectList, type SelectListItem } from \"../components/common/select-list.js\";\nimport {\n KEY_LABEL_ARROWS_VERT,\n KEY_LABEL_ENTER,\n KEY_LABEL_ESC,\n} from \"../components/wizard/hotkeys.js\";\nimport { getErrorMessage } from \"../utils/errors.js\";\nimport { EXIT_CODES } from \"../lib/exit-codes.js\";\nimport { getSkillById } from \"../lib/matrix/matrix-provider\";\nimport { loadProjectConfig } from \"../lib/configuration/project-config.js\";\nimport {\n enableBuffering,\n drainBuffer,\n disableBuffering,\n type StartupMessage,\n} from \"../utils/logger.js\";\nimport { SUCCESS_MESSAGES, STATUS_MESSAGES } from \"../utils/messages.js\";\nimport { ensureBlankGlobalConfig } from \"../lib/configuration/config-writer.js\";\n\n/** Clears the visible terminal area so the next render starts clean. */\nfunction clearTerminalOutput(): void {\n process.stdout.write(\"\\x1b[2J\\x1b[H\");\n}\n\nconst DASHBOARD_OPTIONS: SelectListItem<string>[] = [\n { label: \"Edit\", value: \"edit\" },\n { label: \"Compile\", value: \"compile\" },\n { label: \"Doctor\", value: \"doctor\" },\n { label: \"List\", value: \"list\" },\n];\n\ntype DashboardProps = {\n onSelect: (command: string) => void;\n onCancel: () => void;\n};\n\nconst Dashboard: React.FC<DashboardProps> = ({ onSelect, onCancel }) => {\n const { exit } = useApp();\n\n return (\n <Box flexDirection=\"column\">\n <Text bold>{DEFAULT_BRANDING.NAME}</Text>\n <Text> </Text>\n <SelectList\n items={DASHBOARD_OPTIONS}\n onSelect={(command) => {\n onSelect(command);\n exit();\n }}\n onCancel={() => {\n onCancel();\n exit();\n }}\n />\n <Text> </Text>\n <Text dimColor>\n {\" \"}\n {KEY_LABEL_ARROWS_VERT} Navigate {\" \"}\n {KEY_LABEL_ENTER} Confirm {\" \"}\n {KEY_LABEL_ESC} Exit\n </Text>\n </Box>\n );\n};\n\nexport type DashboardData = {\n skillCount: number;\n agentCount: number;\n mode: string;\n source?: string;\n};\n\n/** Gathers dashboard data from the installation and project config. */\nexport async function getDashboardData(projectDir: string): Promise<DashboardData> {\n const [info, loaded] = await Promise.all([getInstallationInfo(), loadProjectConfig(projectDir)]);\n\n // Skill count from config (canonical source of truth for installed skills)\n const skillCount = loaded?.config?.skills?.length ?? 0;\n // Agent count from filesystem (compiled .md files in agents dir)\n const agentCount = info?.agentCount ?? 0;\n const mode =\n info?.mode ?? (loaded?.config?.skills ? deriveInstallMode(loaded.config.skills) : \"local\");\n const source = loaded?.config?.source;\n\n return { skillCount, agentCount, mode, source };\n}\n\n/** Formats the dashboard summary as plain text lines (for non-interactive/test output). */\nexport function formatDashboardText(data: DashboardData): string {\n const modeLabel = data.mode === \"plugin\" ? \"Plugin\" : data.mode === \"mixed\" ? \"Mixed\" : \"Local\";\n const lines = [\n DEFAULT_BRANDING.NAME,\n \"\",\n ` Skills: ${data.skillCount} installed`,\n ` Agents: ${data.agentCount} compiled`,\n ` Mode: ${modeLabel}`,\n ];\n if (data.source) {\n lines.push(` Source: ${data.source}`);\n }\n lines.push(\"\");\n lines.push(` [Edit] [Compile] [Doctor] [List]`);\n return lines.join(\"\\n\");\n}\n\n/**\n * Shows the project dashboard and returns the selected command (or null if cancelled).\n * In non-interactive environments (no TTY), prints the summary text and returns null.\n */\nexport async function showDashboard(\n projectDir: string,\n log?: (message: string) => void,\n): Promise<string | null> {\n const data = await getDashboardData(projectDir);\n\n // Non-interactive: print text summary and exit (CI, piped, tests)\n if (!process.stdin.isTTY) {\n const output = log ?? console.log;\n output(formatDashboardText(data));\n return null;\n }\n\n let selectedCommand: string | null = null;\n\n const { waitUntilExit } = render(\n <Dashboard\n onSelect={(command) => {\n selectedCommand = command;\n }}\n onCancel={() => {\n selectedCommand = null;\n }}\n />,\n );\n\n await waitUntilExit();\n clearTerminalOutput();\n\n return selectedCommand;\n}\n\nexport default class Init extends BaseCommand {\n static summary = `Initialize ${DEFAULT_BRANDING.NAME} in this project`;\n static description =\n \"Interactive wizard to set up skills and agents. Supports Plugin Mode (native install) and Local Mode (copy to .claude/).\";\n\n static examples = [\n {\n description: \"Start the setup wizard\",\n command: \"<%= config.bin %> <%= command.id %>\",\n },\n {\n description: \"Initialize from a custom marketplace\",\n command: \"<%= config.bin %> <%= command.id %> --source github:org/marketplace\",\n },\n {\n description: \"Force refresh skills from remote\",\n command: \"<%= config.bin %> <%= command.id %> --refresh\",\n },\n ];\n\n static flags = {\n ...BaseCommand.baseFlags,\n refresh: Flags.boolean({\n description: \"Force refresh from remote source\",\n default: false,\n }),\n };\n\n async run(): Promise<void> {\n const { flags } = await this.parse(Init);\n const projectDir = process.cwd();\n\n // For \"already initialized\" check, only look at the target directory (no global fallback)\n const existingInstallation = await detectProjectInstallation(projectDir);\n\n if (existingInstallation) {\n const selectedCommand = await showDashboard(projectDir, (msg) => this.log(msg));\n if (selectedCommand) {\n await this.config.runCommand(selectedCommand);\n }\n return;\n }\n\n // Auto-create blank global config on first init from a project directory.\n // This ensures the project config can always import from global.\n // Resolve both paths through realpathSync — on macOS /var is a symlink to\n // /private/var, so os.homedir() and process.cwd() can return different\n // prefixes for the same directory.\n const isGlobalRoot = fs.realpathSync(projectDir) === fs.realpathSync(GLOBAL_INSTALL_ROOT);\n if (!isGlobalRoot) {\n const created = await ensureBlankGlobalConfig();\n if (created) {\n this.log(\"Created blank global config at ~/\" + CLAUDE_SRC_DIR);\n }\n }\n\n enableBuffering();\n\n let sourceResult: SourceLoadResult;\n let startupMessages: StartupMessage[] = [];\n try {\n sourceResult = await loadSkillsMatrixFromSource({\n sourceFlag: flags.source,\n projectDir,\n forceRefresh: flags.refresh,\n });\n } catch (error) {\n disableBuffering();\n this.error(getErrorMessage(error), {\n exit: EXIT_CODES.ERROR,\n });\n }\n\n startupMessages = drainBuffer();\n disableBuffering();\n\n let wizardResult: WizardResultV2 | null = null;\n\n const { waitUntilExit } = render(\n <Wizard\n version={this.config.version}\n logo={ASCII_LOGO}\n projectDir={projectDir}\n startupMessages={startupMessages}\n onComplete={(result) => {\n wizardResult = result;\n }}\n onCancel={() => {\n this.log(\"Setup cancelled\");\n }}\n />,\n );\n\n await waitUntilExit();\n\n // TypeScript can't track that onComplete callback mutates wizardResult before waitUntilExit resolves\n const result = wizardResult as WizardResultV2 | null;\n\n if (!result || result.cancelled) {\n this.exit(EXIT_CODES.CANCELLED);\n }\n\n if (result.skills.length === 0) {\n this.error(\"No skills selected\", { exit: EXIT_CODES.ERROR });\n }\n\n await this.handleInstallation(result, sourceResult, flags);\n }\n\n private async handleInstallation(\n result: WizardResultV2,\n sourceResult: SourceLoadResult,\n flags: { source?: string; refresh: boolean },\n ): Promise<void> {\n const projectDir = process.cwd();\n const installMode = deriveInstallMode(result.skills);\n\n const localSkills = result.skills.filter((s) => s.source === \"local\");\n const pluginSkills = result.skills.filter((s) => s.source !== \"local\");\n\n this.log(\"\\n\");\n this.log(`Selected ${result.skills.length} skills`);\n this.log(\n `Install mode: ${\n installMode === \"plugin\"\n ? \"Plugin (native install)\"\n : installMode === \"mixed\"\n ? `Mixed (${localSkills.length} local, ${pluginSkills.length} plugin)`\n : \"Local (copy to .claude/skills/)\"\n }`,\n );\n\n if (installMode === \"plugin\") {\n await this.installIndividualPlugins(result, sourceResult, flags, projectDir);\n return;\n }\n\n if (installMode === \"mixed\") {\n // Split local skills by scope — project skills go to .claude/skills/,\n // global skills go to ~/.claude/skills/ (mirrors installLocal pattern)\n const projectLocalSkills = localSkills.filter((s) => s.scope !== \"global\");\n const globalLocalSkills = localSkills.filter((s) => s.scope === \"global\");\n\n const projectPaths = resolveInstallPaths(projectDir, \"project\");\n const globalPaths = resolveInstallPaths(projectDir, \"global\");\n\n const projectCopied =\n projectLocalSkills.length > 0\n ? (await ensureDir(projectPaths.skillsDir),\n await copySkillsToLocalFlattened(\n projectLocalSkills.map((s) => s.id),\n projectPaths.skillsDir,\n sourceResult.matrix,\n sourceResult,\n ))\n : [];\n\n const globalCopied =\n globalLocalSkills.length > 0\n ? (await ensureDir(globalPaths.skillsDir),\n await copySkillsToLocalFlattened(\n globalLocalSkills.map((s) => s.id),\n globalPaths.skillsDir,\n sourceResult.matrix,\n sourceResult,\n ))\n : [];\n\n const totalCopied = projectCopied.length + globalCopied.length;\n if (projectCopied.length > 0 && globalCopied.length > 0) {\n this.log(\n `Copied ${totalCopied} local skills (${projectCopied.length} project, ${globalCopied.length} global)`,\n );\n } else if (globalCopied.length > 0) {\n this.log(`Copied ${globalCopied.length} local skills to ~/.claude/skills/`);\n } else {\n this.log(`Copied ${projectCopied.length} local skills to .claude/skills/`);\n }\n\n // Install plugin skills + generate config + compile agents (uses full result)\n await this.installIndividualPlugins(result, sourceResult, flags, projectDir);\n return;\n }\n\n await this.installLocalMode(result, sourceResult, flags, projectDir);\n }\n\n private async installIndividualPlugins(\n result: WizardResultV2,\n sourceResult: SourceLoadResult,\n flags: { source?: string },\n projectDir: string,\n ): Promise<void> {\n // Lazily resolve marketplace name if not already set (e.g. BUILT_IN_MATRIX skips fetch)\n if (!sourceResult.marketplace) {\n try {\n const marketplaceResult = await fetchMarketplace(sourceResult.sourceConfig.source, {});\n sourceResult.marketplace = marketplaceResult.marketplace.name;\n } catch {\n this.warn(\"Could not resolve marketplace. Falling back to Local Mode...\");\n await this.installLocalMode(result, sourceResult, flags, projectDir);\n return;\n }\n }\n\n // After lazy resolution, marketplace is guaranteed to be set (or we returned above)\n const marketplace = sourceResult.marketplace;\n\n const marketplaceExists = await claudePluginMarketplaceExists(marketplace);\n\n if (!marketplaceExists) {\n this.log(`Registering marketplace \"${marketplace}\"...`);\n try {\n const marketplaceSource = sourceResult.sourceConfig.source.replace(/^github:/, \"\");\n await claudePluginMarketplaceAdd(marketplaceSource);\n this.log(`Registered marketplace: ${marketplace}`);\n } catch (error) {\n this.error(getErrorMessage(error), {\n exit: EXIT_CODES.ERROR,\n });\n }\n } else {\n try {\n await claudePluginMarketplaceUpdate(marketplace);\n } catch (error) {\n this.warn(`Could not update marketplace — continuing with cached version`);\n }\n }\n\n this.log(\"Installing skill plugins...\");\n for (const skill of result.skills.filter((s) => s.source !== \"local\")) {\n const pluginRef = `${skill.id}@${marketplace}`;\n const pluginScope = skill.scope === \"global\" ? \"user\" : \"project\";\n try {\n await claudePluginInstall(pluginRef, pluginScope, projectDir);\n this.log(` Installed ${pluginRef}`);\n } catch (error) {\n this.error(`Failed to install plugin ${pluginRef}: ${getErrorMessage(error)}`, {\n exit: EXIT_CODES.ERROR,\n });\n }\n }\n\n const pluginSkillCount = result.skills.filter((s) => s.source !== \"local\").length;\n this.log(`Installed ${pluginSkillCount} skill plugins\\n`);\n\n this.log(\"Generating configuration...\");\n try {\n const configResult = await installPluginConfig({\n wizardResult: result,\n sourceResult,\n projectDir,\n sourceFlag: flags.source,\n });\n\n if (configResult.wasMerged) {\n this.log(`Merged with existing config at ${configResult.mergedConfigPath}`);\n }\n\n this.log(`Configuration saved (${configResult.config.agents.length} agents)\\n`);\n this.log(STATUS_MESSAGES.COMPILING_AGENTS);\n this.log(`Compiled ${configResult.compiledAgents.length} agents to .claude/agents/\\n`);\n\n this.log(`${SUCCESS_MESSAGES.INIT_SUCCESS}\\n`);\n this.log(\"Agents compiled to:\");\n this.log(` ${configResult.agentsDir}`);\n for (const agentName of configResult.compiledAgents) {\n this.log(` ${agentName}.md`);\n }\n this.log(\"\");\n this.log(\"Configuration:\");\n this.log(` ${configResult.configPath}`);\n this.log(\"\");\n this.log(\"To customize agent-skill assignments:\");\n this.log(` 1. Edit .claude-src/config.ts`);\n this.log(` 2. Run '${CLI_BIN_NAME} compile' to regenerate agents`);\n this.log(\"\");\n\n const permissionWarning = await checkPermissions(projectDir);\n if (permissionWarning) {\n const { waitUntilExit } = render(permissionWarning);\n await waitUntilExit();\n }\n } catch (error) {\n this.handleError(error);\n }\n }\n\n private async installLocalMode(\n result: WizardResultV2,\n sourceResult: SourceLoadResult,\n flags: { source?: string },\n projectDir: string,\n ): Promise<void> {\n this.log(\"Copying skills to local directory...\");\n try {\n const installResult = await installLocal({\n wizardResult: result,\n sourceResult,\n projectDir,\n sourceFlag: flags.source,\n });\n\n this.log(`Copied ${installResult.copiedSkills.length} skills to .claude/skills/\\n`);\n this.log(\"Generating configuration...\");\n\n if (installResult.wasMerged) {\n this.log(`Merged with existing config at ${installResult.mergedConfigPath}`);\n }\n\n this.log(`Configuration saved (${installResult.config.agents.length} agents)\\n`);\n this.log(STATUS_MESSAGES.COMPILING_AGENTS);\n this.log(`Compiled ${installResult.compiledAgents.length} agents to .claude/agents/\\n`);\n\n this.log(`${SUCCESS_MESSAGES.INIT_SUCCESS}\\n`);\n this.log(\"Skills copied to:\");\n this.log(` ${installResult.skillsDir}`);\n for (const copiedSkill of installResult.copiedSkills) {\n const displayName = getSkillById(copiedSkill.skillId).displayName;\n this.log(` ${displayName}/`);\n }\n this.log(\"\");\n this.log(\"Agents compiled to:\");\n this.log(` ${installResult.agentsDir}`);\n for (const agentName of installResult.compiledAgents) {\n this.log(` ${agentName}.md`);\n }\n this.log(\"\");\n this.log(\"Configuration:\");\n this.log(` ${installResult.configPath}`);\n this.log(\"\");\n this.log(\"To customize agent-skill assignments:\");\n this.log(` 1. Edit .claude-src/config.ts`);\n this.log(` 2. Run '${CLI_BIN_NAME} compile' to regenerate agents`);\n this.log(\"\");\n\n const permissionWarning = await checkPermissions(projectDir);\n if (permissionWarning) {\n const { waitUntilExit } = render(permissionWarning);\n await waitUntilExit();\n }\n } catch (error) {\n this.handleError(error);\n }\n }\n}\n","import React from \"react\";\n\nimport { Text, Box } from \"ink\";\nimport path from \"path\";\n\nimport { CLAUDE_DIR, CLI_COLORS, MAX_CONFIG_FILE_SIZE } from \"../consts\";\nimport { fileExists, readFileSafe } from \"../utils/fs\";\nimport { warn } from \"../utils/logger\";\nimport { settingsFileSchema, warnUnknownFields } from \"./schemas\";\n\ntype PermissionConfig = {\n allow?: string[];\n deny?: string[];\n};\n\ntype SettingsFile = {\n permissions?: PermissionConfig;\n};\n\nexport async function checkPermissions(projectRoot: string): Promise<React.ReactElement | null> {\n const settingsPath = path.join(projectRoot, CLAUDE_DIR, \"settings.json\");\n const localSettingsPath = path.join(projectRoot, CLAUDE_DIR, \"settings.local.json\");\n\n let permissions: PermissionConfig | undefined;\n\n for (const filePath of [localSettingsPath, settingsPath]) {\n if (await fileExists(filePath)) {\n try {\n const content = await readFileSafe(filePath, MAX_CONFIG_FILE_SIZE);\n const raw = JSON.parse(content);\n if (typeof raw === \"object\" && raw !== null && !Array.isArray(raw)) {\n // Known Claude CLI settings.json fields (permissions is ours; the rest are managed by Claude CLI)\n const EXPECTED_SETTINGS_KEYS = [\n \"permissions\",\n \"enabledPlugins\",\n \"env\",\n \"allowedTools\",\n \"customInstructions\",\n \"defaultModel\",\n ] as const;\n warnUnknownFields(\n raw as Record<string, unknown>,\n EXPECTED_SETTINGS_KEYS,\n `settings file '${filePath}'`,\n );\n }\n const result = settingsFileSchema.safeParse(raw);\n const parsed: SettingsFile = result.success ? (result.data as SettingsFile) : {};\n if (parsed.permissions) {\n permissions = parsed.permissions;\n break;\n }\n } catch {\n warn(`Malformed settings file at '${filePath}' — skipping`);\n }\n }\n }\n\n if (!permissions) {\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor={CLI_COLORS.WARNING} padding={1}>\n <Text bold color={CLI_COLORS.WARNING}>\n Permission Notice\n </Text>\n <Text>No permissions configured in .claude/settings.json</Text>\n <Text>Agents will prompt for approval on each tool use.</Text>\n <Text> </Text>\n <Text>For autonomous operation, add to .claude/settings.json:</Text>\n <Text> </Text>\n <Text color=\"dim\">{\"{\"}</Text>\n <Text color=\"dim\">{' \"permissions\": {'}</Text>\n <Text color=\"dim\">{' \"allow\": ['}</Text>\n <Text color=\"dim\">{' \"Read(*)\",'}</Text>\n <Text color=\"dim\">{' \"Bash(git *)\",'}</Text>\n <Text color=\"dim\">{' \"Bash(bun *)\"'}</Text>\n <Text color=\"dim\">{\" ]\"}</Text>\n <Text color=\"dim\">{\" }\"}</Text>\n <Text color=\"dim\">{\"}\"}</Text>\n </Box>\n );\n }\n\n const hasRestrictiveBash = permissions.deny?.some(\n (rule) => rule === \"Bash(*)\" || rule === \"Bash\",\n );\n const hasNoAllows = !permissions.allow || permissions.allow.length === 0;\n\n if (hasRestrictiveBash || hasNoAllows) {\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor={CLI_COLORS.WARNING} padding={1}>\n <Text bold color={CLI_COLORS.WARNING}>\n Permission Warnings\n </Text>\n {hasRestrictiveBash && (\n <Text>\n ⚠ Bash is denied in permissions. Some agents require Bash for git, testing, and build\n commands.\n </Text>\n )}\n {hasNoAllows && (\n <Text>⚠ No allow rules configured. Agents will prompt for each tool use.</Text>\n )}\n </Box>\n );\n }\n\n return null;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAEA,SAAS,aAAa;AACtB,SAAS,QAAQ,OAAAA,MAAK,QAAAC,OAAM,cAAc;AAC1C,OAAO,QAAQ;;;ACJf;AAEA,SAAS,MAAM,WAAW;AAC1B,OAAO,UAAU;AAyDX,SACE,KADF;AAzCN,eAAsB,iBAAiB,aAAyD;AAC9F,QAAM,eAAe,KAAK,KAAK,aAAa,YAAY,eAAe;AACvE,QAAM,oBAAoB,KAAK,KAAK,aAAa,YAAY,qBAAqB;AAElF,MAAI;AAEJ,aAAW,YAAY,CAAC,mBAAmB,YAAY,GAAG;AACxD,QAAI,MAAM,WAAW,QAAQ,GAAG;AAC9B,UAAI;AACF,cAAM,UAAU,MAAM,aAAa,UAAU,oBAAoB;AACjE,cAAM,MAAM,KAAK,MAAM,OAAO;AAC9B,YAAI,OAAO,QAAQ,YAAY,QAAQ,QAAQ,CAAC,MAAM,QAAQ,GAAG,GAAG;AAElE,gBAAM,yBAAyB;AAAA,YAC7B;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AACA;AAAA,YACE;AAAA,YACA;AAAA,YACA,kBAAkB,QAAQ;AAAA,UAC5B;AAAA,QACF;AACA,cAAM,SAAS,mBAAmB,UAAU,GAAG;AAC/C,cAAM,SAAuB,OAAO,UAAW,OAAO,OAAwB,CAAC;AAC/E,YAAI,OAAO,aAAa;AACtB,wBAAc,OAAO;AACrB;AAAA,QACF;AAAA,MACF,QAAQ;AACN,aAAK,+BAA+B,QAAQ,mBAAc;AAAA,MAC5D;AAAA,IACF;AAAA,EACF;AAEA,MAAI,CAAC,aAAa;AAChB,WACE,qBAAC,OAAI,eAAc,UAAS,aAAY,SAAQ,aAAa,WAAW,SAAS,SAAS,GACxF;AAAA,0BAAC,QAAK,MAAI,MAAC,OAAO,WAAW,SAAS,+BAEtC;AAAA,MACA,oBAAC,QAAK,gEAAkD;AAAA,MACxD,oBAAC,QAAK,+DAAiD;AAAA,MACvD,oBAAC,QAAK,eAAC;AAAA,MACP,oBAAC,QAAK,qEAAuD;AAAA,MAC7D,oBAAC,QAAK,eAAC;AAAA,MACP,oBAAC,QAAK,OAAM,OAAO,eAAI;AAAA,MACvB,oBAAC,QAAK,OAAM,OAAO,gCAAqB;AAAA,MACxC,oBAAC,QAAK,OAAM,OAAO,4BAAiB;AAAA,MACpC,oBAAC,QAAK,OAAM,OAAO,8BAAmB;AAAA,MACtC,oBAAC,QAAK,OAAM,OAAO,kCAAuB;AAAA,MAC1C,oBAAC,QAAK,OAAM,OAAO,iCAAsB;AAAA,MACzC,oBAAC,QAAK,OAAM,OAAO,mBAAQ;AAAA,MAC3B,oBAAC,QAAK,OAAM,OAAO,iBAAM;AAAA,MACzB,oBAAC,QAAK,OAAM,OAAO,eAAI;AAAA,OACzB;AAAA,EAEJ;AAEA,QAAM,qBAAqB,YAAY,MAAM;AAAA,IAC3C,CAAC,SAAS,SAAS,aAAa,SAAS;AAAA,EAC3C;AACA,QAAM,cAAc,CAAC,YAAY,SAAS,YAAY,MAAM,WAAW;AAEvE,MAAI,sBAAsB,aAAa;AACrC,WACE,qBAAC,OAAI,eAAc,UAAS,aAAY,SAAQ,aAAa,WAAW,SAAS,SAAS,GACxF;AAAA,0BAAC,QAAK,MAAI,MAAC,OAAO,WAAW,SAAS,iCAEtC;AAAA,MACC,sBACC,oBAAC,QAAK,kHAGN;AAAA,MAED,eACC,oBAAC,QAAK,qFAAkE;AAAA,OAE5E;AAAA,EAEJ;AAEA,SAAO;AACT;;;AD7BM,gBAAAC,MAcA,QAAAC,aAdA;AArBN,SAAS,sBAA4B;AACnC,UAAQ,OAAO,MAAM,eAAe;AACtC;AAEA,IAAM,oBAA8C;AAAA,EAClD,EAAE,OAAO,QAAQ,OAAO,OAAO;AAAA,EAC/B,EAAE,OAAO,WAAW,OAAO,UAAU;AAAA,EACrC,EAAE,OAAO,UAAU,OAAO,SAAS;AAAA,EACnC,EAAE,OAAO,QAAQ,OAAO,OAAO;AACjC;AAOA,IAAM,YAAsC,CAAC,EAAE,UAAU,SAAS,MAAM;AACtE,QAAM,EAAE,KAAK,IAAI,OAAO;AAExB,SACE,gBAAAA,MAACC,MAAA,EAAI,eAAc,UACjB;AAAA,oBAAAF,KAACG,OAAA,EAAK,MAAI,MAAE,2BAAiB,MAAK;AAAA,IAClC,gBAAAH,KAACG,OAAA,EAAK,eAAC;AAAA,IACP,gBAAAH;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,QACP,UAAU,CAAC,YAAY;AACrB,mBAAS,OAAO;AAChB,eAAK;AAAA,QACP;AAAA,QACA,UAAU,MAAM;AACd,mBAAS;AACT,eAAK;AAAA,QACP;AAAA;AAAA,IACF;AAAA,IACA,gBAAAA,KAACG,OAAA,EAAK,eAAC;AAAA,IACP,gBAAAF,MAACE,OAAA,EAAK,UAAQ,MACX;AAAA;AAAA,MACA;AAAA,MAAsB;AAAA,MAAW;AAAA,MACjC;AAAA,MAAgB;AAAA,MAAU;AAAA,MAC1B;AAAA,MAAc;AAAA,OACjB;AAAA,KACF;AAEJ;AAUA,eAAsB,iBAAiB,YAA4C;AACjF,QAAM,CAAC,MAAM,MAAM,IAAI,MAAM,QAAQ,IAAI,CAAC,oBAAoB,GAAG,kBAAkB,UAAU,CAAC,CAAC;AAG/F,QAAM,aAAa,QAAQ,QAAQ,QAAQ,UAAU;AAErD,QAAM,aAAa,MAAM,cAAc;AACvC,QAAM,OACJ,MAAM,SAAS,QAAQ,QAAQ,SAAS,kBAAkB,OAAO,OAAO,MAAM,IAAI;AACpF,QAAM,SAAS,QAAQ,QAAQ;AAE/B,SAAO,EAAE,YAAY,YAAY,MAAM,OAAO;AAChD;AAGO,SAAS,oBAAoB,MAA6B;AAC/D,QAAM,YAAY,KAAK,SAAS,WAAW,WAAW,KAAK,SAAS,UAAU,UAAU;AACxF,QAAM,QAAQ;AAAA,IACZ,iBAAiB;AAAA,IACjB;AAAA,IACA,cAAc,KAAK,UAAU;AAAA,IAC7B,cAAc,KAAK,UAAU;AAAA,IAC7B,cAAc,SAAS;AAAA,EACzB;AACA,MAAI,KAAK,QAAQ;AACf,UAAM,KAAK,cAAc,KAAK,MAAM,EAAE;AAAA,EACxC;AACA,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,uCAAuC;AAClD,SAAO,MAAM,KAAK,IAAI;AACxB;AAMA,eAAsB,cACpB,YACA,KACwB;AACxB,QAAM,OAAO,MAAM,iBAAiB,UAAU;AAG9C,MAAI,CAAC,QAAQ,MAAM,OAAO;AACxB,UAAM,SAAS,OAAO,QAAQ;AAC9B,WAAO,oBAAoB,IAAI,CAAC;AAChC,WAAO;AAAA,EACT;AAEA,MAAI,kBAAiC;AAErC,QAAM,EAAE,cAAc,IAAI;AAAA,IACxB,gBAAAH;AAAA,MAAC;AAAA;AAAA,QACC,UAAU,CAAC,YAAY;AACrB,4BAAkB;AAAA,QACpB;AAAA,QACA,UAAU,MAAM;AACd,4BAAkB;AAAA,QACpB;AAAA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,cAAc;AACpB,sBAAoB;AAEpB,SAAO;AACT;AAEA,IAAqB,OAArB,MAAqB,cAAa,YAAY;AAAA,EAC5C,OAAO,UAAU,cAAc,iBAAiB,IAAI;AAAA,EACpD,OAAO,cACL;AAAA,EAEF,OAAO,WAAW;AAAA,IAChB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF;AAAA,EAEA,OAAO,QAAQ;AAAA,IACb,GAAG,YAAY;AAAA,IACf,SAAS,MAAM,QAAQ;AAAA,MACrB,aAAa;AAAA,MACb,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,MAAqB;AACzB,UAAM,EAAE,MAAM,IAAI,MAAM,KAAK,MAAM,KAAI;AACvC,UAAM,aAAa,QAAQ,IAAI;AAG/B,UAAM,uBAAuB,MAAM,0BAA0B,UAAU;AAEvE,QAAI,sBAAsB;AACxB,YAAM,kBAAkB,MAAM,cAAc,YAAY,CAAC,QAAQ,KAAK,IAAI,GAAG,CAAC;AAC9E,UAAI,iBAAiB;AACnB,cAAM,KAAK,OAAO,WAAW,eAAe;AAAA,MAC9C;AACA;AAAA,IACF;AAOA,UAAM,eAAe,GAAG,aAAa,UAAU,MAAM,GAAG,aAAa,mBAAmB;AACxF,QAAI,CAAC,cAAc;AACjB,YAAM,UAAU,MAAM,wBAAwB;AAC9C,UAAI,SAAS;AACX,aAAK,IAAI,sCAAsC,cAAc;AAAA,MAC/D;AAAA,IACF;AAEA,oBAAgB;AAEhB,QAAI;AACJ,QAAI,kBAAoC,CAAC;AACzC,QAAI;AACF,qBAAe,MAAM,2BAA2B;AAAA,QAC9C,YAAY,MAAM;AAAA,QAClB;AAAA,QACA,cAAc,MAAM;AAAA,MACtB,CAAC;AAAA,IACH,SAAS,OAAO;AACd,uBAAiB;AACjB,WAAK,MAAM,gBAAgB,KAAK,GAAG;AAAA,QACjC,MAAM,WAAW;AAAA,MACnB,CAAC;AAAA,IACH;AAEA,sBAAkB,YAAY;AAC9B,qBAAiB;AAEjB,QAAI,eAAsC;AAE1C,UAAM,EAAE,cAAc,IAAI;AAAA,MACxB,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,SAAS,KAAK,OAAO;AAAA,UACrB,MAAM;AAAA,UACN;AAAA,UACA;AAAA,UACA,YAAY,CAACI,YAAW;AACtB,2BAAeA;AAAA,UACjB;AAAA,UACA,UAAU,MAAM;AACd,iBAAK,IAAI,iBAAiB;AAAA,UAC5B;AAAA;AAAA,MACF;AAAA,IACF;AAEA,UAAM,cAAc;AAGpB,UAAM,SAAS;AAEf,QAAI,CAAC,UAAU,OAAO,WAAW;AAC/B,WAAK,KAAK,WAAW,SAAS;AAAA,IAChC;AAEA,QAAI,OAAO,OAAO,WAAW,GAAG;AAC9B,WAAK,MAAM,sBAAsB,EAAE,MAAM,WAAW,MAAM,CAAC;AAAA,IAC7D;AAEA,UAAM,KAAK,mBAAmB,QAAQ,cAAc,KAAK;AAAA,EAC3D;AAAA,EAEA,MAAc,mBACZ,QACA,cACA,OACe;AACf,UAAM,aAAa,QAAQ,IAAI;AAC/B,UAAM,cAAc,kBAAkB,OAAO,MAAM;AAEnD,UAAM,cAAc,OAAO,OAAO,OAAO,CAAC,MAAM,EAAE,WAAW,OAAO;AACpE,UAAM,eAAe,OAAO,OAAO,OAAO,CAAC,MAAM,EAAE,WAAW,OAAO;AAErE,SAAK,IAAI,IAAI;AACb,SAAK,IAAI,YAAY,OAAO,OAAO,MAAM,SAAS;AAClD,SAAK;AAAA,MACH,iBACE,gBAAgB,WACZ,4BACA,gBAAgB,UACd,UAAU,YAAY,MAAM,WAAW,aAAa,MAAM,aAC1D,iCACR;AAAA,IACF;AAEA,QAAI,gBAAgB,UAAU;AAC5B,YAAM,KAAK,yBAAyB,QAAQ,cAAc,OAAO,UAAU;AAC3E;AAAA,IACF;AAEA,QAAI,gBAAgB,SAAS;AAG3B,YAAM,qBAAqB,YAAY,OAAO,CAAC,MAAM,EAAE,UAAU,QAAQ;AACzE,YAAM,oBAAoB,YAAY,OAAO,CAAC,MAAM,EAAE,UAAU,QAAQ;AAExE,YAAM,eAAe,oBAAoB,YAAY,SAAS;AAC9D,YAAM,cAAc,oBAAoB,YAAY,QAAQ;AAE5D,YAAM,gBACJ,mBAAmB,SAAS,KACvB,MAAM,UAAU,aAAa,SAAS,GACvC,MAAM;AAAA,QACJ,mBAAmB,IAAI,CAAC,MAAM,EAAE,EAAE;AAAA,QAClC,aAAa;AAAA,QACb,aAAa;AAAA,QACb;AAAA,MACF,KACA,CAAC;AAEP,YAAM,eACJ,kBAAkB,SAAS,KACtB,MAAM,UAAU,YAAY,SAAS,GACtC,MAAM;AAAA,QACJ,kBAAkB,IAAI,CAAC,MAAM,EAAE,EAAE;AAAA,QACjC,YAAY;AAAA,QACZ,aAAa;AAAA,QACb;AAAA,MACF,KACA,CAAC;AAEP,YAAM,cAAc,cAAc,SAAS,aAAa;AACxD,UAAI,cAAc,SAAS,KAAK,aAAa,SAAS,GAAG;AACvD,aAAK;AAAA,UACH,UAAU,WAAW,kBAAkB,cAAc,MAAM,aAAa,aAAa,MAAM;AAAA,QAC7F;AAAA,MACF,WAAW,aAAa,SAAS,GAAG;AAClC,aAAK,IAAI,UAAU,aAAa,MAAM,oCAAoC;AAAA,MAC5E,OAAO;AACL,aAAK,IAAI,UAAU,cAAc,MAAM,kCAAkC;AAAA,MAC3E;AAGA,YAAM,KAAK,yBAAyB,QAAQ,cAAc,OAAO,UAAU;AAC3E;AAAA,IACF;AAEA,UAAM,KAAK,iBAAiB,QAAQ,cAAc,OAAO,UAAU;AAAA,EACrE;AAAA,EAEA,MAAc,yBACZ,QACA,cACA,OACA,YACe;AAEf,QAAI,CAAC,aAAa,aAAa;AAC7B,UAAI;AACF,cAAM,oBAAoB,MAAM,iBAAiB,aAAa,aAAa,QAAQ,CAAC,CAAC;AACrF,qBAAa,cAAc,kBAAkB,YAAY;AAAA,MAC3D,QAAQ;AACN,aAAK,KAAK,8DAA8D;AACxE,cAAM,KAAK,iBAAiB,QAAQ,cAAc,OAAO,UAAU;AACnE;AAAA,MACF;AAAA,IACF;AAGA,UAAM,cAAc,aAAa;AAEjC,UAAM,oBAAoB,MAAM,8BAA8B,WAAW;AAEzE,QAAI,CAAC,mBAAmB;AACtB,WAAK,IAAI,4BAA4B,WAAW,MAAM;AACtD,UAAI;AACF,cAAM,oBAAoB,aAAa,aAAa,OAAO,QAAQ,YAAY,EAAE;AACjF,cAAM,2BAA2B,iBAAiB;AAClD,aAAK,IAAI,2BAA2B,WAAW,EAAE;AAAA,MACnD,SAAS,OAAO;AACd,aAAK,MAAM,gBAAgB,KAAK,GAAG;AAAA,UACjC,MAAM,WAAW;AAAA,QACnB,CAAC;AAAA,MACH;AAAA,IACF,OAAO;AACL,UAAI;AACF,cAAM,8BAA8B,WAAW;AAAA,MACjD,SAAS,OAAO;AACd,aAAK,KAAK,oEAA+D;AAAA,MAC3E;AAAA,IACF;AAEA,SAAK,IAAI,6BAA6B;AACtC,eAAW,SAAS,OAAO,OAAO,OAAO,CAAC,MAAM,EAAE,WAAW,OAAO,GAAG;AACrE,YAAM,YAAY,GAAG,MAAM,EAAE,IAAI,WAAW;AAC5C,YAAM,cAAc,MAAM,UAAU,WAAW,SAAS;AACxD,UAAI;AACF,cAAM,oBAAoB,WAAW,aAAa,UAAU;AAC5D,aAAK,IAAI,eAAe,SAAS,EAAE;AAAA,MACrC,SAAS,OAAO;AACd,aAAK,MAAM,4BAA4B,SAAS,KAAK,gBAAgB,KAAK,CAAC,IAAI;AAAA,UAC7E,MAAM,WAAW;AAAA,QACnB,CAAC;AAAA,MACH;AAAA,IACF;AAEA,UAAM,mBAAmB,OAAO,OAAO,OAAO,CAAC,MAAM,EAAE,WAAW,OAAO,EAAE;AAC3E,SAAK,IAAI,aAAa,gBAAgB;AAAA,CAAkB;AAExD,SAAK,IAAI,6BAA6B;AACtC,QAAI;AACF,YAAM,eAAe,MAAM,oBAAoB;AAAA,QAC7C,cAAc;AAAA,QACd;AAAA,QACA;AAAA,QACA,YAAY,MAAM;AAAA,MACpB,CAAC;AAED,UAAI,aAAa,WAAW;AAC1B,aAAK,IAAI,kCAAkC,aAAa,gBAAgB,EAAE;AAAA,MAC5E;AAEA,WAAK,IAAI,wBAAwB,aAAa,OAAO,OAAO,MAAM;AAAA,CAAY;AAC9E,WAAK,IAAI,gBAAgB,gBAAgB;AACzC,WAAK,IAAI,YAAY,aAAa,eAAe,MAAM;AAAA,CAA8B;AAErF,WAAK,IAAI,GAAG,iBAAiB,YAAY;AAAA,CAAI;AAC7C,WAAK,IAAI,qBAAqB;AAC9B,WAAK,IAAI,KAAK,aAAa,SAAS,EAAE;AACtC,iBAAW,aAAa,aAAa,gBAAgB;AACnD,aAAK,IAAI,OAAO,SAAS,KAAK;AAAA,MAChC;AACA,WAAK,IAAI,EAAE;AACX,WAAK,IAAI,gBAAgB;AACzB,WAAK,IAAI,KAAK,aAAa,UAAU,EAAE;AACvC,WAAK,IAAI,EAAE;AACX,WAAK,IAAI,uCAAuC;AAChD,WAAK,IAAI,iCAAiC;AAC1C,WAAK,IAAI,aAAa,YAAY,gCAAgC;AAClE,WAAK,IAAI,EAAE;AAEX,YAAM,oBAAoB,MAAM,iBAAiB,UAAU;AAC3D,UAAI,mBAAmB;AACrB,cAAM,EAAE,cAAc,IAAI,OAAO,iBAAiB;AAClD,cAAM,cAAc;AAAA,MACtB;AAAA,IACF,SAAS,OAAO;AACd,WAAK,YAAY,KAAK;AAAA,IACxB;AAAA,EACF;AAAA,EAEA,MAAc,iBACZ,QACA,cACA,OACA,YACe;AACf,SAAK,IAAI,sCAAsC;AAC/C,QAAI;AACF,YAAM,gBAAgB,MAAM,aAAa;AAAA,QACvC,cAAc;AAAA,QACd;AAAA,QACA;AAAA,QACA,YAAY,MAAM;AAAA,MACpB,CAAC;AAED,WAAK,IAAI,UAAU,cAAc,aAAa,MAAM;AAAA,CAA8B;AAClF,WAAK,IAAI,6BAA6B;AAEtC,UAAI,cAAc,WAAW;AAC3B,aAAK,IAAI,kCAAkC,cAAc,gBAAgB,EAAE;AAAA,MAC7E;AAEA,WAAK,IAAI,wBAAwB,cAAc,OAAO,OAAO,MAAM;AAAA,CAAY;AAC/E,WAAK,IAAI,gBAAgB,gBAAgB;AACzC,WAAK,IAAI,YAAY,cAAc,eAAe,MAAM;AAAA,CAA8B;AAEtF,WAAK,IAAI,GAAG,iBAAiB,YAAY;AAAA,CAAI;AAC7C,WAAK,IAAI,mBAAmB;AAC5B,WAAK,IAAI,KAAK,cAAc,SAAS,EAAE;AACvC,iBAAW,eAAe,cAAc,cAAc;AACpD,cAAM,cAAc,aAAa,YAAY,OAAO,EAAE;AACtD,aAAK,IAAI,OAAO,WAAW,GAAG;AAAA,MAChC;AACA,WAAK,IAAI,EAAE;AACX,WAAK,IAAI,qBAAqB;AAC9B,WAAK,IAAI,KAAK,cAAc,SAAS,EAAE;AACvC,iBAAW,aAAa,cAAc,gBAAgB;AACpD,aAAK,IAAI,OAAO,SAAS,KAAK;AAAA,MAChC;AACA,WAAK,IAAI,EAAE;AACX,WAAK,IAAI,gBAAgB;AACzB,WAAK,IAAI,KAAK,cAAc,UAAU,EAAE;AACxC,WAAK,IAAI,EAAE;AACX,WAAK,IAAI,uCAAuC;AAChD,WAAK,IAAI,iCAAiC;AAC1C,WAAK,IAAI,aAAa,YAAY,gCAAgC;AAClE,WAAK,IAAI,EAAE;AAEX,YAAM,oBAAoB,MAAM,iBAAiB,UAAU;AAC3D,UAAI,mBAAmB;AACrB,cAAM,EAAE,cAAc,IAAI,OAAO,iBAAiB;AAClD,cAAM,cAAc;AAAA,MACtB;AAAA,IACF,SAAS,OAAO;AACd,WAAK,YAAY,KAAK;AAAA,IACxB;AAAA,EACF;AACF;","names":["Box","Text","jsx","jsxs","Box","Text","result"]}
@@ -0,0 +1,114 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ CLI_COLORS
4
+ } from "./chunk-FMYAYX6W.js";
5
+ import {
6
+ init_esm_shims
7
+ } from "./chunk-DHET7RCE.js";
8
+
9
+ // src/cli/components/wizard/stats-panel.tsx
10
+ init_esm_shims();
11
+ import { Box, Text } from "ink";
12
+ import { jsx, jsxs } from "react/jsx-runtime";
13
+ var SCOPE_COLOR_PROJECT = "#eee";
14
+ function computeStats(skillConfigs, agentConfigs) {
15
+ let globalPlugin = 0;
16
+ let globalLocal = 0;
17
+ let projectPlugin = 0;
18
+ let projectLocal = 0;
19
+ for (const sc of skillConfigs) {
20
+ const isLocal = sc.source === "local";
21
+ if (sc.scope === "global") {
22
+ if (isLocal) globalLocal++;
23
+ else globalPlugin++;
24
+ } else {
25
+ if (isLocal) projectLocal++;
26
+ else projectPlugin++;
27
+ }
28
+ }
29
+ let agentsGlobal = 0;
30
+ let agentsProject = 0;
31
+ for (const ac of agentConfigs) {
32
+ if (ac.scope === "global") agentsGlobal++;
33
+ else agentsProject++;
34
+ }
35
+ return {
36
+ skillsTotal: skillConfigs.length,
37
+ globalPlugin,
38
+ globalLocal,
39
+ projectPlugin,
40
+ projectLocal,
41
+ agentsTotal: agentConfigs.length,
42
+ agentsGlobal,
43
+ agentsProject
44
+ };
45
+ }
46
+ var StatsPanel = ({ stats }) => {
47
+ const dimGlobalAgents = stats.agentsGlobal === 0;
48
+ const dimProjectAgents = stats.agentsProject === 0;
49
+ return /* @__PURE__ */ jsxs(
50
+ Box,
51
+ {
52
+ flexDirection: "row",
53
+ columnGap: 0,
54
+ marginTop: -4,
55
+ borderStyle: "single",
56
+ borderColor: CLI_COLORS.NEUTRAL,
57
+ borderDimColor: true,
58
+ paddingX: 1,
59
+ children: [
60
+ /* @__PURE__ */ jsxs(Box, { flexDirection: "column", flexGrow: 1, children: [
61
+ /* @__PURE__ */ jsx(Text, { dimColor: true, children: "Skills" }),
62
+ /* @__PURE__ */ jsxs(Text, { children: [
63
+ /* @__PURE__ */ jsx(Text, { dimColor: true, color: CLI_COLORS.WARNING, children: "Global" }),
64
+ /* @__PURE__ */ jsx(Text, { children: " " }),
65
+ /* @__PURE__ */ jsxs(Text, { dimColor: stats.globalPlugin === 0, children: [
66
+ /* @__PURE__ */ jsx(Text, { color: CLI_COLORS.PRIMARY, children: stats.globalPlugin }),
67
+ /* @__PURE__ */ jsx(Text, { children: " plugin " })
68
+ ] }),
69
+ /* @__PURE__ */ jsxs(Text, { dimColor: stats.globalLocal === 0, children: [
70
+ /* @__PURE__ */ jsx(Text, { color: CLI_COLORS.PRIMARY, children: stats.globalLocal }),
71
+ /* @__PURE__ */ jsx(Text, { children: " local" })
72
+ ] })
73
+ ] }),
74
+ /* @__PURE__ */ jsxs(Text, { children: [
75
+ /* @__PURE__ */ jsx(Text, { dimColor: true, color: SCOPE_COLOR_PROJECT, children: "Project" }),
76
+ /* @__PURE__ */ jsx(Text, { children: " " }),
77
+ /* @__PURE__ */ jsxs(Text, { dimColor: stats.projectPlugin === 0, children: [
78
+ /* @__PURE__ */ jsx(Text, { color: CLI_COLORS.PRIMARY, children: stats.projectPlugin }),
79
+ /* @__PURE__ */ jsx(Text, { children: " plugin " })
80
+ ] }),
81
+ /* @__PURE__ */ jsxs(Text, { dimColor: stats.projectLocal === 0, children: [
82
+ /* @__PURE__ */ jsx(Text, { color: CLI_COLORS.PRIMARY, children: stats.projectLocal }),
83
+ /* @__PURE__ */ jsx(Text, { children: " local" })
84
+ ] })
85
+ ] })
86
+ ] }),
87
+ /* @__PURE__ */ jsxs(Box, { flexDirection: "column", marginX: 1, marginTop: 0, height: 3, justifyContent: "center", children: [
88
+ /* @__PURE__ */ jsx(Text, { dimColor: true, color: CLI_COLORS.NEUTRAL, children: "\u2502" }),
89
+ /* @__PURE__ */ jsx(Text, { dimColor: true, color: CLI_COLORS.NEUTRAL, children: "\u2502" }),
90
+ /* @__PURE__ */ jsx(Text, { dimColor: true, color: CLI_COLORS.NEUTRAL, children: "\u2502" })
91
+ ] }),
92
+ /* @__PURE__ */ jsxs(Box, { flexDirection: "column", flexGrow: 1, paddingLeft: 0, children: [
93
+ /* @__PURE__ */ jsx(Text, { dimColor: true, children: "Agents" }),
94
+ /* @__PURE__ */ jsxs(Text, { children: [
95
+ /* @__PURE__ */ jsx(Text, { dimColor: true, color: CLI_COLORS.WARNING, children: "Global" }),
96
+ /* @__PURE__ */ jsx(Text, { children: " " }),
97
+ /* @__PURE__ */ jsx(Text, { dimColor: dimGlobalAgents, color: CLI_COLORS.PRIMARY, children: stats.agentsGlobal })
98
+ ] }),
99
+ /* @__PURE__ */ jsxs(Text, { children: [
100
+ /* @__PURE__ */ jsx(Text, { dimColor: true, color: SCOPE_COLOR_PROJECT, children: "Project" }),
101
+ /* @__PURE__ */ jsx(Text, { children: " " }),
102
+ /* @__PURE__ */ jsx(Text, { dimColor: dimProjectAgents, color: CLI_COLORS.PRIMARY, children: stats.agentsProject })
103
+ ] })
104
+ ] })
105
+ ]
106
+ }
107
+ );
108
+ };
109
+
110
+ export {
111
+ computeStats,
112
+ StatsPanel
113
+ };
114
+ //# sourceMappingURL=chunk-PZERKWE2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/components/wizard/stats-panel.tsx"],"sourcesContent":["import { Box, Text } from \"ink\";\nimport React from \"react\";\nimport { CLI_COLORS } from \"../../consts.js\";\nimport type { AgentScopeConfig, SkillConfig } from \"../../types/config.js\";\n\nconst SCOPE_COLOR_PROJECT = \"#eee\";\n\nexport type StatsData = {\n skillsTotal: number;\n globalPlugin: number;\n globalLocal: number;\n projectPlugin: number;\n projectLocal: number;\n agentsTotal: number;\n agentsGlobal: number;\n agentsProject: number;\n};\n\nexport function computeStats(\n skillConfigs: SkillConfig[],\n agentConfigs: AgentScopeConfig[],\n): StatsData {\n let globalPlugin = 0;\n let globalLocal = 0;\n let projectPlugin = 0;\n let projectLocal = 0;\n\n for (const sc of skillConfigs) {\n const isLocal = sc.source === \"local\";\n if (sc.scope === \"global\") {\n if (isLocal) globalLocal++;\n else globalPlugin++;\n } else {\n if (isLocal) projectLocal++;\n else projectPlugin++;\n }\n }\n\n let agentsGlobal = 0;\n let agentsProject = 0;\n for (const ac of agentConfigs) {\n if (ac.scope === \"global\") agentsGlobal++;\n else agentsProject++;\n }\n\n return {\n skillsTotal: skillConfigs.length,\n globalPlugin,\n globalLocal,\n projectPlugin,\n projectLocal,\n agentsTotal: agentConfigs.length,\n agentsGlobal,\n agentsProject,\n };\n}\n\nexport const StatsPanel: React.FC<{ stats: StatsData }> = ({ stats }) => {\n const dimGlobalAgents = stats.agentsGlobal === 0;\n const dimProjectAgents = stats.agentsProject === 0;\n\n return (\n <Box\n flexDirection=\"row\"\n columnGap={0}\n marginTop={-4}\n borderStyle=\"single\"\n borderColor={CLI_COLORS.NEUTRAL}\n borderDimColor\n paddingX={1}\n >\n <Box flexDirection=\"column\" flexGrow={1}>\n <Text dimColor>Skills</Text>\n <Text>\n <Text dimColor color={CLI_COLORS.WARNING}>\n Global\n </Text>\n <Text>{\" \"}</Text>\n <Text dimColor={stats.globalPlugin === 0}>\n <Text color={CLI_COLORS.PRIMARY}>{stats.globalPlugin}</Text>\n <Text> plugin </Text>\n </Text>\n <Text dimColor={stats.globalLocal === 0}>\n <Text color={CLI_COLORS.PRIMARY}>{stats.globalLocal}</Text>\n <Text> local</Text>\n </Text>\n </Text>\n <Text>\n <Text dimColor color={SCOPE_COLOR_PROJECT}>\n Project\n </Text>\n <Text>{\" \"}</Text>\n <Text dimColor={stats.projectPlugin === 0}>\n <Text color={CLI_COLORS.PRIMARY}>{stats.projectPlugin}</Text>\n <Text> plugin </Text>\n </Text>\n <Text dimColor={stats.projectLocal === 0}>\n <Text color={CLI_COLORS.PRIMARY}>{stats.projectLocal}</Text>\n <Text> local</Text>\n </Text>\n </Text>\n </Box>\n <Box flexDirection=\"column\" marginX={1} marginTop={0} height={3} justifyContent=\"center\">\n <Text dimColor color={CLI_COLORS.NEUTRAL}>\n │\n </Text>\n <Text dimColor color={CLI_COLORS.NEUTRAL}>\n │\n </Text>\n <Text dimColor color={CLI_COLORS.NEUTRAL}>\n │\n </Text>\n </Box>\n <Box flexDirection=\"column\" flexGrow={1} paddingLeft={0}>\n <Text dimColor>Agents</Text>\n <Text>\n <Text dimColor color={CLI_COLORS.WARNING}>\n Global\n </Text>\n <Text>{\" \"}</Text>\n <Text dimColor={dimGlobalAgents} color={CLI_COLORS.PRIMARY}>\n {stats.agentsGlobal}\n </Text>\n </Text>\n <Text>\n <Text dimColor color={SCOPE_COLOR_PROJECT}>\n Project\n </Text>\n <Text>{\" \"}</Text>\n <Text dimColor={dimProjectAgents} color={CLI_COLORS.PRIMARY}>\n {stats.agentsProject}\n </Text>\n </Text>\n </Box>\n </Box>\n );\n};\n"],"mappings":"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","names":[]}
@@ -7,11 +7,11 @@ import {
7
7
  loadConfigTypesDataInBackground,
8
8
  regenerateConfigTypes,
9
9
  resolveAuthor
10
- } from "./chunk-WS3TL2AO.js";
10
+ } from "./chunk-OIHZ2YH3.js";
11
11
  import {
12
12
  BaseCommand,
13
13
  EXIT_CODES
14
- } from "./chunk-XYZ7B5BY.js";
14
+ } from "./chunk-7LBYURQR.js";
15
15
  import {
16
16
  directoryExists,
17
17
  ensureDir,
@@ -19,7 +19,7 @@ import {
19
19
  getErrorMessage,
20
20
  verbose,
21
21
  writeFile
22
- } from "./chunk-WN2TUP4M.js";
22
+ } from "./chunk-XYPAOBBV.js";
23
23
  import {
24
24
  CLI_BIN_NAME,
25
25
  DEFAULT_VERSION,
@@ -337,4 +337,4 @@ export {
337
337
  generateSkillRulesTs,
338
338
  NewSkill
339
339
  };
340
- //# sourceMappingURL=chunk-O5CPXIC4.js.map
340
+ //# sourceMappingURL=chunk-Q755X6QF.js.map
@@ -2,17 +2,17 @@
2
2
  import {
3
3
  getDomainDisplayName,
4
4
  orderDomains
5
- } from "./chunk-UBNHVBSV.js";
5
+ } from "./chunk-7JQIMEUX.js";
6
6
  import {
7
7
  CheckboxGrid
8
- } from "./chunk-ERHTXNIF.js";
8
+ } from "./chunk-RU5XLS5Q.js";
9
9
  import {
10
10
  useWizardStore
11
- } from "./chunk-PRG7PKZM.js";
11
+ } from "./chunk-N34D3ROY.js";
12
12
  import {
13
13
  matrix,
14
14
  typedEntries
15
- } from "./chunk-JWMYAJHD.js";
15
+ } from "./chunk-FSK4TQX7.js";
16
16
  import {
17
17
  init_esm_shims
18
18
  } from "./chunk-DHET7RCE.js";
@@ -63,4 +63,4 @@ var DomainSelection = () => {
63
63
  export {
64
64
  DomainSelection
65
65
  };
66
- //# sourceMappingURL=chunk-36YW5E7G.js.map
66
+ //# sourceMappingURL=chunk-QD3GQ2CH.js.map
@@ -2,9 +2,6 @@
2
2
  import {
3
3
  useRowScroll
4
4
  } from "./chunk-SQ7WINEU.js";
5
- import {
6
- ViewTitle
7
- } from "./chunk-JNQKCZA3.js";
8
5
  import {
9
6
  CLI_COLORS,
10
7
  UI_SYMBOLS
@@ -90,7 +87,6 @@ var CheckboxGrid = ({
90
87
  emptyMessage
91
88
  ] }) : null;
92
89
  return /* @__PURE__ */ jsxs(Box, { flexDirection: "column", children: [
93
- /* @__PURE__ */ jsx(ViewTitle, { children: title }),
94
90
  subtitle && /* @__PURE__ */ jsx(Text, { dimColor: true, children: subtitle }),
95
91
  /* @__PURE__ */ jsx(
96
92
  Box,
@@ -115,4 +111,4 @@ var CheckboxGrid = ({
115
111
  export {
116
112
  CheckboxGrid
117
113
  };
118
- //# sourceMappingURL=chunk-ERHTXNIF.js.map
114
+ //# sourceMappingURL=chunk-RU5XLS5Q.js.map