@mcp-graph-workflow/mcp-graph 5.0.4 → 5.1.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.
Files changed (42) hide show
  1. package/README.md +4 -2
  2. package/dist/api/routes/benchmark.d.ts.map +1 -1
  3. package/dist/api/routes/benchmark.js +1 -2
  4. package/dist/api/routes/benchmark.js.map +1 -1
  5. package/dist/cli/commands/doctor.d.ts +3 -0
  6. package/dist/cli/commands/doctor.d.ts.map +1 -0
  7. package/dist/cli/commands/doctor.js +55 -0
  8. package/dist/cli/commands/doctor.js.map +1 -0
  9. package/dist/cli/index.js +2 -0
  10. package/dist/cli/index.js.map +1 -1
  11. package/dist/core/doctor/doctor-checks.d.ts +43 -0
  12. package/dist/core/doctor/doctor-checks.d.ts.map +1 -0
  13. package/dist/core/doctor/doctor-checks.js +313 -0
  14. package/dist/core/doctor/doctor-checks.js.map +1 -0
  15. package/dist/core/doctor/doctor-runner.d.ts +6 -0
  16. package/dist/core/doctor/doctor-runner.d.ts.map +1 -0
  17. package/dist/core/doctor/doctor-runner.js +72 -0
  18. package/dist/core/doctor/doctor-runner.js.map +1 -0
  19. package/dist/core/doctor/doctor-types.d.ts +20 -0
  20. package/dist/core/doctor/doctor-types.d.ts.map +1 -0
  21. package/dist/core/doctor/doctor-types.js +5 -0
  22. package/dist/core/doctor/doctor-types.js.map +1 -0
  23. package/dist/core/planner/lifecycle-phase.d.ts +6 -0
  24. package/dist/core/planner/lifecycle-phase.d.ts.map +1 -1
  25. package/dist/core/planner/lifecycle-phase.js +23 -0
  26. package/dist/core/planner/lifecycle-phase.js.map +1 -1
  27. package/dist/mcp/lifecycle-wrapper.d.ts +2 -1
  28. package/dist/mcp/lifecycle-wrapper.d.ts.map +1 -1
  29. package/dist/mcp/lifecycle-wrapper.js +3 -0
  30. package/dist/mcp/lifecycle-wrapper.js.map +1 -1
  31. package/dist/web/dashboard/dist/assets/benchmark-tab-CuZsNkbP.js +1 -0
  32. package/dist/web/dashboard/dist/assets/{gitnexus-tab-DMCU41Nr.js → gitnexus-tab-D7If6lxT.js} +1 -1
  33. package/dist/web/dashboard/dist/assets/{graph-tab-BK8wjCuY.js → graph-tab-Dp7PfUEJ.js} +1 -1
  34. package/dist/web/dashboard/dist/assets/{graph-utils-qelY_PVT.js → graph-utils-D5iPoiPD.js} +1 -1
  35. package/dist/web/dashboard/dist/assets/{index-BBlpGofr.js → index-CN9Wi5mu.js} +2 -2
  36. package/dist/web/dashboard/dist/assets/{insights-tab-OQnPT7h1.js → insights-tab-CLA0OIxd.js} +1 -1
  37. package/dist/web/dashboard/dist/assets/{logs-tab-BCwPTvn9.js → logs-tab-CSYlvuCu.js} +1 -1
  38. package/dist/web/dashboard/dist/assets/{prd-backlog-tab-DkTq385t.js → prd-backlog-tab-BBLpErTk.js} +1 -1
  39. package/dist/web/dashboard/dist/assets/{serena-tab-CZ8Lp8yJ.js → serena-tab-BxYP8nU5.js} +1 -1
  40. package/dist/web/dashboard/dist/index.html +1 -1
  41. package/package.json +2 -2
  42. package/dist/web/dashboard/dist/assets/benchmark-tab-5r5wZQij.js +0 -1
package/README.md CHANGED
@@ -77,7 +77,8 @@ npm run dev # HTTP + dashboard at localhost:3000
77
77
  - **Semantic Search + RAG** — Full-text BM25 search + TF-IDF embeddings, 100% local
78
78
  - **Sprint Planning** — Velocity metrics, capacity-based planning, risk assessment
79
79
  - **Web Dashboard** — Interactive graph visualization, backlog tracking, code intelligence, insights
