skannr 0.1.6 → 0.2.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/cli.js +86 -0
- package/dist/cli.js.map +1 -1
- package/dist/guard/call-context.d.ts +14 -0
- package/dist/guard/call-context.d.ts.map +1 -0
- package/dist/guard/call-context.js +120 -0
- package/dist/guard/call-context.js.map +1 -0
- package/dist/guard/fix-applier.d.ts +38 -0
- package/dist/guard/fix-applier.d.ts.map +1 -0
- package/dist/guard/fix-applier.js +181 -0
- package/dist/guard/fix-applier.js.map +1 -0
- package/dist/guard/hook-installer.d.ts +19 -0
- package/dist/guard/hook-installer.d.ts.map +1 -0
- package/dist/guard/hook-installer.js +119 -0
- package/dist/guard/hook-installer.js.map +1 -0
- package/dist/guard/index.d.ts +34 -0
- package/dist/guard/index.d.ts.map +1 -0
- package/dist/guard/index.js +152 -0
- package/dist/guard/index.js.map +1 -0
- package/dist/guard/provider.d.ts +12 -0
- package/dist/guard/provider.d.ts.map +1 -0
- package/dist/guard/provider.js +211 -0
- package/dist/guard/provider.js.map +1 -0
- package/dist/guard/review-runner.d.ts +21 -0
- package/dist/guard/review-runner.d.ts.map +1 -0
- package/dist/guard/review-runner.js +85 -0
- package/dist/guard/review-runner.js.map +1 -0
- package/dist/guard/rules-loader.d.ts +10 -0
- package/dist/guard/rules-loader.d.ts.map +1 -0
- package/dist/guard/rules-loader.js +121 -0
- package/dist/guard/rules-loader.js.map +1 -0
- package/dist/guard/schema.d.ts +182 -0
- package/dist/guard/schema.d.ts.map +1 -0
- package/dist/guard/schema.js +53 -0
- package/dist/guard/schema.js.map +1 -0
- package/dist/guard/symbol-diff.d.ts +18 -0
- package/dist/guard/symbol-diff.d.ts.map +1 -0
- package/dist/guard/symbol-diff.js +243 -0
- package/dist/guard/symbol-diff.js.map +1 -0
- package/dist/guard/types.d.ts +62 -0
- package/dist/guard/types.d.ts.map +1 -0
- package/dist/guard/types.js +6 -0
- package/dist/guard/types.js.map +1 -0
- package/dist/languages/TreeSitterAdapter.d.ts +30 -0
- package/dist/languages/TreeSitterAdapter.d.ts.map +1 -0
- package/dist/languages/TreeSitterAdapter.js +466 -0
- package/dist/languages/TreeSitterAdapter.js.map +1 -0
- package/dist/languages/grammars/tree-sitter-go.wasm +0 -0
- package/dist/languages/grammars/tree-sitter-java.wasm +0 -0
- package/dist/languages/grammars/tree-sitter-python.wasm +0 -0
- package/dist/languages/grammars/tree-sitter-rust.wasm +0 -0
- package/dist/languages/lang-config.d.ts +38 -0
- package/dist/languages/lang-config.d.ts.map +1 -0
- package/dist/languages/lang-config.js +85 -0
- package/dist/languages/lang-config.js.map +1 -0
- package/dist/languages/registry.d.ts +6 -0
- package/dist/languages/registry.d.ts.map +1 -1
- package/dist/languages/registry.js +18 -4
- package/dist/languages/registry.js.map +1 -1
- package/dist/mcp-server.d.ts.map +1 -1
- package/dist/mcp-server.js +44 -0
- package/dist/mcp-server.js.map +1 -1
- package/package.json +5 -7
- package/src/cli.ts +101 -0
- package/src/guard/call-context.ts +101 -0
- package/src/guard/fix-applier.ts +172 -0
- package/src/guard/hook-installer.ts +96 -0
- package/src/guard/index.ts +134 -0
- package/src/guard/provider.ts +209 -0
- package/src/guard/review-runner.ts +110 -0
- package/src/guard/rules-loader.ts +97 -0
- package/src/guard/schema.ts +59 -0
- package/src/guard/symbol-diff.ts +227 -0
- package/src/guard/types.ts +68 -0
- package/src/languages/TreeSitterAdapter.ts +431 -0
- package/src/languages/lang-config.ts +113 -0
- package/src/languages/registry.ts +65 -49
- package/src/mcp-server.ts +49 -0
- package/src/languages/PythonAdapter.ts +0 -302
- package/tests/agent.tools.test.ts +0 -81
- package/tests/benchmark.test.ts +0 -31
- package/tests/blast-radius.test.ts +0 -290
- package/tests/fixtures/sample.py +0 -17
- package/tests/fixtures/sample.ts +0 -13
- package/tests/fixtures/src/api/routes.ts +0 -1
- package/tests/fixtures/src/auth/permission.ts +0 -3
- package/tests/python-adapter.test.ts +0 -31
- package/tests/ranker-enhanced.test.ts +0 -70
- package/tests/ranker.test.ts +0 -79
- package/tests/scanner.scope.test.ts +0 -67
- package/tests/setup-fixtures.js +0 -29
- package/tests/skeletonizer.test.ts +0 -149
- package/uca-landing/index.html +0 -17
- package/uca-landing/package.json +0 -23
- package/uca-landing/postcss.config.js +0 -6
- package/uca-landing/src/App.jsx +0 -45
- package/uca-landing/src/components/AgentMode.jsx +0 -45
- package/uca-landing/src/components/CliReference.jsx +0 -89
- package/uca-landing/src/components/Features.jsx +0 -88
- package/uca-landing/src/components/Footer.jsx +0 -35
- package/uca-landing/src/components/Hero.jsx +0 -125
- package/uca-landing/src/components/HowItWorks.jsx +0 -65
- package/uca-landing/src/components/Install.jsx +0 -103
- package/uca-landing/src/components/LanguageSupport.jsx +0 -63
- package/uca-landing/src/components/Navbar.jsx +0 -86
- package/uca-landing/src/components/Problem.jsx +0 -51
- package/uca-landing/src/components/Reveal.jsx +0 -40
- package/uca-landing/src/components/TokenSavings.jsx +0 -126
- package/uca-landing/src/components/WorksWith.jsx +0 -59
- package/uca-landing/src/hooks/useScrollNav.js +0 -13
- package/uca-landing/src/hooks/useTypewriter.js +0 -41
- package/uca-landing/src/index.css +0 -13
- package/uca-landing/src/main.jsx +0 -10
- package/uca-landing/tailwind.config.js +0 -68
- package/uca-landing/vercel.json +0 -4
- package/uca-landing/vite.config.js +0 -6
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Build symbol-level diff units from staged git changes.
|
|
4
|
+
* Uses Skannr's existing parser to identify which symbols changed,
|
|
5
|
+
* instead of working with raw file diffs.
|
|
6
|
+
*/
|
|
7
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
8
|
+
if (k2 === undefined) k2 = k;
|
|
9
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
10
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
11
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
12
|
+
}
|
|
13
|
+
Object.defineProperty(o, k2, desc);
|
|
14
|
+
}) : (function(o, m, k, k2) {
|
|
15
|
+
if (k2 === undefined) k2 = k;
|
|
16
|
+
o[k2] = m[k];
|
|
17
|
+
}));
|
|
18
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
19
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
20
|
+
}) : function(o, v) {
|
|
21
|
+
o["default"] = v;
|
|
22
|
+
});
|
|
23
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
24
|
+
var ownKeys = function(o) {
|
|
25
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
26
|
+
var ar = [];
|
|
27
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
28
|
+
return ar;
|
|
29
|
+
};
|
|
30
|
+
return ownKeys(o);
|
|
31
|
+
};
|
|
32
|
+
return function (mod) {
|
|
33
|
+
if (mod && mod.__esModule) return mod;
|
|
34
|
+
var result = {};
|
|
35
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
36
|
+
__setModuleDefault(result, mod);
|
|
37
|
+
return result;
|
|
38
|
+
};
|
|
39
|
+
})();
|
|
40
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
41
|
+
exports.getStagedFiles = getStagedFiles;
|
|
42
|
+
exports.buildSymbolDiffs = buildSymbolDiffs;
|
|
43
|
+
exports.buildSymbolDiffsFromDiff = buildSymbolDiffsFromDiff;
|
|
44
|
+
const path = __importStar(require("path"));
|
|
45
|
+
const fs = __importStar(require("fs"));
|
|
46
|
+
const child_process_1 = require("child_process");
|
|
47
|
+
const registry_1 = require("../languages/registry");
|
|
48
|
+
const scanner_1 = require("../scanner");
|
|
49
|
+
/** Get the list of staged files (paths relative to root). */
|
|
50
|
+
function getStagedFiles(root) {
|
|
51
|
+
try {
|
|
52
|
+
const output = (0, child_process_1.execSync)('git diff --cached --name-only --diff-filter=ACMR', {
|
|
53
|
+
cwd: root,
|
|
54
|
+
encoding: 'utf-8',
|
|
55
|
+
});
|
|
56
|
+
return output.trim().split('\n').filter(Boolean);
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
return [];
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
/** Get the diff text for a specific staged file. */
|
|
63
|
+
function getStagedDiff(root, file) {
|
|
64
|
+
try {
|
|
65
|
+
return (0, child_process_1.execSync)(`git diff --cached -- "${file}"`, {
|
|
66
|
+
cwd: root,
|
|
67
|
+
encoding: 'utf-8',
|
|
68
|
+
maxBuffer: 5 * 1024 * 1024,
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
return '';
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
/** Get the old (HEAD) version of a file, or null if newly added. */
|
|
76
|
+
function getHeadContent(root, file) {
|
|
77
|
+
try {
|
|
78
|
+
return (0, child_process_1.execSync)(`git show HEAD:"${file}"`, {
|
|
79
|
+
cwd: root,
|
|
80
|
+
encoding: 'utf-8',
|
|
81
|
+
maxBuffer: 5 * 1024 * 1024,
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
return null;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
/** Extract changed line numbers from a unified diff. */
|
|
89
|
+
function extractChangedLines(diff) {
|
|
90
|
+
const lines = new Set();
|
|
91
|
+
let currentLine = 0;
|
|
92
|
+
for (const line of diff.split('\n')) {
|
|
93
|
+
const hunkMatch = line.match(/^@@ -\d+(?:,\d+)? \+(\d+)/);
|
|
94
|
+
if (hunkMatch) {
|
|
95
|
+
currentLine = parseInt(hunkMatch[1], 10);
|
|
96
|
+
continue;
|
|
97
|
+
}
|
|
98
|
+
if (line.startsWith('+') && !line.startsWith('+++')) {
|
|
99
|
+
lines.add(currentLine);
|
|
100
|
+
currentLine++;
|
|
101
|
+
}
|
|
102
|
+
else if (line.startsWith('-') && !line.startsWith('---')) {
|
|
103
|
+
// Deleted lines don't advance the new-file line counter
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
currentLine++;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
return lines;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Determine which symbols in a file were affected by the staged changes.
|
|
113
|
+
* Matches symbols whose line range overlaps any changed line.
|
|
114
|
+
*/
|
|
115
|
+
function findAffectedSymbols(symbols, changedLines, allSymbols) {
|
|
116
|
+
if (changedLines.size === 0)
|
|
117
|
+
return [];
|
|
118
|
+
// Build approximate end lines: each symbol extends until the next symbol starts
|
|
119
|
+
const sorted = [...allSymbols].sort((a, b) => a.line - b.line);
|
|
120
|
+
const affected = [];
|
|
121
|
+
for (let i = 0; i < sorted.length; i++) {
|
|
122
|
+
const sym = sorted[i];
|
|
123
|
+
const startLine = sym.line;
|
|
124
|
+
const endLine = i + 1 < sorted.length ? sorted[i + 1].line - 1 : startLine + 50;
|
|
125
|
+
for (let line = startLine; line <= endLine; line++) {
|
|
126
|
+
if (changedLines.has(line)) {
|
|
127
|
+
affected.push(sym);
|
|
128
|
+
break;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
return affected;
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Build symbol-level diff units for all staged files in the project.
|
|
136
|
+
* This is the primary input to the review runner.
|
|
137
|
+
*/
|
|
138
|
+
function buildSymbolDiffs(root) {
|
|
139
|
+
const stagedFiles = getStagedFiles(root);
|
|
140
|
+
const units = [];
|
|
141
|
+
for (const relFile of stagedFiles) {
|
|
142
|
+
const absPath = path.join(root, relFile);
|
|
143
|
+
if (!fs.existsSync(absPath))
|
|
144
|
+
continue;
|
|
145
|
+
const adapter = (0, registry_1.getAdapter)(absPath);
|
|
146
|
+
const newContent = (0, scanner_1.readFileContent)(absPath);
|
|
147
|
+
if (!newContent)
|
|
148
|
+
continue;
|
|
149
|
+
const newSymbols = adapter.extractSymbols(newContent);
|
|
150
|
+
const oldContent = getHeadContent(root, relFile);
|
|
151
|
+
const oldSymbols = oldContent ? adapter.extractSymbols(oldContent) : [];
|
|
152
|
+
const diff = getStagedDiff(root, relFile);
|
|
153
|
+
const changedLines = extractChangedLines(diff);
|
|
154
|
+
// Find symbols that overlap changed lines in the new version
|
|
155
|
+
const affected = findAffectedSymbols(newSymbols, changedLines, newSymbols);
|
|
156
|
+
// Determine change type for each affected symbol
|
|
157
|
+
const oldSymbolNames = new Set(oldSymbols.map((s) => s.name));
|
|
158
|
+
for (const sym of affected) {
|
|
159
|
+
if (sym.kind === 'export')
|
|
160
|
+
continue; // skip synthetic export markers
|
|
161
|
+
const changeType = oldSymbolNames.has(sym.name) ? 'modified' : 'added';
|
|
162
|
+
const oldSym = oldSymbols.find((s) => s.name === sym.name);
|
|
163
|
+
units.push({
|
|
164
|
+
file: relFile,
|
|
165
|
+
symbol: sym.name,
|
|
166
|
+
changeType,
|
|
167
|
+
oldSignature: oldSym ? `${oldSym.kind} ${oldSym.name}` : undefined,
|
|
168
|
+
newSignature: `${sym.kind} ${sym.name}`,
|
|
169
|
+
callers: [], // populated by call-context module
|
|
170
|
+
callees: [], // populated by call-context module
|
|
171
|
+
diffText: diff,
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
// Handle deleted symbols (in old but not in new)
|
|
175
|
+
if (oldContent) {
|
|
176
|
+
const newSymbolNames = new Set(newSymbols.map((s) => s.name));
|
|
177
|
+
for (const oldSym of oldSymbols) {
|
|
178
|
+
if (oldSym.kind === 'export')
|
|
179
|
+
continue;
|
|
180
|
+
if (!newSymbolNames.has(oldSym.name)) {
|
|
181
|
+
units.push({
|
|
182
|
+
file: relFile,
|
|
183
|
+
symbol: oldSym.name,
|
|
184
|
+
changeType: 'deleted',
|
|
185
|
+
oldSignature: `${oldSym.kind} ${oldSym.name}`,
|
|
186
|
+
callers: [],
|
|
187
|
+
callees: [],
|
|
188
|
+
diffText: diff,
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
return units;
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Build symbol diffs from a PR diff string (for --pr-mode).
|
|
198
|
+
*/
|
|
199
|
+
function buildSymbolDiffsFromDiff(root, diffContent) {
|
|
200
|
+
const parseDiff = require('parse-diff');
|
|
201
|
+
const parsedFiles = parseDiff(diffContent);
|
|
202
|
+
const units = [];
|
|
203
|
+
for (const file of parsedFiles) {
|
|
204
|
+
const raw = file.to ?? file.from;
|
|
205
|
+
if (!raw || raw === '/dev/null')
|
|
206
|
+
continue;
|
|
207
|
+
const relFile = raw.replace(/^[ab]\//, '');
|
|
208
|
+
const absPath = path.join(root, relFile);
|
|
209
|
+
if (!fs.existsSync(absPath))
|
|
210
|
+
continue;
|
|
211
|
+
const adapter = (0, registry_1.getAdapter)(absPath);
|
|
212
|
+
const content = (0, scanner_1.readFileContent)(absPath);
|
|
213
|
+
if (!content)
|
|
214
|
+
continue;
|
|
215
|
+
const symbols = adapter.extractSymbols(content);
|
|
216
|
+
const changedLines = new Set();
|
|
217
|
+
for (const chunk of file.chunks) {
|
|
218
|
+
for (const change of chunk.changes) {
|
|
219
|
+
if (change.type === 'add' || change.type === 'del') {
|
|
220
|
+
const ln = change.ln;
|
|
221
|
+
if (typeof ln === 'number')
|
|
222
|
+
changedLines.add(ln);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
const affected = findAffectedSymbols(symbols, changedLines, symbols);
|
|
227
|
+
for (const sym of affected) {
|
|
228
|
+
if (sym.kind === 'export')
|
|
229
|
+
continue;
|
|
230
|
+
units.push({
|
|
231
|
+
file: relFile,
|
|
232
|
+
symbol: sym.name,
|
|
233
|
+
changeType: 'modified',
|
|
234
|
+
newSignature: `${sym.kind} ${sym.name}`,
|
|
235
|
+
callers: [],
|
|
236
|
+
callees: [],
|
|
237
|
+
diffText: file.chunks.map((c) => c.content).join('\n'),
|
|
238
|
+
});
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
return units;
|
|
242
|
+
}
|
|
243
|
+
//# sourceMappingURL=symbol-diff.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"symbol-diff.js","sourceRoot":"","sources":["../../src/guard/symbol-diff.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared type definitions for the guard module.
|
|
3
|
+
*/
|
|
4
|
+
/** Severity levels for rules and violations. */
|
|
5
|
+
export type Severity = 'low' | 'medium' | 'high' | 'critical';
|
|
6
|
+
/** A team-defined review rule. */
|
|
7
|
+
export interface GuardRule {
|
|
8
|
+
id: string;
|
|
9
|
+
description: string;
|
|
10
|
+
severity: Severity;
|
|
11
|
+
fixable: boolean;
|
|
12
|
+
category: string;
|
|
13
|
+
}
|
|
14
|
+
/** A single symbol-level diff unit sent to the LLM for review. */
|
|
15
|
+
export interface SymbolDiffUnit {
|
|
16
|
+
file: string;
|
|
17
|
+
symbol: string;
|
|
18
|
+
changeType: 'added' | 'modified' | 'deleted';
|
|
19
|
+
oldSignature?: string;
|
|
20
|
+
newSignature?: string;
|
|
21
|
+
callers: string[];
|
|
22
|
+
callees: string[];
|
|
23
|
+
diffText: string;
|
|
24
|
+
}
|
|
25
|
+
/** A violation found by the review. */
|
|
26
|
+
export interface Violation {
|
|
27
|
+
rule_id: string;
|
|
28
|
+
file: string;
|
|
29
|
+
symbol: string;
|
|
30
|
+
line_start: number;
|
|
31
|
+
line_end: number;
|
|
32
|
+
severity: Severity;
|
|
33
|
+
confidence: number;
|
|
34
|
+
fixable: boolean;
|
|
35
|
+
message: string;
|
|
36
|
+
suggested_fix?: string;
|
|
37
|
+
}
|
|
38
|
+
/** The structured response contract from the LLM. */
|
|
39
|
+
export interface ReviewResponse {
|
|
40
|
+
violations: Violation[];
|
|
41
|
+
status: 'pass' | 'fail';
|
|
42
|
+
summary: string;
|
|
43
|
+
}
|
|
44
|
+
/** Result of a full guard run. */
|
|
45
|
+
export interface GuardResult {
|
|
46
|
+
response: ReviewResponse;
|
|
47
|
+
rulesUsed: GuardRule[];
|
|
48
|
+
symbolsReviewed: number;
|
|
49
|
+
durationMs: number;
|
|
50
|
+
}
|
|
51
|
+
/** Guard configuration (provider, model, etc.). */
|
|
52
|
+
export interface GuardConfig {
|
|
53
|
+
/** LLM provider: 'gemini' | 'openai' */
|
|
54
|
+
provider: 'gemini' | 'openai';
|
|
55
|
+
/** Model name (e.g. 'gemini-2.0-flash-exp', 'gpt-4o'). */
|
|
56
|
+
model: string;
|
|
57
|
+
/** API key (resolved from env if not set). */
|
|
58
|
+
apiKey?: string;
|
|
59
|
+
/** OpenAI-compatible base URL (for openai provider). */
|
|
60
|
+
baseUrl?: string;
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/guard/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,gDAAgD;AAChD,MAAM,MAAM,QAAQ,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAC;AAE9D,kCAAkC;AAClC,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,QAAQ,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,kEAAkE;AAClE,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,OAAO,GAAG,UAAU,GAAG,SAAS,CAAC;IAC7C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,uCAAuC;AACvC,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,QAAQ,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,qDAAqD;AACrD,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,SAAS,EAAE,CAAC;IACxB,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,kCAAkC;AAClC,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,cAAc,CAAC;IACzB,SAAS,EAAE,SAAS,EAAE,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,mDAAmD;AACnD,MAAM,WAAW,WAAW;IAC1B,wCAAwC;IACxC,QAAQ,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC9B,0DAA0D;IAC1D,KAAK,EAAE,MAAM,CAAC;IACd,8CAA8C;IAC9C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,wDAAwD;IACxD,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/guard/types.ts"],"names":[],"mappings":";AAAA;;GAEG"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Universal tree-sitter adapter using web-tree-sitter (WASM).
|
|
3
|
+
* Handles Python, Go, Rust, Java, and any future language by loading
|
|
4
|
+
* the appropriate grammar at runtime. No native compilation required.
|
|
5
|
+
*/
|
|
6
|
+
import { LanguageAdapter, SkeletonResult, Symbol } from './LanguageAdapter';
|
|
7
|
+
import { LangConfig } from './lang-config';
|
|
8
|
+
export declare class TreeSitterAdapter implements LanguageAdapter {
|
|
9
|
+
name: string;
|
|
10
|
+
extensions: string[];
|
|
11
|
+
private configs;
|
|
12
|
+
private _initDone;
|
|
13
|
+
constructor(configs: LangConfig[]);
|
|
14
|
+
canHandle(filePath: string): boolean;
|
|
15
|
+
/** Ensure WASM parser is initialized. Call at the start of each public method. */
|
|
16
|
+
private ensureReady;
|
|
17
|
+
/** Async initialization — must be called once before using the adapter. */
|
|
18
|
+
initialize(): Promise<void>;
|
|
19
|
+
/** Synchronous initialization attempt (for compat with existing sync API). */
|
|
20
|
+
initializeSync(): void;
|
|
21
|
+
generateSkeleton(content: string, filePath: string): SkeletonResult;
|
|
22
|
+
extractSymbols(content: string): Symbol[];
|
|
23
|
+
extractImports(content: string): string[];
|
|
24
|
+
/** Extract symbols with a file path hint for correct config selection. */
|
|
25
|
+
extractSymbolsForFile(content: string, filePath: string): Symbol[];
|
|
26
|
+
/** Extract imports with a file path hint for correct config selection. */
|
|
27
|
+
extractImportsForFile(content: string, filePath: string): string[];
|
|
28
|
+
private walkSymbols;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=TreeSitterAdapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TreeSitterAdapter.d.ts","sourceRoot":"","sources":["../../src/languages/TreeSitterAdapter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC5E,OAAO,EAAE,UAAU,EAAuB,MAAM,eAAe,CAAC;AAkLhE,qBAAa,iBAAkB,YAAW,eAAe;IACvD,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,OAAO,CAAC,OAAO,CAAe;IAC9B,OAAO,CAAC,SAAS,CAAS;gBAEd,OAAO,EAAE,UAAU,EAAE;IAMjC,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAKpC,kFAAkF;IAClF,OAAO,CAAC,WAAW;IAOnB,2EAA2E;IACrE,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAUjC,8EAA8E;IAC9E,cAAc,IAAI,IAAI;IAQtB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,cAAc;IA+CnE,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE;IAwBzC,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE;IA4BzC,0EAA0E;IAC1E,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE;IAuBlE,0EAA0E;IAC1E,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE;IA2BlE,OAAO,CAAC,WAAW;CAgDpB"}
|