purecontext-mcp 1.1.7 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (182) hide show
  1. package/AGENT_INSTRUCTIONS.md +393 -0
  2. package/AGENT_INSTRUCTIONS_SHORT.md +53 -0
  3. package/AST-SEARCH.md +274 -0
  4. package/CHANGELOG.md +62 -0
  5. package/CODE-INTELLIGENCE.md +369 -0
  6. package/HEALTH-DASHBOARDS.md +241 -0
  7. package/README.md +7 -0
  8. package/REFACTORING-SAFELY.md +279 -0
  9. package/UNDERSTANDING-RELATIONSHIPS.md +240 -0
  10. package/USER-GUIDE.md +14 -0
  11. package/VISUALIZING-CODE.md +199 -0
  12. package/WORKFLOW-TECH-DEBT.md +286 -0
  13. package/dist/core/db/dep-store.d.ts +75 -0
  14. package/dist/core/db/dep-store.d.ts.map +1 -1
  15. package/dist/core/db/dep-store.js +277 -0
  16. package/dist/core/db/dep-store.js.map +1 -1
  17. package/dist/core/db/schema.d.ts.map +1 -1
  18. package/dist/core/db/schema.js +12 -0
  19. package/dist/core/db/schema.js.map +1 -1
  20. package/dist/core/index-manager.js +1 -1
  21. package/dist/core/index-manager.js.map +1 -1
  22. package/dist/core/token-tracker.d.ts +0 -9
  23. package/dist/core/token-tracker.d.ts.map +1 -1
  24. package/dist/core/token-tracker.js +0 -21
  25. package/dist/core/token-tracker.js.map +1 -1
  26. package/dist/core/types.d.ts +5 -0
  27. package/dist/core/types.d.ts.map +1 -1
  28. package/dist/graph/diagram-renderer.d.ts +83 -0
  29. package/dist/graph/diagram-renderer.d.ts.map +1 -0
  30. package/dist/graph/diagram-renderer.js +294 -0
  31. package/dist/graph/diagram-renderer.js.map +1 -0
  32. package/dist/graph/graph-traversal.d.ts +92 -0
  33. package/dist/graph/graph-traversal.d.ts.map +1 -1
  34. package/dist/graph/graph-traversal.js +440 -2
  35. package/dist/graph/graph-traversal.js.map +1 -1
  36. package/dist/server/http-server.d.ts.map +1 -1
  37. package/dist/server/http-server.js +30 -1
  38. package/dist/server/http-server.js.map +1 -1
  39. package/dist/server/mcp-server.d.ts.map +1 -1
  40. package/dist/server/mcp-server.js +145 -0
  41. package/dist/server/mcp-server.js.map +1 -1
  42. package/dist/server/tools/_meta.d.ts +0 -2
  43. package/dist/server/tools/_meta.d.ts.map +1 -1
  44. package/dist/server/tools/_meta.js +1 -4
  45. package/dist/server/tools/_meta.js.map +1 -1
  46. package/dist/server/tools/check-delete-safe.d.ts +50 -0
  47. package/dist/server/tools/check-delete-safe.d.ts.map +1 -0
  48. package/dist/server/tools/check-delete-safe.js +308 -0
  49. package/dist/server/tools/check-delete-safe.js.map +1 -0
  50. package/dist/server/tools/check-move-safe.d.ts +44 -0
  51. package/dist/server/tools/check-move-safe.d.ts.map +1 -0
  52. package/dist/server/tools/check-move-safe.js +266 -0
  53. package/dist/server/tools/check-move-safe.js.map +1 -0
  54. package/dist/server/tools/check-rename-safe.d.ts +48 -0
  55. package/dist/server/tools/check-rename-safe.d.ts.map +1 -0
  56. package/dist/server/tools/check-rename-safe.js +218 -0
  57. package/dist/server/tools/check-rename-safe.js.map +1 -0
  58. package/dist/server/tools/diff-health-radar.d.ts +44 -0
  59. package/dist/server/tools/diff-health-radar.d.ts.map +1 -0
  60. package/dist/server/tools/diff-health-radar.js +192 -0
  61. package/dist/server/tools/diff-health-radar.js.map +1 -0
  62. package/dist/server/tools/find-cycles.d.ts +31 -0
  63. package/dist/server/tools/find-cycles.d.ts.map +1 -0
  64. package/dist/server/tools/find-cycles.js +85 -0
  65. package/dist/server/tools/find-cycles.js.map +1 -0
  66. package/dist/server/tools/find-implementations.d.ts +47 -0
  67. package/dist/server/tools/find-implementations.d.ts.map +1 -0
  68. package/dist/server/tools/find-implementations.js +167 -0
  69. package/dist/server/tools/find-implementations.js.map +1 -0
  70. package/dist/server/tools/find-untested-symbols.d.ts +52 -0
  71. package/dist/server/tools/find-untested-symbols.d.ts.map +1 -0
  72. package/dist/server/tools/find-untested-symbols.js +308 -0
  73. package/dist/server/tools/find-untested-symbols.js.map +1 -0
  74. package/dist/server/tools/get-architecture-snapshot.d.ts +43 -0
  75. package/dist/server/tools/get-architecture-snapshot.d.ts.map +1 -0
  76. package/dist/server/tools/get-architecture-snapshot.js +292 -0
  77. package/dist/server/tools/get-architecture-snapshot.js.map +1 -0
  78. package/dist/server/tools/get-call-hierarchy.d.ts +43 -0
  79. package/dist/server/tools/get-call-hierarchy.d.ts.map +1 -0
  80. package/dist/server/tools/get-call-hierarchy.js +119 -0
  81. package/dist/server/tools/get-call-hierarchy.js.map +1 -0
  82. package/dist/server/tools/get-class-hierarchy.d.ts +36 -0
  83. package/dist/server/tools/get-class-hierarchy.d.ts.map +1 -0
  84. package/dist/server/tools/get-class-hierarchy.js +125 -0
  85. package/dist/server/tools/get-class-hierarchy.js.map +1 -0
  86. package/dist/server/tools/get-complexity-hotspots.d.ts +50 -0
  87. package/dist/server/tools/get-complexity-hotspots.d.ts.map +1 -0
  88. package/dist/server/tools/get-complexity-hotspots.js +282 -0
  89. package/dist/server/tools/get-complexity-hotspots.js.map +1 -0
  90. package/dist/server/tools/get-coupling-map.d.ts +39 -0
  91. package/dist/server/tools/get-coupling-map.d.ts.map +1 -0
  92. package/dist/server/tools/get-coupling-map.js +107 -0
  93. package/dist/server/tools/get-coupling-map.js.map +1 -0
  94. package/dist/server/tools/get-debt-report.d.ts +44 -0
  95. package/dist/server/tools/get-debt-report.d.ts.map +1 -0
  96. package/dist/server/tools/get-debt-report.js +606 -0
  97. package/dist/server/tools/get-debt-report.js.map +1 -0
  98. package/dist/server/tools/get-entry-points.d.ts +79 -0
  99. package/dist/server/tools/get-entry-points.d.ts.map +1 -0
  100. package/dist/server/tools/get-entry-points.js +362 -0
  101. package/dist/server/tools/get-entry-points.js.map +1 -0
  102. package/dist/server/tools/get-public-api.d.ts +53 -0
  103. package/dist/server/tools/get-public-api.d.ts.map +1 -0
  104. package/dist/server/tools/get-public-api.js +218 -0
  105. package/dist/server/tools/get-public-api.js.map +1 -0
  106. package/dist/server/tools/get-savings-stats.d.ts.map +1 -1
  107. package/dist/server/tools/get-savings-stats.js +1 -3
  108. package/dist/server/tools/get-savings-stats.js.map +1 -1
  109. package/dist/server/tools/get-test-coverage-map.d.ts +66 -0
  110. package/dist/server/tools/get-test-coverage-map.d.ts.map +1 -0
  111. package/dist/server/tools/get-test-coverage-map.js +588 -0
  112. package/dist/server/tools/get-test-coverage-map.js.map +1 -0
  113. package/dist/server/tools/get-todos.d.ts +51 -0
  114. package/dist/server/tools/get-todos.d.ts.map +1 -0
  115. package/dist/server/tools/get-todos.js +180 -0
  116. package/dist/server/tools/get-todos.js.map +1 -0
  117. package/dist/server/tools/get-type-graph.d.ts +73 -0
  118. package/dist/server/tools/get-type-graph.d.ts.map +1 -0
  119. package/dist/server/tools/get-type-graph.js +437 -0
  120. package/dist/server/tools/get-type-graph.js.map +1 -0
  121. package/dist/server/tools/health-radar.d.ts +50 -0
  122. package/dist/server/tools/health-radar.d.ts.map +1 -0
  123. package/dist/server/tools/health-radar.js +426 -0
  124. package/dist/server/tools/health-radar.js.map +1 -0
  125. package/dist/server/tools/plan-refactoring.d.ts +74 -0
  126. package/dist/server/tools/plan-refactoring.d.ts.map +1 -0
  127. package/dist/server/tools/plan-refactoring.js +644 -0
  128. package/dist/server/tools/plan-refactoring.js.map +1 -0
  129. package/dist/server/tools/render-call-graph.d.ts +40 -0
  130. package/dist/server/tools/render-call-graph.d.ts.map +1 -0
  131. package/dist/server/tools/render-call-graph.js +215 -0
  132. package/dist/server/tools/render-call-graph.js.map +1 -0
  133. package/dist/server/tools/render-class-hierarchy.d.ts +42 -0
  134. package/dist/server/tools/render-class-hierarchy.d.ts.map +1 -0
  135. package/dist/server/tools/render-class-hierarchy.js +265 -0
  136. package/dist/server/tools/render-class-hierarchy.js.map +1 -0
  137. package/dist/server/tools/render-dep-matrix.d.ts +38 -0
  138. package/dist/server/tools/render-dep-matrix.d.ts.map +1 -0
  139. package/dist/server/tools/render-dep-matrix.js +186 -0
  140. package/dist/server/tools/render-dep-matrix.js.map +1 -0
  141. package/dist/server/tools/render-diagram.d.ts +47 -0
  142. package/dist/server/tools/render-diagram.d.ts.map +1 -0
  143. package/dist/server/tools/render-diagram.js +266 -0
  144. package/dist/server/tools/render-diagram.js.map +1 -0
  145. package/dist/server/tools/render-import-graph.d.ts +41 -0
  146. package/dist/server/tools/render-import-graph.d.ts.map +1 -0
  147. package/dist/server/tools/render-import-graph.js +158 -0
  148. package/dist/server/tools/render-import-graph.js.map +1 -0
  149. package/dist/server/tools/search-ast.d.ts +55 -0
  150. package/dist/server/tools/search-ast.d.ts.map +1 -0
  151. package/dist/server/tools/search-ast.js +279 -0
  152. package/dist/server/tools/search-ast.js.map +1 -0
  153. package/dist/server/tools/search-by-complexity.d.ts +92 -0
  154. package/dist/server/tools/search-by-complexity.d.ts.map +1 -0
  155. package/dist/server/tools/search-by-complexity.js +268 -0
  156. package/dist/server/tools/search-by-complexity.js.map +1 -0
  157. package/dist/server/tools/search-by-decorator.d.ts +48 -0
  158. package/dist/server/tools/search-by-decorator.d.ts.map +1 -0
  159. package/dist/server/tools/search-by-decorator.js +518 -0
  160. package/dist/server/tools/search-by-decorator.js.map +1 -0
  161. package/dist/server/tools/search-by-signature.d.ts +56 -0
  162. package/dist/server/tools/search-by-signature.d.ts.map +1 -0
  163. package/dist/server/tools/search-by-signature.js +200 -0
  164. package/dist/server/tools/search-by-signature.js.map +1 -0
  165. package/dist/ui/assets/BlastRadius-QdgESOL8.js +1 -0
  166. package/dist/ui/assets/{DependencyGraph-CDtBHM0U.js → DependencyGraph-BSMhzwWV.js} +6 -6
  167. package/dist/ui/assets/{NotFound-Cdt6X8pl.js → NotFound-CipFP_s1.js} +1 -1
  168. package/dist/ui/assets/RepoDetail-Dfp5z5Kq.js +1 -0
  169. package/dist/ui/assets/{RepoList-B9LaZvob.js → RepoList-BKtST3hB.js} +1 -1
  170. package/dist/ui/assets/{Search-CLqv2KGV.js → Search-DzhGDViy.js} +1 -1
  171. package/dist/ui/assets/{SymbolView-BlbDR1DU.js → SymbolView-ryVEwAHG.js} +1 -1
  172. package/dist/ui/assets/{index-DADf5y_L.css → index-Ny8gn9F0.css} +1 -1
  173. package/dist/ui/assets/{index-i3Q1XbEh.js → index-nX2chMqi.js} +6 -6
  174. package/dist/ui/assets/{useSearch-mbMk6-M1.js → useSearch-BnBCRKui.js} +1 -1
  175. package/dist/ui/index.html +2 -2
  176. package/dist/version.d.ts +1 -1
  177. package/dist/version.js +1 -1
  178. package/docs/dev/jcodemunch-gap-analysis.md +198 -0
  179. package/package.json +9 -1
  180. package/user-manual.md +2466 -0
  181. package/dist/ui/assets/BlastRadius-BDZWhEk-.js +0 -1
  182. package/dist/ui/assets/RepoDetail-M6WaYbZ3.js +0 -1
