@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.
- package/CHANGELOG.md +23 -0
- package/dist/{chunk-Q4PJSAMP.js → chunk-32HX6UYI.js} +2 -1
- package/dist/chunk-32HX6UYI.js.map +1 -0
- package/dist/{chunk-CKU7FJNV.js → chunk-7HGMFJ4Y.js} +3 -3
- package/dist/{chunk-UBNHVBSV.js → chunk-7JQIMEUX.js} +3 -3
- package/dist/{chunk-XYZ7B5BY.js → chunk-7LBYURQR.js} +2 -2
- package/dist/{chunk-NWW3OJH5.js → chunk-A5JSBU65.js} +2 -2
- package/dist/{chunk-ODVQXXEO.js → chunk-B4C2S5LP.js} +17 -43
- package/dist/{chunk-ODVQXXEO.js.map → chunk-B4C2S5LP.js.map} +1 -1
- package/dist/{chunk-IDN2OZJY.js → chunk-C22ACAL2.js} +2 -2
- package/dist/{chunk-I2SUTL7S.js → chunk-D4T3HHE7.js} +5 -5
- package/dist/chunk-D4T3HHE7.js.map +1 -0
- package/dist/{chunk-7XUKTYVD.js → chunk-EO6KJI5D.js} +1038 -270
- package/dist/chunk-EO6KJI5D.js.map +1 -0
- package/dist/{chunk-WZ5S4LGX.js → chunk-F4IZ3UAS.js} +16 -22
- package/dist/chunk-F4IZ3UAS.js.map +1 -0
- package/dist/{chunk-JWMYAJHD.js → chunk-FSK4TQX7.js} +1236 -354
- package/dist/chunk-FSK4TQX7.js.map +1 -0
- package/dist/{chunk-WMMU5FOO.js → chunk-FUWUCKES.js} +2 -2
- package/dist/{chunk-WMMU5FOO.js.map → chunk-FUWUCKES.js.map} +1 -1
- package/dist/{chunk-S6DKM6MJ.js → chunk-HANGA633.js} +4 -8
- package/dist/{chunk-S6DKM6MJ.js.map → chunk-HANGA633.js.map} +1 -1
- package/dist/{chunk-CBYRFAUN.js → chunk-HK53FRMU.js} +3 -1
- package/dist/chunk-HK53FRMU.js.map +1 -0
- package/dist/{chunk-I534EWJQ.js → chunk-IFCASC6R.js} +2 -2
- package/dist/{chunk-2I5SXGXR.js → chunk-KQDGLEBF.js} +80 -5
- package/dist/chunk-KQDGLEBF.js.map +1 -0
- package/dist/{chunk-AE2QHAFO.js → chunk-KVRR4PEJ.js} +81 -73
- package/dist/chunk-KVRR4PEJ.js.map +1 -0
- package/dist/{chunk-R7F5YQMI.js → chunk-LVBRC2CP.js} +2 -6
- package/dist/chunk-LVBRC2CP.js.map +1 -0
- package/dist/{chunk-CCSU4R65.js → chunk-MG55NDVG.js} +2 -2
- package/dist/{chunk-M4ZDKHJV.js → chunk-MUCQ27HV.js} +2 -2
- package/dist/chunk-N2XGUAJU.js +34 -0
- package/dist/{chunk-7PZFDI46.js.map → chunk-N2XGUAJU.js.map} +1 -1
- package/dist/{chunk-PRG7PKZM.js → chunk-N34D3ROY.js} +14 -13
- package/dist/chunk-N34D3ROY.js.map +1 -0
- package/dist/{chunk-7PMFIL5L.js → chunk-NKLNT7N7.js} +4 -21
- package/dist/chunk-NKLNT7N7.js.map +1 -0
- package/dist/{chunk-WS3TL2AO.js → chunk-OIHZ2YH3.js} +172 -102
- package/dist/chunk-OIHZ2YH3.js.map +1 -0
- package/dist/chunk-OOWNDQCG.js +192 -0
- package/dist/chunk-OOWNDQCG.js.map +1 -0
- package/dist/{chunk-EEZSCHS2.js → chunk-OTMIGYBB.js} +52 -10
- package/dist/chunk-OTMIGYBB.js.map +1 -0
- package/dist/chunk-PZERKWE2.js +114 -0
- package/dist/chunk-PZERKWE2.js.map +1 -0
- package/dist/{chunk-O5CPXIC4.js → chunk-Q755X6QF.js} +4 -4
- package/dist/{chunk-36YW5E7G.js → chunk-QD3GQ2CH.js} +5 -5
- package/dist/{chunk-ERHTXNIF.js → chunk-RU5XLS5Q.js} +1 -5
- package/dist/{chunk-ERHTXNIF.js.map → chunk-RU5XLS5Q.js.map} +1 -1
- package/dist/{chunk-VQV3DSHD.js → chunk-SJNUTUSJ.js} +5 -5
- package/dist/{chunk-KPRCP3MZ.js → chunk-U2KFFRRX.js} +2 -2
- package/dist/{chunk-CBJTSEI2.js → chunk-VDVLM3KB.js} +54 -6
- package/dist/chunk-VDVLM3KB.js.map +1 -0
- package/dist/{chunk-7NACNRFG.js → chunk-W46L2PXK.js} +32 -23
- package/dist/chunk-W46L2PXK.js.map +1 -0
- package/dist/{chunk-6F3CZLD6.js → chunk-XA7WF3BI.js} +3 -3
- package/dist/{chunk-WN2TUP4M.js → chunk-XYPAOBBV.js} +2 -2
- package/dist/{chunk-LO5QGAP2.js → chunk-YFHVP3VA.js} +5 -12
- package/dist/chunk-YFHVP3VA.js.map +1 -0
- package/dist/commands/build/marketplace.js +4 -4
- package/dist/commands/build/plugins.js +8 -8
- package/dist/commands/build/stack.js +8 -8
- package/dist/commands/compile.js +38 -22
- package/dist/commands/compile.js.map +1 -1
- package/dist/commands/config/index.js +8 -8
- package/dist/commands/config/path.js +7 -7
- package/dist/commands/config/show.js +8 -8
- package/dist/commands/diff.js +35 -15
- package/dist/commands/diff.js.map +1 -1
- package/dist/commands/doctor.js +24 -12
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/edit.js +47 -37
- package/dist/commands/edit.js.map +1 -1
- package/dist/commands/eject.js +7 -7
- package/dist/commands/import/skill.js +7 -7
- package/dist/commands/info.js +7 -7
- package/dist/commands/init.js +28 -28
- package/dist/commands/list.js +7 -7
- package/dist/commands/new/agent.js +8 -8
- package/dist/commands/new/marketplace.js +9 -9
- package/dist/commands/new/skill.js +8 -8
- package/dist/commands/outdated.js +18 -10
- package/dist/commands/outdated.js.map +1 -1
- package/dist/commands/search.js +9 -9
- package/dist/commands/uninstall.js +15 -27
- package/dist/commands/uninstall.js.map +1 -1
- package/dist/commands/update.js +26 -16
- package/dist/commands/update.js.map +1 -1
- package/dist/commands/validate.js +7 -7
- package/dist/components/skill-search/skill-search.js +2 -2
- package/dist/components/wizard/category-grid.js +3 -3
- package/dist/components/wizard/category-grid.test.js +18 -19
- package/dist/components/wizard/category-grid.test.js.map +1 -1
- package/dist/components/wizard/checkbox-grid.js +1 -2
- package/dist/components/wizard/checkbox-grid.test.js +2 -4
- package/dist/components/wizard/checkbox-grid.test.js.map +1 -1
- package/dist/components/wizard/domain-selection.js +10 -11
- package/dist/components/wizard/help-modal.js +2 -2
- package/dist/components/wizard/search-modal.js +2 -2
- package/dist/components/wizard/search-modal.test.js +2 -2
- package/dist/components/wizard/source-grid.js +4 -4
- package/dist/components/wizard/source-grid.test.js +13 -13
- package/dist/components/wizard/stack-selection.js +10 -9
- package/dist/components/wizard/stats-panel.js +12 -0
- package/dist/components/wizard/step-agents.js +9 -10
- package/dist/components/wizard/step-agents.test.js +16 -15
- package/dist/components/wizard/step-agents.test.js.map +1 -1
- package/dist/components/wizard/step-build.js +11 -12
- package/dist/components/wizard/step-build.test.js +34 -32
- package/dist/components/wizard/step-build.test.js.map +1 -1
- package/dist/components/wizard/step-confirm.js +4 -6
- package/dist/components/wizard/step-confirm.test.js +24 -23
- package/dist/components/wizard/step-confirm.test.js.map +1 -1
- package/dist/components/wizard/step-refine.js +2 -3
- package/dist/components/wizard/step-refine.test.js +2 -3
- package/dist/components/wizard/step-refine.test.js.map +1 -1
- package/dist/components/wizard/step-settings.js +8 -9
- package/dist/components/wizard/step-settings.test.js +14 -15
- package/dist/components/wizard/step-settings.test.js.map +1 -1
- package/dist/components/wizard/step-sources.js +11 -12
- package/dist/components/wizard/step-sources.test.js +17 -19
- package/dist/components/wizard/step-sources.test.js.map +1 -1
- package/dist/components/wizard/step-stack.js +12 -14
- package/dist/components/wizard/step-stack.test.js +26 -25
- package/dist/components/wizard/step-stack.test.js.map +1 -1
- package/dist/components/wizard/view-title.js +21 -3
- package/dist/components/wizard/view-title.js.map +1 -1
- package/dist/components/wizard/wizard-layout.js +12 -11
- package/dist/components/wizard/wizard-tabs.js +1 -1
- package/dist/components/wizard/wizard-tabs.test.js +1 -1
- package/dist/components/wizard/wizard.js +26 -26
- package/dist/config-exports.js +1 -1
- package/dist/hooks/init.js +28 -28
- package/dist/{loader-7RQ4G4TH.js → loader-JMOO2A7C.js} +4 -4
- package/dist/{source-loader-CXCIDGWV.js → source-loader-D3VIG3GM.js} +7 -7
- package/dist/source-manager-FPYFJRR7.js +19 -0
- package/dist/source-manager-FPYFJRR7.js.map +1 -0
- package/dist/stores/wizard-store.js +7 -7
- package/dist/stores/wizard-store.test.js +12 -12
- package/dist/stores/wizard-store.test.js.map +1 -1
- package/package.json +1 -1
- package/dist/chunk-2I5SXGXR.js.map +0 -1
- package/dist/chunk-7NACNRFG.js.map +0 -1
- package/dist/chunk-7PMFIL5L.js.map +0 -1
- package/dist/chunk-7PZFDI46.js +0 -40
- package/dist/chunk-7XUKTYVD.js.map +0 -1
- package/dist/chunk-AE2QHAFO.js.map +0 -1
- package/dist/chunk-CBJTSEI2.js.map +0 -1
- package/dist/chunk-CBYRFAUN.js.map +0 -1
- package/dist/chunk-EEZSCHS2.js.map +0 -1
- package/dist/chunk-EWBNSS5Y.js +0 -113
- package/dist/chunk-EWBNSS5Y.js.map +0 -1
- package/dist/chunk-I2SUTL7S.js.map +0 -1
- package/dist/chunk-JNQKCZA3.js +0 -28
- package/dist/chunk-JNQKCZA3.js.map +0 -1
- package/dist/chunk-JWMYAJHD.js.map +0 -1
- package/dist/chunk-LO5QGAP2.js.map +0 -1
- package/dist/chunk-PRG7PKZM.js.map +0 -1
- package/dist/chunk-Q4PJSAMP.js.map +0 -1
- package/dist/chunk-R7F5YQMI.js.map +0 -1
- package/dist/chunk-WS3TL2AO.js.map +0 -1
- package/dist/chunk-WZ5S4LGX.js.map +0 -1
- package/dist/source-manager-TPLO2DVS.js +0 -19
- /package/dist/{chunk-CKU7FJNV.js.map → chunk-7HGMFJ4Y.js.map} +0 -0
- /package/dist/{chunk-UBNHVBSV.js.map → chunk-7JQIMEUX.js.map} +0 -0
- /package/dist/{chunk-XYZ7B5BY.js.map → chunk-7LBYURQR.js.map} +0 -0
- /package/dist/{chunk-NWW3OJH5.js.map → chunk-A5JSBU65.js.map} +0 -0
- /package/dist/{chunk-IDN2OZJY.js.map → chunk-C22ACAL2.js.map} +0 -0
- /package/dist/{chunk-I534EWJQ.js.map → chunk-IFCASC6R.js.map} +0 -0
- /package/dist/{chunk-CCSU4R65.js.map → chunk-MG55NDVG.js.map} +0 -0
- /package/dist/{chunk-M4ZDKHJV.js.map → chunk-MUCQ27HV.js.map} +0 -0
- /package/dist/{chunk-O5CPXIC4.js.map → chunk-Q755X6QF.js.map} +0 -0
- /package/dist/{chunk-36YW5E7G.js.map → chunk-QD3GQ2CH.js.map} +0 -0
- /package/dist/{chunk-VQV3DSHD.js.map → chunk-SJNUTUSJ.js.map} +0 -0
- /package/dist/{chunk-KPRCP3MZ.js.map → chunk-U2KFFRRX.js.map} +0 -0
- /package/dist/{chunk-6F3CZLD6.js.map → chunk-XA7WF3BI.js.map} +0 -0
- /package/dist/{chunk-WN2TUP4M.js.map → chunk-XYPAOBBV.js.map} +0 -0
- /package/dist/{loader-7RQ4G4TH.js.map → components/wizard/stats-panel.js.map} +0 -0
- /package/dist/{source-loader-CXCIDGWV.js.map → loader-JMOO2A7C.js.map} +0 -0
- /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-
|
|
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-
|
|
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
|
-
|
|
31
|
+
loadSkillsMatrixFromSource,
|
|
32
|
+
resolveInstallPaths
|
|
33
|
+
} from "./chunk-OIHZ2YH3.js";
|
|
31
34
|
import {
|
|
32
35
|
getSkillById
|
|
33
|
-
} from "./chunk-
|
|
36
|
+
} from "./chunk-FSK4TQX7.js";
|
|
34
37
|
import {
|
|
35
38
|
BaseCommand,
|
|
36
39
|
EXIT_CODES
|
|
37
|
-
} from "./chunk-
|
|
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-
|
|
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-
|
|
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":"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","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-
|
|
10
|
+
} from "./chunk-OIHZ2YH3.js";
|
|
11
11
|
import {
|
|
12
12
|
BaseCommand,
|
|
13
13
|
EXIT_CODES
|
|
14
|
-
} from "./chunk-
|
|
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-
|
|
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-
|
|
340
|
+
//# sourceMappingURL=chunk-Q755X6QF.js.map
|
|
@@ -2,17 +2,17 @@
|
|
|
2
2
|
import {
|
|
3
3
|
getDomainDisplayName,
|
|
4
4
|
orderDomains
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-7JQIMEUX.js";
|
|
6
6
|
import {
|
|
7
7
|
CheckboxGrid
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-RU5XLS5Q.js";
|
|
9
9
|
import {
|
|
10
10
|
useWizardStore
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-N34D3ROY.js";
|
|
12
12
|
import {
|
|
13
13
|
matrix,
|
|
14
14
|
typedEntries
|
|
15
|
-
} from "./chunk-
|
|
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-
|
|
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-
|
|
114
|
+
//# sourceMappingURL=chunk-RU5XLS5Q.js.map
|