vskill 1.0.21 → 1.1.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.
@@ -3,7 +3,10 @@
3
3
  //
4
4
  // Reads a skill's SKILL.md frontmatter and verifies that every declared
5
5
  // dependency is satisfied before the skill runs:
6
- // - mcpDeps[] → present in ~/.claude/mcp.json or project .claude/mcp.json
6
+ // - mcpDeps[] → present in any known Claude config: project .mcp.json /
7
+ // .claude/mcp.json, ~/.claude/mcp.json, Claude Desktop, or
8
+ // ~/.claude.json (both top-level mcpServers and the
9
+ // per-project projects[<dir>].mcpServers map)
7
10
  // - secrets[] → resolvable via env or .env.local (resolveCredential)
8
11
  // - runtime.python → `python3 --version` ≥ declared minimum
9
12
  // - runtime.pip → declared (informational; we don't auto-install)
@@ -58,30 +61,95 @@ export function findSkillDir(name, root) {
58
61
  }
59
62
  return null;
60
63
  }
64
+ function hasServer(container, serverName) {
65
+ return (!!container &&
66
+ typeof container === "object" &&
67
+ serverName in container);
68
+ }
69
+ function readJson(path) {
70
+ if (!existsSync(path))
71
+ return null;
72
+ try {
73
+ return JSON.parse(readFileSync(path, "utf-8"));
74
+ }
75
+ catch {
76
+ return null; // malformed config is treated as "not configured here"
77
+ }
78
+ }
61
79
  /**
62
- * Check whether a named MCP server is configured in any known Claude config
63
- * file. Returns "configured" if found, "missing" otherwise. Tolerant of
64
- * malformed JSON — a parse error is treated as "not configured here".
80
+ * Locate a named MCP server across every known Claude config layout, reporting
81
+ * WHERE it was found.
82
+ *
83
+ * Claude Code stores servers in three different shapes, and a skill can legally
84
+ * depend on any of them:
85
+ * - <projectRoot>/.mcp.json → checked-in project servers
86
+ * - <projectRoot>/.claude/mcp.json → local project servers
87
+ * - ~/.claude.json mcpServers → user-global servers
88
+ * - ~/.claude.json projects[<dir>].mcpServers → per-project servers (the common case
89
+ * for anything added with `claude mcp add`)
90
+ * - ~/.claude/mcp.json → user-global servers
91
+ * - Claude Desktop's claude_desktop_config.json
92
+ *
93
+ * `homeDir` is injectable so tests can exercise the user-level layouts without
94
+ * touching the real home directory.
65
95
  */
