@jafreck/lore 0.3.6 → 0.3.8
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/README.md +38 -150
- package/dist/cli.d.ts +2 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +80 -32
- package/dist/cli.js.map +1 -1
- package/dist/db/read-only.d.ts +22 -43
- package/dist/db/read-only.d.ts.map +1 -1
- package/dist/db/read-only.js +80 -156
- package/dist/db/read-only.js.map +1 -1
- package/dist/db/schema.d.ts +9 -0
- package/dist/db/schema.d.ts.map +1 -1
- package/dist/db/schema.js +171 -85
- package/dist/db/schema.js.map +1 -1
- package/dist/discovery/poller.d.ts +6 -16
- package/dist/discovery/poller.d.ts.map +1 -1
- package/dist/discovery/poller.js +21 -52
- package/dist/discovery/poller.js.map +1 -1
- package/dist/discovery/scip-flush.d.ts +44 -0
- package/dist/discovery/scip-flush.d.ts.map +1 -0
- package/dist/discovery/scip-flush.js +67 -0
- package/dist/discovery/scip-flush.js.map +1 -0
- package/dist/discovery/watcher.d.ts +6 -16
- package/dist/discovery/watcher.d.ts.map +1 -1
- package/dist/discovery/watcher.js +22 -54
- package/dist/discovery/watcher.js.map +1 -1
- package/dist/docs/docs.d.ts +0 -2
- package/dist/docs/docs.d.ts.map +1 -1
- package/dist/docs/docs.js +0 -27
- package/dist/docs/docs.js.map +1 -1
- package/dist/embeddings/embedder.d.ts +12 -8
- package/dist/embeddings/embedder.d.ts.map +1 -1
- package/dist/embeddings/embedder.js +35 -19
- package/dist/embeddings/embedder.js.map +1 -1
- package/dist/index.d.ts +5 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/dist/indexer/index.d.ts +19 -10
- package/dist/indexer/index.d.ts.map +1 -1
- package/dist/indexer/index.js +135 -28
- package/dist/indexer/index.js.map +1 -1
- package/dist/indexer/pipeline.d.ts +44 -21
- package/dist/indexer/pipeline.d.ts.map +1 -1
- package/dist/indexer/pipeline.js +48 -26
- package/dist/indexer/pipeline.js.map +1 -1
- package/dist/indexer/stages/docs-index.d.ts +1 -3
- package/dist/indexer/stages/docs-index.d.ts.map +1 -1
- package/dist/indexer/stages/docs-index.js +1 -25
- package/dist/indexer/stages/docs-index.js.map +1 -1
- package/dist/indexer/stages/index.d.ts +4 -2
- package/dist/indexer/stages/index.d.ts.map +1 -1
- package/dist/indexer/stages/index.js +3 -2
- package/dist/indexer/stages/index.js.map +1 -1
- package/dist/indexer/stages/lsp-enrichment.d.ts +1 -1
- package/dist/indexer/stages/lsp-enrichment.d.ts.map +1 -1
- package/dist/indexer/stages/lsp-enrichment.js +44 -21
- package/dist/indexer/stages/lsp-enrichment.js.map +1 -1
- package/dist/indexer/stages/overlay-cleanup.d.ts +31 -0
- package/dist/indexer/stages/overlay-cleanup.d.ts.map +1 -0
- package/dist/indexer/stages/overlay-cleanup.js +64 -0
- package/dist/indexer/stages/overlay-cleanup.js.map +1 -0
- package/dist/indexer/stages/reverse-deps.d.ts +13 -0
- package/dist/indexer/stages/reverse-deps.d.ts.map +1 -0
- package/dist/indexer/stages/reverse-deps.js +81 -0
- package/dist/indexer/stages/reverse-deps.js.map +1 -0
- package/dist/indexer/stages/{scip-source.d.ts → scip-indexer.d.ts} +38 -9
- package/dist/indexer/stages/scip-indexer.d.ts.map +1 -0
- package/dist/indexer/stages/{scip-source.js → scip-indexer.js} +359 -98
- package/dist/indexer/stages/scip-indexer.js.map +1 -0
- package/dist/indexer/stages/source-index.d.ts +3 -3
- package/dist/indexer/stages/source-index.d.ts.map +1 -1
- package/dist/indexer/stages/source-index.js +188 -70
- package/dist/indexer/stages/source-index.js.map +1 -1
- package/dist/lsp/enrichment.d.ts.map +1 -1
- package/dist/lsp/enrichment.js +1 -18
- package/dist/lsp/enrichment.js.map +1 -1
- package/dist/parsing/extractors/go.d.ts.map +1 -1
- package/dist/parsing/extractors/go.js +0 -38
- package/dist/parsing/extractors/go.js.map +1 -1
- package/dist/parsing/extractors/javascript.d.ts.map +1 -1
- package/dist/parsing/extractors/javascript.js +0 -47
- package/dist/parsing/extractors/javascript.js.map +1 -1
- package/dist/parsing/extractors/python.d.ts.map +1 -1
- package/dist/parsing/extractors/python.js +0 -22
- package/dist/parsing/extractors/python.js.map +1 -1
- package/dist/parsing/extractors/types.d.ts +0 -16
- package/dist/parsing/extractors/types.d.ts.map +1 -1
- package/dist/parsing/extractors/types.js +1 -1
- package/dist/parsing/extractors/types.js.map +1 -1
- package/dist/parsing/extractors/typescript.d.ts.map +1 -1
- package/dist/parsing/extractors/typescript.js +18 -2
- package/dist/parsing/extractors/typescript.js.map +1 -1
- package/dist/resolution/call-graph.d.ts +3 -1
- package/dist/resolution/call-graph.d.ts.map +1 -1
- package/dist/resolution/call-graph.js +15 -13
- package/dist/resolution/call-graph.js.map +1 -1
- package/dist/resolution/resolution-method.d.ts +1 -1
- package/dist/resolution/resolution-method.d.ts.map +1 -1
- package/dist/resolution/resolution-method.js +2 -0
- package/dist/resolution/resolution-method.js.map +1 -1
- package/dist/resolution/resolver.d.ts +6 -0
- package/dist/resolution/resolver.d.ts.map +1 -1
- package/dist/resolution/resolver.js +21 -0
- package/dist/resolution/resolver.js.map +1 -1
- package/dist/runtime.d.ts +0 -2
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js.map +1 -1
- package/dist/scip/compdb.d.ts +38 -0
- package/dist/scip/compdb.d.ts.map +1 -0
- package/dist/scip/compdb.js +138 -0
- package/dist/scip/compdb.js.map +1 -0
- package/dist/scip/enrichment.d.ts +6 -1
- package/dist/scip/enrichment.d.ts.map +1 -1
- package/dist/scip/enrichment.js +62 -5
- package/dist/scip/enrichment.js.map +1 -1
- package/dist/scip/installer.d.ts +59 -0
- package/dist/scip/installer.d.ts.map +1 -0
- package/dist/scip/installer.js +302 -0
- package/dist/scip/installer.js.map +1 -0
- package/dist/scip/registry.d.ts +1 -1
- package/dist/scip/registry.d.ts.map +1 -1
- package/dist/scip/registry.js +33 -5
- package/dist/scip/registry.js.map +1 -1
- package/dist/server/server.d.ts +3 -8
- package/dist/server/server.d.ts.map +1 -1
- package/dist/server/server.js +7 -66
- package/dist/server/server.js.map +1 -1
- package/dist/server/tool-registry.d.ts +2 -2
- package/dist/server/tool-registry.d.ts.map +1 -1
- package/dist/server/tool-registry.js +37 -41
- package/dist/server/tool-registry.js.map +1 -1
- package/dist/server/tools/cohesion.d.ts +46 -0
- package/dist/server/tools/cohesion.d.ts.map +1 -0
- package/dist/server/tools/cohesion.js +100 -0
- package/dist/server/tools/cohesion.js.map +1 -0
- package/dist/server/tools/dependents.d.ts +139 -0
- package/dist/server/tools/dependents.d.ts.map +1 -0
- package/dist/server/tools/dependents.js +354 -0
- package/dist/server/tools/dependents.js.map +1 -0
- package/dist/server/tools/diff.d.ts +73 -0
- package/dist/server/tools/diff.d.ts.map +1 -0
- package/dist/server/tools/diff.js +157 -0
- package/dist/server/tools/diff.js.map +1 -0
- package/dist/server/tools/graph.d.ts +7 -3
- package/dist/server/tools/graph.d.ts.map +1 -1
- package/dist/server/tools/graph.js +15 -85
- package/dist/server/tools/graph.js.map +1 -1
- package/dist/server/tools/metrics.d.ts +5 -30
- package/dist/server/tools/metrics.d.ts.map +1 -1
- package/dist/server/tools/metrics.js +21 -57
- package/dist/server/tools/metrics.js.map +1 -1
- package/dist/server/tools/structure.d.ts +77 -0
- package/dist/server/tools/structure.d.ts.map +1 -0
- package/dist/server/tools/structure.js +309 -0
- package/dist/server/tools/structure.js.map +1 -0
- package/dist/server/tools/test-map.d.ts +7 -0
- package/dist/server/tools/test-map.d.ts.map +1 -1
- package/dist/server/tools/test-map.js +18 -1
- package/dist/server/tools/test-map.js.map +1 -1
- package/dist/server/tools/trace.d.ts +84 -0
- package/dist/server/tools/trace.d.ts.map +1 -0
- package/dist/server/tools/trace.js +317 -0
- package/dist/server/tools/trace.js.map +1 -0
- package/dist/testing/coverage.d.ts +11 -0
- package/dist/testing/coverage.d.ts.map +1 -1
- package/dist/testing/coverage.js +34 -2
- package/dist/testing/coverage.js.map +1 -1
- package/dist/testing/test-mapper.d.ts +1 -1
- package/dist/testing/test-mapper.d.ts.map +1 -1
- package/dist/testing/test-mapper.js +1 -0
- package/dist/testing/test-mapper.js.map +1 -1
- package/package.json +3 -1
- package/dist/indexer/stages/scip-enrichment.d.ts +0 -43
- package/dist/indexer/stages/scip-enrichment.d.ts.map +0 -1
- package/dist/indexer/stages/scip-enrichment.js +0 -174
- package/dist/indexer/stages/scip-enrichment.js.map +0 -1
- package/dist/indexer/stages/scip-source.d.ts.map +0 -1
- package/dist/indexer/stages/scip-source.js.map +0 -1
- package/dist/server/tools/annotations.d.ts +0 -40
- package/dist/server/tools/annotations.d.ts.map +0 -1
- package/dist/server/tools/annotations.js +0 -35
- package/dist/server/tools/annotations.js.map +0 -1
- package/dist/server/tools/architecture.d.ts +0 -67
- package/dist/server/tools/architecture.d.ts.map +0 -1
- package/dist/server/tools/architecture.js +0 -209
- package/dist/server/tools/architecture.js.map +0 -1
- package/dist/server/tools/coverage.d.ts +0 -67
- package/dist/server/tools/coverage.d.ts.map +0 -1
- package/dist/server/tools/coverage.js +0 -74
- package/dist/server/tools/coverage.js.map +0 -1
- package/dist/server/tools/graph-analysis.d.ts +0 -64
- package/dist/server/tools/graph-analysis.d.ts.map +0 -1
- package/dist/server/tools/graph-analysis.js +0 -82
- package/dist/server/tools/graph-analysis.js.map +0 -1
- package/dist/server/tools/notes.d.ts +0 -165
- package/dist/server/tools/notes.d.ts.map +0 -1
- package/dist/server/tools/notes.js +0 -214
- package/dist/server/tools/notes.js.map +0 -1
- package/dist/server/tools/routes.d.ts +0 -38
- package/dist/server/tools/routes.d.ts.map +0 -1
- package/dist/server/tools/routes.js +0 -38
- package/dist/server/tools/routes.js.map +0 -1
- package/dist/server/tools/writeback.d.ts +0 -49
- package/dist/server/tools/writeback.d.ts.map +0 -1
- package/dist/server/tools/writeback.js +0 -68
- package/dist/server/tools/writeback.js.map +0 -1
|
@@ -0,0 +1,317 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module lore-server/tools/trace
|
|
3
|
+
*
|
|
4
|
+
* MCP tool: trace an execution path from an entry point and return an ordered
|
|
5
|
+
* call sequence with source code inlined — a self-contained reasoning bundle
|
|
6
|
+
* for LLM agents.
|
|
7
|
+
*
|
|
8
|
+
* Entry modes:
|
|
9
|
+
* 1. Symbol ID: `from=symbolId`
|
|
10
|
+
* 2. Symbol name: `from_name="handleCreateUser"`
|
|
11
|
+
* 3. Point-to-point: `from` + `to` (BFS shortest path)
|
|
12
|
+
*/
|
|
13
|
+
import { getSymbolsByName, getCoveragePercentBySymbolIds } from '../../db/read-only.js';
|
|
14
|
+
// ─── Tool definition ──────────────────────────────────────────────────────────
|
|
15
|
+
export const toolDef = {
|
|
16
|
+
name: 'lore_trace',
|
|
17
|
+
description: 'Trace an execution path from an entry point (symbol or symbol name) and ' +
|
|
18
|
+
'return an ordered call sequence with source code for each step. Designed for ' +
|
|
19
|
+
'reasoning about data flow, config propagation, and side effects.',
|
|
20
|
+
inputSchema: {
|
|
21
|
+
type: 'object',
|
|
22
|
+
properties: {
|
|
23
|
+
from: {
|
|
24
|
+
type: 'number',
|
|
25
|
+
description: 'Symbol ID to start the trace from (forward trace).',
|
|
26
|
+
},
|
|
27
|
+
from_name: {
|
|
28
|
+
type: 'string',
|
|
29
|
+
description: 'Symbol name to start the trace from (resolved via lore_lookup). Use when you don\'t have the ID.',
|
|
30
|
+
},
|
|
31
|
+
to: {
|
|
32
|
+
type: 'number',
|
|
33
|
+
description: 'Optional target symbol ID. When provided, returns the shortest call path from `from` to `to` instead of a full forward trace.',
|
|
34
|
+
},
|
|
35
|
+
to_name: {
|
|
36
|
+
type: 'string',
|
|
37
|
+
description: 'Optional target symbol name. Resolved via lore_lookup.',
|
|
38
|
+
},
|
|
39
|
+
depth: {
|
|
40
|
+
type: 'number',
|
|
41
|
+
description: 'Max call depth to trace (default 5, max 10).',
|
|
42
|
+
minimum: 1,
|
|
43
|
+
maximum: 10,
|
|
44
|
+
},
|
|
45
|
+
max_source_lines: {
|
|
46
|
+
type: 'number',
|
|
47
|
+
description: 'Max source lines per step (default 50). Larger functions are truncated with a comment indicating remaining lines.',
|
|
48
|
+
},
|
|
49
|
+
branch: {
|
|
50
|
+
type: 'string',
|
|
51
|
+
description: 'Optional branch name to filter symbols.',
|
|
52
|
+
},
|
|
53
|
+
},
|
|
54
|
+
},
|
|
55
|
+
};
|
|
56
|
+
// ─── Helpers ──────────────────────────────────────────────────────────────────
|
|
57
|
+
/** Resolve a symbol name to a single symbol ID, throwing if ambiguous or missing. */
|
|
58
|
+
function resolveSymbolName(db, name, branch) {
|
|
59
|
+
const rows = getSymbolsByName(db, name, branch);
|
|
60
|
+
if (rows.length === 0) {
|
|
61
|
+
throw new Error(`Symbol not found: "${name}"`);
|
|
62
|
+
}
|
|
63
|
+
if (rows.length > 1) {
|
|
64
|
+
const locations = rows
|
|
65
|
+
.slice(0, 5)
|
|
66
|
+
.map((r) => ` id=${r.id} kind=${r.kind}`)
|
|
67
|
+
.join('\n');
|
|
68
|
+
throw new Error(`Ambiguous symbol name "${name}" (${rows.length} matches). Provide \`from\`/\`to\` with a specific symbol ID instead.\n${locations}`);
|
|
69
|
+
}
|
|
70
|
+
return rows[0].id;
|
|
71
|
+
}
|
|
72
|
+
/** Check whether a table exists in the database. */
|
|
73
|
+
function hasTable(db, name) {
|
|
74
|
+
const row = db
|
|
75
|
+
.prepare("SELECT 1 AS present FROM sqlite_master WHERE type IN ('table', 'virtual table') AND name = ? LIMIT 1")
|
|
76
|
+
.get(name);
|
|
77
|
+
return row?.present === 1;
|
|
78
|
+
}
|
|
79
|
+
/** Fetch full symbol info with source for a batch of symbol IDs. */
|
|
80
|
+
function getSymbolsWithSource(db, symbolIds) {
|
|
81
|
+
if (symbolIds.length === 0)
|
|
82
|
+
return new Map();
|
|
83
|
+
const hasMetrics = hasTable(db, 'symbol_metrics');
|
|
84
|
+
const placeholders = symbolIds.map(() => '?').join(', ');
|
|
85
|
+
const sql = `
|
|
86
|
+
SELECT s.id, s.name, s.kind, f.path AS file_path,
|
|
87
|
+
s.start_line, s.end_line, s.signature, f.source
|
|
88
|
+
${hasMetrics ? ', sm.cyclomatic' : ''}
|
|
89
|
+
FROM symbols s
|
|
90
|
+
JOIN files f ON f.id = s.file_id
|
|
91
|
+
${hasMetrics ? 'LEFT JOIN symbol_metrics sm ON sm.symbol_id = s.id' : ''}
|
|
92
|
+
WHERE s.id IN (${placeholders})`;
|
|
93
|
+
const rows = db.prepare(sql).all(...symbolIds);
|
|
94
|
+
const map = new Map();
|
|
95
|
+
for (const row of rows) {
|
|
96
|
+
map.set(row.id, {
|
|
97
|
+
...row,
|
|
98
|
+
cyclomatic: hasMetrics ? row.cyclomatic : null,
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
return map;
|
|
102
|
+
}
|
|
103
|
+
/** Get outbound call edges for a symbol. */
|
|
104
|
+
function getCallees(db, callerId) {
|
|
105
|
+
return db
|
|
106
|
+
.prepare(`SELECT callee_id, callee_name, call_line, resolution_method
|
|
107
|
+
FROM symbol_refs
|
|
108
|
+
WHERE caller_id = ? AND callee_id IS NOT NULL
|
|
109
|
+
ORDER BY call_line ASC`)
|
|
110
|
+
.all(callerId);
|
|
111
|
+
}
|
|
112
|
+
/** Extract source lines for a symbol, applying truncation. */
|
|
113
|
+
function extractSource(sym, maxLines) {
|
|
114
|
+
const allLines = sym.source.split('\n');
|
|
115
|
+
const start = Math.max(0, sym.start_line - 1);
|
|
116
|
+
const end = Math.min(allLines.length, sym.end_line);
|
|
117
|
+
const lines = allLines.slice(start, end);
|
|
118
|
+
if (lines.length <= maxLines) {
|
|
119
|
+
return lines.join('\n');
|
|
120
|
+
}
|
|
121
|
+
const truncated = lines.slice(0, maxLines);
|
|
122
|
+
const remaining = lines.length - maxLines;
|
|
123
|
+
truncated.push(`// ... (${remaining} more lines)`);
|
|
124
|
+
return truncated.join('\n');
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Build a TraceStep from a symbol, with optional caller context.
|
|
128
|
+
*/
|
|
129
|
+
function buildStep(sym, depthLevel, maxLines, callLine, resolutionMethod, coveragePercent) {
|
|
130
|
+
const step = {
|
|
131
|
+
depth: depthLevel,
|
|
132
|
+
symbol_id: sym.id,
|
|
133
|
+
name: sym.name,
|
|
134
|
+
kind: sym.kind,
|
|
135
|
+
file_path: sym.file_path,
|
|
136
|
+
start_line: sym.start_line,
|
|
137
|
+
end_line: sym.end_line,
|
|
138
|
+
source: extractSource(sym, maxLines),
|
|
139
|
+
};
|
|
140
|
+
if (sym.signature)
|
|
141
|
+
step.signature = sym.signature;
|
|
142
|
+
if (callLine !== undefined)
|
|
143
|
+
step.call_line = callLine;
|
|
144
|
+
if (resolutionMethod !== undefined)
|
|
145
|
+
step.resolution_method = resolutionMethod;
|
|
146
|
+
if (sym.cyclomatic !== null && sym.cyclomatic !== undefined)
|
|
147
|
+
step.cyclomatic = sym.cyclomatic;
|
|
148
|
+
if (coveragePercent !== undefined && coveragePercent !== null)
|
|
149
|
+
step.coverage_percent = coveragePercent;
|
|
150
|
+
return step;
|
|
151
|
+
}
|
|
152
|
+
// ─── DFS forward trace ───────────────────────────────────────────────────────
|
|
153
|
+
function forwardTrace(db, entryId, maxDepth, maxLines, branch) {
|
|
154
|
+
const steps = [];
|
|
155
|
+
const visited = new Set();
|
|
156
|
+
let truncated = false;
|
|
157
|
+
// First pass: plan the traversal to discover all needed symbol IDs.
|
|
158
|
+
const planned = [];
|
|
159
|
+
const planStack = [{ symbolId: entryId, depthLevel: 0 }];
|
|
160
|
+
const planVisited = new Set();
|
|
161
|
+
while (planStack.length > 0) {
|
|
162
|
+
const frame = planStack.pop();
|
|
163
|
+
if (planVisited.has(frame.symbolId))
|
|
164
|
+
continue;
|
|
165
|
+
planVisited.add(frame.symbolId);
|
|
166
|
+
planned.push(frame);
|
|
167
|
+
if (frame.depthLevel < maxDepth) {
|
|
168
|
+
const edges = getCallees(db, frame.symbolId);
|
|
169
|
+
// Push in reverse order so first callee is processed first (stack is LIFO)
|
|
170
|
+
for (let i = edges.length - 1; i >= 0; i--) {
|
|
171
|
+
const edge = edges[i];
|
|
172
|
+
if (!planVisited.has(edge.callee_id)) {
|
|
173
|
+
planStack.push({
|
|
174
|
+
symbolId: edge.callee_id,
|
|
175
|
+
depthLevel: frame.depthLevel + 1,
|
|
176
|
+
callLine: edge.call_line + 1, // 0-indexed → 1-indexed
|
|
177
|
+
resolutionMethod: edge.resolution_method,
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
else if (frame.depthLevel === maxDepth) {
|
|
183
|
+
// Check if there are further edges we're cutting off
|
|
184
|
+
const edges = getCallees(db, frame.symbolId);
|
|
185
|
+
if (edges.length > 0)
|
|
186
|
+
truncated = true;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
// Batch-fetch all symbols with source
|
|
190
|
+
const allIds = planned.map((f) => f.symbolId);
|
|
191
|
+
const symbolMap = getSymbolsWithSource(db, allIds);
|
|
192
|
+
const coverageMap = getCoveragePercentBySymbolIds(db, allIds, branch);
|
|
193
|
+
// Second pass: replay the planned traversal in order, building steps.
|
|
194
|
+
// Re-run the DFS to ensure correct pre-order.
|
|
195
|
+
const dfsStack = [{ symbolId: entryId, depthLevel: 0 }];
|
|
196
|
+
while (dfsStack.length > 0) {
|
|
197
|
+
const frame = dfsStack.pop();
|
|
198
|
+
if (visited.has(frame.symbolId))
|
|
199
|
+
continue;
|
|
200
|
+
visited.add(frame.symbolId);
|
|
201
|
+
const sym = symbolMap.get(frame.symbolId);
|
|
202
|
+
if (!sym)
|
|
203
|
+
continue;
|
|
204
|
+
const coverage = coverageMap.get(frame.symbolId) ?? null;
|
|
205
|
+
steps.push(buildStep(sym, frame.depthLevel, maxLines, frame.callLine, frame.resolutionMethod, coverage));
|
|
206
|
+
if (frame.depthLevel < maxDepth) {
|
|
207
|
+
const edges = getCallees(db, frame.symbolId);
|
|
208
|
+
for (let i = edges.length - 1; i >= 0; i--) {
|
|
209
|
+
const edge = edges[i];
|
|
210
|
+
if (!visited.has(edge.callee_id)) {
|
|
211
|
+
dfsStack.push({
|
|
212
|
+
symbolId: edge.callee_id,
|
|
213
|
+
depthLevel: frame.depthLevel + 1,
|
|
214
|
+
callLine: edge.call_line + 1,
|
|
215
|
+
resolutionMethod: edge.resolution_method,
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
return { steps, truncated, visitedIds: visited };
|
|
222
|
+
}
|
|
223
|
+
// ─── BFS point-to-point ──────────────────────────────────────────────────────
|
|
224
|
+
function pointToPointTrace(db, fromId, toId, maxDepth, maxLines, branch) {
|
|
225
|
+
// BFS to find shortest path from → to
|
|
226
|
+
const parentMap = new Map();
|
|
227
|
+
const visited = new Set();
|
|
228
|
+
const queue = [{ id: fromId, depth: 0 }];
|
|
229
|
+
visited.add(fromId);
|
|
230
|
+
let found = false;
|
|
231
|
+
while (queue.length > 0) {
|
|
232
|
+
const { id, depth } = queue.shift();
|
|
233
|
+
if (id === toId) {
|
|
234
|
+
found = true;
|
|
235
|
+
break;
|
|
236
|
+
}
|
|
237
|
+
if (depth >= maxDepth)
|
|
238
|
+
continue;
|
|
239
|
+
const edges = getCallees(db, id);
|
|
240
|
+
for (const edge of edges) {
|
|
241
|
+
if (!visited.has(edge.callee_id)) {
|
|
242
|
+
visited.add(edge.callee_id);
|
|
243
|
+
parentMap.set(edge.callee_id, {
|
|
244
|
+
parentId: id,
|
|
245
|
+
callLine: edge.call_line + 1,
|
|
246
|
+
resolutionMethod: edge.resolution_method,
|
|
247
|
+
});
|
|
248
|
+
queue.push({ id: edge.callee_id, depth: depth + 1 });
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
if (!found) {
|
|
253
|
+
throw new Error(`No call path found from symbol ${fromId} to symbol ${toId} within depth ${maxDepth}.`);
|
|
254
|
+
}
|
|
255
|
+
// Reconstruct path from `to` back to `from`
|
|
256
|
+
const path = [];
|
|
257
|
+
let current = toId;
|
|
258
|
+
while (current !== fromId) {
|
|
259
|
+
const parent = parentMap.get(current);
|
|
260
|
+
path.push({ id: current, callLine: parent.callLine, resolutionMethod: parent.resolutionMethod });
|
|
261
|
+
current = parent.parentId;
|
|
262
|
+
}
|
|
263
|
+
path.push({ id: fromId });
|
|
264
|
+
path.reverse();
|
|
265
|
+
// Batch-fetch symbols and coverage
|
|
266
|
+
const pathIds = path.map((p) => p.id);
|
|
267
|
+
const symbolMap = getSymbolsWithSource(db, pathIds);
|
|
268
|
+
const coverageMap = getCoveragePercentBySymbolIds(db, pathIds, branch);
|
|
269
|
+
const steps = [];
|
|
270
|
+
for (let i = 0; i < path.length; i++) {
|
|
271
|
+
const node = path[i];
|
|
272
|
+
const sym = symbolMap.get(node.id);
|
|
273
|
+
if (!sym)
|
|
274
|
+
continue;
|
|
275
|
+
const coverage = coverageMap.get(node.id) ?? null;
|
|
276
|
+
steps.push(buildStep(sym, i, maxLines, node.callLine, node.resolutionMethod, coverage));
|
|
277
|
+
}
|
|
278
|
+
return { steps, truncated: false, visitedIds: new Set(pathIds) };
|
|
279
|
+
}
|
|
280
|
+
// ─── Handler ──────────────────────────────────────────────────────────────────
|
|
281
|
+
export function handler(db, args) {
|
|
282
|
+
const maxDepth = Math.max(1, Math.min(args.depth ?? 5, 10));
|
|
283
|
+
const maxLines = args.max_source_lines ?? 50;
|
|
284
|
+
// Resolve entry point
|
|
285
|
+
let fromId = args.from;
|
|
286
|
+
if (fromId === undefined && args.from_name !== undefined) {
|
|
287
|
+
fromId = resolveSymbolName(db, args.from_name, args.branch);
|
|
288
|
+
}
|
|
289
|
+
if (fromId === undefined) {
|
|
290
|
+
throw new Error('Provide `from` (symbol ID) or `from_name` (symbol name) to start the trace.');
|
|
291
|
+
}
|
|
292
|
+
// Resolve optional target
|
|
293
|
+
let toId = args.to;
|
|
294
|
+
if (toId === undefined && args.to_name !== undefined) {
|
|
295
|
+
toId = resolveSymbolName(db, args.to_name, args.branch);
|
|
296
|
+
}
|
|
297
|
+
// Fetch entry symbol name for the result description
|
|
298
|
+
const entrySymbols = getSymbolsWithSource(db, [fromId]);
|
|
299
|
+
const entrySym = entrySymbols.get(fromId);
|
|
300
|
+
if (!entrySym) {
|
|
301
|
+
throw new Error(`Entry symbol not found: id=${fromId}`);
|
|
302
|
+
}
|
|
303
|
+
const entryDesc = toId !== undefined
|
|
304
|
+
? `${entrySym.name} → symbol ${toId}`
|
|
305
|
+
: entrySym.name;
|
|
306
|
+
// Dispatch to the appropriate trace strategy
|
|
307
|
+
const { steps, truncated, visitedIds } = toId !== undefined
|
|
308
|
+
? pointToPointTrace(db, fromId, toId, maxDepth, maxLines, args.branch)
|
|
309
|
+
: forwardTrace(db, fromId, maxDepth, maxLines, args.branch);
|
|
310
|
+
return {
|
|
311
|
+
entry: entryDesc,
|
|
312
|
+
steps,
|
|
313
|
+
truncated,
|
|
314
|
+
total_nodes: visitedIds.size,
|
|
315
|
+
};
|
|
316
|
+
}
|
|
317
|
+
//# sourceMappingURL=trace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trace.js","sourceRoot":"","sources":["../../../src/server/tools/trace.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,5 +9,16 @@ interface IngestCoverageReportOptions {
|
|
|
9
9
|
sourceMtime?: number;
|
|
10
10
|
}
|
|
11
11
|
export declare function ingestCoverageReport(options: IngestCoverageReportOptions): number;
|
|
12
|
+
export declare function parseLcov(source: string, rootDir: string): Map<string, Map<number, number>>;
|
|
13
|
+
export declare function parseCobertura(source: string, rootDir: string): Map<string, Map<number, number>>;
|
|
14
|
+
interface IngestPerTestCoverageOptions {
|
|
15
|
+
db: Database.Database;
|
|
16
|
+
reportsDir: string;
|
|
17
|
+
rootDir?: string;
|
|
18
|
+
commitSha: string;
|
|
19
|
+
format: CoverageFormat;
|
|
20
|
+
separator?: string;
|
|
21
|
+
}
|
|
22
|
+
export declare function ingestPerTestCoverage(options: IngestPerTestCoverageOptions): number;
|
|
12
23
|
export {};
|
|
13
24
|
//# sourceMappingURL=coverage.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"coverage.d.ts","sourceRoot":"","sources":["../../src/testing/coverage.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAEhD,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,WAAW,CAAC;AAElD,UAAU,2BAA2B;IACnC,EAAE,EAAE,QAAQ,CAAC,QAAQ,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,cAAc,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,2BAA2B,GAAG,MAAM,CA2CjF"}
|
|
1
|
+
{"version":3,"file":"coverage.d.ts","sourceRoot":"","sources":["../../src/testing/coverage.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAEhD,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,WAAW,CAAC;AAElD,UAAU,2BAA2B;IACnC,EAAE,EAAE,QAAQ,CAAC,QAAQ,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,cAAc,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,2BAA2B,GAAG,MAAM,CA2CjF;AAED,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAuB3F;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CA2BhG;AAOD,UAAU,4BAA4B;IACpC,EAAE,EAAE,QAAQ,CAAC,QAAQ,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,cAAc,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,4BAA4B,GAAG,MAAM,CA6CnF"}
|
package/dist/testing/coverage.js
CHANGED
|
@@ -27,7 +27,7 @@ export function ingestCoverageReport(options) {
|
|
|
27
27
|
});
|
|
28
28
|
return tx();
|
|
29
29
|
}
|
|
30
|
-
function parseLcov(source, rootDir) {
|
|
30
|
+
export function parseLcov(source, rootDir) {
|
|
31
31
|
const result = new Map();
|
|
32
32
|
let currentFilePath;
|
|
33
33
|
for (const rawLine of source.split(/\r?\n/)) {
|
|
@@ -52,7 +52,7 @@ function parseLcov(source, rootDir) {
|
|
|
52
52
|
}
|
|
53
53
|
return result;
|
|
54
54
|
}
|
|
55
|
-
function parseCobertura(source, rootDir) {
|
|
55
|
+
export function parseCobertura(source, rootDir) {
|
|
56
56
|
const result = new Map();
|
|
57
57
|
// Use a greedy match up to matched </class> while handling nested <class> elements.
|
|
58
58
|
// We match <class ...>...</class> by consuming content that does not start a new <class tag.
|
|
@@ -83,4 +83,36 @@ function normalizeCoveragePath(rawPath, rootDir) {
|
|
|
83
83
|
return path.normalize(rawPath);
|
|
84
84
|
return path.resolve(rootDir, rawPath);
|
|
85
85
|
}
|
|
86
|
+
export function ingestPerTestCoverage(options) {
|
|
87
|
+
const { db, reportsDir, rootDir = process.cwd(), commitSha, format, separator = '__' } = options;
|
|
88
|
+
const files = fs.readdirSync(reportsDir).filter((name) => {
|
|
89
|
+
const fullPath = path.join(reportsDir, name);
|
|
90
|
+
return fs.statSync(fullPath).isFile();
|
|
91
|
+
});
|
|
92
|
+
const insertRun = db.prepare(`INSERT INTO test_coverage_runs (commit_sha, test_file, test_name, source_path, format)
|
|
93
|
+
VALUES (?, ?, ?, ?, ?)`);
|
|
94
|
+
const insertLine = db.prepare(`INSERT INTO test_coverage_lines (run_id, file_path, line_number, hit_count)
|
|
95
|
+
VALUES (?, ?, ?, ?)`);
|
|
96
|
+
const tx = db.transaction(() => {
|
|
97
|
+
let count = 0;
|
|
98
|
+
for (const fileName of files) {
|
|
99
|
+
const filePath = path.join(reportsDir, fileName);
|
|
100
|
+
const source = fs.readFileSync(filePath, 'utf8');
|
|
101
|
+
const testFile = fileName.replace(new RegExp(separator.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'), 'g'), '/');
|
|
102
|
+
const lineHitsByFile = format === 'lcov' ? parseLcov(source, rootDir) : parseCobertura(source, rootDir);
|
|
103
|
+
const runInfo = insertRun.run(commitSha, testFile, null, filePath, format);
|
|
104
|
+
const runId = Number(runInfo.lastInsertRowid);
|
|
105
|
+
for (const [coveredFilePath, lineHits] of lineHitsByFile.entries()) {
|
|
106
|
+
for (const [lineNumber, hitCount] of lineHits.entries()) {
|
|
107
|
+
if (hitCount > 0) {
|
|
108
|
+
insertLine.run(runId, coveredFilePath, lineNumber, hitCount);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
count += 1;
|
|
113
|
+
}
|
|
114
|
+
return count;
|
|
115
|
+
});
|
|
116
|
+
return tx();
|
|
117
|
+
}
|
|
86
118
|
//# sourceMappingURL=coverage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"coverage.js","sourceRoot":"","sources":["../../src/testing/coverage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAclC,MAAM,UAAU,oBAAoB,CAAC,OAAoC;IACvE,MAAM,MAAM,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IAC3D,MAAM,cAAc,GAClB,OAAO,CAAC,MAAM,KAAK,MAAM;QACvB,CAAC,CAAC,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC;QACpC,CAAC,CAAC,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IAE9C,MAAM,SAAS,GAAG,OAAO,CAAC,EAAE,CAAC,OAAO,CAClC;yBACqB,CACtB,CAAC;IACF,MAAM,UAAU,GAAG,OAAO,CAAC,EAAE,CAAC,OAAO,CACnC;yBACqB,CACtB,CAAC;IACF,MAAM,UAAU,GAAG,OAAO,CAAC,EAAE,CAAC,OAAO,CACnC;yBACqB,CACtB,CAAC;IAEF,MAAM,EAAE,GAAG,OAAO,CAAC,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE;QACrC,MAAM,OAAO,GAAG,SAAS,CAAC,GAAG,CAC3B,OAAO,CAAC,SAAS,EACjB,OAAO,CAAC,UAAU,EAClB,OAAO,CAAC,MAAM,EACd,OAAO,CAAC,WAAW,IAAI,IAAI,CACY,CAAC;QAC1C,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;QAE9C,KAAK,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,IAAI,cAAc,CAAC,OAAO,EAAE,EAAE,CAAC;YAC5D,MAAM,WAAW,GAAG,CAAC,GAAG,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;YAC5C,MAAM,UAAU,GAAG,WAAW,CAAC,MAAM,CAAC;YACtC,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC;YAC3E,UAAU,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;YACtD,KAAK,MAAM,CAAC,UAAU,EAAE,QAAQ,CAAC,IAAI,WAAW,EAAE,CAAC;gBACjD,UAAU,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;YACxD,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC,CAAC,CAAC;IAEH,OAAO,EAAE,EAAE,CAAC;AACd,CAAC;AAED,
|
|
1
|
+
{"version":3,"file":"coverage.js","sourceRoot":"","sources":["../../src/testing/coverage.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { Database } from '../db/schema.js';
|
|
2
|
-
export type TestMappingConfidence = 'import' | 'coverage' | 'heuristic';
|
|
2
|
+
export type TestMappingConfidence = 'import' | 'coverage' | 'heuristic' | 'per_test_coverage';
|
|
3
3
|
export declare const TEST_MAPPING_CONFIDENCES: readonly TestMappingConfidence[];
|
|
4
4
|
export declare function isTestFilePath(filePath: string): boolean;
|
|
5
5
|
export declare function refreshTestMappings(db: Database.Database, branch: string): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test-mapper.d.ts","sourceRoot":"","sources":["../../src/testing/test-mapper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAEhD,MAAM,MAAM,qBAAqB,GAAG,QAAQ,GAAG,UAAU,GAAG,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"test-mapper.d.ts","sourceRoot":"","sources":["../../src/testing/test-mapper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAEhD,MAAM,MAAM,qBAAqB,GAAG,QAAQ,GAAG,UAAU,GAAG,WAAW,GAAG,mBAAmB,CAAC;AAE9F,eAAO,MAAM,wBAAwB,EAAE,SAAS,qBAAqB,EAKpE,CAAC;AAIF,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAiBxD;AAED,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAmC/E"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test-mapper.js","sourceRoot":"","sources":["../../src/testing/test-mapper.ts"],"names":[],"mappings":"AAIA,MAAM,CAAC,MAAM,wBAAwB,GAAqC;IACxE,QAAQ;IACR,UAAU;IACV,WAAW;
|
|
1
|
+
{"version":3,"file":"test-mapper.js","sourceRoot":"","sources":["../../src/testing/test-mapper.ts"],"names":[],"mappings":"AAIA,MAAM,CAAC,MAAM,wBAAwB,GAAqC;IACxE,QAAQ;IACR,UAAU;IACV,WAAW;IACX,mBAAmB;CACpB,CAAC;AAEF,MAAM,uBAAuB,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC;AAExE,MAAM,UAAU,cAAc,CAAC,QAAgB;IAC7C,MAAM,cAAc,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACpD,MAAM,mBAAmB,GAAG,cAAc,CAAC,WAAW,EAAE,CAAC;IACzD,MAAM,QAAQ,GAAG,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;IACvD,MAAM,aAAa,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;IAC7C,MAAM,YAAY,GAAG,mBAAmB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAEpD,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,uBAAuB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;QACzE,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,aAAa,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,aAAa,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzE,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,aAAa,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACtC,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,aAAa,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,EAAqB,EAAE,MAAc;IACvE,MAAM,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE;QAC7B,EAAE,CAAC,OAAO,CACR;;uEAEiE,CAClE,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAEtB,MAAM,IAAI,GAAG,EAAE;aACZ,OAAO,CACN;;;;;;0CAMkC,CACnC;aACA,GAAG,CAAC,MAAM,EAAE,MAAM,CAInB,CAAC;QAEH,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CACvB;+BACyB,CAC1B,CAAC;QACF,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,cAAc,CAAC;gBAAE,SAAS;YAClD,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,YAAY,EAAE,GAAG,CAAC,cAAc,CAAC,CAAC;QACnD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,EAAE,CAAC;AACP,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jafreck/lore",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.8",
|
|
4
4
|
"description": "Language-aware codebase indexer — tree-sitter parsing, symbol extraction, call-graph construction, and optional embeddings for semantic search",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -63,6 +63,8 @@
|
|
|
63
63
|
"@elm-tooling/tree-sitter-elm": "^5.9.0",
|
|
64
64
|
"@huggingface/transformers": "^3.8.1",
|
|
65
65
|
"@modelcontextprotocol/sdk": "^1.27.1",
|
|
66
|
+
"@sourcegraph/scip-python": "^0.6.6",
|
|
67
|
+
"@sourcegraph/scip-typescript": "^0.4.0",
|
|
66
68
|
"@tree-sitter-grammars/tree-sitter-lua": "^0.4.1",
|
|
67
69
|
"@tree-sitter-grammars/tree-sitter-zig": "^1.1.2",
|
|
68
70
|
"better-sqlite3": "^12.6.2",
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @module indexer/stages/scip-enrichment
|
|
3
|
-
*
|
|
4
|
-
* Pipeline stage: enrich symbols, symbol_refs, type_refs, and
|
|
5
|
-
* symbol_relationships with SCIP-derived metadata.
|
|
6
|
-
*
|
|
7
|
-
* SCIP enrichment writes to the **same database columns** as LSP
|
|
8
|
-
* enrichment (`definition_path`, `definition_line`, `resolved_type_signature`,
|
|
9
|
-
* etc.) so the downstream resolution stage is agnostic to the data source.
|
|
10
|
-
*
|
|
11
|
-
* ## Pipeline ordering
|
|
12
|
-
*
|
|
13
|
-
* ```
|
|
14
|
-
* ... → DependencyApiStage → ScipEnrichmentStage → LspEnrichmentStage → ResolutionStage → ...
|
|
15
|
-
* ```
|
|
16
|
-
*
|
|
17
|
-
* SCIP runs **before** LSP. The LSP stage then skips any languages that
|
|
18
|
-
* SCIP already enriched (communicated via `context.scipCoveredLanguages`).
|
|
19
|
-
*
|
|
20
|
-
* ## Data written
|
|
21
|
-
*
|
|
22
|
-
* Identical columns to LSP enrichment — see `lsp-enrichment.ts` for the
|
|
23
|
-
* full list.
|
|
24
|
-
*/
|
|
25
|
-
import type { PipelineContext, PipelineStage } from '../pipeline.js';
|
|
26
|
-
import type { Database } from '../../db/schema.js';
|
|
27
|
-
import { ScipEnrichmentCoordinator } from '../../scip/enrichment.js';
|
|
28
|
-
/**
|
|
29
|
-
* Enriches indexed artefacts with SCIP-derived metadata.
|
|
30
|
-
*
|
|
31
|
-
* Manages the lifecycle of a `ScipEnrichmentCoordinator` per pipeline run.
|
|
32
|
-
*/
|
|
33
|
-
export declare class ScipEnrichmentStage implements PipelineStage {
|
|
34
|
-
readonly name = "scip-enrichment";
|
|
35
|
-
private coordinator;
|
|
36
|
-
execute(context: PipelineContext, _mode: 'build' | 'update'): Promise<void>;
|
|
37
|
-
dispose(): Promise<void>;
|
|
38
|
-
}
|
|
39
|
-
export declare function enrichProjectRefsWithScip(db: Database.Database, branch: string, files: Array<{
|
|
40
|
-
path: string;
|
|
41
|
-
language: string;
|
|
42
|
-
}>, coordinator: ScipEnrichmentCoordinator): Promise<void>;
|
|
43
|
-
//# sourceMappingURL=scip-enrichment.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"scip-enrichment.d.ts","sourceRoot":"","sources":["../../../src/indexer/stages/scip-enrichment.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACrE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AAGrE;;;;GAIG;AACH,qBAAa,mBAAoB,YAAW,aAAa;IACvD,QAAQ,CAAC,IAAI,qBAAqB;IAElC,OAAO,CAAC,WAAW,CAA0C;IAEvD,OAAO,CAAC,OAAO,EAAE,eAAe,EAAE,KAAK,EAAE,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAiB3E,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAM/B;AAID,wBAAsB,yBAAyB,CAC7C,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,EAChD,WAAW,EAAE,yBAAyB,GACrC,OAAO,CAAC,IAAI,CAAC,CAoMf"}
|