purecontext-mcp 1.1.8 → 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 (167) 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/types.d.ts +5 -0
  23. package/dist/core/types.d.ts.map +1 -1
  24. package/dist/graph/diagram-renderer.d.ts +83 -0
  25. package/dist/graph/diagram-renderer.d.ts.map +1 -0
  26. package/dist/graph/diagram-renderer.js +294 -0
  27. package/dist/graph/diagram-renderer.js.map +1 -0
  28. package/dist/graph/graph-traversal.d.ts +92 -0
  29. package/dist/graph/graph-traversal.d.ts.map +1 -1
  30. package/dist/graph/graph-traversal.js +440 -2
  31. package/dist/graph/graph-traversal.js.map +1 -1
  32. package/dist/server/mcp-server.d.ts.map +1 -1
  33. package/dist/server/mcp-server.js +145 -0
  34. package/dist/server/mcp-server.js.map +1 -1
  35. package/dist/server/tools/check-delete-safe.d.ts +50 -0
  36. package/dist/server/tools/check-delete-safe.d.ts.map +1 -0
  37. package/dist/server/tools/check-delete-safe.js +308 -0
  38. package/dist/server/tools/check-delete-safe.js.map +1 -0
  39. package/dist/server/tools/check-move-safe.d.ts +44 -0
  40. package/dist/server/tools/check-move-safe.d.ts.map +1 -0
  41. package/dist/server/tools/check-move-safe.js +266 -0
  42. package/dist/server/tools/check-move-safe.js.map +1 -0
  43. package/dist/server/tools/check-rename-safe.d.ts +48 -0
  44. package/dist/server/tools/check-rename-safe.d.ts.map +1 -0
  45. package/dist/server/tools/check-rename-safe.js +218 -0
  46. package/dist/server/tools/check-rename-safe.js.map +1 -0
  47. package/dist/server/tools/diff-health-radar.d.ts +44 -0
  48. package/dist/server/tools/diff-health-radar.d.ts.map +1 -0
  49. package/dist/server/tools/diff-health-radar.js +192 -0
  50. package/dist/server/tools/diff-health-radar.js.map +1 -0
  51. package/dist/server/tools/find-cycles.d.ts +31 -0
  52. package/dist/server/tools/find-cycles.d.ts.map +1 -0
  53. package/dist/server/tools/find-cycles.js +85 -0
  54. package/dist/server/tools/find-cycles.js.map +1 -0
  55. package/dist/server/tools/find-implementations.d.ts +47 -0
  56. package/dist/server/tools/find-implementations.d.ts.map +1 -0
  57. package/dist/server/tools/find-implementations.js +167 -0
  58. package/dist/server/tools/find-implementations.js.map +1 -0
  59. package/dist/server/tools/find-untested-symbols.d.ts +52 -0
  60. package/dist/server/tools/find-untested-symbols.d.ts.map +1 -0
  61. package/dist/server/tools/find-untested-symbols.js +308 -0
  62. package/dist/server/tools/find-untested-symbols.js.map +1 -0
  63. package/dist/server/tools/get-architecture-snapshot.d.ts +43 -0
  64. package/dist/server/tools/get-architecture-snapshot.d.ts.map +1 -0
  65. package/dist/server/tools/get-architecture-snapshot.js +292 -0
  66. package/dist/server/tools/get-architecture-snapshot.js.map +1 -0
  67. package/dist/server/tools/get-call-hierarchy.d.ts +43 -0
  68. package/dist/server/tools/get-call-hierarchy.d.ts.map +1 -0
  69. package/dist/server/tools/get-call-hierarchy.js +119 -0
  70. package/dist/server/tools/get-call-hierarchy.js.map +1 -0
  71. package/dist/server/tools/get-class-hierarchy.d.ts +36 -0
  72. package/dist/server/tools/get-class-hierarchy.d.ts.map +1 -0
  73. package/dist/server/tools/get-class-hierarchy.js +125 -0
  74. package/dist/server/tools/get-class-hierarchy.js.map +1 -0
  75. package/dist/server/tools/get-complexity-hotspots.d.ts +50 -0
  76. package/dist/server/tools/get-complexity-hotspots.d.ts.map +1 -0
  77. package/dist/server/tools/get-complexity-hotspots.js +282 -0
  78. package/dist/server/tools/get-complexity-hotspots.js.map +1 -0
  79. package/dist/server/tools/get-coupling-map.d.ts +39 -0
  80. package/dist/server/tools/get-coupling-map.d.ts.map +1 -0
  81. package/dist/server/tools/get-coupling-map.js +107 -0
  82. package/dist/server/tools/get-coupling-map.js.map +1 -0
  83. package/dist/server/tools/get-debt-report.d.ts +44 -0
  84. package/dist/server/tools/get-debt-report.d.ts.map +1 -0
  85. package/dist/server/tools/get-debt-report.js +606 -0
  86. package/dist/server/tools/get-debt-report.js.map +1 -0
  87. package/dist/server/tools/get-entry-points.d.ts +79 -0
  88. package/dist/server/tools/get-entry-points.d.ts.map +1 -0
  89. package/dist/server/tools/get-entry-points.js +362 -0
  90. package/dist/server/tools/get-entry-points.js.map +1 -0
  91. package/dist/server/tools/get-public-api.d.ts +53 -0
  92. package/dist/server/tools/get-public-api.d.ts.map +1 -0
  93. package/dist/server/tools/get-public-api.js +218 -0
  94. package/dist/server/tools/get-public-api.js.map +1 -0
  95. package/dist/server/tools/get-test-coverage-map.d.ts +66 -0
  96. package/dist/server/tools/get-test-coverage-map.d.ts.map +1 -0
  97. package/dist/server/tools/get-test-coverage-map.js +588 -0
  98. package/dist/server/tools/get-test-coverage-map.js.map +1 -0
  99. package/dist/server/tools/get-todos.d.ts +51 -0
  100. package/dist/server/tools/get-todos.d.ts.map +1 -0
  101. package/dist/server/tools/get-todos.js +180 -0
  102. package/dist/server/tools/get-todos.js.map +1 -0
  103. package/dist/server/tools/get-type-graph.d.ts +73 -0
  104. package/dist/server/tools/get-type-graph.d.ts.map +1 -0
  105. package/dist/server/tools/get-type-graph.js +437 -0
  106. package/dist/server/tools/get-type-graph.js.map +1 -0
  107. package/dist/server/tools/health-radar.d.ts +50 -0
  108. package/dist/server/tools/health-radar.d.ts.map +1 -0
  109. package/dist/server/tools/health-radar.js +426 -0
  110. package/dist/server/tools/health-radar.js.map +1 -0
  111. package/dist/server/tools/plan-refactoring.d.ts +74 -0
  112. package/dist/server/tools/plan-refactoring.d.ts.map +1 -0
  113. package/dist/server/tools/plan-refactoring.js +644 -0
  114. package/dist/server/tools/plan-refactoring.js.map +1 -0
  115. package/dist/server/tools/render-call-graph.d.ts +40 -0
  116. package/dist/server/tools/render-call-graph.d.ts.map +1 -0
  117. package/dist/server/tools/render-call-graph.js +215 -0
  118. package/dist/server/tools/render-call-graph.js.map +1 -0
  119. package/dist/server/tools/render-class-hierarchy.d.ts +42 -0
  120. package/dist/server/tools/render-class-hierarchy.d.ts.map +1 -0
  121. package/dist/server/tools/render-class-hierarchy.js +265 -0
  122. package/dist/server/tools/render-class-hierarchy.js.map +1 -0
  123. package/dist/server/tools/render-dep-matrix.d.ts +38 -0
  124. package/dist/server/tools/render-dep-matrix.d.ts.map +1 -0
  125. package/dist/server/tools/render-dep-matrix.js +186 -0
  126. package/dist/server/tools/render-dep-matrix.js.map +1 -0
  127. package/dist/server/tools/render-diagram.d.ts +47 -0
  128. package/dist/server/tools/render-diagram.d.ts.map +1 -0
  129. package/dist/server/tools/render-diagram.js +266 -0
  130. package/dist/server/tools/render-diagram.js.map +1 -0
  131. package/dist/server/tools/render-import-graph.d.ts +41 -0
  132. package/dist/server/tools/render-import-graph.d.ts.map +1 -0
  133. package/dist/server/tools/render-import-graph.js +158 -0
  134. package/dist/server/tools/render-import-graph.js.map +1 -0
  135. package/dist/server/tools/search-ast.d.ts +55 -0
  136. package/dist/server/tools/search-ast.d.ts.map +1 -0
  137. package/dist/server/tools/search-ast.js +279 -0
  138. package/dist/server/tools/search-ast.js.map +1 -0
  139. package/dist/server/tools/search-by-complexity.d.ts +92 -0
  140. package/dist/server/tools/search-by-complexity.d.ts.map +1 -0
  141. package/dist/server/tools/search-by-complexity.js +268 -0
  142. package/dist/server/tools/search-by-complexity.js.map +1 -0
  143. package/dist/server/tools/search-by-decorator.d.ts +48 -0
  144. package/dist/server/tools/search-by-decorator.d.ts.map +1 -0
  145. package/dist/server/tools/search-by-decorator.js +518 -0
  146. package/dist/server/tools/search-by-decorator.js.map +1 -0
  147. package/dist/server/tools/search-by-signature.d.ts +56 -0
  148. package/dist/server/tools/search-by-signature.d.ts.map +1 -0
  149. package/dist/server/tools/search-by-signature.js +200 -0
  150. package/dist/server/tools/search-by-signature.js.map +1 -0
  151. package/dist/ui/assets/BlastRadius-QdgESOL8.js +1 -0
  152. package/dist/ui/assets/{DependencyGraph-B60SMPbX.js → DependencyGraph-BSMhzwWV.js} +1 -1
  153. package/dist/ui/assets/{NotFound-Bsg8Wppk.js → NotFound-CipFP_s1.js} +1 -1
  154. package/dist/ui/assets/{RepoDetail-Cie0D4_s.js → RepoDetail-Dfp5z5Kq.js} +1 -1
  155. package/dist/ui/assets/{RepoList-CldNt89M.js → RepoList-BKtST3hB.js} +1 -1
  156. package/dist/ui/assets/{Search-CgvpHMOi.js → Search-DzhGDViy.js} +1 -1
  157. package/dist/ui/assets/{SymbolView-B9h0LZTz.js → SymbolView-ryVEwAHG.js} +1 -1
  158. package/dist/ui/assets/{index-DADf5y_L.css → index-Ny8gn9F0.css} +1 -1
  159. package/dist/ui/assets/{index-eK0wMkUR.js → index-nX2chMqi.js} +2 -2
  160. package/dist/ui/assets/{useSearch-KAl3Qyi2.js → useSearch-BnBCRKui.js} +1 -1
  161. package/dist/ui/index.html +2 -2
  162. package/dist/version.d.ts +1 -1
  163. package/dist/version.js +1 -1
  164. package/docs/dev/jcodemunch-gap-analysis.md +198 -0
  165. package/package.json +9 -1
  166. package/user-manual.md +2466 -0
  167. package/dist/ui/assets/BlastRadius-RP7vJEyQ.js +0 -1
