@agents-inc/cli 0.35.0 → 0.41.1
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 +103 -0
- package/config/skills-matrix.yaml +124 -132
- package/config/stacks.yaml +687 -687
- package/dist/{chunk-BLLXNFWP.js → chunk-2D6LKRHW.js} +2 -2
- package/dist/{chunk-KWF6D7ZP.js → chunk-342YB6TQ.js} +27 -19
- package/dist/chunk-342YB6TQ.js.map +1 -0
- package/dist/{chunk-OGXSTJP2.js → chunk-423MJ6DT.js} +66 -36
- package/dist/chunk-423MJ6DT.js.map +1 -0
- package/dist/{chunk-5LPPIT6H.js → chunk-4LT6RXMY.js} +4 -4
- package/dist/{chunk-LFHZBF6N.js → chunk-4SYXPG7L.js} +4 -3
- package/dist/chunk-4SYXPG7L.js.map +1 -0
- package/dist/{chunk-CXWPUVA7.js → chunk-4UTPJXUX.js} +9 -9
- package/dist/{chunk-CEWNZQMH.js → chunk-5TMB53BV.js} +9 -3
- package/dist/chunk-5TMB53BV.js.map +1 -0
- package/dist/chunk-7FBM7V3E.js +144 -0
- package/dist/chunk-7FBM7V3E.js.map +1 -0
- package/dist/chunk-ACVJVYMC.js +111 -0
- package/dist/chunk-ACVJVYMC.js.map +1 -0
- package/dist/{chunk-YN35L5NE.js → chunk-AH7XHAKN.js} +12 -12
- package/dist/chunk-AH7XHAKN.js.map +1 -0
- package/dist/{chunk-5YNZJ5TP.js → chunk-AVVYFEMF.js} +2 -2
- package/dist/{chunk-U36YCEBK.js → chunk-BFISETQG.js} +32 -23
- package/dist/chunk-BFISETQG.js.map +1 -0
- package/dist/{chunk-YCS7GF6Y.js → chunk-BK7TANUV.js} +6 -2
- package/dist/chunk-BK7TANUV.js.map +1 -0
- package/dist/{chunk-OGJ7DFCL.js → chunk-DV4ALU5I.js} +6 -6
- package/dist/{chunk-NJ775OJ4.js → chunk-FHBICUXB.js} +7 -7
- package/dist/chunk-FHBICUXB.js.map +1 -0
- package/dist/{chunk-OKILA27U.js → chunk-GEDWVX6Y.js} +87 -100
- package/dist/chunk-GEDWVX6Y.js.map +1 -0
- package/dist/{chunk-DC5AK3LW.js → chunk-GG4BSB6S.js} +5 -11
- package/dist/chunk-GG4BSB6S.js.map +1 -0
- package/dist/{chunk-BPD4VUAU.js → chunk-H6H3COI5.js} +5 -5
- package/dist/{chunk-AQQVSNUX.js → chunk-K77I4XGL.js} +20 -6
- package/dist/chunk-K77I4XGL.js.map +1 -0
- package/dist/chunk-KC2SIUIA.js +46 -0
- package/dist/chunk-KC2SIUIA.js.map +1 -0
- package/dist/{chunk-HTTPKSL6.js → chunk-KXM7KOPE.js} +2 -2
- package/dist/{chunk-GGHH3KR2.js → chunk-LJRP4SWY.js} +6 -5
- package/dist/chunk-LJRP4SWY.js.map +1 -0
- package/dist/{chunk-PKUIO2Z7.js → chunk-MNPPGIZQ.js} +8 -8
- package/dist/chunk-MNPPGIZQ.js.map +1 -0
- package/dist/{chunk-IG7CUREJ.js → chunk-NYP5SB2V.js} +2 -2
- package/dist/{chunk-JXMRTHDT.js → chunk-NZYKDVRL.js} +2 -2
- package/dist/{chunk-XNQJBQ5X.js → chunk-PURJZ72D.js} +2 -2
- package/dist/{chunk-VEZ2GZEK.js → chunk-R52N7DBG.js} +2 -2
- package/dist/chunk-SILUTTV7.js +113 -0
- package/dist/chunk-SILUTTV7.js.map +1 -0
- package/dist/{chunk-YIKBNGE3.js → chunk-TJAZ7QCF.js} +7 -7
- package/dist/chunk-TJAZ7QCF.js.map +1 -0
- package/dist/{chunk-WMVGRAFB.js → chunk-TTXV55NQ.js} +235 -117
- package/dist/chunk-TTXV55NQ.js.map +1 -0
- package/dist/{chunk-ZE355C6C.js → chunk-UKTYDNWJ.js} +9 -4
- package/dist/chunk-UKTYDNWJ.js.map +1 -0
- package/dist/{chunk-YPJKOM42.js → chunk-WS6OQIEN.js} +2 -2
- package/dist/{chunk-OI4WBRC7.js → chunk-XJXJZ2MJ.js} +113 -150
- package/dist/chunk-XJXJZ2MJ.js.map +1 -0
- package/dist/chunk-YLJYAQSG.js +210 -0
- package/dist/chunk-YLJYAQSG.js.map +1 -0
- package/dist/{chunk-MZB3GGOH.js → chunk-YRVTXSXP.js} +1 -2
- package/dist/chunk-YRVTXSXP.js.map +1 -0
- package/dist/{chunk-XYCN2GCV.js → chunk-ZLHGJSRK.js} +3 -3
- package/dist/cli/defaults/agent-mappings.yaml +16 -72
- package/dist/commands/build/marketplace.js +3 -3
- package/dist/commands/build/plugins.js +5 -5
- package/dist/commands/build/stack.js +5 -5
- package/dist/commands/compile.js +14 -18
- package/dist/commands/compile.js.map +1 -1
- package/dist/commands/config/get.js +8 -8
- package/dist/commands/config/get.js.map +1 -1
- package/dist/commands/config/index.js +5 -5
- package/dist/commands/config/path.js +4 -4
- package/dist/commands/config/set-project.js +7 -7
- package/dist/commands/config/set-project.js.map +1 -1
- package/dist/commands/config/show.js +5 -5
- package/dist/commands/config/unset-project.js +5 -5
- package/dist/commands/config/unset-project.js.map +1 -1
- package/dist/commands/diff.js +12 -9
- package/dist/commands/diff.js.map +1 -1
- package/dist/commands/doctor.js +8 -7
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/edit.js +35 -29
- package/dist/commands/edit.js.map +1 -1
- package/dist/commands/eject.js +6 -6
- package/dist/commands/eject.js.map +1 -1
- package/dist/commands/import/skill.js +16 -16
- package/dist/commands/import/skill.js.map +1 -1
- package/dist/commands/info.js +7 -6
- package/dist/commands/info.js.map +1 -1
- package/dist/commands/init.js +42 -31
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/list.js +6 -5
- package/dist/commands/list.js.map +1 -1
- package/dist/commands/new/agent.js +5 -5
- package/dist/commands/new/skill.js +12 -9
- package/dist/commands/new/skill.js.map +1 -1
- package/dist/commands/outdated.js +8 -5
- package/dist/commands/outdated.js.map +1 -1
- package/dist/commands/search.js +7 -7
- package/dist/commands/uninstall.js +122 -103
- package/dist/commands/uninstall.js.map +1 -1
- package/dist/commands/update.js +8 -7
- package/dist/commands/update.js.map +1 -1
- package/dist/commands/validate.js +5 -5
- package/dist/commands/version/bump.js +4 -4
- package/dist/commands/version/index.js +4 -4
- package/dist/commands/version/set.js +4 -4
- package/dist/commands/version/show.js +4 -4
- package/dist/components/skill-search/skill-search.js +3 -3
- package/dist/components/wizard/category-grid.js +3 -3
- package/dist/components/wizard/category-grid.test.js +79 -58
- package/dist/components/wizard/category-grid.test.js.map +1 -1
- package/dist/components/wizard/checkbox-grid.js +10 -0
- package/dist/components/wizard/checkbox-grid.test.js +270 -0
- package/dist/components/wizard/checkbox-grid.test.js.map +1 -0
- package/dist/components/wizard/domain-selection.js +7 -5
- package/dist/components/wizard/help-modal.js +2 -2
- package/dist/components/wizard/menu-item.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/section-progress.js +2 -2
- package/dist/components/wizard/section-progress.test.js +2 -2
- package/dist/components/wizard/source-grid.js +4 -4
- package/dist/components/wizard/source-grid.test.js +4 -4
- package/dist/components/wizard/stack-selection.js +9 -8
- package/dist/components/wizard/step-agents.js +16 -0
- package/dist/components/wizard/step-agents.js.map +1 -0
- package/dist/components/wizard/step-agents.test.js +190 -0
- package/dist/components/wizard/step-agents.test.js.map +1 -0
- package/dist/components/wizard/step-build.js +10 -9
- package/dist/components/wizard/step-build.test.js +56 -53
- package/dist/components/wizard/step-build.test.js.map +1 -1
- package/dist/components/wizard/step-confirm.js +3 -3
- package/dist/components/wizard/step-confirm.test.js +19 -12
- package/dist/components/wizard/step-confirm.test.js.map +1 -1
- package/dist/components/wizard/step-refine.js +2 -2
- package/dist/components/wizard/step-refine.test.js +2 -2
- package/dist/components/wizard/step-settings.js +5 -5
- package/dist/components/wizard/step-settings.test.js +8 -8
- package/dist/components/wizard/step-sources.js +11 -10
- package/dist/components/wizard/step-sources.test.js +16 -15
- package/dist/components/wizard/step-sources.test.js.map +1 -1
- package/dist/components/wizard/step-stack.js +12 -10
- package/dist/components/wizard/step-stack.test.js +19 -19
- package/dist/components/wizard/step-stack.test.js.map +1 -1
- package/dist/components/wizard/view-title.js +2 -2
- package/dist/components/wizard/wizard-layout.js +8 -7
- package/dist/components/wizard/wizard-tabs.js +2 -2
- package/dist/components/wizard/wizard-tabs.test.js +6 -4
- package/dist/components/wizard/wizard-tabs.test.js.map +1 -1
- package/dist/components/wizard/wizard.js +27 -24
- package/dist/config/skills-matrix.yaml +124 -132
- package/dist/config/stacks.yaml +687 -687
- package/dist/hooks/init.js +3 -3
- package/dist/{source-manager-PTK4P6BF.js → source-manager-PPABS6BC.js} +4 -4
- package/dist/source-manager-PPABS6BC.js.map +1 -0
- package/dist/stores/wizard-store.js +5 -4
- package/dist/stores/wizard-store.test.js +336 -136
- package/dist/stores/wizard-store.test.js.map +1 -1
- package/package.json +1 -1
- package/src/schemas/agent.schema.json +3 -3
- package/src/schemas/metadata.schema.json +55 -15
- package/src/schemas/project-config.schema.json +42 -2
- package/src/schemas/project-source-config.schema.json +5 -5
- package/src/schemas/skills-matrix.schema.json +103 -104
- package/src/schemas/stack.schema.json +1 -1
- package/src/schemas/stacks.schema.json +41 -1
- package/dist/chunk-AQQVSNUX.js.map +0 -1
- package/dist/chunk-CEWNZQMH.js.map +0 -1
- package/dist/chunk-DC5AK3LW.js.map +0 -1
- package/dist/chunk-GGHH3KR2.js.map +0 -1
- package/dist/chunk-KWF6D7ZP.js.map +0 -1
- package/dist/chunk-LFHZBF6N.js.map +0 -1
- package/dist/chunk-MZB3GGOH.js.map +0 -1
- package/dist/chunk-NJ775OJ4.js.map +0 -1
- package/dist/chunk-NVQEHRJY.js +0 -120
- package/dist/chunk-NVQEHRJY.js.map +0 -1
- package/dist/chunk-OGXSTJP2.js.map +0 -1
- package/dist/chunk-OI4WBRC7.js.map +0 -1
- package/dist/chunk-OKILA27U.js.map +0 -1
- package/dist/chunk-PKUIO2Z7.js.map +0 -1
- package/dist/chunk-U36YCEBK.js.map +0 -1
- package/dist/chunk-UFUQUFV6.js +0 -256
- package/dist/chunk-UFUQUFV6.js.map +0 -1
- package/dist/chunk-WMVGRAFB.js.map +0 -1
- package/dist/chunk-YCS7GF6Y.js.map +0 -1
- package/dist/chunk-YIKBNGE3.js.map +0 -1
- package/dist/chunk-YN35L5NE.js.map +0 -1
- package/dist/chunk-ZE355C6C.js.map +0 -1
- /package/dist/{chunk-BLLXNFWP.js.map → chunk-2D6LKRHW.js.map} +0 -0
- /package/dist/{chunk-5LPPIT6H.js.map → chunk-4LT6RXMY.js.map} +0 -0
- /package/dist/{chunk-CXWPUVA7.js.map → chunk-4UTPJXUX.js.map} +0 -0
- /package/dist/{chunk-5YNZJ5TP.js.map → chunk-AVVYFEMF.js.map} +0 -0
- /package/dist/{chunk-OGJ7DFCL.js.map → chunk-DV4ALU5I.js.map} +0 -0
- /package/dist/{chunk-BPD4VUAU.js.map → chunk-H6H3COI5.js.map} +0 -0
- /package/dist/{chunk-HTTPKSL6.js.map → chunk-KXM7KOPE.js.map} +0 -0
- /package/dist/{chunk-IG7CUREJ.js.map → chunk-NYP5SB2V.js.map} +0 -0
- /package/dist/{chunk-JXMRTHDT.js.map → chunk-NZYKDVRL.js.map} +0 -0
- /package/dist/{chunk-XNQJBQ5X.js.map → chunk-PURJZ72D.js.map} +0 -0
- /package/dist/{chunk-VEZ2GZEK.js.map → chunk-R52N7DBG.js.map} +0 -0
- /package/dist/{chunk-YPJKOM42.js.map → chunk-WS6OQIEN.js.map} +0 -0
- /package/dist/{chunk-XYCN2GCV.js.map → chunk-ZLHGJSRK.js.map} +0 -0
- /package/dist/{source-manager-PTK4P6BF.js.map → components/wizard/checkbox-grid.js.map} +0 -0
|
@@ -5,36 +5,35 @@ import {
|
|
|
5
5
|
import {
|
|
6
6
|
claudePluginUninstall,
|
|
7
7
|
isClaudeCLIAvailable
|
|
8
|
-
} from "../chunk-
|
|
8
|
+
} from "../chunk-PURJZ72D.js";
|
|
9
9
|
import {
|
|
10
10
|
DRY_RUN_MESSAGES,
|
|
11
|
-
ERROR_MESSAGES,
|
|
12
11
|
INFO_MESSAGES,
|
|
13
12
|
SUCCESS_MESSAGES
|
|
14
|
-
} from "../chunk-
|
|
13
|
+
} from "../chunk-LJRP4SWY.js";
|
|
15
14
|
import {
|
|
16
15
|
BaseCommand,
|
|
17
16
|
EXIT_CODES
|
|
18
|
-
} from "../chunk-
|
|
17
|
+
} from "../chunk-2D6LKRHW.js";
|
|
19
18
|
import {
|
|
20
19
|
getProjectPluginsDir,
|
|
21
20
|
listPluginNames,
|
|
22
|
-
|
|
23
|
-
|
|
21
|
+
loadProjectSourceConfig,
|
|
22
|
+
readForkedFromMetadata
|
|
23
|
+
} from "../chunk-TTXV55NQ.js";
|
|
24
24
|
import "../chunk-T4EXUIBY.js";
|
|
25
25
|
import {
|
|
26
26
|
directoryExists,
|
|
27
|
-
|
|
27
|
+
getErrorMessage,
|
|
28
28
|
listDirectories,
|
|
29
29
|
remove
|
|
30
|
-
} from "../chunk-
|
|
30
|
+
} from "../chunk-XJXJZ2MJ.js";
|
|
31
31
|
import {
|
|
32
32
|
CLAUDE_DIR,
|
|
33
33
|
CLAUDE_SRC_DIR,
|
|
34
34
|
CLI_COLORS,
|
|
35
|
-
DEFAULT_BRANDING
|
|
36
|
-
|
|
37
|
-
} from "../chunk-YCS7GF6Y.js";
|
|
35
|
+
DEFAULT_BRANDING
|
|
36
|
+
} from "../chunk-BK7TANUV.js";
|
|
38
37
|
import {
|
|
39
38
|
init_esm_shims
|
|
40
39
|
} from "../chunk-DHET7RCE.js";
|
|
@@ -45,69 +44,89 @@ import { Flags } from "@oclif/core";
|
|
|
45
44
|
import { render, Box, Text, useApp } from "ink";
|
|
46
45
|
import path from "path";
|
|
47
46
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
47
|
+
function collectConfiguredSources(config) {
|
|
48
|
+
if (!config) return [];
|
|
49
|
+
const sources = [];
|
|
50
|
+
if (config.source) {
|
|
51
|
+
sources.push(config.source);
|
|
52
|
+
}
|
|
53
|
+
if (config.sources) {
|
|
54
|
+
for (const entry of config.sources) {
|
|
55
|
+
sources.push(entry.url);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return sources;
|
|
59
|
+
}
|
|
48
60
|
async function detectUninstallTarget(projectDir) {
|
|
49
61
|
const pluginsDir = getProjectPluginsDir(projectDir);
|
|
50
62
|
const skillsDir = path.join(projectDir, CLAUDE_DIR, "skills");
|
|
51
63
|
const agentsDir = path.join(projectDir, CLAUDE_DIR, "agents");
|
|
52
|
-
const configPath = path.join(projectDir, CLAUDE_DIR, STANDARD_FILES.CONFIG_YAML);
|
|
53
64
|
const claudeDir = path.join(projectDir, CLAUDE_DIR);
|
|
54
65
|
const claudeSrcDir = path.join(projectDir, CLAUDE_SRC_DIR);
|
|
55
|
-
const [hasLocalSkills, hasLocalAgents,
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
66
|
+
const [hasLocalSkills, hasLocalAgents, hasClaudeDir, hasClaudeSrcDir, config] = await Promise.all(
|
|
67
|
+
[
|
|
68
|
+
directoryExists(skillsDir),
|
|
69
|
+
directoryExists(agentsDir),
|
|
70
|
+
directoryExists(claudeDir),
|
|
71
|
+
directoryExists(claudeSrcDir),
|
|
72
|
+
loadProjectSourceConfig(projectDir)
|
|
73
|
+
]
|
|
74
|
+
);
|
|
62
75
|
let pluginNames = [];
|
|
63
76
|
try {
|
|
64
77
|
pluginNames = await listPluginNames(projectDir);
|
|
65
78
|
} catch {
|
|
66
79
|
}
|
|
80
|
+
const configuredSources = collectConfiguredSources(config);
|
|
67
81
|
return {
|
|
68
82
|
hasPlugins: pluginNames.length > 0,
|
|
69
83
|
pluginNames,
|
|
70
84
|
hasLocalSkills,
|
|
71
85
|
hasLocalAgents,
|
|
72
|
-
hasLocalConfig,
|
|
73
86
|
hasClaudeDir,
|
|
74
87
|
hasClaudeSrcDir,
|
|
75
88
|
pluginsDir,
|
|
76
89
|
skillsDir,
|
|
77
90
|
agentsDir,
|
|
78
|
-
configPath,
|
|
79
91
|
claudeDir,
|
|
80
|
-
claudeSrcDir
|
|
92
|
+
claudeSrcDir,
|
|
93
|
+
config,
|
|
94
|
+
configuredSources
|
|
81
95
|
};
|
|
82
96
|
}
|
|
83
97
|
var UninstallConfirm = ({
|
|
84
98
|
target,
|
|
85
|
-
|
|
86
|
-
uninstallLocal,
|
|
99
|
+
removeAll,
|
|
87
100
|
onConfirm,
|
|
88
101
|
onCancel
|
|
89
102
|
}) => {
|
|
90
103
|
const { exit } = useApp();
|
|
91
|
-
const hasPluginToRemove = uninstallPlugin && target.hasPlugins;
|
|
92
|
-
const hasLocalToRemove = uninstallLocal && (target.hasClaudeDir || target.hasClaudeSrcDir);
|
|
93
104
|
return /* @__PURE__ */ jsxs(Box, { flexDirection: "column", children: [
|
|
94
105
|
/* @__PURE__ */ jsx(Text, { bold: true, children: "The following will be removed:" }),
|
|
95
106
|
/* @__PURE__ */ jsx(Text, { children: " " }),
|
|
96
|
-
|
|
107
|
+
target.hasPlugins && /* @__PURE__ */ jsxs(Box, { flexDirection: "column", children: [
|
|
97
108
|
/* @__PURE__ */ jsx(Text, { color: CLI_COLORS.ERROR, children: " Plugins:" }),
|
|
98
109
|
/* @__PURE__ */ jsxs(Text, { dimColor: true, children: [
|
|
99
110
|
" ",
|
|
100
111
|
target.pluginsDir
|
|
101
112
|
] })
|
|
102
113
|
] }),
|
|
103
|
-
|
|
104
|
-
/* @__PURE__ */ jsx(Text, { color: CLI_COLORS.ERROR, children: "
|
|
105
|
-
target.
|
|
114
|
+
(target.hasLocalSkills || target.hasLocalAgents) && /* @__PURE__ */ jsxs(Box, { flexDirection: "column", children: [
|
|
115
|
+
/* @__PURE__ */ jsx(Text, { color: CLI_COLORS.ERROR, children: " CLI-managed files:" }),
|
|
116
|
+
target.hasLocalSkills && /* @__PURE__ */ jsxs(Text, { dimColor: true, children: [
|
|
106
117
|
" ",
|
|
107
|
-
target.
|
|
108
|
-
"/"
|
|
118
|
+
target.skillsDir,
|
|
119
|
+
"/ (matching sources)"
|
|
109
120
|
] }),
|
|
110
|
-
target.
|
|
121
|
+
target.hasLocalAgents && /* @__PURE__ */ jsxs(Text, { dimColor: true, children: [
|
|
122
|
+
" ",
|
|
123
|
+
target.agentsDir,
|
|
124
|
+
"/ (CLI-compiled)"
|
|
125
|
+
] })
|
|
126
|
+
] }),
|
|
127
|
+
removeAll && target.hasClaudeSrcDir && /* @__PURE__ */ jsxs(Box, { flexDirection: "column", children: [
|
|
128
|
+
/* @__PURE__ */ jsx(Text, { color: CLI_COLORS.ERROR, children: " Config:" }),
|
|
129
|
+
/* @__PURE__ */ jsxs(Text, { dimColor: true, children: [
|
|
111
130
|
" ",
|
|
112
131
|
target.claudeSrcDir,
|
|
113
132
|
"/"
|
|
@@ -132,7 +151,6 @@ var UninstallConfirm = ({
|
|
|
132
151
|
] });
|
|
133
152
|
};
|
|
134
153
|
async function isDirectoryEmpty(dirPath) {
|
|
135
|
-
const entries = await listDirectories(dirPath);
|
|
136
154
|
const { readdir } = await import("fs/promises");
|
|
137
155
|
try {
|
|
138
156
|
const allEntries = await readdir(dirPath);
|
|
@@ -141,14 +159,17 @@ async function isDirectoryEmpty(dirPath) {
|
|
|
141
159
|
return true;
|
|
142
160
|
}
|
|
143
161
|
}
|
|
162
|
+
function skillMatchesConfiguredSource(forkedFromSource, configuredSources) {
|
|
163
|
+
if (!forkedFromSource || configuredSources.length === 0) return false;
|
|
164
|
+
return configuredSources.includes(forkedFromSource);
|
|
165
|
+
}
|
|
144
166
|
var Uninstall = class _Uninstall extends BaseCommand {
|
|
145
167
|
static summary = `Remove ${DEFAULT_BRANDING.NAME} from this project`;
|
|
146
|
-
static description = `Uninstall
|
|
168
|
+
static description = `Uninstall ${DEFAULT_BRANDING.NAME} from this project. Removes CLI-managed skills (matched by source), compiled agents, and plugins. User-created content is preserved.`;
|
|
147
169
|
static examples = [
|
|
148
170
|
"<%= config.bin %> <%= command.id %>",
|
|
149
171
|
"<%= config.bin %> <%= command.id %> --yes",
|
|
150
|
-
"<%= config.bin %> <%= command.id %> --
|
|
151
|
-
"<%= config.bin %> <%= command.id %> --local",
|
|
172
|
+
"<%= config.bin %> <%= command.id %> --all",
|
|
152
173
|
"<%= config.bin %> <%= command.id %> --dry-run"
|
|
153
174
|
];
|
|
154
175
|
static flags = {
|
|
@@ -158,12 +179,8 @@ var Uninstall = class _Uninstall extends BaseCommand {
|
|
|
158
179
|
description: "Skip confirmation prompt",
|
|
159
180
|
default: false
|
|
160
181
|
}),
|
|
161
|
-
|
|
162
|
-
description: "
|
|
163
|
-
default: false
|
|
164
|
-
}),
|
|
165
|
-
local: Flags.boolean({
|
|
166
|
-
description: "Only remove local files (not the plugin)",
|
|
182
|
+
all: Flags.boolean({
|
|
183
|
+
description: "Also remove .claude-src/ config directory",
|
|
167
184
|
default: false
|
|
168
185
|
})
|
|
169
186
|
};
|
|
@@ -178,22 +195,11 @@ var Uninstall = class _Uninstall extends BaseCommand {
|
|
|
178
195
|
this.log("");
|
|
179
196
|
}
|
|
180
197
|
const target = await detectUninstallTarget(projectDir);
|
|
181
|
-
const
|
|
182
|
-
|
|
183
|
-
const hasPluginToRemove = uninstallPlugin && target.hasPlugins;
|
|
184
|
-
const hasLocalToRemove = uninstallLocal && (target.hasClaudeDir || target.hasClaudeSrcDir);
|
|
185
|
-
if (!hasPluginToRemove && !hasLocalToRemove) {
|
|
198
|
+
const hasAnythingToRemove = target.hasPlugins || target.hasLocalSkills || target.hasLocalAgents || flags.all && target.hasClaudeSrcDir;
|
|
199
|
+
if (!hasAnythingToRemove) {
|
|
186
200
|
this.warn("Nothing to uninstall.");
|
|
187
201
|
this.log("");
|
|
188
|
-
|
|
189
|
-
this.log(INFO_MESSAGES.NO_PLUGIN_INSTALLATION);
|
|
190
|
-
}
|
|
191
|
-
if (flags.local && !target.hasClaudeDir && !target.hasClaudeSrcDir) {
|
|
192
|
-
this.log(INFO_MESSAGES.NO_LOCAL_INSTALLATION);
|
|
193
|
-
}
|
|
194
|
-
if (!flags.plugin && !flags.local) {
|
|
195
|
-
this.log(INFO_MESSAGES.NOT_INSTALLED);
|
|
196
|
-
}
|
|
202
|
+
this.log(INFO_MESSAGES.NOT_INSTALLED);
|
|
197
203
|
this.log("");
|
|
198
204
|
this.log(INFO_MESSAGES.NO_CHANGES_MADE);
|
|
199
205
|
return;
|
|
@@ -205,8 +211,7 @@ var Uninstall = class _Uninstall extends BaseCommand {
|
|
|
205
211
|
UninstallConfirm,
|
|
206
212
|
{
|
|
207
213
|
target,
|
|
208
|
-
|
|
209
|
-
uninstallLocal,
|
|
214
|
+
removeAll: flags.all,
|
|
210
215
|
onConfirm: () => resolve(true),
|
|
211
216
|
onCancel: () => resolve(false)
|
|
212
217
|
}
|
|
@@ -222,37 +227,39 @@ var Uninstall = class _Uninstall extends BaseCommand {
|
|
|
222
227
|
} else {
|
|
223
228
|
this.log("The following will be removed:");
|
|
224
229
|
this.log("");
|
|
225
|
-
if (
|
|
230
|
+
if (target.hasPlugins) {
|
|
226
231
|
this.log(" Plugins:");
|
|
227
232
|
this.log(` ${target.pluginsDir}`);
|
|
228
233
|
}
|
|
229
|
-
if (
|
|
230
|
-
this.log("
|
|
231
|
-
if (target.
|
|
232
|
-
this.log(` ${target.
|
|
234
|
+
if (target.hasLocalSkills || target.hasLocalAgents) {
|
|
235
|
+
this.log(" CLI-managed files:");
|
|
236
|
+
if (target.hasLocalSkills) {
|
|
237
|
+
this.log(` ${target.skillsDir}/ (matching sources)`);
|
|
233
238
|
}
|
|
234
|
-
if (target.
|
|
235
|
-
this.log(` ${target.
|
|
239
|
+
if (target.hasLocalAgents) {
|
|
240
|
+
this.log(` ${target.agentsDir}/ (CLI-compiled)`);
|
|
236
241
|
}
|
|
237
242
|
}
|
|
243
|
+
if (flags.all && target.hasClaudeSrcDir) {
|
|
244
|
+
this.log(" Config:");
|
|
245
|
+
this.log(` ${target.claudeSrcDir}/`);
|
|
246
|
+
}
|
|
238
247
|
this.log("");
|
|
239
248
|
}
|
|
240
249
|
if (flags["dry-run"]) {
|
|
241
|
-
if (
|
|
250
|
+
if (target.hasPlugins) {
|
|
242
251
|
this.log(`[dry-run] Would uninstall ${target.pluginNames.length} plugins:`);
|
|
243
252
|
for (const pluginName of target.pluginNames) {
|
|
244
253
|
this.log(`[dry-run] ${pluginName}`);
|
|
245
254
|
}
|
|
246
255
|
}
|
|
247
|
-
|
|
248
|
-
await this.dryRunLocalRemoval(target);
|
|
249
|
-
}
|
|
256
|
+
await this.dryRunLocalRemoval(target, flags.all);
|
|
250
257
|
this.log("");
|
|
251
258
|
this.log(DRY_RUN_MESSAGES.COMPLETE_NO_FILES_REMOVED);
|
|
252
259
|
this.log("");
|
|
253
260
|
return;
|
|
254
261
|
}
|
|
255
|
-
if (
|
|
262
|
+
if (target.hasPlugins) {
|
|
256
263
|
this.log("Uninstalling plugins...");
|
|
257
264
|
try {
|
|
258
265
|
const cliAvailable = await isClaudeCLIAvailable();
|
|
@@ -265,25 +272,25 @@ var Uninstall = class _Uninstall extends BaseCommand {
|
|
|
265
272
|
}
|
|
266
273
|
const pluginPath = path.join(target.pluginsDir, pluginName);
|
|
267
274
|
await remove(pluginPath);
|
|
275
|
+
this.log(` Uninstalled plugin '${pluginName}'`);
|
|
268
276
|
}
|
|
269
|
-
this.logSuccess(
|
|
277
|
+
this.logSuccess(
|
|
278
|
+
`Uninstalled ${target.pluginNames.length} ${target.pluginNames.length === 1 ? "plugin" : "plugins"}`
|
|
279
|
+
);
|
|
270
280
|
} catch (error) {
|
|
271
281
|
this.log("Plugin uninstall failed");
|
|
272
|
-
this.error(error
|
|
282
|
+
this.error(getErrorMessage(error), {
|
|
273
283
|
exit: EXIT_CODES.ERROR
|
|
274
284
|
});
|
|
275
285
|
}
|
|
276
286
|
}
|
|
277
|
-
|
|
278
|
-
this.
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
exit: EXIT_CODES.ERROR
|
|
285
|
-
});
|
|
286
|
-
}
|
|
287
|
+
try {
|
|
288
|
+
await this.removeLocalFiles(target, flags.all);
|
|
289
|
+
} catch (error) {
|
|
290
|
+
this.log("Failed to remove local files");
|
|
291
|
+
this.error(getErrorMessage(error), {
|
|
292
|
+
exit: EXIT_CODES.ERROR
|
|
293
|
+
});
|
|
287
294
|
}
|
|
288
295
|
this.log("");
|
|
289
296
|
this.log(`${DEFAULT_BRANDING.NAME} has been uninstalled.`);
|
|
@@ -292,24 +299,29 @@ var Uninstall = class _Uninstall extends BaseCommand {
|
|
|
292
299
|
this.log("");
|
|
293
300
|
}
|
|
294
301
|
/**
|
|
295
|
-
* Selectively removes local files installed by the CLI.
|
|
302
|
+
* Selectively removes local files installed by the CLI using config-based matching.
|
|
296
303
|
*
|
|
297
|
-
* - Skills:
|
|
298
|
-
* - Agents: removes
|
|
299
|
-
*
|
|
300
|
-
* -
|
|
304
|
+
* - Skills: removes skill dirs whose forked_from.source matches a configured source
|
|
305
|
+
* - Agents: removes agents whose frontmatter name matches a configured agent, or
|
|
306
|
+
* all agents if config.yaml exists (CLI was used to compile them)
|
|
307
|
+
* - Plugins: removed separately (always)
|
|
308
|
+
* - .claude-src/: only removed with --all flag
|
|
309
|
+
* - .claude/: only removed if empty after selective cleanup
|
|
301
310
|
*/
|
|
302
|
-
async removeLocalFiles(target) {
|
|
311
|
+
async removeLocalFiles(target, removeAll) {
|
|
303
312
|
let removedSkillCount = 0;
|
|
304
313
|
let skippedSkillCount = 0;
|
|
305
314
|
if (target.hasLocalSkills) {
|
|
306
315
|
const skillDirNames = await listDirectories(target.skillsDir);
|
|
307
316
|
for (const skillDirName of skillDirNames) {
|
|
308
317
|
const skillDir = path.join(target.skillsDir, skillDirName);
|
|
309
|
-
const
|
|
310
|
-
|
|
318
|
+
const forkedFrom = await readForkedFromMetadata(skillDir);
|
|
319
|
+
const shouldRemove = forkedFrom !== null && (skillMatchesConfiguredSource(forkedFrom.source, target.configuredSources) || // Legacy skills without source field are treated as CLI-managed when config exists
|
|
320
|
+
!forkedFrom.source && target.config !== null);
|
|
321
|
+
if (shouldRemove) {
|
|
311
322
|
await remove(skillDir);
|
|
312
323
|
removedSkillCount++;
|
|
324
|
+
this.log(` Uninstalled skill '${skillDirName}'`);
|
|
313
325
|
} else {
|
|
314
326
|
this.warn(`Skipping '${skillDirName}': not created by ${DEFAULT_BRANDING.NAME} CLI`);
|
|
315
327
|
skippedSkillCount++;
|
|
@@ -327,10 +339,20 @@ var Uninstall = class _Uninstall extends BaseCommand {
|
|
|
327
339
|
}
|
|
328
340
|
}
|
|
329
341
|
if (target.hasLocalAgents) {
|
|
330
|
-
|
|
331
|
-
|
|
342
|
+
if (target.config !== null) {
|
|
343
|
+
const { readdir } = await import("fs/promises");
|
|
344
|
+
try {
|
|
345
|
+
const agentFiles = (await readdir(target.agentsDir)).filter((f) => f.endsWith(".md"));
|
|
346
|
+
for (const agentFile of agentFiles) {
|
|
347
|
+
this.log(` Uninstalled agent '${agentFile.replace(/\.md$/, "")}'`);
|
|
348
|
+
}
|
|
349
|
+
} catch {
|
|
350
|
+
}
|
|
351
|
+
await remove(target.agentsDir);
|
|
352
|
+
this.logSuccess("Removed compiled agents");
|
|
353
|
+
}
|
|
332
354
|
}
|
|
333
|
-
if (target.hasClaudeSrcDir) {
|
|
355
|
+
if (removeAll && target.hasClaudeSrcDir) {
|
|
334
356
|
await remove(target.claudeSrcDir);
|
|
335
357
|
this.logSuccess(`Removed ${CLAUDE_SRC_DIR}/`);
|
|
336
358
|
}
|
|
@@ -343,17 +365,14 @@ var Uninstall = class _Uninstall extends BaseCommand {
|
|
|
343
365
|
}
|
|
344
366
|
}
|
|
345
367
|
}
|
|
346
|
-
|
|
347
|
-
* Dry-run preview of local file removal.
|
|
348
|
-
* Shows what would be removed/skipped without making changes.
|
|
349
|
-
*/
|
|
350
|
-
async dryRunLocalRemoval(target) {
|
|
368
|
+
async dryRunLocalRemoval(target, removeAll) {
|
|
351
369
|
if (target.hasLocalSkills) {
|
|
352
370
|
const skillDirNames = await listDirectories(target.skillsDir);
|
|
353
371
|
for (const skillDirName of skillDirNames) {
|
|
354
372
|
const skillDir = path.join(target.skillsDir, skillDirName);
|
|
355
|
-
const
|
|
356
|
-
|
|
373
|
+
const forkedFrom = await readForkedFromMetadata(skillDir);
|
|
374
|
+
const shouldRemove = forkedFrom !== null && (skillMatchesConfiguredSource(forkedFrom.source, target.configuredSources) || !forkedFrom.source && target.config !== null);
|
|
375
|
+
if (shouldRemove) {
|
|
357
376
|
this.log(`[dry-run] Would remove skill '${skillDirName}'`);
|
|
358
377
|
} else {
|
|
359
378
|
this.log(
|
|
@@ -362,10 +381,10 @@ var Uninstall = class _Uninstall extends BaseCommand {
|
|
|
362
381
|
}
|
|
363
382
|
}
|
|
364
383
|
}
|
|
365
|
-
if (target.hasLocalAgents) {
|
|
384
|
+
if (target.hasLocalAgents && target.config !== null) {
|
|
366
385
|
this.log(`[dry-run] Would remove ${target.agentsDir}/`);
|
|
367
386
|
}
|
|
368
|
-
if (target.hasClaudeSrcDir) {
|
|
387
|
+
if (removeAll && target.hasClaudeSrcDir) {
|
|
369
388
|
this.log(`[dry-run] Would remove ${target.claudeSrcDir}/`);
|
|
370
389
|
}
|
|
371
390
|
if (target.hasClaudeDir) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/cli/commands/uninstall.tsx"],"sourcesContent":["import React from \"react\";\n\nimport { Flags } from \"@oclif/core\";\nimport { render, Box, Text, useApp } from \"ink\";\nimport path from \"path\";\n\nimport { BaseCommand } from \"../base-command\";\nimport { Confirm } from \"../components/common/confirm\";\nimport { directoryExists, fileExists, listDirectories, remove } from \"../utils/fs\";\nimport { claudePluginUninstall, isClaudeCLIAvailable } from \"../utils/exec\";\nimport { listPluginNames, getProjectPluginsDir } from \"../lib/plugins\";\nimport { readLocalSkillMetadata } from \"../lib/skills\";\nimport {\n CLAUDE_DIR,\n CLAUDE_SRC_DIR,\n CLI_COLORS,\n DEFAULT_BRANDING,\n STANDARD_FILES,\n} from \"../consts\";\nimport { EXIT_CODES } from \"../lib/exit-codes\";\nimport {\n ERROR_MESSAGES,\n SUCCESS_MESSAGES,\n INFO_MESSAGES,\n DRY_RUN_MESSAGES,\n} from \"../utils/messages\";\n\ntype UninstallTarget = {\n hasPlugins: boolean;\n pluginNames: string[];\n hasLocalSkills: boolean;\n hasLocalAgents: boolean;\n hasLocalConfig: boolean;\n hasClaudeDir: boolean;\n hasClaudeSrcDir: boolean;\n pluginsDir: string;\n skillsDir: string;\n agentsDir: string;\n configPath: string;\n claudeDir: string;\n claudeSrcDir: string;\n};\n\nasync function detectUninstallTarget(projectDir: string): Promise<UninstallTarget> {\n const pluginsDir = getProjectPluginsDir(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, STANDARD_FILES.CONFIG_YAML);\n const claudeDir = path.join(projectDir, CLAUDE_DIR);\n const claudeSrcDir = path.join(projectDir, CLAUDE_SRC_DIR);\n\n const [hasLocalSkills, hasLocalAgents, hasLocalConfig, hasClaudeDir, hasClaudeSrcDir] =\n await Promise.all([\n directoryExists(skillsDir),\n directoryExists(agentsDir),\n fileExists(configPath),\n directoryExists(claudeDir),\n directoryExists(claudeSrcDir),\n ]);\n\n let pluginNames: string[] = [];\n try {\n pluginNames = await listPluginNames(projectDir);\n } catch {\n // Best-effort: plugin detection may fail\n }\n\n return {\n hasPlugins: pluginNames.length > 0,\n pluginNames,\n hasLocalSkills,\n hasLocalAgents,\n hasLocalConfig,\n hasClaudeDir,\n hasClaudeSrcDir,\n pluginsDir,\n skillsDir,\n agentsDir,\n configPath,\n claudeDir,\n claudeSrcDir,\n };\n}\n\ntype 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.hasPlugins;\n const hasLocalToRemove = 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={CLI_COLORS.ERROR}> Plugins:</Text>\n <Text dimColor> {target.pluginsDir}</Text>\n </Box>\n )}\n\n {hasLocalToRemove && (\n <Box flexDirection=\"column\">\n <Text color={CLI_COLORS.ERROR}> Local directories:</Text>\n {target.hasClaudeDir && <Text dimColor> {target.claudeDir}/</Text>}\n {target.hasClaudeSrcDir && <Text dimColor> {target.claudeSrcDir}/</Text>}\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\n/**\n * Checks whether a directory is empty (contains no entries).\n * Returns true if the directory has no subdirectories or files.\n */\nasync function isDirectoryEmpty(dirPath: string): Promise<boolean> {\n const entries = await listDirectories(dirPath);\n // listDirectories only returns directories; also check for files\n const { readdir } = await import(\"fs/promises\");\n try {\n const allEntries = await readdir(dirPath);\n return allEntries.length === 0;\n } catch {\n return true;\n }\n}\n\nexport default class Uninstall extends BaseCommand {\n static summary = `Remove ${DEFAULT_BRANDING.NAME} from this project`;\n\n static description = `Uninstall the ${DEFAULT_BRANDING.NAME} plugin and/or local directories (.claude/ and .claude-src/). By default, removes everything. Only removes skills that were installed by the CLI (marked with generatedByAgentsInc in metadata.yaml).`;\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(`${DEFAULT_BRANDING.NAME} Uninstall`);\n this.log(\"\");\n\n if (flags[\"dry-run\"]) {\n this.log(DRY_RUN_MESSAGES.PREVIEW_NO_FILES_REMOVED);\n this.log(\"\");\n }\n\n const target = await detectUninstallTarget(projectDir);\n\n const uninstallPlugin = !flags.local;\n const uninstallLocal = !flags.plugin;\n\n const hasPluginToRemove = uninstallPlugin && target.hasPlugins;\n const hasLocalToRemove = 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.hasPlugins) {\n this.log(INFO_MESSAGES.NO_PLUGIN_INSTALLATION);\n }\n if (flags.local && !target.hasClaudeDir && !target.hasClaudeSrcDir) {\n this.log(INFO_MESSAGES.NO_LOCAL_INSTALLATION);\n }\n if (!flags.plugin && !flags.local) {\n this.log(INFO_MESSAGES.NOT_INSTALLED);\n }\n\n this.log(\"\");\n this.log(INFO_MESSAGES.NO_CHANGES_MADE);\n return;\n }\n\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 this.log(\"The following will be removed:\");\n this.log(\"\");\n\n if (hasPluginToRemove) {\n this.log(\" Plugins:\");\n this.log(` ${target.pluginsDir}`);\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 if (flags[\"dry-run\"]) {\n if (hasPluginToRemove) {\n this.log(`[dry-run] Would uninstall ${target.pluginNames.length} plugins:`);\n for (const pluginName of target.pluginNames) {\n this.log(`[dry-run] ${pluginName}`);\n }\n }\n if (hasLocalToRemove) {\n await this.dryRunLocalRemoval(target);\n }\n this.log(\"\");\n this.log(DRY_RUN_MESSAGES.COMPLETE_NO_FILES_REMOVED);\n this.log(\"\");\n return;\n }\n\n if (hasPluginToRemove) {\n this.log(\"Uninstalling plugins...\");\n\n try {\n const cliAvailable = await isClaudeCLIAvailable();\n\n for (const pluginName of target.pluginNames) {\n if (cliAvailable) {\n try {\n await claudePluginUninstall(pluginName, \"project\", projectDir);\n } catch {\n // Best-effort: plugin may not be registered with Claude CLI\n }\n }\n\n const pluginPath = path.join(target.pluginsDir, pluginName);\n await remove(pluginPath);\n }\n\n this.logSuccess(\"Plugins uninstalled\");\n } catch (error) {\n this.log(\"Plugin uninstall failed\");\n this.error(error instanceof Error ? error.message : ERROR_MESSAGES.UNKNOWN_ERROR, {\n exit: EXIT_CODES.ERROR,\n });\n }\n }\n\n if (hasLocalToRemove) {\n this.log(\"Removing local files...\");\n\n try {\n await this.removeLocalFiles(target);\n } catch (error) {\n this.log(\"Failed to remove local files\");\n this.error(error instanceof Error ? error.message : ERROR_MESSAGES.UNKNOWN_ERROR, {\n exit: EXIT_CODES.ERROR,\n });\n }\n }\n\n this.log(\"\");\n this.log(`${DEFAULT_BRANDING.NAME} has been uninstalled.`);\n\n this.log(\"\");\n this.logSuccess(SUCCESS_MESSAGES.UNINSTALL_COMPLETE);\n this.log(\"\");\n }\n\n /**\n * Selectively removes local files installed by the CLI.\n *\n * - Skills: only removes skill dirs with `generatedByAgentsInc: true` in metadata.yaml\n * - Agents: removes the entire `.claude/agents/` directory (compiled by CLI)\n * - Config: removes `.claude-src/` entirely (CLI-owned config)\n * - `.claude/`: only removed if empty after selective cleanup\n */\n private async removeLocalFiles(target: UninstallTarget): Promise<void> {\n let removedSkillCount = 0;\n let skippedSkillCount = 0;\n\n // Selectively remove skills based on generatedByAgentsInc flag\n if (target.hasLocalSkills) {\n const skillDirNames = await listDirectories(target.skillsDir);\n\n for (const skillDirName of skillDirNames) {\n const skillDir = path.join(target.skillsDir, skillDirName);\n const metadata = await readLocalSkillMetadata(skillDir);\n\n if (metadata?.generatedByAgentsInc) {\n await remove(skillDir);\n removedSkillCount++;\n } else {\n this.warn(`Skipping '${skillDirName}': not created by ${DEFAULT_BRANDING.NAME} CLI`);\n skippedSkillCount++;\n }\n }\n\n if (removedSkillCount > 0) {\n this.logSuccess(\n `Removed ${removedSkillCount} CLI-installed ${removedSkillCount === 1 ? \"skill\" : \"skills\"}`,\n );\n }\n\n // Remove skills/ directory if now empty\n if (skippedSkillCount === 0 && (await directoryExists(target.skillsDir))) {\n if (await isDirectoryEmpty(target.skillsDir)) {\n await remove(target.skillsDir);\n }\n }\n }\n\n // Remove compiled agents directory entirely (generated by CLI)\n if (target.hasLocalAgents) {\n await remove(target.agentsDir);\n this.logSuccess(\"Removed compiled agents\");\n }\n\n // Remove .claude-src/ entirely (CLI-owned config)\n if (target.hasClaudeSrcDir) {\n await remove(target.claudeSrcDir);\n this.logSuccess(`Removed ${CLAUDE_SRC_DIR}/`);\n }\n\n // Only remove .claude/ itself if it is empty after cleanup\n if (target.hasClaudeDir && (await directoryExists(target.claudeDir))) {\n if (await isDirectoryEmpty(target.claudeDir)) {\n await remove(target.claudeDir);\n this.logSuccess(`Removed ${CLAUDE_DIR}/`);\n } else {\n this.log(`Kept ${CLAUDE_DIR}/ (contains user content)`);\n }\n }\n }\n\n /**\n * Dry-run preview of local file removal.\n * Shows what would be removed/skipped without making changes.\n */\n private async dryRunLocalRemoval(target: UninstallTarget): Promise<void> {\n // Preview skill removal\n if (target.hasLocalSkills) {\n const skillDirNames = await listDirectories(target.skillsDir);\n\n for (const skillDirName of skillDirNames) {\n const skillDir = path.join(target.skillsDir, skillDirName);\n const metadata = await readLocalSkillMetadata(skillDir);\n\n if (metadata?.generatedByAgentsInc) {\n this.log(`[dry-run] Would remove skill '${skillDirName}'`);\n } else {\n this.log(\n `[dry-run] Would skip '${skillDirName}': not created by ${DEFAULT_BRANDING.NAME} CLI`,\n );\n }\n }\n }\n\n // Preview agents removal\n if (target.hasLocalAgents) {\n this.log(`[dry-run] Would remove ${target.agentsDir}/`);\n }\n\n // Preview .claude-src/ removal\n if (target.hasClaudeSrcDir) {\n this.log(`[dry-run] Would remove ${target.claudeSrcDir}/`);\n }\n\n // Preview .claude/ removal\n if (target.hasClaudeDir) {\n this.log(`[dry-run] Would remove ${target.claudeDir}/ only if empty after cleanup`);\n }\n }\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/cli/commands/uninstall.tsx"],"sourcesContent":["import React from \"react\";\n\nimport { Flags } from \"@oclif/core\";\nimport { render, Box, Text, useApp } from \"ink\";\nimport path from \"path\";\n\nimport { BaseCommand } from \"../base-command\";\nimport { Confirm } from \"../components/common/confirm\";\nimport { getErrorMessage } from \"../utils/errors\";\nimport { directoryExists, listDirectories, remove } from \"../utils/fs\";\nimport { claudePluginUninstall, isClaudeCLIAvailable } from \"../utils/exec\";\nimport { listPluginNames, getProjectPluginsDir } from \"../lib/plugins\";\nimport { readForkedFromMetadata } from \"../lib/skills\";\nimport { loadProjectSourceConfig } from \"../lib/configuration/config\";\nimport type { ProjectSourceConfig } from \"../lib/configuration/config\";\nimport { CLAUDE_DIR, CLAUDE_SRC_DIR, CLI_COLORS, DEFAULT_BRANDING } from \"../consts\";\nimport { EXIT_CODES } from \"../lib/exit-codes\";\nimport { SUCCESS_MESSAGES, INFO_MESSAGES, DRY_RUN_MESSAGES } from \"../utils/messages\";\n\ntype UninstallTarget = {\n hasPlugins: boolean;\n pluginNames: string[];\n hasLocalSkills: boolean;\n hasLocalAgents: boolean;\n hasClaudeDir: boolean;\n hasClaudeSrcDir: boolean;\n pluginsDir: string;\n skillsDir: string;\n agentsDir: string;\n claudeDir: string;\n claudeSrcDir: string;\n /** Resolved project source config from .claude-src/config.yaml */\n config: ProjectSourceConfig | null;\n /** All configured source URLs (primary + extras) */\n configuredSources: string[];\n};\n\nfunction collectConfiguredSources(config: ProjectSourceConfig | null): string[] {\n if (!config) return [];\n\n const sources: string[] = [];\n\n if (config.source) {\n sources.push(config.source);\n }\n\n if (config.sources) {\n for (const entry of config.sources) {\n sources.push(entry.url);\n }\n }\n\n return sources;\n}\n\nasync function detectUninstallTarget(projectDir: string): Promise<UninstallTarget> {\n const pluginsDir = getProjectPluginsDir(projectDir);\n const skillsDir = path.join(projectDir, CLAUDE_DIR, \"skills\");\n const agentsDir = path.join(projectDir, CLAUDE_DIR, \"agents\");\n const claudeDir = path.join(projectDir, CLAUDE_DIR);\n const claudeSrcDir = path.join(projectDir, CLAUDE_SRC_DIR);\n\n const [hasLocalSkills, hasLocalAgents, hasClaudeDir, hasClaudeSrcDir, config] = await Promise.all(\n [\n directoryExists(skillsDir),\n directoryExists(agentsDir),\n directoryExists(claudeDir),\n directoryExists(claudeSrcDir),\n loadProjectSourceConfig(projectDir),\n ],\n );\n\n let pluginNames: string[] = [];\n try {\n pluginNames = await listPluginNames(projectDir);\n } catch {\n // Best-effort: plugin detection may fail\n }\n\n const configuredSources = collectConfiguredSources(config);\n\n return {\n hasPlugins: pluginNames.length > 0,\n pluginNames,\n hasLocalSkills,\n hasLocalAgents,\n hasClaudeDir,\n hasClaudeSrcDir,\n pluginsDir,\n skillsDir,\n agentsDir,\n claudeDir,\n claudeSrcDir,\n config,\n configuredSources,\n };\n}\n\ntype UninstallConfirmProps = {\n target: UninstallTarget;\n removeAll: boolean;\n onConfirm: () => void;\n onCancel: () => void;\n};\n\nconst UninstallConfirm: React.FC<UninstallConfirmProps> = ({\n target,\n removeAll,\n onConfirm,\n onCancel,\n}) => {\n const { exit } = useApp();\n\n return (\n <Box flexDirection=\"column\">\n <Text bold>The following will be removed:</Text>\n <Text> </Text>\n\n {target.hasPlugins && (\n <Box flexDirection=\"column\">\n <Text color={CLI_COLORS.ERROR}> Plugins:</Text>\n <Text dimColor> {target.pluginsDir}</Text>\n </Box>\n )}\n\n {(target.hasLocalSkills || target.hasLocalAgents) && (\n <Box flexDirection=\"column\">\n <Text color={CLI_COLORS.ERROR}> CLI-managed files:</Text>\n {target.hasLocalSkills && <Text dimColor> {target.skillsDir}/ (matching sources)</Text>}\n {target.hasLocalAgents && <Text dimColor> {target.agentsDir}/ (CLI-compiled)</Text>}\n </Box>\n )}\n\n {removeAll && target.hasClaudeSrcDir && (\n <Box flexDirection=\"column\">\n <Text color={CLI_COLORS.ERROR}> Config:</Text>\n <Text dimColor> {target.claudeSrcDir}/</Text>\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\nasync function isDirectoryEmpty(dirPath: string): Promise<boolean> {\n const { readdir } = await import(\"fs/promises\");\n try {\n const allEntries = await readdir(dirPath);\n return allEntries.length === 0;\n } catch {\n return true;\n }\n}\n\nfunction skillMatchesConfiguredSource(\n forkedFromSource: string | undefined,\n configuredSources: string[],\n): boolean {\n if (!forkedFromSource || configuredSources.length === 0) return false;\n return configuredSources.includes(forkedFromSource);\n}\n\nexport default class Uninstall extends BaseCommand {\n static summary = `Remove ${DEFAULT_BRANDING.NAME} from this project`;\n\n static description = `Uninstall ${DEFAULT_BRANDING.NAME} from this project. Removes CLI-managed skills (matched by source), compiled agents, and plugins. User-created content is preserved.`;\n\n static examples = [\n \"<%= config.bin %> <%= command.id %>\",\n \"<%= config.bin %> <%= command.id %> --yes\",\n \"<%= config.bin %> <%= command.id %> --all\",\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 all: Flags.boolean({\n description: \"Also remove .claude-src/ config directory\",\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(`${DEFAULT_BRANDING.NAME} Uninstall`);\n this.log(\"\");\n\n if (flags[\"dry-run\"]) {\n this.log(DRY_RUN_MESSAGES.PREVIEW_NO_FILES_REMOVED);\n this.log(\"\");\n }\n\n const target = await detectUninstallTarget(projectDir);\n\n const hasAnythingToRemove =\n target.hasPlugins ||\n target.hasLocalSkills ||\n target.hasLocalAgents ||\n (flags.all && target.hasClaudeSrcDir);\n\n if (!hasAnythingToRemove) {\n this.warn(\"Nothing to uninstall.\");\n this.log(\"\");\n this.log(INFO_MESSAGES.NOT_INSTALLED);\n this.log(\"\");\n this.log(INFO_MESSAGES.NO_CHANGES_MADE);\n return;\n }\n\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 removeAll={flags.all}\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 this.log(\"The following will be removed:\");\n this.log(\"\");\n\n if (target.hasPlugins) {\n this.log(\" Plugins:\");\n this.log(` ${target.pluginsDir}`);\n }\n\n if (target.hasLocalSkills || target.hasLocalAgents) {\n this.log(\" CLI-managed files:\");\n if (target.hasLocalSkills) {\n this.log(` ${target.skillsDir}/ (matching sources)`);\n }\n if (target.hasLocalAgents) {\n this.log(` ${target.agentsDir}/ (CLI-compiled)`);\n }\n }\n\n if (flags.all && target.hasClaudeSrcDir) {\n this.log(\" Config:\");\n this.log(` ${target.claudeSrcDir}/`);\n }\n\n this.log(\"\");\n }\n\n if (flags[\"dry-run\"]) {\n if (target.hasPlugins) {\n this.log(`[dry-run] Would uninstall ${target.pluginNames.length} plugins:`);\n for (const pluginName of target.pluginNames) {\n this.log(`[dry-run] ${pluginName}`);\n }\n }\n\n await this.dryRunLocalRemoval(target, flags.all);\n\n this.log(\"\");\n this.log(DRY_RUN_MESSAGES.COMPLETE_NO_FILES_REMOVED);\n this.log(\"\");\n return;\n }\n\n if (target.hasPlugins) {\n this.log(\"Uninstalling plugins...\");\n\n try {\n const cliAvailable = await isClaudeCLIAvailable();\n\n for (const pluginName of target.pluginNames) {\n if (cliAvailable) {\n try {\n await claudePluginUninstall(pluginName, \"project\", projectDir);\n } catch {\n // Best-effort: plugin may not be registered with Claude CLI\n }\n }\n\n const pluginPath = path.join(target.pluginsDir, pluginName);\n await remove(pluginPath);\n this.log(` Uninstalled plugin '${pluginName}'`);\n }\n\n this.logSuccess(\n `Uninstalled ${target.pluginNames.length} ${target.pluginNames.length === 1 ? \"plugin\" : \"plugins\"}`,\n );\n } catch (error) {\n this.log(\"Plugin uninstall failed\");\n this.error(getErrorMessage(error), {\n exit: EXIT_CODES.ERROR,\n });\n }\n }\n\n try {\n await this.removeLocalFiles(target, flags.all);\n } catch (error) {\n this.log(\"Failed to remove local files\");\n this.error(getErrorMessage(error), {\n exit: EXIT_CODES.ERROR,\n });\n }\n\n this.log(\"\");\n this.log(`${DEFAULT_BRANDING.NAME} has been uninstalled.`);\n this.log(\"\");\n this.logSuccess(SUCCESS_MESSAGES.UNINSTALL_COMPLETE);\n this.log(\"\");\n }\n\n /**\n * Selectively removes local files installed by the CLI using config-based matching.\n *\n * - Skills: removes skill dirs whose forked_from.source matches a configured source\n * - Agents: removes agents whose frontmatter name matches a configured agent, or\n * all agents if config.yaml exists (CLI was used to compile them)\n * - Plugins: removed separately (always)\n * - .claude-src/: only removed with --all flag\n * - .claude/: only removed if empty after selective cleanup\n */\n private async removeLocalFiles(target: UninstallTarget, removeAll: boolean): Promise<void> {\n let removedSkillCount = 0;\n let skippedSkillCount = 0;\n\n if (target.hasLocalSkills) {\n const skillDirNames = await listDirectories(target.skillsDir);\n\n for (const skillDirName of skillDirNames) {\n const skillDir = path.join(target.skillsDir, skillDirName);\n const forkedFrom = await readForkedFromMetadata(skillDir);\n\n const shouldRemove =\n forkedFrom !== null &&\n (skillMatchesConfiguredSource(forkedFrom.source, target.configuredSources) ||\n // Legacy skills without source field are treated as CLI-managed when config exists\n (!forkedFrom.source && target.config !== null));\n\n if (shouldRemove) {\n await remove(skillDir);\n removedSkillCount++;\n this.log(` Uninstalled skill '${skillDirName}'`);\n } else {\n this.warn(`Skipping '${skillDirName}': not created by ${DEFAULT_BRANDING.NAME} CLI`);\n skippedSkillCount++;\n }\n }\n\n if (removedSkillCount > 0) {\n this.logSuccess(\n `Removed ${removedSkillCount} CLI-installed ${removedSkillCount === 1 ? \"skill\" : \"skills\"}`,\n );\n }\n\n if (skippedSkillCount === 0 && (await directoryExists(target.skillsDir))) {\n if (await isDirectoryEmpty(target.skillsDir)) {\n await remove(target.skillsDir);\n }\n }\n }\n\n if (target.hasLocalAgents) {\n // config.yaml presence indicates the CLI compiled these agents\n if (target.config !== null) {\n const { readdir } = await import(\"fs/promises\");\n try {\n const agentFiles = (await readdir(target.agentsDir)).filter((f) => f.endsWith(\".md\"));\n for (const agentFile of agentFiles) {\n this.log(` Uninstalled agent '${agentFile.replace(/\\.md$/, \"\")}'`);\n }\n } catch {\n // Best-effort: directory listing may fail\n }\n await remove(target.agentsDir);\n this.logSuccess(\"Removed compiled agents\");\n }\n }\n\n if (removeAll && target.hasClaudeSrcDir) {\n await remove(target.claudeSrcDir);\n this.logSuccess(`Removed ${CLAUDE_SRC_DIR}/`);\n }\n\n if (target.hasClaudeDir && (await directoryExists(target.claudeDir))) {\n if (await isDirectoryEmpty(target.claudeDir)) {\n await remove(target.claudeDir);\n this.logSuccess(`Removed ${CLAUDE_DIR}/`);\n } else {\n this.log(`Kept ${CLAUDE_DIR}/ (contains user content)`);\n }\n }\n }\n\n private async dryRunLocalRemoval(target: UninstallTarget, removeAll: boolean): Promise<void> {\n if (target.hasLocalSkills) {\n const skillDirNames = await listDirectories(target.skillsDir);\n\n for (const skillDirName of skillDirNames) {\n const skillDir = path.join(target.skillsDir, skillDirName);\n const forkedFrom = await readForkedFromMetadata(skillDir);\n\n const shouldRemove =\n forkedFrom !== null &&\n (skillMatchesConfiguredSource(forkedFrom.source, target.configuredSources) ||\n (!forkedFrom.source && target.config !== null));\n\n if (shouldRemove) {\n this.log(`[dry-run] Would remove skill '${skillDirName}'`);\n } else {\n this.log(\n `[dry-run] Would skip '${skillDirName}': not created by ${DEFAULT_BRANDING.NAME} CLI`,\n );\n }\n }\n }\n\n if (target.hasLocalAgents && target.config !== null) {\n this.log(`[dry-run] Would remove ${target.agentsDir}/`);\n }\n\n if (removeAll && target.hasClaudeSrcDir) {\n this.log(`[dry-run] Would remove ${target.claudeSrcDir}/`);\n }\n\n if (target.hasClaudeDir) {\n this.log(`[dry-run] Would remove ${target.claudeDir}/ only if empty after cleanup`);\n }\n }\n}\n"],"mappings":"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","names":[]}
|
package/dist/commands/update.js
CHANGED
|
@@ -4,31 +4,32 @@ import {
|
|
|
4
4
|
} from "../chunk-N6S7ZRIL.js";
|
|
5
5
|
import {
|
|
6
6
|
recompileAgents
|
|
7
|
-
} from "../chunk-
|
|
7
|
+
} from "../chunk-TJAZ7QCF.js";
|
|
8
8
|
import {
|
|
9
9
|
ERROR_MESSAGES,
|
|
10
10
|
INFO_MESSAGES,
|
|
11
11
|
STATUS_MESSAGES,
|
|
12
12
|
SUCCESS_MESSAGES
|
|
13
|
-
} from "../chunk-
|
|
13
|
+
} from "../chunk-LJRP4SWY.js";
|
|
14
14
|
import {
|
|
15
15
|
BaseCommand,
|
|
16
16
|
EXIT_CODES
|
|
17
|
-
} from "../chunk-
|
|
17
|
+
} from "../chunk-2D6LKRHW.js";
|
|
18
18
|
import {
|
|
19
19
|
compareLocalSkillsWithSource,
|
|
20
20
|
injectForkedFromMetadata,
|
|
21
21
|
loadSkillsMatrixFromSource
|
|
22
|
-
} from "../chunk-
|
|
22
|
+
} from "../chunk-TTXV55NQ.js";
|
|
23
23
|
import "../chunk-T4EXUIBY.js";
|
|
24
24
|
import {
|
|
25
25
|
copy,
|
|
26
26
|
fileExists,
|
|
27
27
|
getErrorMessage
|
|
28
|
-
} from "../chunk-
|
|
28
|
+
} from "../chunk-XJXJZ2MJ.js";
|
|
29
29
|
import {
|
|
30
|
+
CLI_BIN_NAME,
|
|
30
31
|
LOCAL_SKILLS_PATH
|
|
31
|
-
} from "../chunk-
|
|
32
|
+
} from "../chunk-BK7TANUV.js";
|
|
32
33
|
import {
|
|
33
34
|
init_esm_shims
|
|
34
35
|
} from "../chunk-DHET7RCE.js";
|
|
@@ -163,7 +164,7 @@ var Update = class _Update extends BaseCommand {
|
|
|
163
164
|
}
|
|
164
165
|
this.log("");
|
|
165
166
|
}
|
|
166
|
-
this.log(`Run
|
|
167
|
+
this.log(`Run \`${CLI_BIN_NAME} search ${args.skill}\` to search available skills.`);
|
|
167
168
|
this.log("");
|
|
168
169
|
this.error(ERROR_MESSAGES.SKILL_NOT_FOUND, { exit: EXIT_CODES.ERROR });
|
|
169
170
|
}
|