66
- export function checkMcpConfigured(serverName, projectRoot) {
67
- const candidates = [
68
- join(projectRoot, ".claude", "mcp.json"),
69
- join(homedir(), ".claude", "mcp.json"),
70
- join(homedir(), "Library", "Application Support", "Claude", "claude_desktop_config.json"),
96
+ export function locateMcpServer(serverName, projectRoot, homeDir = homedir()) {
97
+ const fileCandidates = [
98
+ { path: join(projectRoot, ".mcp.json"), scope: "project-file" },
99
+ { path: join(projectRoot, ".claude", "mcp.json"), scope: "project-file" },
100
+ { path: join(homeDir, ".claude", "mcp.json"), scope: "user-global" },
101
+ {
102
+ path: join(homeDir, "Library", "Application Support", "Claude", "claude_desktop_config.json"),
103
+ scope: "desktop",
104
+ },
71
105
  ];
72
- for (const p of candidates) {
73
- if (!existsSync(p))
74
- continue;
75
- try {
76
- const cfg = JSON.parse(readFileSync(p, "utf-8"));
77
- const servers = cfg.mcpServers;
78
- if (servers && typeof servers === "object" && serverName in servers) {
79
- return "configured";
106
+ for (const { path, scope } of fileCandidates) {
107
+ const cfg = readJson(path);
108
+ if (cfg && hasServer(cfg.mcpServers, serverName)) {
109
+ return { status: "configured", scope, source: path };
110
+ }
111
+ }
112
+ // ~/.claude.json carries BOTH a global map and a per-project map.
113
+ const claudeJsonPath = join(homeDir, ".claude.json");
114
+ const claudeJson = readJson(claudeJsonPath);
115
+ if (claudeJson) {
116
+ if (hasServer(claudeJson.mcpServers, serverName)) {
117
+ return { status: "configured", scope: "user-global", source: claudeJsonPath };
118
+ }
119
+ const projects = claudeJson.projects;
120
+ if (projects && typeof projects === "object") {
121
+ const entries = Object.entries(projects);
122
+ // Prefer the project being checked; fall back to any other project so the
123
+ // user is told the server exists but is scoped elsewhere.
124
+ const resolvedRoot = resolve(projectRoot);
125
+ let fallback = null;
126
+ for (const [dir, value] of entries) {
127
+ if (!value || typeof value !== "object")
128
+ continue;
129
+ if (!hasServer(value.mcpServers, serverName))
130
+ continue;
131
+ const hit = {
132
+ status: "configured",
133
+ scope: "project-scoped",
134
+ source: claudeJsonPath,
135
+ projectPath: dir,
136
+ };
137
+ if (resolve(dir) === resolvedRoot)
138
+ return hit;
139
+ fallback ??= { ...hit, otherProject: true };
80
140
  }
141
+ if (fallback)
142
+ return fallback;
81
143
  }
82
- catch { /* ignore parse error */ }
83
144
  }
84
- return "missing";
145
+ return { status: "missing" };
146
+ }
147
+ /**
148
+ * Back-compatible wrapper: "configured" if the server is registered anywhere,
149
+ * "missing" otherwise. Prefer `locateMcpServer` when the scope matters.
150
+ */
151
+ export function checkMcpConfigured(serverName, projectRoot, homeDir = homedir()) {
152
+ return locateMcpServer(serverName, projectRoot, homeDir).status;
85
153
  }
86
154
  /**
87
155
  * Compare a `python3 --version` output line ("Python 3.11.4") against a
@@ -123,12 +191,31 @@ export function buildCheckReport(skillName, projectRoot) {
123
191
  }
124
192
  const meta = buildSkillMetadata(dir, "source", projectRoot);
125
193
  const mcps = (meta.mcpDeps ?? []).map((name) => {
126
- const status = checkMcpConfigured(name, projectRoot);
127
- return {
128
- name,
129
- status: status === "configured" ? "ok" : "missing",
130
- message: status === "configured" ? "configured" : "not configured in any known Claude config",
131
- };
194
+ const found = locateMcpServer(name, projectRoot);
195
+ if (found.status === "missing") {
196
+ return {
197
+ name,
198
+ status: "missing",
199
+ message: "not configured in any known Claude config",
200
+ };
201
+ }
202
+ if (found.scope === "project-scoped") {
203
+ return found.otherProject
204
+ ? {
205
+ name,
206
+ status: "warning",
207
+ message: `configured, but project-scoped to ${found.projectPath} — not this project`,
208
+ }
209
+ : {
210
+ name,
211
+ status: "ok",
212
+ message: `configured (project-scoped: ${found.projectPath})`,
213
+ };
214
+ }
215
+ const where = found.scope === "user-global" ? "user global"
216
+ : found.scope === "desktop" ? "Claude Desktop"
217
+ : found.source ?? "project";
218
+ return { name, status: "ok", message: `configured (${where})` };
132
219
  });
133
220
  const secretStatuses = resolveAllCredentials(meta.secrets ?? [], dir);
134
221
  const secrets = secretStatuses.map((s) => ({
@@ -1 +1 @@
1
- {"version":3,"file":"check.js","sourceRoot":"","sources":["../../src/commands/check.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"check.js","sourceRoot":"","sources":["../../src/commands/check.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,4 @@
1
1
  interface CleanupOptions {
2
- /** 0724 T-008: dry-run preview, no subprocess. */
3
2
  dryRun?: boolean;
4
3
  }
5
4
  export declare function cleanupCommand(opts?: CleanupOptions): Promise<void>;
@@ -1,97 +1,88 @@
1
- // ---------------------------------------------------------------------------
2
- // vskill cleanup -- remove stale plugin entries and orphaned cache
3
- // ---------------------------------------------------------------------------
4
- import { existsSync, readdirSync, rmSync } from "node:fs";
1
+ // Reconcile missing plugin registrations without claiming ownership of
2
+ // plugins installed by Claude, Codex, another project, or another installer.
3
+ import { existsSync, readFileSync } from "node:fs";
5
4
  import { join } from "node:path";
6
5
  import { homedir } from "node:os";
7
6
  import { readLockfile } from "../lockfile/index.js";
8
- import { listEnabledPlugins, purgeStalePlugins } from "../settings/index.js";
9
- import { uninstallStalePlugins } from "../utils/claude-plugin.js";
7
+ import { resolveLocalSkillRoot } from "../lockfile/local-root.js";
8
+ import { purgeStalePlugins } from "../settings/index.js";
9
+ import { claudePluginUninstall } from "../utils/claude-plugin.js";
10
10
  import { bold, cyan, green, dim, yellow } from "../utils/output.js";
11
+ /** Absence from vskill.lock alone is not evidence of an orphan. */
12
+ function registeredPluginIds() {
13
+ const registry = join(homedir(), ".claude", "plugins", "installed_plugins.json");
14
+ if (!existsSync(registry))
15
+ return new Set();
16
+ try {
17
+ const data = JSON.parse(readFileSync(registry, "utf8"));
18
+ if (!data?.plugins || typeof data.plugins !== "object" || Array.isArray(data.plugins))
19
+ return null;
20
+ return new Set(Object.keys(data.plugins));
21
+ }
22
+ catch {
23
+ // Unreadable ownership data must never become a removal plan.
24
+ return null;
25
+ }
26
+ }
27
+ function hasCachedPlugin(id) {
28
+ const at = id.lastIndexOf("@");
29
+ const name = id.slice(0, at);
30
+ const marketplace = id.slice(at + 1);
31
+ const safe = /^[a-z0-9][\w.-]*$/i;
32
+ if (at < 1 || !safe.test(name) || !safe.test(marketplace))
33
+ return true;
34
+ return existsSync(join(homedir(), ".claude", "plugins", "cache", marketplace, name));
35
+ }
11
36
  export async function cleanupCommand(opts = {}) {
12
- const lock = readLockfile();
13
- const skills = lock?.skills ?? {};
14
- const inSyncCount = Object.keys(skills).length;
15
- if (opts.dryRun) {
16
- // 0724 T-008 (AC-US7-02, AC-US7-03, AC-US7-04): preview-only path.
17
- // Walk both scopes via the read-only `purgeStalePlugins` helper, then
18
- // emit the would-be `claude plugin uninstall ...` invocations and the
19
- // reconciliation summary. No subprocess, no filesystem mutation,
20
- // settings.json untouched.
21
- console.log(bold("Dry-run — preview of stale plugin uninstalls:\n"));
22
- const userStale = purgeStalePlugins({ scope: "user" }, skills);
23
- const projectStale = purgeStalePlugins({ scope: "project", projectDir: process.cwd() }, skills);
24
- if (userStale.length === 0 && projectStale.length === 0) {
25
- console.log(dim("No stale plugin entries found in settings.json."));
26
- }
27
- else {
28
- for (const id of userStale) {
29
- console.log(` ${dim(">")} ${cyan(`claude plugin uninstall --scope user -- ${id}`)}`);
30
- }
31
- for (const id of projectStale) {
32
- console.log(` ${dim(">")} ${cyan(`claude plugin uninstall --scope project -- ${id}`)}`);
33
- }
34
- }
35
- console.log(`\n${green(`${userStale.length}`)} stale entries removed from user scope, ${green(`${projectStale.length}`)} from project scope, ${dim(`${inSyncCount}`)} in-sync skills left untouched.`);
37
+ const projectRoot = resolveLocalSkillRoot();
38
+ const projectSkills = readLockfile(projectRoot)?.skills ?? {};
39
+ // Older global installs wrote ~/vskill.lock; current installs use ~/.agents.
40
+ const userSkills = {
41
+ ...(readLockfile(homedir())?.skills ?? {}),
42
+ ...(readLockfile(join(homedir(), ".agents"))?.skills ?? {}),
43
+ };
44
+ const registered = registeredPluginIds();
45
+ if (registered === null) {
46
+ console.log(yellow("Plugin registry unreadable. Cleanup skipped; no files or registrations changed."));
36
47
  return;
37
48
  }
38
- console.log(bold("Cleaning up stale plugin entries...\n"));
39
- // Uninstall stale plugins via claude CLI. Counts of "actually removed"
40
- // come from the result list (F-002 fix): a stale id detected by
41
- // purgeStalePlugins may still fail to uninstall via the CLI (e.g. the
42
- // plugin was registered out-of-band and claude has no record), and we
43
- // shouldn't claim it as removed in the reconciliation summary.
44
- const results = uninstallStalePlugins(skills);
45
- const userStaleRemoved = results.filter((r) => r.scope === "user" && r.ok).length;
46
- const projectStaleRemoved = results.filter((r) => r.scope === "project" && r.ok).length;
47
- if (results.length > 0) {
48
- console.log(green(`Removing ${results.length} stale plugin${results.length === 1 ? "" : "s"}:\n`));
49
- for (const { id, ok } of results) {
50
- console.log(` ${dim(">")} ${id}${ok ? "" : ` ${dim("(skipped — not registered via CLI)")}`}`);
49
+ const plans = [];
50
+ for (const scope of ["user", "project"]) {
51
+ const settings = scope === "user" ? { scope } : { scope, projectDir: projectRoot };
52
+ const skills = scope === "user" ? userSkills : projectSkills;
53
+ for (const id of purgeStalePlugins(settings, skills)) {
54
+ if (!registered.has(id) && !hasCachedPlugin(id))
55
+ plans.push({ id, scope });
51
56
  }
52
57
  }
53
- else {
54
- console.log(dim("No stale plugin entries found in settings.json."));
58
+ const inSyncCount = new Set([...Object.keys(projectSkills), ...Object.keys(userSkills)]).size;
59
+ if (opts.dryRun) {
60
+ console.log(bold("Dry-run — preview of missing plugin registration cleanup:\n"));
61
+ for (const { id, scope } of plans) {
62
+ console.log(` ${dim(">")} ${cyan(`claude plugin uninstall --scope ${scope} -- ${id}`)}`);
63
+ }
64
+ if (!plans.length)
65
+ console.log(dim("No stale plugin entries found in settings.json."));
66
+ const user = plans.filter((p) => p.scope === "user").length;
67
+ const project = plans.filter((p) => p.scope === "project").length;
68
+ console.log(`\n${user} user and ${project} project entries would be removed; no changes made. ${inSyncCount} in-sync skills left untouched.`);
69
+ return;
55
70
  }
56
- // Clean orphaned plugin cache directories
57
- const cacheBase = join(homedir(), ".claude", "plugins", "cache");
58
- let orphanedCount = 0;
59
- if (existsSync(cacheBase)) {
71
+ console.log(bold("Cleaning up missing plugin registrations...\n"));
72
+ const removed = { user: 0, project: 0 };
73
+ for (const { id, scope } of plans) {
60
74
  try {
61
- for (const marketplace of readdirSync(cacheBase)) {
62
- const mktDir = join(cacheBase, marketplace);
63
- for (const pluginName of readdirSync(mktDir)) {
64
- const lockEntry = skills[pluginName];
65
- if (!lockEntry || lockEntry.marketplace !== marketplace) {
66
- const orphanDir = join(mktDir, pluginName);
67
- try {
68
- rmSync(orphanDir, { recursive: true, force: true });
69
- orphanedCount++;
70
- console.log(dim(` Removed orphaned cache: ${marketplace}/${pluginName}`));
71
- }
72
- catch {
73
- // non-fatal
74
- }
75
- }
76
- }
77
- }
75
+ claudePluginUninstall(id, scope, scope === "project" ? { cwd: projectRoot } : undefined);
76
+ removed[scope]++;
77
+ console.log(dim(` Removed missing registration: ${id} (${scope})`));
78
78
  }
79
79
  catch {
80
- // non-fatal — cache dir may have permission issues
80
+ console.log(yellow(` ${id} (${scope}) could not be uninstalled; registration retained.`));
81
81
  }
82
82
  }
83
- if (orphanedCount > 0) {
84
- console.log(green(`\nRemoved ${orphanedCount} orphaned cache director${orphanedCount === 1 ? "y" : "ies"}.`));
85
- }
86
- // 0724 T-008 AC-US7-03: reconciliation summary
87
- console.log(`\n${green(`${userStaleRemoved}`)} stale entries removed from user scope, ${green(`${projectStaleRemoved}`)} from project scope, ${dim(`${inSyncCount}`)} in-sync skills left untouched.`);
88
- // Show remaining enabled plugins
89
- const remaining = listEnabledPlugins({ scope: "user" });
90
- if (remaining.length > 0) {
91
- console.log(dim(`\n${remaining.length} enabled plugin${remaining.length === 1 ? "" : "s"} remaining: ${remaining.join(", ")}`));
92
- }
93
- if (results.length > 0) {
94
- console.log(yellow("\nRestart Claude Code to reload its plugin settings."));
95
- }
83
+ // Cache is shared with other projects and installers. Only a targeted
84
+ // uninstall can establish ownership; blanket lockfile-based GC is unsafe.
85
+ console.log(`\n${green(String(removed.user))} stale entries removed from user scope, ${green(String(removed.project))} from project scope, ${inSyncCount} in-sync skills left untouched.`);
86
+ console.log(dim("Shared plugin caches preserved. Use a targeted uninstall to remove a plugin."));
96
87
  }
97
88
  //# sourceMappingURL=cleanup.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"cleanup.js","sourceRoot":"","sources":["../../src/commands/cleanup.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,mEAAmE;AACnE,8EAA8E;AAE9E,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAC1D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAC7E,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAOpE,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAAuB,EAAE;IAC5D,MAAM,IAAI,GAAG,YAAY,EAAE,CAAC;IAC5B,MAAM,MAAM,GAAG,IAAI,EAAE,MAAM,IAAI,EAAE,CAAC;IAClC,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC;IAE/C,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,mEAAmE;QACnE,sEAAsE;QACtE,sEAAsE;QACtE,iEAAiE;QACjE,2BAA2B;QAC3B,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC,CAAC;QACrE,MAAM,SAAS,GAAG,iBAAiB,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,MAAM,CAAC,CAAC;QAC/D,MAAM,YAAY,GAAG,iBAAiB,CACpC,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,EAC/C,MAAM,CACP,CAAC;QACF,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxD,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC,CAAC;QACtE,CAAC;aAAM,CAAC;YACN,KAAK,MAAM,EAAE,IAAI,SAAS,EAAE,CAAC;gBAC3B,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,2CAA2C,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;YACxF,CAAC;YACD,KAAK,MAAM,EAAE,IAAI,YAAY,EAAE,CAAC;gBAC9B,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,8CAA8C,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;YAC3F,CAAC;QACH,CAAC;QACD,OAAO,CAAC,GAAG,CACT,KAAK,KAAK,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,2CAA2C,KAAK,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,wBAAwB,GAAG,CAAC,GAAG,WAAW,EAAE,CAAC,iCAAiC,CAC1L,CAAC;QACF,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC,CAAC;IAE3D,uEAAuE;IACvE,gEAAgE;IAChE,sEAAsE;IACtE,sEAAsE;IACtE,+DAA+D;IAC/D,MAAM,OAAO,GAAG,qBAAqB,CAAC,MAAM,CAAC,CAAC;IAC9C,MAAM,gBAAgB,GAAG,OAAO,CAAC,MAAM,CACrC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,MAAM,IAAI,CAAC,CAAC,EAAE,CAClC,CAAC,MAAM,CAAC;IACT,MAAM,mBAAmB,GAAG,OAAO,CAAC,MAAM,CACxC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,SAAS,IAAI,CAAC,CAAC,EAAE,CACrC,CAAC,MAAM,CAAC;IACT,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,YAAY,OAAO,CAAC,MAAM,gBAAgB,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CACtF,CAAC;QACF,KAAK,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,OAAO,EAAE,CAAC;YACjC,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,oCAAoC,CAAC,EAAE,EAAE,CAAC,CAAC;QACjG,CAAC;IACH,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC,CAAC;IACtE,CAAC;IAED,0CAA0C;IAC1C,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;IACjE,IAAI,aAAa,GAAG,CAAC,CAAC;IACtB,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC1B,IAAI,CAAC;YACH,KAAK,MAAM,WAAW,IAAI,WAAW,CAAC,SAAS,CAAC,EAAE,CAAC;gBACjD,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;gBAC5C,KAAK,MAAM,UAAU,IAAI,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC;oBAC7C,MAAM,SAAS,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;oBACrC,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,WAAW,KAAK,WAAW,EAAE,CAAC;wBACxD,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;wBAC3C,IAAI,CAAC;4BACH,MAAM,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;4BACpD,aAAa,EAAE,CAAC;4BAChB,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,6BAA6B,WAAW,IAAI,UAAU,EAAE,CAAC,CAAC,CAAC;wBAC7E,CAAC;wBAAC,MAAM,CAAC;4BACP,YAAY;wBACd,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,mDAAmD;QACrD,CAAC;IACH,CAAC;IAED,IAAI,aAAa,GAAG,CAAC,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,aAAa,aAAa,2BAA2B,aAAa,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;IAChH,CAAC;IAED,+CAA+C;IAC/C,OAAO,CAAC,GAAG,CACT,KAAK,KAAK,CAAC,GAAG,gBAAgB,EAAE,CAAC,2CAA2C,KAAK,CAAC,GAAG,mBAAmB,EAAE,CAAC,wBAAwB,GAAG,CAAC,GAAG,WAAW,EAAE,CAAC,iCAAiC,CAC1L,CAAC;IAEF,iCAAiC;IACjC,MAAM,SAAS,GAAG,kBAAkB,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IACxD,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,SAAS,CAAC,MAAM,kBAAkB,SAAS,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,eAAe,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;IAClI,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,sDAAsD,CAAC,CAAC,CAAC;IAC9E,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"cleanup.js","sourceRoot":"","sources":["../../src/commands/cleanup.ts"],"names":[],"mappings":"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"}
@@ -2,11 +2,12 @@
2
2
  // vskill remove -- remove an installed skill from all agents
3
3
  // ---------------------------------------------------------------------------
4
4
  import { existsSync, rmSync } from "node:fs";
5
- import { join } from "node:path";
5
+ import { dirname, join } from "node:path";
6
6
  import { createInterface } from "node:readline";
7
7
  import { resolveTilde } from "../utils/paths.js";
8
8
  import { detectInstalledAgents } from "../agents/agents-registry.js";
9
9
  import { readLockfile, removeSkillFromLock } from "../lockfile/index.js";
10
+ import { resolveLocalSkillRoot } from "../lockfile/local-root.js";
10
11
  import { claudePluginUninstall } from "../utils/claude-plugin.js";
11
12
  import { isPluginEnabled } from "../settings/index.js";
12
13
  import { buildPerAgentReport, resolvePluginId, } from "../lib/skill-lifecycle.js";
@@ -24,8 +25,20 @@ async function confirm(message) {
24
25
  }
25
26
  export async function removeCommand(skillName, opts) {
26
27
  // Read lockfile to check if skill exists
27
- const lock = readLockfile();
28
- const skillEntry = lock?.skills[skillName];
28
+ const globalAgentsRoot = resolveTilde("~/.agents");
29
+ const projectRoot = resolveLocalSkillRoot();
30
+ const lock = readLockfile(opts.global ? globalAgentsRoot : projectRoot);
31
+ const projectEntry = opts.global ? undefined : lock?.skills[skillName];
32
+ const globalLock = opts.local ? null : opts.global ? lock : readLockfile(globalAgentsRoot);
33
+ let globalEntry = globalLock?.skills[skillName];
34
+ let globalLockRoot = globalAgentsRoot;
35
+ if (!opts.local && !globalEntry) {
36
+ const legacyRoot = dirname(globalAgentsRoot);
37
+ globalEntry = readLockfile(legacyRoot)?.skills[skillName];
38
+ if (globalEntry)
39
+ globalLockRoot = legacyRoot;
40
+ }
41
+ const skillEntry = projectEntry ?? globalEntry;
29
42
  if (!skillEntry && !opts.force) {
30
43
  console.error(red(`Skill "${skillName}" not found in lockfile.\n`) +
31
44
  dim("Use --force to attempt removal anyway."));
@@ -52,7 +65,7 @@ export async function removeCommand(skillName, opts) {
52
65
  // Local dirs
53
66
  paths.push({
54
67
  label: `${agent.displayName} (local)`,
55
- dir: join(process.cwd(), agent.localSkillsDir, skillName),
68
+ dir: join(projectRoot, agent.localSkillsDir, skillName),
56
69
  });
57
70
  }
58
71
  if (!opts.local) {
@@ -78,31 +91,31 @@ export async function removeCommand(skillName, opts) {
78
91
  }
79
92
  }
80
93
  // Update lockfile
81
- if (skillEntry) {
82
- removeSkillFromLock(skillName);
94
+ if (projectEntry) {
95
+ removeSkillFromLock(skillName, projectRoot);
83
96
  }
84
97
  // F5: clean up the canonical .agents/skills/<name> payload that
85
98
  // installSymlink() writes. The loop above only deletes per-agent
86
99
  // copies/symlinks — without this, the canonical store (the symlink
87
100
  // target) is stranded on disk forever.
88
- const globalAgentsRoot = resolveTilde("~/.agents");
89
- if (!opts.local && readLockfile(globalAgentsRoot)?.skills[skillName]) {
101
+ if (!opts.local && globalEntry) {
90
102
  // Global installs keep their lockfile at ~/.agents/vskill.lock; drop the
91
103
  // entry there too since the loop above deleted the global agent files.
92
- removeSkillFromLock(skillName, globalAgentsRoot);
104
+ removeSkillFromLock(skillName, globalLockRoot);
93
105
  }
94
106
  const canonicalTargets = [];
95
107
  if (!opts.global) {
96
108
  canonicalTargets.push({
97
109
  label: "canonical store (project)",
98
- dir: join(process.cwd(), ".agents", "skills", skillName),
110
+ dir: join(projectRoot, ".agents", "skills", skillName),
111
+ lockDir: projectRoot,
99
112
  });
100
113
  }
101
114
  if (!opts.local) {
102
115
  canonicalTargets.push({
103
116
  label: "canonical store (global)",
104
117
  dir: join(globalAgentsRoot, "skills", skillName),
105
- lockDir: globalAgentsRoot,
118
+ lockDir: globalLockRoot,
106
119
  });
107
120
  }
108
121
  for (const { label, dir, lockDir } of canonicalTargets) {
@@ -120,62 +133,39 @@ export async function removeCommand(skillName, opts) {
120
133
  console.error(yellow(`Failed to remove ${label}: `) + dim(err.message));
121
134
  }
122
135
  }
123
- // Uninstall marketplace plugin via claude CLI (handles settings.json + cache)
124
- // 0724 T-007: replace the legacy free-form "Plugin uninstalled: foo@m" log
125
- // with the structured per-agent report shared with enable/disable. Behaviour
126
- // (subprocess invocation, on-disk cleanup, lockfile mutation) is unchanged.
127
- //
128
- // F-004 fix: 0724 introduced multi-scope enable/disable, so a skill
129
- // originally installed at project scope can have a separate user-scope
130
- // enable. Walk both scopes during remove so we don't leave a dangling
131
- // enabledPlugins entry that `vskill cleanup` would later flag as stale.
132
- let pluginId = null;
133
- let pluginUninstallOk = null;
134
- let scope = "user";
135
- if (skillEntry) {
136
- pluginId = resolvePluginId(skillName, skillEntry);
137
- scope = skillEntry.scope ?? "user";
138
- if (pluginId) {
139
- // F-002 fix: only walk scopes where the plugin is actually enabled
140
- // (read settings.json once per scope first). This way an "uninstall
141
- // failed" result truly means the claude CLI failed — not just that
142
- // the plugin wasn't registered at that scope.
143
- const cwd = process.cwd();
144
- const scopeStates = [
145
- { s: "user", enabled: false },
146
- { s: "project", enabled: false },
147
- ];
148
- try {
149
- scopeStates[0].enabled = isPluginEnabled(pluginId, { scope: "user" });
150
- }
151
- catch {
152
- /* settings.json missing -> treat as not enabled */
153
- }
154
- try {
155
- scopeStates[1].enabled = isPluginEnabled(pluginId, {
156
- scope: "project",
157
- projectDir: cwd,
158
- });
159
- }
160
- catch {
161
- /* settings.json missing -> treat as not enabled */
162
- }
163
- let anyAttempted = false;
164
- let allOk = true;
165
- for (const { s, enabled } of scopeStates) {
166
- if (!enabled)
167
- continue;
168
- anyAttempted = true;
169
- try {
170
- claudePluginUninstall(pluginId, s, s === "project" ? { cwd } : undefined);
171
- }
172
- catch {
173
- allOk = false;
174
- }
175
- }
176
- pluginUninstallOk = anyAttempted ? allOk : null;
136
+ // Resolve each scope independently: the same name can come from different
137
+ // marketplaces, or be a plain skill in one scope and a plugin in another.
138
+ const scope = opts.local ? "project" : opts.global ? "user" : skillEntry?.scope ?? "user";
139
+ const scopedEntries = [
140
+ { scope: "user", entry: globalEntry ?? (projectEntry?.scope === "user" ? projectEntry : undefined), allowed: !opts.local },
141
+ { scope: "project", entry: projectEntry, allowed: !opts.global },
142
+ ];
143
+ const pluginIds = [];
144
+ let anyAttempted = false;
145
+ let allOk = true;
146
+ for (const target of scopedEntries) {
147
+ if (!target.allowed || !target.entry)
148
+ continue;
149
+ const id = resolvePluginId(skillName, target.entry);
150
+ if (!id)
151
+ continue;
152
+ pluginIds.push(id);
153
+ const cwd = projectRoot;
154
+ try {
155
+ const settings = target.scope === "user"
156
+ ? { scope: target.scope }
157
+ : { scope: target.scope, projectDir: cwd };
158
+ if (!isPluginEnabled(id, settings))
159
+ continue;
160
+ anyAttempted = true;
161
+ claudePluginUninstall(id, target.scope, target.scope === "project" ? { cwd } : undefined);
162
+ }
163
+ catch {
164
+ allOk = false;
177
165
  }
178
166
  }
167
+ const pluginId = pluginIds[0] ?? null;
168
+ const pluginUninstallOk = anyAttempted ? allOk : null;
179
169
  const action = pluginUninstallOk === true ? "disabled" : "not-applicable";
180
170
  const perAgent = buildPerAgentReport({
181
171
  skill: skillName,