mcp-codebase-intelligence 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +166 -0
- package/dist/graph/code-graph.d.ts +119 -0
- package/dist/graph/code-graph.js +279 -0
- package/dist/graph/code-graph.js.map +1 -0
- package/dist/graph/schema.d.ts +2 -0
- package/dist/graph/schema.js +62 -0
- package/dist/graph/schema.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.js +171 -0
- package/dist/index.js.map +1 -0
- package/dist/indexer/file-watcher.d.ts +13 -0
- package/dist/indexer/file-watcher.js +106 -0
- package/dist/indexer/file-watcher.js.map +1 -0
- package/dist/indexer/lang-go.d.ts +2 -0
- package/dist/indexer/lang-go.js +246 -0
- package/dist/indexer/lang-go.js.map +1 -0
- package/dist/indexer/lang-java.d.ts +2 -0
- package/dist/indexer/lang-java.js +307 -0
- package/dist/indexer/lang-java.js.map +1 -0
- package/dist/indexer/lang-python.d.ts +2 -0
- package/dist/indexer/lang-python.js +232 -0
- package/dist/indexer/lang-python.js.map +1 -0
- package/dist/indexer/lang-rust.d.ts +2 -0
- package/dist/indexer/lang-rust.js +323 -0
- package/dist/indexer/lang-rust.js.map +1 -0
- package/dist/indexer/language-plugin.d.ts +22 -0
- package/dist/indexer/language-plugin.js +22 -0
- package/dist/indexer/language-plugin.js.map +1 -0
- package/dist/indexer/tree-sitter-indexer.d.ts +12 -0
- package/dist/indexer/tree-sitter-indexer.js +618 -0
- package/dist/indexer/tree-sitter-indexer.js.map +1 -0
- package/dist/lsp/lsp-client.d.ts +45 -0
- package/dist/lsp/lsp-client.js +315 -0
- package/dist/lsp/lsp-client.js.map +1 -0
- package/dist/lsp/lsp-manager.d.ts +13 -0
- package/dist/lsp/lsp-manager.js +96 -0
- package/dist/lsp/lsp-manager.js.map +1 -0
- package/dist/tools/analyze-impact.d.ts +38 -0
- package/dist/tools/analyze-impact.js +126 -0
- package/dist/tools/analyze-impact.js.map +1 -0
- package/dist/tools/architecture-diagram.d.ts +33 -0
- package/dist/tools/architecture-diagram.js +216 -0
- package/dist/tools/architecture-diagram.js.map +1 -0
- package/dist/tools/find-implementations.d.ts +33 -0
- package/dist/tools/find-implementations.js +68 -0
- package/dist/tools/find-implementations.js.map +1 -0
- package/dist/tools/find-symbol.d.ts +39 -0
- package/dist/tools/find-symbol.js +52 -0
- package/dist/tools/find-symbol.js.map +1 -0
- package/dist/tools/get-call-graph.d.ts +40 -0
- package/dist/tools/get-call-graph.js +174 -0
- package/dist/tools/get-call-graph.js.map +1 -0
- package/dist/tools/get-dependencies.d.ts +28 -0
- package/dist/tools/get-dependencies.js +68 -0
- package/dist/tools/get-dependencies.js.map +1 -0
- package/dist/tools/get-exports.d.ts +23 -0
- package/dist/tools/get-exports.js +40 -0
- package/dist/tools/get-exports.js.map +1 -0
- package/dist/tools/get-references.d.ts +28 -0
- package/dist/tools/get-references.js +53 -0
- package/dist/tools/get-references.js.map +1 -0
- package/dist/tools/get-stats.d.ts +15 -0
- package/dist/tools/get-stats.js +23 -0
- package/dist/tools/get-stats.js.map +1 -0
- package/dist/tools/get-type-info.d.ts +33 -0
- package/dist/tools/get-type-info.js +69 -0
- package/dist/tools/get-type-info.js.map +1 -0
- package/dist/tools/goto-definition.d.ts +33 -0
- package/dist/tools/goto-definition.js +77 -0
- package/dist/tools/goto-definition.js.map +1 -0
- package/dist/tools/natural-language-query.d.ts +23 -0
- package/dist/tools/natural-language-query.js +426 -0
- package/dist/tools/natural-language-query.js.map +1 -0
- package/dist/tools/reindex.d.ts +15 -0
- package/dist/tools/reindex.js +20 -0
- package/dist/tools/reindex.js.map +1 -0
- package/dist/tools/semantic-diff.d.ts +32 -0
- package/dist/tools/semantic-diff.js +407 -0
- package/dist/tools/semantic-diff.js.map +1 -0
- package/dist/utils/logger.d.ts +6 -0
- package/dist/utils/logger.js +15 -0
- package/dist/utils/logger.js.map +1 -0
- package/package.json +68 -0
|
@@ -0,0 +1,407 @@
|
|
|
1
|
+
import { execSync } from "child_process";
|
|
2
|
+
export const semanticDiffTool = {
|
|
3
|
+
name: "semantic_diff",
|
|
4
|
+
description: "Analyze the semantic impact of a git diff or code change. Identifies which symbols were modified/added/removed, finds all downstream dependents, and produces a structured impact report. Preferred: use `git_ref` (e.g. 'HEAD~1', 'HEAD~5', 'main', 'staged') to let the tool run git diff directly — avoids truncation of large diffs. Alternatively pass raw diff text via `diff`.",
|
|
5
|
+
inputSchema: {
|
|
6
|
+
type: "object",
|
|
7
|
+
properties: {
|
|
8
|
+
git_ref: {
|
|
9
|
+
type: "string",
|
|
10
|
+
description: "Git ref to diff against (e.g. 'HEAD~1', 'HEAD~5', 'main', 'staged', 'unstaged'). The tool runs git diff internally — use this instead of passing diff text to avoid truncation.",
|
|
11
|
+
},
|
|
12
|
+
diff: {
|
|
13
|
+
type: "string",
|
|
14
|
+
description: "Raw unified diff text. Only use if git_ref is not applicable (e.g. for non-git diffs).",
|
|
15
|
+
},
|
|
16
|
+
depth: {
|
|
17
|
+
type: "number",
|
|
18
|
+
description: "How many levels of transitive dependents to follow (default: 2, max: 5)",
|
|
19
|
+
},
|
|
20
|
+
},
|
|
21
|
+
},
|
|
22
|
+
};
|
|
23
|
+
export function handleSemanticDiff(graph, args, projectRoot) {
|
|
24
|
+
const depth = Math.min(Math.max(args.depth ?? 2, 1), 5);
|
|
25
|
+
let diffText = args.diff ?? "";
|
|
26
|
+
// If git_ref is provided, run git diff directly to avoid AI truncation
|
|
27
|
+
if (args.git_ref && projectRoot) {
|
|
28
|
+
try {
|
|
29
|
+
const ref = args.git_ref.trim();
|
|
30
|
+
let cmd;
|
|
31
|
+
if (ref === "staged") {
|
|
32
|
+
cmd = "git diff --staged";
|
|
33
|
+
}
|
|
34
|
+
else if (ref === "unstaged") {
|
|
35
|
+
cmd = "git diff";
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
// Sanitize: only allow safe git ref characters
|
|
39
|
+
const safeRef = ref.replace(/[^a-zA-Z0-9_.~\-/^]/g, "");
|
|
40
|
+
cmd = `git diff ${safeRef}`;
|
|
41
|
+
}
|
|
42
|
+
diffText = execSync(cmd, {
|
|
43
|
+
cwd: projectRoot,
|
|
44
|
+
maxBuffer: 10 * 1024 * 1024, // 10MB
|
|
45
|
+
encoding: "utf-8",
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
catch (err) {
|
|
49
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
50
|
+
return {
|
|
51
|
+
content: [
|
|
52
|
+
{
|
|
53
|
+
type: "text",
|
|
54
|
+
text: `Failed to run git diff: ${message}`,
|
|
55
|
+
},
|
|
56
|
+
],
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
if (!diffText) {
|
|
61
|
+
return {
|
|
62
|
+
content: [
|
|
63
|
+
{
|
|
64
|
+
type: "text",
|
|
65
|
+
text: "No diff provided. Use `git_ref` (e.g. 'HEAD~1', 'staged') or pass raw diff text via `diff`.",
|
|
66
|
+
},
|
|
67
|
+
],
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
const hunks = parseDiff(diffText);
|
|
71
|
+
if (hunks.length === 0) {
|
|
72
|
+
return {
|
|
73
|
+
content: [
|
|
74
|
+
{
|
|
75
|
+
type: "text",
|
|
76
|
+
text: "No file changes detected in the provided diff.",
|
|
77
|
+
},
|
|
78
|
+
],
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
// Collect all affected symbols across all changed files
|
|
82
|
+
const allImpacts = [];
|
|
83
|
+
const filesSummary = [];
|
|
84
|
+
for (const hunk of hunks) {
|
|
85
|
+
const filePath = hunk.newFile !== "/dev/null" ? hunk.newFile : hunk.oldFile;
|
|
86
|
+
const linesChanged = hunk.addedLines.length + hunk.removedLines.length;
|
|
87
|
+
// Find symbols affected by this hunk
|
|
88
|
+
const affected = findAffectedSymbols(graph, hunk);
|
|
89
|
+
filesSummary.push({
|
|
90
|
+
file: filePath,
|
|
91
|
+
status: hunk.status,
|
|
92
|
+
symbolsAffected: affected.length,
|
|
93
|
+
linesChanged,
|
|
94
|
+
});
|
|
95
|
+
// For each affected symbol, find dependents
|
|
96
|
+
for (const sym of affected) {
|
|
97
|
+
const refs = graph.getReferences(sym.name, depth);
|
|
98
|
+
// Exclude self-references (same file, same symbol)
|
|
99
|
+
const externalRefs = refs.filter((r) => r.fromFile !== sym.filePath || r.fromSymbol !== sym.name);
|
|
100
|
+
const dependentFiles = [
|
|
101
|
+
...new Set(externalRefs.map((r) => r.fromFile)),
|
|
102
|
+
];
|
|
103
|
+
allImpacts.push({
|
|
104
|
+
symbol: sym,
|
|
105
|
+
directDependents: externalRefs.filter((r) => r.depth === 1).length,
|
|
106
|
+
totalDependents: externalRefs.length,
|
|
107
|
+
dependentFiles,
|
|
108
|
+
references: externalRefs.map((r) => ({
|
|
109
|
+
fromSymbol: r.fromSymbol,
|
|
110
|
+
fromFile: r.fromFile,
|
|
111
|
+
fromLine: r.fromLine,
|
|
112
|
+
refKind: r.refKind,
|
|
113
|
+
depth: r.depth,
|
|
114
|
+
})),
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
// Build the report
|
|
119
|
+
return {
|
|
120
|
+
content: [
|
|
121
|
+
{
|
|
122
|
+
type: "text",
|
|
123
|
+
text: buildReport(hunks, filesSummary, allImpacts, depth),
|
|
124
|
+
},
|
|
125
|
+
],
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
function buildReport(hunks, filesSummary, impacts, depth) {
|
|
129
|
+
const sections = [];
|
|
130
|
+
// --- Header ---
|
|
131
|
+
const totalFiles = hunks.length;
|
|
132
|
+
const totalSymbols = impacts.length;
|
|
133
|
+
const totalDependents = impacts.reduce((s, i) => s + i.totalDependents, 0);
|
|
134
|
+
const allDependentFiles = [
|
|
135
|
+
...new Set(impacts.flatMap((i) => i.dependentFiles)),
|
|
136
|
+
];
|
|
137
|
+
sections.push(`# Semantic Diff Analysis\n\n` +
|
|
138
|
+
`**${totalFiles} file(s) changed** → **${totalSymbols} symbol(s) affected** → **${totalDependents} dependent(s)** across **${allDependentFiles.length} file(s)**`);
|
|
139
|
+
// --- Files Changed ---
|
|
140
|
+
sections.push(`\n## Files Changed\n`);
|
|
141
|
+
for (const f of filesSummary) {
|
|
142
|
+
const statusIcon = f.status === "added"
|
|
143
|
+
? "+"
|
|
144
|
+
: f.status === "deleted"
|
|
145
|
+
? "-"
|
|
146
|
+
: f.status === "renamed"
|
|
147
|
+
? "→"
|
|
148
|
+
: "M";
|
|
149
|
+
sections.push(` ${statusIcon} ${f.file} (${f.linesChanged} lines, ${f.symbolsAffected} symbols)`);
|
|
150
|
+
}
|
|
151
|
+
// --- Modified Symbols ---
|
|
152
|
+
if (impacts.length > 0) {
|
|
153
|
+
sections.push(`\n## Affected Symbols\n`);
|
|
154
|
+
// Group by change type
|
|
155
|
+
const added = impacts.filter((i) => i.symbol.changeType === "added");
|
|
156
|
+
const modified = impacts.filter((i) => i.symbol.changeType === "modified");
|
|
157
|
+
const removed = impacts.filter((i) => i.symbol.changeType === "removed");
|
|
158
|
+
if (added.length > 0) {
|
|
159
|
+
sections.push(`### Added`);
|
|
160
|
+
for (const i of added) {
|
|
161
|
+
const sig = i.symbol.signature ? ` — \`${i.symbol.signature}\`` : "";
|
|
162
|
+
sections.push(` + ${i.symbol.kind} **${i.symbol.name}**${sig}`);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
if (modified.length > 0) {
|
|
166
|
+
sections.push(`### Modified`);
|
|
167
|
+
for (const i of modified) {
|
|
168
|
+
const sig = i.symbol.signature ? ` — \`${i.symbol.signature}\`` : "";
|
|
169
|
+
const deps = i.totalDependents > 0
|
|
170
|
+
? ` (${i.directDependents} direct, ${i.totalDependents} total dependents)`
|
|
171
|
+
: "";
|
|
172
|
+
sections.push(` M ${i.symbol.kind} **${i.symbol.name}**${sig}${deps}`);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
if (removed.length > 0) {
|
|
176
|
+
sections.push(`### Removed`);
|
|
177
|
+
for (const i of removed) {
|
|
178
|
+
const deps = i.totalDependents > 0
|
|
179
|
+
? ` ⚠️ **${i.totalDependents} broken reference(s)**`
|
|
180
|
+
: "";
|
|
181
|
+
sections.push(` - ${i.symbol.kind} **${i.symbol.name}**${deps}`);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
// --- Impact Details ---
|
|
186
|
+
const impactsWithDeps = impacts.filter((i) => i.totalDependents > 0);
|
|
187
|
+
if (impactsWithDeps.length > 0) {
|
|
188
|
+
sections.push(`\n## Impact Details\n`);
|
|
189
|
+
for (const impact of impactsWithDeps) {
|
|
190
|
+
sections.push(`### ${impact.symbol.kind} \`${impact.symbol.name}\` (${impact.symbol.filePath}:${impact.symbol.lineStart})`);
|
|
191
|
+
// Group dependents by file
|
|
192
|
+
const byFile = new Map();
|
|
193
|
+
for (const ref of impact.references) {
|
|
194
|
+
const list = byFile.get(ref.fromFile) ?? [];
|
|
195
|
+
list.push(ref);
|
|
196
|
+
byFile.set(ref.fromFile, list);
|
|
197
|
+
}
|
|
198
|
+
for (const [file, refs] of byFile) {
|
|
199
|
+
const lines = refs
|
|
200
|
+
.map((r) => ` ${r.fromSymbol} (line ${r.fromLine}) --[${r.refKind}]-->`)
|
|
201
|
+
.join("\n");
|
|
202
|
+
sections.push(` ${file}:\n${lines}`);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
// --- Risk Assessment ---
|
|
207
|
+
const removedWithDeps = impacts.filter((i) => i.symbol.changeType === "removed" && i.totalDependents > 0);
|
|
208
|
+
const highImpact = impacts.filter((i) => i.totalDependents > 5);
|
|
209
|
+
if (removedWithDeps.length > 0 || highImpact.length > 0) {
|
|
210
|
+
sections.push(`\n## ⚠️ Risk Assessment\n`);
|
|
211
|
+
if (removedWithDeps.length > 0) {
|
|
212
|
+
sections.push(`**Breaking changes detected:** ${removedWithDeps.length} removed symbol(s) with active references:`);
|
|
213
|
+
for (const i of removedWithDeps) {
|
|
214
|
+
sections.push(` - \`${i.symbol.name}\` is referenced ${i.totalDependents} time(s) in ${i.dependentFiles.length} file(s): ${i.dependentFiles.join(", ")}`);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
if (highImpact.length > 0) {
|
|
218
|
+
sections.push(`\n**High-impact changes:** ${highImpact.length} symbol(s) with >5 dependents:`);
|
|
219
|
+
for (const i of highImpact) {
|
|
220
|
+
sections.push(` - \`${i.symbol.name}\` → ${i.totalDependents} dependents across ${i.dependentFiles.length} files`);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
return sections.join("\n");
|
|
225
|
+
}
|
|
226
|
+
// --- Diff Parsing ---
|
|
227
|
+
function parseDiff(diffText) {
|
|
228
|
+
const hunks = [];
|
|
229
|
+
const lines = diffText.split("\n");
|
|
230
|
+
let i = 0;
|
|
231
|
+
while (i < lines.length) {
|
|
232
|
+
// Find diff header: "diff --git a/path b/path"
|
|
233
|
+
if (!lines[i].startsWith("diff --git")) {
|
|
234
|
+
i++;
|
|
235
|
+
continue;
|
|
236
|
+
}
|
|
237
|
+
const diffLine = lines[i];
|
|
238
|
+
i++;
|
|
239
|
+
// Parse file paths
|
|
240
|
+
let oldFile = "";
|
|
241
|
+
let newFile = "";
|
|
242
|
+
let status = "modified";
|
|
243
|
+
// Look for --- and +++ lines
|
|
244
|
+
while (i < lines.length && !lines[i].startsWith("@@")) {
|
|
245
|
+
if (lines[i].startsWith("--- ")) {
|
|
246
|
+
oldFile = lines[i].substring(4);
|
|
247
|
+
if (oldFile.startsWith("a/"))
|
|
248
|
+
oldFile = oldFile.substring(2);
|
|
249
|
+
if (oldFile === "/dev/null")
|
|
250
|
+
status = "added";
|
|
251
|
+
}
|
|
252
|
+
else if (lines[i].startsWith("+++ ")) {
|
|
253
|
+
newFile = lines[i].substring(4);
|
|
254
|
+
if (newFile.startsWith("b/"))
|
|
255
|
+
newFile = newFile.substring(2);
|
|
256
|
+
if (newFile === "/dev/null")
|
|
257
|
+
status = "deleted";
|
|
258
|
+
}
|
|
259
|
+
else if (lines[i].startsWith("rename from")) {
|
|
260
|
+
status = "renamed";
|
|
261
|
+
}
|
|
262
|
+
i++;
|
|
263
|
+
}
|
|
264
|
+
// If no --- / +++ found, try to extract from the diff --git line
|
|
265
|
+
if (!oldFile && !newFile) {
|
|
266
|
+
const match = diffLine.match(/diff --git a\/(.+) b\/(.+)/);
|
|
267
|
+
if (match) {
|
|
268
|
+
oldFile = match[1];
|
|
269
|
+
newFile = match[2];
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
// Parse hunks for this file
|
|
273
|
+
const addedLines = [];
|
|
274
|
+
const removedLines = [];
|
|
275
|
+
let minLine = Infinity;
|
|
276
|
+
let maxLine = 0;
|
|
277
|
+
while (i < lines.length && !lines[i].startsWith("diff --git")) {
|
|
278
|
+
if (lines[i].startsWith("@@")) {
|
|
279
|
+
// Parse hunk header: @@ -old,count +new,count @@
|
|
280
|
+
const match = lines[i].match(/@@ -(\d+)(?:,\d+)? \+(\d+)(?:,\d+)? @@/);
|
|
281
|
+
if (match) {
|
|
282
|
+
let oldLineNum = parseInt(match[1], 10);
|
|
283
|
+
let newLineNum = parseInt(match[2], 10);
|
|
284
|
+
i++;
|
|
285
|
+
while (i < lines.length &&
|
|
286
|
+
!lines[i].startsWith("@@") &&
|
|
287
|
+
!lines[i].startsWith("diff --git")) {
|
|
288
|
+
if (lines[i].startsWith("+") && !lines[i].startsWith("+++")) {
|
|
289
|
+
addedLines.push(newLineNum);
|
|
290
|
+
minLine = Math.min(minLine, newLineNum);
|
|
291
|
+
maxLine = Math.max(maxLine, newLineNum);
|
|
292
|
+
newLineNum++;
|
|
293
|
+
}
|
|
294
|
+
else if (lines[i].startsWith("-") && !lines[i].startsWith("---")) {
|
|
295
|
+
removedLines.push(oldLineNum);
|
|
296
|
+
minLine = Math.min(minLine, oldLineNum);
|
|
297
|
+
maxLine = Math.max(maxLine, oldLineNum);
|
|
298
|
+
oldLineNum++;
|
|
299
|
+
}
|
|
300
|
+
else {
|
|
301
|
+
// Context line
|
|
302
|
+
oldLineNum++;
|
|
303
|
+
newLineNum++;
|
|
304
|
+
}
|
|
305
|
+
i++;
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
else {
|
|
309
|
+
i++;
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
else {
|
|
313
|
+
i++;
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
if (minLine === Infinity)
|
|
317
|
+
minLine = 1;
|
|
318
|
+
if (maxLine === 0)
|
|
319
|
+
maxLine = minLine;
|
|
320
|
+
hunks.push({
|
|
321
|
+
filePath: newFile || oldFile,
|
|
322
|
+
oldFile,
|
|
323
|
+
newFile,
|
|
324
|
+
addedLines,
|
|
325
|
+
removedLines,
|
|
326
|
+
changedLineStart: minLine,
|
|
327
|
+
changedLineEnd: maxLine,
|
|
328
|
+
status,
|
|
329
|
+
});
|
|
330
|
+
}
|
|
331
|
+
return hunks;
|
|
332
|
+
}
|
|
333
|
+
// --- Symbol Impact Detection ---
|
|
334
|
+
function findAffectedSymbols(graph, hunk) {
|
|
335
|
+
const result = [];
|
|
336
|
+
if (hunk.status === "added") {
|
|
337
|
+
// New file — all symbols are "added"
|
|
338
|
+
const symbols = graph.findSymbols({ scope: hunk.newFile, limit: 100 });
|
|
339
|
+
for (const sym of symbols) {
|
|
340
|
+
if (sym.filePath === hunk.newFile || sym.filePath.endsWith("/" + hunk.newFile)) {
|
|
341
|
+
result.push({
|
|
342
|
+
...sym,
|
|
343
|
+
filePath: sym.filePath,
|
|
344
|
+
changeType: "added",
|
|
345
|
+
});
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
return result;
|
|
349
|
+
}
|
|
350
|
+
if (hunk.status === "deleted") {
|
|
351
|
+
// Deleted file — find symbols from old index (they might still be in DB)
|
|
352
|
+
const symbols = graph.findSymbols({ scope: hunk.oldFile, limit: 100 });
|
|
353
|
+
for (const sym of symbols) {
|
|
354
|
+
if (sym.filePath === hunk.oldFile || sym.filePath.endsWith("/" + hunk.oldFile)) {
|
|
355
|
+
result.push({
|
|
356
|
+
...sym,
|
|
357
|
+
filePath: sym.filePath,
|
|
358
|
+
changeType: "removed",
|
|
359
|
+
});
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
return result;
|
|
363
|
+
}
|
|
364
|
+
// Modified file — find symbols that overlap with changed lines
|
|
365
|
+
const filePath = hunk.newFile;
|
|
366
|
+
// Try both the path as-is and with the project root
|
|
367
|
+
const db = graph.getDb();
|
|
368
|
+
// Find the file in the index — try exact match and suffix match
|
|
369
|
+
const fileRow = db
|
|
370
|
+
.prepare(`SELECT id, path FROM files WHERE path = ? OR path LIKE ?`)
|
|
371
|
+
.get(filePath, `%/${filePath}`);
|
|
372
|
+
if (!fileRow)
|
|
373
|
+
return result;
|
|
374
|
+
const actualPath = fileRow.path;
|
|
375
|
+
// Get all symbols in this file
|
|
376
|
+
const allSymbols = db
|
|
377
|
+
.prepare(`SELECT name, kind, line_start as lineStart, line_end as lineEnd, signature
|
|
378
|
+
FROM symbols WHERE file_id = ? ORDER BY line_start`)
|
|
379
|
+
.all(fileRow.id);
|
|
380
|
+
// Check which symbols overlap with changed lines
|
|
381
|
+
const changedLineSet = new Set([...hunk.addedLines, ...hunk.removedLines]);
|
|
382
|
+
for (const sym of allSymbols) {
|
|
383
|
+
let overlaps = false;
|
|
384
|
+
// Check if any changed line falls within this symbol's range
|
|
385
|
+
for (const line of changedLineSet) {
|
|
386
|
+
if (line >= sym.lineStart && line <= sym.lineEnd) {
|
|
387
|
+
overlaps = true;
|
|
388
|
+
break;
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
// Also check using the hunk's overall range
|
|
392
|
+
if (!overlaps &&
|
|
393
|
+
sym.lineStart <= hunk.changedLineEnd &&
|
|
394
|
+
sym.lineEnd >= hunk.changedLineStart) {
|
|
395
|
+
overlaps = true;
|
|
396
|
+
}
|
|
397
|
+
if (overlaps) {
|
|
398
|
+
result.push({
|
|
399
|
+
...sym,
|
|
400
|
+
filePath: actualPath,
|
|
401
|
+
changeType: "modified",
|
|
402
|
+
});
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
return result;
|
|
406
|
+
}
|
|
407
|
+
//# sourceMappingURL=semantic-diff.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"semantic-diff.js","sourceRoot":"","sources":["../../src/tools/semantic-diff.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
const LOG_LEVELS = { debug: 0, info: 1, warn: 2, error: 3 };
|
|
2
|
+
const currentLevel = process.env.LOG_LEVEL || "info";
|
|
3
|
+
function log(level, message, data) {
|
|
4
|
+
if (LOG_LEVELS[level] < LOG_LEVELS[currentLevel])
|
|
5
|
+
return;
|
|
6
|
+
const entry = { timestamp: new Date().toISOString(), level, message, ...(data ? { data } : {}) };
|
|
7
|
+
process.stderr.write(JSON.stringify(entry) + "\n");
|
|
8
|
+
}
|
|
9
|
+
export const logger = {
|
|
10
|
+
debug: (msg, data) => log("debug", msg, data),
|
|
11
|
+
info: (msg, data) => log("info", msg, data),
|
|
12
|
+
warn: (msg, data) => log("warn", msg, data),
|
|
13
|
+
error: (msg, data) => log("error", msg, data),
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAW,CAAC;AAGrE,MAAM,YAAY,GAAc,OAAO,CAAC,GAAG,CAAC,SAAsB,IAAI,MAAM,CAAC;AAE7E,SAAS,GAAG,CAAC,KAAe,EAAE,OAAe,EAAE,IAAc;IAC3D,IAAI,UAAU,CAAC,KAAK,CAAC,GAAG,UAAU,CAAC,YAAY,CAAC;QAAE,OAAO;IACzD,MAAM,KAAK,GAAG,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IACjG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;AACrD,CAAC;AAED,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,KAAK,EAAE,CAAC,GAAW,EAAE,IAAc,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC;IAC/D,IAAI,EAAE,CAAC,GAAW,EAAE,IAAc,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC;IAC7D,IAAI,EAAE,CAAC,GAAW,EAAE,IAAc,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC;IAC7D,KAAK,EAAE,CAAC,GAAW,EAAE,IAAc,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC;CAChE,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "mcp-codebase-intelligence",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "MCP server providing semantic code intelligence — symbol search, references, call graphs, impact analysis, and architecture diagrams via tree-sitter",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"bin": {
|
|
8
|
+
"mcp-codebase-intelligence": "dist/index.js"
|
|
9
|
+
},
|
|
10
|
+
"files": [
|
|
11
|
+
"dist",
|
|
12
|
+
"LICENSE",
|
|
13
|
+
"README.md"
|
|
14
|
+
],
|
|
15
|
+
"scripts": {
|
|
16
|
+
"build": "tsc",
|
|
17
|
+
"dev": "tsx src/index.ts",
|
|
18
|
+
"start": "node dist/index.js",
|
|
19
|
+
"test": "node --import tsx --test tests/*.test.ts",
|
|
20
|
+
"typecheck": "tsc --noEmit",
|
|
21
|
+
"prepublishOnly": "npm run build"
|
|
22
|
+
},
|
|
23
|
+
"keywords": [
|
|
24
|
+
"mcp",
|
|
25
|
+
"model-context-protocol",
|
|
26
|
+
"code-intelligence",
|
|
27
|
+
"tree-sitter",
|
|
28
|
+
"static-analysis",
|
|
29
|
+
"semantic-diff",
|
|
30
|
+
"code-review",
|
|
31
|
+
"typescript",
|
|
32
|
+
"python",
|
|
33
|
+
"go",
|
|
34
|
+
"rust",
|
|
35
|
+
"java"
|
|
36
|
+
],
|
|
37
|
+
"author": "Gaurav Tiwari <tiwarigaurav1992@gmail.com>",
|
|
38
|
+
"license": "MIT",
|
|
39
|
+
"repository": {
|
|
40
|
+
"type": "git",
|
|
41
|
+
"url": "https://github.com/g-tiwari/mcp-codebase-intelligence.git"
|
|
42
|
+
},
|
|
43
|
+
"homepage": "https://github.com/g-tiwari/mcp-codebase-intelligence",
|
|
44
|
+
"bugs": {
|
|
45
|
+
"url": "https://github.com/g-tiwari/mcp-codebase-intelligence/issues"
|
|
46
|
+
},
|
|
47
|
+
"dependencies": {
|
|
48
|
+
"@modelcontextprotocol/sdk": "^1.27.1",
|
|
49
|
+
"better-sqlite3": "^12.8.0",
|
|
50
|
+
"chokidar": "^5.0.0",
|
|
51
|
+
"glob": "^13.0.6",
|
|
52
|
+
"tree-sitter": "^0.21.1",
|
|
53
|
+
"tree-sitter-go": "^0.21.0",
|
|
54
|
+
"tree-sitter-java": "^0.21.0",
|
|
55
|
+
"tree-sitter-python": "^0.21.0",
|
|
56
|
+
"tree-sitter-rust": "^0.21.0",
|
|
57
|
+
"tree-sitter-typescript": "^0.23.2",
|
|
58
|
+
"typescript-language-server": "^5.1.3",
|
|
59
|
+
"vscode-languageserver-protocol": "^3.17.5",
|
|
60
|
+
"zod": "^3.25.76"
|
|
61
|
+
},
|
|
62
|
+
"devDependencies": {
|
|
63
|
+
"@types/better-sqlite3": "^7.6.13",
|
|
64
|
+
"@types/node": "^25.5.0",
|
|
65
|
+
"tsx": "^4.21.0",
|
|
66
|
+
"typescript": "^5.9.3"
|
|
67
|
+
}
|
|
68
|
+
}
|