@mcp-graph-workflow/mcp-graph 5.28.1 → 5.29.1
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/dist/core/code/analyzer-factory.d.ts +15 -0
- package/dist/core/code/analyzer-factory.d.ts.map +1 -0
- package/dist/core/code/analyzer-factory.js +57 -0
- package/dist/core/code/analyzer-factory.js.map +1 -0
- package/dist/core/code/code-search.d.ts +1 -0
- package/dist/core/code/code-search.d.ts.map +1 -1
- package/dist/core/code/code-search.js +11 -5
- package/dist/core/code/code-search.js.map +1 -1
- package/dist/core/code/code-store.d.ts +1 -0
- package/dist/core/code/code-store.d.ts.map +1 -1
- package/dist/core/code/code-store.js +16 -6
- package/dist/core/code/code-store.js.map +1 -1
- package/dist/core/code/code-types.d.ts +53 -0
- package/dist/core/code/code-types.d.ts.map +1 -1
- package/dist/core/code/code-types.js +15 -0
- package/dist/core/code/code-types.js.map +1 -1
- package/dist/core/code/treesitter/reference-content.d.ts +34 -0
- package/dist/core/code/treesitter/reference-content.d.ts.map +1 -0
- package/dist/core/code/treesitter/reference-content.js +302 -0
- package/dist/core/code/treesitter/reference-content.js.map +1 -0
- package/dist/core/code/treesitter/treesitter-analyzer.d.ts +21 -0
- package/dist/core/code/treesitter/treesitter-analyzer.d.ts.map +1 -0
- package/dist/core/code/treesitter/treesitter-analyzer.js +414 -0
- package/dist/core/code/treesitter/treesitter-analyzer.js.map +1 -0
- package/dist/core/code/treesitter/treesitter-manager.d.ts +32 -0
- package/dist/core/code/treesitter/treesitter-manager.d.ts.map +1 -0
- package/dist/core/code/treesitter/treesitter-manager.js +155 -0
- package/dist/core/code/treesitter/treesitter-manager.js.map +1 -0
- package/dist/core/planner/lifecycle-phase.js +1 -1
- package/dist/core/planner/lifecycle-phase.js.map +1 -1
- package/dist/core/rag/code-context-indexer.d.ts +2 -0
- package/dist/core/rag/code-context-indexer.d.ts.map +1 -1
- package/dist/core/rag/code-context-indexer.js +33 -16
- package/dist/core/rag/code-context-indexer.js.map +1 -1
- package/dist/core/store/migrations.d.ts.map +1 -1
- package/dist/core/store/migrations.js +43 -0
- package/dist/core/store/migrations.js.map +1 -1
- package/dist/mcp/server.js +3 -1
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/tools/reindex-knowledge.d.ts.map +1 -1
- package/dist/mcp/tools/reindex-knowledge.js +9 -2
- package/dist/mcp/tools/reindex-knowledge.js.map +1 -1
- package/package.json +12 -1
|
@@ -0,0 +1,414 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TreeSitterAnalyzer — Multi-language code analyzer using web-tree-sitter.
|
|
3
|
+
* Implements CodeAnalyzer interface. Extracts symbols, relations,
|
|
4
|
+
* docstrings, visibility, and source snippets from any supported language.
|
|
5
|
+
*
|
|
6
|
+
* Uses LANGUAGE_REFERENCES for deterministic, rule-based extraction.
|
|
7
|
+
* AI is never used here — pure AST parsing.
|
|
8
|
+
*/
|
|
9
|
+
import { readFileSync } from "node:fs";
|
|
10
|
+
import path from "node:path";
|
|
11
|
+
import { logger } from "../../utils/logger.js";
|
|
12
|
+
import { TreeSitterManager, resetTreeSitterLoader } from "./treesitter-manager.js";
|
|
13
|
+
import { LANGUAGE_REFERENCES, SUPPORTED_LANGUAGES } from "./reference-content.js";
|
|
14
|
+
export { resetTreeSitterLoader };
|
|
15
|
+
// ── Extension → language mapping ─────────────────────────
|
|
16
|
+
function buildExtensionMap() {
|
|
17
|
+
const map = new Map();
|
|
18
|
+
for (const ref of Object.values(LANGUAGE_REFERENCES)) {
|
|
19
|
+
for (const ext of ref.extensions) {
|
|
20
|
+
map.set(ext, ref.languageId);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
return map;
|
|
24
|
+
}
|
|
25
|
+
const EXTENSION_MAP = buildExtensionMap();
|
|
26
|
+
// ── Symbol extraction helpers ────────────────────────────
|
|
27
|
+
function getNodeName(node) {
|
|
28
|
+
// Try common field names for the symbol name
|
|
29
|
+
const nameNode = node.childForFieldName?.("name");
|
|
30
|
+
if (nameNode)
|
|
31
|
+
return nameNode.text;
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
function getSourceSnippet(node, maxLines = 20) {
|
|
35
|
+
const text = node.text;
|
|
36
|
+
const lines = text.split("\n");
|
|
37
|
+
return lines.slice(0, maxLines).join("\n");
|
|
38
|
+
}
|
|
39
|
+
function getPrecedingComment(node, languageId) {
|
|
40
|
+
const ref = LANGUAGE_REFERENCES[languageId];
|
|
41
|
+
if (!ref)
|
|
42
|
+
return null;
|
|
43
|
+
let sibling = node.previousNamedSibling;
|
|
44
|
+
const commentLines = [];
|
|
45
|
+
while (sibling) {
|
|
46
|
+
const type = sibling.type;
|
|
47
|
+
if (type === "comment" || type === "line_comment" || type === "block_comment") {
|
|
48
|
+
const text = sibling.text;
|
|
49
|
+
if (ref.docstringPattern.commentRegex.test(text)) {
|
|
50
|
+
commentLines.unshift(text);
|
|
51
|
+
sibling = sibling.previousNamedSibling;
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
break;
|
|
56
|
+
}
|
|
57
|
+
if (commentLines.length === 0)
|
|
58
|
+
return null;
|
|
59
|
+
// Clean comment markers
|
|
60
|
+
return commentLines
|
|
61
|
+
.map((line) => line.replace(/^\/\/\/?\s?|^\/\*\*?\s?|\*\/\s?$|^\s*\*\s?|^#\s?|^---?\s?/gm, "").trim())
|
|
62
|
+
.filter(Boolean)
|
|
63
|
+
.join("\n");
|
|
64
|
+
}
|
|
65
|
+
function getPythonDocstring(node) {
|
|
66
|
+
// Python docstrings: first expression_statement > string in body block
|
|
67
|
+
const body = node.childForFieldName?.("body");
|
|
68
|
+
if (!body)
|
|
69
|
+
return null;
|
|
70
|
+
const firstChild = body.firstNamedChild;
|
|
71
|
+
if (!firstChild)
|
|
72
|
+
return null;
|
|
73
|
+
if (firstChild.type === "expression_statement") {
|
|
74
|
+
const stringNode = firstChild.firstNamedChild;
|
|
75
|
+
if (stringNode && stringNode.type === "string") {
|
|
76
|
+
const text = stringNode.text;
|
|
77
|
+
// Strip triple quotes
|
|
78
|
+
return text.replace(/^["']{3}\s*|["']{3}\s*$/g, "").trim();
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
return null;
|
|
82
|
+
}
|
|
83
|
+
function detectVisibility(name, node, languageId) {
|
|
84
|
+
const ref = LANGUAGE_REFERENCES[languageId];
|
|
85
|
+
if (!ref)
|
|
86
|
+
return "public";
|
|
87
|
+
switch (ref.visibilityRules.exportDetection) {
|
|
88
|
+
case "underscore_prefix":
|
|
89
|
+
if (name.startsWith("__") && !name.endsWith("__"))
|
|
90
|
+
return "private";
|
|
91
|
+
if (name.startsWith("_"))
|
|
92
|
+
return "private";
|
|
93
|
+
return "public";
|
|
94
|
+
case "uppercase_first":
|
|
95
|
+
return /^[A-Z]/.test(name) ? "public" : "package";
|
|
96
|
+
case "pub_keyword": {
|
|
97
|
+
// Check for visibility_modifier child
|
|
98
|
+
const visMod = node.children?.find((c) => c.type === "visibility_modifier");
|
|
99
|
+
if (visMod) {
|
|
100
|
+
const text = visMod.text;
|
|
101
|
+
if (text === "pub")
|
|
102
|
+
return "public";
|
|
103
|
+
if (text.includes("crate"))
|
|
104
|
+
return "internal";
|
|
105
|
+
if (text.includes("super"))
|
|
106
|
+
return "protected";
|
|
107
|
+
}
|
|
108
|
+
return "private";
|
|
109
|
+
}
|
|
110
|
+
case "modifier_keyword": {
|
|
111
|
+
// Check for modifiers node or direct visibility_modifier
|
|
112
|
+
const mods = node.children?.find((c) => c.type === "modifiers" || c.type === "modifier" || c.type === "visibility_modifier");
|
|
113
|
+
if (mods) {
|
|
114
|
+
const text = mods.text;
|
|
115
|
+
if (text.includes("public"))
|
|
116
|
+
return "public";
|
|
117
|
+
if (text.includes("private"))
|
|
118
|
+
return "private";
|
|
119
|
+
if (text.includes("protected"))
|
|
120
|
+
return "protected";
|
|
121
|
+
if (text.includes("internal"))
|
|
122
|
+
return "internal";
|
|
123
|
+
}
|
|
124
|
+
return ref.visibilityRules.defaultVisibility;
|
|
125
|
+
}
|
|
126
|
+
case "access_specifier":
|
|
127
|
+
case "static_keyword":
|
|
128
|
+
case "return_table":
|
|
129
|
+
case "visibility_section":
|
|
130
|
+
return ref.visibilityRules.defaultVisibility;
|
|
131
|
+
default:
|
|
132
|
+
return "public";
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
function detectExported(name, languageId, visibility) {
|
|
136
|
+
const ref = LANGUAGE_REFERENCES[languageId];
|
|
137
|
+
if (!ref)
|
|
138
|
+
return true;
|
|
139
|
+
switch (ref.visibilityRules.exportDetection) {
|
|
140
|
+
case "uppercase_first":
|
|
141
|
+
return /^[A-Z]/.test(name);
|
|
142
|
+
case "underscore_prefix":
|
|
143
|
+
return !name.startsWith("_");
|
|
144
|
+
case "pub_keyword":
|
|
145
|
+
return visibility === "public";
|
|
146
|
+
case "modifier_keyword":
|
|
147
|
+
return visibility === "public";
|
|
148
|
+
default:
|
|
149
|
+
return true;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
function extractSymbolsFromNode(node, ctx) {
|
|
153
|
+
const type = node.type;
|
|
154
|
+
const ref = LANGUAGE_REFERENCES[ctx.languageId];
|
|
155
|
+
// ── Symbol extraction by node type ─────────────────
|
|
156
|
+
let symbolKind = null;
|
|
157
|
+
// Map node types to symbol kinds using reference
|
|
158
|
+
if (ref) {
|
|
159
|
+
for (const [kind, nodeType] of Object.entries(ref.symbolNodeTypes)) {
|
|
160
|
+
if (type === nodeType) {
|
|
161
|
+
symbolKind = kind;
|
|
162
|
+
break;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
// Special handling for type_spec in Go (wraps struct_type, interface_type)
|
|
167
|
+
if (ctx.languageId === "go" && type === "type_spec") {
|
|
168
|
+
const typeChild = node.childForFieldName?.("type");
|
|
169
|
+
if (typeChild) {
|
|
170
|
+
if (typeChild.type === "struct_type")
|
|
171
|
+
symbolKind = "struct";
|
|
172
|
+
else if (typeChild.type === "interface_type")
|
|
173
|
+
symbolKind = "interface";
|
|
174
|
+
else
|
|
175
|
+
symbolKind = "type_alias";
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
// Go: type_declaration wraps type_spec
|
|
179
|
+
if (ctx.languageId === "go" && type === "type_declaration") {
|
|
180
|
+
for (const child of node.namedChildren ?? []) {
|
|
181
|
+
extractSymbolsFromNode(child, ctx);
|
|
182
|
+
}
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
// Python decorated_definition — extract the inner definition
|
|
186
|
+
if (ctx.languageId === "python" && type === "decorated_definition") {
|
|
187
|
+
const defNode = node.childForFieldName?.("definition");
|
|
188
|
+
if (defNode) {
|
|
189
|
+
extractSymbolsFromNode(defNode, ctx);
|
|
190
|
+
}
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
if (symbolKind) {
|
|
194
|
+
const name = getNodeName(node);
|
|
195
|
+
if (name) {
|
|
196
|
+
const visibility = detectVisibility(name, node, ctx.languageId);
|
|
197
|
+
const exported = detectExported(name, ctx.languageId, visibility);
|
|
198
|
+
// Docstring extraction
|
|
199
|
+
let docstring = null;
|
|
200
|
+
if (ctx.languageId === "python") {
|
|
201
|
+
docstring = getPythonDocstring(node);
|
|
202
|
+
}
|
|
203
|
+
if (!docstring) {
|
|
204
|
+
docstring = getPrecedingComment(node, ctx.languageId);
|
|
205
|
+
}
|
|
206
|
+
const startLine = (node.startPosition?.row ?? 0) + 1;
|
|
207
|
+
const endLine = (node.endPosition?.row ?? 0) + 1;
|
|
208
|
+
// Determine if it's a method (function inside class)
|
|
209
|
+
let resolvedKind = symbolKind;
|
|
210
|
+
if (symbolKind === "function" && ctx.parentName) {
|
|
211
|
+
resolvedKind = "method";
|
|
212
|
+
}
|
|
213
|
+
ctx.symbols.push({
|
|
214
|
+
name,
|
|
215
|
+
kind: resolvedKind,
|
|
216
|
+
file: ctx.file,
|
|
217
|
+
startLine,
|
|
218
|
+
endLine,
|
|
219
|
+
exported,
|
|
220
|
+
language: ctx.languageId,
|
|
221
|
+
docstring: docstring ?? undefined,
|
|
222
|
+
sourceSnippet: getSourceSnippet(node),
|
|
223
|
+
visibility,
|
|
224
|
+
});
|
|
225
|
+
// Recurse into class/struct bodies for methods
|
|
226
|
+
if (["class", "struct"].includes(symbolKind)) {
|
|
227
|
+
const body = node.childForFieldName?.("body");
|
|
228
|
+
if (body) {
|
|
229
|
+
for (const child of body.namedChildren ?? []) {
|
|
230
|
+
extractSymbolsFromNode(child, { ...ctx, parentName: name });
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
return;
|
|
234
|
+
}
|
|
235
|
+
// Recurse into function body for call detection
|
|
236
|
+
const body = node.childForFieldName?.("body");
|
|
237
|
+
if (body) {
|
|
238
|
+
extractRelationsFromSubtree(body, ctx, name);
|
|
239
|
+
}
|
|
240
|
+
return;
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
// ── Relation extraction ────────────────────────────
|
|
244
|
+
// Imports
|
|
245
|
+
if (ref && ref.importNodeTypes.includes(type)) {
|
|
246
|
+
const importTarget = extractImportTarget(node, ctx.languageId);
|
|
247
|
+
if (importTarget) {
|
|
248
|
+
ctx.relations.push({
|
|
249
|
+
fromSymbol: ctx.file,
|
|
250
|
+
toSymbol: importTarget,
|
|
251
|
+
type: "imports",
|
|
252
|
+
file: ctx.file,
|
|
253
|
+
line: (node.startPosition?.row ?? 0) + 1,
|
|
254
|
+
});
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
// Calls (function/method invocations)
|
|
258
|
+
if (type === "call" || type === "call_expression" || type === "method_invocation" || type === "function_call") {
|
|
259
|
+
const callTarget = extractCallTarget(node);
|
|
260
|
+
if (callTarget) {
|
|
261
|
+
ctx.relations.push({
|
|
262
|
+
fromSymbol: ctx.parentName ?? ctx.file,
|
|
263
|
+
toSymbol: callTarget,
|
|
264
|
+
type: "calls",
|
|
265
|
+
file: ctx.file,
|
|
266
|
+
line: (node.startPosition?.row ?? 0) + 1,
|
|
267
|
+
});
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
// ── Recurse into children ──────────────────────────
|
|
271
|
+
for (const child of node.namedChildren ?? []) {
|
|
272
|
+
extractSymbolsFromNode(child, ctx);
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
/** Recursively extract only relations (calls) from a subtree — used for function bodies. */
|
|
276
|
+
function extractRelationsFromSubtree(node, ctx, scopeName) {
|
|
277
|
+
const type = node.type;
|
|
278
|
+
if (type === "call" || type === "call_expression" || type === "method_invocation" || type === "function_call") {
|
|
279
|
+
const callTarget = extractCallTarget(node);
|
|
280
|
+
if (callTarget) {
|
|
281
|
+
ctx.relations.push({
|
|
282
|
+
fromSymbol: scopeName,
|
|
283
|
+
toSymbol: callTarget,
|
|
284
|
+
type: "calls",
|
|
285
|
+
file: ctx.file,
|
|
286
|
+
line: (node.startPosition?.row ?? 0) + 1,
|
|
287
|
+
});
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
for (const child of node.namedChildren ?? []) {
|
|
291
|
+
extractRelationsFromSubtree(child, ctx, scopeName);
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
function extractImportTarget(node, languageId) {
|
|
295
|
+
if (languageId === "python") {
|
|
296
|
+
// import os → module_name field or name
|
|
297
|
+
const moduleName = node.childForFieldName?.("module_name");
|
|
298
|
+
if (moduleName)
|
|
299
|
+
return moduleName.text;
|
|
300
|
+
const nameNode = node.childForFieldName?.("name");
|
|
301
|
+
if (nameNode)
|
|
302
|
+
return nameNode.text;
|
|
303
|
+
}
|
|
304
|
+
if (languageId === "go") {
|
|
305
|
+
// import_spec → path field
|
|
306
|
+
for (const child of node.namedChildren ?? []) {
|
|
307
|
+
if (child.type === "import_spec") {
|
|
308
|
+
const pathNode = child.childForFieldName?.("path");
|
|
309
|
+
if (pathNode)
|
|
310
|
+
return pathNode.text.replace(/"/g, "");
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
if (languageId === "rust") {
|
|
315
|
+
const arg = node.childForFieldName?.("argument");
|
|
316
|
+
if (arg)
|
|
317
|
+
return arg.text;
|
|
318
|
+
}
|
|
319
|
+
if (languageId === "java" || languageId === "kotlin") {
|
|
320
|
+
const nameNode = node.childForFieldName?.("name") ?? node.namedChildren?.[0];
|
|
321
|
+
if (nameNode)
|
|
322
|
+
return nameNode.text;
|
|
323
|
+
}
|
|
324
|
+
// Generic fallback: first named child text
|
|
325
|
+
const first = node.firstNamedChild;
|
|
326
|
+
if (first)
|
|
327
|
+
return first.text;
|
|
328
|
+
return null;
|
|
329
|
+
}
|
|
330
|
+
function extractCallTarget(node) {
|
|
331
|
+
const funcNode = node.childForFieldName?.("function");
|
|
332
|
+
if (funcNode) {
|
|
333
|
+
// Simple identifier: foo()
|
|
334
|
+
if (funcNode.type === "identifier")
|
|
335
|
+
return funcNode.text;
|
|
336
|
+
// Attribute access: obj.method() — extract method name
|
|
337
|
+
const attr = funcNode.childForFieldName?.("attribute");
|
|
338
|
+
if (attr)
|
|
339
|
+
return attr.text;
|
|
340
|
+
// Property: obj.method → field
|
|
341
|
+
const field = funcNode.childForFieldName?.("field");
|
|
342
|
+
if (field)
|
|
343
|
+
return field.text;
|
|
344
|
+
}
|
|
345
|
+
// Java: method_invocation has "name" field
|
|
346
|
+
const nameNode = node.childForFieldName?.("name");
|
|
347
|
+
if (nameNode && nameNode.type === "identifier")
|
|
348
|
+
return nameNode.text;
|
|
349
|
+
return null;
|
|
350
|
+
}
|
|
351
|
+
// ── TreeSitterAnalyzer class ─────────────────────────────
|
|
352
|
+
export class TreeSitterAnalyzer {
|
|
353
|
+
manager;
|
|
354
|
+
languages;
|
|
355
|
+
extensions;
|
|
356
|
+
constructor() {
|
|
357
|
+
this.manager = new TreeSitterManager();
|
|
358
|
+
this.languages = [...SUPPORTED_LANGUAGES];
|
|
359
|
+
this.extensions = [...new Set(Object.values(LANGUAGE_REFERENCES).flatMap((r) => r.extensions))];
|
|
360
|
+
}
|
|
361
|
+
/** Initialize the tree-sitter WASM runtime. Must be called before analyzeFile. */
|
|
362
|
+
async initialize() {
|
|
363
|
+
await this.manager.initialize();
|
|
364
|
+
}
|
|
365
|
+
async analyzeFile(filePath, basePath) {
|
|
366
|
+
const relativePath = path.relative(basePath, filePath);
|
|
367
|
+
const ext = path.extname(filePath);
|
|
368
|
+
const languageId = EXTENSION_MAP.get(ext);
|
|
369
|
+
if (!languageId) {
|
|
370
|
+
return { file: relativePath, symbols: [], relations: [] };
|
|
371
|
+
}
|
|
372
|
+
const parser = await this.manager.getParser(languageId);
|
|
373
|
+
if (!parser) {
|
|
374
|
+
logger.debug("treesitter-analyzer:no-parser", { languageId, file: relativePath });
|
|
375
|
+
return { file: relativePath, symbols: [], relations: [] };
|
|
376
|
+
}
|
|
377
|
+
let content;
|
|
378
|
+
try {
|
|
379
|
+
content = readFileSync(filePath, "utf-8");
|
|
380
|
+
}
|
|
381
|
+
catch {
|
|
382
|
+
logger.debug("treesitter-analyzer:read-error", { file: relativePath });
|
|
383
|
+
return { file: relativePath, symbols: [], relations: [] };
|
|
384
|
+
}
|
|
385
|
+
const tree = parser.parse(content);
|
|
386
|
+
if (!tree) {
|
|
387
|
+
return { file: relativePath, symbols: [], relations: [] };
|
|
388
|
+
}
|
|
389
|
+
const ctx = {
|
|
390
|
+
languageId,
|
|
391
|
+
file: relativePath,
|
|
392
|
+
symbols: [],
|
|
393
|
+
relations: [],
|
|
394
|
+
content,
|
|
395
|
+
parentName: null,
|
|
396
|
+
};
|
|
397
|
+
// Walk the AST root
|
|
398
|
+
for (const child of tree.rootNode.namedChildren ?? []) {
|
|
399
|
+
extractSymbolsFromNode(child, ctx);
|
|
400
|
+
}
|
|
401
|
+
logger.debug("treesitter-analyzer:analyzed", {
|
|
402
|
+
file: relativePath,
|
|
403
|
+
languageId,
|
|
404
|
+
symbols: String(ctx.symbols.length),
|
|
405
|
+
relations: String(ctx.relations.length),
|
|
406
|
+
});
|
|
407
|
+
return {
|
|
408
|
+
file: relativePath,
|
|
409
|
+
symbols: ctx.symbols,
|
|
410
|
+
relations: ctx.relations,
|
|
411
|
+
};
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
//# sourceMappingURL=treesitter-analyzer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"treesitter-analyzer.js","sourceRoot":"","sources":["../../../../src/core/code/treesitter/treesitter-analyzer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TreeSitterManager — Lazy-loads web-tree-sitter WASM runtime and
|
|
3
|
+
* caches Parser instances per language. Grammars are loaded on-demand
|
|
4
|
+
* from npm packages (tree-sitter-{lang}).
|
|
5
|
+
*
|
|
6
|
+
* Pattern: same lazy-loading approach as ts-analyzer.ts loadTypeScript().
|
|
7
|
+
* Graceful degradation: missing grammar → returns null, never throws.
|
|
8
|
+
*/
|
|
9
|
+
type ParserInstance = any;
|
|
10
|
+
/** Check if web-tree-sitter is available at runtime. */
|
|
11
|
+
export declare function isTreeSitterAvailable(): Promise<boolean>;
|
|
12
|
+
/** Reset loader state (for testing). */
|
|
13
|
+
export declare function resetTreeSitterLoader(): void;
|
|
14
|
+
export declare class TreeSitterManager {
|
|
15
|
+
private parsers;
|
|
16
|
+
private failedLanguages;
|
|
17
|
+
/** Initialize the WASM runtime. Safe to call multiple times. */
|
|
18
|
+
initialize(): Promise<void>;
|
|
19
|
+
/**
|
|
20
|
+
* Get a parser for a specific language. Returns null if:
|
|
21
|
+
* - web-tree-sitter is not available
|
|
22
|
+
* - Grammar WASM not installed for this language
|
|
23
|
+
* - Language is not in the registry
|
|
24
|
+
*/
|
|
25
|
+
getParser(languageId: string): Promise<ParserInstance | null>;
|
|
26
|
+
/** Check if a language has a grammar registered. */
|
|
27
|
+
isLanguageSupported(languageId: string): boolean;
|
|
28
|
+
/** Get list of all registered language IDs. */
|
|
29
|
+
getSupportedLanguages(): string[];
|
|
30
|
+
}
|
|
31
|
+
export {};
|
|
32
|
+
//# sourceMappingURL=treesitter-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"treesitter-manager.d.ts","sourceRoot":"","sources":["../../../../src/core/code/treesitter/treesitter-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAWH,KAAK,cAAc,GAAG,GAAG,CAAC;AAsD1B,wDAAwD;AACxD,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,OAAO,CAAC,CAG9D;AAED,wCAAwC;AACxC,wBAAgB,qBAAqB,IAAI,IAAI,CAG5C;AA4BD,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,OAAO,CAA0C;IACzD,OAAO,CAAC,eAAe,CAA0B;IAEjD,gEAAgE;IAC1D,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAIjC;;;;;OAKG;IACG,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAqDnE,oDAAoD;IACpD,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO;IAIhD,+CAA+C;IAC/C,qBAAqB,IAAI,MAAM,EAAE;CAGlC"}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TreeSitterManager — Lazy-loads web-tree-sitter WASM runtime and
|
|
3
|
+
* caches Parser instances per language. Grammars are loaded on-demand
|
|
4
|
+
* from npm packages (tree-sitter-{lang}).
|
|
5
|
+
*
|
|
6
|
+
* Pattern: same lazy-loading approach as ts-analyzer.ts loadTypeScript().
|
|
7
|
+
* Graceful degradation: missing grammar → returns null, never throws.
|
|
8
|
+
*/
|
|
9
|
+
import { join } from "node:path";
|
|
10
|
+
import { existsSync } from "node:fs";
|
|
11
|
+
import { logger } from "../../utils/logger.js";
|
|
12
|
+
// ── Grammar registry ─────────────────────────────────────
|
|
13
|
+
/** Maps languageId → npm package name + wasm file name */
|
|
14
|
+
const GRAMMAR_REGISTRY = {
|
|
15
|
+
python: { pkg: "tree-sitter-python", wasm: "tree-sitter-python.wasm" },
|
|
16
|
+
go: { pkg: "tree-sitter-go", wasm: "tree-sitter-go.wasm" },
|
|
17
|
+
rust: { pkg: "tree-sitter-rust", wasm: "tree-sitter-rust.wasm" },
|
|
18
|
+
java: { pkg: "tree-sitter-java", wasm: "tree-sitter-java.wasm" },
|
|
19
|
+
c: { pkg: "tree-sitter-c", wasm: "tree-sitter-c.wasm" },
|
|
20
|
+
cpp: { pkg: "tree-sitter-cpp", wasm: "tree-sitter-cpp.wasm" },
|
|
21
|
+
ruby: { pkg: "tree-sitter-ruby", wasm: "tree-sitter-ruby.wasm" },
|
|
22
|
+
php: { pkg: "tree-sitter-php", wasm: "tree-sitter-php.wasm" },
|
|
23
|
+
csharp: { pkg: "tree-sitter-c-sharp", wasm: "tree-sitter-c_sharp.wasm" },
|
|
24
|
+
lua: { pkg: "tree-sitter-lua", wasm: "tree-sitter-lua.wasm" },
|
|
25
|
+
};
|
|
26
|
+
let tsModule = null;
|
|
27
|
+
let initAttempted = false;
|
|
28
|
+
async function loadWebTreeSitter() {
|
|
29
|
+
if (tsModule)
|
|
30
|
+
return tsModule;
|
|
31
|
+
if (initAttempted)
|
|
32
|
+
return null;
|
|
33
|
+
initAttempted = true;
|
|
34
|
+
try {
|
|
35
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
36
|
+
const mod = await import("web-tree-sitter");
|
|
37
|
+
// web-tree-sitter exports { Parser, Language, ... } — init() is on Parser
|
|
38
|
+
const ParserClass = mod.Parser ?? mod.default;
|
|
39
|
+
const LanguageClass = mod.Language;
|
|
40
|
+
await ParserClass.init();
|
|
41
|
+
tsModule = { ParserClass, LanguageClass };
|
|
42
|
+
logger.info("treesitter-manager:init", { message: "web-tree-sitter WASM runtime loaded" });
|
|
43
|
+
return tsModule;
|
|
44
|
+
}
|
|
45
|
+
catch (err) {
|
|
46
|
+
logger.warn("treesitter-manager:unavailable", {
|
|
47
|
+
message: "web-tree-sitter not found — multi-language code analysis disabled",
|
|
48
|
+
error: String(err),
|
|
49
|
+
});
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
/** Check if web-tree-sitter is available at runtime. */
|
|
54
|
+
export async function isTreeSitterAvailable() {
|
|
55
|
+
const result = await loadWebTreeSitter();
|
|
56
|
+
return result !== null;
|
|
57
|
+
}
|
|
58
|
+
/** Reset loader state (for testing). */
|
|
59
|
+
export function resetTreeSitterLoader() {
|
|
60
|
+
tsModule = null;
|
|
61
|
+
initAttempted = false;
|
|
62
|
+
}
|
|
63
|
+
// ── Resolve grammar WASM path ────────────────────────────
|
|
64
|
+
function resolveGrammarPath(languageId) {
|
|
65
|
+
const entry = GRAMMAR_REGISTRY[languageId];
|
|
66
|
+
if (!entry)
|
|
67
|
+
return null;
|
|
68
|
+
try {
|
|
69
|
+
// Resolve the package path via require.resolve
|
|
70
|
+
const pkgMain = require.resolve(`${entry.pkg}/package.json`);
|
|
71
|
+
const pkgDir = pkgMain.replace(/[/\\]package\.json$/, "");
|
|
72
|
+
const wasmPath = join(pkgDir, entry.wasm);
|
|
73
|
+
if (existsSync(wasmPath)) {
|
|
74
|
+
return wasmPath;
|
|
75
|
+
}
|
|
76
|
+
logger.debug("treesitter-manager:wasm-not-found", { languageId, wasmPath });
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
logger.debug("treesitter-manager:pkg-not-found", { languageId, pkg: entry.pkg });
|
|
81
|
+
return null;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
// ── TreeSitterManager class ──────────────────────────────
|
|
85
|
+
export class TreeSitterManager {
|
|
86
|
+
parsers = new Map();
|
|
87
|
+
failedLanguages = new Set();
|
|
88
|
+
/** Initialize the WASM runtime. Safe to call multiple times. */
|
|
89
|
+
async initialize() {
|
|
90
|
+
await loadWebTreeSitter();
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Get a parser for a specific language. Returns null if:
|
|
94
|
+
* - web-tree-sitter is not available
|
|
95
|
+
* - Grammar WASM not installed for this language
|
|
96
|
+
* - Language is not in the registry
|
|
97
|
+
*/
|
|
98
|
+
async getParser(languageId) {
|
|
99
|
+
// Check cache
|
|
100
|
+
const cached = this.parsers.get(languageId);
|
|
101
|
+
if (cached)
|
|
102
|
+
return cached;
|
|
103
|
+
// Already failed for this language — don't retry
|
|
104
|
+
if (this.failedLanguages.has(languageId))
|
|
105
|
+
return null;
|
|
106
|
+
// Not in registry
|
|
107
|
+
if (!GRAMMAR_REGISTRY[languageId]) {
|
|
108
|
+
this.failedLanguages.add(languageId);
|
|
109
|
+
return null;
|
|
110
|
+
}
|
|
111
|
+
// Load WASM runtime
|
|
112
|
+
const wts = await loadWebTreeSitter();
|
|
113
|
+
if (!wts)
|
|
114
|
+
return null;
|
|
115
|
+
// Resolve grammar path
|
|
116
|
+
const wasmPath = resolveGrammarPath(languageId);
|
|
117
|
+
if (!wasmPath) {
|
|
118
|
+
this.failedLanguages.add(languageId);
|
|
119
|
+
logger.info("treesitter-manager:grammar-unavailable", {
|
|
120
|
+
languageId,
|
|
121
|
+
message: `Grammar for ${languageId} not installed — skipping`,
|
|
122
|
+
});
|
|
123
|
+
return null;
|
|
124
|
+
}
|
|
125
|
+
try {
|
|
126
|
+
const language = await wts.LanguageClass.load(wasmPath);
|
|
127
|
+
const parser = new wts.ParserClass();
|
|
128
|
+
parser.setLanguage(language);
|
|
129
|
+
// Cache the parser
|
|
130
|
+
this.parsers.set(languageId, parser);
|
|
131
|
+
logger.info("treesitter-manager:parser-loaded", {
|
|
132
|
+
languageId,
|
|
133
|
+
wasmPath,
|
|
134
|
+
});
|
|
135
|
+
return parser;
|
|
136
|
+
}
|
|
137
|
+
catch (err) {
|
|
138
|
+
this.failedLanguages.add(languageId);
|
|
139
|
+
logger.warn("treesitter-manager:parser-load-failed", {
|
|
140
|
+
languageId,
|
|
141
|
+
error: String(err),
|
|
142
|
+
});
|
|
143
|
+
return null;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
/** Check if a language has a grammar registered. */
|
|
147
|
+
isLanguageSupported(languageId) {
|
|
148
|
+
return languageId in GRAMMAR_REGISTRY;
|
|
149
|
+
}
|
|
150
|
+
/** Get list of all registered language IDs. */
|
|
151
|
+
getSupportedLanguages() {
|
|
152
|
+
return Object.keys(GRAMMAR_REGISTRY);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=treesitter-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"treesitter-manager.js","sourceRoot":"","sources":["../../../../src/core/code/treesitter/treesitter-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAW/C,4DAA4D;AAE5D,0DAA0D;AAC1D,MAAM,gBAAgB,GAAkD;IACtE,MAAM,EAAG,EAAE,GAAG,EAAE,oBAAoB,EAAG,IAAI,EAAE,yBAAyB,EAAE;IACxE,EAAE,EAAO,EAAE,GAAG,EAAE,gBAAgB,EAAO,IAAI,EAAE,qBAAqB,EAAE;IACpE,IAAI,EAAK,EAAE,GAAG,EAAE,kBAAkB,EAAK,IAAI,EAAE,uBAAuB,EAAE;IACtE,IAAI,EAAK,EAAE,GAAG,EAAE,kBAAkB,EAAK,IAAI,EAAE,uBAAuB,EAAE;IACtE,CAAC,EAAQ,EAAE,GAAG,EAAE,eAAe,EAAQ,IAAI,EAAE,oBAAoB,EAAE;IACnE,GAAG,EAAM,EAAE,GAAG,EAAE,iBAAiB,EAAM,IAAI,EAAE,sBAAsB,EAAE;IACrE,IAAI,EAAK,EAAE,GAAG,EAAE,kBAAkB,EAAK,IAAI,EAAE,uBAAuB,EAAE;IACtE,GAAG,EAAM,EAAE,GAAG,EAAE,iBAAiB,EAAM,IAAI,EAAE,sBAAsB,EAAE;IACrE,MAAM,EAAG,EAAE,GAAG,EAAE,qBAAqB,EAAE,IAAI,EAAE,0BAA0B,EAAE;IACzE,GAAG,EAAM,EAAE,GAAG,EAAE,iBAAiB,EAAM,IAAI,EAAE,sBAAsB,EAAE;CACtE,CAAC;AASF,IAAI,QAAQ,GAA4B,IAAI,CAAC;AAC7C,IAAI,aAAa,GAAG,KAAK,CAAC;AAE1B,KAAK,UAAU,iBAAiB;IAC9B,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAC9B,IAAI,aAAa;QAAE,OAAO,IAAI,CAAC;IAC/B,aAAa,GAAG,IAAI,CAAC;IAErB,IAAI,CAAC;QACH,8DAA8D;QAC9D,MAAM,GAAG,GAAQ,MAAM,MAAM,CAAC,iBAAiB,CAAC,CAAC;QACjD,0EAA0E;QAC1E,MAAM,WAAW,GAAG,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,OAAO,CAAC;QAC9C,MAAM,aAAa,GAAG,GAAG,CAAC,QAAQ,CAAC;QACnC,MAAM,WAAW,CAAC,IAAI,EAAE,CAAC;QACzB,QAAQ,GAAG,EAAE,WAAW,EAAE,aAAa,EAAE,CAAC;QAC1C,MAAM,CAAC,IAAI,CAAC,yBAAyB,EAAE,EAAE,OAAO,EAAE,qCAAqC,EAAE,CAAC,CAAC;QAC3F,OAAO,QAAQ,CAAC;IAClB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,IAAI,CAAC,gCAAgC,EAAE;YAC5C,OAAO,EAAE,mEAAmE;YAC5E,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC;SACnB,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,wDAAwD;AACxD,MAAM,CAAC,KAAK,UAAU,qBAAqB;IACzC,MAAM,MAAM,GAAG,MAAM,iBAAiB,EAAE,CAAC;IACzC,OAAO,MAAM,KAAK,IAAI,CAAC;AACzB,CAAC;AAED,wCAAwC;AACxC,MAAM,UAAU,qBAAqB;IACnC,QAAQ,GAAG,IAAI,CAAC;IAChB,aAAa,GAAG,KAAK,CAAC;AACxB,CAAC;AAED,4DAA4D;AAE5D,SAAS,kBAAkB,CAAC,UAAkB;IAC5C,MAAM,KAAK,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAC;IAC3C,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IAExB,IAAI,CAAC;QACH,+CAA+C;QAC/C,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC,GAAG,eAAe,CAAC,CAAC;QAC7D,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,qBAAqB,EAAE,EAAE,CAAC,CAAC;QAC1D,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAE1C,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YACzB,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,MAAM,CAAC,KAAK,CAAC,mCAAmC,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC5E,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,CAAC,KAAK,CAAC,kCAAkC,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;QACjF,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,4DAA4D;AAE5D,MAAM,OAAO,iBAAiB;IACpB,OAAO,GAAgC,IAAI,GAAG,EAAE,CAAC;IACjD,eAAe,GAAgB,IAAI,GAAG,EAAE,CAAC;IAEjD,gEAAgE;IAChE,KAAK,CAAC,UAAU;QACd,MAAM,iBAAiB,EAAE,CAAC;IAC5B,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,SAAS,CAAC,UAAkB;QAChC,cAAc;QACd,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAC5C,IAAI,MAAM;YAAE,OAAO,MAAM,CAAC;QAE1B,iDAAiD;QACjD,IAAI,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,UAAU,CAAC;YAAE,OAAO,IAAI,CAAC;QAEtD,kBAAkB;QAClB,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC,EAAE,CAAC;YAClC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YACrC,OAAO,IAAI,CAAC;QACd,CAAC;QAED,oBAAoB;QACpB,MAAM,GAAG,GAAG,MAAM,iBAAiB,EAAE,CAAC;QACtC,IAAI,CAAC,GAAG;YAAE,OAAO,IAAI,CAAC;QAEtB,uBAAuB;QACvB,MAAM,QAAQ,GAAG,kBAAkB,CAAC,UAAU,CAAC,CAAC;QAChD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YACrC,MAAM,CAAC,IAAI,CAAC,wCAAwC,EAAE;gBACpD,UAAU;gBACV,OAAO,EAAE,eAAe,UAAU,2BAA2B;aAC9D,CAAC,CAAC;YACH,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,CAAC;YACH,MAAM,QAAQ,GAAqB,MAAM,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC1E,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,WAAW,EAAE,CAAC;YACrC,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;YAE7B,mBAAmB;YACnB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;YAErC,MAAM,CAAC,IAAI,CAAC,kCAAkC,EAAE;gBAC9C,UAAU;gBACV,QAAQ;aACT,CAAC,CAAC;YAEH,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YACrC,MAAM,CAAC,IAAI,CAAC,uCAAuC,EAAE;gBACnD,UAAU;gBACV,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC;aACnB,CAAC,CAAC;YACH,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,oDAAoD;IACpD,mBAAmB,CAAC,UAAkB;QACpC,OAAO,UAAU,IAAI,gBAAgB,CAAC;IACxC,CAAC;IAED,+CAA+C;IAC/C,qBAAqB;QACnB,OAAO,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IACvC,CAAC;CACF"}
|
|
@@ -412,7 +412,7 @@ export const PHASE_PREREQUISITES = {
|
|
|
412
412
|
triggerCondition: (args) => args.status === "done",
|
|
413
413
|
requiredTools: [
|
|
414
414
|
{ tool: "context", scope: "node" },
|
|
415
|
-
{ tool: "rag_context", scope: "
|
|
415
|
+
{ tool: "rag_context", scope: "project" },
|
|
416
416
|
{ tool: "analyze", args: "implement_done", scope: "node" },
|
|
417
417
|
],
|
|
418
418
|
description: "Antes de done: chamar `context` + `rag_context` + `analyze(implement_done)`",
|