@mycelish/cli 0.1.0 → 0.2.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/dist/__tests__/mcp-server.test.d.ts +2 -0
- package/dist/__tests__/mcp-server.test.d.ts.map +1 -0
- package/dist/__tests__/mcp-server.test.js +60 -0
- package/dist/__tests__/mcp-server.test.js.map +1 -0
- package/dist/__tests__/unified-item-state.integration.test.d.ts +7 -0
- package/dist/__tests__/unified-item-state.integration.test.d.ts.map +1 -0
- package/dist/__tests__/unified-item-state.integration.test.js +217 -0
- package/dist/__tests__/unified-item-state.integration.test.js.map +1 -0
- package/dist/commands/add.d.ts.map +1 -1
- package/dist/commands/add.js +9 -0
- package/dist/commands/add.js.map +1 -1
- package/dist/commands/disable.d.ts +8 -6
- package/dist/commands/disable.d.ts.map +1 -1
- package/dist/commands/disable.js +143 -136
- package/dist/commands/disable.js.map +1 -1
- package/dist/commands/disable.test.js +117 -23
- package/dist/commands/disable.test.js.map +1 -1
- package/dist/commands/doctor.d.ts +1 -1
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +1 -1
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/enable.d.ts +8 -6
- package/dist/commands/enable.d.ts.map +1 -1
- package/dist/commands/enable.js +128 -133
- package/dist/commands/enable.js.map +1 -1
- package/dist/commands/enable.test.js +192 -24
- package/dist/commands/enable.test.js.map +1 -1
- package/dist/commands/health-checks/index.d.ts +2 -1
- package/dist/commands/health-checks/index.d.ts.map +1 -1
- package/dist/commands/health-checks/index.js +2 -1
- package/dist/commands/health-checks/index.js.map +1 -1
- package/dist/commands/health-checks/mcp-check.d.ts +5 -1
- package/dist/commands/health-checks/mcp-check.d.ts.map +1 -1
- package/dist/commands/health-checks/mcp-check.js +32 -1
- package/dist/commands/health-checks/mcp-check.js.map +1 -1
- package/dist/commands/health-checks/plugin-takeover-check.d.ts +15 -0
- package/dist/commands/health-checks/plugin-takeover-check.d.ts.map +1 -0
- package/dist/commands/health-checks/plugin-takeover-check.js +274 -0
- package/dist/commands/health-checks/plugin-takeover-check.js.map +1 -0
- package/dist/commands/health-checks/runner.d.ts.map +1 -1
- package/dist/commands/health-checks/runner.js +18 -0
- package/dist/commands/health-checks/runner.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +33 -0
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/mcp.d.ts +9 -0
- package/dist/commands/mcp.d.ts.map +1 -0
- package/dist/commands/mcp.js +17 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/commands/migrate.d.ts.map +1 -1
- package/dist/commands/migrate.js +51 -0
- package/dist/commands/migrate.js.map +1 -1
- package/dist/commands/preset.test.js +7 -3
- package/dist/commands/preset.test.js.map +1 -1
- package/dist/commands/remove.d.ts +25 -23
- package/dist/commands/remove.d.ts.map +1 -1
- package/dist/commands/remove.js +118 -247
- package/dist/commands/remove.js.map +1 -1
- package/dist/commands/remove.test.js +152 -78
- package/dist/commands/remove.test.js.map +1 -1
- package/dist/commands/report.d.ts +8 -0
- package/dist/commands/report.d.ts.map +1 -0
- package/dist/commands/report.js +149 -0
- package/dist/commands/report.js.map +1 -0
- package/dist/commands/report.test.d.ts +2 -0
- package/dist/commands/report.test.d.ts.map +1 -0
- package/dist/commands/report.test.js +23 -0
- package/dist/commands/report.test.js.map +1 -0
- package/dist/commands/status.d.ts +9 -4
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +81 -10
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/status.test.js +92 -0
- package/dist/commands/status.test.js.map +1 -1
- package/dist/commands/sync.d.ts.map +1 -1
- package/dist/commands/sync.js +138 -7
- package/dist/commands/sync.js.map +1 -1
- package/dist/commands/sync.test.js +91 -6
- package/dist/commands/sync.test.js.map +1 -1
- package/dist/core/adapter-base.d.ts +2 -0
- package/dist/core/adapter-base.d.ts.map +1 -1
- package/dist/core/adapter-base.js +2 -1
- package/dist/core/adapter-base.js.map +1 -1
- package/dist/core/auto-adapter.d.ts.map +1 -1
- package/dist/core/auto-adapter.js +58 -3
- package/dist/core/auto-adapter.js.map +1 -1
- package/dist/core/auto-adapter.test.js +155 -0
- package/dist/core/auto-adapter.test.js.map +1 -1
- package/dist/core/config-merger.d.ts +6 -5
- package/dist/core/config-merger.d.ts.map +1 -1
- package/dist/core/config-merger.js +119 -136
- package/dist/core/config-merger.js.map +1 -1
- package/dist/core/config-merger.test.d.ts +1 -1
- package/dist/core/config-merger.test.js +72 -88
- package/dist/core/config-merger.test.js.map +1 -1
- package/dist/core/file-syncer.d.ts +33 -0
- package/dist/core/file-syncer.d.ts.map +1 -0
- package/dist/core/file-syncer.js +138 -0
- package/dist/core/file-syncer.js.map +1 -0
- package/dist/core/file-syncer.test.d.ts +2 -0
- package/dist/core/file-syncer.test.d.ts.map +1 -0
- package/dist/core/file-syncer.test.js +131 -0
- package/dist/core/file-syncer.test.js.map +1 -0
- package/dist/core/global-tracer.d.ts +4 -0
- package/dist/core/global-tracer.d.ts.map +1 -0
- package/dist/core/global-tracer.js +36 -0
- package/dist/core/global-tracer.js.map +1 -0
- package/dist/core/item-loader.d.ts +18 -0
- package/dist/core/item-loader.d.ts.map +1 -0
- package/dist/core/item-loader.js +40 -0
- package/dist/core/item-loader.js.map +1 -0
- package/dist/core/item-loader.test.d.ts +2 -0
- package/dist/core/item-loader.test.d.ts.map +1 -0
- package/dist/core/item-loader.test.js +52 -0
- package/dist/core/item-loader.test.js.map +1 -0
- package/dist/core/manifest-migrator.d.ts +15 -0
- package/dist/core/manifest-migrator.d.ts.map +1 -0
- package/dist/core/manifest-migrator.js +38 -0
- package/dist/core/manifest-migrator.js.map +1 -0
- package/dist/core/manifest-migrator.test.d.ts +2 -0
- package/dist/core/manifest-migrator.test.d.ts.map +1 -0
- package/dist/core/manifest-migrator.test.js +53 -0
- package/dist/core/manifest-migrator.test.js.map +1 -0
- package/dist/core/manifest-state.d.ts +117 -0
- package/dist/core/manifest-state.d.ts.map +1 -0
- package/dist/core/manifest-state.js +218 -0
- package/dist/core/manifest-state.js.map +1 -0
- package/dist/core/manifest-state.test.d.ts +2 -0
- package/dist/core/manifest-state.test.d.ts.map +1 -0
- package/dist/core/manifest-state.test.js +130 -0
- package/dist/core/manifest-state.test.js.map +1 -0
- package/dist/core/marketplace-registry.d.ts +0 -1
- package/dist/core/marketplace-registry.d.ts.map +1 -1
- package/dist/core/marketplace-registry.js +0 -16
- package/dist/core/marketplace-registry.js.map +1 -1
- package/dist/core/marketplace-registry.test.js +1 -14
- package/dist/core/marketplace-registry.test.js.map +1 -1
- package/dist/core/mcp-injector.d.ts +2 -2
- package/dist/core/mcp-injector.d.ts.map +1 -1
- package/dist/core/mcp-injector.js +6 -6
- package/dist/core/mcp-injector.js.map +1 -1
- package/dist/core/mcp-injector.test.js +33 -26
- package/dist/core/mcp-injector.test.js.map +1 -1
- package/dist/core/mcp-registry.js +1 -1
- package/dist/core/mcp-registry.js.map +1 -1
- package/dist/core/mcp-registry.test.js +1 -1
- package/dist/core/mcp-registry.test.js.map +1 -1
- package/dist/core/memory-scoper.test.js +2 -13
- package/dist/core/memory-scoper.test.js.map +1 -1
- package/dist/core/migrator/executor.js +2 -2
- package/dist/core/migrator/executor.js.map +1 -1
- package/dist/core/plugin-state.d.ts +7 -0
- package/dist/core/plugin-state.d.ts.map +1 -0
- package/dist/core/plugin-state.js +88 -0
- package/dist/core/plugin-state.js.map +1 -0
- package/dist/core/plugin-takeover.d.ts +50 -0
- package/dist/core/plugin-takeover.d.ts.map +1 -0
- package/dist/core/plugin-takeover.js +263 -0
- package/dist/core/plugin-takeover.js.map +1 -0
- package/dist/core/plugin-takeover.test.d.ts +2 -0
- package/dist/core/plugin-takeover.test.d.ts.map +1 -0
- package/dist/core/plugin-takeover.test.js +243 -0
- package/dist/core/plugin-takeover.test.js.map +1 -0
- package/dist/core/self-register.d.ts +5 -0
- package/dist/core/self-register.d.ts.map +1 -0
- package/dist/core/self-register.js +43 -0
- package/dist/core/self-register.js.map +1 -0
- package/dist/core/self-register.test.d.ts +2 -0
- package/dist/core/self-register.test.d.ts.map +1 -0
- package/dist/core/self-register.test.js +77 -0
- package/dist/core/self-register.test.js.map +1 -0
- package/dist/core/smart-memory.d.ts +5 -5
- package/dist/core/smart-memory.d.ts.map +1 -1
- package/dist/core/smart-memory.js +1 -10
- package/dist/core/smart-memory.js.map +1 -1
- package/dist/core/smart-memory.test.js +3 -30
- package/dist/core/smart-memory.test.js.map +1 -1
- package/dist/core/state-verifier.d.ts +36 -0
- package/dist/core/state-verifier.d.ts.map +1 -0
- package/dist/core/state-verifier.js +159 -0
- package/dist/core/state-verifier.js.map +1 -0
- package/dist/core/state-verifier.test.d.ts +2 -0
- package/dist/core/state-verifier.test.d.ts.map +1 -0
- package/dist/core/state-verifier.test.js +188 -0
- package/dist/core/state-verifier.test.js.map +1 -0
- package/dist/core/symlink-manager.d.ts +1 -1
- package/dist/core/symlink-manager.d.ts.map +1 -1
- package/dist/core/symlink-manager.js +1 -1
- package/dist/core/symlink-manager.js.map +1 -1
- package/dist/core/symlink-manager.test.js +4 -4
- package/dist/core/symlink-manager.test.js.map +1 -1
- package/dist/core/sync-writer.d.ts +2 -1
- package/dist/core/sync-writer.d.ts.map +1 -1
- package/dist/core/sync-writer.js +108 -22
- package/dist/core/sync-writer.js.map +1 -1
- package/dist/core/sync-writer.test.js +31 -0
- package/dist/core/sync-writer.test.js.map +1 -1
- package/dist/core/tool-adapter.d.ts.map +1 -1
- package/dist/core/tool-adapter.js +45 -6
- package/dist/core/tool-adapter.js.map +1 -1
- package/dist/core/trace-store.d.ts +36 -0
- package/dist/core/trace-store.d.ts.map +1 -0
- package/dist/core/trace-store.js +145 -0
- package/dist/core/trace-store.js.map +1 -0
- package/dist/core/trace-store.test.d.ts +2 -0
- package/dist/core/trace-store.test.d.ts.map +1 -0
- package/dist/core/trace-store.test.js +102 -0
- package/dist/core/trace-store.test.js.map +1 -0
- package/dist/core/tracer.d.ts +27 -0
- package/dist/core/tracer.d.ts.map +1 -0
- package/dist/core/tracer.js +62 -0
- package/dist/core/tracer.js.map +1 -0
- package/dist/core/tracer.test.d.ts +2 -0
- package/dist/core/tracer.test.d.ts.map +1 -0
- package/dist/core/tracer.test.js +54 -0
- package/dist/core/tracer.test.js.map +1 -0
- package/dist/core/watcher.d.ts.map +1 -1
- package/dist/core/watcher.js +9 -2
- package/dist/core/watcher.js.map +1 -1
- package/dist/core/watcher.test.js +9 -0
- package/dist/core/watcher.test.js.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/mcp/prompts.d.ts +3 -0
- package/dist/mcp/prompts.d.ts.map +1 -0
- package/dist/mcp/prompts.js +40 -0
- package/dist/mcp/prompts.js.map +1 -0
- package/dist/mcp/resources.d.ts +6 -0
- package/dist/mcp/resources.d.ts.map +1 -0
- package/dist/mcp/resources.js +24 -0
- package/dist/mcp/resources.js.map +1 -0
- package/dist/mcp/server.d.ts +7 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +27 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/server.test.d.ts +2 -0
- package/dist/mcp/server.test.d.ts.map +1 -0
- package/dist/mcp/server.test.js +9 -0
- package/dist/mcp/server.test.js.map +1 -0
- package/dist/mcp/tools/config-tools.d.ts +3 -0
- package/dist/mcp/tools/config-tools.d.ts.map +1 -0
- package/dist/mcp/tools/config-tools.js +80 -0
- package/dist/mcp/tools/config-tools.js.map +1 -0
- package/dist/mcp/tools/config-tools.test.d.ts +2 -0
- package/dist/mcp/tools/config-tools.test.d.ts.map +1 -0
- package/dist/mcp/tools/config-tools.test.js +207 -0
- package/dist/mcp/tools/config-tools.test.js.map +1 -0
- package/dist/mcp/tools/item-tools.d.ts +3 -0
- package/dist/mcp/tools/item-tools.d.ts.map +1 -0
- package/dist/mcp/tools/item-tools.js +95 -0
- package/dist/mcp/tools/item-tools.js.map +1 -0
- package/dist/mcp/tools/item-tools.test.d.ts +2 -0
- package/dist/mcp/tools/item-tools.test.d.ts.map +1 -0
- package/dist/mcp/tools/item-tools.test.js +184 -0
- package/dist/mcp/tools/item-tools.test.js.map +1 -0
- package/dist/mcp/tools/marketplace-tools.d.ts +3 -0
- package/dist/mcp/tools/marketplace-tools.d.ts.map +1 -0
- package/dist/mcp/tools/marketplace-tools.js +35 -0
- package/dist/mcp/tools/marketplace-tools.js.map +1 -0
- package/dist/mcp/tools/marketplace-tools.test.d.ts +2 -0
- package/dist/mcp/tools/marketplace-tools.test.d.ts.map +1 -0
- package/dist/mcp/tools/marketplace-tools.test.js +48 -0
- package/dist/mcp/tools/marketplace-tools.test.js.map +1 -0
- package/dist/mcp/tools/memory-tools.d.ts +3 -0
- package/dist/mcp/tools/memory-tools.d.ts.map +1 -0
- package/dist/mcp/tools/memory-tools.js +68 -0
- package/dist/mcp/tools/memory-tools.js.map +1 -0
- package/dist/mcp/tools/memory-tools.test.d.ts +2 -0
- package/dist/mcp/tools/memory-tools.test.d.ts.map +1 -0
- package/dist/mcp/tools/memory-tools.test.js +144 -0
- package/dist/mcp/tools/memory-tools.test.js.map +1 -0
- package/dist/mcp/tools/observe-tools.d.ts +3 -0
- package/dist/mcp/tools/observe-tools.d.ts.map +1 -0
- package/dist/mcp/tools/observe-tools.js +37 -0
- package/dist/mcp/tools/observe-tools.js.map +1 -0
- package/dist/mcp/tools/observe-tools.test.d.ts +2 -0
- package/dist/mcp/tools/observe-tools.test.d.ts.map +1 -0
- package/dist/mcp/tools/observe-tools.test.js +71 -0
- package/dist/mcp/tools/observe-tools.test.js.map +1 -0
- package/dist/routes/plugins.d.ts.map +1 -1
- package/dist/routes/plugins.js +63 -37
- package/dist/routes/plugins.js.map +1 -1
- package/dist/routes/plugins.test.d.ts +2 -0
- package/dist/routes/plugins.test.d.ts.map +1 -0
- package/dist/routes/plugins.test.js +56 -0
- package/dist/routes/plugins.test.js.map +1 -0
- package/dist/routes/remove.d.ts.map +1 -1
- package/dist/routes/remove.js +6 -15
- package/dist/routes/remove.js.map +1 -1
- package/dist/routes/state.d.ts.map +1 -1
- package/dist/routes/state.js +35 -70
- package/dist/routes/state.js.map +1 -1
- package/dist/routes/sync.d.ts.map +1 -1
- package/dist/routes/sync.js +10 -3
- package/dist/routes/sync.js.map +1 -1
- package/package.json +6 -2
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Plugin State — merges live cache scan with manifest state at query time.
|
|
3
|
+
*
|
|
4
|
+
* Two sources of truth:
|
|
5
|
+
* 1. Discovery: scanPluginCache() → what components EXIST
|
|
6
|
+
* 2. State: manifest.yaml → what's enabled/disabled
|
|
7
|
+
*
|
|
8
|
+
* This replaces the stale buildPluginMap(migration-manifest.json) approach.
|
|
9
|
+
*/
|
|
10
|
+
import * as os from "node:os";
|
|
11
|
+
import * as path from "node:path";
|
|
12
|
+
import { scanPluginCache } from "./plugin-scanner.js";
|
|
13
|
+
import { getDisabledItems } from "./manifest-state.js";
|
|
14
|
+
const PLUGIN_CACHE_DIR = path.join(os.homedir(), ".claude", "plugins", "cache");
|
|
15
|
+
/**
|
|
16
|
+
* Get live plugin state by scanning the cache and merging with manifest.
|
|
17
|
+
* Returns PluginInfo[] ready for the dashboard API.
|
|
18
|
+
*/
|
|
19
|
+
export async function getLivePluginState(projectRoot) {
|
|
20
|
+
// 1. Scan live cache for discovery
|
|
21
|
+
const components = await scanPluginCache(PLUGIN_CACHE_DIR);
|
|
22
|
+
// 2. Group by plugin name
|
|
23
|
+
const pluginMap = new Map();
|
|
24
|
+
for (const comp of components) {
|
|
25
|
+
const key = comp.pluginName ?? "unknown";
|
|
26
|
+
const existing = pluginMap.get(key) ?? {
|
|
27
|
+
marketplace: comp.marketplace ?? "",
|
|
28
|
+
skills: [],
|
|
29
|
+
agents: [],
|
|
30
|
+
commands: [],
|
|
31
|
+
hooks: [],
|
|
32
|
+
libs: [],
|
|
33
|
+
installPath: comp.path ? path.dirname(path.dirname(comp.path)) : "",
|
|
34
|
+
};
|
|
35
|
+
switch (comp.type) {
|
|
36
|
+
case "skill":
|
|
37
|
+
existing.skills.push(comp.name);
|
|
38
|
+
break;
|
|
39
|
+
case "agent":
|
|
40
|
+
existing.agents.push(comp.name);
|
|
41
|
+
break;
|
|
42
|
+
case "command":
|
|
43
|
+
existing.commands.push(comp.name);
|
|
44
|
+
break;
|
|
45
|
+
case "hook":
|
|
46
|
+
existing.hooks.push(comp.name);
|
|
47
|
+
break;
|
|
48
|
+
case "lib":
|
|
49
|
+
existing.libs.push(comp.name);
|
|
50
|
+
break;
|
|
51
|
+
}
|
|
52
|
+
pluginMap.set(key, existing);
|
|
53
|
+
}
|
|
54
|
+
// 3. Load state from manifest
|
|
55
|
+
const disabledItems = await getDisabledItems(projectRoot);
|
|
56
|
+
// 4. Merge: components + state → PluginInfo[]
|
|
57
|
+
return Array.from(pluginMap.entries()).map(([name, data]) => {
|
|
58
|
+
const allItems = [...data.skills, ...data.agents, ...data.commands, ...data.hooks, ...data.libs];
|
|
59
|
+
const disabledList = allItems.filter(i => disabledItems.has(i));
|
|
60
|
+
const allEnabled = disabledList.length === 0;
|
|
61
|
+
const parts = [];
|
|
62
|
+
if (data.skills.length)
|
|
63
|
+
parts.push(`${data.skills.length} skills`);
|
|
64
|
+
if (data.agents.length)
|
|
65
|
+
parts.push(`${data.agents.length} agents`);
|
|
66
|
+
if (data.commands.length)
|
|
67
|
+
parts.push(`${data.commands.length} commands`);
|
|
68
|
+
if (data.hooks.length)
|
|
69
|
+
parts.push(`${data.hooks.length} hooks`);
|
|
70
|
+
if (data.libs.length)
|
|
71
|
+
parts.push(`${data.libs.length} libs`);
|
|
72
|
+
return {
|
|
73
|
+
name,
|
|
74
|
+
marketplace: data.marketplace,
|
|
75
|
+
version: "",
|
|
76
|
+
description: parts.join(", "),
|
|
77
|
+
enabled: allEnabled,
|
|
78
|
+
skills: data.skills,
|
|
79
|
+
agents: data.agents,
|
|
80
|
+
commands: data.commands,
|
|
81
|
+
hooks: data.hooks,
|
|
82
|
+
libs: data.libs,
|
|
83
|
+
disabledItems: disabledList,
|
|
84
|
+
installPath: data.installPath,
|
|
85
|
+
};
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=plugin-state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-state.js","sourceRoot":"","sources":["../../src/core/plugin-state.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/** Component type to Claude Code directory + file extension mapping. */
|
|
2
|
+
export declare const PLUGIN_COMPONENT_DIRS: Record<string, {
|
|
3
|
+
dir: string;
|
|
4
|
+
ext: string;
|
|
5
|
+
subdir: string;
|
|
6
|
+
}>;
|
|
7
|
+
/** Get the expected symlink path for a plugin component. */
|
|
8
|
+
export declare function getSymlinkPath(type: string, name: string): string;
|
|
9
|
+
export interface TakenOverPlugin {
|
|
10
|
+
pluginId: string;
|
|
11
|
+
marketplace: string;
|
|
12
|
+
plugin: string;
|
|
13
|
+
version: string;
|
|
14
|
+
cachePath: string;
|
|
15
|
+
allSkills: string[];
|
|
16
|
+
enabledSkills: string[];
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Set a plugin's enabled state in ~/.claude/settings.json.
|
|
20
|
+
* Uses read-preserve-write to avoid clobbering other settings.
|
|
21
|
+
*/
|
|
22
|
+
export declare function setPluginEnabled(pluginId: string, enabled: boolean): Promise<void>;
|
|
23
|
+
/**
|
|
24
|
+
* Get all skill paths from a plugin's cache directory.
|
|
25
|
+
* Returns an array of absolute paths to skill directories (containing SKILL.md).
|
|
26
|
+
*/
|
|
27
|
+
export declare function getPluginSkillPaths(pluginId: string): Promise<string[]>;
|
|
28
|
+
/**
|
|
29
|
+
* Find the first enabled plugin containing a component name.
|
|
30
|
+
*/
|
|
31
|
+
export declare function getPluginForSkill(componentName: string): Promise<TakenOverPlugin | null>;
|
|
32
|
+
/**
|
|
33
|
+
* Find ALL enabled plugins containing a component name.
|
|
34
|
+
* Used when a component exists in multiple plugins — all must be taken over.
|
|
35
|
+
*/
|
|
36
|
+
export declare function getAllPluginsForComponent(componentName: string): Promise<TakenOverPlugin[]>;
|
|
37
|
+
/**
|
|
38
|
+
* Declarative plugin symlink sync — the SINGLE function that manages ALL
|
|
39
|
+
* plugin symlinks in ~/.claude/{skills,agents,commands}/.
|
|
40
|
+
*
|
|
41
|
+
* Reads the manifest to determine what SHOULD exist, then makes the
|
|
42
|
+
* filesystem match: creates missing symlinks, removes orphans.
|
|
43
|
+
*
|
|
44
|
+
* @param manifestDir - Path to the manifest directory (e.g. ~/.mycelium)
|
|
45
|
+
*/
|
|
46
|
+
export declare function syncPluginSymlinks(manifestDir?: string): Promise<{
|
|
47
|
+
created: string[];
|
|
48
|
+
removed: string[];
|
|
49
|
+
}>;
|
|
50
|
+
//# sourceMappingURL=plugin-takeover.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-takeover.d.ts","sourceRoot":"","sources":["../../src/core/plugin-takeover.ts"],"names":[],"mappings":"AA8BA,wEAAwE;AACxE,eAAO,MAAM,qBAAqB,EAAE,MAAM,CAAC,MAAM,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAI9F,CAAC;AAEF,4DAA4D;AAC5D,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAIjE;AAkBD,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB;AAgDD;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAMxF;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAW7E;AAmDD;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAG9F;AAED;;;GAGG;AACH,wBAAsB,yBAAyB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAEjG;AAED;;;;;;;;GAQG;AACH,wBAAsB,kBAAkB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAyEhH"}
|
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Plugin Takeover — disable a Claude Code plugin and symlink its components
|
|
3
|
+
* into the Claude Code directories so Mycelium manages them instead.
|
|
4
|
+
*
|
|
5
|
+
* syncPluginSymlinks() is the SINGLE function that manages all plugin symlinks.
|
|
6
|
+
* disable/enable commands only mutate state, then call syncPluginSymlinks().
|
|
7
|
+
*/
|
|
8
|
+
import * as fs from "node:fs/promises";
|
|
9
|
+
import * as path from "node:path";
|
|
10
|
+
import * as os from "node:os";
|
|
11
|
+
import { expandPath } from "@mycelish/core";
|
|
12
|
+
import { scanPluginComponents } from "./plugin-scanner.js";
|
|
13
|
+
import { createSkillSymlink, removeSkillSymlink } from "./symlink-manager.js";
|
|
14
|
+
import { readFileIfExists } from "./fs-helpers.js";
|
|
15
|
+
import { getDisabledItems, loadStateManifest } from "./manifest-state.js";
|
|
16
|
+
import { getTracer } from "./global-tracer.js";
|
|
17
|
+
// ============================================================================
|
|
18
|
+
// Constants
|
|
19
|
+
// ============================================================================
|
|
20
|
+
const CLAUDE_HOME = path.join(os.homedir(), ".claude");
|
|
21
|
+
const PLUGIN_CACHE_DIR = path.join(CLAUDE_HOME, "plugins", "cache");
|
|
22
|
+
const SETTINGS_PATH = path.join(CLAUDE_HOME, "settings.json");
|
|
23
|
+
// ============================================================================
|
|
24
|
+
// Shared Constants — single source of truth for component dirs + extensions
|
|
25
|
+
// ============================================================================
|
|
26
|
+
/** Component type to Claude Code directory + file extension mapping. */
|
|
27
|
+
export const PLUGIN_COMPONENT_DIRS = {
|
|
28
|
+
skill: { dir: path.join(CLAUDE_HOME, "skills"), ext: "", subdir: "skills" },
|
|
29
|
+
agent: { dir: path.join(CLAUDE_HOME, "agents"), ext: ".md", subdir: "agents" },
|
|
30
|
+
command: { dir: path.join(CLAUDE_HOME, "commands"), ext: ".md", subdir: "commands" },
|
|
31
|
+
};
|
|
32
|
+
/** Get the expected symlink path for a plugin component. */
|
|
33
|
+
export function getSymlinkPath(type, name) {
|
|
34
|
+
const info = PLUGIN_COMPONENT_DIRS[type];
|
|
35
|
+
if (!info)
|
|
36
|
+
throw new Error(`Unknown component type: ${type}`);
|
|
37
|
+
return path.join(info.dir, name + info.ext);
|
|
38
|
+
}
|
|
39
|
+
/** Get the source path for a plugin component in the cache. */
|
|
40
|
+
function getSourcePath(cachePath, type, name, componentPath) {
|
|
41
|
+
const info = PLUGIN_COMPONENT_DIRS[type];
|
|
42
|
+
if (!info)
|
|
43
|
+
throw new Error(`Unknown component type: ${type}`);
|
|
44
|
+
if (type === "skill") {
|
|
45
|
+
// Skills: symlink the directory containing SKILL.md
|
|
46
|
+
return componentPath ? path.dirname(componentPath) : path.join(cachePath, info.subdir, name);
|
|
47
|
+
}
|
|
48
|
+
// Agents/Commands: symlink the .md file itself
|
|
49
|
+
return componentPath ?? path.join(cachePath, info.subdir, name + info.ext);
|
|
50
|
+
}
|
|
51
|
+
// ============================================================================
|
|
52
|
+
// Helpers
|
|
53
|
+
// ============================================================================
|
|
54
|
+
/** Parse pluginId "{plugin}@{marketplace}" */
|
|
55
|
+
function parsePluginId(pluginId) {
|
|
56
|
+
const atIdx = pluginId.lastIndexOf("@");
|
|
57
|
+
if (atIdx <= 0)
|
|
58
|
+
throw new Error(`Invalid plugin ID format: ${pluginId}`);
|
|
59
|
+
return {
|
|
60
|
+
plugin: pluginId.slice(0, atIdx),
|
|
61
|
+
marketplace: pluginId.slice(atIdx + 1),
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
/** Find the latest version directory for a plugin in the cache. */
|
|
65
|
+
async function findLatestVersion(pluginDir) {
|
|
66
|
+
try {
|
|
67
|
+
const entries = await fs.readdir(pluginDir, { withFileTypes: true });
|
|
68
|
+
const versions = entries.filter((e) => e.isDirectory()).map((e) => e.name).sort();
|
|
69
|
+
return versions[versions.length - 1] ?? null;
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
return null;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
/** Read settings.json, preserving all fields. */
|
|
76
|
+
async function readSettings() {
|
|
77
|
+
const raw = await readFileIfExists(SETTINGS_PATH);
|
|
78
|
+
if (!raw)
|
|
79
|
+
return {};
|
|
80
|
+
try {
|
|
81
|
+
return JSON.parse(raw);
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
return {};
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
/** Write settings.json, preserving formatting. */
|
|
88
|
+
async function writeSettings(settings) {
|
|
89
|
+
await fs.mkdir(path.dirname(SETTINGS_PATH), { recursive: true });
|
|
90
|
+
await fs.writeFile(SETTINGS_PATH, JSON.stringify(settings, null, 2) + "\n", "utf-8");
|
|
91
|
+
}
|
|
92
|
+
// ============================================================================
|
|
93
|
+
// Public API
|
|
94
|
+
// ============================================================================
|
|
95
|
+
/**
|
|
96
|
+
* Set a plugin's enabled state in ~/.claude/settings.json.
|
|
97
|
+
* Uses read-preserve-write to avoid clobbering other settings.
|
|
98
|
+
*/
|
|
99
|
+
export async function setPluginEnabled(pluginId, enabled) {
|
|
100
|
+
const settings = await readSettings();
|
|
101
|
+
const plugins = settings.enabledPlugins ?? {};
|
|
102
|
+
plugins[pluginId] = enabled;
|
|
103
|
+
settings.enabledPlugins = plugins;
|
|
104
|
+
await writeSettings(settings);
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Get all skill paths from a plugin's cache directory.
|
|
108
|
+
* Returns an array of absolute paths to skill directories (containing SKILL.md).
|
|
109
|
+
*/
|
|
110
|
+
export async function getPluginSkillPaths(pluginId) {
|
|
111
|
+
const { plugin, marketplace } = parsePluginId(pluginId);
|
|
112
|
+
const pluginDir = path.join(PLUGIN_CACHE_DIR, marketplace, plugin);
|
|
113
|
+
const version = await findLatestVersion(pluginDir);
|
|
114
|
+
if (!version)
|
|
115
|
+
return [];
|
|
116
|
+
const versionRoot = path.join(pluginDir, version);
|
|
117
|
+
const components = await scanPluginComponents(versionRoot, plugin, marketplace);
|
|
118
|
+
return components
|
|
119
|
+
.filter((c) => c.type === "skill")
|
|
120
|
+
.map((c) => path.dirname(c.path)); // skill dir, not SKILL.md
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Scan the plugin cache for enabled plugins containing a component.
|
|
124
|
+
* Shared logic for getPluginForSkill and getAllPluginsForComponent.
|
|
125
|
+
*/
|
|
126
|
+
async function findPluginsWithComponent(componentName) {
|
|
127
|
+
const settings = await readSettings();
|
|
128
|
+
const enabledPlugins = settings.enabledPlugins ?? {};
|
|
129
|
+
const matches = [];
|
|
130
|
+
try {
|
|
131
|
+
const marketplaces = await fs.readdir(PLUGIN_CACHE_DIR, { withFileTypes: true });
|
|
132
|
+
for (const mp of marketplaces) {
|
|
133
|
+
if (!mp.isDirectory())
|
|
134
|
+
continue;
|
|
135
|
+
const mpDir = path.join(PLUGIN_CACHE_DIR, mp.name);
|
|
136
|
+
const plugins = await fs.readdir(mpDir, { withFileTypes: true });
|
|
137
|
+
for (const pl of plugins) {
|
|
138
|
+
if (!pl.isDirectory())
|
|
139
|
+
continue;
|
|
140
|
+
const plDir = path.join(mpDir, pl.name);
|
|
141
|
+
const version = await findLatestVersion(plDir);
|
|
142
|
+
if (!version)
|
|
143
|
+
continue;
|
|
144
|
+
const pluginId = `${pl.name}@${mp.name}`;
|
|
145
|
+
if (enabledPlugins[pluginId] === false)
|
|
146
|
+
continue;
|
|
147
|
+
const versionRoot = path.join(plDir, version);
|
|
148
|
+
const components = await scanPluginComponents(versionRoot, pl.name, mp.name);
|
|
149
|
+
if (components.some((c) => c.name === componentName)) {
|
|
150
|
+
const skills = components.filter((c) => c.type === "skill").map((c) => c.name);
|
|
151
|
+
matches.push({
|
|
152
|
+
pluginId,
|
|
153
|
+
marketplace: mp.name,
|
|
154
|
+
plugin: pl.name,
|
|
155
|
+
version,
|
|
156
|
+
cachePath: versionRoot,
|
|
157
|
+
allSkills: skills,
|
|
158
|
+
enabledSkills: skills,
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
catch {
|
|
165
|
+
// cache doesn't exist
|
|
166
|
+
}
|
|
167
|
+
return matches;
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Find the first enabled plugin containing a component name.
|
|
171
|
+
*/
|
|
172
|
+
export async function getPluginForSkill(componentName) {
|
|
173
|
+
const matches = await findPluginsWithComponent(componentName);
|
|
174
|
+
return matches[0] ?? null;
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Find ALL enabled plugins containing a component name.
|
|
178
|
+
* Used when a component exists in multiple plugins — all must be taken over.
|
|
179
|
+
*/
|
|
180
|
+
export async function getAllPluginsForComponent(componentName) {
|
|
181
|
+
return findPluginsWithComponent(componentName);
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Declarative plugin symlink sync — the SINGLE function that manages ALL
|
|
185
|
+
* plugin symlinks in ~/.claude/{skills,agents,commands}/.
|
|
186
|
+
*
|
|
187
|
+
* Reads the manifest to determine what SHOULD exist, then makes the
|
|
188
|
+
* filesystem match: creates missing symlinks, removes orphans.
|
|
189
|
+
*
|
|
190
|
+
* @param manifestDir - Path to the manifest directory (e.g. ~/.mycelium)
|
|
191
|
+
*/
|
|
192
|
+
export async function syncPluginSymlinks(manifestDir) {
|
|
193
|
+
const dir = manifestDir ?? expandPath("~/.mycelium");
|
|
194
|
+
const manifest = await loadStateManifest(dir);
|
|
195
|
+
if (!manifest?.takenOverPlugins || Object.keys(manifest.takenOverPlugins).length === 0) {
|
|
196
|
+
return { created: [], removed: [] };
|
|
197
|
+
}
|
|
198
|
+
const log = getTracer().createTrace("plugin-sync");
|
|
199
|
+
const disabledItems = await getDisabledItems(dir);
|
|
200
|
+
// Build expected symlinks: Map<symlinkPath, sourcePath>
|
|
201
|
+
const expectedSymlinks = new Map();
|
|
202
|
+
for (const [pluginId, pluginInfo] of Object.entries(manifest.takenOverPlugins)) {
|
|
203
|
+
try {
|
|
204
|
+
const components = await scanPluginComponents(pluginInfo.cachePath);
|
|
205
|
+
for (const comp of components) {
|
|
206
|
+
if (!(comp.type in PLUGIN_COMPONENT_DIRS))
|
|
207
|
+
continue;
|
|
208
|
+
if (disabledItems.has(comp.name))
|
|
209
|
+
continue;
|
|
210
|
+
const symlinkPath = getSymlinkPath(comp.type, comp.name);
|
|
211
|
+
const sourcePath = getSourcePath(pluginInfo.cachePath, comp.type, comp.name, comp.path);
|
|
212
|
+
expectedSymlinks.set(symlinkPath, sourcePath);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
catch (err) {
|
|
216
|
+
log.warn({ scope: "plugin", op: "scan", msg: `Failed to scan plugin cache for ${pluginId}: ${err.message}`, item: pluginId });
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
const created = [];
|
|
220
|
+
const removed = [];
|
|
221
|
+
// Create missing symlinks
|
|
222
|
+
for (const [symlinkPath, sourcePath] of expectedSymlinks) {
|
|
223
|
+
const result = await createSkillSymlink(sourcePath, symlinkPath);
|
|
224
|
+
if (result.success && result.action === "created") {
|
|
225
|
+
const name = path.basename(symlinkPath);
|
|
226
|
+
created.push(name);
|
|
227
|
+
// Proposal 1: log each symlink individually with itemType
|
|
228
|
+
const type = Object.entries(PLUGIN_COMPONENT_DIRS).find(([, v]) => symlinkPath.startsWith(v.dir))?.[0];
|
|
229
|
+
log.info({ scope: "plugin", op: "symlink-create", msg: `Created symlink: ${name}`, item: name.replace(/\.md$/, ""), itemType: type, path: symlinkPath });
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
// Remove orphans: symlinks in component dirs that point into plugin cache but aren't expected
|
|
233
|
+
for (const [type, { dir: componentDir }] of Object.entries(PLUGIN_COMPONENT_DIRS)) {
|
|
234
|
+
try {
|
|
235
|
+
const entries = await fs.readdir(componentDir, { withFileTypes: true });
|
|
236
|
+
for (const entry of entries) {
|
|
237
|
+
if (!entry.isSymbolicLink())
|
|
238
|
+
continue;
|
|
239
|
+
const fullPath = path.join(componentDir, entry.name);
|
|
240
|
+
try {
|
|
241
|
+
const target = await fs.readlink(fullPath);
|
|
242
|
+
if (target.startsWith(PLUGIN_CACHE_DIR) && !expectedSymlinks.has(fullPath)) {
|
|
243
|
+
await removeSkillSymlink(fullPath);
|
|
244
|
+
removed.push(entry.name);
|
|
245
|
+
// Proposal 1: log each removal individually with itemType
|
|
246
|
+
log.info({ scope: "plugin", op: "symlink-remove", msg: `Removed orphan symlink: ${entry.name}`, item: entry.name.replace(/\.md$/, ""), itemType: type, path: fullPath });
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
catch (err) {
|
|
250
|
+
log.warn({ scope: "plugin", op: "symlink", msg: `Failed to read symlink ${fullPath}: ${err.message}`, path: fullPath });
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
catch {
|
|
255
|
+
// dir doesn't exist — expected for tools that don't use this component type
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
if (created.length > 0 || removed.length > 0) {
|
|
259
|
+
log.info({ scope: "plugin", op: "sync", msg: `Plugin symlinks synced: ${created.length} created, ${removed.length} removed` });
|
|
260
|
+
}
|
|
261
|
+
return { created, removed };
|
|
262
|
+
}
|
|
263
|
+
//# sourceMappingURL=plugin-takeover.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-takeover.js","sourceRoot":"","sources":["../../src/core/plugin-takeover.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-takeover.test.d.ts","sourceRoot":"","sources":["../../src/core/plugin-takeover.test.ts"],"names":[],"mappings":""}
|