@devflow-tools/cli 0.16.8 → 0.16.9
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/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +59 -2
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/mcp.d.ts +10 -0
- package/dist/commands/mcp.d.ts.map +1 -0
- package/dist/commands/mcp.js +33 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/commands/plugin/install.d.ts.map +1 -1
- package/dist/commands/plugin/install.js +6 -7
- package/dist/commands/plugin/install.js.map +1 -1
- package/dist/commands/plugin/uninstall.d.ts.map +1 -1
- package/dist/commands/plugin/uninstall.js +6 -7
- package/dist/commands/plugin/uninstall.js.map +1 -1
- package/dist/commands/plugin-guide.d.ts.map +1 -1
- package/dist/commands/plugin-guide.js +8 -5
- package/dist/commands/plugin-guide.js.map +1 -1
- package/dist/commands/skill-health.d.ts +21 -0
- package/dist/commands/skill-health.d.ts.map +1 -0
- package/dist/commands/skill-health.js +106 -0
- package/dist/commands/skill-health.js.map +1 -0
- package/dist/commands/skill.d.ts.map +1 -1
- package/dist/commands/skill.js +101 -29
- package/dist/commands/skill.js.map +1 -1
- package/dist/index.js +32 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/plugin-registry.d.ts.map +1 -1
- package/dist/lib/plugin-registry.js +3 -10
- package/dist/lib/plugin-registry.js.map +1 -1
- package/dist/plugin-files/.claude-plugin/plugin.json +1 -1
- package/dist/plugin-files/dist/command-registry.json +116 -20
- package/dist/plugin-files/dist/hooks/hook-client.js +6 -6
- package/dist/plugin-files/dist/hooks/hook-daemon.js +9 -9
- package/dist/plugin-files/dist/hooks/post-tool-use.js +3 -3
- package/dist/plugin-files/dist/hooks/pre-tool-use.js +2 -2
- package/dist/plugin-files/dist/hooks/user-prompt-submit.js +2 -2
- package/dist/plugin-files/package.json +7 -7
- package/package.json +27 -27
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/doctor.js
CHANGED
|
@@ -6,9 +6,10 @@ import { basename, dirname, extname, isAbsolute, join, relative, resolve, sep }
|
|
|
6
6
|
import { spawnSync } from "node:child_process";
|
|
7
7
|
import { fileURLToPath } from "node:url";
|
|
8
8
|
import chalk from "chalk";
|
|
9
|
-
import { DOCTOR_SCHEMA_VERSION } from "@devflow-tools/sdk";
|
|
9
|
+
import { DOCTOR_SCHEMA_VERSION, checkMcpHealth, loadPluginsWithDiagnostics, readMcpInventory, redactMcpInventory, } from "@devflow-tools/sdk";
|
|
10
10
|
import { resolveActivePlugin, scanClaudeSkillShadowing } from "../lib/plugin-setup.js";
|
|
11
11
|
import { serverStatus } from "./server.js";
|
|
12
|
+
import { inspectSkillHealth } from "./skill-health.js";
|
|
12
13
|
import { getGlobalDevFlowDbPath } from "@devflow-tools/database";
|
|
13
14
|
function getProjectHash(rootPath) {
|
|
14
15
|
return createHash("sha256").update(rootPath).digest("hex").slice(0, 16);
|
|
@@ -43,6 +44,58 @@ function sectionStatus(metrics) {
|
|
|
43
44
|
}
|
|
44
45
|
return "green";
|
|
45
46
|
}
|
|
47
|
+
async function checkRuntimeControlPlane(project, dependencies) {
|
|
48
|
+
const home = dependencies.homePath ?? homedir();
|
|
49
|
+
const metrics = [];
|
|
50
|
+
const loaded = await loadPluginsWithDiagnostics({ projectRoot: project, homeDir: home });
|
|
51
|
+
const failedPlugins = loaded.diagnostics.filter((diagnostic) => diagnostic.status === "failed");
|
|
52
|
+
metrics.push({
|
|
53
|
+
key: "plugin_runtime",
|
|
54
|
+
value: loaded.diagnostics,
|
|
55
|
+
target: "configured plugins loadable with diagnostics",
|
|
56
|
+
ok: failedPlugins.length === 0,
|
|
57
|
+
severity: "warning",
|
|
58
|
+
});
|
|
59
|
+
const inventory = redactMcpInventory(readMcpInventory(project, home));
|
|
60
|
+
metrics.push({
|
|
61
|
+
key: "mcp_inventory",
|
|
62
|
+
value: { servers: inventory.servers.length, duplicates: inventory.duplicates.length, unreadable: inventory.unreadable.length },
|
|
63
|
+
target: { duplicates: 0, unreadable: 0 },
|
|
64
|
+
ok: inventory.unreadable.length === 0,
|
|
65
|
+
severity: inventory.unreadable.length > 0 ? "error" : "info",
|
|
66
|
+
});
|
|
67
|
+
metrics.push({
|
|
68
|
+
key: "mcp_configuration_drift",
|
|
69
|
+
value: inventory.duplicates.filter((entry) => entry.fingerprints.length > 1).map((entry) => entry.name),
|
|
70
|
+
target: [],
|
|
71
|
+
ok: inventory.duplicates.every((entry) => entry.fingerprints.length === 1),
|
|
72
|
+
severity: "warning",
|
|
73
|
+
});
|
|
74
|
+
const health = await checkMcpHealth(inventory, home);
|
|
75
|
+
const unhealthy = health.records.filter((record) => record.status === "unhealthy");
|
|
76
|
+
metrics.push({
|
|
77
|
+
key: "mcp_health",
|
|
78
|
+
value: health.records,
|
|
79
|
+
target: "no unhealthy enabled servers",
|
|
80
|
+
ok: unhealthy.length === 0,
|
|
81
|
+
severity: "warning",
|
|
82
|
+
});
|
|
83
|
+
const activePlugin = dependencies.activePluginRoot ?? resolveActivePlugin(home, {
|
|
84
|
+
installedPluginsPath: dependencies.installedPluginsPath,
|
|
85
|
+
pluginCachePath: dependencies.pluginCachePath,
|
|
86
|
+
}).root;
|
|
87
|
+
if (activePlugin) {
|
|
88
|
+
const skills = inspectSkillHealth(activePlugin);
|
|
89
|
+
metrics.push({
|
|
90
|
+
key: "skill_health",
|
|
91
|
+
value: { root: skills.pluginRoot, skills: skills.skills, commands: skills.commands, issues: skills.issues },
|
|
92
|
+
target: "valid and fully bound installed skills",
|
|
93
|
+
ok: skills.healthy,
|
|
94
|
+
severity: "warning",
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
return { name: "Contract", status: sectionStatus(metrics), metrics };
|
|
98
|
+
}
|
|
46
99
|
function canonicalizeProject(project) {
|
|
47
100
|
const absolute = resolve(project);
|
|
48
101
|
try {
|
|
@@ -4165,6 +4218,10 @@ async function checkUiReachability(dependencies) {
|
|
|
4165
4218
|
export async function runStructuredDoctor(options = {}, dependencies = {}) {
|
|
4166
4219
|
const requestedProject = options.project ?? process.cwd();
|
|
4167
4220
|
const canonical = canonicalizeProject(requestedProject);
|
|
4221
|
+
const contract = checkContract(dependencies);
|
|
4222
|
+
const runtimeControlPlane = await checkRuntimeControlPlane(canonical.path, dependencies);
|
|
4223
|
+
contract.metrics.push(...runtimeControlPlane.metrics);
|
|
4224
|
+
contract.status = sectionStatus(contract.metrics);
|
|
4168
4225
|
const sections = [
|
|
4169
4226
|
checkIsolation(requestedProject, dependencies),
|
|
4170
4227
|
checkDistill(canonical.path, dependencies),
|
|
@@ -4174,7 +4231,7 @@ export async function runStructuredDoctor(options = {}, dependencies = {}) {
|
|
|
4174
4231
|
checkInjection(canonical.path, dependencies),
|
|
4175
4232
|
checkMemoryQuality(canonical.path, dependencies),
|
|
4176
4233
|
checkKnowledgeQuality(canonical.path, dependencies),
|
|
4177
|
-
|
|
4234
|
+
contract,
|
|
4178
4235
|
checkDeadcode(dependencies),
|
|
4179
4236
|
checkBenchmark(dependencies),
|
|
4180
4237
|
checkDataFace(dependencies),
|