@claude-collective/cli 0.6.0 → 0.13.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 +192 -0
- package/README.md +26 -9
- package/dist/{chunk-TOPAIL5W.js → chunk-3U3R4NCG.js} +2 -2
- package/dist/chunk-3U3R4NCG.js.map +1 -0
- package/dist/{chunk-TFV6Z7F7.js → chunk-57Y5RALO.js} +10 -10
- package/dist/chunk-57Y5RALO.js.map +1 -0
- package/dist/chunk-66UDJBF6.js +96 -0
- package/dist/chunk-66UDJBF6.js.map +1 -0
- package/dist/chunk-6DCSSORF.js +264 -0
- package/dist/chunk-6DCSSORF.js.map +1 -0
- package/dist/chunk-6Q3Y7KVB.js +31 -0
- package/dist/chunk-6Q3Y7KVB.js.map +1 -0
- package/dist/{chunk-SJYG4EJZ.js → chunk-76DWXGQE.js} +10 -8
- package/dist/chunk-76DWXGQE.js.map +1 -0
- package/dist/{chunk-AZP2AA5M.js → chunk-7Q44DMSP.js} +241 -84
- package/dist/chunk-7Q44DMSP.js.map +1 -0
- package/dist/chunk-ACNBKXXJ.js +321 -0
- package/dist/chunk-ACNBKXXJ.js.map +1 -0
- package/dist/{chunk-JMQGWQZU.js → chunk-B7CCVP6Q.js} +42 -10
- package/dist/chunk-B7CCVP6Q.js.map +1 -0
- package/dist/chunk-BDLUZVKU.js +54 -0
- package/dist/chunk-BDLUZVKU.js.map +1 -0
- package/dist/chunk-CDX4W4DM.js +120 -0
- package/dist/chunk-CDX4W4DM.js.map +1 -0
- package/dist/{chunk-MYAVQ23U.js → chunk-CJEHB4TB.js} +23 -9
- package/dist/chunk-CJEHB4TB.js.map +1 -0
- package/dist/{chunk-6WEQADPL.js → chunk-CPZOTVCI.js} +15 -14
- package/dist/chunk-CPZOTVCI.js.map +1 -0
- package/dist/chunk-D237EVNB.js +187 -0
- package/dist/chunk-D237EVNB.js.map +1 -0
- package/dist/{chunk-UFWNMW3G.js → chunk-DRXPNNPB.js} +19 -18
- package/dist/chunk-DRXPNNPB.js.map +1 -0
- package/dist/chunk-E3FJH4TF.js +80 -0
- package/dist/chunk-E3FJH4TF.js.map +1 -0
- package/dist/{chunk-D4IQAT27.js → chunk-ED4E6Q2T.js} +10 -10
- package/dist/chunk-ED4E6Q2T.js.map +1 -0
- package/dist/{chunk-SYQ7R2JO.js → chunk-EHS3TWWP.js} +3 -3
- package/dist/chunk-EHS3TWWP.js.map +1 -0
- package/dist/{chunk-AU7XVCLO.js → chunk-GDH553MV.js} +6 -6
- package/dist/chunk-GDH553MV.js.map +1 -0
- package/dist/chunk-HLJX2FTL.js +95 -0
- package/dist/chunk-HLJX2FTL.js.map +1 -0
- package/dist/chunk-I2DSLOXZ.js +75 -0
- package/dist/chunk-I2DSLOXZ.js.map +1 -0
- package/dist/{chunk-J2Y4A3LP.js → chunk-I4TPKIYX.js} +33 -18
- package/dist/chunk-I4TPKIYX.js.map +1 -0
- package/dist/{chunk-ZSKHDU5P.js → chunk-IMDW5ZUP.js} +19 -11
- package/dist/chunk-IMDW5ZUP.js.map +1 -0
- package/dist/{chunk-U4VYHKPM.js → chunk-JIPWV2FX.js} +6 -6
- package/dist/chunk-JIPWV2FX.js.map +1 -0
- package/dist/{chunk-OSQDDJXX.js → chunk-K7EVM5LY.js} +5 -10
- package/dist/chunk-K7EVM5LY.js.map +1 -0
- package/dist/{chunk-MJSFR562.js → chunk-KAAEN2PO.js} +3 -3
- package/dist/chunk-KAAEN2PO.js.map +1 -0
- package/dist/{chunk-URDV4OCP.js → chunk-LE6IY6IT.js} +22 -17
- package/dist/chunk-LE6IY6IT.js.map +1 -0
- package/dist/{chunk-FKU7VSUD.js → chunk-NDY25DTL.js} +6 -6
- package/dist/chunk-NDY25DTL.js.map +1 -0
- package/dist/{chunk-UNHCZRO4.js → chunk-P26A2K5N.js} +7 -7
- package/dist/chunk-P26A2K5N.js.map +1 -0
- package/dist/{chunk-DHFFRMF6.js → chunk-RTE64SJA.js} +2 -2
- package/dist/chunk-RTE64SJA.js.map +1 -0
- package/dist/{chunk-6ESUJMM7.js → chunk-SGJ23HIP.js} +14 -11
- package/dist/chunk-SGJ23HIP.js.map +1 -0
- package/dist/{chunk-367K3JB3.js → chunk-SVYPSDWY.js} +10 -10
- package/dist/chunk-SVYPSDWY.js.map +1 -0
- package/dist/{chunk-MMDXNZPF.js → chunk-TKFPKEV3.js} +2 -2
- package/dist/chunk-TKFPKEV3.js.map +1 -0
- package/dist/{chunk-M7YCPFIX.js → chunk-UQTEPWU7.js} +2 -2
- package/dist/chunk-UQTEPWU7.js.map +1 -0
- package/dist/{chunk-QESUUPOE.js → chunk-V46GGCCI.js} +80 -27
- package/dist/chunk-V46GGCCI.js.map +1 -0
- package/dist/chunk-X6QONICW.js +86 -0
- package/dist/chunk-X6QONICW.js.map +1 -0
- package/dist/chunk-XY3XDVMI.js +15599 -0
- package/dist/chunk-XY3XDVMI.js.map +1 -0
- package/dist/chunk-Y2LW7R3Y.js +23 -0
- package/dist/chunk-Y2LW7R3Y.js.map +1 -0
- package/dist/chunk-Z2CWURZ6.js +78 -0
- package/dist/chunk-Z2CWURZ6.js.map +1 -0
- package/dist/chunk-Z7G4B5HJ.js +377 -0
- package/dist/chunk-Z7G4B5HJ.js.map +1 -0
- package/dist/{chunk-ZDQIUHAM.js → chunk-ZENYS6KW.js} +16 -15
- package/dist/chunk-ZENYS6KW.js.map +1 -0
- package/dist/{cli-v2 → cli}/defaults/agent-mappings.yaml +5 -5
- package/dist/commands/build/marketplace.js +19 -60
- package/dist/commands/build/marketplace.js.map +1 -1
- package/dist/commands/build/plugins.js +21 -59
- package/dist/commands/build/plugins.js.map +1 -1
- package/dist/commands/build/stack.js +15 -15
- package/dist/commands/build/stack.js.map +1 -1
- package/dist/commands/compile.js +21 -21
- package/dist/commands/compile.js.map +1 -1
- package/dist/commands/config/get.js +9 -8
- package/dist/commands/config/get.js.map +1 -1
- package/dist/commands/config/index.js +7 -6
- package/dist/commands/config/index.js.map +1 -1
- package/dist/commands/config/path.js +8 -7
- package/dist/commands/config/path.js.map +1 -1
- package/dist/commands/config/set-project.js +9 -8
- package/dist/commands/config/set-project.js.map +1 -1
- package/dist/commands/config/set.js +9 -8
- package/dist/commands/config/set.js.map +1 -1
- package/dist/commands/config/show.js +6 -5
- package/dist/commands/config/unset-project.js +9 -8
- package/dist/commands/config/unset-project.js.map +1 -1
- package/dist/commands/config/unset.js +9 -8
- package/dist/commands/config/unset.js.map +1 -1
- package/dist/commands/diff.js +12 -12
- package/dist/commands/diff.js.map +1 -1
- package/dist/commands/doctor.js +10 -10
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/edit.js +52 -48
- package/dist/commands/edit.js.map +1 -1
- package/dist/commands/eject.js +180 -97
- package/dist/commands/eject.js.map +1 -1
- package/dist/commands/import/skill.js +339 -0
- package/dist/commands/import/skill.js.map +1 -0
- package/dist/commands/info.js +9 -9
- package/dist/commands/info.js.map +1 -1
- package/dist/commands/init.js +205 -77
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/list.js +9 -9
- package/dist/commands/list.js.map +1 -1
- package/dist/commands/new/agent.js +19 -21
- package/dist/commands/new/agent.js.map +1 -1
- package/dist/commands/new/skill.js +11 -12
- package/dist/commands/new/skill.js.map +1 -1
- package/dist/commands/outdated.js +12 -12
- package/dist/commands/outdated.js.map +1 -1
- package/dist/commands/search.js +205 -17
- package/dist/commands/search.js.map +1 -1
- package/dist/commands/test-imports.js +18 -18
- package/dist/commands/test-imports.js.map +1 -1
- package/dist/commands/uninstall.js +70 -83
- package/dist/commands/uninstall.js.map +1 -1
- package/dist/commands/update.js +22 -22
- package/dist/commands/update.js.map +1 -1
- package/dist/commands/validate.js +9 -9
- package/dist/commands/validate.js.map +1 -1
- package/dist/commands/version/bump.js +8 -8
- package/dist/commands/version/bump.js.map +1 -1
- package/dist/commands/version/index.js +8 -8
- package/dist/commands/version/index.js.map +1 -1
- package/dist/commands/version/set.js +7 -7
- package/dist/commands/version/set.js.map +1 -1
- package/dist/commands/version/show.js +8 -8
- package/dist/commands/version/show.js.map +1 -1
- package/dist/components/common/confirm.js +1 -1
- package/dist/components/common/message.js +1 -1
- package/dist/components/common/message.js.map +1 -1
- package/dist/components/common/spinner.js +1 -1
- package/dist/components/common/spinner.js.map +1 -1
- package/dist/components/skill-search/skill-search.js +10 -0
- package/dist/components/wizard/category-grid.js +9 -0
- package/dist/components/wizard/category-grid.test.js +861 -0
- package/dist/components/wizard/category-grid.test.js.map +1 -0
- package/dist/components/wizard/section-progress.js +9 -0
- package/dist/components/wizard/section-progress.test.js +281 -0
- package/dist/components/wizard/section-progress.test.js.map +1 -0
- package/dist/components/wizard/step-approach.js +4 -3
- package/dist/components/wizard/step-build.js +16 -0
- package/dist/components/wizard/step-build.js.map +1 -0
- package/dist/components/wizard/step-build.test.js +741 -0
- package/dist/components/wizard/step-build.test.js.map +1 -0
- package/dist/components/wizard/step-confirm.js +2 -4
- package/dist/components/wizard/step-refine.js +10 -0
- package/dist/components/wizard/step-refine.js.map +1 -0
- package/dist/components/wizard/step-refine.test.js +236 -0
- package/dist/components/wizard/step-refine.test.js.map +1 -0
- package/dist/components/wizard/step-stack-options.js +11 -0
- package/dist/components/wizard/step-stack-options.js.map +1 -0
- package/dist/components/wizard/step-stack.js +3 -3
- package/dist/components/wizard/wizard-footer.js +9 -0
- package/dist/components/wizard/wizard-footer.js.map +1 -0
- package/dist/components/wizard/wizard-tabs.js +11 -0
- package/dist/components/wizard/wizard-tabs.js.map +1 -0
- package/dist/components/wizard/wizard.js +14 -11
- package/dist/hooks/init.js +5 -4
- package/dist/hooks/init.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/stores/wizard-store.js +2 -2
- package/dist/stores/wizard-store.test.js +249 -15835
- package/dist/stores/wizard-store.test.js.map +1 -1
- package/package.json +3 -2
- package/dist/chunk-367K3JB3.js.map +0 -1
- package/dist/chunk-6ESUJMM7.js.map +0 -1
- package/dist/chunk-6OY6ZYQF.js +0 -93
- package/dist/chunk-6OY6ZYQF.js.map +0 -1
- package/dist/chunk-6WEQADPL.js.map +0 -1
- package/dist/chunk-AU7XVCLO.js.map +0 -1
- package/dist/chunk-AZP2AA5M.js.map +0 -1
- package/dist/chunk-D4IQAT27.js.map +0 -1
- package/dist/chunk-DHFFRMF6.js.map +0 -1
- package/dist/chunk-FKU7VSUD.js.map +0 -1
- package/dist/chunk-J2Y4A3LP.js.map +0 -1
- package/dist/chunk-JMQGWQZU.js.map +0 -1
- package/dist/chunk-JY4RO76L.js +0 -73
- package/dist/chunk-JY4RO76L.js.map +0 -1
- package/dist/chunk-M7YCPFIX.js.map +0 -1
- package/dist/chunk-MJSFR562.js.map +0 -1
- package/dist/chunk-MMDXNZPF.js.map +0 -1
- package/dist/chunk-MYAVQ23U.js.map +0 -1
- package/dist/chunk-OSQDDJXX.js.map +0 -1
- package/dist/chunk-QESUUPOE.js.map +0 -1
- package/dist/chunk-SJYG4EJZ.js.map +0 -1
- package/dist/chunk-SYQ7R2JO.js.map +0 -1
- package/dist/chunk-TD643KB3.js +0 -245
- package/dist/chunk-TD643KB3.js.map +0 -1
- package/dist/chunk-TFV6Z7F7.js.map +0 -1
- package/dist/chunk-TGOHJCQ4.js +0 -83
- package/dist/chunk-TGOHJCQ4.js.map +0 -1
- package/dist/chunk-TOPAIL5W.js.map +0 -1
- package/dist/chunk-U4VYHKPM.js.map +0 -1
- package/dist/chunk-UFWNMW3G.js.map +0 -1
- package/dist/chunk-UNHCZRO4.js.map +0 -1
- package/dist/chunk-URDV4OCP.js.map +0 -1
- package/dist/chunk-YI6JVSFO.js +0 -43
- package/dist/chunk-YI6JVSFO.js.map +0 -1
- package/dist/chunk-YNSNRR5D.js +0 -184
- package/dist/chunk-YNSNRR5D.js.map +0 -1
- package/dist/chunk-Z6DLWTBY.js +0 -46
- package/dist/chunk-Z6DLWTBY.js.map +0 -1
- package/dist/chunk-ZDQIUHAM.js.map +0 -1
- package/dist/chunk-ZSKHDU5P.js.map +0 -1
- package/dist/components/wizard/selection-header.js +0 -11
- package/dist/components/wizard/step-category.js +0 -12
- package/dist/components/wizard/step-subcategory.js +0 -13
- /package/dist/components/{wizard/selection-header.js.map → skill-search/skill-search.js.map} +0 -0
- /package/dist/components/wizard/{step-category.js.map → category-grid.js.map} +0 -0
- /package/dist/components/wizard/{step-subcategory.js.map → section-progress.js.map} +0 -0
|
@@ -1,35 +1,36 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
Confirm
|
|
4
|
+
} from "../chunk-RTE64SJA.js";
|
|
2
5
|
import {
|
|
3
6
|
claudePluginUninstall,
|
|
4
7
|
isClaudeCLIAvailable
|
|
5
|
-
} from "../chunk-
|
|
6
|
-
import {
|
|
7
|
-
Confirm
|
|
8
|
-
} from "../chunk-DHFFRMF6.js";
|
|
8
|
+
} from "../chunk-UQTEPWU7.js";
|
|
9
9
|
import {
|
|
10
10
|
getCollectivePluginDir
|
|
11
|
-
} from "../chunk-
|
|
12
|
-
import {
|
|
13
|
-
CLAUDE_DIR
|
|
14
|
-
} from "../chunk-SJYG4EJZ.js";
|
|
11
|
+
} from "../chunk-ED4E6Q2T.js";
|
|
15
12
|
import {
|
|
16
13
|
BaseCommand,
|
|
17
14
|
EXIT_CODES
|
|
18
|
-
} from "../chunk-
|
|
19
|
-
import "../chunk-
|
|
15
|
+
} from "../chunk-EHS3TWWP.js";
|
|
16
|
+
import "../chunk-3U3R4NCG.js";
|
|
20
17
|
import {
|
|
21
18
|
directoryExists,
|
|
22
19
|
fileExists,
|
|
23
20
|
remove
|
|
24
|
-
} from "../chunk-
|
|
21
|
+
} from "../chunk-TKFPKEV3.js";
|
|
22
|
+
import {
|
|
23
|
+
CLAUDE_DIR,
|
|
24
|
+
CLAUDE_SRC_DIR
|
|
25
|
+
} from "../chunk-76DWXGQE.js";
|
|
25
26
|
import {
|
|
26
27
|
init_esm_shims
|
|
27
28
|
} from "../chunk-DHET7RCE.js";
|
|
28
29
|
|
|
29
|
-
// src/cli
|
|
30
|
+
// src/cli/commands/uninstall.tsx
|
|
30
31
|
init_esm_shims();
|
|
31
32
|
import { Flags } from "@oclif/core";
|
|
32
|
-
import { render, Box, Text } from "ink";
|
|
33
|
+
import { render, Box, Text, useApp } from "ink";
|
|
33
34
|
import path from "path";
|
|
34
35
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
35
36
|
var PLUGIN_NAME = "claude-collective";
|
|
@@ -38,33 +39,48 @@ async function detectInstallation(projectDir) {
|
|
|
38
39
|
const skillsDir = path.join(projectDir, CLAUDE_DIR, "skills");
|
|
39
40
|
const agentsDir = path.join(projectDir, CLAUDE_DIR, "agents");
|
|
40
41
|
const configPath = path.join(projectDir, CLAUDE_DIR, "config.yaml");
|
|
41
|
-
const
|
|
42
|
+
const claudeDir = path.join(projectDir, CLAUDE_DIR);
|
|
43
|
+
const claudeSrcDir = path.join(projectDir, CLAUDE_SRC_DIR);
|
|
44
|
+
const [
|
|
45
|
+
hasPlugin,
|
|
46
|
+
hasLocalSkills,
|
|
47
|
+
hasLocalAgents,
|
|
48
|
+
hasLocalConfig,
|
|
49
|
+
hasClaudeDir,
|
|
50
|
+
hasClaudeSrcDir
|
|
51
|
+
] = await Promise.all([
|
|
42
52
|
directoryExists(pluginDir),
|
|
43
53
|
directoryExists(skillsDir),
|
|
44
54
|
directoryExists(agentsDir),
|
|
45
|
-
fileExists(configPath)
|
|
55
|
+
fileExists(configPath),
|
|
56
|
+
directoryExists(claudeDir),
|
|
57
|
+
directoryExists(claudeSrcDir)
|
|
46
58
|
]);
|
|
47
59
|
return {
|
|
48
60
|
hasPlugin,
|
|
49
61
|
hasLocalSkills,
|
|
50
62
|
hasLocalAgents,
|
|
51
63
|
hasLocalConfig,
|
|
64
|
+
hasClaudeDir,
|
|
65
|
+
hasClaudeSrcDir,
|
|
52
66
|
pluginDir,
|
|
53
67
|
skillsDir,
|
|
54
68
|
agentsDir,
|
|
55
|
-
configPath
|
|
69
|
+
configPath,
|
|
70
|
+
claudeDir,
|
|
71
|
+
claudeSrcDir
|
|
56
72
|
};
|
|
57
73
|
}
|
|
58
74
|
var UninstallConfirm = ({
|
|
59
75
|
target,
|
|
60
76
|
uninstallPlugin,
|
|
61
77
|
uninstallLocal,
|
|
62
|
-
keepConfig,
|
|
63
78
|
onConfirm,
|
|
64
79
|
onCancel
|
|
65
80
|
}) => {
|
|
81
|
+
const { exit } = useApp();
|
|
66
82
|
const hasPluginToRemove = uninstallPlugin && target.hasPlugin;
|
|
67
|
-
const hasLocalToRemove = uninstallLocal && (target.
|
|
83
|
+
const hasLocalToRemove = uninstallLocal && (target.hasClaudeDir || target.hasClaudeSrcDir);
|
|
68
84
|
return /* @__PURE__ */ jsxs(Box, { flexDirection: "column", children: [
|
|
69
85
|
/* @__PURE__ */ jsx(Text, { bold: true, children: "The following will be removed:" }),
|
|
70
86
|
/* @__PURE__ */ jsx(Text, { children: " " }),
|
|
@@ -76,25 +92,16 @@ var UninstallConfirm = ({
|
|
|
76
92
|
] })
|
|
77
93
|
] }),
|
|
78
94
|
hasLocalToRemove && /* @__PURE__ */ jsxs(Box, { flexDirection: "column", children: [
|
|
79
|
-
/* @__PURE__ */ jsx(Text, { color: "red", children: " Local
|
|
80
|
-
target.
|
|
95
|
+
/* @__PURE__ */ jsx(Text, { color: "red", children: " Local directories:" }),
|
|
96
|
+
target.hasClaudeDir && /* @__PURE__ */ jsxs(Text, { dimColor: true, children: [
|
|
81
97
|
" ",
|
|
82
|
-
target.
|
|
98
|
+
target.claudeDir,
|
|
99
|
+
"/"
|
|
83
100
|
] }),
|
|
84
|
-
target.
|
|
101
|
+
target.hasClaudeSrcDir && /* @__PURE__ */ jsxs(Text, { dimColor: true, children: [
|
|
85
102
|
" ",
|
|
86
|
-
target.
|
|
87
|
-
|
|
88
|
-
target.hasLocalConfig && !keepConfig && /* @__PURE__ */ jsxs(Text, { dimColor: true, children: [
|
|
89
|
-
" ",
|
|
90
|
-
target.configPath
|
|
91
|
-
] })
|
|
92
|
-
] }),
|
|
93
|
-
keepConfig && target.hasLocalConfig && /* @__PURE__ */ jsxs(Box, { flexDirection: "column", marginTop: 1, children: [
|
|
94
|
-
/* @__PURE__ */ jsx(Text, { color: "yellow", children: " Keeping:" }),
|
|
95
|
-
/* @__PURE__ */ jsxs(Text, { dimColor: true, children: [
|
|
96
|
-
" ",
|
|
97
|
-
target.configPath
|
|
103
|
+
target.claudeSrcDir,
|
|
104
|
+
"/"
|
|
98
105
|
] })
|
|
99
106
|
] }),
|
|
100
107
|
/* @__PURE__ */ jsx(Text, { children: " " }),
|
|
@@ -102,8 +109,14 @@ var UninstallConfirm = ({
|
|
|
102
109
|
Confirm,
|
|
103
110
|
{
|
|
104
111
|
message: "Are you sure you want to uninstall?",
|
|
105
|
-
onConfirm
|
|
106
|
-
|
|
112
|
+
onConfirm: () => {
|
|
113
|
+
onConfirm();
|
|
114
|
+
exit();
|
|
115
|
+
},
|
|
116
|
+
onCancel: () => {
|
|
117
|
+
onCancel();
|
|
118
|
+
exit();
|
|
119
|
+
},
|
|
107
120
|
defaultValue: false
|
|
108
121
|
}
|
|
109
122
|
)
|
|
@@ -111,11 +124,10 @@ var UninstallConfirm = ({
|
|
|
111
124
|
};
|
|
112
125
|
var Uninstall = class _Uninstall extends BaseCommand {
|
|
113
126
|
static summary = "Remove Claude Collective from this project";
|
|
114
|
-
static description = "Uninstall the Claude Collective plugin and/or local
|
|
127
|
+
static description = "Uninstall the Claude Collective plugin and/or local directories (.claude/ and .claude-src/). By default, removes everything.";
|
|
115
128
|
static examples = [
|
|
116
129
|
"<%= config.bin %> <%= command.id %>",
|
|
117
130
|
"<%= config.bin %> <%= command.id %> --yes",
|
|
118
|
-
"<%= config.bin %> <%= command.id %> --keep-config",
|
|
119
131
|
"<%= config.bin %> <%= command.id %> --plugin",
|
|
120
132
|
"<%= config.bin %> <%= command.id %> --local",
|
|
121
133
|
"<%= config.bin %> <%= command.id %> --dry-run"
|
|
@@ -127,10 +139,6 @@ var Uninstall = class _Uninstall extends BaseCommand {
|
|
|
127
139
|
description: "Skip confirmation prompt",
|
|
128
140
|
default: false
|
|
129
141
|
}),
|
|
130
|
-
"keep-config": Flags.boolean({
|
|
131
|
-
description: "Keep .claude/config.yaml",
|
|
132
|
-
default: false
|
|
133
|
-
}),
|
|
134
142
|
plugin: Flags.boolean({
|
|
135
143
|
description: "Only uninstall the plugin (not local files)",
|
|
136
144
|
default: false
|
|
@@ -154,14 +162,14 @@ var Uninstall = class _Uninstall extends BaseCommand {
|
|
|
154
162
|
const uninstallPlugin = !flags.local;
|
|
155
163
|
const uninstallLocal = !flags.plugin;
|
|
156
164
|
const hasPluginToRemove = uninstallPlugin && target.hasPlugin;
|
|
157
|
-
const hasLocalToRemove = uninstallLocal && (target.
|
|
165
|
+
const hasLocalToRemove = uninstallLocal && (target.hasClaudeDir || target.hasClaudeSrcDir);
|
|
158
166
|
if (!hasPluginToRemove && !hasLocalToRemove) {
|
|
159
167
|
this.warn("Nothing to uninstall.");
|
|
160
168
|
this.log("");
|
|
161
169
|
if (flags.plugin && !target.hasPlugin) {
|
|
162
170
|
this.log("No plugin installation found.");
|
|
163
171
|
}
|
|
164
|
-
if (flags.local && !target.
|
|
172
|
+
if (flags.local && !target.hasClaudeDir && !target.hasClaudeSrcDir) {
|
|
165
173
|
this.log("No local installation found.");
|
|
166
174
|
}
|
|
167
175
|
if (!flags.plugin && !flags.local) {
|
|
@@ -180,7 +188,6 @@ var Uninstall = class _Uninstall extends BaseCommand {
|
|
|
180
188
|
target,
|
|
181
189
|
uninstallPlugin,
|
|
182
190
|
uninstallLocal,
|
|
183
|
-
keepConfig: flags["keep-config"],
|
|
184
191
|
onConfirm: () => resolve(true),
|
|
185
192
|
onCancel: () => resolve(false)
|
|
186
193
|
}
|
|
@@ -201,22 +208,14 @@ var Uninstall = class _Uninstall extends BaseCommand {
|
|
|
201
208
|
this.log(` ${target.pluginDir}`);
|
|
202
209
|
}
|
|
203
210
|
if (hasLocalToRemove) {
|
|
204
|
-
this.log(" Local
|
|
205
|
-
if (target.
|
|
206
|
-
this.log(` ${target.
|
|
207
|
-
}
|
|
208
|
-
if (target.hasLocalAgents) {
|
|
209
|
-
this.log(` ${target.agentsDir}`);
|
|
211
|
+
this.log(" Local directories:");
|
|
212
|
+
if (target.hasClaudeDir) {
|
|
213
|
+
this.log(` ${target.claudeDir}/`);
|
|
210
214
|
}
|
|
211
|
-
if (target.
|
|
212
|
-
this.log(` ${target.
|
|
215
|
+
if (target.hasClaudeSrcDir) {
|
|
216
|
+
this.log(` ${target.claudeSrcDir}/`);
|
|
213
217
|
}
|
|
214
218
|
}
|
|
215
|
-
if (flags["keep-config"] && target.hasLocalConfig) {
|
|
216
|
-
this.log("");
|
|
217
|
-
this.log(" Keeping:");
|
|
218
|
-
this.log(` ${target.configPath}`);
|
|
219
|
-
}
|
|
220
219
|
this.log("");
|
|
221
220
|
}
|
|
222
221
|
if (flags["dry-run"]) {
|
|
@@ -225,14 +224,11 @@ var Uninstall = class _Uninstall extends BaseCommand {
|
|
|
225
224
|
this.log(`[dry-run] Would remove ${target.pluginDir}`);
|
|
226
225
|
}
|
|
227
226
|
if (hasLocalToRemove) {
|
|
228
|
-
if (target.
|
|
229
|
-
this.log(`[dry-run] Would remove ${target.
|
|
230
|
-
}
|
|
231
|
-
if (target.hasLocalAgents) {
|
|
232
|
-
this.log(`[dry-run] Would remove ${target.agentsDir}`);
|
|
227
|
+
if (target.hasClaudeDir) {
|
|
228
|
+
this.log(`[dry-run] Would remove ${target.claudeDir}/`);
|
|
233
229
|
}
|
|
234
|
-
if (target.
|
|
235
|
-
this.log(`[dry-run] Would remove ${target.
|
|
230
|
+
if (target.hasClaudeSrcDir) {
|
|
231
|
+
this.log(`[dry-run] Would remove ${target.claudeSrcDir}/`);
|
|
236
232
|
}
|
|
237
233
|
}
|
|
238
234
|
this.log("");
|
|
@@ -258,26 +254,22 @@ var Uninstall = class _Uninstall extends BaseCommand {
|
|
|
258
254
|
}
|
|
259
255
|
}
|
|
260
256
|
if (hasLocalToRemove) {
|
|
261
|
-
this.log("Removing local
|
|
257
|
+
this.log("Removing local directories...");
|
|
262
258
|
try {
|
|
263
259
|
const removed = [];
|
|
264
|
-
if (target.
|
|
265
|
-
await remove(target.
|
|
266
|
-
removed.push(
|
|
260
|
+
if (target.hasClaudeDir) {
|
|
261
|
+
await remove(target.claudeDir);
|
|
262
|
+
removed.push(CLAUDE_DIR);
|
|
267
263
|
}
|
|
268
|
-
if (target.
|
|
269
|
-
await remove(target.
|
|
270
|
-
removed.push(
|
|
271
|
-
}
|
|
272
|
-
if (target.hasLocalConfig && !flags["keep-config"]) {
|
|
273
|
-
await remove(target.configPath);
|
|
274
|
-
removed.push(".claude/config.yaml");
|
|
264
|
+
if (target.hasClaudeSrcDir) {
|
|
265
|
+
await remove(target.claudeSrcDir);
|
|
266
|
+
removed.push(CLAUDE_SRC_DIR);
|
|
275
267
|
}
|
|
276
268
|
this.logSuccess(
|
|
277
|
-
`Removed ${removed.length} ${removed.length === 1 ? "
|
|
269
|
+
`Removed ${removed.length} ${removed.length === 1 ? "directory" : "directories"}: ${removed.join(", ")}`
|
|
278
270
|
);
|
|
279
271
|
} catch (error) {
|
|
280
|
-
this.log("Failed to remove local
|
|
272
|
+
this.log("Failed to remove local directories");
|
|
281
273
|
this.error(
|
|
282
274
|
error instanceof Error ? error.message : "Unknown error occurred",
|
|
283
275
|
{ exit: EXIT_CODES.ERROR }
|
|
@@ -286,11 +278,6 @@ var Uninstall = class _Uninstall extends BaseCommand {
|
|
|
286
278
|
}
|
|
287
279
|
this.log("");
|
|
288
280
|
this.log("Claude Collective has been uninstalled.");
|
|
289
|
-
if (flags["keep-config"]) {
|
|
290
|
-
this.log("");
|
|
291
|
-
this.log("Configuration preserved at .claude/config.yaml");
|
|
292
|
-
this.log("Run `cc init` to reinstall with your existing configuration.");
|
|
293
|
-
}
|
|
294
281
|
this.log("");
|
|
295
282
|
this.logSuccess("Uninstall complete!");
|
|
296
283
|
this.log("");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/cli-v2/commands/uninstall.tsx"],"sourcesContent":["import React, { useState } from \"react\";\nimport { Flags } from \"@oclif/core\";\nimport { render, Box, Text } from \"ink\";\nimport path from \"path\";\nimport { BaseCommand } from \"../base-command\";\nimport { Confirm } from \"../components/common/confirm\";\nimport { directoryExists, fileExists, remove } from \"../utils/fs\";\nimport { claudePluginUninstall, isClaudeCLIAvailable } from \"../utils/exec\";\nimport { getCollectivePluginDir } from \"../lib/plugin-finder\";\nimport { CLAUDE_DIR } from \"../consts\";\nimport { EXIT_CODES } from \"../lib/exit-codes\";\n\nconst PLUGIN_NAME = \"claude-collective\";\n\ninterface UninstallTarget {\n hasPlugin: boolean;\n hasLocalSkills: boolean;\n hasLocalAgents: boolean;\n hasLocalConfig: boolean;\n pluginDir: string;\n skillsDir: string;\n agentsDir: string;\n configPath: string;\n}\n\nasync function detectInstallation(\n projectDir: string,\n): Promise<UninstallTarget> {\n const pluginDir = getCollectivePluginDir(projectDir);\n const skillsDir = path.join(projectDir, CLAUDE_DIR, \"skills\");\n const agentsDir = path.join(projectDir, CLAUDE_DIR, \"agents\");\n const configPath = path.join(projectDir, CLAUDE_DIR, \"config.yaml\");\n\n const [hasPlugin, hasLocalSkills, hasLocalAgents, hasLocalConfig] =\n await Promise.all([\n directoryExists(pluginDir),\n directoryExists(skillsDir),\n directoryExists(agentsDir),\n fileExists(configPath),\n ]);\n\n return {\n hasPlugin,\n hasLocalSkills,\n hasLocalAgents,\n hasLocalConfig,\n pluginDir,\n skillsDir,\n agentsDir,\n configPath,\n };\n}\n\ninterface UninstallConfirmProps {\n target: UninstallTarget;\n uninstallPlugin: boolean;\n uninstallLocal: boolean;\n keepConfig: boolean;\n onConfirm: () => void;\n onCancel: () => void;\n}\n\nconst UninstallConfirm: React.FC<UninstallConfirmProps> = ({\n target,\n uninstallPlugin,\n uninstallLocal,\n keepConfig,\n onConfirm,\n onCancel,\n}) => {\n const hasPluginToRemove = uninstallPlugin && target.hasPlugin;\n const hasLocalToRemove =\n uninstallLocal &&\n (target.hasLocalSkills || target.hasLocalAgents || target.hasLocalConfig);\n\n return (\n <Box flexDirection=\"column\">\n <Text bold>The following will be removed:</Text>\n <Text> </Text>\n\n {hasPluginToRemove && (\n <Box flexDirection=\"column\">\n <Text color=\"red\"> Plugin:</Text>\n <Text dimColor> {target.pluginDir}</Text>\n </Box>\n )}\n\n {hasLocalToRemove && (\n <Box flexDirection=\"column\">\n <Text color=\"red\"> Local files:</Text>\n {target.hasLocalSkills && <Text dimColor> {target.skillsDir}</Text>}\n {target.hasLocalAgents && <Text dimColor> {target.agentsDir}</Text>}\n {target.hasLocalConfig && !keepConfig && (\n <Text dimColor> {target.configPath}</Text>\n )}\n </Box>\n )}\n\n {keepConfig && target.hasLocalConfig && (\n <Box flexDirection=\"column\" marginTop={1}>\n <Text color=\"yellow\"> Keeping:</Text>\n <Text dimColor> {target.configPath}</Text>\n </Box>\n )}\n\n <Text> </Text>\n <Confirm\n message=\"Are you sure you want to uninstall?\"\n onConfirm={onConfirm}\n onCancel={onCancel}\n defaultValue={false}\n />\n </Box>\n );\n};\n\nexport default class Uninstall extends BaseCommand {\n static summary = \"Remove Claude Collective from this project\";\n\n static description =\n \"Uninstall the Claude Collective plugin and/or local files (.claude/skills, .claude/agents, .claude/config.yaml). By default, removes everything.\";\n\n static examples = [\n \"<%= config.bin %> <%= command.id %>\",\n \"<%= config.bin %> <%= command.id %> --yes\",\n \"<%= config.bin %> <%= command.id %> --keep-config\",\n \"<%= config.bin %> <%= command.id %> --plugin\",\n \"<%= config.bin %> <%= command.id %> --local\",\n \"<%= config.bin %> <%= command.id %> --dry-run\",\n ];\n\n static flags = {\n ...BaseCommand.baseFlags,\n yes: Flags.boolean({\n char: \"y\",\n description: \"Skip confirmation prompt\",\n default: false,\n }),\n \"keep-config\": Flags.boolean({\n description: \"Keep .claude/config.yaml\",\n default: false,\n }),\n plugin: Flags.boolean({\n description: \"Only uninstall the plugin (not local files)\",\n default: false,\n }),\n local: Flags.boolean({\n description: \"Only remove local files (not the plugin)\",\n default: false,\n }),\n };\n\n async run(): Promise<void> {\n const { flags } = await this.parse(Uninstall);\n const projectDir = process.cwd();\n\n this.log(\"\");\n this.log(\"Claude Collective Uninstall\");\n this.log(\"\");\n\n if (flags[\"dry-run\"]) {\n this.log(\"[dry-run] Preview mode - no files will be removed\");\n this.log(\"\");\n }\n\n // Detect what's installed\n const target = await detectInstallation(projectDir);\n\n // Determine what to uninstall based on flags\n const uninstallPlugin = !flags.local;\n const uninstallLocal = !flags.plugin;\n\n // Check if there's anything to uninstall\n const hasPluginToRemove = uninstallPlugin && target.hasPlugin;\n const hasLocalToRemove =\n uninstallLocal &&\n (target.hasLocalSkills || target.hasLocalAgents || target.hasLocalConfig);\n\n if (!hasPluginToRemove && !hasLocalToRemove) {\n this.warn(\"Nothing to uninstall.\");\n this.log(\"\");\n\n if (flags.plugin && !target.hasPlugin) {\n this.log(\"No plugin installation found.\");\n }\n if (flags.local && !target.hasLocalSkills && !target.hasLocalAgents) {\n this.log(\"No local installation found.\");\n }\n if (!flags.plugin && !flags.local) {\n this.log(\"Claude Collective is not installed in this project.\");\n }\n\n this.log(\"\");\n this.log(\"No changes made.\");\n return;\n }\n\n // Show what will be removed and get confirmation (unless --yes or --dry-run)\n if (!flags.yes && !flags[\"dry-run\"]) {\n const confirmed = await new Promise<boolean>((resolve) => {\n const { waitUntilExit } = render(\n <UninstallConfirm\n target={target}\n uninstallPlugin={uninstallPlugin}\n uninstallLocal={uninstallLocal}\n keepConfig={flags[\"keep-config\"]}\n onConfirm={() => resolve(true)}\n onCancel={() => resolve(false)}\n />,\n );\n\n waitUntilExit().catch(() => resolve(false));\n });\n\n if (!confirmed) {\n this.log(\"\");\n this.log(\"Uninstall cancelled\");\n this.exit(EXIT_CODES.CANCELLED);\n }\n } else {\n // In dry-run or --yes mode, just show what will be removed\n this.log(\"The following will be removed:\");\n this.log(\"\");\n\n if (hasPluginToRemove) {\n this.log(\" Plugin:\");\n this.log(` ${target.pluginDir}`);\n }\n\n if (hasLocalToRemove) {\n this.log(\" Local files:\");\n if (target.hasLocalSkills) {\n this.log(` ${target.skillsDir}`);\n }\n if (target.hasLocalAgents) {\n this.log(` ${target.agentsDir}`);\n }\n if (target.hasLocalConfig && !flags[\"keep-config\"]) {\n this.log(` ${target.configPath}`);\n }\n }\n\n if (flags[\"keep-config\"] && target.hasLocalConfig) {\n this.log(\"\");\n this.log(\" Keeping:\");\n this.log(` ${target.configPath}`);\n }\n\n this.log(\"\");\n }\n\n // Dry run - show what would happen\n if (flags[\"dry-run\"]) {\n if (hasPluginToRemove) {\n this.log(`[dry-run] Would uninstall plugin \"${PLUGIN_NAME}\"`);\n this.log(`[dry-run] Would remove ${target.pluginDir}`);\n }\n if (hasLocalToRemove) {\n if (target.hasLocalSkills) {\n this.log(`[dry-run] Would remove ${target.skillsDir}`);\n }\n if (target.hasLocalAgents) {\n this.log(`[dry-run] Would remove ${target.agentsDir}`);\n }\n if (target.hasLocalConfig && !flags[\"keep-config\"]) {\n this.log(`[dry-run] Would remove ${target.configPath}`);\n }\n }\n this.log(\"\");\n this.log(\"[dry-run] Preview complete - no files were removed\");\n this.log(\"\");\n return;\n }\n\n // Uninstall plugin\n if (hasPluginToRemove) {\n this.log(\"Uninstalling plugin...\");\n\n try {\n // Try to use claude CLI to uninstall (handles settings.json)\n const cliAvailable = await isClaudeCLIAvailable();\n if (cliAvailable) {\n await claudePluginUninstall(PLUGIN_NAME, \"project\", projectDir);\n }\n\n // Remove plugin directory\n await remove(target.pluginDir);\n\n this.logSuccess(\"Plugin uninstalled\");\n } catch (error) {\n this.log(\"Plugin uninstall failed\");\n this.error(\n error instanceof Error ? error.message : \"Unknown error occurred\",\n { exit: EXIT_CODES.ERROR },\n );\n }\n }\n\n // Remove local files\n if (hasLocalToRemove) {\n this.log(\"Removing local files...\");\n\n try {\n const removed: string[] = [];\n\n if (target.hasLocalSkills) {\n await remove(target.skillsDir);\n removed.push(\".claude/skills/\");\n }\n\n if (target.hasLocalAgents) {\n await remove(target.agentsDir);\n removed.push(\".claude/agents/\");\n }\n\n if (target.hasLocalConfig && !flags[\"keep-config\"]) {\n await remove(target.configPath);\n removed.push(\".claude/config.yaml\");\n }\n\n this.logSuccess(\n `Removed ${removed.length} ${removed.length === 1 ? \"item\" : \"items\"}`,\n );\n } catch (error) {\n this.log(\"Failed to remove local files\");\n this.error(\n error instanceof Error ? error.message : \"Unknown error occurred\",\n { exit: EXIT_CODES.ERROR },\n );\n }\n }\n\n this.log(\"\");\n this.log(\"Claude Collective has been uninstalled.\");\n\n if (flags[\"keep-config\"]) {\n this.log(\"\");\n this.log(\"Configuration preserved at .claude/config.yaml\");\n this.log(\"Run `cc init` to reinstall with your existing configuration.\");\n }\n\n this.log(\"\");\n this.logSuccess(\"Uninstall complete!\");\n this.log(\"\");\n }\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/cli/commands/uninstall.tsx"],"sourcesContent":["import React from \"react\";\nimport { Flags } from \"@oclif/core\";\nimport { render, Box, Text, useApp } from \"ink\";\nimport path from \"path\";\nimport { BaseCommand } from \"../base-command\";\nimport { Confirm } from \"../components/common/confirm\";\nimport { directoryExists, fileExists, remove } from \"../utils/fs\";\nimport { claudePluginUninstall, isClaudeCLIAvailable } from \"../utils/exec\";\nimport { getCollectivePluginDir } from \"../lib/plugin-finder\";\nimport { CLAUDE_DIR, CLAUDE_SRC_DIR } from \"../consts\";\nimport { EXIT_CODES } from \"../lib/exit-codes\";\n\nconst PLUGIN_NAME = \"claude-collective\";\n\ninterface UninstallTarget {\n hasPlugin: boolean;\n hasLocalSkills: boolean;\n hasLocalAgents: boolean;\n hasLocalConfig: boolean;\n hasClaudeDir: boolean;\n hasClaudeSrcDir: boolean;\n pluginDir: string;\n skillsDir: string;\n agentsDir: string;\n configPath: string;\n claudeDir: string;\n claudeSrcDir: string;\n}\n\nasync function detectInstallation(\n projectDir: string,\n): Promise<UninstallTarget> {\n const pluginDir = getCollectivePluginDir(projectDir);\n const skillsDir = path.join(projectDir, CLAUDE_DIR, \"skills\");\n const agentsDir = path.join(projectDir, CLAUDE_DIR, \"agents\");\n const configPath = path.join(projectDir, CLAUDE_DIR, \"config.yaml\");\n const claudeDir = path.join(projectDir, CLAUDE_DIR);\n const claudeSrcDir = path.join(projectDir, CLAUDE_SRC_DIR);\n\n const [\n hasPlugin,\n hasLocalSkills,\n hasLocalAgents,\n hasLocalConfig,\n hasClaudeDir,\n hasClaudeSrcDir,\n ] = await Promise.all([\n directoryExists(pluginDir),\n directoryExists(skillsDir),\n directoryExists(agentsDir),\n fileExists(configPath),\n directoryExists(claudeDir),\n directoryExists(claudeSrcDir),\n ]);\n\n return {\n hasPlugin,\n hasLocalSkills,\n hasLocalAgents,\n hasLocalConfig,\n hasClaudeDir,\n hasClaudeSrcDir,\n pluginDir,\n skillsDir,\n agentsDir,\n configPath,\n claudeDir,\n claudeSrcDir,\n };\n}\n\ninterface UninstallConfirmProps {\n target: UninstallTarget;\n uninstallPlugin: boolean;\n uninstallLocal: boolean;\n onConfirm: () => void;\n onCancel: () => void;\n}\n\nconst UninstallConfirm: React.FC<UninstallConfirmProps> = ({\n target,\n uninstallPlugin,\n uninstallLocal,\n onConfirm,\n onCancel,\n}) => {\n const { exit } = useApp();\n const hasPluginToRemove = uninstallPlugin && target.hasPlugin;\n const hasLocalToRemove =\n uninstallLocal && (target.hasClaudeDir || target.hasClaudeSrcDir);\n\n return (\n <Box flexDirection=\"column\">\n <Text bold>The following will be removed:</Text>\n <Text> </Text>\n\n {hasPluginToRemove && (\n <Box flexDirection=\"column\">\n <Text color=\"red\"> Plugin:</Text>\n <Text dimColor> {target.pluginDir}</Text>\n </Box>\n )}\n\n {hasLocalToRemove && (\n <Box flexDirection=\"column\">\n <Text color=\"red\"> Local directories:</Text>\n {target.hasClaudeDir && <Text dimColor> {target.claudeDir}/</Text>}\n {target.hasClaudeSrcDir && (\n <Text dimColor> {target.claudeSrcDir}/</Text>\n )}\n </Box>\n )}\n\n <Text> </Text>\n <Confirm\n message=\"Are you sure you want to uninstall?\"\n onConfirm={() => {\n onConfirm();\n exit();\n }}\n onCancel={() => {\n onCancel();\n exit();\n }}\n defaultValue={false}\n />\n </Box>\n );\n};\n\nexport default class Uninstall extends BaseCommand {\n static summary = \"Remove Claude Collective from this project\";\n\n static description =\n \"Uninstall the Claude Collective plugin and/or local directories (.claude/ and .claude-src/). By default, removes everything.\";\n\n static examples = [\n \"<%= config.bin %> <%= command.id %>\",\n \"<%= config.bin %> <%= command.id %> --yes\",\n \"<%= config.bin %> <%= command.id %> --plugin\",\n \"<%= config.bin %> <%= command.id %> --local\",\n \"<%= config.bin %> <%= command.id %> --dry-run\",\n ];\n\n static flags = {\n ...BaseCommand.baseFlags,\n yes: Flags.boolean({\n char: \"y\",\n description: \"Skip confirmation prompt\",\n default: false,\n }),\n plugin: Flags.boolean({\n description: \"Only uninstall the plugin (not local files)\",\n default: false,\n }),\n local: Flags.boolean({\n description: \"Only remove local files (not the plugin)\",\n default: false,\n }),\n };\n\n async run(): Promise<void> {\n const { flags } = await this.parse(Uninstall);\n const projectDir = process.cwd();\n\n this.log(\"\");\n this.log(\"Claude Collective Uninstall\");\n this.log(\"\");\n\n if (flags[\"dry-run\"]) {\n this.log(\"[dry-run] Preview mode - no files will be removed\");\n this.log(\"\");\n }\n\n // Detect what's installed\n const target = await detectInstallation(projectDir);\n\n // Determine what to uninstall based on flags\n const uninstallPlugin = !flags.local;\n const uninstallLocal = !flags.plugin;\n\n // Check if there's anything to uninstall\n const hasPluginToRemove = uninstallPlugin && target.hasPlugin;\n const hasLocalToRemove =\n uninstallLocal && (target.hasClaudeDir || target.hasClaudeSrcDir);\n\n if (!hasPluginToRemove && !hasLocalToRemove) {\n this.warn(\"Nothing to uninstall.\");\n this.log(\"\");\n\n if (flags.plugin && !target.hasPlugin) {\n this.log(\"No plugin installation found.\");\n }\n if (flags.local && !target.hasClaudeDir && !target.hasClaudeSrcDir) {\n this.log(\"No local installation found.\");\n }\n if (!flags.plugin && !flags.local) {\n this.log(\"Claude Collective is not installed in this project.\");\n }\n\n this.log(\"\");\n this.log(\"No changes made.\");\n return;\n }\n\n // Show what will be removed and get confirmation (unless --yes or --dry-run)\n if (!flags.yes && !flags[\"dry-run\"]) {\n const confirmed = await new Promise<boolean>((resolve) => {\n const { waitUntilExit } = render(\n <UninstallConfirm\n target={target}\n uninstallPlugin={uninstallPlugin}\n uninstallLocal={uninstallLocal}\n onConfirm={() => resolve(true)}\n onCancel={() => resolve(false)}\n />,\n );\n\n waitUntilExit().catch(() => resolve(false));\n });\n\n if (!confirmed) {\n this.log(\"\");\n this.log(\"Uninstall cancelled\");\n this.exit(EXIT_CODES.CANCELLED);\n }\n } else {\n // In dry-run or --yes mode, just show what will be removed\n this.log(\"The following will be removed:\");\n this.log(\"\");\n\n if (hasPluginToRemove) {\n this.log(\" Plugin:\");\n this.log(` ${target.pluginDir}`);\n }\n\n if (hasLocalToRemove) {\n this.log(\" Local directories:\");\n if (target.hasClaudeDir) {\n this.log(` ${target.claudeDir}/`);\n }\n if (target.hasClaudeSrcDir) {\n this.log(` ${target.claudeSrcDir}/`);\n }\n }\n\n this.log(\"\");\n }\n\n // Dry run - show what would happen\n if (flags[\"dry-run\"]) {\n if (hasPluginToRemove) {\n this.log(`[dry-run] Would uninstall plugin \"${PLUGIN_NAME}\"`);\n this.log(`[dry-run] Would remove ${target.pluginDir}`);\n }\n if (hasLocalToRemove) {\n if (target.hasClaudeDir) {\n this.log(`[dry-run] Would remove ${target.claudeDir}/`);\n }\n if (target.hasClaudeSrcDir) {\n this.log(`[dry-run] Would remove ${target.claudeSrcDir}/`);\n }\n }\n this.log(\"\");\n this.log(\"[dry-run] Preview complete - no files were removed\");\n this.log(\"\");\n return;\n }\n\n // Uninstall plugin\n if (hasPluginToRemove) {\n this.log(\"Uninstalling plugin...\");\n\n try {\n // Try to use claude CLI to uninstall (handles settings.json)\n const cliAvailable = await isClaudeCLIAvailable();\n if (cliAvailable) {\n await claudePluginUninstall(PLUGIN_NAME, \"project\", projectDir);\n }\n\n // Remove plugin directory\n await remove(target.pluginDir);\n\n this.logSuccess(\"Plugin uninstalled\");\n } catch (error) {\n this.log(\"Plugin uninstall failed\");\n this.error(\n error instanceof Error ? error.message : \"Unknown error occurred\",\n { exit: EXIT_CODES.ERROR },\n );\n }\n }\n\n // Remove local directories\n if (hasLocalToRemove) {\n this.log(\"Removing local directories...\");\n\n try {\n const removed: string[] = [];\n\n if (target.hasClaudeDir) {\n await remove(target.claudeDir);\n removed.push(CLAUDE_DIR);\n }\n\n if (target.hasClaudeSrcDir) {\n await remove(target.claudeSrcDir);\n removed.push(CLAUDE_SRC_DIR);\n }\n\n this.logSuccess(\n `Removed ${removed.length} ${removed.length === 1 ? \"directory\" : \"directories\"}: ${removed.join(\", \")}`,\n );\n } catch (error) {\n this.log(\"Failed to remove local directories\");\n this.error(\n error instanceof Error ? error.message : \"Unknown error occurred\",\n { exit: EXIT_CODES.ERROR },\n );\n }\n }\n\n this.log(\"\");\n this.log(\"Claude Collective has been uninstalled.\");\n\n this.log(\"\");\n this.logSuccess(\"Uninstall complete!\");\n this.log(\"\");\n }\n}\n"],"mappings":"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","names":[]}
|
package/dist/commands/update.js
CHANGED
|
@@ -1,46 +1,46 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import {
|
|
3
|
-
recompileAgents
|
|
4
|
-
} from "../chunk-URDV4OCP.js";
|
|
5
|
-
import "../chunk-MYAVQ23U.js";
|
|
6
2
|
import {
|
|
7
3
|
Confirm
|
|
8
|
-
} from "../chunk-
|
|
9
|
-
import "../chunk-UFWNMW3G.js";
|
|
10
|
-
import "../chunk-AU7XVCLO.js";
|
|
4
|
+
} from "../chunk-RTE64SJA.js";
|
|
11
5
|
import {
|
|
12
|
-
|
|
13
|
-
} from "../chunk-
|
|
14
|
-
import "../chunk-
|
|
6
|
+
recompileAgents
|
|
7
|
+
} from "../chunk-LE6IY6IT.js";
|
|
8
|
+
import "../chunk-DRXPNNPB.js";
|
|
9
|
+
import "../chunk-GDH553MV.js";
|
|
10
|
+
import "../chunk-I4TPKIYX.js";
|
|
15
11
|
import {
|
|
16
12
|
getCollectivePluginDir
|
|
17
|
-
} from "../chunk-
|
|
13
|
+
} from "../chunk-ED4E6Q2T.js";
|
|
14
|
+
import "../chunk-CJEHB4TB.js";
|
|
18
15
|
import {
|
|
19
|
-
|
|
20
|
-
} from "../chunk-
|
|
21
|
-
import "../chunk-JMQGWQZU.js";
|
|
22
|
-
import "../chunk-ZSKHDU5P.js";
|
|
23
|
-
import "../chunk-QESUUPOE.js";
|
|
16
|
+
hashFile
|
|
17
|
+
} from "../chunk-KAAEN2PO.js";
|
|
24
18
|
import {
|
|
25
|
-
|
|
26
|
-
} from "../chunk-
|
|
19
|
+
loadSkillsMatrixFromSource
|
|
20
|
+
} from "../chunk-CPZOTVCI.js";
|
|
21
|
+
import "../chunk-B7CCVP6Q.js";
|
|
22
|
+
import "../chunk-IMDW5ZUP.js";
|
|
27
23
|
import {
|
|
28
24
|
BaseCommand,
|
|
29
25
|
EXIT_CODES
|
|
30
|
-
} from "../chunk-
|
|
31
|
-
import "../chunk-
|
|
26
|
+
} from "../chunk-EHS3TWWP.js";
|
|
27
|
+
import "../chunk-V46GGCCI.js";
|
|
28
|
+
import "../chunk-3U3R4NCG.js";
|
|
32
29
|
import {
|
|
33
30
|
copy,
|
|
34
31
|
fileExists,
|
|
35
32
|
listDirectories,
|
|
36
33
|
readFile,
|
|
37
34
|
writeFile
|
|
38
|
-
} from "../chunk-
|
|
35
|
+
} from "../chunk-TKFPKEV3.js";
|
|
36
|
+
import {
|
|
37
|
+
LOCAL_SKILLS_PATH
|
|
38
|
+
} from "../chunk-76DWXGQE.js";
|
|
39
39
|
import {
|
|
40
40
|
init_esm_shims
|
|
41
41
|
} from "../chunk-DHET7RCE.js";
|
|
42
42
|
|
|
43
|
-
// src/cli
|
|
43
|
+
// src/cli/commands/update.tsx
|
|
44
44
|
init_esm_shims();
|
|
45
45
|
import { render } from "ink";
|
|
46
46
|
import { Flags, Args } from "@oclif/core";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/cli-v2/commands/update.tsx"],"sourcesContent":["import React, { useState } from \"react\";\nimport { render } from \"ink\";\nimport { Flags, Args } from \"@oclif/core\";\nimport { printTable } from \"@oclif/table\";\nimport path from \"path\";\nimport { parse as parseYaml, stringify as stringifyYaml } from \"yaml\";\nimport { BaseCommand } from \"../base-command.js\";\nimport {\n loadSkillsMatrixFromSource,\n type SourceLoadResult,\n} from \"../lib/source-loader.js\";\nimport { hashFile } from \"../lib/versioning.js\";\nimport { recompileAgents } from \"../lib/agent-recompiler.js\";\nimport { EXIT_CODES } from \"../lib/exit-codes.js\";\nimport {\n fileExists,\n readFile,\n writeFile,\n listDirectories,\n copy,\n} from \"../utils/fs.js\";\nimport { LOCAL_SKILLS_PATH } from \"../consts.js\";\nimport { getCollectivePluginDir } from \"../lib/plugin-finder.js\";\nimport { Confirm } from \"../components/common/confirm.js\";\n\n/**\n * ForkedFrom metadata stored in local skill's metadata.yaml\n */\ninterface ForkedFromMetadata {\n skill_id: string;\n content_hash: string;\n date: string;\n}\n\n/**\n * Local skill metadata structure\n */\ninterface LocalSkillMetadata {\n forked_from?: ForkedFromMetadata;\n [key: string]: unknown;\n}\n\n/**\n * Result of comparing a local skill to its source\n */\ninterface SkillComparisonResult {\n id: string;\n localHash: string | null;\n sourceHash: string | null;\n status: \"current\" | \"outdated\" | \"local-only\";\n dirName: string;\n sourcePath?: string;\n}\n\n/**\n * Read forked_from metadata from a local skill's metadata.yaml\n */\nasync function readForkedFromMetadata(\n skillDir: string,\n): Promise<ForkedFromMetadata | null> {\n const metadataPath = path.join(skillDir, \"metadata.yaml\");\n\n if (!(await fileExists(metadataPath))) {\n return null;\n }\n\n const content = await readFile(metadataPath);\n const metadata = parseYaml(content) as LocalSkillMetadata;\n\n return metadata.forked_from ?? null;\n}\n\n/**\n * Get local skills with their forked_from metadata\n */\nasync function getLocalSkillsWithMetadata(\n projectDir: string,\n): Promise<\n Map<string, { dirName: string; forkedFrom: ForkedFromMetadata | null }>\n> {\n const localSkillsPath = path.join(projectDir, LOCAL_SKILLS_PATH);\n const result = new Map<\n string,\n { dirName: string; forkedFrom: ForkedFromMetadata | null }\n >();\n\n if (!(await fileExists(localSkillsPath))) {\n return result;\n }\n\n const skillDirs = await listDirectories(localSkillsPath);\n\n for (const dirName of skillDirs) {\n const skillDir = path.join(localSkillsPath, dirName);\n const forkedFrom = await readForkedFromMetadata(skillDir);\n\n // Use the skill_id from forked_from if available, otherwise use directory name\n const skillId = forkedFrom?.skill_id ?? dirName;\n\n result.set(skillId, { dirName, forkedFrom });\n }\n\n return result;\n}\n\n/**\n * Compute source hash for a skill's SKILL.md file\n */\nasync function computeSourceHash(\n sourcePath: string,\n skillPath: string,\n): Promise<string | null> {\n const skillMdPath = path.join(sourcePath, \"src\", skillPath, \"SKILL.md\");\n\n if (!(await fileExists(skillMdPath))) {\n return null;\n }\n\n return hashFile(skillMdPath);\n}\n\n/**\n * Get the current date in ISO format (YYYY-MM-DD)\n */\nfunction getCurrentDate(): string {\n return new Date().toISOString().split(\"T\")[0];\n}\n\n/**\n * Compare local skills against source and determine status\n */\nasync function compareSkills(\n projectDir: string,\n sourcePath: string,\n sourceSkills: Record<string, { path: string }>,\n): Promise<SkillComparisonResult[]> {\n const results: SkillComparisonResult[] = [];\n const localSkills = await getLocalSkillsWithMetadata(projectDir);\n\n for (const [skillId, { dirName, forkedFrom }] of localSkills) {\n if (!forkedFrom) {\n // Local-only skill (no forked_from metadata)\n results.push({\n id: skillId,\n localHash: null,\n sourceHash: null,\n status: \"local-only\",\n dirName,\n });\n continue;\n }\n\n const localHash = forkedFrom.content_hash;\n const sourceSkill = sourceSkills[forkedFrom.skill_id];\n\n if (!sourceSkill) {\n // Skill was forked from a source that no longer exists\n results.push({\n id: forkedFrom.skill_id,\n localHash,\n sourceHash: null,\n status: \"local-only\",\n dirName,\n });\n continue;\n }\n\n const sourceHash = await computeSourceHash(sourcePath, sourceSkill.path);\n\n if (sourceHash === null) {\n results.push({\n id: forkedFrom.skill_id,\n localHash,\n sourceHash: null,\n status: \"local-only\",\n dirName,\n });\n continue;\n }\n\n const status = localHash === sourceHash ? \"current\" : \"outdated\";\n\n results.push({\n id: forkedFrom.skill_id,\n localHash,\n sourceHash,\n status,\n dirName,\n sourcePath: sourceSkill.path,\n });\n }\n\n // Sort results by skill ID\n results.sort((a, b) => a.id.localeCompare(b.id));\n\n return results;\n}\n\n/**\n * Update forked_from metadata in a skill's metadata.yaml\n */\nasync function updateForkedFromMetadata(\n skillDir: string,\n skillId: string,\n contentHash: string,\n): Promise<void> {\n const metadataPath = path.join(skillDir, \"metadata.yaml\");\n const rawContent = await readFile(metadataPath);\n\n const lines = rawContent.split(\"\\n\");\n let yamlContent = rawContent;\n\n if (lines[0]?.startsWith(\"# yaml-language-server:\")) {\n yamlContent = lines.slice(1).join(\"\\n\");\n }\n\n const metadata = parseYaml(yamlContent) as LocalSkillMetadata;\n\n metadata.forked_from = {\n skill_id: skillId,\n content_hash: contentHash,\n date: getCurrentDate(),\n };\n\n const newYamlContent = stringifyYaml(metadata, { lineWidth: 0 });\n await writeFile(metadataPath, newYamlContent);\n}\n\n/**\n * Update a single skill from source\n */\nasync function updateSkill(\n skill: SkillComparisonResult,\n projectDir: string,\n sourceResult: SourceLoadResult,\n): Promise<{ success: boolean; newHash: string | null; error?: string }> {\n if (!skill.sourcePath || !skill.sourceHash) {\n return { success: false, newHash: null, error: \"No source path available\" };\n }\n\n const localSkillsPath = path.join(projectDir, LOCAL_SKILLS_PATH);\n const destPath = path.join(localSkillsPath, skill.dirName);\n const srcPath = path.join(sourceResult.sourcePath, \"src\", skill.sourcePath);\n\n try {\n // Copy skill files from source to local\n await copy(srcPath, destPath);\n\n // Update forked_from metadata\n await updateForkedFromMetadata(destPath, skill.id, skill.sourceHash);\n\n return { success: true, newHash: skill.sourceHash };\n } catch (error) {\n return {\n success: false,\n newHash: null,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n}\n\n/**\n * Find a skill by partial name match\n */\nfunction findSkillByPartialMatch(\n skillName: string,\n results: SkillComparisonResult[],\n): SkillComparisonResult | null {\n // Exact match first\n const exact = results.find((r) => r.id === skillName);\n if (exact) return exact;\n\n // Partial match (skill name without author)\n const partial = results.find((r) => {\n const nameWithoutAuthor = r.id.replace(/\\s*\\(@\\w+\\)$/, \"\").toLowerCase();\n return nameWithoutAuthor === skillName.toLowerCase();\n });\n if (partial) return partial;\n\n // Directory name match\n const byDir = results.find(\n (r) => r.dirName.toLowerCase() === skillName.toLowerCase(),\n );\n if (byDir) return byDir;\n\n return null;\n}\n\n/**\n * Find similar skill names for suggestions\n */\nfunction findSimilarSkills(\n skillName: string,\n results: SkillComparisonResult[],\n): string[] {\n const lowered = skillName.toLowerCase();\n return results\n .filter((r) => {\n const name = r.id.toLowerCase();\n const dir = r.dirName.toLowerCase();\n return (\n name.includes(lowered) ||\n dir.includes(lowered) ||\n lowered.includes(name.split(\" \")[0])\n );\n })\n .map((r) => r.id)\n .slice(0, 3);\n}\n\n/**\n * Confirmation component for update operation\n */\ninterface UpdateConfirmProps {\n onConfirm: () => void;\n onCancel: () => void;\n}\n\nconst UpdateConfirm: React.FC<UpdateConfirmProps> = ({\n onConfirm,\n onCancel,\n}) => {\n return (\n <Confirm\n message=\"Proceed with update?\"\n onConfirm={onConfirm}\n onCancel={onCancel}\n defaultValue={false}\n />\n );\n};\n\nexport default class Update extends BaseCommand {\n static summary = \"Update local skills from source\";\n\n static description =\n \"Update local skills from the source repository. By default, checks all skills for updates. Specify a skill name to update only that skill.\";\n\n static args = {\n skill: Args.string({\n description: \"Specific skill to update (optional)\",\n required: false,\n }),\n };\n\n static flags = {\n ...BaseCommand.baseFlags,\n yes: Flags.boolean({\n char: \"y\",\n description: \"Skip confirmation prompt\",\n default: false,\n }),\n \"no-recompile\": Flags.boolean({\n description: \"Skip agent recompilation after update\",\n default: false,\n }),\n };\n\n static examples = [\n \"<%= config.bin %> <%= command.id %>\",\n \"<%= config.bin %> <%= command.id %> my-skill\",\n \"<%= config.bin %> <%= command.id %> --yes\",\n \"<%= config.bin %> <%= command.id %> --source /path/to/marketplace\",\n \"<%= config.bin %> <%= command.id %> --no-recompile\",\n ];\n\n async run(): Promise<void> {\n const { args, flags } = await this.parse(Update);\n const projectDir = process.cwd();\n const shouldRecompile = !flags[\"no-recompile\"];\n\n try {\n // Check if local skills directory exists\n const localSkillsPath = path.join(projectDir, LOCAL_SKILLS_PATH);\n if (!(await fileExists(localSkillsPath))) {\n this.warn(\"No local skills found. Run `cc init` or `cc edit` first.\");\n return;\n }\n\n this.log(\"Loading skills...\");\n\n const sourceResult = await loadSkillsMatrixFromSource({\n sourceFlag: flags.source,\n projectDir,\n });\n\n this.log(\n `Loaded from ${sourceResult.isLocal ? \"local\" : \"remote\"}: ${sourceResult.sourcePath}`,\n );\n\n // Build source skills map for lookup\n const sourceSkills: Record<string, { path: string }> = {};\n for (const [skillId, skill] of Object.entries(\n sourceResult.matrix.skills,\n )) {\n if (!skill.local) {\n sourceSkills[skillId] = { path: skill.path };\n }\n }\n\n // Compare local skills against source\n const allResults = await compareSkills(\n projectDir,\n sourceResult.sourcePath,\n sourceSkills,\n );\n\n // Filter to just outdated skills\n let outdatedSkills = allResults.filter((r) => r.status === \"outdated\");\n\n // Handle specific skill argument\n if (args.skill) {\n const foundSkill = findSkillByPartialMatch(args.skill, allResults);\n\n if (!foundSkill) {\n this.log(\"\");\n this.log(`Error: Skill \"${args.skill}\" not found.`);\n this.log(\"\");\n\n const similar = findSimilarSkills(args.skill, allResults);\n if (similar.length > 0) {\n this.log(\"Did you mean one of these?\");\n for (const name of similar) {\n this.log(` - ${name}`);\n }\n this.log(\"\");\n }\n\n this.log(\n `Run \\`cc search ${args.skill}\\` to search available skills.`,\n );\n this.log(\"\");\n this.error(\"Skill not found\", { exit: EXIT_CODES.ERROR });\n }\n\n if (foundSkill.status === \"current\") {\n this.log(\"\");\n this.log(`Skill \"${foundSkill.id}\" is already up to date.`);\n this.log(\"\");\n this.log(` Local hash: ${foundSkill.localHash}`);\n this.log(` Source hash: ${foundSkill.sourceHash}`);\n this.log(\"\");\n return;\n }\n\n if (foundSkill.status === \"local-only\") {\n this.log(\"\");\n this.log(\n `Skill \"${foundSkill.id}\" is a local-only skill (not forked from source).`,\n );\n this.log(\"Cannot update local-only skills.\");\n this.log(\"\");\n return;\n }\n\n // Only update this specific skill\n outdatedSkills = [foundSkill];\n }\n\n // Check if there are any outdated skills\n if (outdatedSkills.length === 0) {\n this.log(\"\");\n this.logSuccess(\"All skills are up to date.\");\n this.log(\"\");\n return;\n }\n\n // Show what will be updated\n this.log(\"\");\n this.log(\"The following skills will be updated:\");\n this.log(\"\");\n\n printTable({\n data: outdatedSkills.map((skill) => ({\n skill: skill.id,\n localHash: skill.localHash ?? \"-\",\n sourceHash: skill.sourceHash ?? \"-\",\n })),\n columns: [\n { key: \"skill\", name: \"Skill\" },\n { key: \"localHash\", name: \"Local Hash\" },\n { key: \"sourceHash\", name: \"Source Hash\" },\n ],\n headerOptions: { bold: true },\n });\n\n this.log(\"\");\n this.log(`${outdatedSkills.length} skill(s) will be updated.`);\n this.log(\"\");\n\n // Confirm unless --yes flag\n if (!flags.yes) {\n let confirmed = false;\n let cancelled = false;\n\n const { waitUntilExit } = render(\n <UpdateConfirm\n onConfirm={() => {\n confirmed = true;\n }}\n onCancel={() => {\n cancelled = true;\n }}\n />,\n );\n\n await waitUntilExit();\n\n if (cancelled) {\n this.log(\"Update cancelled\");\n this.exit(EXIT_CODES.CANCELLED);\n }\n\n if (!confirmed) {\n this.log(\"No changes made.\");\n return;\n }\n }\n\n this.log(\"\");\n\n // Update each skill\n const updated: string[] = [];\n const failed: string[] = [];\n\n for (const skill of outdatedSkills) {\n this.log(`Updating ${skill.id}...`);\n\n const result = await updateSkill(skill, projectDir, sourceResult);\n\n if (result.success) {\n this.log(` Updated ${skill.id}`);\n updated.push(skill.id);\n } else {\n this.log(` Failed to update ${skill.id}: ${result.error}`);\n failed.push(skill.id);\n }\n }\n\n // Recompile agents if needed\n let recompiledAgents: string[] = [];\n\n if (shouldRecompile && updated.length > 0) {\n this.log(\"\");\n this.log(\"Recompiling agents...\");\n\n try {\n const pluginDir = getCollectivePluginDir(projectDir);\n const recompileResult = await recompileAgents({\n pluginDir,\n sourcePath: sourceResult.sourcePath,\n projectDir,\n });\n\n recompiledAgents = recompileResult.compiled;\n\n if (recompiledAgents.length > 0) {\n this.log(\"Agents recompiled\");\n for (const agent of recompiledAgents) {\n this.log(` Recompiled: ${agent}`);\n }\n } else {\n this.log(\"No agents to recompile\");\n }\n\n if (recompileResult.warnings.length > 0) {\n for (const warning of recompileResult.warnings) {\n this.warn(warning);\n }\n }\n } catch (error) {\n this.warn(\"Agent recompilation failed\");\n this.warn(\n `Could not recompile agents: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n\n // Final summary\n this.log(\"\");\n if (failed.length === 0) {\n const agentMsg =\n recompiledAgents.length > 0\n ? `, ${recompiledAgents.length} agent(s) recompiled`\n : \"\";\n this.logSuccess(\n `Update complete! ${updated.length} skill(s) updated${agentMsg}.`,\n );\n } else {\n this.warn(\n `Update finished with errors: ${updated.length} updated, ${failed.length} failed.`,\n );\n }\n this.log(\"\");\n\n if (failed.length > 0) {\n this.error(\"Some updates failed\", { exit: EXIT_CODES.ERROR });\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n this.error(`Update failed: ${message}`, { exit: EXIT_CODES.ERROR });\n }\n }\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/cli/commands/update.tsx"],"sourcesContent":["import React, { useState } from \"react\";\nimport { render } from \"ink\";\nimport { Flags, Args } from \"@oclif/core\";\nimport { printTable } from \"@oclif/table\";\nimport path from \"path\";\nimport { parse as parseYaml, stringify as stringifyYaml } from \"yaml\";\nimport { BaseCommand } from \"../base-command.js\";\nimport {\n loadSkillsMatrixFromSource,\n type SourceLoadResult,\n} from \"../lib/source-loader.js\";\nimport { hashFile } from \"../lib/versioning.js\";\nimport { recompileAgents } from \"../lib/agent-recompiler.js\";\nimport { EXIT_CODES } from \"../lib/exit-codes.js\";\nimport {\n fileExists,\n readFile,\n writeFile,\n listDirectories,\n copy,\n} from \"../utils/fs.js\";\nimport { LOCAL_SKILLS_PATH } from \"../consts.js\";\nimport { getCollectivePluginDir } from \"../lib/plugin-finder.js\";\nimport { Confirm } from \"../components/common/confirm.js\";\n\n/**\n * ForkedFrom metadata stored in local skill's metadata.yaml\n */\ninterface ForkedFromMetadata {\n skill_id: string;\n content_hash: string;\n date: string;\n}\n\n/**\n * Local skill metadata structure\n */\ninterface LocalSkillMetadata {\n forked_from?: ForkedFromMetadata;\n [key: string]: unknown;\n}\n\n/**\n * Result of comparing a local skill to its source\n */\ninterface SkillComparisonResult {\n id: string;\n localHash: string | null;\n sourceHash: string | null;\n status: \"current\" | \"outdated\" | \"local-only\";\n dirName: string;\n sourcePath?: string;\n}\n\n/**\n * Read forked_from metadata from a local skill's metadata.yaml\n */\nasync function readForkedFromMetadata(\n skillDir: string,\n): Promise<ForkedFromMetadata | null> {\n const metadataPath = path.join(skillDir, \"metadata.yaml\");\n\n if (!(await fileExists(metadataPath))) {\n return null;\n }\n\n const content = await readFile(metadataPath);\n const metadata = parseYaml(content) as LocalSkillMetadata;\n\n return metadata.forked_from ?? null;\n}\n\n/**\n * Get local skills with their forked_from metadata\n */\nasync function getLocalSkillsWithMetadata(\n projectDir: string,\n): Promise<\n Map<string, { dirName: string; forkedFrom: ForkedFromMetadata | null }>\n> {\n const localSkillsPath = path.join(projectDir, LOCAL_SKILLS_PATH);\n const result = new Map<\n string,\n { dirName: string; forkedFrom: ForkedFromMetadata | null }\n >();\n\n if (!(await fileExists(localSkillsPath))) {\n return result;\n }\n\n const skillDirs = await listDirectories(localSkillsPath);\n\n for (const dirName of skillDirs) {\n const skillDir = path.join(localSkillsPath, dirName);\n const forkedFrom = await readForkedFromMetadata(skillDir);\n\n // Use the skill_id from forked_from if available, otherwise use directory name\n const skillId = forkedFrom?.skill_id ?? dirName;\n\n result.set(skillId, { dirName, forkedFrom });\n }\n\n return result;\n}\n\n/**\n * Compute source hash for a skill's SKILL.md file\n */\nasync function computeSourceHash(\n sourcePath: string,\n skillPath: string,\n): Promise<string | null> {\n const skillMdPath = path.join(sourcePath, \"src\", skillPath, \"SKILL.md\");\n\n if (!(await fileExists(skillMdPath))) {\n return null;\n }\n\n return hashFile(skillMdPath);\n}\n\n/**\n * Get the current date in ISO format (YYYY-MM-DD)\n */\nfunction getCurrentDate(): string {\n return new Date().toISOString().split(\"T\")[0];\n}\n\n/**\n * Compare local skills against source and determine status\n */\nasync function compareSkills(\n projectDir: string,\n sourcePath: string,\n sourceSkills: Record<string, { path: string }>,\n): Promise<SkillComparisonResult[]> {\n const results: SkillComparisonResult[] = [];\n const localSkills = await getLocalSkillsWithMetadata(projectDir);\n\n for (const [skillId, { dirName, forkedFrom }] of localSkills) {\n if (!forkedFrom) {\n // Local-only skill (no forked_from metadata)\n results.push({\n id: skillId,\n localHash: null,\n sourceHash: null,\n status: \"local-only\",\n dirName,\n });\n continue;\n }\n\n const localHash = forkedFrom.content_hash;\n const sourceSkill = sourceSkills[forkedFrom.skill_id];\n\n if (!sourceSkill) {\n // Skill was forked from a source that no longer exists\n results.push({\n id: forkedFrom.skill_id,\n localHash,\n sourceHash: null,\n status: \"local-only\",\n dirName,\n });\n continue;\n }\n\n const sourceHash = await computeSourceHash(sourcePath, sourceSkill.path);\n\n if (sourceHash === null) {\n results.push({\n id: forkedFrom.skill_id,\n localHash,\n sourceHash: null,\n status: \"local-only\",\n dirName,\n });\n continue;\n }\n\n const status = localHash === sourceHash ? \"current\" : \"outdated\";\n\n results.push({\n id: forkedFrom.skill_id,\n localHash,\n sourceHash,\n status,\n dirName,\n sourcePath: sourceSkill.path,\n });\n }\n\n // Sort results by skill ID\n results.sort((a, b) => a.id.localeCompare(b.id));\n\n return results;\n}\n\n/**\n * Update forked_from metadata in a skill's metadata.yaml\n */\nasync function updateForkedFromMetadata(\n skillDir: string,\n skillId: string,\n contentHash: string,\n): Promise<void> {\n const metadataPath = path.join(skillDir, \"metadata.yaml\");\n const rawContent = await readFile(metadataPath);\n\n const lines = rawContent.split(\"\\n\");\n let yamlContent = rawContent;\n\n if (lines[0]?.startsWith(\"# yaml-language-server:\")) {\n yamlContent = lines.slice(1).join(\"\\n\");\n }\n\n const metadata = parseYaml(yamlContent) as LocalSkillMetadata;\n\n metadata.forked_from = {\n skill_id: skillId,\n content_hash: contentHash,\n date: getCurrentDate(),\n };\n\n const newYamlContent = stringifyYaml(metadata, { lineWidth: 0 });\n await writeFile(metadataPath, newYamlContent);\n}\n\n/**\n * Update a single skill from source\n */\nasync function updateSkill(\n skill: SkillComparisonResult,\n projectDir: string,\n sourceResult: SourceLoadResult,\n): Promise<{ success: boolean; newHash: string | null; error?: string }> {\n if (!skill.sourcePath || !skill.sourceHash) {\n return { success: false, newHash: null, error: \"No source path available\" };\n }\n\n const localSkillsPath = path.join(projectDir, LOCAL_SKILLS_PATH);\n const destPath = path.join(localSkillsPath, skill.dirName);\n const srcPath = path.join(sourceResult.sourcePath, \"src\", skill.sourcePath);\n\n try {\n // Copy skill files from source to local\n await copy(srcPath, destPath);\n\n // Update forked_from metadata\n await updateForkedFromMetadata(destPath, skill.id, skill.sourceHash);\n\n return { success: true, newHash: skill.sourceHash };\n } catch (error) {\n return {\n success: false,\n newHash: null,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n}\n\n/**\n * Find a skill by partial name match\n */\nfunction findSkillByPartialMatch(\n skillName: string,\n results: SkillComparisonResult[],\n): SkillComparisonResult | null {\n // Exact match first\n const exact = results.find((r) => r.id === skillName);\n if (exact) return exact;\n\n // Partial match (skill name without author)\n const partial = results.find((r) => {\n const nameWithoutAuthor = r.id.replace(/\\s*\\(@\\w+\\)$/, \"\").toLowerCase();\n return nameWithoutAuthor === skillName.toLowerCase();\n });\n if (partial) return partial;\n\n // Directory name match\n const byDir = results.find(\n (r) => r.dirName.toLowerCase() === skillName.toLowerCase(),\n );\n if (byDir) return byDir;\n\n return null;\n}\n\n/**\n * Find similar skill names for suggestions\n */\nfunction findSimilarSkills(\n skillName: string,\n results: SkillComparisonResult[],\n): string[] {\n const lowered = skillName.toLowerCase();\n return results\n .filter((r) => {\n const name = r.id.toLowerCase();\n const dir = r.dirName.toLowerCase();\n return (\n name.includes(lowered) ||\n dir.includes(lowered) ||\n lowered.includes(name.split(\" \")[0])\n );\n })\n .map((r) => r.id)\n .slice(0, 3);\n}\n\n/**\n * Confirmation component for update operation\n */\ninterface UpdateConfirmProps {\n onConfirm: () => void;\n onCancel: () => void;\n}\n\nconst UpdateConfirm: React.FC<UpdateConfirmProps> = ({\n onConfirm,\n onCancel,\n}) => {\n return (\n <Confirm\n message=\"Proceed with update?\"\n onConfirm={onConfirm}\n onCancel={onCancel}\n defaultValue={false}\n />\n );\n};\n\nexport default class Update extends BaseCommand {\n static summary = \"Update local skills from source\";\n\n static description =\n \"Update local skills from the source repository. By default, checks all skills for updates. Specify a skill name to update only that skill.\";\n\n static args = {\n skill: Args.string({\n description: \"Specific skill to update (optional)\",\n required: false,\n }),\n };\n\n static flags = {\n ...BaseCommand.baseFlags,\n yes: Flags.boolean({\n char: \"y\",\n description: \"Skip confirmation prompt\",\n default: false,\n }),\n \"no-recompile\": Flags.boolean({\n description: \"Skip agent recompilation after update\",\n default: false,\n }),\n };\n\n static examples = [\n \"<%= config.bin %> <%= command.id %>\",\n \"<%= config.bin %> <%= command.id %> my-skill\",\n \"<%= config.bin %> <%= command.id %> --yes\",\n \"<%= config.bin %> <%= command.id %> --source /path/to/marketplace\",\n \"<%= config.bin %> <%= command.id %> --no-recompile\",\n ];\n\n async run(): Promise<void> {\n const { args, flags } = await this.parse(Update);\n const projectDir = process.cwd();\n const shouldRecompile = !flags[\"no-recompile\"];\n\n try {\n // Check if local skills directory exists\n const localSkillsPath = path.join(projectDir, LOCAL_SKILLS_PATH);\n if (!(await fileExists(localSkillsPath))) {\n this.warn(\"No local skills found. Run `cc init` or `cc edit` first.\");\n return;\n }\n\n this.log(\"Loading skills...\");\n\n const sourceResult = await loadSkillsMatrixFromSource({\n sourceFlag: flags.source,\n projectDir,\n });\n\n this.log(\n `Loaded from ${sourceResult.isLocal ? \"local\" : \"remote\"}: ${sourceResult.sourcePath}`,\n );\n\n // Build source skills map for lookup\n const sourceSkills: Record<string, { path: string }> = {};\n for (const [skillId, skill] of Object.entries(\n sourceResult.matrix.skills,\n )) {\n if (!skill.local) {\n sourceSkills[skillId] = { path: skill.path };\n }\n }\n\n // Compare local skills against source\n const allResults = await compareSkills(\n projectDir,\n sourceResult.sourcePath,\n sourceSkills,\n );\n\n // Filter to just outdated skills\n let outdatedSkills = allResults.filter((r) => r.status === \"outdated\");\n\n // Handle specific skill argument\n if (args.skill) {\n const foundSkill = findSkillByPartialMatch(args.skill, allResults);\n\n if (!foundSkill) {\n this.log(\"\");\n this.log(`Error: Skill \"${args.skill}\" not found.`);\n this.log(\"\");\n\n const similar = findSimilarSkills(args.skill, allResults);\n if (similar.length > 0) {\n this.log(\"Did you mean one of these?\");\n for (const name of similar) {\n this.log(` - ${name}`);\n }\n this.log(\"\");\n }\n\n this.log(\n `Run \\`cc search ${args.skill}\\` to search available skills.`,\n );\n this.log(\"\");\n this.error(\"Skill not found\", { exit: EXIT_CODES.ERROR });\n }\n\n if (foundSkill.status === \"current\") {\n this.log(\"\");\n this.log(`Skill \"${foundSkill.id}\" is already up to date.`);\n this.log(\"\");\n this.log(` Local hash: ${foundSkill.localHash}`);\n this.log(` Source hash: ${foundSkill.sourceHash}`);\n this.log(\"\");\n return;\n }\n\n if (foundSkill.status === \"local-only\") {\n this.log(\"\");\n this.log(\n `Skill \"${foundSkill.id}\" is a local-only skill (not forked from source).`,\n );\n this.log(\"Cannot update local-only skills.\");\n this.log(\"\");\n return;\n }\n\n // Only update this specific skill\n outdatedSkills = [foundSkill];\n }\n\n // Check if there are any outdated skills\n if (outdatedSkills.length === 0) {\n this.log(\"\");\n this.logSuccess(\"All skills are up to date.\");\n this.log(\"\");\n return;\n }\n\n // Show what will be updated\n this.log(\"\");\n this.log(\"The following skills will be updated:\");\n this.log(\"\");\n\n printTable({\n data: outdatedSkills.map((skill) => ({\n skill: skill.id,\n localHash: skill.localHash ?? \"-\",\n sourceHash: skill.sourceHash ?? \"-\",\n })),\n columns: [\n { key: \"skill\", name: \"Skill\" },\n { key: \"localHash\", name: \"Local Hash\" },\n { key: \"sourceHash\", name: \"Source Hash\" },\n ],\n headerOptions: { bold: true },\n });\n\n this.log(\"\");\n this.log(`${outdatedSkills.length} skill(s) will be updated.`);\n this.log(\"\");\n\n // Confirm unless --yes flag\n if (!flags.yes) {\n let confirmed = false;\n let cancelled = false;\n\n const { waitUntilExit } = render(\n <UpdateConfirm\n onConfirm={() => {\n confirmed = true;\n }}\n onCancel={() => {\n cancelled = true;\n }}\n />,\n );\n\n await waitUntilExit();\n\n if (cancelled) {\n this.log(\"Update cancelled\");\n this.exit(EXIT_CODES.CANCELLED);\n }\n\n if (!confirmed) {\n this.log(\"No changes made.\");\n return;\n }\n }\n\n this.log(\"\");\n\n // Update each skill\n const updated: string[] = [];\n const failed: string[] = [];\n\n for (const skill of outdatedSkills) {\n this.log(`Updating ${skill.id}...`);\n\n const result = await updateSkill(skill, projectDir, sourceResult);\n\n if (result.success) {\n this.log(` Updated ${skill.id}`);\n updated.push(skill.id);\n } else {\n this.log(` Failed to update ${skill.id}: ${result.error}`);\n failed.push(skill.id);\n }\n }\n\n // Recompile agents if needed\n let recompiledAgents: string[] = [];\n\n if (shouldRecompile && updated.length > 0) {\n this.log(\"\");\n this.log(\"Recompiling agents...\");\n\n try {\n const pluginDir = getCollectivePluginDir(projectDir);\n const recompileResult = await recompileAgents({\n pluginDir,\n sourcePath: sourceResult.sourcePath,\n projectDir,\n });\n\n recompiledAgents = recompileResult.compiled;\n\n if (recompiledAgents.length > 0) {\n this.log(\"Agents recompiled\");\n for (const agent of recompiledAgents) {\n this.log(` Recompiled: ${agent}`);\n }\n } else {\n this.log(\"No agents to recompile\");\n }\n\n if (recompileResult.warnings.length > 0) {\n for (const warning of recompileResult.warnings) {\n this.warn(warning);\n }\n }\n } catch (error) {\n this.warn(\"Agent recompilation failed\");\n this.warn(\n `Could not recompile agents: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n\n // Final summary\n this.log(\"\");\n if (failed.length === 0) {\n const agentMsg =\n recompiledAgents.length > 0\n ? `, ${recompiledAgents.length} agent(s) recompiled`\n : \"\";\n this.logSuccess(\n `Update complete! ${updated.length} skill(s) updated${agentMsg}.`,\n );\n } else {\n this.warn(\n `Update finished with errors: ${updated.length} updated, ${failed.length} failed.`,\n );\n }\n this.log(\"\");\n\n if (failed.length > 0) {\n this.error(\"Some updates failed\", { exit: EXIT_CODES.ERROR });\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n this.error(`Update failed: ${message}`, { exit: EXIT_CODES.ERROR });\n }\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -3,28 +3,28 @@ import {
|
|
|
3
3
|
printPluginValidationResult,
|
|
4
4
|
validateAllPlugins,
|
|
5
5
|
validatePlugin
|
|
6
|
-
} from "../chunk-
|
|
7
|
-
import {
|
|
8
|
-
PROJECT_ROOT
|
|
9
|
-
} from "../chunk-SJYG4EJZ.js";
|
|
6
|
+
} from "../chunk-NDY25DTL.js";
|
|
10
7
|
import {
|
|
11
8
|
BaseCommand,
|
|
12
9
|
EXIT_CODES
|
|
13
|
-
} from "../chunk-
|
|
10
|
+
} from "../chunk-EHS3TWWP.js";
|
|
14
11
|
import {
|
|
15
12
|
fileExists,
|
|
16
13
|
readFile
|
|
17
|
-
} from "../chunk-
|
|
14
|
+
} from "../chunk-TKFPKEV3.js";
|
|
15
|
+
import {
|
|
16
|
+
PROJECT_ROOT
|
|
17
|
+
} from "../chunk-76DWXGQE.js";
|
|
18
18
|
import {
|
|
19
19
|
init_esm_shims
|
|
20
20
|
} from "../chunk-DHET7RCE.js";
|
|
21
21
|
|
|
22
|
-
// src/cli
|
|
22
|
+
// src/cli/commands/validate.ts
|
|
23
23
|
init_esm_shims();
|
|
24
24
|
import { Args, Flags } from "@oclif/core";
|
|
25
25
|
import path2 from "path";
|
|
26
26
|
|
|
27
|
-
// src/cli
|
|
27
|
+
// src/cli/lib/schema-validator.ts
|
|
28
28
|
init_esm_shims();
|
|
29
29
|
import Ajv from "ajv";
|
|
30
30
|
import addFormats from "ajv-formats";
|
|
@@ -250,7 +250,7 @@ function printValidationResults(result) {
|
|
|
250
250
|
}
|
|
251
251
|
}
|
|
252
252
|
|
|
253
|
-
// src/cli
|
|
253
|
+
// src/cli/commands/validate.ts
|
|
254
254
|
var Validate = class _Validate extends BaseCommand {
|
|
255
255
|
static summary = "Validate YAML files against schemas or validate compiled plugins";
|
|
256
256
|
static description = "Validates skill/agent YAML files against JSON schemas, or validates compiled plugin structure and content. Without arguments, validates all YAML files in the current directory against their schemas. With a path argument or --plugins flag, validates plugin(s) instead.";
|