@@ -0,0 +1,294 @@
1
+ /**
2
+ * diagram-renderer.ts
3
+ *
4
+ * Shared rendering functions for converting graph nodes+edges into
5
+ * Mermaid or DOT diagram source strings.
6
+ *
7
+ * Used by render_diagram (Task 178) and the specialized render tools
8
+ * (Tasks 179–181).
9
+ */
10
+ import { posix } from 'path';
11
+ // ─── ID helpers ───────────────────────────────────────────────────────────────
12
+ /**
13
+ * Convert a file path or symbol name to a Mermaid-safe node ID.
14
+ * Replaces slashes, dots, hyphens, and spaces with underscores.
15
+ * e.g. `src/core/index-manager.ts` → `src_core_index_manager_ts`
16
+ */
17
+ export function sanitizeId(raw) {
18
+ return raw.replace(/[^A-Za-z0-9_]/g, '_');
19
+ }
20
+ /**
21
+ * Return just the filename portion of a path.
22
+ * e.g. `src/core/index-manager.ts` → `index-manager.ts`
23
+ */
24
+ export function shortLabel(filePath) {
25
+ return posix.basename(filePath);
26
+ }
27
+ /**
28
+ * Return the parent directory of a path (using posix separators).
29
+ * e.g. `src/core/index-manager.ts` → `src/core`
30
+ */
31
+ export function parentDir(filePath) {
32
+ return posix.dirname(filePath) === '.' ? '' : posix.dirname(filePath);
33
+ }
34
+ // ─── Truncation ───────────────────────────────────────────────────────────────
35
+ /**
36
+ * Prune the graph to at most `maxNodes` nodes by dropping the least-connected
37
+ * nodes first (lowest degree). Edges where either endpoint was dropped are
38
+ * removed.
39
+ */
40
+ export function pruneGraph(nodes, edges, maxNodes) {
41
+ if (nodes.length <= maxNodes) {
42
+ return { nodes, edges, truncated: false };
43
+ }
44
+ // Compute degree for each node ID
45
+ const degree = new Map();
46
+ for (const n of nodes)
47
+ degree.set(n.id, 0);
48
+ for (const e of edges) {
49
+ degree.set(e.source, (degree.get(e.source) ?? 0) + 1);
50
+ degree.set(e.target, (degree.get(e.target) ?? 0) + 1);
51
+ }
52
+ // Sort by degree descending (highest connectivity first), stable by id
53
+ const sorted = [...nodes].sort((a, b) => {
54
+ const diff = (degree.get(b.id) ?? 0) - (degree.get(a.id) ?? 0);
55
+ return diff !== 0 ? diff : a.id.localeCompare(b.id);
56
+ });
57
+ const kept = new Set(sorted.slice(0, maxNodes).map((n) => n.id));
58
+ const prunedNodes = nodes.filter((n) => kept.has(n.id));
59
+ const prunedEdges = edges.filter((e) => kept.has(e.source) && kept.has(e.target));
60
+ return { nodes: prunedNodes, edges: prunedEdges, truncated: true };
61
+ }
62
+ // ─── Mermaid renderers ────────────────────────────────────────────────────────
63
+ /**
64
+ * Render a `graph TD` Mermaid diagram (import graph view).
65
+ *
66
+ * Like `renderMermaidModule` but adds `classDef` declarations so that
67
+ * boundary nodes (files outside the scoped directory that are imported by
68
+ * files inside) and external npm nodes render with distinct colours.
69
+ */
70
+ export function renderMermaidImportGraph(nodes, edges) {
71
+ if (nodes.length === 0) {
72
+ return 'graph TD\n %% empty graph\n';
73
+ }
74
+ const lines = ['graph TD'];
75
+ // Emit classDefs for special node styles so Mermaid actually colours them.
76
+ const hasBoundary = nodes.some((n) => n.styleClass === 'boundary');
77
+ const hasExternal = nodes.some((n) => n.styleClass === 'external');
78
+ if (hasBoundary) {
79
+ lines.push(' classDef boundary fill:#ddd,stroke:#888,color:#555');
80
+ }
81
+ if (hasExternal) {
82
+ lines.push(' classDef external fill:#fee,stroke:#f99,color:#900');
83
+ }
84
+ // Group nodes by parent directory for subgraph clustering.
85
+ const groups = new Map();
86
+ for (const node of nodes) {
87
+ const g = node.group || '(root)';
88
+ const list = groups.get(g) ?? [];
89
+ list.push(node);
90
+ groups.set(g, list);
91
+ }
92
+ for (const [groupName, groupNodes] of groups) {
93
+ if (groupName === '(root)') {
94
+ for (const n of groupNodes) {
95
+ lines.push(` ${n.id}["${escapeLabel(n.label)}"]`);
96
+ }
97
+ }
98
+ else {
99
+ const sgId = sanitizeId(groupName);
100
+ lines.push(` subgraph ${sgId}["${groupName}"]`);
101
+ for (const n of groupNodes) {
102
+ lines.push(` ${n.id}["${escapeLabel(n.label)}"]`);
103
+ }
104
+ lines.push(' end');
105
+ }
106
+ }
107
+ // Apply styleClass references to special nodes.
108
+ for (const n of nodes.filter((x) => x.styleClass)) {
109
+ lines.push(` class ${n.id} ${n.styleClass};`);
110
+ }
111
+ for (const e of edges) {
112
+ const arrow = e.dashed ? '-.->' : '-->';
113
+ if (e.label) {
114
+ lines.push(` ${e.source} ${arrow}|"${escapeLabel(e.label)}"| ${e.target}`);
115
+ }
116
+ else {
117
+ lines.push(` ${e.source} ${arrow} ${e.target}`);
118
+ }
119
+ }
120
+ return lines.join('\n') + '\n';
121
+ }
122
+ /**
123
+ * Render a `graph TD` Mermaid diagram (module/import view).
124
+ * Files are grouped by directory using Mermaid `subgraph` blocks.
125
+ */
126
+ export function renderMermaidModule(nodes, edges) {
127
+ if (nodes.length === 0) {
128
+ return 'graph TD\n %% empty graph\n';
129
+ }
130
+ const lines = ['graph TD'];
131
+ // Group nodes by their `group` field (parent directory)
132
+ const groups = new Map();
133
+ for (const node of nodes) {
134
+ const g = node.group || '(root)';
135
+ const list = groups.get(g) ?? [];
136
+ list.push(node);
137
+ groups.set(g, list);
138
+ }
139
+ // Emit subgraph blocks
140
+ for (const [groupName, groupNodes] of groups) {
141
+ if (groupName === '(root)') {
142
+ // No subgraph wrapper for root-level files
143
+ for (const n of groupNodes) {
144
+ lines.push(` ${n.id}["${escapeLabel(n.label)}"]`);
145
+ }
146
+ }
147
+ else {
148
+ // Sanitize subgraph name for Mermaid (must not start with a digit)
149
+ const sgId = sanitizeId(groupName);
150
+ lines.push(` subgraph ${sgId}["${groupName}"]`);
151
+ for (const n of groupNodes) {
152
+ lines.push(` ${n.id}["${escapeLabel(n.label)}"]`);
153
+ }
154
+ lines.push(' end');
155
+ }
156
+ }
157
+ // Apply styleClass to special nodes
158
+ const styledNodes = nodes.filter((n) => n.styleClass);
159
+ for (const n of styledNodes) {
160
+ lines.push(` class ${n.id} ${n.styleClass};`);
161
+ }
162
+ // Emit edges
163
+ for (const e of edges) {
164
+ const arrow = e.dashed ? '-.->' : '-->';
165
+ if (e.label) {
166
+ lines.push(` ${e.source} ${arrow}|"${escapeLabel(e.label)}"| ${e.target}`);
167
+ }
168
+ else {
169
+ lines.push(` ${e.source} ${arrow} ${e.target}`);
170
+ }
171
+ }
172
+ return lines.join('\n') + '\n';
173
+ }
174
+ /**
175
+ * Render a `flowchart TD` Mermaid diagram (call graph view).
176
+ * rootId receives a distinct fill style.
177
+ */
178
+ export function renderMermaidCallGraph(nodes, edges, rootId) {
179
+ if (nodes.length === 0) {
180
+ return 'flowchart TD\n %% empty graph\n';
181
+ }
182
+ const lines = ['flowchart TD'];
183
+ for (const n of nodes) {
184
+ lines.push(` ${n.id}["${escapeLabel(n.label)}"]`);
185
+ }
186
+ // Style the root node distinctly
187
+ if (nodes.some((n) => n.id === rootId)) {
188
+ lines.push(` style ${rootId} fill:#f96,stroke:#333`);
189
+ }
190
+ for (const e of edges) {
191
+ const arrow = e.dashed ? '-.->' : '-->';
192
+ if (e.label) {
193
+ lines.push(` ${e.source} ${arrow}|"${escapeLabel(e.label)}"| ${e.target}`);
194
+ }
195
+ else {
196
+ lines.push(` ${e.source} ${arrow} ${e.target}`);
197
+ }
198
+ }
199
+ return lines.join('\n') + '\n';
200
+ }
201
+ /**
202
+ * Render a Mermaid `classDiagram` diagram (class hierarchy view).
203
+ * Edges use `<|--` for extends and `<|..` for implements.
204
+ */
205
+ export function renderMermaidClassDiagram(nodes, edges, memberMap) {
206
+ if (nodes.length === 0) {
207
+ return 'classDiagram\n %% empty diagram\n';
208
+ }
209
+ const lines = ['classDiagram'];
210
+ // Emit class boxes
211
+ for (const n of nodes) {
212
+ const members = memberMap?.get(n.id) ?? [];
213
+ if (members.length > 0) {
214
+ lines.push(` class ${n.id} {`);
215
+ for (const m of members) {
216
+ lines.push(` ${m}`);
217
+ }
218
+ lines.push(' }');
219
+ // Add a label annotation if the sanitized id differs from the class name
220
+ if (n.id !== n.label) {
221
+ lines.push(` ${n.id}["${escapeLabel(n.label)}"]`);
222
+ }
223
+ }
224
+ else {
225
+ lines.push(` class ${n.id}`);
226
+ if (n.id !== n.label) {
227
+ lines.push(` ${n.id}["${escapeLabel(n.label)}"]`);
228
+ }
229
+ }
230
+ }
231
+ // Emit relationships
232
+ for (const e of edges) {
233
+ if (e.dashed) {
234
+ // implements: parent <|.. child
235
+ const rel = e.label ? `${e.target} <|.. ${e.source} : ${e.label}` : `${e.target} <|.. ${e.source}`;
236
+ lines.push(` ${rel}`);
237
+ }
238
+ else {
239
+ // extends: parent <|-- child
240
+ const rel = e.label ? `${e.target} <|-- ${e.source} : ${e.label}` : `${e.target} <|-- ${e.source}`;
241
+ lines.push(` ${rel}`);
242
+ }
243
+ }
244
+ return lines.join('\n') + '\n';
245
+ }
246
+ /**
247
+ * Render a DOT (Graphviz) diagram.
248
+ */
249
+ export function renderDot(nodes, edges) {
250
+ if (nodes.length === 0) {
251
+ return 'digraph G {\n}\n';
252
+ }
253
+ const lines = ['digraph G {', ' rankdir=TD;', ' node [shape=box];'];
254
+ // Group nodes into clusters by directory
255
+ const groups = new Map();
256
+ for (const node of nodes) {
257
+ const g = node.group || '';
258
+ const list = groups.get(g) ?? [];
259
+ list.push(node);
260
+ groups.set(g, list);
261
+ }
262
+ let clusterIdx = 0;
263
+ for (const [groupName, groupNodes] of groups) {
264
+ if (!groupName) {
265
+ for (const n of groupNodes) {
266
+ lines.push(` "${n.id}" [label="${dotEscape(n.label)}"];`);
267
+ }
268
+ }
269
+ else {
270
+ lines.push(` subgraph cluster_${clusterIdx++} {`);
271
+ lines.push(` label="${dotEscape(groupName)}";`);
272
+ for (const n of groupNodes) {
273
+ lines.push(` "${n.id}" [label="${dotEscape(n.label)}"];`);
274
+ }
275
+ lines.push(' }');
276
+ }
277
+ }
278
+ for (const e of edges) {
279
+ const attrs = e.dashed ? ' [style=dashed]' : '';
280
+ lines.push(` "${e.source}" -> "${e.target}"${attrs};`);
281
+ }
282
+ lines.push('}');
283
+ return lines.join('\n') + '\n';
284
+ }
285
+ // ─── Internal helpers ─────────────────────────────────────────────────────────
286
+ /** Escape double-quotes and backslashes in Mermaid labels. */
287
+ function escapeLabel(s) {
288
+ return s.replace(/\\/g, '\\\\').replace(/"/g, '\\"');
289
+ }
290
+ /** Escape special chars in DOT string literals. */
291
+ function dotEscape(s) {
292
+ return s.replace(/\\/g, '\\\\').replace(/"/g, '\\"');
293
+ }
294
+ //# sourceMappingURL=diagram-renderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagram-renderer.js","sourceRoot":"","sources":["../../src/graph/diagram-renderer.ts"],"names":[],"mappings":"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"}
@@ -33,6 +33,64 @@ export declare function findImporters(filePath: string, repoId: string, db: Data
33
33
  * Delegates to the dep-store query.
34
34
  */
35
35
  export declare function findDeadCode(repoId: string, db: Database.Database): SymbolRecord[];
36
+ export interface CyclePath {
37
+ /** Ordered list of files forming the cycle (last file imports the first). */
38
+ files: string[];
39
+ /** Number of files in the cycle. */
40
+ length: number;
41
+ /** 'error' for tight 2–3-node cycles; 'warning' for longer chains. */
42
+ severity: 'warning' | 'error';
43
+ }
44
+ export interface FindCyclesResult {
45
+ cycles: CyclePath[];
46
+ totalFound: number;
47
+ /** true if maxCycles caused some results to be omitted. */
48
+ truncated: boolean;
49
+ }
50
+ /**
51
+ * Detect all import cycles in the repo's dependency graph.
52
+ *
53
+ * Algorithm: DFS with path stack. Deduplication trick: only explore paths
54
+ * where all intermediate nodes are lexicographically greater than the starting
55
+ * node. This ensures each cycle is found exactly once, rooted at its
56
+ * lexicographically smallest file path, without needing a post-dedup step.
57
+ *
58
+ * When `filePath` is provided, only cycles involving that file are returned.
59
+ * The `maxCycles` cap is applied after any filePath filter.
60
+ */
61
+ export declare function findImportCycles(repoId: string, db: Database.Database, filePath?: string, maxCycles?: number, minLength?: number): FindCyclesResult;
62
+ export interface HierarchyNode {
63
+ /** null for external (unindexed) base classes/interfaces. */
64
+ symbolId: string | null;
65
+ name: string;
66
+ /** null for external. */
67
+ filePath: string | null;
68
+ startLine: number;
69
+ signature: string;
70
+ isAbstract: boolean;
71
+ isInterface: boolean;
72
+ /** Interface names from `implements` clause (not necessarily indexed). */
73
+ implementedInterfaces: string[];
74
+ /** 0 = root, negative = ancestor, positive = descendant. */
75
+ depth: number;
76
+ children: HierarchyNode[];
77
+ }
78
+ export interface ClassHierarchyResult {
79
+ root: HierarchyNode;
80
+ totalNodes: number;
81
+ }
82
+ /**
83
+ * Build the full inheritance chain for a class or interface.
84
+ *
85
+ * - Ancestors: follows `extends` clauses upward; external base classes become
86
+ * leaf nodes with `symbolId: null`.
87
+ * - Descendants: finds all classes/interfaces whose signature contains
88
+ * `extends TargetName` (word-boundary-checked) using a LIKE query.
89
+ * - When `includeInterfaces` is true (default), the `implements` clause is also
90
+ * traversed for ancestor nodes, and interface subclasses are included as
91
+ * descendants.
92
+ */
93
+ export declare function buildClassHierarchy(symbolId: string, repoId: string, db: Database.Database, direction: 'ancestors' | 'descendants' | 'both', maxDepth: number, includeInterfaces: boolean): ClassHierarchyResult | null;
36
94
  export interface BlastRadiusEntry {
37
95
  filePath: string;
38
96
  depth: number;
@@ -54,4 +112,38 @@ export interface BlastRadiusWithDepths {
54
112
  * blast radius visualization.
55
113
  */
56
114
  export declare function getBlastRadiusWithDepths(symbolId: string, repoId: string, db: Database.Database, maxDepth?: number): BlastRadiusWithDepths | null;
115
+ export interface CallNode {
116
+ symbolId: string;
117
+ name: string;
118
+ kind: string;
119
+ filePath: string;
120
+ startLine: number;
121
+ signature: string;
122
+ /** How many times this symbol calls / is called by its parent in the tree. */
123
+ callCount: number;
124
+ /** true when this node closes a cycle back to an ancestor — children are empty. */
125
+ cyclic: boolean;
126
+ children: CallNode[];
127
+ }
128
+ export interface CallHierarchyResult {
129
+ root: CallNode;
130
+ direction: 'callers' | 'callees' | 'both';
131
+ totalNodes: number;
132
+ /** true when maxNodes or maxDepth cut the tree short. */
133
+ truncated: boolean;
134
+ }
135
+ /**
136
+ * Build the full call hierarchy for a function or method symbol.
137
+ *
138
+ * Strategy (query-time text scan):
139
+ * - Callees: scan the root symbol's source text for `name(` patterns, match
140
+ * them against all indexed symbols in the repo.
141
+ * - Callers: scan every callable symbol's source for references to the root
142
+ * symbol's name, file-content cache prevents repeated disk reads.
143
+ *
144
+ * The implementation does NOT require call edges in `dep_edges`; it derives
145
+ * relationships at query time, making it safe to call on any indexed repo
146
+ * without a re-index.
147
+ */
148
+ export declare function buildCallHierarchy(symbolId: string, repoId: string, db: Database.Database, direction: 'callers' | 'callees' | 'both', maxDepth: number, maxNodes: number): CallHierarchyResult | null;
57
149
  //# sourceMappingURL=graph-traversal.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"graph-traversal.d.ts","sourceRoot":"","sources":["../../src/graph/graph-traversal.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAMrD,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,8CAA8C;IAC9C,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,qEAAqE;IACrE,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,YAAY,EAAE,CAAC;CACzB;AAID;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,KAAK,SAAI,GACR,eAAe,CAQjB;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,KAAK,SAAI,GACR,eAAe,CAQjB;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,EAAE,EAAE,QAAQ,CAAC,QAAQ,GACpB,YAAY,EAAE,CAMhB;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,MAAM,EACd,EAAE,EAAE,QAAQ,CAAC,QAAQ,GACpB,YAAY,EAAE,CAEhB;AAoED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,WAAW,GAAG,SAAS,CAAC,EAAE,CAAC;CACjF;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,gBAAgB,EAAE,CAAC;CAC7B;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,QAAQ,SAAI,GACX,qBAAqB,GAAG,IAAI,CAkD9B"}
1
+ {"version":3,"file":"graph-traversal.d.ts","sourceRoot":"","sources":["../../src/graph/graph-traversal.ts"],"names":[],"mappings":"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"}