80
- - **Multi-Agent Mesh** — Serena + GitNexus + Context7 + Playwright coordinated via event bus
80
+ - **Multi-Agent Mesh** — Serena + GitNexus + Context7 + Playwright coordinated via event bus, with phase-aware MCP suggestions
81
+ - **Environment Doctor** — `mcp-graph doctor` validates Node.js, SQLite, permissions, integrations, and suggests fixes
81
82
  - **Local-First** — SQLite persistence, zero external dependencies, cross-platform
82
83
 
83
84
  ## Who is this for?
@@ -115,7 +116,7 @@ mcp-graph serve --port 3000 # or: npm run dev
115
116
  |---|---|---|
116
117
  | **MCP Tools** | 26 | [MCP-TOOLS-REFERENCE.md](docs/MCP-TOOLS-REFERENCE.md) |
117
118
  | **REST Endpoints** | 44 (17 routers) | [REST-API-REFERENCE.md](docs/REST-API-REFERENCE.md) |
118
- | **CLI Commands** | 5 | `init`, `import`, `index`, `stats`, `serve` |
119
+ | **CLI Commands** | 6 | `init`, `import`, `index`, `stats`, `serve`, `doctor` |
119
120
 
120
121
  ## Integrations
121
122
 
@@ -149,6 +150,7 @@ npm run test:all # Everything
149
150
  | [Knowledge Pipeline](docs/KNOWLEDGE-PIPELINE.md) | RAG, embeddings, context assembly |
150
151
  | [Integrations](docs/INTEGRATIONS-GUIDE.md) | Serena, GitNexus, Context7, Playwright |
151
152
  | [Test Guide](docs/TEST-GUIDE.md) | Test pyramid and best practices |
153
+ | [PRD Writing Guide](docs/PRD-WRITING-GUIDE.md) | How to write PRDs that import correctly |
152
154
  | [Lifecycle](docs/LIFECYCLE.md) | 8-phase dev methodology |
153
155
 
154
156
  ## Support the Project
