@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,131 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach, afterEach } from "vitest";
|
|
2
|
+
import * as fs from "node:fs/promises";
|
|
3
|
+
import * as path from "node:path";
|
|
4
|
+
import * as os from "node:os";
|
|
5
|
+
import { syncFilesToDir } from "./file-syncer.js";
|
|
6
|
+
let tmpDir;
|
|
7
|
+
let sourceDir;
|
|
8
|
+
let targetDir;
|
|
9
|
+
beforeEach(async () => {
|
|
10
|
+
tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), "file-syncer-"));
|
|
11
|
+
sourceDir = path.join(tmpDir, "source");
|
|
12
|
+
targetDir = path.join(tmpDir, "target");
|
|
13
|
+
await fs.mkdir(sourceDir, { recursive: true });
|
|
14
|
+
});
|
|
15
|
+
afterEach(async () => {
|
|
16
|
+
await fs.rm(tmpDir, { recursive: true, force: true });
|
|
17
|
+
});
|
|
18
|
+
async function createSource(name, content = "hello") {
|
|
19
|
+
const p = path.join(sourceDir, name);
|
|
20
|
+
await fs.writeFile(p, content);
|
|
21
|
+
return p;
|
|
22
|
+
}
|
|
23
|
+
describe("syncFilesToDir — symlink strategy", () => {
|
|
24
|
+
const strategy = { type: "symlink" };
|
|
25
|
+
it("creates symlinks for enabled items", async () => {
|
|
26
|
+
const src = await createSource("agent.md");
|
|
27
|
+
const items = [{ name: "agent", path: src }];
|
|
28
|
+
const result = await syncFilesToDir(items, targetDir, strategy);
|
|
29
|
+
expect(result.success).toBe(true);
|
|
30
|
+
expect(result.created).toEqual(["agent"]);
|
|
31
|
+
const link = await fs.readlink(path.join(targetDir, "agent.md"));
|
|
32
|
+
expect(link).toBe(src);
|
|
33
|
+
});
|
|
34
|
+
it("reports unchanged on re-sync", async () => {
|
|
35
|
+
const src = await createSource("a.md");
|
|
36
|
+
const items = [{ name: "a", path: src }];
|
|
37
|
+
await syncFilesToDir(items, targetDir, strategy);
|
|
38
|
+
const result = await syncFilesToDir(items, targetDir, strategy);
|
|
39
|
+
expect(result.unchanged).toEqual(["a"]);
|
|
40
|
+
});
|
|
41
|
+
it("updates symlink when source changes", async () => {
|
|
42
|
+
const src1 = await createSource("a.md", "v1");
|
|
43
|
+
const src2 = await createSource("b.md", "v2");
|
|
44
|
+
const items1 = [{ name: "x", path: src1 }];
|
|
45
|
+
await syncFilesToDir(items1, targetDir, strategy);
|
|
46
|
+
// Point same target file to different source
|
|
47
|
+
const target = path.join(targetDir, "a.md");
|
|
48
|
+
const items2 = [{ name: "x", path: src2 }];
|
|
49
|
+
// Since target filename comes from item.path basename, we need same filename
|
|
50
|
+
// Let's test with a renamed source
|
|
51
|
+
const src3 = path.join(sourceDir, "a.md.v2");
|
|
52
|
+
await fs.writeFile(src3, "v2");
|
|
53
|
+
// Actually re-sync pointing to same basename but different realpath
|
|
54
|
+
// Simplify: just verify update path by changing the symlink target
|
|
55
|
+
await fs.unlink(target);
|
|
56
|
+
await fs.symlink("/nonexistent", target);
|
|
57
|
+
const result = await syncFilesToDir(items1, targetDir, strategy);
|
|
58
|
+
expect(result.updated).toEqual(["x"]);
|
|
59
|
+
});
|
|
60
|
+
it("removes symlink for disabled items", async () => {
|
|
61
|
+
const src = await createSource("a.md");
|
|
62
|
+
const items = [{ name: "a", path: src }];
|
|
63
|
+
await syncFilesToDir(items, targetDir, strategy);
|
|
64
|
+
const disabled = [{ name: "a", path: src, state: "disabled" }];
|
|
65
|
+
const result = await syncFilesToDir(disabled, targetDir, strategy);
|
|
66
|
+
expect(result.removed).toContain("a");
|
|
67
|
+
});
|
|
68
|
+
it("removes orphaned symlinks", async () => {
|
|
69
|
+
const src = await createSource("a.md");
|
|
70
|
+
// Create an orphan symlink
|
|
71
|
+
await fs.mkdir(targetDir, { recursive: true });
|
|
72
|
+
await fs.symlink("/tmp/fake", path.join(targetDir, "orphan.md"));
|
|
73
|
+
const items = [{ name: "a", path: src }];
|
|
74
|
+
const result = await syncFilesToDir(items, targetDir, strategy, {
|
|
75
|
+
removeOrphans: true,
|
|
76
|
+
});
|
|
77
|
+
expect(result.removed).toContain("orphan.md");
|
|
78
|
+
});
|
|
79
|
+
it("does not remove non-symlink orphans in symlink mode", async () => {
|
|
80
|
+
await fs.mkdir(targetDir, { recursive: true });
|
|
81
|
+
await fs.writeFile(path.join(targetDir, "real.md"), "keep me");
|
|
82
|
+
const result = await syncFilesToDir([], targetDir, strategy, {
|
|
83
|
+
removeOrphans: true,
|
|
84
|
+
});
|
|
85
|
+
expect(result.removed).not.toContain("real.md");
|
|
86
|
+
// File should still exist
|
|
87
|
+
const content = await fs.readFile(path.join(targetDir, "real.md"), "utf8");
|
|
88
|
+
expect(content).toBe("keep me");
|
|
89
|
+
});
|
|
90
|
+
});
|
|
91
|
+
describe("syncFilesToDir — copy strategy", () => {
|
|
92
|
+
const strategy = { type: "copy" };
|
|
93
|
+
it("copies files for enabled items", async () => {
|
|
94
|
+
const src = await createSource("rule.yaml", "content: true");
|
|
95
|
+
const items = [{ name: "rule", path: src }];
|
|
96
|
+
const result = await syncFilesToDir(items, targetDir, strategy);
|
|
97
|
+
expect(result.success).toBe(true);
|
|
98
|
+
expect(result.created).toEqual(["rule"]);
|
|
99
|
+
const content = await fs.readFile(path.join(targetDir, "rule.yaml"), "utf8");
|
|
100
|
+
expect(content).toBe("content: true");
|
|
101
|
+
});
|
|
102
|
+
it("updates copy when source is newer", async () => {
|
|
103
|
+
const src = await createSource("r.md", "v1");
|
|
104
|
+
const items = [{ name: "r", path: src }];
|
|
105
|
+
await syncFilesToDir(items, targetDir, strategy);
|
|
106
|
+
// Make source newer
|
|
107
|
+
await new Promise((r) => setTimeout(r, 50));
|
|
108
|
+
await fs.writeFile(src, "v2");
|
|
109
|
+
const result = await syncFilesToDir(items, targetDir, strategy);
|
|
110
|
+
expect(result.updated).toEqual(["r"]);
|
|
111
|
+
const content = await fs.readFile(path.join(targetDir, "r.md"), "utf8");
|
|
112
|
+
expect(content).toBe("v2");
|
|
113
|
+
});
|
|
114
|
+
it("removes file for deleted items", async () => {
|
|
115
|
+
const src = await createSource("a.md");
|
|
116
|
+
const items = [{ name: "a", path: src }];
|
|
117
|
+
await syncFilesToDir(items, targetDir, strategy);
|
|
118
|
+
const deleted = [{ name: "a", path: src, state: "deleted" }];
|
|
119
|
+
const result = await syncFilesToDir(deleted, targetDir, strategy);
|
|
120
|
+
expect(result.removed).toContain("a");
|
|
121
|
+
});
|
|
122
|
+
it("removes orphan files in copy mode", async () => {
|
|
123
|
+
await fs.mkdir(targetDir, { recursive: true });
|
|
124
|
+
await fs.writeFile(path.join(targetDir, "orphan.md"), "old");
|
|
125
|
+
const result = await syncFilesToDir([], targetDir, strategy, {
|
|
126
|
+
removeOrphans: true,
|
|
127
|
+
});
|
|
128
|
+
expect(result.removed).toContain("orphan.md");
|
|
129
|
+
});
|
|
130
|
+
});
|
|
131
|
+
//# sourceMappingURL=file-syncer.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-syncer.test.js","sourceRoot":"","sources":["../../src/core/file-syncer.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACrE,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,cAAc,EAAqB,MAAM,kBAAkB,CAAC;AAErE,IAAI,MAAc,CAAC;AACnB,IAAI,SAAiB,CAAC;AACtB,IAAI,SAAiB,CAAC;AAEtB,UAAU,CAAC,KAAK,IAAI,EAAE;IACpB,MAAM,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,cAAc,CAAC,CAAC,CAAC;IAClE,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACxC,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACxC,MAAM,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AACjD,CAAC,CAAC,CAAC;AAEH,SAAS,CAAC,KAAK,IAAI,EAAE;IACnB,MAAM,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AACxD,CAAC,CAAC,CAAC;AAEH,KAAK,UAAU,YAAY,CAAC,IAAY,EAAE,OAAO,GAAG,OAAO;IACzD,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IACrC,MAAM,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IAC/B,OAAO,CAAC,CAAC;AACX,CAAC;AAED,QAAQ,CAAC,mCAAmC,EAAE,GAAG,EAAE;IACjD,MAAM,QAAQ,GAAG,EAAE,IAAI,EAAE,SAAkB,EAAE,CAAC;IAE9C,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;QAClD,MAAM,GAAG,GAAG,MAAM,YAAY,CAAC,UAAU,CAAC,CAAC;QAC3C,MAAM,KAAK,GAAmB,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;QAE7D,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;QAEhE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;QAC1C,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC;QACjE,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8BAA8B,EAAE,KAAK,IAAI,EAAE;QAC5C,MAAM,GAAG,GAAG,MAAM,YAAY,CAAC,MAAM,CAAC,CAAC;QACvC,MAAM,KAAK,GAAmB,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;QAEzD,MAAM,cAAc,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;QACjD,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;QAEhE,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;QACnD,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAC9C,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAC9C,MAAM,MAAM,GAAmB,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAE3D,MAAM,cAAc,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;QAElD,6CAA6C;QAC7C,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QAC5C,MAAM,MAAM,GAAmB,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3D,6EAA6E;QAC7E,mCAAmC;QACnC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QAC7C,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAE/B,oEAAoE;QACpE,mEAAmE;QACnE,MAAM,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACxB,MAAM,EAAE,CAAC,OAAO,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;QAEzC,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;QACjE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;QAClD,MAAM,GAAG,GAAG,MAAM,YAAY,CAAC,MAAM,CAAC,CAAC;QACvC,MAAM,KAAK,GAAmB,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;QACzD,MAAM,cAAc,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;QAEjD,MAAM,QAAQ,GAAmB,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC;QAC/E,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;QAEnE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2BAA2B,EAAE,KAAK,IAAI,EAAE;QACzC,MAAM,GAAG,GAAG,MAAM,YAAY,CAAC,MAAM,CAAC,CAAC;QACvC,2BAA2B;QAC3B,MAAM,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/C,MAAM,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC,CAAC;QAEjE,MAAM,KAAK,GAAmB,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;QACzD,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE;YAC9D,aAAa,EAAE,IAAI;SACpB,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;QACnE,MAAM,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/C,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,CAAC;QAE/D,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE;YAC3D,aAAa,EAAE,IAAI;SACpB,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QAChD,0BAA0B;QAC1B,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,EAAE,MAAM,CAAC,CAAC;QAC3E,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,gCAAgC,EAAE,GAAG,EAAE;IAC9C,MAAM,QAAQ,GAAG,EAAE,IAAI,EAAE,MAAe,EAAE,CAAC;IAE3C,EAAE,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;QAC9C,MAAM,GAAG,GAAG,MAAM,YAAY,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC;QAC7D,MAAM,KAAK,GAAmB,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;QAE5D,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;QAEhE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;QACzC,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAC/B,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,EACjC,MAAM,CACP,CAAC;QACF,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;QACjD,MAAM,GAAG,GAAG,MAAM,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAC7C,MAAM,KAAK,GAAmB,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;QAEzD,MAAM,cAAc,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;QAEjD,oBAAoB;QACpB,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QAC5C,MAAM,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAE9B,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;QAChE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAEtC,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC;QACxE,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;QAC9C,MAAM,GAAG,GAAG,MAAM,YAAY,CAAC,MAAM,CAAC,CAAC;QACvC,MAAM,KAAK,GAAmB,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;QACzD,MAAM,cAAc,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;QAEjD,MAAM,OAAO,GAAmB,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QAC7E,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;QAClE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;QACjD,MAAM,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/C,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,EAAE,KAAK,CAAC,CAAC;QAE7D,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE;YAC3D,aAAa,EAAE,IAAI;SACpB,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"global-tracer.d.ts","sourceRoot":"","sources":["../../src/core/global-tracer.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AASrC,wBAAgB,SAAS,IAAI,MAAM,CAQlC;AAED,wBAAgB,WAAW,IAAI,IAAI,CAMlC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import os from "node:os";
|
|
3
|
+
import { Tracer } from "./tracer.js";
|
|
4
|
+
const MYCELIUM_DIR = path.join(os.homedir(), ".mycelium");
|
|
5
|
+
const TRACES_DIR = path.join(MYCELIUM_DIR, "traces");
|
|
6
|
+
const DB_PATH = path.join(TRACES_DIR, "trace.db");
|
|
7
|
+
const SNAPSHOT_DIR = path.join(TRACES_DIR, "snapshots");
|
|
8
|
+
let _tracer = null;
|
|
9
|
+
export function getTracer() {
|
|
10
|
+
if (!_tracer) {
|
|
11
|
+
_tracer = new Tracer(DB_PATH, {
|
|
12
|
+
snapshotDir: SNAPSHOT_DIR,
|
|
13
|
+
debugMode: process.argv.includes("--debug"),
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
return _tracer;
|
|
17
|
+
}
|
|
18
|
+
export function closeTracer() {
|
|
19
|
+
if (_tracer) {
|
|
20
|
+
_tracer.vacuum();
|
|
21
|
+
_tracer.close();
|
|
22
|
+
_tracer = null;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
// Auto-vacuum on process exit
|
|
26
|
+
process.on("exit", () => {
|
|
27
|
+
if (_tracer) {
|
|
28
|
+
try {
|
|
29
|
+
_tracer.vacuum();
|
|
30
|
+
_tracer.close();
|
|
31
|
+
}
|
|
32
|
+
catch { /* ignore */ }
|
|
33
|
+
_tracer = null;
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
//# sourceMappingURL=global-tracer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"global-tracer.js","sourceRoot":"","sources":["../../src/core/global-tracer.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,WAAW,CAAC,CAAC;AAC1D,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;AACrD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;AAClD,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;AAExD,IAAI,OAAO,GAAkB,IAAI,CAAC;AAElC,MAAM,UAAU,SAAS;IACvB,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,GAAG,IAAI,MAAM,CAAC,OAAO,EAAE;YAC5B,WAAW,EAAE,YAAY;YACzB,SAAS,EAAE,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC;SAC5C,CAAC,CAAC;IACL,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,CAAC,MAAM,EAAE,CAAC;QACjB,OAAO,CAAC,KAAK,EAAE,CAAC;QAChB,OAAO,GAAG,IAAI,CAAC;IACjB,CAAC;AACH,CAAC;AAED,8BAA8B;AAC9B,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE;IACtB,IAAI,OAAO,EAAE,CAAC;QACZ,IAAI,CAAC;YAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;QACjE,OAAO,GAAG,IAAI,CAAC;IACjB,CAAC;AACH,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Item Loader for Mycelium
|
|
3
|
+
*
|
|
4
|
+
* Scans a directory for items (agents, rules, commands, etc.)
|
|
5
|
+
* and returns structured LoadedItem entries.
|
|
6
|
+
*/
|
|
7
|
+
import type { ItemState } from "@mycelish/core";
|
|
8
|
+
export interface LoadedItem {
|
|
9
|
+
name: string;
|
|
10
|
+
path: string;
|
|
11
|
+
state?: ItemState;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Scan a directory for items. Returns LoadedItem[] with name derived from filename.
|
|
15
|
+
* Returns [] if directory does not exist.
|
|
16
|
+
*/
|
|
17
|
+
export declare function loadItemsFromDir(dir: string, extensions?: string[]): Promise<LoadedItem[]>;
|
|
18
|
+
//# sourceMappingURL=item-loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"item-loader.d.ts","sourceRoot":"","sources":["../../src/core/item-loader.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAMhD,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,SAAS,CAAC;CACnB;AAQD;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,MAAM,EACX,UAAU,CAAC,EAAE,MAAM,EAAE,GACpB,OAAO,CAAC,UAAU,EAAE,CAAC,CAyBvB"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Item Loader for Mycelium
|
|
3
|
+
*
|
|
4
|
+
* Scans a directory for items (agents, rules, commands, etc.)
|
|
5
|
+
* and returns structured LoadedItem entries.
|
|
6
|
+
*/
|
|
7
|
+
import * as fs from "node:fs/promises";
|
|
8
|
+
import * as path from "node:path";
|
|
9
|
+
// ============================================================================
|
|
10
|
+
// Core
|
|
11
|
+
// ============================================================================
|
|
12
|
+
const DEFAULT_EXTENSIONS = [".md", ".yaml", ".yml"];
|
|
13
|
+
/**
|
|
14
|
+
* Scan a directory for items. Returns LoadedItem[] with name derived from filename.
|
|
15
|
+
* Returns [] if directory does not exist.
|
|
16
|
+
*/
|
|
17
|
+
export async function loadItemsFromDir(dir, extensions) {
|
|
18
|
+
const exts = extensions ?? DEFAULT_EXTENSIONS;
|
|
19
|
+
let entries;
|
|
20
|
+
try {
|
|
21
|
+
entries = await fs.readdir(dir);
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
return [];
|
|
25
|
+
}
|
|
26
|
+
const items = [];
|
|
27
|
+
for (const entry of entries) {
|
|
28
|
+
if (entry.startsWith("."))
|
|
29
|
+
continue;
|
|
30
|
+
const ext = path.extname(entry).toLowerCase();
|
|
31
|
+
if (exts.length > 0 && !exts.includes(ext))
|
|
32
|
+
continue;
|
|
33
|
+
items.push({
|
|
34
|
+
name: path.parse(entry).name,
|
|
35
|
+
path: path.join(dir, entry),
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
return items;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=item-loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"item-loader.js","sourceRoot":"","sources":["../../src/core/item-loader.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAalC,+EAA+E;AAC/E,OAAO;AACP,+EAA+E;AAE/E,MAAM,kBAAkB,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;AAEpD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,GAAW,EACX,UAAqB;IAErB,MAAM,IAAI,GAAG,UAAU,IAAI,kBAAkB,CAAC;IAE9C,IAAI,OAAiB,CAAC;IACtB,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,KAAK,GAAiB,EAAE,CAAC;IAE/B,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS;QAEpC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;QAC9C,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,SAAS;QAErD,KAAK,CAAC,IAAI,CAAC;YACT,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI;YAC5B,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC;SAC5B,CAAC,CAAC;IACL,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"item-loader.test.d.ts","sourceRoot":"","sources":["../../src/core/item-loader.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach, afterEach } from "vitest";
|
|
2
|
+
import * as fs from "node:fs/promises";
|
|
3
|
+
import * as path from "node:path";
|
|
4
|
+
import * as os from "node:os";
|
|
5
|
+
import { loadItemsFromDir } from "./item-loader.js";
|
|
6
|
+
let tmpDir;
|
|
7
|
+
beforeEach(async () => {
|
|
8
|
+
tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), "item-loader-"));
|
|
9
|
+
});
|
|
10
|
+
afterEach(async () => {
|
|
11
|
+
await fs.rm(tmpDir, { recursive: true, force: true });
|
|
12
|
+
});
|
|
13
|
+
describe("loadItemsFromDir", () => {
|
|
14
|
+
it("loads .md, .yaml, .yml files by default", async () => {
|
|
15
|
+
await fs.writeFile(path.join(tmpDir, "agent.md"), "# Agent");
|
|
16
|
+
await fs.writeFile(path.join(tmpDir, "config.yaml"), "key: val");
|
|
17
|
+
await fs.writeFile(path.join(tmpDir, "rules.yml"), "rules:");
|
|
18
|
+
await fs.writeFile(path.join(tmpDir, "ignore.txt"), "nope");
|
|
19
|
+
const items = await loadItemsFromDir(tmpDir);
|
|
20
|
+
expect(items).toHaveLength(3);
|
|
21
|
+
const names = items.map((i) => i.name).sort();
|
|
22
|
+
expect(names).toEqual(["agent", "config", "rules"]);
|
|
23
|
+
});
|
|
24
|
+
it("returns full paths", async () => {
|
|
25
|
+
await fs.writeFile(path.join(tmpDir, "a.md"), "");
|
|
26
|
+
const items = await loadItemsFromDir(tmpDir);
|
|
27
|
+
expect(items[0].path).toBe(path.join(tmpDir, "a.md"));
|
|
28
|
+
});
|
|
29
|
+
it("skips hidden files", async () => {
|
|
30
|
+
await fs.writeFile(path.join(tmpDir, ".hidden.md"), "");
|
|
31
|
+
await fs.writeFile(path.join(tmpDir, "visible.md"), "");
|
|
32
|
+
const items = await loadItemsFromDir(tmpDir);
|
|
33
|
+
expect(items).toHaveLength(1);
|
|
34
|
+
expect(items[0].name).toBe("visible");
|
|
35
|
+
});
|
|
36
|
+
it("returns empty array for missing directory", async () => {
|
|
37
|
+
const items = await loadItemsFromDir("/tmp/nonexistent-dir-xyz");
|
|
38
|
+
expect(items).toEqual([]);
|
|
39
|
+
});
|
|
40
|
+
it("returns empty array for empty directory", async () => {
|
|
41
|
+
const items = await loadItemsFromDir(tmpDir);
|
|
42
|
+
expect(items).toEqual([]);
|
|
43
|
+
});
|
|
44
|
+
it("filters by custom extensions", async () => {
|
|
45
|
+
await fs.writeFile(path.join(tmpDir, "a.json"), "{}");
|
|
46
|
+
await fs.writeFile(path.join(tmpDir, "b.md"), "");
|
|
47
|
+
const items = await loadItemsFromDir(tmpDir, [".json"]);
|
|
48
|
+
expect(items).toHaveLength(1);
|
|
49
|
+
expect(items[0].name).toBe("a");
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
//# sourceMappingURL=item-loader.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"item-loader.test.js","sourceRoot":"","sources":["../../src/core/item-loader.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Manifest Migrator — converts v1 manifest (enabled: boolean) to v2 (state: ItemState)
|
|
3
|
+
*/
|
|
4
|
+
export interface V1ManifestConfig {
|
|
5
|
+
version?: string;
|
|
6
|
+
skills?: Record<string, Record<string, unknown>>;
|
|
7
|
+
mcps?: Record<string, Record<string, unknown>>;
|
|
8
|
+
hooks?: Record<string, Record<string, unknown>>;
|
|
9
|
+
memory?: Record<string, Record<string, unknown>>;
|
|
10
|
+
[key: string]: unknown;
|
|
11
|
+
}
|
|
12
|
+
type PluginSkillsConfig = Record<string, Record<string, boolean>>;
|
|
13
|
+
export declare function migrateManifestV1ToV2(v1: V1ManifestConfig, pluginSkills?: PluginSkillsConfig): V1ManifestConfig;
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=manifest-migrator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest-migrator.d.ts","sourceRoot":"","sources":["../../src/core/manifest-migrator.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACjD,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAC/C,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAChD,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACjD,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,KAAK,kBAAkB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AAElE,wBAAgB,qBAAqB,CACnC,EAAE,EAAE,gBAAgB,EACpB,YAAY,CAAC,EAAE,kBAAkB,GAChC,gBAAgB,CAmClB"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Manifest Migrator — converts v1 manifest (enabled: boolean) to v2 (state: ItemState)
|
|
3
|
+
*/
|
|
4
|
+
export function migrateManifestV1ToV2(v1, pluginSkills) {
|
|
5
|
+
const result = structuredClone(v1);
|
|
6
|
+
for (const section of ["skills", "mcps", "hooks", "memory"]) {
|
|
7
|
+
const items = result[section];
|
|
8
|
+
if (!items || typeof items !== "object")
|
|
9
|
+
continue;
|
|
10
|
+
for (const [_name, config] of Object.entries(items)) {
|
|
11
|
+
// Convert enabled to state
|
|
12
|
+
if (config.enabled === false) {
|
|
13
|
+
config.state = "disabled";
|
|
14
|
+
}
|
|
15
|
+
else {
|
|
16
|
+
config.state = "enabled";
|
|
17
|
+
}
|
|
18
|
+
delete config.enabled;
|
|
19
|
+
// Add source from pluginName or default to "manual"
|
|
20
|
+
if (!config.source) {
|
|
21
|
+
config.source = config.pluginName ?? "manual";
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
// Import plugin-skills.json overrides
|
|
26
|
+
if (pluginSkills) {
|
|
27
|
+
for (const [_pluginName, skills] of Object.entries(pluginSkills)) {
|
|
28
|
+
for (const [skillName, enabled] of Object.entries(skills)) {
|
|
29
|
+
const skillsSection = result.skills;
|
|
30
|
+
if (skillsSection?.[skillName]) {
|
|
31
|
+
skillsSection[skillName].state = enabled ? "enabled" : "disabled";
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return result;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=manifest-migrator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest-migrator.js","sourceRoot":"","sources":["../../src/core/manifest-migrator.ts"],"names":[],"mappings":"AAAA;;GAEG;AAaH,MAAM,UAAU,qBAAqB,CACnC,EAAoB,EACpB,YAAiC;IAEjC,MAAM,MAAM,GAAG,eAAe,CAAC,EAAE,CAAC,CAAC;IAEnC,KAAK,MAAM,OAAO,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAU,EAAE,CAAC;QACrE,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;QAC9B,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,SAAS;QAClD,KAAK,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAgD,CAAC,EAAE,CAAC;YAC/F,2BAA2B;YAC3B,IAAI,MAAM,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;gBAC7B,MAAM,CAAC,KAAK,GAAG,UAAU,CAAC;YAC5B,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,KAAK,GAAG,SAAS,CAAC;YAC3B,CAAC;YACD,OAAO,MAAM,CAAC,OAAO,CAAC;YAEtB,oDAAoD;YACpD,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;gBACnB,MAAM,CAAC,MAAM,GAAI,MAAM,CAAC,UAAqB,IAAI,QAAQ,CAAC;YAC5D,CAAC;QACH,CAAC;IACH,CAAC;IAED,sCAAsC;IACtC,IAAI,YAAY,EAAE,CAAC;QACjB,KAAK,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC;YACjE,KAAK,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC1D,MAAM,aAAa,GAAG,MAAM,CAAC,MAA6D,CAAC;gBAC3F,IAAI,aAAa,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC;oBAC/B,aAAa,CAAC,SAAS,CAAC,CAAC,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC;gBACpE,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest-migrator.test.d.ts","sourceRoot":"","sources":["../../src/core/manifest-migrator.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { migrateManifestV1ToV2 } from "./manifest-migrator.js";
|
|
3
|
+
describe("manifest-migrator", () => {
|
|
4
|
+
it("converts enabled:true to state:enabled", () => {
|
|
5
|
+
const v1 = {
|
|
6
|
+
version: "1",
|
|
7
|
+
skills: { foo: { enabled: true } },
|
|
8
|
+
mcps: { bar: { command: "npx", enabled: true } },
|
|
9
|
+
};
|
|
10
|
+
const v2 = migrateManifestV1ToV2(v1);
|
|
11
|
+
expect(v2.skills.foo.state).toBe("enabled");
|
|
12
|
+
expect(v2.mcps.bar.state).toBe("enabled");
|
|
13
|
+
expect(v2.skills.foo.enabled).toBeUndefined();
|
|
14
|
+
expect(v2.mcps.bar.enabled).toBeUndefined();
|
|
15
|
+
});
|
|
16
|
+
it("converts enabled:false to state:disabled", () => {
|
|
17
|
+
const v1 = { version: "1", skills: { foo: { enabled: false } } };
|
|
18
|
+
const v2 = migrateManifestV1ToV2(v1);
|
|
19
|
+
expect(v2.skills.foo.state).toBe("disabled");
|
|
20
|
+
});
|
|
21
|
+
it("defaults missing enabled to state:enabled", () => {
|
|
22
|
+
const v1 = { version: "1", skills: { foo: {} } };
|
|
23
|
+
const v2 = migrateManifestV1ToV2(v1);
|
|
24
|
+
expect(v2.skills.foo.state).toBe("enabled");
|
|
25
|
+
});
|
|
26
|
+
it("adds source:manual when no pluginName", () => {
|
|
27
|
+
const v1 = { version: "1", skills: { foo: {} } };
|
|
28
|
+
const v2 = migrateManifestV1ToV2(v1);
|
|
29
|
+
expect(v2.skills.foo.source).toBe("manual");
|
|
30
|
+
});
|
|
31
|
+
it("uses pluginName as source when present", () => {
|
|
32
|
+
const v1 = { version: "1", skills: { foo: { pluginName: "superpowers" } } };
|
|
33
|
+
const v2 = migrateManifestV1ToV2(v1);
|
|
34
|
+
expect(v2.skills.foo.source).toBe("superpowers");
|
|
35
|
+
});
|
|
36
|
+
it("imports plugin-skills.json state", () => {
|
|
37
|
+
const v1 = { version: "1", skills: { foo: {}, bar: {} } };
|
|
38
|
+
const pluginSkills = { superpowers: { foo: false, bar: true } };
|
|
39
|
+
const v2 = migrateManifestV1ToV2(v1, pluginSkills);
|
|
40
|
+
expect(v2.skills.foo.state).toBe("disabled");
|
|
41
|
+
expect(v2.skills.bar.state).toBe("enabled");
|
|
42
|
+
});
|
|
43
|
+
it("does not mutate original object", () => {
|
|
44
|
+
const v1 = { version: "1", skills: { foo: { enabled: true } } };
|
|
45
|
+
migrateManifestV1ToV2(v1);
|
|
46
|
+
expect(v1.skills.foo.enabled).toBe(true);
|
|
47
|
+
});
|
|
48
|
+
it("handles empty manifest", () => {
|
|
49
|
+
const v2 = migrateManifestV1ToV2({});
|
|
50
|
+
expect(v2).toEqual({});
|
|
51
|
+
});
|
|
52
|
+
});
|
|
53
|
+
//# sourceMappingURL=manifest-migrator.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest-migrator.test.js","sourceRoot":"","sources":["../../src/core/manifest-migrator.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAE/D,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,EAAE,GAAG;YACT,OAAO,EAAE,GAAG;YACZ,MAAM,EAAE,EAAE,GAAG,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE;YAClC,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE;SACjD,CAAC;QACF,MAAM,EAAE,GAAG,qBAAqB,CAAC,EAAE,CAAC,CAAC;QACrC,MAAM,CAAE,EAAE,CAAC,MAAc,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACrD,MAAM,CAAE,EAAE,CAAC,IAAY,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACnD,MAAM,CAAE,EAAE,CAAC,MAAc,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,aAAa,EAAE,CAAC;QACvD,MAAM,CAAE,EAAE,CAAC,IAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,aAAa,EAAE,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;QACjE,MAAM,EAAE,GAAG,qBAAqB,CAAC,EAAE,CAAC,CAAC;QACrC,MAAM,CAAE,EAAE,CAAC,MAAc,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC;QACjD,MAAM,EAAE,GAAG,qBAAqB,CAAC,EAAE,CAAC,CAAC;QACrC,MAAM,CAAE,EAAE,CAAC,MAAc,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC;QACjD,MAAM,EAAE,GAAG,qBAAqB,CAAC,EAAE,CAAC,CAAC;QACrC,MAAM,CAAE,EAAE,CAAC,MAAc,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,EAAE,UAAU,EAAE,aAAa,EAAE,EAAE,EAAE,CAAC;QAC5E,MAAM,EAAE,GAAG,qBAAqB,CAAC,EAAE,CAAC,CAAC;QACrC,MAAM,CAAE,EAAE,CAAC,MAAc,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC;QAC1D,MAAM,YAAY,GAAG,EAAE,WAAW,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC;QAChE,MAAM,EAAE,GAAG,qBAAqB,CAAC,EAAE,EAAE,YAAY,CAAC,CAAC;QACnD,MAAM,CAAE,EAAE,CAAC,MAAc,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACtD,MAAM,CAAE,EAAE,CAAC,MAAc,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;QAChE,qBAAqB,CAAC,EAAE,CAAC,CAAC;QAC1B,MAAM,CAAE,EAAE,CAAC,MAAc,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wBAAwB,EAAE,GAAG,EAAE;QAChC,MAAM,EAAE,GAAG,qBAAqB,CAAC,EAAE,CAAC,CAAC;QACrC,MAAM,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACzB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Manifest State Module — Single source of truth for item enabled/disabled state
|
|
3
|
+
*
|
|
4
|
+
* All code paths that need to know if an item is enabled or disabled MUST use
|
|
5
|
+
* this module. The state manifest is at ~/.mycelium/manifest.yaml (global)
|
|
6
|
+
* and .mycelium/manifest.yaml (project).
|
|
7
|
+
*
|
|
8
|
+
* This is DIFFERENT from the migration manifest (migration-manifest.json)
|
|
9
|
+
* which tracks import history.
|
|
10
|
+
*/
|
|
11
|
+
import type { ToolId, ItemState } from "@mycelish/core";
|
|
12
|
+
export type { ItemState };
|
|
13
|
+
export interface ItemConfig {
|
|
14
|
+
state?: ItemState;
|
|
15
|
+
source?: string;
|
|
16
|
+
command?: string;
|
|
17
|
+
args?: string[];
|
|
18
|
+
env?: Record<string, string>;
|
|
19
|
+
tools?: ToolId[];
|
|
20
|
+
excludeTools?: ToolId[];
|
|
21
|
+
enabledTools?: ToolId[];
|
|
22
|
+
pluginOrigin?: {
|
|
23
|
+
pluginId: string;
|
|
24
|
+
cachePath: string;
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
export interface ManifestConfig {
|
|
28
|
+
version: string;
|
|
29
|
+
tools?: Record<string, {
|
|
30
|
+
enabled: boolean;
|
|
31
|
+
}>;
|
|
32
|
+
skills?: Record<string, ItemConfig>;
|
|
33
|
+
mcps?: Record<string, ItemConfig>;
|
|
34
|
+
hooks?: Record<string, ItemConfig>;
|
|
35
|
+
memory?: Record<string, ItemConfig> | unknown;
|
|
36
|
+
agents?: Record<string, ItemConfig>;
|
|
37
|
+
commands?: Record<string, ItemConfig>;
|
|
38
|
+
takenOverPlugins?: Record<string, {
|
|
39
|
+
version: string;
|
|
40
|
+
cachePath: string;
|
|
41
|
+
allSkills: string[];
|
|
42
|
+
allComponents?: string[];
|
|
43
|
+
}>;
|
|
44
|
+
}
|
|
45
|
+
export type ItemType = "skill" | "mcp" | "hook" | "memory" | "agent" | "command";
|
|
46
|
+
/**
|
|
47
|
+
* Central registry of item sections. To add a new item type:
|
|
48
|
+
* 1. Add the section to ManifestConfig interface
|
|
49
|
+
* 2. Add an entry here
|
|
50
|
+
* Everything else (findItemType, getDisabledItems, sectionForType, emptyManifest) derives from this.
|
|
51
|
+
*/
|
|
52
|
+
export declare const ITEM_SECTIONS: {
|
|
53
|
+
key: keyof ManifestConfig;
|
|
54
|
+
type: ItemType;
|
|
55
|
+
}[];
|
|
56
|
+
export declare const ALL_ITEM_TYPES: ItemType[];
|
|
57
|
+
/** Get the manifest section key for an item type (e.g., "skill" → "skills") */
|
|
58
|
+
export declare function sectionForType(type: string): keyof ManifestConfig | null;
|
|
59
|
+
/**
|
|
60
|
+
* Load manifest.yaml from a directory. Auto-creates an empty one if the
|
|
61
|
+
* directory exists but the file doesn't.
|
|
62
|
+
*/
|
|
63
|
+
export declare function loadStateManifest(manifestDir: string): Promise<ManifestConfig | null>;
|
|
64
|
+
/**
|
|
65
|
+
* Save manifest.yaml to a directory. Creates the directory if needed.
|
|
66
|
+
*/
|
|
67
|
+
export declare function saveStateManifest(manifestDir: string, manifest: ManifestConfig): Promise<void>;
|
|
68
|
+
export declare function findItemType(manifest: ManifestConfig, name: string): {
|
|
69
|
+
type: ItemType;
|
|
70
|
+
config: ItemConfig;
|
|
71
|
+
} | null;
|
|
72
|
+
/**
|
|
73
|
+
* Build a set of disabled item names from both global and project manifests.
|
|
74
|
+
* Project-level state overrides global-level state.
|
|
75
|
+
*/
|
|
76
|
+
export declare function getDisabledItems(projectRoot?: string): Promise<Set<string>>;
|
|
77
|
+
/** Validate a tool ID against the registry */
|
|
78
|
+
export declare function isValidToolId(toolId: string): toolId is ToolId;
|
|
79
|
+
/** Resolve manifest directory from options */
|
|
80
|
+
export declare function resolveManifestDir(opts: {
|
|
81
|
+
global?: boolean;
|
|
82
|
+
globalPath?: string;
|
|
83
|
+
projectPath?: string;
|
|
84
|
+
}): string;
|
|
85
|
+
/**
|
|
86
|
+
* Ensure an item exists in the manifest. If not found, auto-registers it
|
|
87
|
+
* with the given initial state. Uses typeHint if provided, otherwise defaults to "skill".
|
|
88
|
+
*/
|
|
89
|
+
export declare function ensureItem(manifest: ManifestConfig, name: string, initialState: ItemState, typeHint?: ItemType): {
|
|
90
|
+
type: ItemType;
|
|
91
|
+
config: ItemConfig;
|
|
92
|
+
autoRegistered: boolean;
|
|
93
|
+
};
|
|
94
|
+
/**
|
|
95
|
+
* Write an item config back to the correct section in the manifest.
|
|
96
|
+
*/
|
|
97
|
+
export declare function setItemInManifest(manifest: ManifestConfig, name: string, type: ItemType, config: ItemConfig): void;
|
|
98
|
+
export interface ItemStateInfo {
|
|
99
|
+
name: string;
|
|
100
|
+
found: boolean;
|
|
101
|
+
type?: ItemType;
|
|
102
|
+
state?: string;
|
|
103
|
+
level?: "global" | "project";
|
|
104
|
+
tools?: ToolId[];
|
|
105
|
+
excludeTools?: ToolId[];
|
|
106
|
+
enabledTools?: ToolId[];
|
|
107
|
+
effectivelyDisabledForTool?: boolean;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Get the full state of a specific item, optionally checking if it's disabled
|
|
111
|
+
* for a specific tool. Useful for verification and testing.
|
|
112
|
+
*/
|
|
113
|
+
export declare function getItemState(name: string, opts?: {
|
|
114
|
+
projectRoot?: string;
|
|
115
|
+
tool?: ToolId;
|
|
116
|
+
}): Promise<ItemStateInfo>;
|
|
117
|
+
//# sourceMappingURL=manifest-state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest-state.d.ts","sourceRoot":"","sources":["../../src/core/manifest-state.ts"],"names":[],"mappings":"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"}
|