agenthub-multiagent-mcp 1.18.0 → 1.19.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/skillReporter.d.ts
CHANGED
|
@@ -8,16 +8,36 @@ export interface ReportOptions {
|
|
|
8
8
|
interface InstalledHash {
|
|
9
9
|
hash: string;
|
|
10
10
|
}
|
|
11
|
+
interface DiscoveredEntry {
|
|
12
|
+
name: string;
|
|
13
|
+
path: string;
|
|
14
|
+
hash: string;
|
|
15
|
+
}
|
|
16
|
+
export interface InventoryPayload {
|
|
17
|
+
managed: Record<string, InstalledHash>;
|
|
18
|
+
discovered: {
|
|
19
|
+
skills: DiscoveredEntry[];
|
|
20
|
+
commands: DiscoveredEntry[];
|
|
21
|
+
};
|
|
22
|
+
installed: Record<string, InstalledHash>;
|
|
23
|
+
}
|
|
11
24
|
/**
|
|
12
|
-
* Walk
|
|
13
|
-
*
|
|
25
|
+
* Walk ~/.claude/ for both catalog-known paths (managed) and additional
|
|
26
|
+
* skills/commands the agent has installed locally (discovered).
|
|
27
|
+
*
|
|
28
|
+
* Tier C inventory — surfaces user-authored and third-party skills the
|
|
29
|
+
* AgentHub catalog doesn't know about, with explicit org consent (the
|
|
30
|
+
* dashboard /skills page is opt-in to view; the agent-side reporter is
|
|
31
|
+
* always-on once MCP ≥ 1.19.0).
|
|
32
|
+
*
|
|
33
|
+
* Plugin-namespaced skills (`superpowers:*`, `vercel:*`, etc.) are NOT
|
|
34
|
+
* enumerated — they live in Claude Code's plugin registry, not on disk
|
|
35
|
+
* under ~/.claude/.
|
|
14
36
|
*/
|
|
15
37
|
export declare function collectInstalledSkills(options?: {
|
|
16
38
|
targetHome?: string;
|
|
17
39
|
catalogPath?: string;
|
|
18
|
-
}): Promise<
|
|
19
|
-
installed: Record<string, InstalledHash>;
|
|
20
|
-
}>;
|
|
40
|
+
}): Promise<InventoryPayload>;
|
|
21
41
|
/**
|
|
22
42
|
* Reports the inventory to /api/agents/{agentId}/skills/report. Returns
|
|
23
43
|
* true on 204, false on any other outcome (network error, 4xx, 5xx).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skillReporter.d.ts","sourceRoot":"","sources":["../src/skillReporter.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAgB7C,MAAM,WAAW,aAAa;IAG5B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IAGrB,MAAM,CAAC,EAAE,IAAI,CAAC,SAAS,EAAE,YAAY,GAAG,WAAW,GAAG,iBAAiB,CAAC,CAAC;IAEzE,OAAO,CAAC,EAAE,OAAO,KAAK,CAAC;CACxB;AAqBD,UAAU,aAAa;IACrB,IAAI,EAAE,MAAM,CAAC;CACd;AAED
|
|
1
|
+
{"version":3,"file":"skillReporter.d.ts","sourceRoot":"","sources":["../src/skillReporter.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAgB7C,MAAM,WAAW,aAAa;IAG5B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IAGrB,MAAM,CAAC,EAAE,IAAI,CAAC,SAAS,EAAE,YAAY,GAAG,WAAW,GAAG,iBAAiB,CAAC,CAAC;IAEzE,OAAO,CAAC,EAAE,OAAO,KAAK,CAAC;CACxB;AAqBD,UAAU,aAAa;IACrB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,UAAU,eAAe;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACvC,UAAU,EAAE;QACV,MAAM,EAAE,eAAe,EAAE,CAAC;QAC1B,QAAQ,EAAE,eAAe,EAAE,CAAC;KAC7B,CAAC;IAGF,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;CAC1C;AAmBD;;;;;;;;;;;;GAYG;AACH,wBAAsB,sBAAsB,CAC1C,OAAO,GAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAO,GAC1D,OAAO,CAAC,gBAAgB,CAAC,CAkE3B;AAED;;;;;GAKG;AACH,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,OAAO,CAAC,CAsClB"}
|
package/dist/skillReporter.js
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
// propagates to the caller (register flow stays the source of truth for
|
|
8
8
|
// agent-online state).
|
|
9
9
|
import { createHash } from "node:crypto";
|
|
10
|
-
import { readFile } from "node:fs/promises";
|
|
10
|
+
import { readFile, readdir, stat } from "node:fs/promises";
|
|
11
11
|
import { homedir } from "node:os";
|
|
12
12
|
import { dirname, join, resolve } from "node:path";
|
|
13
13
|
import { fileURLToPath } from "node:url";
|
|
@@ -29,29 +29,105 @@ async function loadCatalog(catalogPath) {
|
|
|
29
29
|
return null;
|
|
30
30
|
}
|
|
31
31
|
}
|
|
32
|
+
async function tryStat(path) {
|
|
33
|
+
try {
|
|
34
|
+
const s = await stat(path);
|
|
35
|
+
return { isDir: s.isDirectory() };
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
async function tryReaddir(path) {
|
|
42
|
+
try {
|
|
43
|
+
return await readdir(path);
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
return [];
|
|
47
|
+
}
|
|
48
|
+
}
|
|
32
49
|
/**
|
|
33
|
-
* Walk
|
|
34
|
-
*
|
|
50
|
+
* Walk ~/.claude/ for both catalog-known paths (managed) and additional
|
|
51
|
+
* skills/commands the agent has installed locally (discovered).
|
|
52
|
+
*
|
|
53
|
+
* Tier C inventory — surfaces user-authored and third-party skills the
|
|
54
|
+
* AgentHub catalog doesn't know about, with explicit org consent (the
|
|
55
|
+
* dashboard /skills page is opt-in to view; the agent-side reporter is
|
|
56
|
+
* always-on once MCP ≥ 1.19.0).
|
|
57
|
+
*
|
|
58
|
+
* Plugin-namespaced skills (`superpowers:*`, `vercel:*`, etc.) are NOT
|
|
59
|
+
* enumerated — they live in Claude Code's plugin registry, not on disk
|
|
60
|
+
* under ~/.claude/.
|
|
35
61
|
*/
|
|
36
62
|
export async function collectInstalledSkills(options = {}) {
|
|
37
63
|
const home = options.targetHome ?? homedir();
|
|
38
64
|
const catalogPath = options.catalogPath ?? defaultCatalogPath();
|
|
39
65
|
const catalog = await loadCatalog(catalogPath);
|
|
40
|
-
const
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
const
|
|
66
|
+
const claudeDir = join(home, ".claude");
|
|
67
|
+
const managed = {};
|
|
68
|
+
const knownPaths = new Set();
|
|
69
|
+
if (catalog) {
|
|
70
|
+
for (const entry of catalog.skills) {
|
|
71
|
+
knownPaths.add(entry.path);
|
|
72
|
+
const target = join(claudeDir, entry.path);
|
|
73
|
+
try {
|
|
74
|
+
const buf = await readFile(target);
|
|
75
|
+
managed[entry.path] = { hash: sha256(buf) };
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
// File missing or unreadable: omit. Server treats as StatusMissing.
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
// Discovered skills: ~/.claude/skills/<name>/SKILL.md.
|
|
83
|
+
const skillsDir = join(claudeDir, "skills");
|
|
84
|
+
const discoveredSkills = [];
|
|
85
|
+
for (const name of await tryReaddir(skillsDir)) {
|
|
86
|
+
const skillFile = join(skillsDir, name, "SKILL.md");
|
|
87
|
+
const rel = `skills/${name}/SKILL.md`;
|
|
88
|
+
if (knownPaths.has(rel))
|
|
89
|
+
continue;
|
|
90
|
+
const st = await tryStat(skillFile);
|
|
91
|
+
if (!st || st.isDir)
|
|
92
|
+
continue;
|
|
93
|
+
try {
|
|
94
|
+
const buf = await readFile(skillFile);
|
|
95
|
+
discoveredSkills.push({ name, path: rel, hash: sha256(buf) });
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
// Unreadable — skip silently.
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
// Discovered commands: ~/.claude/commands/<name>.md (no nested dir).
|
|
102
|
+
const commandsDir = join(claudeDir, "commands");
|
|
103
|
+
const discoveredCommands = [];
|
|
104
|
+
for (const file of await tryReaddir(commandsDir)) {
|
|
105
|
+
if (!file.endsWith(".md"))
|
|
106
|
+
continue;
|
|
107
|
+
const rel = `commands/${file}`;
|
|
108
|
+
if (knownPaths.has(rel))
|
|
109
|
+
continue;
|
|
110
|
+
const target = join(commandsDir, file);
|
|
111
|
+
const st = await tryStat(target);
|
|
112
|
+
if (!st || st.isDir)
|
|
113
|
+
continue;
|
|
45
114
|
try {
|
|
46
115
|
const buf = await readFile(target);
|
|
47
|
-
|
|
116
|
+
discoveredCommands.push({
|
|
117
|
+
name: file.replace(/\.md$/, ""),
|
|
118
|
+
path: rel,
|
|
119
|
+
hash: sha256(buf),
|
|
120
|
+
});
|
|
48
121
|
}
|
|
49
122
|
catch {
|
|
50
|
-
//
|
|
51
|
-
// StatusMissing in the status matrix.
|
|
123
|
+
// skip
|
|
52
124
|
}
|
|
53
125
|
}
|
|
54
|
-
return {
|
|
126
|
+
return {
|
|
127
|
+
managed,
|
|
128
|
+
discovered: { skills: discoveredSkills, commands: discoveredCommands },
|
|
129
|
+
installed: managed,
|
|
130
|
+
};
|
|
55
131
|
}
|
|
56
132
|
/**
|
|
57
133
|
* Reports the inventory to /api/agents/{agentId}/skills/report. Returns
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skillReporter.js","sourceRoot":"","sources":["../src/skillReporter.ts"],"names":[],"mappings":"AAAA,iEAAiE;AACjE,gCAAgC;AAChC,EAAE;AACF,2EAA2E;AAC3E,6EAA6E;AAC7E,mEAAmE;AACnE,wEAAwE;AACxE,uBAAuB;AAEvB,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"skillReporter.js","sourceRoot":"","sources":["../src/skillReporter.ts"],"names":[],"mappings":"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"}
|
|
@@ -45,20 +45,32 @@ describe("collectInstalledSkills", () => {
|
|
|
45
45
|
writeFileSync(catalogPath, JSON.stringify(CATALOG));
|
|
46
46
|
});
|
|
47
47
|
afterEach(() => rmSync(tmp, { recursive: true, force: true }));
|
|
48
|
-
it("hashes
|
|
48
|
+
it("hashes catalog-known paths into managed; surfaces extras as discovered", async () => {
|
|
49
49
|
seedHome(home, {
|
|
50
50
|
"commands/start-session.md": "start body",
|
|
51
51
|
// karpathy file deliberately absent
|
|
52
|
-
"skills/my-personal-skill/SKILL.md": "personal
|
|
52
|
+
"skills/my-personal-skill/SKILL.md": "personal skill body",
|
|
53
|
+
"commands/verify.md": "verify body",
|
|
53
54
|
});
|
|
54
55
|
const result = await collectInstalledSkills({ targetHome: home, catalogPath });
|
|
55
|
-
|
|
56
|
-
expect(result.
|
|
56
|
+
// Managed = only catalog-known paths.
|
|
57
|
+
expect(Object.keys(result.managed).sort()).toEqual(["commands/start-session.md"]);
|
|
58
|
+
expect(result.managed["commands/start-session.md"].hash).toBe(sha256("start body"));
|
|
59
|
+
// Discovered = the user's own skills/commands.
|
|
60
|
+
expect(result.discovered.skills.map((s) => s.name).sort()).toEqual(["my-personal-skill"]);
|
|
61
|
+
expect(result.discovered.skills[0].path).toBe("skills/my-personal-skill/SKILL.md");
|
|
62
|
+
expect(result.discovered.skills[0].hash).toBe(sha256("personal skill body"));
|
|
63
|
+
expect(result.discovered.commands.map((c) => c.name).sort()).toEqual(["verify"]);
|
|
64
|
+
// Legacy mirror still populated for back-compat.
|
|
65
|
+
expect(result.installed).toEqual(result.managed);
|
|
57
66
|
});
|
|
58
|
-
it("returns empty inventory when catalog file missing", async () => {
|
|
67
|
+
it("returns empty inventory when catalog file missing — but still walks discovered", async () => {
|
|
68
|
+
seedHome(home, { "skills/foo/SKILL.md": "foo" });
|
|
59
69
|
const missing = join(tmp, "no-such-catalog.json");
|
|
60
70
|
const result = await collectInstalledSkills({ targetHome: home, catalogPath: missing });
|
|
61
|
-
expect(result.
|
|
71
|
+
expect(result.managed).toEqual({});
|
|
72
|
+
// No catalog → no knownPaths exclusion → all skills surfaced as discovered.
|
|
73
|
+
expect(result.discovered.skills.map((s) => s.name)).toEqual(["foo"]);
|
|
62
74
|
});
|
|
63
75
|
});
|
|
64
76
|
describe("reportInstalledSkills", () => {
|
|
@@ -117,7 +129,11 @@ describe("reportInstalledSkills", () => {
|
|
|
117
129
|
expect(captured.headers?.["X-Connect-Token"]).toBe("ct-1");
|
|
118
130
|
expect(captured.headers?.["X-API-Key"]).toBe("key-1");
|
|
119
131
|
const parsed = JSON.parse(captured.body);
|
|
132
|
+
expect(parsed.managed["commands/start-session.md"].hash).toBe(sha256("v1"));
|
|
120
133
|
expect(parsed.installed["commands/start-session.md"].hash).toBe(sha256("v1"));
|
|
134
|
+
expect(parsed.discovered).toBeDefined();
|
|
135
|
+
expect(Array.isArray(parsed.discovered.skills)).toBe(true);
|
|
136
|
+
expect(Array.isArray(parsed.discovered.commands)).toBe(true);
|
|
121
137
|
});
|
|
122
138
|
it("returns false silently when no connect token (agent not registered)", async () => {
|
|
123
139
|
const fetchFn = vi.fn();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skillReporter.test.js","sourceRoot":"","sources":["../src/skillReporter.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACzE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACxE,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAEnF,MAAM,OAAO,GAAG;IACd,OAAO,EAAE,CAAC;IACV,MAAM,EAAE;QACN;YACE,IAAI,EAAE,2BAA2B;YACjC,IAAI,EAAE,eAAe;YACrB,QAAQ,EAAE,SAAS;YACnB,YAAY,EAAE,eAAe;YAC7B,YAAY,EAAE,CAAC,aAAa,CAAC;SAC9B;QACD;YACE,IAAI,EAAE,qCAAqC;YAC3C,IAAI,EAAE,qBAAqB;YAC3B,QAAQ,EAAE,OAAO;YACjB,YAAY,EAAE,kBAAkB;YAChC,YAAY,EAAE,EAAE;SACjB;KACF;CACF,CAAC;AAEF,SAAS,MAAM,CAAC,CAAS;IACvB,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACtD,CAAC;AAED,SAAS,QAAQ,CAAC,IAAY,EAAE,KAA6B;IAC3D,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAChD,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;QAC1C,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACnD,aAAa,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC9B,CAAC;AACH,CAAC;AAED,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;IACtC,IAAI,GAAW,CAAC;IAChB,IAAI,IAAY,CAAC;IACjB,IAAI,WAAmB,CAAC;IAExB,UAAU,CAAC,GAAG,EAAE;QACd,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,iBAAiB,CAAC,CAAC,CAAC;QACrD,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QACzB,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;QACxC,SAAS,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACrC,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAE/D,EAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"skillReporter.test.js","sourceRoot":"","sources":["../src/skillReporter.test.ts"],"names":[],"mappings":"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"}
|