@@ -1 +1 @@
1
- {"version":3,"file":"benchmark.d.ts","sourceRoot":"","sources":["../../../src/api/routes/benchmark.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mCAAmC,CAAC;AAKlE,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,CA+FhE"}
1
+ {"version":3,"file":"benchmark.d.ts","sourceRoot":"","sources":["../../../src/api/routes/benchmark.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mCAAmC,CAAC;AAIlE,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,CA+FhE"}
@@ -1,6 +1,5 @@
1
1
  import { Router } from "express";
2
2
  import { buildTaskContext } from "../../core/context/compact-context.js";
3
- import { estimateTokens } from "../../core/context/token-estimator.js";
4
3
  import { detectCycles } from "../../core/planner/dependency-chain.js";
5
4
  export function createBenchmarkRouter(storeRef) {
6
5
  const router = Router();
@@ -19,7 +18,7 @@ export function createBenchmarkRouter(storeRef) {
19
18
  const ctx = buildTaskContext(store, node.id);
20
19
  if (!ctx)
21
20
  continue;
22
- const rawTokens = estimateTokens(String(ctx.metrics.originalChars));
21
+ const rawTokens = Math.ceil(ctx.metrics.originalChars / 4);
23
22
  perTaskMetrics.push({
24
23
  id: node.id,
25
24
  title: node.title,
@@ -1 +1 @@
1
- {"version":3,"file":"benchmark.js","sourceRoot":"","sources":["../../../src/api/routes/benchmark.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"benchmark.js","sourceRoot":"","sources":["../../../src/api/routes/benchmark.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare function doctorCommand(): Command;
3
+ //# sourceMappingURL=doctor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/doctor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAwBpC,wBAAgB,aAAa,IAAI,OAAO,CAsCvC"}
@@ -0,0 +1,55 @@
1
+ import { Command } from "commander";
2
+ import { runDoctor } from "../../core/doctor/doctor-runner.js";
3
+ import { logger } from "../../core/utils/logger.js";
4
+ function output(msg) {
5
+ process.stdout.write(msg + "\n");
6
+ }
7
+ const LEVEL_ICON = {
8
+ ok: "\u2713",
9
+ warning: "\u26A0",
10
+ error: "\u2717",
11
+ };
12
+ function formatCheck(check) {
13
+ const icon = LEVEL_ICON[check.level] ?? "?";
14
+ let line = ` ${icon} ${check.message}`;
15
+ if (check.suggestion) {
16
+ line += `\n ${check.suggestion}`;
17
+ }
18
+ return line;
19
+ }
20
+ export function doctorCommand() {
21
+ return new Command("doctor")
22
+ .description("Validate the execution environment")
23
+ .option("-d, --dir <dir>", "Project directory", process.cwd())
24
+ .option("--json", "Output as JSON")
25
+ .action(async (opts) => {
26
+ try {
27
+ const report = await runDoctor(opts.dir);
28
+ if (opts.json) {
29
+ output(JSON.stringify(report, null, 2));
30
+ }
31
+ else {
32
+ output("mcp-graph doctor\n");
33
+ for (const check of report.checks) {
34
+ output(formatCheck(check));
35
+ }
36
+ output("");
37
+ output(`Summary: ${report.summary.ok} ok, ${report.summary.warning} warnings, ${report.summary.error} errors`);
38
+ if (report.passed) {
39
+ output("\nAll critical checks passed.");
40
+ }
41
+ else {
42
+ output("\nSome critical checks failed. Fix errors above.");
43
+ }
44
+ }
45
+ if (!report.passed) {
46
+ process.exit(1);
47
+ }
48
+ }
49
+ catch (err) {
50
+ logger.error(`Doctor failed: ${err instanceof Error ? err.message : String(err)}`);
51
+ process.exit(1);
52
+ }
53
+ });
54
+ }
55
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../../src/cli/commands/doctor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,oCAAoC,CAAC;AAC/D,OAAO,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAC;AAGpD,SAAS,MAAM,CAAC,GAAW;IACzB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,GAA2B;IACzC,EAAE,EAAE,QAAQ;IACZ,OAAO,EAAE,QAAQ;IACjB,KAAK,EAAE,QAAQ;CAChB,CAAC;AAEF,SAAS,WAAW,CAAC,KAAkB;IACrC,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC;IAC5C,IAAI,IAAI,GAAG,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;IACxC,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;QACrB,IAAI,IAAI,WAAW,KAAK,CAAC,UAAU,EAAE,CAAC;IACxC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,OAAO,IAAI,OAAO,CAAC,QAAQ,CAAC;SACzB,WAAW,CAAC,oCAAoC,CAAC;SACjD,MAAM,CAAC,iBAAiB,EAAE,mBAAmB,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC;SAC7D,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,KAAK,EAAE,IAAoC,EAAE,EAAE;QACrD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAEzC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBACd,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAC1C,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,oBAAoB,CAAC,CAAC;gBAE7B,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;oBAClC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;gBAC7B,CAAC;gBAED,MAAM,CAAC,EAAE,CAAC,CAAC;gBACX,MAAM,CACJ,YAAY,MAAM,CAAC,OAAO,CAAC,EAAE,QAAQ,MAAM,CAAC,OAAO,CAAC,OAAO,cAAc,MAAM,CAAC,OAAO,CAAC,KAAK,SAAS,CACvG,CAAC;gBAEF,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;oBAClB,MAAM,CAAC,+BAA+B,CAAC,CAAC;gBAC1C,CAAC;qBAAM,CAAC;oBACN,MAAM,CAAC,kDAAkD,CAAC,CAAC;gBAC7D,CAAC;YACH,CAAC;YAED,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;gBACnB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,KAAK,CAAC,kBAAkB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACnF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
package/dist/cli/index.js CHANGED
@@ -20,6 +20,7 @@ else {
20
20
  const { statsCommand } = await import("./commands/stats.js");
21
21
  const { initCommand } = await import("./commands/init.js");
22
22
  const { indexCommand } = await import("./commands/index-cmd.js");
23
+ const { doctorCommand } = await import("./commands/doctor.js");
23
24
  const program = new Command();
24
25
  program
25
26
  .name("mcp-graph")
@@ -30,6 +31,7 @@ else {
30
31
  program.addCommand(statsCommand());
31
32
  program.addCommand(initCommand());
32
33
  program.addCommand(indexCommand());
34
+ program.addCommand(doctorCommand());
33
35
  program.parse();
34
36
  }
35
37
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AAGA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,GAAG,GAAG,OAAO,CAAC,oBAAoB,CAAsC,CAAC;AAE/E,8EAA8E;AAC9E,qEAAqE;AACrE,MAAM,WAAW,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;AAErE,IAAI,WAAW,EAAE,CAAC;IAChB,+EAA+E;IAC/E,MAAM,MAAM,CAAC,iBAAiB,CAAC,CAAC;AAClC,CAAC;KAAM,CAAC;IACN,qDAAqD;IACrD,MAAM,cAAc,GAAG,CAAC,MAAM,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC,OAAO,CAAC;IACjE,cAAc,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC;IAEjC,oCAAoC;IACpC,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC;IAC9C,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,qBAAqB,CAAC,CAAC;IAC7D,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,0BAA0B,CAAC,CAAC;IACnE,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,qBAAqB,CAAC,CAAC;IAC7D,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;IAC3D,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,yBAAyB,CAAC,CAAC;IAEjE,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAE9B,OAAO;SACJ,IAAI,CAAC,WAAW,CAAC;SACjB,WAAW,CACV,2EAA2E,CAC5E;SACA,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAExB,OAAO,CAAC,UAAU,CAAC,YAAY,EAAE,CAAC,CAAC;IACnC,OAAO,CAAC,UAAU,CAAC,aAAa,EAAE,CAAC,CAAC;IACpC,OAAO,CAAC,UAAU,CAAC,YAAY,EAAE,CAAC,CAAC;IACnC,OAAO,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC;IAClC,OAAO,CAAC,UAAU,CAAC,YAAY,EAAE,CAAC,CAAC;IAEnC,OAAO,CAAC,KAAK,EAAE,CAAC;AAClB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AAGA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,GAAG,GAAG,OAAO,CAAC,oBAAoB,CAAsC,CAAC;AAE/E,8EAA8E;AAC9E,qEAAqE;AACrE,MAAM,WAAW,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;AAErE,IAAI,WAAW,EAAE,CAAC;IAChB,+EAA+E;IAC/E,MAAM,MAAM,CAAC,iBAAiB,CAAC,CAAC;AAClC,CAAC;KAAM,CAAC;IACN,qDAAqD;IACrD,MAAM,cAAc,GAAG,CAAC,MAAM,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC,OAAO,CAAC;IACjE,cAAc,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC;IAEjC,oCAAoC;IACpC,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC;IAC9C,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,qBAAqB,CAAC,CAAC;IAC7D,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,0BAA0B,CAAC,CAAC;IACnE,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,qBAAqB,CAAC,CAAC;IAC7D,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;IAC3D,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,yBAAyB,CAAC,CAAC;IACjE,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,sBAAsB,CAAC,CAAC;IAE/D,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAE9B,OAAO;SACJ,IAAI,CAAC,WAAW,CAAC;SACjB,WAAW,CACV,2EAA2E,CAC5E;SACA,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAExB,OAAO,CAAC,UAAU,CAAC,YAAY,EAAE,CAAC,CAAC;IACnC,OAAO,CAAC,UAAU,CAAC,aAAa,EAAE,CAAC,CAAC;IACpC,OAAO,CAAC,UAAU,CAAC,YAAY,EAAE,CAAC,CAAC;IACnC,OAAO,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC;IAClC,OAAO,CAAC,UAAU,CAAC,YAAY,EAAE,CAAC,CAAC;IACnC,OAAO,CAAC,UAAU,CAAC,aAAa,EAAE,CAAC,CAAC;IAEpC,OAAO,CAAC,KAAK,EAAE,CAAC;AAClB,CAAC"}
@@ -0,0 +1,43 @@
1
+ import type { SqliteStore } from "../store/sqlite-store.js";
2
+ import type { CheckResult } from "./doctor-types.js";
3
+ /**
4
+ * Check Node.js version >= 20 using the current runtime.
5
+ */
6
+ export declare function checkNodeVersion(): CheckResult;
7
+ /**
8
+ * Check Node.js version >= 20 with an explicit version string (testable).
9
+ */
10
+ export declare function checkNodeVersionWith(version: string): CheckResult;
11
+ /**
12
+ * Check write permissions on the store directory.
13
+ */
14
+ export declare function checkWritePermissions(basePath: string): Promise<CheckResult>;
15
+ /**
16
+ * Check that the SQLite database exists and can be opened.
17
+ */
18
+ export declare function checkSqliteDatabase(basePath: string): Promise<CheckResult>;
19
+ /**
20
+ * Check database integrity via PRAGMA integrity_check.
21
+ */
22
+ export declare function checkDbIntegrity(basePath: string): Promise<CheckResult>;
23
+ /**
24
+ * Check if the graph project is initialized.
25
+ */
26
+ export declare function checkGraphInitialized(store: SqliteStore): CheckResult;
27
+ /**
28
+ * Check if the config file exists and is valid.
29
+ */
30
+ export declare function checkConfigFile(basePath: string): CheckResult;
31
+ /**
32
+ * Check if the dashboard build artifacts exist.
33
+ */
34
+ export declare function checkDashboardBuild(basePath: string): Promise<CheckResult>;
35
+ /**
36
+ * Check if .mcp.json exists and is valid.
37
+ */
38
+ export declare function checkMcpJson(basePath: string): CheckResult;
39
+ /**
40
+ * Check integration tools (GitNexus, Serena, Playwright).
41
+ */
42
+ export declare function checkIntegrations(basePath: string): Promise<CheckResult[]>;
43
+ //# sourceMappingURL=doctor-checks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor-checks.d.ts","sourceRoot":"","sources":["../../../src/core/doctor/doctor-checks.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAK5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAIrD;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,WAAW,CAE9C;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,CAejE;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CA2BlF;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CA0BhF;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAkC7E;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,WAAW,GAAG,WAAW,CAwBrE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,CAyB7D;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAgBhF;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,CA0B1D;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAgEhF"}
@@ -0,0 +1,313 @@
1
+ import { existsSync, readFileSync } from "node:fs";
2
+ import { access, constants } from "node:fs/promises";
3
+ import path from "node:path";
4
+ import Database from "better-sqlite3";
5
+ import { STORE_DIR, DB_FILE } from "../utils/constants.js";
6
+ import { fileExists } from "../utils/fs.js";
7
+ import { getIntegrationsStatus } from "../integrations/tool-status.js";
8
+ import { logger } from "../utils/logger.js";
9
+ const MIN_NODE_VERSION = 20;
10
+ /**
11
+ * Check Node.js version >= 20 using the current runtime.
12
+ */
13
+ export function checkNodeVersion() {
14
+ return checkNodeVersionWith(process.versions.node);
15
+ }
16
+ /**
17
+ * Check Node.js version >= 20 with an explicit version string (testable).
18
+ */
19
+ export function checkNodeVersionWith(version) {
20
+ const major = parseInt(version.split(".")[0], 10);
21
+ if (major >= MIN_NODE_VERSION) {
22
+ return {
23
+ name: "node-version",
24
+ level: "ok",
25
+ message: `Node.js v${version} (>= ${MIN_NODE_VERSION})`,
26
+ };
27
+ }
28
+ return {
29
+ name: "node-version",
30
+ level: "error",
31
+ message: `Node.js v${version} is below minimum v${MIN_NODE_VERSION}`,
32
+ suggestion: `Upgrade Node.js to v${MIN_NODE_VERSION} or later: https://nodejs.org`,
33
+ };
34
+ }
35
+ /**
36
+ * Check write permissions on the store directory.
37
+ */
38
+ export async function checkWritePermissions(basePath) {
39
+ const storeDir = path.join(basePath, STORE_DIR);
40
+ try {
41
+ await access(storeDir, constants.W_OK);
42
+ return {
43
+ name: "write-permissions",
44
+ level: "ok",
45
+ message: `Write access to ${STORE_DIR}/`,
46
+ };
47
+ }
48
+ catch {
49
+ // If store dir doesn't exist, check parent
50
+ try {
51
+ await access(basePath, constants.W_OK);
52
+ return {
53
+ name: "write-permissions",
54
+ level: "ok",
55
+ message: `Write access to project directory (${STORE_DIR}/ will be created)`,
56
+ };
57
+ }
58
+ catch {
59
+ return {
60
+ name: "write-permissions",
61
+ level: "error",
62
+ message: `No write access to ${basePath}`,
63
+ suggestion: `Check directory permissions: chmod u+w "${basePath}"`,
64
+ };
65
+ }
66
+ }
67
+ }
68
+ /**
69
+ * Check that the SQLite database exists and can be opened.
70
+ */
71
+ export async function checkSqliteDatabase(basePath) {
72
+ const dbPath = path.join(basePath, STORE_DIR, DB_FILE);
73
+ if (!existsSync(dbPath)) {
74
+ return {
75
+ name: "sqlite-database",
76
+ level: "error",
77
+ message: `Database not found at ${STORE_DIR}/${DB_FILE}`,
78
+ suggestion: "Run 'mcp-graph init' to create the database",
79
+ };
80
+ }
81
+ try {
82
+ const db = new Database(dbPath, { readonly: true });
83
+ db.close();
84
+ return {
85
+ name: "sqlite-database",
86
+ level: "ok",
87
+ message: `Database exists at ${STORE_DIR}/${DB_FILE}`,
88
+ };
89
+ }
90
+ catch (err) {
91
+ return {
92
+ name: "sqlite-database",
93
+ level: "error",
94
+ message: `Database corrupt or unreadable: ${err instanceof Error ? err.message : String(err)}`,
95
+ suggestion: "Try restoring from a snapshot or re-running 'mcp-graph init'",
96
+ };
97
+ }
98
+ }
99
+ /**
100
+ * Check database integrity via PRAGMA integrity_check.
101
+ */
102
+ export async function checkDbIntegrity(basePath) {
103
+ const dbPath = path.join(basePath, STORE_DIR, DB_FILE);
104
+ if (!existsSync(dbPath)) {
105
+ return {
106
+ name: "db-integrity",
107
+ level: "error",
108
+ message: "Cannot check integrity — database not found",
109
+ };
110
+ }
111
+ try {
112
+ const db = new Database(dbPath, { readonly: true });
113
+ const result = db.pragma("integrity_check");
114
+ db.close();
115
+ const isOk = result.length === 1 && result[0].integrity_check === "ok";
116
+ if (isOk) {
117
+ return {
118
+ name: "db-integrity",
119
+ level: "ok",
120
+ message: "Database integrity check passed",
121
+ };
122
+ }
123
+ return {
124
+ name: "db-integrity",
125
+ level: "error",
126
+ message: `Database integrity issues: ${result.map((r) => r.integrity_check).join(", ")}`,
127
+ suggestion: "Restore from a snapshot: mcp-graph snapshot --restore <id>",
128
+ };
129
+ }
130
+ catch (err) {
131
+ return {
132
+ name: "db-integrity",
133
+ level: "error",
134
+ message: `Integrity check failed: ${err instanceof Error ? err.message : String(err)}`,
135
+ };
136
+ }
137
+ }
138
+ /**
139
+ * Check if the graph project is initialized.
140
+ */
141
+ export function checkGraphInitialized(store) {
142
+ try {
143
+ const project = store.getProject();
144
+ if (project) {
145
+ return {
146
+ name: "graph-initialized",
147
+ level: "ok",
148
+ message: `Project "${project.name}" initialized`,
149
+ };
150
+ }
151
+ return {
152
+ name: "graph-initialized",
153
+ level: "warning",
154
+ message: "No project initialized",
155
+ suggestion: "Run 'mcp-graph init' to initialize a project",
156
+ };
157
+ }
158
+ catch {
159
+ return {
160
+ name: "graph-initialized",
161
+ level: "warning",
162
+ message: "Could not check project initialization",
163
+ suggestion: "Run 'mcp-graph init' to initialize a project",
164
+ };
165
+ }
166
+ }
167
+ /**
168
+ * Check if the config file exists and is valid.
169
+ */
170
+ export function checkConfigFile(basePath) {
171
+ const configPath = path.join(basePath, "mcp-graph.config.json");
172
+ if (!existsSync(configPath)) {
173
+ return {
174
+ name: "config-file",
175
+ level: "ok",
176
+ message: "No config file — using defaults",
177
+ };
178
+ }
179
+ try {
180
+ const raw = readFileSync(configPath, "utf-8");
181
+ JSON.parse(raw);
182
+ return {
183
+ name: "config-file",
184
+ level: "ok",
185
+ message: "Config file is valid JSON",
186
+ };
187
+ }
188
+ catch (err) {
189
+ return {
190
+ name: "config-file",
191
+ level: "warning",
192
+ message: `Config file has invalid JSON: ${err instanceof Error ? err.message : String(err)}`,
193
+ suggestion: "Fix the JSON syntax in mcp-graph.config.json",
194
+ };
195
+ }
196
+ }
197
+ /**
198
+ * Check if the dashboard build artifacts exist.
199
+ */
200
+ export async function checkDashboardBuild(basePath) {
201
+ const dashboardIndex = path.join(basePath, "dist", "web", "dashboard", "index.html");
202
+ const exists = await fileExists(dashboardIndex);
203
+ if (exists) {
204
+ return {
205
+ name: "dashboard-build",
206
+ level: "ok",
207
+ message: "Dashboard build found",
208
+ };
209
+ }
210
+ return {
211
+ name: "dashboard-build",
212
+ level: "warning",
213
+ message: "Dashboard build not found",
214
+ suggestion: "Run 'npm run build' to build the dashboard",
215
+ };
216
+ }
217
+ /**
218
+ * Check if .mcp.json exists and is valid.
219
+ */
220
+ export function checkMcpJson(basePath) {
221
+ const mcpPath = path.join(basePath, ".mcp.json");
222
+ if (!existsSync(mcpPath)) {
223
+ return {
224
+ name: "mcp-json",
225
+ level: "warning",
226
+ message: ".mcp.json not found",
227
+ suggestion: "Create .mcp.json with MCP server configuration",
228
+ };
229
+ }
230
+ try {
231
+ const raw = readFileSync(mcpPath, "utf-8");
232
+ JSON.parse(raw);
233
+ return {
234
+ name: "mcp-json",
235
+ level: "ok",
236
+ message: ".mcp.json is valid",
237
+ };
238
+ }
239
+ catch {
240
+ return {
241
+ name: "mcp-json",
242
+ level: "warning",
243
+ message: ".mcp.json has invalid JSON",
244
+ suggestion: "Fix the JSON syntax in .mcp.json",
245
+ };
246
+ }
247
+ }
248
+ /**
249
+ * Check integration tools (GitNexus, Serena, Playwright).
250
+ */
251
+ export async function checkIntegrations(basePath) {
252
+ try {
253
+ const status = await getIntegrationsStatus(basePath);
254
+ const results = [];
255
+ // GitNexus
256
+ results.push({
257
+ name: "integration-gitnexus",
258
+ level: status.gitnexus.installed ? "ok" : "warning",
259
+ message: status.gitnexus.installed
260
+ ? `GitNexus installed${status.gitnexus.running ? " and running" : ""}`
261
+ : "GitNexus not installed",
262
+ ...(!status.gitnexus.installed && {
263
+ suggestion: "Install GitNexus: npm install -g gitnexus",
264
+ }),
265
+ });
266
+ // Serena
267
+ results.push({
268
+ name: "integration-serena",
269
+ level: status.serena.installed ? "ok" : "warning",
270
+ message: status.serena.installed
271
+ ? `Serena configured (${status.serena.memories.length} memories)`
272
+ : "Serena not configured",
273
+ ...(!status.serena.installed && {
274
+ suggestion: "Configure Serena: create .serena/ directory with project config",
275
+ }),
276
+ });
277
+ // Playwright
278
+ results.push({
279
+ name: "integration-playwright",
280
+ level: status.playwright.installed ? "ok" : "warning",
281
+ message: status.playwright.installed
282
+ ? "Playwright available"
283
+ : "Playwright not available",
284
+ ...(!status.playwright.installed && {
285
+ suggestion: "Install Playwright: npx playwright install",
286
+ }),
287
+ });
288
+ return results;
289
+ }
290
+ catch (err) {
291
+ logger.debug("doctor:integrations:fail", {
292
+ error: err instanceof Error ? err.message : String(err),
293
+ });
294
+ return [
295
+ {
296
+ name: "integration-gitnexus",
297
+ level: "warning",
298
+ message: "Could not check GitNexus status",
299
+ },
300
+ {
301
+ name: "integration-serena",
302
+ level: "warning",
303
+ message: "Could not check Serena status",
304
+ },
305
+ {
306
+ name: "integration-playwright",
307
+ level: "warning",
308
+ message: "Could not check Playwright status",
309
+ },
310
+ ];
311
+ }
312
+ }
313
+ //# sourceMappingURL=doctor-checks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor-checks.js","sourceRoot":"","sources":["../../../src/core/doctor/doctor-checks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { DoctorReport } from "./doctor-types.js";
2
+ /**
3
+ * Run all doctor checks and return a structured report.
4
+ */
5
+ export declare function runDoctor(basePath: string): Promise<DoctorReport>;
6
+ //# sourceMappingURL=doctor-runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor-runner.d.ts","sourceRoot":"","sources":["../../../src/core/doctor/doctor-runner.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAe,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAyBnE;;GAEG;AACH,wBAAsB,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAqDvE"}
@@ -0,0 +1,72 @@
1
+ import { existsSync } from "node:fs";
2
+ import path from "node:path";
3
+ import { SqliteStore } from "../store/sqlite-store.js";
4
+ import { STORE_DIR, DB_FILE } from "../utils/constants.js";
5
+ import { logger } from "../utils/logger.js";
6
+ import { checkNodeVersion, checkWritePermissions, checkSqliteDatabase, checkDbIntegrity, checkGraphInitialized, checkConfigFile, checkDashboardBuild, checkMcpJson, checkIntegrations, } from "./doctor-checks.js";
7
+ function buildSummary(checks) {
8
+ let ok = 0;
9
+ let warning = 0;
10
+ let error = 0;
11
+ for (const c of checks) {
12
+ if (c.level === "ok")
13
+ ok++;
14
+ else if (c.level === "warning")
15
+ warning++;
16
+ else
17
+ error++;
18
+ }
19
+ return { ok, warning, error };
20
+ }
21
+ /**
22
+ * Run all doctor checks and return a structured report.
23
+ */
24
+ export async function runDoctor(basePath) {
25
+ logger.info("Running doctor checks", { basePath });
26
+ const checks = [];
27
+ // 1. Sync checks
28
+ checks.push(checkNodeVersion());
29
+ checks.push(checkConfigFile(basePath));
30
+ checks.push(checkMcpJson(basePath));
31
+ // 2. Async checks (parallel where possible)
32
+ const [writeResult, sqliteResult, dbIntegrityResult, dashboardResult, integrationResults] = await Promise.all([
33
+ checkWritePermissions(basePath),
34
+ checkSqliteDatabase(basePath),
35
+ checkDbIntegrity(basePath),
36
+ checkDashboardBuild(basePath),
37
+ checkIntegrations(basePath),
38
+ ]);
39
+ checks.push(writeResult);
40
+ checks.push(sqliteResult);
41
+ checks.push(dbIntegrityResult);
42
+ checks.push(dashboardResult);
43
+ checks.push(...integrationResults);
44
+ // 3. Store-dependent checks (only if DB exists)
45
+ const dbPath = path.join(basePath, STORE_DIR, DB_FILE);
46
+ if (existsSync(dbPath)) {
47
+ try {
48
+ const store = SqliteStore.open(basePath);
49
+ try {
50
+ checks.push(checkGraphInitialized(store));
51
+ }
52
+ finally {
53
+ store.close();
54
+ }
55
+ }
56
+ catch (err) {
57
+ checks.push({
58
+ name: "graph-initialized",
59
+ level: "warning",
60
+ message: `Could not open store: ${err instanceof Error ? err.message : String(err)}`,
61
+ suggestion: "Run 'mcp-graph init' to initialize the project",
62
+ });
63
+ }
64
+ }
65
+ const summary = buildSummary(checks);
66
+ return {
67
+ checks,
68
+ summary,
69
+ passed: summary.error === 0,
70
+ };
71
+ }
72
+ //# sourceMappingURL=doctor-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor-runner.js","sourceRoot":"","sources":["../../../src/core/doctor/doctor-runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Types for the `mcp-graph doctor` diagnostic command.
3
+ */
4
+ export type CheckLevel = "ok" | "warning" | "error";
5
+ export interface CheckResult {
6
+ name: string;
7
+ level: CheckLevel;
8
+ message: string;
9
+ suggestion?: string;
10
+ }
11
+ export interface DoctorReport {
12
+ checks: CheckResult[];
13
+ summary: {
14
+ ok: number;
15
+ warning: number;
16
+ error: number;
17
+ };
18
+ passed: boolean;
19
+ }
20
+ //# sourceMappingURL=doctor-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor-types.d.ts","sourceRoot":"","sources":["../../../src/core/doctor/doctor-types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,MAAM,UAAU,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAAC;AAEpD,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,UAAU,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,OAAO,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IACxD,MAAM,EAAE,OAAO,CAAC;CACjB"}