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.
Files changed (84) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +166 -0
  3. package/dist/graph/code-graph.d.ts +119 -0
  4. package/dist/graph/code-graph.js +279 -0
  5. package/dist/graph/code-graph.js.map +1 -0
  6. package/dist/graph/schema.d.ts +2 -0
  7. package/dist/graph/schema.js +62 -0
  8. package/dist/graph/schema.js.map +1 -0
  9. package/dist/index.d.ts +5 -0
  10. package/dist/index.js +171 -0
  11. package/dist/index.js.map +1 -0
  12. package/dist/indexer/file-watcher.d.ts +13 -0
  13. package/dist/indexer/file-watcher.js +106 -0
  14. package/dist/indexer/file-watcher.js.map +1 -0
  15. package/dist/indexer/lang-go.d.ts +2 -0
  16. package/dist/indexer/lang-go.js +246 -0
  17. package/dist/indexer/lang-go.js.map +1 -0
  18. package/dist/indexer/lang-java.d.ts +2 -0
  19. package/dist/indexer/lang-java.js +307 -0
  20. package/dist/indexer/lang-java.js.map +1 -0
  21. package/dist/indexer/lang-python.d.ts +2 -0
  22. package/dist/indexer/lang-python.js +232 -0
  23. package/dist/indexer/lang-python.js.map +1 -0
  24. package/dist/indexer/lang-rust.d.ts +2 -0
  25. package/dist/indexer/lang-rust.js +323 -0
  26. package/dist/indexer/lang-rust.js.map +1 -0
  27. package/dist/indexer/language-plugin.d.ts +22 -0
  28. package/dist/indexer/language-plugin.js +22 -0
  29. package/dist/indexer/language-plugin.js.map +1 -0
  30. package/dist/indexer/tree-sitter-indexer.d.ts +12 -0
  31. package/dist/indexer/tree-sitter-indexer.js +618 -0
  32. package/dist/indexer/tree-sitter-indexer.js.map +1 -0
  33. package/dist/lsp/lsp-client.d.ts +45 -0
  34. package/dist/lsp/lsp-client.js +315 -0
  35. package/dist/lsp/lsp-client.js.map +1 -0
  36. package/dist/lsp/lsp-manager.d.ts +13 -0
  37. package/dist/lsp/lsp-manager.js +96 -0
  38. package/dist/lsp/lsp-manager.js.map +1 -0
  39. package/dist/tools/analyze-impact.d.ts +38 -0
  40. package/dist/tools/analyze-impact.js +126 -0
  41. package/dist/tools/analyze-impact.js.map +1 -0
  42. package/dist/tools/architecture-diagram.d.ts +33 -0
  43. package/dist/tools/architecture-diagram.js +216 -0
  44. package/dist/tools/architecture-diagram.js.map +1 -0
  45. package/dist/tools/find-implementations.d.ts +33 -0
  46. package/dist/tools/find-implementations.js +68 -0
  47. package/dist/tools/find-implementations.js.map +1 -0
  48. package/dist/tools/find-symbol.d.ts +39 -0
  49. package/dist/tools/find-symbol.js +52 -0
  50. package/dist/tools/find-symbol.js.map +1 -0
  51. package/dist/tools/get-call-graph.d.ts +40 -0
  52. package/dist/tools/get-call-graph.js +174 -0
  53. package/dist/tools/get-call-graph.js.map +1 -0
  54. package/dist/tools/get-dependencies.d.ts +28 -0
  55. package/dist/tools/get-dependencies.js +68 -0
  56. package/dist/tools/get-dependencies.js.map +1 -0
  57. package/dist/tools/get-exports.d.ts +23 -0
  58. package/dist/tools/get-exports.js +40 -0
  59. package/dist/tools/get-exports.js.map +1 -0
  60. package/dist/tools/get-references.d.ts +28 -0
  61. package/dist/tools/get-references.js +53 -0
  62. package/dist/tools/get-references.js.map +1 -0
  63. package/dist/tools/get-stats.d.ts +15 -0
  64. package/dist/tools/get-stats.js +23 -0
  65. package/dist/tools/get-stats.js.map +1 -0
  66. package/dist/tools/get-type-info.d.ts +33 -0
  67. package/dist/tools/get-type-info.js +69 -0
  68. package/dist/tools/get-type-info.js.map +1 -0
  69. package/dist/tools/goto-definition.d.ts +33 -0
  70. package/dist/tools/goto-definition.js +77 -0
  71. package/dist/tools/goto-definition.js.map +1 -0
  72. package/dist/tools/natural-language-query.d.ts +23 -0
  73. package/dist/tools/natural-language-query.js +426 -0
  74. package/dist/tools/natural-language-query.js.map +1 -0
  75. package/dist/tools/reindex.d.ts +15 -0
  76. package/dist/tools/reindex.js +20 -0
  77. package/dist/tools/reindex.js.map +1 -0
  78. package/dist/tools/semantic-diff.d.ts +32 -0
  79. package/dist/tools/semantic-diff.js +407 -0
  80. package/dist/tools/semantic-diff.js.map +1 -0
  81. package/dist/utils/logger.d.ts +6 -0
  82. package/dist/utils/logger.js +15 -0
  83. package/dist/utils/logger.js.map +1 -0
  84. 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,6 @@
1
+ export declare const logger: {
2
+ debug: (msg: string, data?: unknown) => void;
3
+ info: (msg: string, data?: unknown) => void;
4
+ warn: (msg: string, data?: unknown) => void;
5
+ error: (msg: string, data?: unknown) => void;
6
+ };
@@ -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
+ }