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
package/dist/index.js
ADDED
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
3
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
4
|
+
import path from "path";
|
|
5
|
+
import { initializeDatabase } from "./graph/schema.js";
|
|
6
|
+
import { CodeGraph } from "./graph/code-graph.js";
|
|
7
|
+
import { FileWatcher } from "./indexer/file-watcher.js";
|
|
8
|
+
// Language plugins — imported for side-effect (registration)
|
|
9
|
+
import "./indexer/lang-python.js";
|
|
10
|
+
import "./indexer/lang-go.js";
|
|
11
|
+
import "./indexer/lang-rust.js";
|
|
12
|
+
import "./indexer/lang-java.js";
|
|
13
|
+
import { findSymbolTool, handleFindSymbol } from "./tools/find-symbol.js";
|
|
14
|
+
import { getReferencesTool, handleGetReferences } from "./tools/get-references.js";
|
|
15
|
+
import { getExportsTool, handleGetExports } from "./tools/get-exports.js";
|
|
16
|
+
import { getDependenciesTool, handleGetDependencies } from "./tools/get-dependencies.js";
|
|
17
|
+
import { getStatsTool, handleGetStats } from "./tools/get-stats.js";
|
|
18
|
+
import { reindexTool, handleReindex } from "./tools/reindex.js";
|
|
19
|
+
import { analyzeChangeImpactTool, handleAnalyzeChangeImpact } from "./tools/analyze-impact.js";
|
|
20
|
+
import { getCallGraphTool, handleGetCallGraph } from "./tools/get-call-graph.js";
|
|
21
|
+
import { gotoDefinitionTool, handleGotoDefinition } from "./tools/goto-definition.js";
|
|
22
|
+
import { getTypeInfoTool, handleGetTypeInfo } from "./tools/get-type-info.js";
|
|
23
|
+
import { findImplementationsTool, handleFindImplementations } from "./tools/find-implementations.js";
|
|
24
|
+
import { semanticDiffTool, handleSemanticDiff } from "./tools/semantic-diff.js";
|
|
25
|
+
import { architectureDiagramTool, handleArchitectureDiagram } from "./tools/architecture-diagram.js";
|
|
26
|
+
import { naturalLanguageQueryTool, handleNaturalLanguageQuery } from "./tools/natural-language-query.js";
|
|
27
|
+
import { LspManager } from "./lsp/lsp-manager.js";
|
|
28
|
+
import { logger } from "./utils/logger.js";
|
|
29
|
+
import { z } from "zod";
|
|
30
|
+
const PROJECT_ROOT = process.env.PROJECT_ROOT || process.cwd();
|
|
31
|
+
const DB_PATH = process.env.DB_PATH || path.join(PROJECT_ROOT, ".codegraph", "index.db");
|
|
32
|
+
async function main() {
|
|
33
|
+
// Validate PROJECT_ROOT exists and is a directory
|
|
34
|
+
const { existsSync, statSync } = await import("fs");
|
|
35
|
+
if (!existsSync(PROJECT_ROOT)) {
|
|
36
|
+
logger.error(`PROJECT_ROOT does not exist: ${PROJECT_ROOT}`);
|
|
37
|
+
process.exit(1);
|
|
38
|
+
}
|
|
39
|
+
if (!statSync(PROJECT_ROOT).isDirectory()) {
|
|
40
|
+
logger.error(`PROJECT_ROOT is not a directory: ${PROJECT_ROOT}`);
|
|
41
|
+
process.exit(1);
|
|
42
|
+
}
|
|
43
|
+
logger.info(`Starting mcp-codebase-intelligence for ${PROJECT_ROOT}`);
|
|
44
|
+
// Ensure DB directory exists
|
|
45
|
+
const { mkdirSync } = await import("fs");
|
|
46
|
+
mkdirSync(path.dirname(DB_PATH), { recursive: true });
|
|
47
|
+
// Initialize database and graph
|
|
48
|
+
const db = initializeDatabase(DB_PATH);
|
|
49
|
+
const graph = new CodeGraph(db);
|
|
50
|
+
const watcher = new FileWatcher(PROJECT_ROOT, graph);
|
|
51
|
+
// Create MCP server
|
|
52
|
+
const server = new McpServer({
|
|
53
|
+
name: "codebase-intelligence",
|
|
54
|
+
version: "0.1.0",
|
|
55
|
+
description: `Semantic code intelligence for the project at: ${PROJECT_ROOT}. All tools in this server operate on this indexed project, not the user's current working directory.`,
|
|
56
|
+
});
|
|
57
|
+
// Register tools
|
|
58
|
+
server.tool(findSymbolTool.name, findSymbolTool.description, {
|
|
59
|
+
name: z.string().describe("Symbol name to search for (supports partial matching)"),
|
|
60
|
+
kind: z
|
|
61
|
+
.enum(["function", "class", "interface", "type", "variable", "method", "enum", "property"])
|
|
62
|
+
.optional()
|
|
63
|
+
.describe("Optional: filter by symbol kind"),
|
|
64
|
+
scope: z.string().optional().describe("Optional: limit search to files under this path prefix"),
|
|
65
|
+
limit: z.number().optional().describe("Maximum results to return (default: 20)"),
|
|
66
|
+
}, (args) => handleFindSymbol(graph, args));
|
|
67
|
+
server.tool(getReferencesTool.name, getReferencesTool.description, {
|
|
68
|
+
symbol_name: z.string().describe("Name of the symbol to find references for"),
|
|
69
|
+
depth: z
|
|
70
|
+
.number()
|
|
71
|
+
.optional()
|
|
72
|
+
.describe("How many levels of transitive references to follow (1 = direct only, default: 1, max: 10)"),
|
|
73
|
+
}, (args) => handleGetReferences(graph, args));
|
|
74
|
+
server.tool(getExportsTool.name, getExportsTool.description, {
|
|
75
|
+
file_path: z.string().describe("Absolute path to the file to inspect"),
|
|
76
|
+
}, (args) => handleGetExports(graph, args));
|
|
77
|
+
server.tool(getDependenciesTool.name, getDependenciesTool.description, {
|
|
78
|
+
file_path: z.string().describe("Absolute path to the file to inspect"),
|
|
79
|
+
depth: z
|
|
80
|
+
.number()
|
|
81
|
+
.optional()
|
|
82
|
+
.describe("How many levels of transitive dependencies to follow (default: 1, max: 5)"),
|
|
83
|
+
}, (args) => handleGetDependencies(graph, args));
|
|
84
|
+
server.tool(getStatsTool.name, getStatsTool.description, {}, () => handleGetStats(graph, PROJECT_ROOT));
|
|
85
|
+
server.tool(reindexTool.name, reindexTool.description, {}, async () => handleReindex(watcher));
|
|
86
|
+
server.tool(analyzeChangeImpactTool.name, analyzeChangeImpactTool.description, {
|
|
87
|
+
file_path: z.string().describe("Absolute path to the file being modified"),
|
|
88
|
+
line_start: z.number().describe("Starting line number of the change (inclusive)"),
|
|
89
|
+
line_end: z.number().describe("Ending line number of the change (inclusive)"),
|
|
90
|
+
depth: z
|
|
91
|
+
.number()
|
|
92
|
+
.optional()
|
|
93
|
+
.describe("How many levels of transitive dependents to follow (1 = direct only, default: 2, max: 10)"),
|
|
94
|
+
}, (args) => handleAnalyzeChangeImpact(graph, args));
|
|
95
|
+
server.tool(getCallGraphTool.name, getCallGraphTool.description, {
|
|
96
|
+
function_name: z.string().describe("Name of the function to get the call graph for"),
|
|
97
|
+
direction: z
|
|
98
|
+
.enum(["callers", "callees", "both"])
|
|
99
|
+
.optional()
|
|
100
|
+
.describe("Direction of the graph (default: both)"),
|
|
101
|
+
depth: z.number().optional().describe("How many levels to traverse (default: 2, max: 5)"),
|
|
102
|
+
format: z
|
|
103
|
+
.enum(["tree", "mermaid"])
|
|
104
|
+
.optional()
|
|
105
|
+
.describe("Output format (default: tree)"),
|
|
106
|
+
}, (args) => handleGetCallGraph(graph, args));
|
|
107
|
+
// Register LSP-powered tools
|
|
108
|
+
const lspManager = new LspManager(PROJECT_ROOT);
|
|
109
|
+
server.tool(gotoDefinitionTool.name, gotoDefinitionTool.description, {
|
|
110
|
+
file_path: z.string().describe("Absolute path to the file"),
|
|
111
|
+
line: z.number().describe("Line number (1-based)"),
|
|
112
|
+
character: z.number().describe("Column number (0-based)"),
|
|
113
|
+
}, (args) => handleGotoDefinition(lspManager, args));
|
|
114
|
+
server.tool(getTypeInfoTool.name, getTypeInfoTool.description, {
|
|
115
|
+
file_path: z.string().describe("Absolute path to the file"),
|
|
116
|
+
line: z.number().describe("Line number (1-based)"),
|
|
117
|
+
character: z.number().describe("Column number (0-based)"),
|
|
118
|
+
}, (args) => handleGetTypeInfo(lspManager, args));
|
|
119
|
+
server.tool(findImplementationsTool.name, findImplementationsTool.description, {
|
|
120
|
+
file_path: z.string().describe("Absolute path to the file containing the interface/abstract method"),
|
|
121
|
+
line: z.number().describe("Line number (1-based)"),
|
|
122
|
+
character: z.number().describe("Column number (0-based)"),
|
|
123
|
+
}, (args) => handleFindImplementations(lspManager, args));
|
|
124
|
+
server.tool(semanticDiffTool.name, semanticDiffTool.description, {
|
|
125
|
+
git_ref: z.string().optional().describe("Git ref to diff against (e.g. 'HEAD~1', 'HEAD~5', 'main', 'staged', 'unstaged'). Preferred over passing raw diff text."),
|
|
126
|
+
diff: z.string().optional().describe("Raw unified diff text. Only use if git_ref is not applicable."),
|
|
127
|
+
depth: z.number().optional().describe("Transitive dependency depth (default: 2, max: 5)"),
|
|
128
|
+
}, (args) => handleSemanticDiff(graph, args, PROJECT_ROOT));
|
|
129
|
+
server.tool(architectureDiagramTool.name, architectureDiagramTool.description, {
|
|
130
|
+
scope: z.string().optional().describe("Optional: limit diagram to files under this path prefix"),
|
|
131
|
+
max_depth: z.number().optional().describe("Maximum directory nesting depth for subgraph grouping (default: 2)"),
|
|
132
|
+
format: z.enum(["mermaid", "text"]).optional().describe("Output format (default: mermaid)"),
|
|
133
|
+
}, (args) => handleArchitectureDiagram(graph, args, PROJECT_ROOT));
|
|
134
|
+
server.tool(naturalLanguageQueryTool.name, naturalLanguageQueryTool.description, {
|
|
135
|
+
query: z.string().describe("Natural language question about the codebase"),
|
|
136
|
+
}, (args) => handleNaturalLanguageQuery(graph, args));
|
|
137
|
+
// Perform initial indexing (tree-sitter — fast)
|
|
138
|
+
await watcher.initialIndex();
|
|
139
|
+
watcher.startWatching();
|
|
140
|
+
// Start LSP servers in background (slow — don't block MCP)
|
|
141
|
+
lspManager.start().then(() => {
|
|
142
|
+
const servers = lspManager.getActiveServers();
|
|
143
|
+
if (servers.length > 0) {
|
|
144
|
+
logger.info(`LSP servers active: ${servers.join(", ")}`);
|
|
145
|
+
}
|
|
146
|
+
else {
|
|
147
|
+
logger.info("No LSP servers started (tools still work via tree-sitter)");
|
|
148
|
+
}
|
|
149
|
+
}).catch((err) => {
|
|
150
|
+
logger.warn("LSP startup failed (non-fatal)", err);
|
|
151
|
+
});
|
|
152
|
+
// Start MCP server on stdio
|
|
153
|
+
const transport = new StdioServerTransport();
|
|
154
|
+
await server.connect(transport);
|
|
155
|
+
logger.info("MCP server running on stdio");
|
|
156
|
+
// Graceful shutdown
|
|
157
|
+
const shutdown = async () => {
|
|
158
|
+
logger.info("Shutting down...");
|
|
159
|
+
await watcher.stop();
|
|
160
|
+
await lspManager.stop();
|
|
161
|
+
db.close();
|
|
162
|
+
process.exit(0);
|
|
163
|
+
};
|
|
164
|
+
process.on("SIGINT", shutdown);
|
|
165
|
+
process.on("SIGTERM", shutdown);
|
|
166
|
+
}
|
|
167
|
+
main().catch((err) => {
|
|
168
|
+
logger.error("Fatal error", err);
|
|
169
|
+
process.exit(1);
|
|
170
|
+
});
|
|
171
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { CodeGraph } from "../graph/code-graph.js";
|
|
2
|
+
export declare class FileWatcher {
|
|
3
|
+
private rootPath;
|
|
4
|
+
private graph;
|
|
5
|
+
private watcher;
|
|
6
|
+
private indexing;
|
|
7
|
+
constructor(rootPath: string, graph: CodeGraph);
|
|
8
|
+
initialIndex(): Promise<void>;
|
|
9
|
+
startWatching(): void;
|
|
10
|
+
private handleFileChange;
|
|
11
|
+
private handleFileRemove;
|
|
12
|
+
stop(): Promise<void>;
|
|
13
|
+
}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { watch } from "chokidar";
|
|
2
|
+
import { glob } from "glob";
|
|
3
|
+
import path from "path";
|
|
4
|
+
import { parseFile } from "./tree-sitter-indexer.js";
|
|
5
|
+
import { getAllExtensions } from "./language-plugin.js";
|
|
6
|
+
import { logger } from "../utils/logger.js";
|
|
7
|
+
const IGNORE_PATTERNS = [
|
|
8
|
+
"**/node_modules/**", "**/dist/**", "**/build/**", "**/.git/**", "**/coverage/**",
|
|
9
|
+
"**/__pycache__/**", "**/venv/**", "**/.venv/**",
|
|
10
|
+
"**/target/**", "**/out/**", "**/.gradle/**", "**/.mvn/**",
|
|
11
|
+
];
|
|
12
|
+
function isTargetFile(filePath) {
|
|
13
|
+
const extensions = getAllExtensions();
|
|
14
|
+
return extensions.some((ext) => filePath.endsWith(ext));
|
|
15
|
+
}
|
|
16
|
+
export class FileWatcher {
|
|
17
|
+
rootPath;
|
|
18
|
+
graph;
|
|
19
|
+
watcher = null;
|
|
20
|
+
indexing = false;
|
|
21
|
+
constructor(rootPath, graph) {
|
|
22
|
+
this.rootPath = rootPath;
|
|
23
|
+
this.graph = graph;
|
|
24
|
+
}
|
|
25
|
+
async initialIndex() {
|
|
26
|
+
if (this.indexing)
|
|
27
|
+
return;
|
|
28
|
+
this.indexing = true;
|
|
29
|
+
logger.info(`Starting initial index of ${this.rootPath}`);
|
|
30
|
+
const startTime = Date.now();
|
|
31
|
+
try {
|
|
32
|
+
const extensions = getAllExtensions();
|
|
33
|
+
const patterns = extensions.map((ext) => `**/*${ext}`);
|
|
34
|
+
const files = [];
|
|
35
|
+
for (const pattern of patterns) {
|
|
36
|
+
const matched = await glob(pattern, {
|
|
37
|
+
cwd: this.rootPath,
|
|
38
|
+
absolute: true,
|
|
39
|
+
ignore: IGNORE_PATTERNS,
|
|
40
|
+
});
|
|
41
|
+
files.push(...matched);
|
|
42
|
+
}
|
|
43
|
+
logger.info(`Found ${files.length} files to index`);
|
|
44
|
+
// Parse all files first (CPU-bound, tree-sitter)
|
|
45
|
+
const parseStart = Date.now();
|
|
46
|
+
const parsed = [];
|
|
47
|
+
for (const file of files) {
|
|
48
|
+
const result = parseFile(file);
|
|
49
|
+
if (result) {
|
|
50
|
+
parsed.push({ filePath: file, content: result.content, symbols: result.symbols, references: result.references, imports: result.imports });
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
const parseElapsed = Date.now() - parseStart;
|
|
54
|
+
// Batch insert into DB (single transaction — much faster for large repos)
|
|
55
|
+
const dbStart = Date.now();
|
|
56
|
+
const { indexed, skipped } = this.graph.indexFileBatch(parsed);
|
|
57
|
+
const dbElapsed = Date.now() - dbStart;
|
|
58
|
+
const elapsed = ((Date.now() - startTime) / 1000).toFixed(2);
|
|
59
|
+
const stats = this.graph.getStats();
|
|
60
|
+
logger.info(`Initial index complete in ${elapsed}s (parse: ${parseElapsed}ms, db: ${dbElapsed}ms): ` +
|
|
61
|
+
`${stats.files} files, ${stats.symbols} symbols, ${stats.references} references` +
|
|
62
|
+
(skipped > 0 ? ` (${skipped} unchanged)` : ""));
|
|
63
|
+
}
|
|
64
|
+
finally {
|
|
65
|
+
this.indexing = false;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
startWatching() {
|
|
69
|
+
const extensions = getAllExtensions();
|
|
70
|
+
const watchPatterns = extensions.map((ext) => path.join(this.rootPath, "**", `*${ext}`));
|
|
71
|
+
this.watcher = watch(watchPatterns, {
|
|
72
|
+
ignored: IGNORE_PATTERNS,
|
|
73
|
+
persistent: true,
|
|
74
|
+
ignoreInitial: true,
|
|
75
|
+
awaitWriteFinish: { stabilityThreshold: 300, pollInterval: 100 },
|
|
76
|
+
});
|
|
77
|
+
this.watcher
|
|
78
|
+
.on("add", (filePath) => this.handleFileChange(filePath))
|
|
79
|
+
.on("change", (filePath) => this.handleFileChange(filePath))
|
|
80
|
+
.on("unlink", (filePath) => this.handleFileRemove(filePath));
|
|
81
|
+
logger.info(`Watching for file changes in ${this.rootPath}`);
|
|
82
|
+
}
|
|
83
|
+
handleFileChange(filePath) {
|
|
84
|
+
if (!isTargetFile(filePath))
|
|
85
|
+
return;
|
|
86
|
+
logger.debug(`File changed: ${filePath}`);
|
|
87
|
+
const result = parseFile(filePath);
|
|
88
|
+
if (result) {
|
|
89
|
+
this.graph.indexFile(filePath, result.content, result.symbols, result.references, result.imports);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
handleFileRemove(filePath) {
|
|
93
|
+
if (!isTargetFile(filePath))
|
|
94
|
+
return;
|
|
95
|
+
logger.debug(`File removed: ${filePath}`);
|
|
96
|
+
this.graph.removeFile(filePath);
|
|
97
|
+
}
|
|
98
|
+
async stop() {
|
|
99
|
+
if (this.watcher) {
|
|
100
|
+
await this.watcher.close();
|
|
101
|
+
this.watcher = null;
|
|
102
|
+
logger.info("File watcher stopped");
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=file-watcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-watcher.js","sourceRoot":"","sources":["../../src/indexer/file-watcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
import Parser from "tree-sitter";
|
|
2
|
+
import Go from "tree-sitter-go";
|
|
3
|
+
import { registerLanguage } from "./language-plugin.js";
|
|
4
|
+
import { bareName } from "./tree-sitter-indexer.js";
|
|
5
|
+
const goParser = new Parser();
|
|
6
|
+
goParser.setLanguage(Go);
|
|
7
|
+
function extractGoFuncSignature(node) {
|
|
8
|
+
const name = node.childForFieldName("name")?.text ?? "";
|
|
9
|
+
const params = node.childForFieldName("parameters")?.text ?? "()";
|
|
10
|
+
const result = node.childForFieldName("result");
|
|
11
|
+
const retText = result ? ` ${result.text}` : "";
|
|
12
|
+
return `${name}${params}${retText}`;
|
|
13
|
+
}
|
|
14
|
+
function isExportedGo(name) {
|
|
15
|
+
// Go exports are capitalized identifiers
|
|
16
|
+
return name.length > 0 && name[0] === name[0].toUpperCase() && name[0] !== name[0].toLowerCase();
|
|
17
|
+
}
|
|
18
|
+
function walkGo(node, filePath, symbols, references, imports, parentIndex) {
|
|
19
|
+
switch (node.type) {
|
|
20
|
+
case "function_declaration": {
|
|
21
|
+
const nameNode = node.childForFieldName("name");
|
|
22
|
+
if (nameNode) {
|
|
23
|
+
const sym = {
|
|
24
|
+
name: nameNode.text,
|
|
25
|
+
kind: "function",
|
|
26
|
+
filePath,
|
|
27
|
+
lineStart: node.startPosition.row + 1,
|
|
28
|
+
lineEnd: node.endPosition.row + 1,
|
|
29
|
+
colStart: node.startPosition.column,
|
|
30
|
+
colEnd: node.endPosition.column,
|
|
31
|
+
parentSymbolId: parentIndex,
|
|
32
|
+
isExported: isExportedGo(nameNode.text),
|
|
33
|
+
signature: extractGoFuncSignature(node),
|
|
34
|
+
};
|
|
35
|
+
const idx = symbols.length;
|
|
36
|
+
symbols.push(sym);
|
|
37
|
+
walkGoChildren(node, filePath, symbols, references, imports, idx);
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
break;
|
|
41
|
+
}
|
|
42
|
+
case "method_declaration": {
|
|
43
|
+
const nameNode = node.childForFieldName("name");
|
|
44
|
+
const receiver = node.childForFieldName("receiver");
|
|
45
|
+
if (nameNode) {
|
|
46
|
+
// Extract receiver type name for context
|
|
47
|
+
let receiverType = "";
|
|
48
|
+
if (receiver) {
|
|
49
|
+
// receiver is like (t *Type) or (t Type)
|
|
50
|
+
for (let i = 0; i < receiver.namedChildCount; i++) {
|
|
51
|
+
const param = receiver.namedChild(i);
|
|
52
|
+
const typeNode = param?.childForFieldName("type");
|
|
53
|
+
if (typeNode) {
|
|
54
|
+
receiverType = typeNode.text.replace("*", "");
|
|
55
|
+
break;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
const sig = extractGoFuncSignature(node);
|
|
60
|
+
const sym = {
|
|
61
|
+
name: nameNode.text,
|
|
62
|
+
kind: "method",
|
|
63
|
+
filePath,
|
|
64
|
+
lineStart: node.startPosition.row + 1,
|
|
65
|
+
lineEnd: node.endPosition.row + 1,
|
|
66
|
+
colStart: node.startPosition.column,
|
|
67
|
+
colEnd: node.endPosition.column,
|
|
68
|
+
parentSymbolId: parentIndex,
|
|
69
|
+
isExported: isExportedGo(nameNode.text),
|
|
70
|
+
signature: receiverType ? `(${receiverType}) ${sig}` : sig,
|
|
71
|
+
};
|
|
72
|
+
const idx = symbols.length;
|
|
73
|
+
symbols.push(sym);
|
|
74
|
+
walkGoChildren(node, filePath, symbols, references, imports, idx);
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
break;
|
|
78
|
+
}
|
|
79
|
+
case "type_declaration": {
|
|
80
|
+
// type Foo struct/interface/...
|
|
81
|
+
for (let i = 0; i < node.namedChildCount; i++) {
|
|
82
|
+
const spec = node.namedChild(i);
|
|
83
|
+
if (spec?.type === "type_spec") {
|
|
84
|
+
const nameNode = spec.childForFieldName("name");
|
|
85
|
+
const typeNode = spec.childForFieldName("type");
|
|
86
|
+
if (nameNode) {
|
|
87
|
+
const isInterface = typeNode?.type === "interface_type";
|
|
88
|
+
const isStruct = typeNode?.type === "struct_type";
|
|
89
|
+
const kind = isInterface ? "interface" : isStruct ? "class" : "type";
|
|
90
|
+
const sym = {
|
|
91
|
+
name: nameNode.text,
|
|
92
|
+
kind,
|
|
93
|
+
filePath,
|
|
94
|
+
lineStart: spec.startPosition.row + 1,
|
|
95
|
+
lineEnd: spec.endPosition.row + 1,
|
|
96
|
+
colStart: spec.startPosition.column,
|
|
97
|
+
colEnd: spec.endPosition.column,
|
|
98
|
+
parentSymbolId: parentIndex,
|
|
99
|
+
isExported: isExportedGo(nameNode.text),
|
|
100
|
+
signature: `type ${nameNode.text} ${typeNode?.type === "interface_type" ? "interface" : typeNode?.type === "struct_type" ? "struct" : typeNode?.text ?? ""}`,
|
|
101
|
+
};
|
|
102
|
+
const idx = symbols.length;
|
|
103
|
+
symbols.push(sym);
|
|
104
|
+
// Walk struct/interface body for embedded types
|
|
105
|
+
if (typeNode) {
|
|
106
|
+
walkGoChildren(typeNode, filePath, symbols, references, imports, idx);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
case "const_declaration":
|
|
114
|
+
case "var_declaration": {
|
|
115
|
+
for (let i = 0; i < node.namedChildCount; i++) {
|
|
116
|
+
const spec = node.namedChild(i);
|
|
117
|
+
if (spec?.type === "const_spec" || spec?.type === "var_spec") {
|
|
118
|
+
const nameNode = spec.childForFieldName("name");
|
|
119
|
+
if (nameNode) {
|
|
120
|
+
symbols.push({
|
|
121
|
+
name: nameNode.text,
|
|
122
|
+
kind: "variable",
|
|
123
|
+
filePath,
|
|
124
|
+
lineStart: spec.startPosition.row + 1,
|
|
125
|
+
lineEnd: spec.endPosition.row + 1,
|
|
126
|
+
colStart: spec.startPosition.column,
|
|
127
|
+
colEnd: spec.endPosition.column,
|
|
128
|
+
parentSymbolId: parentIndex,
|
|
129
|
+
isExported: isExportedGo(nameNode.text),
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
case "call_expression": {
|
|
137
|
+
const func = node.childForFieldName("function");
|
|
138
|
+
if (func && parentIndex !== undefined) {
|
|
139
|
+
const name = func.text;
|
|
140
|
+
references.push({
|
|
141
|
+
fromSymbolId: parentIndex,
|
|
142
|
+
toSymbolName: name,
|
|
143
|
+
toSymbolBareName: bareName(name),
|
|
144
|
+
kind: "call",
|
|
145
|
+
line: node.startPosition.row + 1,
|
|
146
|
+
col: node.startPosition.column,
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
break;
|
|
150
|
+
}
|
|
151
|
+
case "composite_literal": {
|
|
152
|
+
// Struct instantiation: Foo{...}
|
|
153
|
+
const typeNode = node.childForFieldName("type");
|
|
154
|
+
if (typeNode && parentIndex !== undefined) {
|
|
155
|
+
references.push({
|
|
156
|
+
fromSymbolId: parentIndex,
|
|
157
|
+
toSymbolName: typeNode.text,
|
|
158
|
+
toSymbolBareName: bareName(typeNode.text),
|
|
159
|
+
kind: "instantiation",
|
|
160
|
+
line: node.startPosition.row + 1,
|
|
161
|
+
col: node.startPosition.column,
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
break;
|
|
165
|
+
}
|
|
166
|
+
case "import_declaration": {
|
|
167
|
+
for (let i = 0; i < node.namedChildCount; i++) {
|
|
168
|
+
const child = node.namedChild(i);
|
|
169
|
+
if (child?.type === "import_spec") {
|
|
170
|
+
const pathNode = child.childForFieldName("path");
|
|
171
|
+
const nameNode = child.childForFieldName("name");
|
|
172
|
+
if (pathNode) {
|
|
173
|
+
const importPath = pathNode.text.replace(/"/g, "");
|
|
174
|
+
const localName = nameNode?.text ?? bareName(importPath);
|
|
175
|
+
imports.push({
|
|
176
|
+
sourcePath: importPath,
|
|
177
|
+
importedName: importPath,
|
|
178
|
+
localName: localName === "." ? "*" : localName,
|
|
179
|
+
isDefault: false,
|
|
180
|
+
isNamespace: nameNode?.text !== ".",
|
|
181
|
+
line: child.startPosition.row + 1,
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
else if (child?.type === "import_spec_list") {
|
|
186
|
+
for (let j = 0; j < child.namedChildCount; j++) {
|
|
187
|
+
const spec = child.namedChild(j);
|
|
188
|
+
if (spec?.type === "import_spec") {
|
|
189
|
+
const pathNode = spec.childForFieldName("path");
|
|
190
|
+
const nameNode = spec.childForFieldName("name");
|
|
191
|
+
if (pathNode) {
|
|
192
|
+
const importPath = pathNode.text.replace(/"/g, "");
|
|
193
|
+
const localName = nameNode?.text ?? bareName(importPath);
|
|
194
|
+
imports.push({
|
|
195
|
+
sourcePath: importPath,
|
|
196
|
+
importedName: importPath,
|
|
197
|
+
localName: localName === "." ? "*" : localName,
|
|
198
|
+
isDefault: false,
|
|
199
|
+
isNamespace: nameNode?.text !== ".",
|
|
200
|
+
line: spec.startPosition.row + 1,
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
case "package_clause": {
|
|
210
|
+
// Track the package name as a symbol
|
|
211
|
+
const nameNode = node.childForFieldName("name");
|
|
212
|
+
if (nameNode) {
|
|
213
|
+
symbols.push({
|
|
214
|
+
name: nameNode.text,
|
|
215
|
+
kind: "variable",
|
|
216
|
+
filePath,
|
|
217
|
+
lineStart: node.startPosition.row + 1,
|
|
218
|
+
lineEnd: node.endPosition.row + 1,
|
|
219
|
+
colStart: node.startPosition.column,
|
|
220
|
+
colEnd: node.endPosition.column,
|
|
221
|
+
isExported: true,
|
|
222
|
+
signature: `package ${nameNode.text}`,
|
|
223
|
+
});
|
|
224
|
+
}
|
|
225
|
+
return;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
// Default: walk children
|
|
229
|
+
walkGoChildren(node, filePath, symbols, references, imports, parentIndex);
|
|
230
|
+
}
|
|
231
|
+
function walkGoChildren(node, filePath, symbols, references, imports, parentIndex) {
|
|
232
|
+
for (let i = 0; i < node.namedChildCount; i++) {
|
|
233
|
+
const child = node.namedChild(i);
|
|
234
|
+
if (child) {
|
|
235
|
+
walkGo(child, filePath, symbols, references, imports, parentIndex);
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
export const goPlugin = {
|
|
240
|
+
id: "go",
|
|
241
|
+
extensions: [".go"],
|
|
242
|
+
getParser: () => goParser,
|
|
243
|
+
walk: walkGo,
|
|
244
|
+
};
|
|
245
|
+
registerLanguage(goPlugin);
|
|
246
|
+
//# sourceMappingURL=lang-go.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lang-go.js","sourceRoot":"","sources":["../../src/indexer/lang-go.ts"],"names":[],"mappings":"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"}
|