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.
- package/AGENT_INSTRUCTIONS.md +393 -0
- package/AGENT_INSTRUCTIONS_SHORT.md +53 -0
- package/AST-SEARCH.md +274 -0
- package/CHANGELOG.md +62 -0
- package/CODE-INTELLIGENCE.md +369 -0
- package/HEALTH-DASHBOARDS.md +241 -0
- package/README.md +7 -0
- package/REFACTORING-SAFELY.md +279 -0
- package/UNDERSTANDING-RELATIONSHIPS.md +240 -0
- package/USER-GUIDE.md +14 -0
- package/VISUALIZING-CODE.md +199 -0
- package/WORKFLOW-TECH-DEBT.md +286 -0
- package/dist/core/db/dep-store.d.ts +75 -0
- package/dist/core/db/dep-store.d.ts.map +1 -1
- package/dist/core/db/dep-store.js +277 -0
- package/dist/core/db/dep-store.js.map +1 -1
- package/dist/core/db/schema.d.ts.map +1 -1
- package/dist/core/db/schema.js +12 -0
- package/dist/core/db/schema.js.map +1 -1
- package/dist/core/index-manager.js +1 -1
- package/dist/core/index-manager.js.map +1 -1
- package/dist/core/types.d.ts +5 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/graph/diagram-renderer.d.ts +83 -0
- package/dist/graph/diagram-renderer.d.ts.map +1 -0
- package/dist/graph/diagram-renderer.js +294 -0
- package/dist/graph/diagram-renderer.js.map +1 -0
- package/dist/graph/graph-traversal.d.ts +92 -0
- package/dist/graph/graph-traversal.d.ts.map +1 -1
- package/dist/graph/graph-traversal.js +440 -2
- package/dist/graph/graph-traversal.js.map +1 -1
- package/dist/server/mcp-server.d.ts.map +1 -1
- package/dist/server/mcp-server.js +145 -0
- package/dist/server/mcp-server.js.map +1 -1
- package/dist/server/tools/check-delete-safe.d.ts +50 -0
- package/dist/server/tools/check-delete-safe.d.ts.map +1 -0
- package/dist/server/tools/check-delete-safe.js +308 -0
- package/dist/server/tools/check-delete-safe.js.map +1 -0
- package/dist/server/tools/check-move-safe.d.ts +44 -0
- package/dist/server/tools/check-move-safe.d.ts.map +1 -0
- package/dist/server/tools/check-move-safe.js +266 -0
- package/dist/server/tools/check-move-safe.js.map +1 -0
- package/dist/server/tools/check-rename-safe.d.ts +48 -0
- package/dist/server/tools/check-rename-safe.d.ts.map +1 -0
- package/dist/server/tools/check-rename-safe.js +218 -0
- package/dist/server/tools/check-rename-safe.js.map +1 -0
- package/dist/server/tools/diff-health-radar.d.ts +44 -0
- package/dist/server/tools/diff-health-radar.d.ts.map +1 -0
- package/dist/server/tools/diff-health-radar.js +192 -0
- package/dist/server/tools/diff-health-radar.js.map +1 -0
- package/dist/server/tools/find-cycles.d.ts +31 -0
- package/dist/server/tools/find-cycles.d.ts.map +1 -0
- package/dist/server/tools/find-cycles.js +85 -0
- package/dist/server/tools/find-cycles.js.map +1 -0
- package/dist/server/tools/find-implementations.d.ts +47 -0
- package/dist/server/tools/find-implementations.d.ts.map +1 -0
- package/dist/server/tools/find-implementations.js +167 -0
- package/dist/server/tools/find-implementations.js.map +1 -0
- package/dist/server/tools/find-untested-symbols.d.ts +52 -0
- package/dist/server/tools/find-untested-symbols.d.ts.map +1 -0
- package/dist/server/tools/find-untested-symbols.js +308 -0
- package/dist/server/tools/find-untested-symbols.js.map +1 -0
- package/dist/server/tools/get-architecture-snapshot.d.ts +43 -0
- package/dist/server/tools/get-architecture-snapshot.d.ts.map +1 -0
- package/dist/server/tools/get-architecture-snapshot.js +292 -0
- package/dist/server/tools/get-architecture-snapshot.js.map +1 -0
- package/dist/server/tools/get-call-hierarchy.d.ts +43 -0
- package/dist/server/tools/get-call-hierarchy.d.ts.map +1 -0
- package/dist/server/tools/get-call-hierarchy.js +119 -0
- package/dist/server/tools/get-call-hierarchy.js.map +1 -0
- package/dist/server/tools/get-class-hierarchy.d.ts +36 -0
- package/dist/server/tools/get-class-hierarchy.d.ts.map +1 -0
- package/dist/server/tools/get-class-hierarchy.js +125 -0
- package/dist/server/tools/get-class-hierarchy.js.map +1 -0
- package/dist/server/tools/get-complexity-hotspots.d.ts +50 -0
- package/dist/server/tools/get-complexity-hotspots.d.ts.map +1 -0
- package/dist/server/tools/get-complexity-hotspots.js +282 -0
- package/dist/server/tools/get-complexity-hotspots.js.map +1 -0
- package/dist/server/tools/get-coupling-map.d.ts +39 -0
- package/dist/server/tools/get-coupling-map.d.ts.map +1 -0
- package/dist/server/tools/get-coupling-map.js +107 -0
- package/dist/server/tools/get-coupling-map.js.map +1 -0
- package/dist/server/tools/get-debt-report.d.ts +44 -0
- package/dist/server/tools/get-debt-report.d.ts.map +1 -0
- package/dist/server/tools/get-debt-report.js +606 -0
- package/dist/server/tools/get-debt-report.js.map +1 -0
- package/dist/server/tools/get-entry-points.d.ts +79 -0
- package/dist/server/tools/get-entry-points.d.ts.map +1 -0
- package/dist/server/tools/get-entry-points.js +362 -0
- package/dist/server/tools/get-entry-points.js.map +1 -0
- package/dist/server/tools/get-public-api.d.ts +53 -0
- package/dist/server/tools/get-public-api.d.ts.map +1 -0
- package/dist/server/tools/get-public-api.js +218 -0
- package/dist/server/tools/get-public-api.js.map +1 -0
- package/dist/server/tools/get-test-coverage-map.d.ts +66 -0
- package/dist/server/tools/get-test-coverage-map.d.ts.map +1 -0
- package/dist/server/tools/get-test-coverage-map.js +588 -0
- package/dist/server/tools/get-test-coverage-map.js.map +1 -0
- package/dist/server/tools/get-todos.d.ts +51 -0
- package/dist/server/tools/get-todos.d.ts.map +1 -0
- package/dist/server/tools/get-todos.js +180 -0
- package/dist/server/tools/get-todos.js.map +1 -0
- package/dist/server/tools/get-type-graph.d.ts +73 -0
- package/dist/server/tools/get-type-graph.d.ts.map +1 -0
- package/dist/server/tools/get-type-graph.js +437 -0
- package/dist/server/tools/get-type-graph.js.map +1 -0
- package/dist/server/tools/health-radar.d.ts +50 -0
- package/dist/server/tools/health-radar.d.ts.map +1 -0
- package/dist/server/tools/health-radar.js +426 -0
- package/dist/server/tools/health-radar.js.map +1 -0
- package/dist/server/tools/plan-refactoring.d.ts +74 -0
- package/dist/server/tools/plan-refactoring.d.ts.map +1 -0
- package/dist/server/tools/plan-refactoring.js +644 -0
- package/dist/server/tools/plan-refactoring.js.map +1 -0
- package/dist/server/tools/render-call-graph.d.ts +40 -0
- package/dist/server/tools/render-call-graph.d.ts.map +1 -0
- package/dist/server/tools/render-call-graph.js +215 -0
- package/dist/server/tools/render-call-graph.js.map +1 -0
- package/dist/server/tools/render-class-hierarchy.d.ts +42 -0
- package/dist/server/tools/render-class-hierarchy.d.ts.map +1 -0
- package/dist/server/tools/render-class-hierarchy.js +265 -0
- package/dist/server/tools/render-class-hierarchy.js.map +1 -0
- package/dist/server/tools/render-dep-matrix.d.ts +38 -0
- package/dist/server/tools/render-dep-matrix.d.ts.map +1 -0
- package/dist/server/tools/render-dep-matrix.js +186 -0
- package/dist/server/tools/render-dep-matrix.js.map +1 -0
- package/dist/server/tools/render-diagram.d.ts +47 -0
- package/dist/server/tools/render-diagram.d.ts.map +1 -0
- package/dist/server/tools/render-diagram.js +266 -0
- package/dist/server/tools/render-diagram.js.map +1 -0
- package/dist/server/tools/render-import-graph.d.ts +41 -0
- package/dist/server/tools/render-import-graph.d.ts.map +1 -0
- package/dist/server/tools/render-import-graph.js +158 -0
- package/dist/server/tools/render-import-graph.js.map +1 -0
- package/dist/server/tools/search-ast.d.ts +55 -0
- package/dist/server/tools/search-ast.d.ts.map +1 -0
- package/dist/server/tools/search-ast.js +279 -0
- package/dist/server/tools/search-ast.js.map +1 -0
- package/dist/server/tools/search-by-complexity.d.ts +92 -0
- package/dist/server/tools/search-by-complexity.d.ts.map +1 -0
- package/dist/server/tools/search-by-complexity.js +268 -0
- package/dist/server/tools/search-by-complexity.js.map +1 -0
- package/dist/server/tools/search-by-decorator.d.ts +48 -0
- package/dist/server/tools/search-by-decorator.d.ts.map +1 -0
- package/dist/server/tools/search-by-decorator.js +518 -0
- package/dist/server/tools/search-by-decorator.js.map +1 -0
- package/dist/server/tools/search-by-signature.d.ts +56 -0
- package/dist/server/tools/search-by-signature.d.ts.map +1 -0
- package/dist/server/tools/search-by-signature.js +200 -0
- package/dist/server/tools/search-by-signature.js.map +1 -0
- package/dist/ui/assets/BlastRadius-QdgESOL8.js +1 -0
- package/dist/ui/assets/{DependencyGraph-B60SMPbX.js → DependencyGraph-BSMhzwWV.js} +1 -1
- package/dist/ui/assets/{NotFound-Bsg8Wppk.js → NotFound-CipFP_s1.js} +1 -1
- package/dist/ui/assets/{RepoDetail-Cie0D4_s.js → RepoDetail-Dfp5z5Kq.js} +1 -1
- package/dist/ui/assets/{RepoList-CldNt89M.js → RepoList-BKtST3hB.js} +1 -1
- package/dist/ui/assets/{Search-CgvpHMOi.js → Search-DzhGDViy.js} +1 -1
- package/dist/ui/assets/{SymbolView-B9h0LZTz.js → SymbolView-ryVEwAHG.js} +1 -1
- package/dist/ui/assets/{index-DADf5y_L.css → index-Ny8gn9F0.css} +1 -1
- package/dist/ui/assets/{index-eK0wMkUR.js → index-nX2chMqi.js} +2 -2
- package/dist/ui/assets/{useSearch-KAl3Qyi2.js → useSearch-BnBCRKui.js} +1 -1
- package/dist/ui/index.html +2 -2
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/docs/dev/jcodemunch-gap-analysis.md +198 -0
- package/package.json +9 -1
- package/user-manual.md +2466 -0
- 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":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,MAAM,CAAC;AA0B7B,iFAAiF;AAEjF;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAC,GAAW;IACpC,OAAO,GAAG,CAAC,OAAO,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAC;AAC5C,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,QAAgB;IACzC,OAAO,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AAClC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,QAAgB;IACxC,OAAO,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;AACxE,CAAC;AAED,iFAAiF;AAEjF;;;;GAIG;AACH,MAAM,UAAU,UAAU,CACxB,KAAkB,EAClB,KAAkB,EAClB,QAAgB;IAEhB,IAAI,KAAK,CAAC,MAAM,IAAI,QAAQ,EAAE,CAAC;QAC7B,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IAC5C,CAAC;IAED,kCAAkC;IAClC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;IACzC,KAAK,MAAM,CAAC,IAAI,KAAK;QAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IAC3C,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACtD,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACxD,CAAC;IAED,uEAAuE;IACvE,MAAM,MAAM,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACtC,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;QAC/D,OAAO,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACjE,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACxD,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;IAElF,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;AACrE,CAAC;AAED,iFAAiF;AAEjF;;;;;;GAMG;AACH,MAAM,UAAU,wBAAwB,CAAC,KAAkB,EAAE,KAAkB;IAC7E,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,8BAA8B,CAAC;IACxC,CAAC;IAED,MAAM,KAAK,GAAa,CAAC,UAAU,CAAC,CAAC;IAErC,2EAA2E;IAC3E,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,KAAK,UAAU,CAAC,CAAC;IACnE,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,KAAK,UAAU,CAAC,CAAC;IACnE,IAAI,WAAW,EAAE,CAAC;QAChB,KAAK,CAAC,IAAI,CAAC,sDAAsD,CAAC,CAAC;IACrE,CAAC;IACD,IAAI,WAAW,EAAE,CAAC;QAChB,KAAK,CAAC,IAAI,CAAC,sDAAsD,CAAC,CAAC;IACrE,CAAC;IAED,2DAA2D;IAC3D,MAAM,MAAM,GAAG,IAAI,GAAG,EAAuB,CAAC;IAC9C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,IAAI,QAAQ,CAAC;QACjC,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACjC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChB,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IACtB,CAAC;IAED,KAAK,MAAM,CAAC,SAAS,EAAE,UAAU,CAAC,IAAI,MAAM,EAAE,CAAC;QAC7C,IAAI,SAAS,KAAK,QAAQ,EAAE,CAAC;YAC3B,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;gBAC3B,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACrD,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;YACnC,KAAK,CAAC,IAAI,CAAC,cAAc,IAAI,KAAK,SAAS,IAAI,CAAC,CAAC;YACjD,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;gBAC3B,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACvD,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;IAED,gDAAgD;IAChD,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE,CAAC;QAClD,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC;IACjD,CAAC;IAED,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,MAAM,KAAK,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;QACxC,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;YACZ,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,IAAI,KAAK,KAAK,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;QAC9E,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,IAAI,KAAK,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AACjC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAAkB,EAAE,KAAkB;IACxE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,8BAA8B,CAAC;IACxC,CAAC;IAED,MAAM,KAAK,GAAa,CAAC,UAAU,CAAC,CAAC;IAErC,wDAAwD;IACxD,MAAM,MAAM,GAAG,IAAI,GAAG,EAAuB,CAAC;IAC9C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,IAAI,QAAQ,CAAC;QACjC,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACjC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChB,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IACtB,CAAC;IAED,uBAAuB;IACvB,KAAK,MAAM,CAAC,SAAS,EAAE,UAAU,CAAC,IAAI,MAAM,EAAE,CAAC;QAC7C,IAAI,SAAS,KAAK,QAAQ,EAAE,CAAC;YAC3B,2CAA2C;YAC3C,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;gBAC3B,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACrD,CAAC;QACH,CAAC;aAAM,CAAC;YACN,mEAAmE;YACnE,MAAM,IAAI,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;YACnC,KAAK,CAAC,IAAI,CAAC,cAAc,IAAI,KAAK,SAAS,IAAI,CAAC,CAAC;YACjD,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;gBAC3B,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACvD,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;IAED,oCAAoC;IACpC,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;IACtD,KAAK,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC;QAC5B,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC;IACjD,CAAC;IAED,aAAa;IACb,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,MAAM,KAAK,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;QACxC,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;YACZ,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,IAAI,KAAK,KAAK,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;QAC9E,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,IAAI,KAAK,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AACjC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,sBAAsB,CACpC,KAAkB,EAClB,KAAkB,EAClB,MAAc;IAEd,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,kCAAkC,CAAC;IAC5C,CAAC;IAED,MAAM,KAAK,GAAa,CAAC,cAAc,CAAC,CAAC;IAEzC,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACrD,CAAC;IAED,iCAAiC;IACjC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,EAAE,CAAC;QACvC,KAAK,CAAC,IAAI,CAAC,WAAW,MAAM,wBAAwB,CAAC,CAAC;IACxD,CAAC;IAED,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,MAAM,KAAK,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;QACxC,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;YACZ,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,IAAI,KAAK,KAAK,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;QAC9E,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,IAAI,KAAK,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AACjC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,yBAAyB,CACvC,KAAkB,EAClB,KAAkB,EAClB,SAAiC;IAEjC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,oCAAoC,CAAC;IAC9C,CAAC;IAED,MAAM,KAAK,GAAa,CAAC,cAAc,CAAC,CAAC;IAEzC,mBAAmB;IACnB,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,MAAM,OAAO,GAAG,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;QAC3C,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;YAChC,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;gBACxB,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACzB,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAClB,yEAAyE;YACzE,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC;gBACrB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACrD,CAAC;QACH,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC9B,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC;gBACrB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACrD,CAAC;QACH,CAAC;IACH,CAAC;IAED,qBAAqB;IACrB,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;YACb,gCAAgC;YAChC,MAAM,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,SAAS,CAAC,CAAC,MAAM,MAAM,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,SAAS,CAAC,CAAC,MAAM,EAAE,CAAC;YACnG,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;QACzB,CAAC;aAAM,CAAC;YACN,6BAA6B;YAC7B,MAAM,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,SAAS,CAAC,CAAC,MAAM,MAAM,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,SAAS,CAAC,CAAC,MAAM,EAAE,CAAC;YACnG,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;QACzB,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AACjC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,KAAkB,EAAE,KAAkB;IAC9D,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,kBAAkB,CAAC;IAC5B,CAAC;IAED,MAAM,KAAK,GAAa,CAAC,aAAa,EAAE,eAAe,EAAE,qBAAqB,CAAC,CAAC;IAEhF,yCAAyC;IACzC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAuB,CAAC;IAC9C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;QAC3B,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACjC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChB,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IACtB,CAAC;IAED,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,KAAK,MAAM,CAAC,SAAS,EAAE,UAAU,CAAC,IAAI,MAAM,EAAE,CAAC;QAC7C,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;gBAC3B,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,aAAa,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAC7D,CAAC;QACH,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,IAAI,CAAC,sBAAsB,UAAU,EAAE,IAAI,CAAC,CAAC;YACnD,KAAK,CAAC,IAAI,CAAC,cAAc,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YACnD,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;gBAC3B,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,aAAa,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAC/D,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACpB,CAAC;IACH,CAAC;IAED,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,MAAM,KAAK,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,CAAC;QAChD,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,SAAS,CAAC,CAAC,MAAM,IAAI,KAAK,GAAG,CAAC,CAAC;IAC1D,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AACjC,CAAC;AAED,iFAAiF;AAEjF,8DAA8D;AAC9D,SAAS,WAAW,CAAC,CAAS;IAC5B,OAAO,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AACvD,CAAC;AAED,mDAAmD;AACnD,SAAS,SAAS,CAAC,CAAS;IAC1B,OAAO,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AACvD,CAAC"}
|
|
@@ -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;
|
|
1
|
+
{"version":3,"file":"graph-traversal.d.ts","sourceRoot":"","sources":["../../src/graph/graph-traversal.ts"],"names":[],"mappings":"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"}
|