@@ -0,0 +1,437 @@
1
+ /**
2
+ * get-type-graph.ts
3
+ *
4
+ * MCP tool: get_type_graph
5
+ *
6
+ * Returns the type dependency graph for a repository (or a scoped subtree),
7
+ * showing how interfaces, classes, type aliases, and enums relate to each
8
+ * other through inheritance (`extends`), implementation (`implements`), and
9
+ * optional usage relationships.
10
+ *
11
+ * Use this tool to:
12
+ * - Understand a domain model's type hierarchy before refactoring
13
+ * - Find all types that depend on a given interface
14
+ * - Generate a Mermaid class diagram from live code
15
+ * - Answer "what does this type extend/implement, and who extends it?"
16
+ *
17
+ * Differs from related tools:
18
+ * get_class_hierarchy — single-root ancestor/descendant tree for one class
19
+ * find_implementations — all concrete implementations of one interface
20
+ * get_type_graph — full multi-root graph of all type relationships
21
+ * in a scope; supports rootSymbol for focused traversal
22
+ */
23
+ import { z } from 'zod';
24
+ import { openDatabase, getRepo } from '../../core/db/schema.js';
25
+ import { buildMeta } from './_meta.js';
26
+ export const name = 'get_type_graph';
27
+ export const description = 'Return the type dependency graph for a repo, showing how interfaces, classes, ' +
28
+ 'type aliases, and enums relate to each other via extends and implements. ' +
29
+ 'Returns nodes (type symbols) and directed edges (relationship type + source/target). ' +
30
+ 'Optionally rooted at a single type for a focused subgraph up to a given depth. ' +
31
+ 'Supports mermaid output format for visual rendering.' +
32
+ '\n\nUse this to:' +
33
+ '\n - Understand a domain model before refactoring' +
34
+ '\n - Find all types that inherit from a given interface' +
35
+ '\n - Generate a Mermaid class diagram from live code' +
36
+ '\n\nDiffers from related tools:' +
37
+ '\n get_class_hierarchy — single-root tree for one class/interface' +
38
+ '\n find_implementations — concrete implementors of one interface' +
39
+ '\n get_type_graph — full multi-root graph across a scope';
40
+ export const inputSchema = {
41
+ repoId: z.string().describe('Repository ID returned by index_folder or list_repos'),
42
+ rootSymbol: z
43
+ .string()
44
+ .optional()
45
+ .describe('Name or ID of a type/interface/class to root the graph at. ' +
46
+ 'When provided, only connected symbols up to maxDepth are returned. ' +
47
+ 'Omit to return the full graph for the scope.'),
48
+ maxDepth: z
49
+ .number().int().min(1).max(10)
50
+ .optional()
51
+ .describe('Maximum traversal depth from rootSymbol (default 3). ' +
52
+ 'Ignored when rootSymbol is not provided.'),
53
+ scope: z
54
+ .string()
55
+ .optional()
56
+ .describe('Restrict to a directory prefix (e.g. "src/types/"). ' +
57
+ 'Omit to analyse the entire repo.'),
58
+ kinds: z
59
+ .array(z.enum(['interface', 'class', 'type', 'enum']))
60
+ .optional()
61
+ .describe('Symbol kinds to include. Defaults to all type-like kinds: ' +
62
+ 'interface, class, type, enum.'),
63
+ includeAbstract: z
64
+ .boolean()
65
+ .optional()
66
+ .describe('Include abstract classes as nodes (default true). ' +
67
+ 'Set false to show only concrete classes.'),
68
+ format: z
69
+ .enum(['graph', 'mermaid'])
70
+ .optional()
71
+ .describe('"graph" (default) — structured JSON nodes+edges. ' +
72
+ '"mermaid" — Mermaid classDiagram source string. ' +
73
+ 'Both formats always include the JSON graph; mermaid adds a "mermaid" field.'),
74
+ limit: z
75
+ .number().int().min(1).max(500)
76
+ .optional()
77
+ .describe('Maximum number of nodes to include (default 100). Applied after depth traversal.'),
78
+ };
79
+ // ─── Signature parsers ────────────────────────────────────────────────────────
80
+ /**
81
+ * Extract parent names from `extends X, Y<T>` in a signature.
82
+ * Strips generic parameters and returns bare names.
83
+ */
84
+ function parseExtendsNames(signature) {
85
+ // interface/class declaration: capture after `extends` until `implements` or `{`
86
+ const match = signature.match(/\bextends\s+([\w<>\s,[\]]+?)(?=\s+implements\b|\s*[{]|$)/);
87
+ if (!match)
88
+ return [];
89
+ return splitTypeList(match[1]);
90
+ }
91
+ /**
92
+ * Extract interface names from `implements X, Y<T>` in a signature.
93
+ * Strips generic parameters and returns bare names.
94
+ */
95
+ function parseImplementsNames(signature) {
96
+ const match = signature.match(/\bimplements\s+([\w<>\s,[\]]+?)(?=\s*[{]|$)/);
97
+ if (!match)
98
+ return [];
99
+ return splitTypeList(match[1]);
100
+ }
101
+ /**
102
+ * Split a comma-separated type list (which may contain generics) into
103
+ * individual bare type names, stripping generic parameters.
104
+ *
105
+ * e.g. "Repository<User>, Serializable" → ["Repository", "Serializable"]
106
+ */
107
+ function splitTypeList(raw) {
108
+ // Use a simple bracket-depth tracker to split on commas at depth 0
109
+ const names = [];
110
+ let depth = 0;
111
+ let current = '';
112
+ for (const ch of raw) {
113
+ if (ch === '<' || ch === '[') {
114
+ depth++;
115
+ current += ch;
116
+ }
117
+ else if (ch === '>' || ch === ']') {
118
+ depth--;
119
+ current += ch;
120
+ }
121
+ else if (ch === ',' && depth === 0) {
122
+ const name = extractBareName(current.trim());
123
+ if (name)
124
+ names.push(name);
125
+ current = '';
126
+ }
127
+ else {
128
+ current += ch;
129
+ }
130
+ }
131
+ const last = extractBareName(current.trim());
132
+ if (last)
133
+ names.push(last);
134
+ return names;
135
+ }
136
+ /** Strip generic parameters from a type reference: "Repository<User>" → "Repository" */
137
+ function extractBareName(typeRef) {
138
+ return typeRef.replace(/<.*/, '').replace(/\[.*/, '').trim();
139
+ }
140
+ // ─── Mermaid renderer ─────────────────────────────────────────────────────────
141
+ function renderMermaid(nodes, edges) {
142
+ const lines = ['classDiagram'];
143
+ // Declare classes
144
+ for (const node of nodes) {
145
+ if (node.kind === 'interface') {
146
+ lines.push(` class ${node.name} {`);
147
+ lines.push(` <<interface>>`);
148
+ lines.push(` }`);
149
+ }
150
+ else if (node.kind === 'enum') {
151
+ lines.push(` class ${node.name} {`);
152
+ lines.push(` <<enumeration>>`);
153
+ lines.push(` }`);
154
+ }
155
+ else if (node.kind === 'type') {
156
+ lines.push(` class ${node.name} {`);
157
+ lines.push(` <<type>>`);
158
+ lines.push(` }`);
159
+ }
160
+ else {
161
+ // class (possibly abstract)
162
+ lines.push(` class ${node.name} {`);
163
+ if (node.isAbstract)
164
+ lines.push(` <<abstract>>`);
165
+ lines.push(` }`);
166
+ }
167
+ }
168
+ // Node ID → name map for resolved edges
169
+ const idToName = new Map(nodes.map((n) => [n.id, n.name]));
170
+ // Render edges
171
+ for (const edge of edges) {
172
+ const sourceName = idToName.get(edge.source);
173
+ if (!sourceName)
174
+ continue;
175
+ const targetName = edge.resolved ? (idToName.get(edge.target) ?? edge.targetName) : edge.targetName;
176
+ if (edge.relation === 'extends') {
177
+ lines.push(` ${sourceName} --|> ${targetName} : extends`);
178
+ }
179
+ else {
180
+ lines.push(` ${sourceName} ..|> ${targetName} : implements`);
181
+ }
182
+ }
183
+ return lines.join('\n');
184
+ }
185
+ // ─── Handler ──────────────────────────────────────────────────────────────────
186
+ export async function handler(args) {
187
+ const t0 = Date.now();
188
+ const { repoId, maxDepth = 3, kinds = ['interface', 'class', 'type', 'enum'], includeAbstract = true, format = 'graph', limit = 100, } = args;
189
+ const db = openDatabase(repoId);
190
+ try {
191
+ // ── Validate repo ──────────────────────────────────────────────────────────
192
+ const repo = getRepo(db, repoId);
193
+ if (!repo) {
194
+ return {
195
+ content: [{
196
+ type: 'text',
197
+ text: JSON.stringify({ error: `Repo "${repoId}" not found. Run index_folder first.` }),
198
+ }],
199
+ isError: true,
200
+ };
201
+ }
202
+ // ── Fetch type symbols ─────────────────────────────────────────────────────
203
+ const kindPlaceholders = kinds.map(() => '?').join(', ');
204
+ const conditions = [`repo_id = ?`, `kind IN (${kindPlaceholders})`];
205
+ const params = [repoId, ...kinds];
206
+ if (args.scope) {
207
+ conditions.push('(file_path = ? OR file_path LIKE ?)');
208
+ params.push(args.scope);
209
+ params.push(args.scope.endsWith('/')
210
+ ? `${args.scope}%`
211
+ : `${args.scope}/%`);
212
+ }
213
+ if (!includeAbstract) {
214
+ conditions.push("signature NOT LIKE '%abstract %'");
215
+ }
216
+ const sql = `
217
+ SELECT id, name, kind, file_path, start_byte, signature, summary
218
+ FROM symbols
219
+ WHERE ${conditions.join(' AND ')}
220
+ ORDER BY file_path ASC, name ASC
221
+ `;
222
+ const rows = db.prepare(sql).all(...params);
223
+ if (rows.length === 0) {
224
+ const emptyResult = {
225
+ repoId,
226
+ rootSymbolId: null,
227
+ nodes: [],
228
+ edges: [],
229
+ summary: { nodeCount: 0, edgeCount: 0, resolvedEdgeCount: 0, unresolvedEdgeCount: 0, relationTypes: [] },
230
+ _tokenEstimate: 10,
231
+ _meta: buildMeta({ timingMs: Date.now() - t0 }),
232
+ };
233
+ return {
234
+ content: [{ type: 'text', text: JSON.stringify(emptyResult, null, 2) }],
235
+ };
236
+ }
237
+ // ── Build name → symbolId lookup (for resolving extends/implements targets) ─
238
+ const nameToIds = new Map();
239
+ for (const row of rows) {
240
+ const list = nameToIds.get(row.name) ?? [];
241
+ list.push(row.id);
242
+ nameToIds.set(row.name, list);
243
+ }
244
+ // ── Build all nodes ────────────────────────────────────────────────────────
245
+ const allNodes = new Map();
246
+ for (const row of rows) {
247
+ allNodes.set(row.id, {
248
+ id: row.id,
249
+ name: row.name,
250
+ kind: row.kind,
251
+ filePath: row.file_path,
252
+ signature: row.signature,
253
+ summary: row.summary,
254
+ isAbstract: row.signature.includes('abstract '),
255
+ isGeneric: row.signature.includes('<'),
256
+ });
257
+ }
258
+ // ── Build all edges ────────────────────────────────────────────────────────
259
+ const allEdges = [];
260
+ for (const row of rows) {
261
+ // extends
262
+ for (const parentName of parseExtendsNames(row.signature)) {
263
+ const targetIds = nameToIds.get(parentName);
264
+ if (targetIds && targetIds.length > 0) {
265
+ allEdges.push({
266
+ source: row.id,
267
+ target: targetIds[0],
268
+ relation: 'extends',
269
+ targetName: parentName,
270
+ resolved: true,
271
+ });
272
+ }
273
+ else {
274
+ // Unresolved — target not in the indexed symbols (external/stdlib)
275
+ allEdges.push({
276
+ source: row.id,
277
+ target: '',
278
+ relation: 'extends',
279
+ targetName: parentName,
280
+ resolved: false,
281
+ });
282
+ }
283
+ }
284
+ // implements
285
+ for (const ifaceName of parseImplementsNames(row.signature)) {
286
+ const targetIds = nameToIds.get(ifaceName);
287
+ if (targetIds && targetIds.length > 0) {
288
+ allEdges.push({
289
+ source: row.id,
290
+ target: targetIds[0],
291
+ relation: 'implements',
292
+ targetName: ifaceName,
293
+ resolved: true,
294
+ });
295
+ }
296
+ else {
297
+ allEdges.push({
298
+ source: row.id,
299
+ target: '',
300
+ relation: 'implements',
301
+ targetName: ifaceName,
302
+ resolved: false,
303
+ });
304
+ }
305
+ }
306
+ }
307
+ // ── rootSymbol traversal ───────────────────────────────────────────────────
308
+ let rootSymbolId = null;
309
+ let finalNodes;
310
+ let finalEdges;
311
+ if (args.rootSymbol) {
312
+ // Resolve rootSymbol: try as ID first, then by name
313
+ let rootNode = allNodes.get(args.rootSymbol);
314
+ if (!rootNode) {
315
+ const ids = nameToIds.get(args.rootSymbol);
316
+ if (ids && ids.length > 0)
317
+ rootNode = allNodes.get(ids[0]);
318
+ }
319
+ if (!rootNode) {
320
+ return {
321
+ content: [{
322
+ type: 'text',
323
+ text: JSON.stringify({
324
+ error: `Symbol "${args.rootSymbol}" not found among type symbols in repo "${repoId}".`,
325
+ }),
326
+ }],
327
+ isError: true,
328
+ };
329
+ }
330
+ rootSymbolId = rootNode.id;
331
+ // BFS: include nodes reachable from root within maxDepth hops (both directions)
332
+ // Build adjacency: for each node, what nodes does it connect to (either direction)
333
+ const adjacency = new Map();
334
+ for (const edge of allEdges) {
335
+ if (!edge.resolved)
336
+ continue;
337
+ if (!adjacency.has(edge.source))
338
+ adjacency.set(edge.source, new Set());
339
+ if (!adjacency.has(edge.target))
340
+ adjacency.set(edge.target, new Set());
341
+ adjacency.get(edge.source).add(edge.target);
342
+ adjacency.get(edge.target).add(edge.source);
343
+ }
344
+ const visited = new Set([rootSymbolId]);
345
+ let frontier = new Set([rootSymbolId]);
346
+ for (let depth = 0; depth < maxDepth && frontier.size > 0; depth++) {
347
+ const next = new Set();
348
+ for (const nodeId of frontier) {
349
+ for (const neighbor of (adjacency.get(nodeId) ?? [])) {
350
+ if (!visited.has(neighbor)) {
351
+ visited.add(neighbor);
352
+ next.add(neighbor);
353
+ }
354
+ }
355
+ }
356
+ frontier = next;
357
+ }
358
+ const reachableNodes = new Map();
359
+ for (const id of visited) {
360
+ const node = allNodes.get(id);
361
+ if (node)
362
+ reachableNodes.set(id, node);
363
+ }
364
+ finalNodes = Array.from(reachableNodes.values());
365
+ finalEdges = allEdges.filter((e) => visited.has(e.source) && (e.resolved ? visited.has(e.target) : true));
366
+ }
367
+ else {
368
+ finalNodes = Array.from(allNodes.values());
369
+ finalEdges = allEdges;
370
+ }
371
+ // ── Apply limit ────────────────────────────────────────────────────────────
372
+ if (finalNodes.length > limit) {
373
+ // Keep nodes with the most edges first (most connected)
374
+ const edgeCounts = new Map();
375
+ for (const edge of finalEdges) {
376
+ edgeCounts.set(edge.source, (edgeCounts.get(edge.source) ?? 0) + 1);
377
+ if (edge.target)
378
+ edgeCounts.set(edge.target, (edgeCounts.get(edge.target) ?? 0) + 1);
379
+ }
380
+ finalNodes.sort((a, b) => (edgeCounts.get(b.id) ?? 0) - (edgeCounts.get(a.id) ?? 0));
381
+ const keptIds = new Set(finalNodes.slice(0, limit).map((n) => n.id));
382
+ finalNodes = finalNodes.slice(0, limit);
383
+ finalEdges = finalEdges.filter((e) => keptIds.has(e.source));
384
+ }
385
+ // ── Compute relation types ─────────────────────────────────────────────────
386
+ const relationTypes = [...new Set(finalEdges.map((e) => e.relation))].sort();
387
+ const resolvedEdges = finalEdges.filter((e) => e.resolved);
388
+ const unresolvedEdges = finalEdges.filter((e) => !e.resolved);
389
+ // ── Build output ───────────────────────────────────────────────────────────
390
+ const outputNodes = finalNodes.map((n) => ({
391
+ id: n.id,
392
+ name: n.name,
393
+ kind: n.kind,
394
+ filePath: n.filePath,
395
+ signature: n.signature,
396
+ summary: n.summary,
397
+ isAbstract: n.isAbstract,
398
+ isGeneric: n.isGeneric,
399
+ }));
400
+ const outputEdges = finalEdges.map((e) => ({
401
+ source: e.source,
402
+ target: e.target,
403
+ relation: e.relation,
404
+ targetName: e.targetName,
405
+ resolved: e.resolved,
406
+ }));
407
+ // ── Token estimate ─────────────────────────────────────────────────────────
408
+ const nodeBytes = finalNodes.reduce((s, n) => s + n.name.length + n.filePath.length + n.signature.length + n.summary.length + 40, 0);
409
+ const edgeBytes = finalEdges.length * 60;
410
+ const tokenEstimate = Math.ceil((nodeBytes + edgeBytes) / 4);
411
+ const result = {
412
+ repoId,
413
+ rootSymbolId,
414
+ nodes: outputNodes,
415
+ edges: outputEdges,
416
+ summary: {
417
+ nodeCount: finalNodes.length,
418
+ edgeCount: finalEdges.length,
419
+ resolvedEdgeCount: resolvedEdges.length,
420
+ unresolvedEdgeCount: unresolvedEdges.length,
421
+ relationTypes,
422
+ },
423
+ _tokenEstimate: tokenEstimate,
424
+ _meta: buildMeta({ timingMs: Date.now() - t0 }),
425
+ };
426
+ if (format === 'mermaid') {
427
+ result['mermaid'] = renderMermaid(finalNodes, resolvedEdges);
428
+ }
429
+ return {
430
+ content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
431
+ };
432
+ }
433
+ finally {
434
+ db.close();
435
+ }
436
+ }
437
+ //# sourceMappingURL=get-type-graph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-type-graph.js","sourceRoot":"","sources":["../../../src/server/tools/get-type-graph.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * health-radar.ts
3
+ *
4
+ * MCP tool: health_radar
5
+ *
6
+ * Compute a multi-axis health radar for an indexed repo. Each axis is scored
7
+ * 0–100 where 100 = perfectly healthy, 0 = critical problems.
8
+ *
9
+ * Five axes:
10
+ * complexity — inverse of average/peak cyclomatic complexity
11
+ * coupling — inverse of high-coupling file density
12
+ * maintainability — inverse of dead-code and god-class density
13
+ * documentation — percentage of symbols with a non-trivial summary
14
+ * stability — inverse of churn-hotspot density (requires git metadata)
15
+ *
16
+ * Produces:
17
+ * • Per-axis AxisScore (score 0–100, label, rationale, available flag)
18
+ * • overallHealth (0–100, weighted average of available axes)
19
+ * • Letter grade (A–F)
20
+ * • Summary counts
21
+ *
22
+ * Distinguishes from get_debt_report:
23
+ * • Scores are *health* (100 = good), not *debt* (100 = bad)
24
+ * • Adds a Documentation axis absent from the debt report
25
+ * • Compact output suited for dashboard charting and CI health gates
26
+ * • No per-file breakdown or recommendations (use get_debt_report for those)
27
+ */
28
+ import { z } from 'zod';
29
+ import type { CallToolResult } from '@modelcontextprotocol/sdk/types.js';
30
+ export declare const name = "health_radar";
31
+ export declare const description: string;
32
+ export declare const inputSchema: {
33
+ repoId: z.ZodString;
34
+ scope: z.ZodOptional<z.ZodString>;
35
+ includeStability: z.ZodOptional<z.ZodBoolean>;
36
+ };
37
+ type HealthLabel = 'excellent' | 'good' | 'fair' | 'poor' | 'critical';
38
+ export interface AxisScore {
39
+ score: number;
40
+ label: HealthLabel;
41
+ rationale: string;
42
+ available: boolean;
43
+ }
44
+ export declare function handler(args: {
45
+ repoId: string;
46
+ scope?: string;
47
+ includeStability?: boolean;
48
+ }): Promise<CallToolResult>;
49
+ export {};
50
+ //# sourceMappingURL=health-radar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health-radar.d.ts","sourceRoot":"","sources":["../../../src/server/tools/health-radar.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAMxB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAKzE,eAAO,MAAM,IAAI,iBAAiB,CAAC;AAEnC,eAAO,MAAM,WAAW,QAKoE,CAAC;AAE7F,eAAO,MAAM,WAAW;;;;CAavB,CAAC;AAIF,KAAK,WAAW,GAAG,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,UAAU,CAAC;AAEvE,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,WAAW,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;CACpB;AA8XD,wBAAsB,OAAO,CAAC,IAAI,EAAE;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B,GAAG,OAAO,CAAC,cAAc,CAAC,CAuI1B"}