@devflow-tools/sdk 0.16.8 → 0.16.10
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/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/mcp-health.d.ts +22 -0
- package/dist/mcp-health.d.ts.map +1 -0
- package/dist/mcp-health.js +97 -0
- package/dist/mcp-health.js.map +1 -0
- package/dist/mcp-inventory.d.ts +29 -0
- package/dist/mcp-inventory.d.ts.map +1 -0
- package/dist/mcp-inventory.js +130 -0
- package/dist/mcp-inventory.js.map +1 -0
- package/dist/plugin-loader.d.ts +7 -1
- package/dist/plugin-loader.d.ts.map +1 -1
- package/dist/plugin-loader.js +45 -33
- package/dist/plugin-loader.js.map +1 -1
- package/dist/plugin-runtime.d.ts +58 -0
- package/dist/plugin-runtime.d.ts.map +1 -0
- package/dist/plugin-runtime.js +236 -0
- package/dist/plugin-runtime.js.map +1 -0
- package/package.json +3 -3
package/dist/index.d.ts
CHANGED
|
@@ -11,6 +11,9 @@ export * from "./data/LocalDataProvider.js";
|
|
|
11
11
|
export * from "./data/devflow-schema.js";
|
|
12
12
|
export * from "./data/default-enforcer-rules.js";
|
|
13
13
|
export * from "./plugin-loader.js";
|
|
14
|
+
export * from "./plugin-runtime.js";
|
|
15
|
+
export * from "./mcp-inventory.js";
|
|
16
|
+
export * from "./mcp-health.js";
|
|
14
17
|
export { DevFlowApiClient } from "./api-client.js";
|
|
15
18
|
export * from "./step-templates/index.js";
|
|
16
19
|
export * from "./paths.js";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AACzC,cAAc,0BAA0B,CAAC;AACzC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,0BAA0B,CAAC;AACzC,cAAc,kCAAkC,CAAC;AACjD,cAAc,oBAAoB,CAAC;AACnC,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC;AAC1B,cAAc,sBAAsB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AACzC,cAAc,0BAA0B,CAAC;AACzC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,0BAA0B,CAAC;AACzC,cAAc,kCAAkC,CAAC;AACjD,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC;AAChC,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC;AAC1B,cAAc,sBAAsB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -11,6 +11,9 @@ export * from "./data/LocalDataProvider.js";
|
|
|
11
11
|
export * from "./data/devflow-schema.js";
|
|
12
12
|
export * from "./data/default-enforcer-rules.js";
|
|
13
13
|
export * from "./plugin-loader.js";
|
|
14
|
+
export * from "./plugin-runtime.js";
|
|
15
|
+
export * from "./mcp-inventory.js";
|
|
16
|
+
export * from "./mcp-health.js";
|
|
14
17
|
export { DevFlowApiClient } from "./api-client.js";
|
|
15
18
|
export * from "./step-templates/index.js";
|
|
16
19
|
export * from "./paths.js";
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AACzC,cAAc,0BAA0B,CAAC;AACzC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,0BAA0B,CAAC;AACzC,cAAc,kCAAkC,CAAC;AACjD,cAAc,oBAAoB,CAAC;AACnC,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC;AAC1B,cAAc,sBAAsB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AACzC,cAAc,0BAA0B,CAAC;AACzC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,0BAA0B,CAAC;AACzC,cAAc,kCAAkC,CAAC;AACjD,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC;AAChC,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC;AAC1B,cAAc,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { McpInventoryReport } from "./mcp-inventory.js";
|
|
2
|
+
export type McpHealthStatus = "healthy" | "unhealthy" | "unknown";
|
|
3
|
+
export type McpFailureCategory = "configuration" | "command_missing" | "transport" | "timeout" | "auth" | "rate_limit" | "server_error";
|
|
4
|
+
export interface McpHealthRecord {
|
|
5
|
+
name: string;
|
|
6
|
+
fingerprint: string;
|
|
7
|
+
status: McpHealthStatus;
|
|
8
|
+
checkedAt: string;
|
|
9
|
+
expiresAt: string;
|
|
10
|
+
failureCategory?: McpFailureCategory;
|
|
11
|
+
failureCount: number;
|
|
12
|
+
retryAfter?: string;
|
|
13
|
+
lastError?: string;
|
|
14
|
+
lastRestoredAt?: string;
|
|
15
|
+
}
|
|
16
|
+
export interface McpHealthReport {
|
|
17
|
+
generatedAt: string;
|
|
18
|
+
records: McpHealthRecord[];
|
|
19
|
+
}
|
|
20
|
+
export declare function checkMcpHealth(report: McpInventoryReport, home?: string, now?: number): Promise<McpHealthReport>;
|
|
21
|
+
export declare function readCachedMcpHealth(home?: string): McpHealthReport;
|
|
22
|
+
//# sourceMappingURL=mcp-health.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-health.d.ts","sourceRoot":"","sources":["../src/mcp-health.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,kBAAkB,EAA2B,MAAM,oBAAoB,CAAC;AAEtF,MAAM,MAAM,eAAe,GAAG,SAAS,GAAG,WAAW,GAAG,SAAS,CAAC;AAClE,MAAM,MAAM,kBAAkB,GAAG,eAAe,GAAG,iBAAiB,GAAG,WAAW,GAAG,SAAS,GAAG,MAAM,GAAG,YAAY,GAAG,cAAc,CAAC;AAExI,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,eAAe,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,kBAAkB,CAAC;IACrC,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,eAAe,EAAE,CAAC;CAC5B;AAqDD,wBAAsB,cAAc,CAAC,MAAM,EAAE,kBAAkB,EAAE,IAAI,SAAY,EAAE,GAAG,SAAa,GAAG,OAAO,CAAC,eAAe,CAAC,CA4B7H;AAED,wBAAgB,mBAAmB,CAAC,IAAI,SAAY,GAAG,eAAe,CAGrE"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { mkdirSync, readFileSync, renameSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { homedir } from "node:os";
|
|
3
|
+
import { dirname, join } from "node:path";
|
|
4
|
+
import { spawnSync } from "node:child_process";
|
|
5
|
+
const TTL_MS = 5 * 60 * 1000;
|
|
6
|
+
const MAX_BACKOFF_MS = 30 * 60 * 1000;
|
|
7
|
+
function statePath(home) {
|
|
8
|
+
return join(home, ".devflow", "mcp-health.json");
|
|
9
|
+
}
|
|
10
|
+
function readState(home) {
|
|
11
|
+
try {
|
|
12
|
+
const parsed = JSON.parse(readFileSync(statePath(home), "utf8"));
|
|
13
|
+
return parsed.records ?? {};
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
return {};
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
function writeState(records, home) {
|
|
20
|
+
const path = statePath(home);
|
|
21
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
22
|
+
const temp = `${path}.${process.pid}.${Date.now()}.tmp`;
|
|
23
|
+
writeFileSync(temp, `${JSON.stringify({ schemaVersion: "devflow.mcp-health.v1", records }, null, 2)}\n`, "utf8");
|
|
24
|
+
renameSync(temp, path);
|
|
25
|
+
}
|
|
26
|
+
async function classifyServer(server) {
|
|
27
|
+
if (!server.enabled)
|
|
28
|
+
return { status: "unknown" };
|
|
29
|
+
if (server.transport === "unknown")
|
|
30
|
+
return { status: "unhealthy", failureCategory: "configuration", error: "server has no supported command or URL" };
|
|
31
|
+
if (server.transport === "stdio" && server.command) {
|
|
32
|
+
const result = spawnSync("which", [server.command], { encoding: "utf8", timeout: 1500 });
|
|
33
|
+
if (result.error?.name === "ETIMEDOUT")
|
|
34
|
+
return { status: "unhealthy", failureCategory: "timeout", error: "command lookup timed out" };
|
|
35
|
+
if (result.status !== 0)
|
|
36
|
+
return { status: "unhealthy", failureCategory: "command_missing", error: `command not found: ${server.command}` };
|
|
37
|
+
return { status: "healthy" };
|
|
38
|
+
}
|
|
39
|
+
if (!server.url)
|
|
40
|
+
return { status: "unhealthy", failureCategory: "configuration", error: "remote server URL is missing" };
|
|
41
|
+
const controller = new AbortController();
|
|
42
|
+
const timeout = setTimeout(() => controller.abort(), 3000);
|
|
43
|
+
try {
|
|
44
|
+
const response = await fetch(server.url, { method: "GET", signal: controller.signal, redirect: "manual" });
|
|
45
|
+
if (response.status === 401 || response.status === 403)
|
|
46
|
+
return { status: "unhealthy", failureCategory: "auth", error: `HTTP ${response.status}` };
|
|
47
|
+
if (response.status === 429)
|
|
48
|
+
return { status: "unhealthy", failureCategory: "rate_limit", error: "HTTP 429" };
|
|
49
|
+
if (response.status >= 500)
|
|
50
|
+
return { status: "unhealthy", failureCategory: "server_error", error: `HTTP ${response.status}` };
|
|
51
|
+
if ((response.status >= 200 && response.status < 400) || response.status === 406)
|
|
52
|
+
return { status: "healthy" };
|
|
53
|
+
return { status: "unhealthy", failureCategory: "transport", error: `HTTP ${response.status}` };
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
if (error.name === "AbortError")
|
|
57
|
+
return { status: "unhealthy", failureCategory: "timeout", error: "request timed out" };
|
|
58
|
+
return { status: "unhealthy", failureCategory: "transport", error: error.message };
|
|
59
|
+
}
|
|
60
|
+
finally {
|
|
61
|
+
clearTimeout(timeout);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
export async function checkMcpHealth(report, home = homedir(), now = Date.now()) {
|
|
65
|
+
const previous = readState(home);
|
|
66
|
+
const records = {};
|
|
67
|
+
for (const server of report.servers) {
|
|
68
|
+
const old = previous[server.name];
|
|
69
|
+
if (old && old.fingerprint === server.fingerprint && Date.parse(old.expiresAt) > now) {
|
|
70
|
+
records[server.name] = old;
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
const result = await classifyServer(server);
|
|
74
|
+
const failed = result.status === "unhealthy";
|
|
75
|
+
const failureCount = failed ? (old?.failureCount ?? 0) + 1 : 0;
|
|
76
|
+
const retryAfter = failed ? new Date(now + Math.min(MAX_BACKOFF_MS, 1000 * 2 ** Math.min(failureCount, 10))).toISOString() : undefined;
|
|
77
|
+
records[server.name] = {
|
|
78
|
+
name: server.name,
|
|
79
|
+
fingerprint: server.fingerprint,
|
|
80
|
+
status: result.status,
|
|
81
|
+
checkedAt: new Date(now).toISOString(),
|
|
82
|
+
expiresAt: new Date(now + TTL_MS).toISOString(),
|
|
83
|
+
...(result.failureCategory ? { failureCategory: result.failureCategory } : {}),
|
|
84
|
+
failureCount,
|
|
85
|
+
...(retryAfter ? { retryAfter } : {}),
|
|
86
|
+
...(result.error ? { lastError: result.error } : {}),
|
|
87
|
+
...(result.status === "healthy" && old?.status === "unhealthy" ? { lastRestoredAt: new Date(now).toISOString() } : {}),
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
writeState(records, home);
|
|
91
|
+
return { generatedAt: new Date(now).toISOString(), records: Object.values(records).sort((a, b) => a.name.localeCompare(b.name)) };
|
|
92
|
+
}
|
|
93
|
+
export function readCachedMcpHealth(home = homedir()) {
|
|
94
|
+
const records = readState(home);
|
|
95
|
+
return { generatedAt: new Date().toISOString(), records: Object.values(records).sort((a, b) => a.name.localeCompare(b.name)) };
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=mcp-health.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-health.js","sourceRoot":"","sources":["../src/mcp-health.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACzF,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAwB/C,MAAM,MAAM,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;AAC7B,MAAM,cAAc,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAEtC,SAAS,SAAS,CAAC,IAAY;IAC7B,OAAO,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,iBAAiB,CAAC,CAAC;AACnD,CAAC;AAED,SAAS,SAAS,CAAC,IAAY;IAC7B,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,CAAkD,CAAC;QAClH,OAAO,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;IAC9B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CAAC,OAAwC,EAAE,IAAY;IACxE,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAC7B,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,MAAM,IAAI,GAAG,GAAG,IAAI,IAAI,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC;IACxD,aAAa,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,aAAa,EAAE,uBAAuB,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACjH,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AACzB,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,MAA+B;IAC3D,IAAI,CAAC,MAAM,CAAC,OAAO;QAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IAClD,IAAI,MAAM,CAAC,SAAS,KAAK,SAAS;QAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,eAAe,EAAE,eAAe,EAAE,KAAK,EAAE,wCAAwC,EAAE,CAAC;IACtJ,IAAI,MAAM,CAAC,SAAS,KAAK,OAAO,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnD,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QACzF,IAAI,MAAM,CAAC,KAAK,EAAE,IAAI,KAAK,WAAW;YAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,eAAe,EAAE,SAAS,EAAE,KAAK,EAAE,0BAA0B,EAAE,CAAC;QACtI,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,eAAe,EAAE,iBAAiB,EAAE,KAAK,EAAE,sBAAsB,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC;QAC3I,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IAC/B,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,GAAG;QAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,eAAe,EAAE,eAAe,EAAE,KAAK,EAAE,8BAA8B,EAAE,CAAC;IACzH,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,CAAC;IAC3D,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC3G,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG;YAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;QAClJ,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG;YAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,eAAe,EAAE,YAAY,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;QAC9G,IAAI,QAAQ,CAAC,MAAM,IAAI,GAAG;YAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,eAAe,EAAE,cAAc,EAAE,KAAK,EAAE,QAAQ,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;QAC9H,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,MAAM,GAAG,GAAG,CAAC,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG;YAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;QAC/G,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,eAAe,EAAE,WAAW,EAAE,KAAK,EAAE,QAAQ,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;IACjG,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAK,KAAe,CAAC,IAAI,KAAK,YAAY;YAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,eAAe,EAAE,SAAS,EAAE,KAAK,EAAE,mBAAmB,EAAE,CAAC;QACnI,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,eAAe,EAAE,WAAW,EAAE,KAAK,EAAG,KAAe,CAAC,OAAO,EAAE,CAAC;IAChG,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,OAAO,CAAC,CAAC;IACxB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,MAA0B,EAAE,IAAI,GAAG,OAAO,EAAE,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;IACjG,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IACjC,MAAM,OAAO,GAAoC,EAAE,CAAC;IACpD,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACpC,MAAM,GAAG,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,GAAG,IAAI,GAAG,CAAC,WAAW,KAAK,MAAM,CAAC,WAAW,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,GAAG,EAAE,CAAC;YACrF,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC;YAC3B,SAAS;QACX,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,MAAM,CAAC,CAAC;QAC5C,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,KAAK,WAAW,CAAC;QAC7C,MAAM,YAAY,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,YAAY,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/D,MAAM,UAAU,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,cAAc,EAAE,IAAI,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;QACvI,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG;YACrB,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,SAAS,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE;YACtC,SAAS,EAAE,IAAI,IAAI,CAAC,GAAG,GAAG,MAAM,CAAC,CAAC,WAAW,EAAE;YAC/C,GAAG,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,MAAM,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9E,YAAY;YACZ,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACrC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACpD,GAAG,CAAC,MAAM,CAAC,MAAM,KAAK,SAAS,IAAI,GAAG,EAAE,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACvH,CAAC;IACJ,CAAC;IACD,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC1B,OAAO,EAAE,WAAW,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;AACpI,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,IAAI,GAAG,OAAO,EAAE;IAClD,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAChC,OAAO,EAAE,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;AACjI,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export type McpTransport = "stdio" | "sse" | "http" | "unknown";
|
|
2
|
+
export interface McpServerInventoryEntry {
|
|
3
|
+
name: string;
|
|
4
|
+
transport: McpTransport;
|
|
5
|
+
command?: string;
|
|
6
|
+
args?: string[];
|
|
7
|
+
url?: string;
|
|
8
|
+
sourcePaths: string[];
|
|
9
|
+
enabled: boolean;
|
|
10
|
+
environmentKeys: string[];
|
|
11
|
+
fingerprint: string;
|
|
12
|
+
drift?: string[];
|
|
13
|
+
}
|
|
14
|
+
export interface McpInventoryReport {
|
|
15
|
+
generatedAt: string;
|
|
16
|
+
servers: McpServerInventoryEntry[];
|
|
17
|
+
duplicates: Array<{
|
|
18
|
+
name: string;
|
|
19
|
+
sourcePaths: string[];
|
|
20
|
+
fingerprints: string[];
|
|
21
|
+
}>;
|
|
22
|
+
unreadable: Array<{
|
|
23
|
+
path: string;
|
|
24
|
+
reason: string;
|
|
25
|
+
}>;
|
|
26
|
+
}
|
|
27
|
+
export declare function readMcpInventory(projectRoot?: string, home?: string): McpInventoryReport;
|
|
28
|
+
export declare function redactMcpInventory(report: McpInventoryReport): McpInventoryReport;
|
|
29
|
+
//# sourceMappingURL=mcp-inventory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-inventory.d.ts","sourceRoot":"","sources":["../src/mcp-inventory.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,KAAK,GAAG,MAAM,GAAG,SAAS,CAAC;AAEhE,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,YAAY,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,OAAO,EAAE,OAAO,CAAC;IACjB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,uBAAuB,EAAE,CAAC;IACnC,UAAU,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,EAAE,CAAC;QAAC,YAAY,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;IACnF,UAAU,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACrD;AA6FD,wBAAgB,gBAAgB,CAC9B,WAAW,SAAgB,EAC3B,IAAI,SAAY,GACf,kBAAkB,CAmCpB;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,kBAAkB,GAAG,kBAAkB,CAQjF"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
3
|
+
import { homedir } from "node:os";
|
|
4
|
+
import { join } from "node:path";
|
|
5
|
+
function stable(value) {
|
|
6
|
+
if (Array.isArray(value))
|
|
7
|
+
return `[${value.map(stable).join(",")}]`;
|
|
8
|
+
if (value && typeof value === "object") {
|
|
9
|
+
return `{${Object.entries(value).sort(([a], [b]) => a.localeCompare(b)).map(([key, entry]) => `${JSON.stringify(key)}:${stable(entry)}`).join(",")}}`;
|
|
10
|
+
}
|
|
11
|
+
return JSON.stringify(value) ?? "null";
|
|
12
|
+
}
|
|
13
|
+
function fingerprint(value) {
|
|
14
|
+
return createHash("sha256").update(stable(value)).digest("hex").slice(0, 16);
|
|
15
|
+
}
|
|
16
|
+
function configCandidates(projectRoot, home) {
|
|
17
|
+
return [
|
|
18
|
+
join(projectRoot, ".mcp.json"),
|
|
19
|
+
join(projectRoot, ".claude", "mcp.json"),
|
|
20
|
+
join(home, ".claude", ".mcp.json"),
|
|
21
|
+
join(home, ".claude.json"),
|
|
22
|
+
join(home, ".claude", "settings.json"),
|
|
23
|
+
];
|
|
24
|
+
}
|
|
25
|
+
function extractServers(value, projectRoot) {
|
|
26
|
+
if (!value || typeof value !== "object")
|
|
27
|
+
return {};
|
|
28
|
+
const record = value;
|
|
29
|
+
const collection = record.mcpServers ?? record.servers;
|
|
30
|
+
const globalServers = collection && typeof collection === "object" ? collection : {};
|
|
31
|
+
const projects = record.projects && typeof record.projects === "object"
|
|
32
|
+
? record.projects
|
|
33
|
+
: {};
|
|
34
|
+
const project = projects[projectRoot];
|
|
35
|
+
const projectRecord = project && typeof project === "object" ? project : {};
|
|
36
|
+
const projectCollection = projectRecord.mcpServers && typeof projectRecord.mcpServers === "object"
|
|
37
|
+
? projectRecord.mcpServers
|
|
38
|
+
: {};
|
|
39
|
+
return Object.fromEntries(Object.entries({ ...globalServers, ...projectCollection })
|
|
40
|
+
.filter(([, server]) => server && typeof server === "object")
|
|
41
|
+
.map(([name, server]) => [name, server]));
|
|
42
|
+
}
|
|
43
|
+
function disabledServerNames(projectRoot) {
|
|
44
|
+
try {
|
|
45
|
+
const config = JSON.parse(readFileSync(join(projectRoot, ".devflow", "config.json"), "utf8"));
|
|
46
|
+
return new Set((Array.isArray(config.mcp?.disabledServers) ? config.mcp?.disabledServers : [])
|
|
47
|
+
.filter((name) => typeof name === "string"));
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
return new Set();
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
function normalize(name, server, path) {
|
|
54
|
+
const transport = typeof server.command === "string"
|
|
55
|
+
? "stdio"
|
|
56
|
+
: typeof server.url === "string"
|
|
57
|
+
? (server.type === "sse" ? "sse" : "http")
|
|
58
|
+
: "unknown";
|
|
59
|
+
const args = Array.isArray(server.args) ? server.args.filter((arg) => typeof arg === "string") : [];
|
|
60
|
+
const environmentKeys = server.env && typeof server.env === "object"
|
|
61
|
+
? Object.keys(server.env).sort()
|
|
62
|
+
: [];
|
|
63
|
+
const config = {
|
|
64
|
+
transport,
|
|
65
|
+
command: typeof server.command === "string" ? server.command : undefined,
|
|
66
|
+
args,
|
|
67
|
+
url: typeof server.url === "string" ? server.url : undefined,
|
|
68
|
+
environmentKeys,
|
|
69
|
+
enabled: server.enabled !== false && server.disabled !== true,
|
|
70
|
+
};
|
|
71
|
+
return {
|
|
72
|
+
name,
|
|
73
|
+
transport,
|
|
74
|
+
...(typeof server.command === "string" ? { command: server.command } : {}),
|
|
75
|
+
...(args.length > 0 ? { args } : {}),
|
|
76
|
+
...(typeof server.url === "string" ? { url: server.url } : {}),
|
|
77
|
+
sourcePaths: [path],
|
|
78
|
+
enabled: config.enabled,
|
|
79
|
+
environmentKeys,
|
|
80
|
+
fingerprint: fingerprint(config),
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
export function readMcpInventory(projectRoot = process.cwd(), home = homedir()) {
|
|
84
|
+
const byName = new Map();
|
|
85
|
+
const unreadable = [];
|
|
86
|
+
const disabled = disabledServerNames(projectRoot);
|
|
87
|
+
for (const path of configCandidates(projectRoot, home)) {
|
|
88
|
+
if (!existsSync(path))
|
|
89
|
+
continue;
|
|
90
|
+
try {
|
|
91
|
+
const parsed = JSON.parse(readFileSync(path, "utf8"));
|
|
92
|
+
for (const [name, server] of Object.entries(extractServers(parsed, projectRoot))) {
|
|
93
|
+
const entries = byName.get(name) ?? [];
|
|
94
|
+
const normalized = normalize(name, server, path);
|
|
95
|
+
if (disabled.has(name)) {
|
|
96
|
+
normalized.enabled = false;
|
|
97
|
+
normalized.fingerprint = fingerprint({ base: normalized.fingerprint, enabled: false });
|
|
98
|
+
}
|
|
99
|
+
entries.push(normalized);
|
|
100
|
+
byName.set(name, entries);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
unreadable.push({ path, reason: error.message });
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
const servers = [];
|
|
108
|
+
const duplicates = [];
|
|
109
|
+
for (const [name, entries] of byName) {
|
|
110
|
+
const fingerprints = [...new Set(entries.map((entry) => entry.fingerprint))];
|
|
111
|
+
const sourcePaths = entries.flatMap((entry) => entry.sourcePaths);
|
|
112
|
+
const drift = fingerprints.length > 1 ? ["configuration differs across scopes"] : undefined;
|
|
113
|
+
servers.push({ ...entries[0], sourcePaths, ...(drift ? { drift } : {}) });
|
|
114
|
+
if (entries.length > 1)
|
|
115
|
+
duplicates.push({ name, sourcePaths, fingerprints });
|
|
116
|
+
}
|
|
117
|
+
servers.sort((a, b) => a.name.localeCompare(b.name));
|
|
118
|
+
duplicates.sort((a, b) => a.name.localeCompare(b.name));
|
|
119
|
+
return { generatedAt: new Date().toISOString(), servers, duplicates, unreadable };
|
|
120
|
+
}
|
|
121
|
+
export function redactMcpInventory(report) {
|
|
122
|
+
return {
|
|
123
|
+
...report,
|
|
124
|
+
servers: report.servers.map((server) => ({
|
|
125
|
+
...server,
|
|
126
|
+
url: server.url ? server.url.replace(/([?&](?:key|token|secret|password)=)[^&]+/gi, "$1<redacted>") : undefined,
|
|
127
|
+
})),
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=mcp-inventory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-inventory.js","sourceRoot":"","sources":["../src/mcp-inventory.ts"],"names":[],"mappings":"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"}
|
package/dist/plugin-loader.d.ts
CHANGED
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
import type { DevFlowPlugin } from "./types/plugin.js";
|
|
2
|
+
import { type PluginLoadDiagnostic, type PluginRuntimeOptions } from "./plugin-runtime.js";
|
|
2
3
|
export declare function loadPluginPackageNames(registryPath?: string): string[];
|
|
3
|
-
export declare function
|
|
4
|
+
export declare function loadPluginsWithDiagnostics(options?: PluginRuntimeOptions): Promise<{
|
|
5
|
+
plugins: Map<string, DevFlowPlugin>;
|
|
6
|
+
diagnostics: PluginLoadDiagnostic[];
|
|
7
|
+
}>;
|
|
8
|
+
export declare function loadPlugins(options?: PluginRuntimeOptions): Promise<Map<string, DevFlowPlugin>>;
|
|
9
|
+
export declare function getPluginLoadDiagnostics(): PluginLoadDiagnostic[];
|
|
4
10
|
export declare function loadPluginsSync(): Map<string, DevFlowPlugin>;
|
|
5
11
|
export declare function clearPluginCache(): void;
|
|
6
12
|
export declare function getPluginsDir(): string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin-loader.d.ts","sourceRoot":"","sources":["../src/plugin-loader.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"plugin-loader.d.ts","sourceRoot":"","sources":["../src/plugin-loader.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAOL,KAAK,oBAAoB,EACzB,KAAK,oBAAoB,EAC1B,MAAM,qBAAqB,CAAC;AAU7B,wBAAgB,sBAAsB,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAqBtE;AAED,wBAAsB,0BAA0B,CAC9C,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC;IAAE,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAAC,WAAW,EAAE,oBAAoB,EAAE,CAAA;CAAE,CAAC,CAuCvF;AAED,wBAAsB,WAAW,CAAC,OAAO,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,CAErG;AAED,wBAAgB,wBAAwB,IAAI,oBAAoB,EAAE,CAEjE;AAED,wBAAgB,eAAe,IAAI,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAE5D;AAED,wBAAgB,gBAAgB,IAAI,IAAI,CAGvC;AAED,wBAAgB,aAAa,IAAI,MAAM,CAItC"}
|
package/dist/plugin-loader.js
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { existsSync, readFileSync } from "node:fs";
|
|
2
2
|
import { dirname, join, resolve } from "node:path";
|
|
3
|
-
import { homedir } from "node:os";
|
|
4
3
|
import { fileURLToPath } from "node:url";
|
|
4
|
+
import { extractPlugin, importPluginModule, pluginCapabilities, recordPluginLoadDiagnostics, resolvePluginCandidates, validatePlugin, } from "./plugin-runtime.js";
|
|
5
5
|
let _loadedPlugins = null;
|
|
6
|
+
let _loadDiagnostics = [];
|
|
6
7
|
export function loadPluginPackageNames(registryPath) {
|
|
7
8
|
const moduleDir = dirname(fileURLToPath(import.meta.url));
|
|
8
9
|
const explicitPath = registryPath ?? process.env.DEVFLOW_PLUGIN_REGISTRY;
|
|
@@ -17,8 +18,8 @@ export function loadPluginPackageNames(registryPath) {
|
|
|
17
18
|
if (!/^1(?:\.|$)/.test(registry.version) || !Array.isArray(registry.plugins))
|
|
18
19
|
continue;
|
|
19
20
|
return [...new Set(registry.plugins
|
|
20
|
-
.map(plugin => plugin.name)
|
|
21
|
-
.filter(name => /^@devflow-tools\/plugin-[a-z0-9-]+$/.test(name)))];
|
|
21
|
+
.map((plugin) => plugin.name)
|
|
22
|
+
.filter((name) => /^@devflow-tools\/plugin-[a-z0-9-]+$/.test(name)))];
|
|
22
23
|
}
|
|
23
24
|
catch {
|
|
24
25
|
continue;
|
|
@@ -26,50 +27,61 @@ export function loadPluginPackageNames(registryPath) {
|
|
|
26
27
|
}
|
|
27
28
|
return [];
|
|
28
29
|
}
|
|
29
|
-
async function
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
30
|
+
export async function loadPluginsWithDiagnostics(options = {}) {
|
|
31
|
+
if (_loadedPlugins && options.projectRoot === undefined && options.homeDir === undefined && options.registryPath === undefined) {
|
|
32
|
+
return { plugins: _loadedPlugins, diagnostics: _loadDiagnostics };
|
|
33
|
+
}
|
|
34
|
+
const plugins = new Map();
|
|
35
|
+
const diagnostics = [];
|
|
36
|
+
for (const candidate of resolvePluginCandidates(options)) {
|
|
37
|
+
try {
|
|
38
|
+
const module = await importPluginModule(candidate);
|
|
39
|
+
const plugin = extractPlugin(module, candidate.packageName);
|
|
40
|
+
if (!plugin) {
|
|
41
|
+
diagnostics.push({ packageName: candidate.packageName, source: candidate.source, installPath: candidate.installPath, status: "failed", capabilities: [], reason: "No valid DevFlowPlugin export found" });
|
|
42
|
+
continue;
|
|
42
43
|
}
|
|
44
|
+
const issues = validatePlugin(plugin, candidate.packageName);
|
|
45
|
+
if (issues.length > 0) {
|
|
46
|
+
diagnostics.push({ packageName: candidate.packageName, pluginName: plugin.meta.name, version: plugin.meta.version, source: candidate.source, installPath: candidate.installPath, status: "failed", capabilities: pluginCapabilities(plugin), reason: issues.join("; ") });
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
const duplicate = plugins.get(plugin.meta.name);
|
|
50
|
+
if (duplicate) {
|
|
51
|
+
diagnostics.push({ packageName: candidate.packageName, pluginName: plugin.meta.name, version: plugin.meta.version, source: candidate.source, installPath: candidate.installPath, status: "failed", capabilities: pluginCapabilities(plugin), reason: `Plugin name conflicts with ${duplicate.meta.version}` });
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
plugins.set(plugin.meta.name, plugin);
|
|
55
|
+
diagnostics.push({ packageName: candidate.packageName, pluginName: plugin.meta.name, version: plugin.meta.version, source: candidate.source, installPath: candidate.installPath, status: "loaded", capabilities: pluginCapabilities(plugin) });
|
|
56
|
+
}
|
|
57
|
+
catch (error) {
|
|
58
|
+
diagnostics.push({ packageName: candidate.packageName, source: candidate.source, installPath: candidate.installPath, status: "failed", capabilities: [], reason: error.message });
|
|
43
59
|
}
|
|
44
|
-
return null;
|
|
45
60
|
}
|
|
46
|
-
|
|
47
|
-
|
|
61
|
+
recordPluginLoadDiagnostics(diagnostics, options.homeDir);
|
|
62
|
+
if (options.projectRoot === undefined && options.homeDir === undefined && options.registryPath === undefined) {
|
|
63
|
+
_loadedPlugins = plugins;
|
|
64
|
+
_loadDiagnostics = diagnostics;
|
|
48
65
|
}
|
|
66
|
+
return { plugins, diagnostics };
|
|
49
67
|
}
|
|
50
|
-
export async function loadPlugins() {
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
const plugin = await tryLoad(packageName);
|
|
56
|
-
if (plugin) {
|
|
57
|
-
_loadedPlugins.set(plugin.meta.name, plugin);
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
return _loadedPlugins;
|
|
68
|
+
export async function loadPlugins(options) {
|
|
69
|
+
return (await loadPluginsWithDiagnostics(options)).plugins;
|
|
70
|
+
}
|
|
71
|
+
export function getPluginLoadDiagnostics() {
|
|
72
|
+
return [..._loadDiagnostics];
|
|
61
73
|
}
|
|
62
74
|
export function loadPluginsSync() {
|
|
63
75
|
return _loadedPlugins ?? new Map();
|
|
64
76
|
}
|
|
65
77
|
export function clearPluginCache() {
|
|
66
78
|
_loadedPlugins = null;
|
|
79
|
+
_loadDiagnostics = [];
|
|
67
80
|
}
|
|
68
81
|
export function getPluginsDir() {
|
|
69
82
|
const devPluginsDir = join(process.cwd(), "plugins");
|
|
70
|
-
if (existsSync(devPluginsDir))
|
|
83
|
+
if (existsSync(devPluginsDir))
|
|
71
84
|
return devPluginsDir;
|
|
72
|
-
|
|
73
|
-
return join(homedir(), ".devflow", "skills");
|
|
85
|
+
return join(process.env.HOME ?? "~", ".devflow", "plugins");
|
|
74
86
|
}
|
|
75
87
|
//# sourceMappingURL=plugin-loader.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin-loader.js","sourceRoot":"","sources":["../src/plugin-loader.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"plugin-loader.js","sourceRoot":"","sources":["../src/plugin-loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import type { DevFlowPlugin } from "./types/plugin.js";
|
|
2
|
+
export type PluginInstallSource = "npm" | "workspace" | "path";
|
|
3
|
+
export interface PluginLoadDiagnostic {
|
|
4
|
+
packageName: string;
|
|
5
|
+
pluginName?: string;
|
|
6
|
+
version?: string;
|
|
7
|
+
status: "loaded" | "skipped" | "failed";
|
|
8
|
+
capabilities: Array<"knowledge" | "memory" | "workflow" | "tools" | "skill">;
|
|
9
|
+
source?: PluginInstallSource;
|
|
10
|
+
installPath?: string;
|
|
11
|
+
reason?: string;
|
|
12
|
+
}
|
|
13
|
+
export interface PluginRuntimeInstallRecord {
|
|
14
|
+
packageName: string;
|
|
15
|
+
pluginName: string;
|
|
16
|
+
version: string;
|
|
17
|
+
installPath: string;
|
|
18
|
+
source: PluginInstallSource;
|
|
19
|
+
installedAt: string;
|
|
20
|
+
updatedAt: string;
|
|
21
|
+
projects: string[];
|
|
22
|
+
lastLoad?: {
|
|
23
|
+
status: "loaded" | "failed" | "skipped";
|
|
24
|
+
checkedAt: string;
|
|
25
|
+
reason?: string;
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
export interface PluginInstallState {
|
|
29
|
+
schemaVersion: "devflow.plugins.v1";
|
|
30
|
+
plugins: Record<string, PluginRuntimeInstallRecord>;
|
|
31
|
+
}
|
|
32
|
+
export interface PluginRuntimeOptions {
|
|
33
|
+
projectRoot?: string;
|
|
34
|
+
homeDir?: string;
|
|
35
|
+
registryPath?: string;
|
|
36
|
+
}
|
|
37
|
+
export interface PluginCandidate {
|
|
38
|
+
packageName: string;
|
|
39
|
+
modulePath?: string;
|
|
40
|
+
source: PluginInstallSource;
|
|
41
|
+
installPath?: string;
|
|
42
|
+
}
|
|
43
|
+
export declare function getPluginInstallRoot(home?: string): string;
|
|
44
|
+
export declare function getPluginInstallStatePath(home?: string): string;
|
|
45
|
+
export declare function emptyPluginInstallState(): PluginInstallState;
|
|
46
|
+
export declare function readPluginInstallState(home?: string): PluginInstallState;
|
|
47
|
+
export declare function writePluginInstallState(state: PluginInstallState, home?: string): void;
|
|
48
|
+
export declare function upsertPluginInstallRecord(record: PluginRuntimeInstallRecord, home?: string): PluginInstallState;
|
|
49
|
+
export declare function removePluginInstallRecord(packageName: string, home?: string): PluginInstallState;
|
|
50
|
+
export declare function resolvePluginCandidates(options?: PluginRuntimeOptions): PluginCandidate[];
|
|
51
|
+
export declare function recordPluginLoadDiagnostics(diagnostics: PluginLoadDiagnostic[], home?: string): void;
|
|
52
|
+
export declare function importPluginModule(candidate: PluginCandidate): Promise<Record<string, unknown>>;
|
|
53
|
+
export declare function extractPlugin(module: Record<string, unknown>, packageName: string): DevFlowPlugin | null;
|
|
54
|
+
export declare function pluginCapabilities(plugin: DevFlowPlugin): PluginLoadDiagnostic["capabilities"];
|
|
55
|
+
export declare function pluginFingerprint(plugin: DevFlowPlugin): string;
|
|
56
|
+
export declare function validatePlugin(plugin: DevFlowPlugin, packageName: string): string[];
|
|
57
|
+
export declare function validatePluginSet(plugins: DevFlowPlugin[], reservedToolNames?: Iterable<string>): string[];
|
|
58
|
+
//# sourceMappingURL=plugin-runtime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-runtime.d.ts","sourceRoot":"","sources":["../src/plugin-runtime.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { createRequire } from "node:module";
|
|
3
|
+
import { existsSync, mkdirSync, readFileSync, renameSync, writeFileSync, } from "node:fs";
|
|
4
|
+
import { homedir } from "node:os";
|
|
5
|
+
import { dirname, join, resolve } from "node:path";
|
|
6
|
+
import { fileURLToPath, pathToFileURL } from "node:url";
|
|
7
|
+
const PACKAGE_RE = /^@devflow-tools\/plugin-[a-z0-9-]+$/;
|
|
8
|
+
export function getPluginInstallRoot(home = homedir()) {
|
|
9
|
+
return join(home, ".devflow", "plugins");
|
|
10
|
+
}
|
|
11
|
+
export function getPluginInstallStatePath(home = homedir()) {
|
|
12
|
+
return join(getPluginInstallRoot(home), "installed.json");
|
|
13
|
+
}
|
|
14
|
+
export function emptyPluginInstallState() {
|
|
15
|
+
return { schemaVersion: "devflow.plugins.v1", plugins: {} };
|
|
16
|
+
}
|
|
17
|
+
export function readPluginInstallState(home = homedir()) {
|
|
18
|
+
try {
|
|
19
|
+
const parsed = JSON.parse(readFileSync(getPluginInstallStatePath(home), "utf8"));
|
|
20
|
+
if (parsed.schemaVersion !== "devflow.plugins.v1" || !parsed.plugins || typeof parsed.plugins !== "object") {
|
|
21
|
+
return emptyPluginInstallState();
|
|
22
|
+
}
|
|
23
|
+
return { schemaVersion: "devflow.plugins.v1", plugins: parsed.plugins };
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return emptyPluginInstallState();
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
export function writePluginInstallState(state, home = homedir()) {
|
|
30
|
+
const path = getPluginInstallStatePath(home);
|
|
31
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
32
|
+
const temporary = `${path}.${process.pid}.${Date.now()}.tmp`;
|
|
33
|
+
writeFileSync(temporary, `${JSON.stringify(state, null, 2)}\n`, "utf8");
|
|
34
|
+
renameSync(temporary, path);
|
|
35
|
+
}
|
|
36
|
+
export function upsertPluginInstallRecord(record, home = homedir()) {
|
|
37
|
+
const state = readPluginInstallState(home);
|
|
38
|
+
state.plugins[record.packageName] = record;
|
|
39
|
+
writePluginInstallState(state, home);
|
|
40
|
+
return state;
|
|
41
|
+
}
|
|
42
|
+
export function removePluginInstallRecord(packageName, home = homedir()) {
|
|
43
|
+
const state = readPluginInstallState(home);
|
|
44
|
+
delete state.plugins[packageName];
|
|
45
|
+
writePluginInstallState(state, home);
|
|
46
|
+
return state;
|
|
47
|
+
}
|
|
48
|
+
function projectPluginNames(projectRoot) {
|
|
49
|
+
try {
|
|
50
|
+
const config = JSON.parse(readFileSync(join(projectRoot, ".devflow", "config.json"), "utf8"));
|
|
51
|
+
return new Set((Array.isArray(config.plugins) ? config.plugins : [])
|
|
52
|
+
.filter((name) => typeof name === "string")
|
|
53
|
+
.map((name) => name.startsWith("@devflow-tools/plugin-") ? name : `@devflow-tools/plugin-${name}`));
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
return new Set();
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
function registryPackageNames(registryPath) {
|
|
60
|
+
const moduleDir = dirname(fileURLToPath(import.meta.url));
|
|
61
|
+
const paths = registryPath ? [registryPath] : [
|
|
62
|
+
join(process.cwd(), "plugin-registry.json"),
|
|
63
|
+
join(process.cwd(), "packages", "devflow", "plugin-registry.json"),
|
|
64
|
+
resolve(moduleDir, "..", "..", "devflow", "plugin-registry.json"),
|
|
65
|
+
];
|
|
66
|
+
for (const path of paths) {
|
|
67
|
+
try {
|
|
68
|
+
const value = JSON.parse(readFileSync(path, "utf8"));
|
|
69
|
+
if (!/^1(?:\.|$)/.test(value.version ?? "") || !Array.isArray(value.plugins))
|
|
70
|
+
continue;
|
|
71
|
+
return value.plugins.map((entry) => entry.name).filter((name) => typeof name === "string" && PACKAGE_RE.test(name));
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
// Try the next registry location.
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return [];
|
|
78
|
+
}
|
|
79
|
+
function packagePathFromInstallRoot(packageName, root) {
|
|
80
|
+
const path = join(root, ...packageName.split("/"));
|
|
81
|
+
return existsSync(path) ? path : undefined;
|
|
82
|
+
}
|
|
83
|
+
export function resolvePluginCandidates(options = {}) {
|
|
84
|
+
const projectRoot = options.projectRoot ?? process.cwd();
|
|
85
|
+
const home = options.homeDir ?? homedir();
|
|
86
|
+
const configured = projectPluginNames(projectRoot);
|
|
87
|
+
const state = readPluginInstallState(home);
|
|
88
|
+
const names = new Set([
|
|
89
|
+
...configured,
|
|
90
|
+
...registryPackageNames(options.registryPath),
|
|
91
|
+
]);
|
|
92
|
+
const candidates = [];
|
|
93
|
+
for (const packageName of names) {
|
|
94
|
+
if (!PACKAGE_RE.test(packageName))
|
|
95
|
+
continue;
|
|
96
|
+
const record = state.plugins[packageName];
|
|
97
|
+
if (record?.installPath && existsSync(record.installPath)) {
|
|
98
|
+
candidates.push({ packageName, modulePath: record.installPath, installPath: record.installPath, source: record.source });
|
|
99
|
+
continue;
|
|
100
|
+
}
|
|
101
|
+
const projectPath = packagePathFromInstallRoot(packageName, join(projectRoot, "node_modules"));
|
|
102
|
+
if (projectPath) {
|
|
103
|
+
candidates.push({ packageName, modulePath: projectPath, installPath: projectPath, source: "npm" });
|
|
104
|
+
continue;
|
|
105
|
+
}
|
|
106
|
+
const isolatedPath = packagePathFromInstallRoot(packageName, join(getPluginInstallRoot(home), "node_modules"));
|
|
107
|
+
if (isolatedPath) {
|
|
108
|
+
candidates.push({ packageName, modulePath: isolatedPath, installPath: isolatedPath, source: "npm" });
|
|
109
|
+
continue;
|
|
110
|
+
}
|
|
111
|
+
candidates.push({ packageName, source: "workspace" });
|
|
112
|
+
}
|
|
113
|
+
return candidates;
|
|
114
|
+
}
|
|
115
|
+
export function recordPluginLoadDiagnostics(diagnostics, home = homedir()) {
|
|
116
|
+
const state = readPluginInstallState(home);
|
|
117
|
+
let changed = false;
|
|
118
|
+
for (const diagnostic of diagnostics) {
|
|
119
|
+
const record = state.plugins[diagnostic.packageName];
|
|
120
|
+
if (!record)
|
|
121
|
+
continue;
|
|
122
|
+
record.lastLoad = {
|
|
123
|
+
status: diagnostic.status,
|
|
124
|
+
checkedAt: new Date().toISOString(),
|
|
125
|
+
...(diagnostic.reason ? { reason: diagnostic.reason } : {}),
|
|
126
|
+
};
|
|
127
|
+
changed = true;
|
|
128
|
+
}
|
|
129
|
+
if (changed)
|
|
130
|
+
writePluginInstallState(state, home);
|
|
131
|
+
}
|
|
132
|
+
export async function importPluginModule(candidate) {
|
|
133
|
+
if (!candidate.modulePath) {
|
|
134
|
+
return import(candidate.packageName);
|
|
135
|
+
}
|
|
136
|
+
const packageJson = join(candidate.modulePath, "package.json");
|
|
137
|
+
let entry = candidate.modulePath;
|
|
138
|
+
try {
|
|
139
|
+
const pkg = JSON.parse(readFileSync(packageJson, "utf8"));
|
|
140
|
+
entry = join(candidate.modulePath, pkg.module ?? pkg.main ?? "dist/index.js");
|
|
141
|
+
}
|
|
142
|
+
catch {
|
|
143
|
+
// A direct module path can still be imported.
|
|
144
|
+
}
|
|
145
|
+
try {
|
|
146
|
+
return await import(pathToFileURL(entry).href);
|
|
147
|
+
}
|
|
148
|
+
catch (error) {
|
|
149
|
+
// CommonJS packages are supported as a controlled fallback.
|
|
150
|
+
const require = createRequire(import.meta.url);
|
|
151
|
+
try {
|
|
152
|
+
return require(entry);
|
|
153
|
+
}
|
|
154
|
+
catch {
|
|
155
|
+
throw error;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
export function extractPlugin(module, packageName) {
|
|
160
|
+
const shortName = packageName.replace("@devflow-tools/plugin-", "");
|
|
161
|
+
const expected = module[`${shortName}Plugin`];
|
|
162
|
+
if (isPlugin(expected))
|
|
163
|
+
return expected;
|
|
164
|
+
return Object.values(module).find(isPlugin) ?? null;
|
|
165
|
+
}
|
|
166
|
+
export function pluginCapabilities(plugin) {
|
|
167
|
+
const capabilities = ["knowledge"];
|
|
168
|
+
if (plugin.memory)
|
|
169
|
+
capabilities.push("memory");
|
|
170
|
+
if (plugin.workflow)
|
|
171
|
+
capabilities.push("workflow");
|
|
172
|
+
if (plugin.tools?.length)
|
|
173
|
+
capabilities.push("tools");
|
|
174
|
+
if (plugin.prompt || plugin.workflow?.templates?.length)
|
|
175
|
+
capabilities.push("skill");
|
|
176
|
+
return capabilities;
|
|
177
|
+
}
|
|
178
|
+
export function pluginFingerprint(plugin) {
|
|
179
|
+
return createHash("sha256").update(`${plugin.meta.name}:${plugin.meta.version}`).digest("hex").slice(0, 16);
|
|
180
|
+
}
|
|
181
|
+
function isPlugin(value) {
|
|
182
|
+
if (!value || typeof value !== "object")
|
|
183
|
+
return false;
|
|
184
|
+
const candidate = value;
|
|
185
|
+
return Boolean(candidate.meta && typeof candidate.meta.name === "string" && typeof candidate.meta.version === "string" && candidate.knowledge && Array.isArray(candidate.knowledge.sources));
|
|
186
|
+
}
|
|
187
|
+
export function validatePlugin(plugin, packageName) {
|
|
188
|
+
const issues = [];
|
|
189
|
+
if (!plugin.meta.name.trim())
|
|
190
|
+
issues.push("meta.name is empty");
|
|
191
|
+
if (!/^\d+\.\d+\.\d+/.test(plugin.meta.version))
|
|
192
|
+
issues.push(`invalid plugin version: ${plugin.meta.version}`);
|
|
193
|
+
if (!PACKAGE_RE.test(packageName))
|
|
194
|
+
issues.push(`unsupported package name: ${packageName}`);
|
|
195
|
+
const toolNames = new Set();
|
|
196
|
+
for (const tool of plugin.tools ?? []) {
|
|
197
|
+
if (!/^[a-z0-9][a-z0-9_-]*$/.test(tool.name))
|
|
198
|
+
issues.push(`invalid tool name: ${tool.name}`);
|
|
199
|
+
if (toolNames.has(tool.name))
|
|
200
|
+
issues.push(`duplicate tool name: ${tool.name}`);
|
|
201
|
+
toolNames.add(tool.name);
|
|
202
|
+
if (!tool.handler || typeof tool.handler !== "function")
|
|
203
|
+
issues.push(`tool ${tool.name} has no handler`);
|
|
204
|
+
}
|
|
205
|
+
const stepIds = new Set();
|
|
206
|
+
for (const step of plugin.workflow?.steps ?? []) {
|
|
207
|
+
if (stepIds.has(step.id))
|
|
208
|
+
issues.push(`duplicate workflow step: ${step.id}`);
|
|
209
|
+
stepIds.add(step.id);
|
|
210
|
+
}
|
|
211
|
+
return issues;
|
|
212
|
+
}
|
|
213
|
+
export function validatePluginSet(plugins, reservedToolNames = []) {
|
|
214
|
+
const issues = [];
|
|
215
|
+
const names = new Set();
|
|
216
|
+
const tools = new Set(reservedToolNames);
|
|
217
|
+
const workflows = new Set();
|
|
218
|
+
for (const plugin of plugins) {
|
|
219
|
+
if (names.has(plugin.meta.name))
|
|
220
|
+
issues.push(`duplicate plugin name: ${plugin.meta.name}`);
|
|
221
|
+
names.add(plugin.meta.name);
|
|
222
|
+
for (const tool of plugin.tools ?? []) {
|
|
223
|
+
if (tools.has(tool.name))
|
|
224
|
+
issues.push(`tool name conflict: ${tool.name} (${plugin.meta.name})`);
|
|
225
|
+
tools.add(tool.name);
|
|
226
|
+
}
|
|
227
|
+
for (const template of plugin.workflow?.templates ?? []) {
|
|
228
|
+
const workflowName = `${plugin.meta.name}:${template.name}`;
|
|
229
|
+
if (workflows.has(workflowName))
|
|
230
|
+
issues.push(`workflow name conflict: ${workflowName}`);
|
|
231
|
+
workflows.add(workflowName);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
return issues;
|
|
235
|
+
}
|
|
236
|
+
//# sourceMappingURL=plugin-runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-runtime.js","sourceRoot":"","sources":["../src/plugin-runtime.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@devflow-tools/sdk",
|
|
3
|
-
"version": "0.16.
|
|
3
|
+
"version": "0.16.10",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
"clean": "rm -rf dist"
|
|
34
34
|
},
|
|
35
35
|
"dependencies": {
|
|
36
|
-
"@devflow-tools/database": "0.16.
|
|
36
|
+
"@devflow-tools/database": "0.16.10",
|
|
37
37
|
"tiktoken": "^1.0.0"
|
|
38
38
|
},
|
|
39
39
|
"devDependencies": {
|
|
@@ -43,5 +43,5 @@
|
|
|
43
43
|
"files": [
|
|
44
44
|
"dist"
|
|
45
45
|
],
|
|
46
|
-
"gitHead": "
|
|
46
|
+
"gitHead": "964af33767bf232606e63d973b3a29d7d53c8119"
|
|
47
47
|
}
|