@vetala/vetala 0.4.1-dev → 0.5.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/README.md +16 -22
- package/dist/src/agent.d.ts +5 -0
- package/dist/src/agent.js +26 -35
- package/dist/src/agent.js.map +1 -1
- package/dist/src/app-meta.d.ts +1 -1
- package/dist/src/app-meta.js +1 -1
- package/dist/src/app-meta.js.map +1 -1
- package/dist/src/cli.js +10 -2
- package/dist/src/cli.js.map +1 -1
- package/dist/src/config.d.ts +2 -0
- package/dist/src/config.js +294 -24
- package/dist/src/config.js.map +1 -1
- package/dist/src/context-files.d.ts +3 -0
- package/dist/src/context-files.js +127 -0
- package/dist/src/context-files.js.map +1 -0
- package/dist/src/context-memory.d.ts +2 -2
- package/dist/src/context-memory.js +34 -26
- package/dist/src/context-memory.js.map +1 -1
- package/dist/src/edit-history.d.ts +2 -2
- package/dist/src/edit-history.js +3 -3
- package/dist/src/edit-history.js.map +1 -1
- package/dist/src/edits/diff.d.ts +2 -1
- package/dist/src/edits/diff.js +12 -1
- package/dist/src/edits/diff.js.map +1 -1
- package/dist/src/history-store.d.ts +2 -0
- package/dist/src/history-store.js +69 -0
- package/dist/src/history-store.js.map +1 -0
- package/dist/src/ipc-backend.js +215 -29
- package/dist/src/ipc-backend.js.map +1 -1
- package/dist/src/ipc-ui.d.ts +2 -1
- package/dist/src/ipc-ui.js +19 -2
- package/dist/src/ipc-ui.js.map +1 -1
- package/dist/src/memories/pipeline.d.ts +3 -0
- package/dist/src/memories/pipeline.js +376 -0
- package/dist/src/memories/pipeline.js.map +1 -0
- package/dist/src/terminal-ui.js +4 -0
- package/dist/src/terminal-ui.js.map +1 -1
- package/dist/src/tools/advanced.js +16 -3
- package/dist/src/tools/advanced.js.map +1 -1
- package/dist/src/tools/filesystem.js +8 -6
- package/dist/src/tools/filesystem.js.map +1 -1
- package/dist/src/tools/languages.d.ts +14 -0
- package/dist/src/tools/languages.js +249 -0
- package/dist/src/tools/languages.js.map +1 -0
- package/dist/src/tools/lsp.js +156 -44
- package/dist/src/tools/lsp.js.map +1 -1
- package/dist/src/tools/repo-search.d.ts +3 -0
- package/dist/src/tools/repo-search.js +14 -2
- package/dist/src/tools/repo-search.js.map +1 -1
- package/dist/src/tools/tree-sitter-check.d.ts +12 -0
- package/dist/src/tools/tree-sitter-check.js +153 -0
- package/dist/src/tools/tree-sitter-check.js.map +1 -0
- package/dist/src/types.d.ts +47 -1
- package/dist/src/xdg.d.ts +6 -0
- package/dist/src/xdg.js +13 -2
- package/dist/src/xdg.js.map +1 -1
- package/package.json +3 -2
- package/tui/vetala-darwin-arm64 +0 -0
- package/tui/vetala-darwin-x64 +0 -0
- package/tui/vetala-linux-arm64 +0 -0
- package/tui/vetala-linux-x64 +0 -0
- package/tui/vetala-win32-arm64.exe +0 -0
- package/tui/vetala-win32-x64.exe +0 -0
package/dist/src/tools/lsp.js
CHANGED
|
@@ -1,60 +1,131 @@
|
|
|
1
|
-
import { readFile,
|
|
1
|
+
import { readFile, readdir } from "node:fs/promises";
|
|
2
2
|
import { runShellCommand } from "../process-utils.js";
|
|
3
3
|
import { searchRepo } from "./repo-search.js";
|
|
4
|
+
import { detectLanguageByProject, detectLanguageByExtension, LANGUAGES } from "./languages.js";
|
|
5
|
+
import { checkSyntaxWithTreeSitter, formatDiagnostics } from "./tree-sitter-check.js";
|
|
4
6
|
import path from "node:path";
|
|
5
7
|
export function createLspTools() {
|
|
6
8
|
return [getDiagnosticsTool, findReferencesTool, listExportsTool];
|
|
7
9
|
}
|
|
10
|
+
// ---------------------------------------------------------------------------
|
|
11
|
+
// Utilities
|
|
12
|
+
// ---------------------------------------------------------------------------
|
|
13
|
+
/**
|
|
14
|
+
* Check whether a CLI binary is available on this machine.
|
|
15
|
+
* Uses `which` on Unix or `where` on Windows — fully cross-platform.
|
|
16
|
+
*/
|
|
17
|
+
async function commandExists(name) {
|
|
18
|
+
const checkCmd = process.platform === "win32" ? `where ${name}` : `which ${name}`;
|
|
19
|
+
try {
|
|
20
|
+
const result = await runShellCommand(checkCmd, { cwd: ".", timeoutMs: 5000, noPty: true });
|
|
21
|
+
return result.exitCode === 0;
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
// ---------------------------------------------------------------------------
|
|
28
|
+
// get_diagnostics — Two-tier: native toolchain → tree-sitter fallback
|
|
29
|
+
// ---------------------------------------------------------------------------
|
|
8
30
|
const getDiagnosticsTool = {
|
|
9
31
|
name: "get_diagnostics",
|
|
10
|
-
description: "Get compiler errors and warnings for the project.
|
|
32
|
+
description: "Get compiler errors and warnings for the project. " +
|
|
33
|
+
"Supports TypeScript, JavaScript, Go, Python, Rust, C, C++, Java, and Ruby. " +
|
|
34
|
+
"Uses the native toolchain when available; falls back to tree-sitter syntax checking otherwise.",
|
|
11
35
|
jsonSchema: {
|
|
12
36
|
type: "object",
|
|
13
37
|
properties: {},
|
|
14
38
|
additionalProperties: false
|
|
15
39
|
},
|
|
16
40
|
readOnly: true,
|
|
17
|
-
async execute(
|
|
18
|
-
//
|
|
19
|
-
const
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
}
|
|
25
|
-
catch {
|
|
26
|
-
return false;
|
|
27
|
-
}
|
|
28
|
-
};
|
|
29
|
-
let cmd = "";
|
|
30
|
-
if (await hasFile("tsconfig.json")) {
|
|
31
|
-
cmd = "npx tsc --noEmit";
|
|
41
|
+
async execute(_rawArgs, context) {
|
|
42
|
+
// 1. Scan workspace for project marker files
|
|
43
|
+
const existingFiles = new Set();
|
|
44
|
+
try {
|
|
45
|
+
const entries = await readdir(context.workspaceRoot);
|
|
46
|
+
for (const e of entries)
|
|
47
|
+
existingFiles.add(e);
|
|
32
48
|
}
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
49
|
+
catch {
|
|
50
|
+
return {
|
|
51
|
+
summary: "Cannot read workspace",
|
|
52
|
+
content: "Failed to list workspace root directory.",
|
|
53
|
+
isError: true
|
|
54
|
+
};
|
|
38
55
|
}
|
|
39
|
-
|
|
56
|
+
const lang = detectLanguageByProject(existingFiles);
|
|
57
|
+
if (!lang) {
|
|
58
|
+
const supported = LANGUAGES.map(l => l.projectFiles.join("/")).join(", ");
|
|
40
59
|
return {
|
|
41
60
|
summary: "No supported project type detected",
|
|
42
|
-
content:
|
|
61
|
+
content: `Could not detect a project type. Looked for: ${supported}.\n` +
|
|
62
|
+
"Make sure you are in a project root with a recognizable config file.",
|
|
43
63
|
isError: true
|
|
44
64
|
};
|
|
45
65
|
}
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
66
|
+
// 2. Tier 1 — try native toolchain if the binary is installed
|
|
67
|
+
if (lang.nativeCheck) {
|
|
68
|
+
const binAvailable = await commandExists(lang.nativeCheck.binary);
|
|
69
|
+
if (binAvailable) {
|
|
70
|
+
return runNativeCheck(lang, context.workspaceRoot);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
// 3. Tier 2 — tree-sitter fallback (zero external deps)
|
|
74
|
+
if (lang.treeSitterWasmUrl) {
|
|
75
|
+
return runTreeSitterCheck(lang, context.workspaceRoot);
|
|
50
76
|
}
|
|
77
|
+
// 4. No checker available at all for this language
|
|
51
78
|
return {
|
|
52
|
-
summary: `
|
|
53
|
-
content:
|
|
54
|
-
|
|
79
|
+
summary: `No diagnostics available for ${lang.label}`,
|
|
80
|
+
content: `Detected a ${lang.label} project but the native toolchain (${lang.nativeCheck?.binary ?? "n/a"}) is not installed ` +
|
|
81
|
+
"and no tree-sitter grammar is configured for fallback checking.",
|
|
82
|
+
isError: true
|
|
55
83
|
};
|
|
56
84
|
}
|
|
57
85
|
};
|
|
86
|
+
async function runNativeCheck(lang, cwd) {
|
|
87
|
+
const cmd = lang.nativeCheck.command;
|
|
88
|
+
const result = await runShellCommand(cmd, { cwd, timeoutMs: 60_000 });
|
|
89
|
+
const output = [result.stdout.trim(), result.stderr.trim()].filter(Boolean).join("\n");
|
|
90
|
+
if (result.exitCode === 0) {
|
|
91
|
+
return {
|
|
92
|
+
summary: `${lang.label}: no errors found (${lang.nativeCheck.binary})`,
|
|
93
|
+
content: "No errors or warnings found.",
|
|
94
|
+
isError: false
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
return {
|
|
98
|
+
summary: `${lang.label}: errors found via ${lang.nativeCheck.binary}`,
|
|
99
|
+
content: output || "(no output but command failed)",
|
|
100
|
+
isError: true
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
async function runTreeSitterCheck(lang, cwd) {
|
|
104
|
+
const diagnostics = await checkSyntaxWithTreeSitter(cwd, lang.extensions, lang.treeSitterWasmUrl);
|
|
105
|
+
if (diagnostics === null) {
|
|
106
|
+
return {
|
|
107
|
+
summary: `Tree-sitter unavailable for ${lang.label}`,
|
|
108
|
+
content: "Could not initialize tree-sitter syntax checking. " +
|
|
109
|
+
`Install the native ${lang.nativeCheck?.binary ?? lang.id} toolchain for full diagnostics.`,
|
|
110
|
+
isError: true
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
if (diagnostics.length === 0) {
|
|
114
|
+
return {
|
|
115
|
+
summary: `${lang.label}: no syntax errors (tree-sitter)`,
|
|
116
|
+
content: "No syntax errors found via tree-sitter analysis.",
|
|
117
|
+
isError: false
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
return {
|
|
121
|
+
summary: `${lang.label}: ${diagnostics.length} syntax error(s) (tree-sitter)`,
|
|
122
|
+
content: formatDiagnostics(diagnostics),
|
|
123
|
+
isError: true
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
// ---------------------------------------------------------------------------
|
|
127
|
+
// find_references
|
|
128
|
+
// ---------------------------------------------------------------------------
|
|
58
129
|
const findReferencesTool = {
|
|
59
130
|
name: "find_references",
|
|
60
131
|
description: "Find all usages of a symbol or function name across the codebase.",
|
|
@@ -73,14 +144,14 @@ const findReferencesTool = {
|
|
|
73
144
|
async execute(rawArgs, context) {
|
|
74
145
|
const args = expectObject(rawArgs);
|
|
75
146
|
const symbol = requiredString(args.symbol, "symbol");
|
|
76
|
-
// Use the existing searchRepo functionality for semantic boundaries
|
|
77
147
|
const matches = await searchRepo({
|
|
78
148
|
query: symbol,
|
|
79
149
|
target: ".",
|
|
80
150
|
cwd: context.workspaceRoot,
|
|
81
151
|
limit: 50,
|
|
82
152
|
mode: "fixed",
|
|
83
|
-
caseSensitive: true
|
|
153
|
+
caseSensitive: true,
|
|
154
|
+
context
|
|
84
155
|
});
|
|
85
156
|
if (matches.length === 0) {
|
|
86
157
|
return { summary: `No references found for ${symbol}`, content: "(no matches)", isError: false };
|
|
@@ -93,6 +164,9 @@ const findReferencesTool = {
|
|
|
93
164
|
};
|
|
94
165
|
}
|
|
95
166
|
};
|
|
167
|
+
// ---------------------------------------------------------------------------
|
|
168
|
+
// list_exports — uses language registry for extension matching
|
|
169
|
+
// ---------------------------------------------------------------------------
|
|
96
170
|
const listExportsTool = {
|
|
97
171
|
name: "list_exports",
|
|
98
172
|
description: "List all exported functions, classes, and types from a file to quickly understand its API surface.",
|
|
@@ -115,20 +189,55 @@ const listExportsTool = {
|
|
|
115
189
|
const lines = content.split("\n");
|
|
116
190
|
const exports = [];
|
|
117
191
|
const ext = path.extname(target);
|
|
192
|
+
const lang = detectLanguageByExtension(ext);
|
|
118
193
|
for (let i = 0; i < lines.length; i++) {
|
|
119
194
|
const line = lines[i].trim();
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
195
|
+
if (lang) {
|
|
196
|
+
switch (lang.id) {
|
|
197
|
+
case "typescript":
|
|
198
|
+
case "javascript":
|
|
199
|
+
if (line.startsWith("export ") || line.startsWith("module.exports")) {
|
|
200
|
+
exports.push(`${i + 1}: ${line}`);
|
|
201
|
+
}
|
|
202
|
+
break;
|
|
203
|
+
case "python":
|
|
204
|
+
if (line.startsWith("def ") || line.startsWith("class ")) {
|
|
205
|
+
exports.push(`${i + 1}: ${line}`);
|
|
206
|
+
}
|
|
207
|
+
break;
|
|
208
|
+
case "go":
|
|
209
|
+
if ((line.startsWith("func ") || line.startsWith("type ")) && /[A-Z]/.test(line.charAt(5))) {
|
|
210
|
+
exports.push(`${i + 1}: ${line}`);
|
|
211
|
+
}
|
|
212
|
+
break;
|
|
213
|
+
case "rust":
|
|
214
|
+
if (line.startsWith("pub fn ") || line.startsWith("pub struct ") || line.startsWith("pub enum ") || line.startsWith("pub trait ")) {
|
|
215
|
+
exports.push(`${i + 1}: ${line}`);
|
|
216
|
+
}
|
|
217
|
+
break;
|
|
218
|
+
case "java":
|
|
219
|
+
if (line.startsWith("public ")) {
|
|
220
|
+
exports.push(`${i + 1}: ${line}`);
|
|
221
|
+
}
|
|
222
|
+
break;
|
|
223
|
+
case "ruby":
|
|
224
|
+
if (line.startsWith("def ") || line.startsWith("class ") || line.startsWith("module ")) {
|
|
225
|
+
exports.push(`${i + 1}: ${line}`);
|
|
226
|
+
}
|
|
227
|
+
break;
|
|
228
|
+
default:
|
|
229
|
+
// Fallback heuristic for unknown languages
|
|
230
|
+
if (line.startsWith("export ") || line.startsWith("pub ") || line.startsWith("public ")) {
|
|
231
|
+
exports.push(`${i + 1}: ${line}`);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
128
234
|
}
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
235
|
+
else {
|
|
236
|
+
// No language match — try generic export heuristics
|
|
237
|
+
if (line.startsWith("export ") || line.startsWith("module.exports") ||
|
|
238
|
+
line.startsWith("pub ") || line.startsWith("public ")) {
|
|
239
|
+
exports.push(`${i + 1}: ${line}`);
|
|
240
|
+
}
|
|
132
241
|
}
|
|
133
242
|
}
|
|
134
243
|
if (exports.length === 0) {
|
|
@@ -142,6 +251,9 @@ const listExportsTool = {
|
|
|
142
251
|
};
|
|
143
252
|
}
|
|
144
253
|
};
|
|
254
|
+
// ---------------------------------------------------------------------------
|
|
255
|
+
// Shared helpers
|
|
256
|
+
// ---------------------------------------------------------------------------
|
|
145
257
|
function expectObject(value) {
|
|
146
258
|
if (value && typeof value === "object" && !Array.isArray(value)) {
|
|
147
259
|
return value;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lsp.js","sourceRoot":"","sources":["../../../src/tools/lsp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,
|
|
1
|
+
{"version":3,"file":"lsp.js","sourceRoot":"","sources":["../../../src/tools/lsp.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { ToolContext } from "../types.js";
|
|
1
2
|
export interface RepoSearchMatch {
|
|
2
3
|
filePath: string;
|
|
3
4
|
lineNumber: number;
|
|
@@ -11,6 +12,7 @@ export interface RepoSearchOptions {
|
|
|
11
12
|
mode?: "fixed" | "regex";
|
|
12
13
|
caseSensitive?: boolean;
|
|
13
14
|
globs?: string[];
|
|
15
|
+
context?: ToolContext;
|
|
14
16
|
}
|
|
15
17
|
export interface RepoSymbolSearchOptions {
|
|
16
18
|
symbol: string;
|
|
@@ -18,6 +20,7 @@ export interface RepoSymbolSearchOptions {
|
|
|
18
20
|
cwd: string;
|
|
19
21
|
limit: number;
|
|
20
22
|
globs?: string[];
|
|
23
|
+
context?: ToolContext;
|
|
21
24
|
}
|
|
22
25
|
export declare function searchRepo(options: RepoSearchOptions): Promise<RepoSearchMatch[]>;
|
|
23
26
|
export declare function searchRepoSymbol(options: RepoSymbolSearchOptions): Promise<RepoSearchMatch[]>;
|
|
@@ -30,7 +30,8 @@ export async function searchRepo(options) {
|
|
|
30
30
|
}
|
|
31
31
|
return fallbackSearch({
|
|
32
32
|
...options,
|
|
33
|
-
globs
|
|
33
|
+
globs,
|
|
34
|
+
context: options.context
|
|
34
35
|
});
|
|
35
36
|
}
|
|
36
37
|
}
|
|
@@ -43,7 +44,8 @@ export async function searchRepoSymbol(options) {
|
|
|
43
44
|
limit: Math.max(options.limit * 6, options.limit),
|
|
44
45
|
mode: "regex",
|
|
45
46
|
caseSensitive: true,
|
|
46
|
-
globs: options.globs ?? []
|
|
47
|
+
globs: options.globs ?? [],
|
|
48
|
+
context: options.context
|
|
47
49
|
});
|
|
48
50
|
return candidates
|
|
49
51
|
.sort((left, right) => {
|
|
@@ -101,6 +103,16 @@ function parseSearchMatches(output, limit) {
|
|
|
101
103
|
return matches;
|
|
102
104
|
}
|
|
103
105
|
async function fallbackSearch(options) {
|
|
106
|
+
// If we have a performance-capable context, offload to Go backend for speed
|
|
107
|
+
if (options.context?.performance.fastSearch) {
|
|
108
|
+
const goMatches = await options.context.performance.fastSearch(options.query, options.target, {
|
|
109
|
+
limit: options.limit,
|
|
110
|
+
regex: options.mode === "regex"
|
|
111
|
+
});
|
|
112
|
+
if (goMatches) {
|
|
113
|
+
return goMatches;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
104
116
|
const matches = [];
|
|
105
117
|
const targetStats = await stat(options.target);
|
|
106
118
|
if (targetStats.isFile()) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repo-search.js","sourceRoot":"","sources":["../../../src/tools/repo-search.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"repo-search.js","sourceRoot":"","sources":["../../../src/tools/repo-search.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface SyntaxDiagnostic {
|
|
2
|
+
file: string;
|
|
3
|
+
line: number;
|
|
4
|
+
column: number;
|
|
5
|
+
endLine: number;
|
|
6
|
+
endColumn: number;
|
|
7
|
+
type: "ERROR" | "MISSING";
|
|
8
|
+
context: string;
|
|
9
|
+
}
|
|
10
|
+
export declare function checkSyntaxWithTreeSitter(workspaceRoot: string, extensions: string[], wasmUrl: string): Promise<SyntaxDiagnostic[] | null>;
|
|
11
|
+
export declare function isTreeSitterAvailable(): Promise<boolean>;
|
|
12
|
+
export declare function formatDiagnostics(diagnostics: SyntaxDiagnostic[]): string;
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import { readFile, stat, mkdir, writeFile as fsWriteFile, readdir } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import os from "node:os";
|
|
4
|
+
// web-tree-sitter exports both default and named — handle both
|
|
5
|
+
let Parser;
|
|
6
|
+
let parserInitialized = false;
|
|
7
|
+
async function ensureParser() {
|
|
8
|
+
if (parserInitialized)
|
|
9
|
+
return;
|
|
10
|
+
parserInitialized = true;
|
|
11
|
+
try {
|
|
12
|
+
const mod = await import("web-tree-sitter");
|
|
13
|
+
Parser = mod.default || mod;
|
|
14
|
+
await Parser.init();
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
Parser = null;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
function grammarCacheDir() {
|
|
21
|
+
return path.join(os.homedir(), ".cache", "vetala", "grammars");
|
|
22
|
+
}
|
|
23
|
+
async function ensureGrammarWasm(wasmUrl) {
|
|
24
|
+
const cacheDir = grammarCacheDir();
|
|
25
|
+
// Derive a stable filename from the URL
|
|
26
|
+
const urlObj = new URL(wasmUrl);
|
|
27
|
+
const filename = urlObj.pathname.split("/").filter(Boolean).pop() || "grammar.wasm";
|
|
28
|
+
const cachedPath = path.join(cacheDir, filename);
|
|
29
|
+
// Check if already cached
|
|
30
|
+
try {
|
|
31
|
+
await stat(cachedPath);
|
|
32
|
+
return cachedPath;
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
// Not cached yet — need to download
|
|
36
|
+
}
|
|
37
|
+
// Download
|
|
38
|
+
const response = await fetch(wasmUrl);
|
|
39
|
+
if (!response.ok) {
|
|
40
|
+
throw new Error(`Failed to download grammar: ${response.status} from ${wasmUrl}`);
|
|
41
|
+
}
|
|
42
|
+
const buffer = Buffer.from(await response.arrayBuffer());
|
|
43
|
+
// Ensure cache dir exists
|
|
44
|
+
await mkdir(cacheDir, { recursive: true });
|
|
45
|
+
await fsWriteFile(cachedPath, buffer);
|
|
46
|
+
return cachedPath;
|
|
47
|
+
}
|
|
48
|
+
async function collectSourceFiles(dir, extensions, maxFiles = 200) {
|
|
49
|
+
const IGNORE = new Set([
|
|
50
|
+
"node_modules", ".git", "__pycache__", ".mypy_cache", "dist",
|
|
51
|
+
"build", "target", "vendor", ".next", ".cache", "coverage"
|
|
52
|
+
]);
|
|
53
|
+
const files = [];
|
|
54
|
+
async function walk(currentDir) {
|
|
55
|
+
if (files.length >= maxFiles)
|
|
56
|
+
return;
|
|
57
|
+
let entries;
|
|
58
|
+
try {
|
|
59
|
+
entries = await readdir(currentDir, { withFileTypes: true });
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
for (const entry of entries) {
|
|
65
|
+
if (files.length >= maxFiles)
|
|
66
|
+
break;
|
|
67
|
+
if (entry.isDirectory()) {
|
|
68
|
+
if (!IGNORE.has(entry.name) && !entry.name.startsWith(".")) {
|
|
69
|
+
await walk(path.join(currentDir, entry.name));
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
else if (entry.isFile()) {
|
|
73
|
+
const ext = path.extname(entry.name);
|
|
74
|
+
if (extensions.includes(ext)) {
|
|
75
|
+
files.push(path.join(currentDir, entry.name));
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
await walk(dir);
|
|
81
|
+
return files;
|
|
82
|
+
}
|
|
83
|
+
function collectErrors(node, filePath, sourceLines, results) {
|
|
84
|
+
if (node.type === "ERROR" || node.isMissing) {
|
|
85
|
+
const line = node.startPosition.row;
|
|
86
|
+
results.push({
|
|
87
|
+
file: filePath,
|
|
88
|
+
line: line + 1, // 1-indexed
|
|
89
|
+
column: node.startPosition.column + 1,
|
|
90
|
+
endLine: node.endPosition.row + 1,
|
|
91
|
+
endColumn: node.endPosition.column + 1,
|
|
92
|
+
type: node.isMissing ? "MISSING" : "ERROR",
|
|
93
|
+
context: sourceLines[line] ?? ""
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
for (let i = 0; i < node.childCount; i++) {
|
|
97
|
+
collectErrors(node.child(i), filePath, sourceLines, results);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
export async function checkSyntaxWithTreeSitter(workspaceRoot, extensions, wasmUrl) {
|
|
101
|
+
await ensureParser();
|
|
102
|
+
if (!Parser)
|
|
103
|
+
return null;
|
|
104
|
+
let grammarPath;
|
|
105
|
+
try {
|
|
106
|
+
grammarPath = await ensureGrammarWasm(wasmUrl);
|
|
107
|
+
}
|
|
108
|
+
catch {
|
|
109
|
+
return null; // Can't download grammar (offline, etc.)
|
|
110
|
+
}
|
|
111
|
+
const parser = new Parser();
|
|
112
|
+
try {
|
|
113
|
+
const language = await Parser.Language.load(grammarPath);
|
|
114
|
+
parser.setLanguage(language);
|
|
115
|
+
}
|
|
116
|
+
catch {
|
|
117
|
+
return null; // Grammar incompatible or corrupted
|
|
118
|
+
}
|
|
119
|
+
const files = await collectSourceFiles(workspaceRoot, extensions);
|
|
120
|
+
if (files.length === 0)
|
|
121
|
+
return [];
|
|
122
|
+
const diagnostics = [];
|
|
123
|
+
for (const filePath of files) {
|
|
124
|
+
try {
|
|
125
|
+
const source = await readFile(filePath, "utf8");
|
|
126
|
+
const tree = parser.parse(source);
|
|
127
|
+
const sourceLines = source.split("\n");
|
|
128
|
+
const relPath = path.relative(workspaceRoot, filePath);
|
|
129
|
+
collectErrors(tree.rootNode, relPath, sourceLines, diagnostics);
|
|
130
|
+
}
|
|
131
|
+
catch {
|
|
132
|
+
// Skip unparseable files
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
return diagnostics;
|
|
136
|
+
}
|
|
137
|
+
export async function isTreeSitterAvailable() {
|
|
138
|
+
await ensureParser();
|
|
139
|
+
return Parser !== null;
|
|
140
|
+
}
|
|
141
|
+
export function formatDiagnostics(diagnostics) {
|
|
142
|
+
if (diagnostics.length === 0)
|
|
143
|
+
return "No syntax errors found.";
|
|
144
|
+
return diagnostics
|
|
145
|
+
.map(d => {
|
|
146
|
+
const loc = `${d.file}:${d.line}:${d.column}`;
|
|
147
|
+
const tag = d.type === "MISSING" ? "MISSING token" : "SYNTAX ERROR";
|
|
148
|
+
const ctx = d.context.trim();
|
|
149
|
+
return `${loc}: ${tag}\n ${ctx}`;
|
|
150
|
+
})
|
|
151
|
+
.join("\n\n");
|
|
152
|
+
}
|
|
153
|
+
//# sourceMappingURL=tree-sitter-check.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tree-sitter-check.js","sourceRoot":"","sources":["../../../src/tools/tree-sitter-check.ts"],"names":[],"mappings":"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"}
|