@specverse/engines 6.0.7 → 6.0.9
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/analyse-prepass/adapters/index.d.ts +9 -0
- package/dist/analyse-prepass/adapters/index.d.ts.map +1 -0
- package/dist/analyse-prepass/adapters/index.js +9 -0
- package/dist/analyse-prepass/adapters/index.js.map +1 -0
- package/dist/analyse-prepass/adapters/typescript-prisma.d.ts +67 -0
- package/dist/analyse-prepass/adapters/typescript-prisma.d.ts.map +1 -0
- package/dist/analyse-prepass/adapters/typescript-prisma.js +167 -0
- package/dist/analyse-prepass/adapters/typescript-prisma.js.map +1 -0
- package/dist/analyse-prepass/backends/codegraph.d.ts +56 -0
- package/dist/analyse-prepass/backends/codegraph.d.ts.map +1 -0
- package/dist/analyse-prepass/backends/codegraph.js +303 -0
- package/dist/analyse-prepass/backends/codegraph.js.map +1 -0
- package/dist/analyse-prepass/backends/gitnexus.d.ts +71 -0
- package/dist/analyse-prepass/backends/gitnexus.d.ts.map +1 -0
- package/dist/analyse-prepass/backends/gitnexus.js +367 -0
- package/dist/analyse-prepass/backends/gitnexus.js.map +1 -0
- package/dist/analyse-prepass/backends/grep-only.d.ts +33 -0
- package/dist/analyse-prepass/backends/grep-only.d.ts.map +1 -0
- package/dist/analyse-prepass/backends/grep-only.js +377 -0
- package/dist/analyse-prepass/backends/grep-only.js.map +1 -0
- package/dist/analyse-prepass/backends/index.d.ts +28 -0
- package/dist/analyse-prepass/backends/index.d.ts.map +1 -0
- package/dist/analyse-prepass/backends/index.js +36 -0
- package/dist/analyse-prepass/backends/index.js.map +1 -0
- package/dist/analyse-prepass/backends/method-patterns.d.ts +27 -0
- package/dist/analyse-prepass/backends/method-patterns.d.ts.map +1 -0
- package/dist/analyse-prepass/backends/method-patterns.js +177 -0
- package/dist/analyse-prepass/backends/method-patterns.js.map +1 -0
- package/dist/analyse-prepass/backends/walk.d.ts +7 -0
- package/dist/analyse-prepass/backends/walk.d.ts.map +1 -0
- package/dist/analyse-prepass/backends/walk.js +105 -0
- package/dist/analyse-prepass/backends/walk.js.map +1 -0
- package/dist/analyse-prepass/index.d.ts +76 -0
- package/dist/analyse-prepass/index.d.ts.map +1 -0
- package/dist/analyse-prepass/index.js +114 -0
- package/dist/analyse-prepass/index.js.map +1 -0
- package/dist/analyse-prepass/interface.d.ts +222 -0
- package/dist/analyse-prepass/interface.d.ts.map +1 -0
- package/dist/analyse-prepass/interface.js +20 -0
- package/dist/analyse-prepass/interface.js.map +1 -0
- package/dist/libs/instance-factories/cli/templates/commander/command-generator.js +104 -0
- package/dist/libs/instance-factories/orms/templates/prisma/schema-generator.js +25 -4
- package/libs/instance-factories/cli/templates/commander/command-generator.ts +104 -0
- package/libs/instance-factories/orms/templates/prisma/schema-generator.ts +43 -5
- package/package.json +5 -1
- package/libs/instance-factories/cli/templates/commander/command-generator.d.ts +0 -14
- package/libs/instance-factories/cli/templates/commander/command-generator.js +0 -182
|
@@ -0,0 +1,377 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Grep-only backend — minimum-viable fallback for `StructuralPrepass`.
|
|
3
|
+
*
|
|
4
|
+
* Walks the source tree with regex per language. No external tools, no
|
|
5
|
+
* indexer, no SQLite. Useful for:
|
|
6
|
+
* - Tests / CI environments where CodeGraph isn't installed
|
|
7
|
+
* - Bootstrapping the adapter layer before CodeGraph is wired
|
|
8
|
+
* - Sanity-check baseline (a real backend should at least equal this)
|
|
9
|
+
*
|
|
10
|
+
* Capabilities: only the bare minimum (no call graph, no cross-file
|
|
11
|
+
* resolution, no clustering). Adapters that need more should select a
|
|
12
|
+
* richer backend.
|
|
13
|
+
*/
|
|
14
|
+
import { readFileSync } from 'fs';
|
|
15
|
+
import { extname } from 'path';
|
|
16
|
+
import { walkSourceTree, globToRegex } from './walk.js';
|
|
17
|
+
import { extractEmits, extractDbWrites, extractExternalCalls, extractThrows, extractAsyncBoundaries, countBranchPoints, extractCallNames, sliceBody, } from './method-patterns.js';
|
|
18
|
+
const LANG_PATTERNS = {
|
|
19
|
+
typescript: {
|
|
20
|
+
fileExtensions: ['.ts', '.tsx'],
|
|
21
|
+
classRegex: /^(?:export\s+)?(?:default\s+)?(?:abstract\s+)?class\s+(\w+)/gm,
|
|
22
|
+
methodRegex: /^\s+(?:public|private|protected|static|async)?\s*(?:async\s+)?(\w+)\s*\(/gm,
|
|
23
|
+
interfaceRegex: /^(?:export\s+)?interface\s+(\w+)/gm,
|
|
24
|
+
importRegex: /^import\s+(?:type\s+)?(?:\{([^}]+)\}|(\w+))\s+from\s+["']([^"']+)["']/gm,
|
|
25
|
+
},
|
|
26
|
+
javascript: {
|
|
27
|
+
fileExtensions: ['.js', '.jsx', '.mjs', '.cjs'],
|
|
28
|
+
classRegex: /^(?:export\s+)?(?:default\s+)?class\s+(\w+)/gm,
|
|
29
|
+
methodRegex: /^\s+(?:async\s+)?(\w+)\s*\(/gm,
|
|
30
|
+
importRegex: /^import\s+(?:\{([^}]+)\}|(\w+))\s+from\s+["']([^"']+)["']/gm,
|
|
31
|
+
},
|
|
32
|
+
python: {
|
|
33
|
+
fileExtensions: ['.py'],
|
|
34
|
+
classRegex: /^class\s+(\w+)/gm,
|
|
35
|
+
methodRegex: /^\s+def\s+(\w+)\s*\(/gm,
|
|
36
|
+
importRegex: /^(?:from\s+(\S+)\s+)?import\s+(.+)$/gm,
|
|
37
|
+
},
|
|
38
|
+
go: {
|
|
39
|
+
fileExtensions: ['.go'],
|
|
40
|
+
classRegex: /^type\s+(\w+)\s+struct/gm,
|
|
41
|
+
methodRegex: /^func\s+\([^)]*\)\s+(\w+)\s*\(/gm,
|
|
42
|
+
importRegex: /^import\s+(?:\(([\s\S]*?)\)|"([^"]+)")/gm,
|
|
43
|
+
},
|
|
44
|
+
};
|
|
45
|
+
/**
|
|
46
|
+
* Detect a language using grep-only's own per-language pattern set.
|
|
47
|
+
* (Matches against fileExtensions inside LANG_PATTERNS — different from
|
|
48
|
+
* walk.ts's `detectLanguage` which uses a broader extension set without
|
|
49
|
+
* regex patterns.)
|
|
50
|
+
*/
|
|
51
|
+
function detectGrepLanguage(filePath) {
|
|
52
|
+
const ext = extname(filePath).toLowerCase();
|
|
53
|
+
for (const [lang, patterns] of Object.entries(LANG_PATTERNS)) {
|
|
54
|
+
if (patterns.fileExtensions.includes(ext))
|
|
55
|
+
return lang;
|
|
56
|
+
}
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
export class GrepOnlyBackend {
|
|
60
|
+
sourceDir = '';
|
|
61
|
+
files = [];
|
|
62
|
+
/** Cache file→content to avoid re-reading on multiple calls. */
|
|
63
|
+
fileCache = new Map();
|
|
64
|
+
capabilities = {
|
|
65
|
+
callGraph: false,
|
|
66
|
+
crossFileResolution: false,
|
|
67
|
+
componentClustering: false,
|
|
68
|
+
fullTextSearch: false,
|
|
69
|
+
fileWatching: false,
|
|
70
|
+
};
|
|
71
|
+
async init(sourceDir) {
|
|
72
|
+
this.sourceDir = sourceDir;
|
|
73
|
+
this.files = [];
|
|
74
|
+
this.fileCache.clear();
|
|
75
|
+
}
|
|
76
|
+
async index() {
|
|
77
|
+
const start = Date.now();
|
|
78
|
+
// Walk the full filesystem; downstream listClasses / listMethods filter by
|
|
79
|
+
// language, but listFiles needs to expose all files (e.g. schema.prisma).
|
|
80
|
+
this.files = walkSourceTree(this.sourceDir);
|
|
81
|
+
return {
|
|
82
|
+
files: this.files.length,
|
|
83
|
+
symbols: 0, // we don't pre-index symbols; queries scan on demand
|
|
84
|
+
durationMs: Date.now() - start,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
async listFiles(filter) {
|
|
88
|
+
let result = [...this.files];
|
|
89
|
+
if (filter?.dir) {
|
|
90
|
+
result = result.filter((f) => f.startsWith(filter.dir));
|
|
91
|
+
}
|
|
92
|
+
if (filter?.lang) {
|
|
93
|
+
result = result.filter((f) => detectGrepLanguage(f) === filter.lang);
|
|
94
|
+
}
|
|
95
|
+
if (filter?.glob) {
|
|
96
|
+
const re = globToRegex(filter.glob);
|
|
97
|
+
result = result.filter((f) => re.test(f));
|
|
98
|
+
}
|
|
99
|
+
return result;
|
|
100
|
+
}
|
|
101
|
+
async listClasses(filter) {
|
|
102
|
+
const out = [];
|
|
103
|
+
for (const file of this.files) {
|
|
104
|
+
if (filter?.dir && !file.startsWith(filter.dir))
|
|
105
|
+
continue;
|
|
106
|
+
const lang = detectGrepLanguage(file);
|
|
107
|
+
if (!lang)
|
|
108
|
+
continue;
|
|
109
|
+
const patterns = LANG_PATTERNS[lang];
|
|
110
|
+
const text = await this.fileSourceText(file);
|
|
111
|
+
const lines = text.split('\n');
|
|
112
|
+
const matches = [...text.matchAll(patterns.classRegex)];
|
|
113
|
+
for (const m of matches) {
|
|
114
|
+
const name = m[1];
|
|
115
|
+
if (filter?.namePattern && !filter.namePattern.test(name))
|
|
116
|
+
continue;
|
|
117
|
+
const idx = m.index ?? 0;
|
|
118
|
+
const startLine = text.slice(0, idx).split('\n').length;
|
|
119
|
+
// Crude end-line: scan forward for matching brace depth
|
|
120
|
+
const endLine = this.findClassEnd(lines, startLine - 1, lang);
|
|
121
|
+
out.push({
|
|
122
|
+
kind: 'class',
|
|
123
|
+
name,
|
|
124
|
+
qualifiedName: name, // grep-only doesn't track namespacing
|
|
125
|
+
filePath: file,
|
|
126
|
+
startLine,
|
|
127
|
+
endLine,
|
|
128
|
+
isExported: m[0].includes('export'),
|
|
129
|
+
language: lang,
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
return out;
|
|
134
|
+
}
|
|
135
|
+
async listMethods(filter) {
|
|
136
|
+
const out = [];
|
|
137
|
+
const classes = await this.listClasses();
|
|
138
|
+
const targetClasses = filter?.class ? classes.filter((c) => c.qualifiedName === filter.class) : classes;
|
|
139
|
+
for (const cls of targetClasses) {
|
|
140
|
+
const lang = cls.language;
|
|
141
|
+
const patterns = LANG_PATTERNS[lang];
|
|
142
|
+
if (!patterns.methodRegex)
|
|
143
|
+
continue;
|
|
144
|
+
const text = await this.fileSourceText(cls.filePath);
|
|
145
|
+
const lines = text.split('\n');
|
|
146
|
+
// Slice the class body
|
|
147
|
+
const bodyLines = lines.slice(cls.startLine - 1, cls.endLine);
|
|
148
|
+
const body = bodyLines.join('\n');
|
|
149
|
+
const matches = [...body.matchAll(patterns.methodRegex)];
|
|
150
|
+
for (const m of matches) {
|
|
151
|
+
const name = m[1];
|
|
152
|
+
// Skip pseudo-methods like 'constructor', 'if', 'for', etc. (heuristic — keyword filter)
|
|
153
|
+
if (['if', 'for', 'while', 'switch', 'catch', 'return'].includes(name))
|
|
154
|
+
continue;
|
|
155
|
+
if (filter?.nameIn && !filter.nameIn.includes(name))
|
|
156
|
+
continue;
|
|
157
|
+
const lineOffset = body.slice(0, m.index ?? 0).split('\n').length;
|
|
158
|
+
out.push({
|
|
159
|
+
kind: 'method',
|
|
160
|
+
name,
|
|
161
|
+
qualifiedName: `${cls.name}.${name}`,
|
|
162
|
+
filePath: cls.filePath,
|
|
163
|
+
startLine: cls.startLine + lineOffset - 1,
|
|
164
|
+
endLine: cls.startLine + lineOffset - 1, // grep-only doesn't trace function ends
|
|
165
|
+
language: lang,
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
return out;
|
|
170
|
+
}
|
|
171
|
+
async listInterfaces(filter) {
|
|
172
|
+
const out = [];
|
|
173
|
+
for (const file of this.files) {
|
|
174
|
+
if (filter?.dir && !file.startsWith(filter.dir))
|
|
175
|
+
continue;
|
|
176
|
+
const lang = detectGrepLanguage(file);
|
|
177
|
+
if (!lang)
|
|
178
|
+
continue;
|
|
179
|
+
const patterns = LANG_PATTERNS[lang];
|
|
180
|
+
if (!patterns.interfaceRegex)
|
|
181
|
+
continue;
|
|
182
|
+
const text = await this.fileSourceText(file);
|
|
183
|
+
const matches = [...text.matchAll(patterns.interfaceRegex)];
|
|
184
|
+
for (const m of matches) {
|
|
185
|
+
const name = m[1];
|
|
186
|
+
if (filter?.namePattern && !filter.namePattern.test(name))
|
|
187
|
+
continue;
|
|
188
|
+
const idx = m.index ?? 0;
|
|
189
|
+
const startLine = text.slice(0, idx).split('\n').length;
|
|
190
|
+
out.push({
|
|
191
|
+
kind: 'interface',
|
|
192
|
+
name,
|
|
193
|
+
qualifiedName: name,
|
|
194
|
+
filePath: file,
|
|
195
|
+
startLine,
|
|
196
|
+
endLine: startLine,
|
|
197
|
+
isExported: m[0].includes('export'),
|
|
198
|
+
language: lang,
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
return out;
|
|
203
|
+
}
|
|
204
|
+
async listImports(file) {
|
|
205
|
+
const lang = detectGrepLanguage(file);
|
|
206
|
+
if (!lang)
|
|
207
|
+
return [];
|
|
208
|
+
const patterns = LANG_PATTERNS[lang];
|
|
209
|
+
if (!patterns.importRegex)
|
|
210
|
+
return [];
|
|
211
|
+
const text = await this.fileSourceText(file);
|
|
212
|
+
const out = [];
|
|
213
|
+
for (const m of text.matchAll(patterns.importRegex)) {
|
|
214
|
+
// TS/JS: groups are (named imports, default import, module path)
|
|
215
|
+
// Python: (from-module, names) or (names) for plain imports
|
|
216
|
+
// Go: (block content, single-line module)
|
|
217
|
+
if (lang === 'typescript' || lang === 'javascript') {
|
|
218
|
+
const named = m[1] ? m[1].split(',').map((s) => s.trim()) : [];
|
|
219
|
+
const def = m[2] ? [m[2]] : [];
|
|
220
|
+
const mod = m[3];
|
|
221
|
+
out.push({ fromFile: file, toModule: mod, symbols: [...named, ...def] });
|
|
222
|
+
}
|
|
223
|
+
else if (lang === 'python') {
|
|
224
|
+
const fromMod = m[1] || '';
|
|
225
|
+
const names = (m[2] || '').split(',').map((s) => s.trim());
|
|
226
|
+
out.push({ fromFile: file, toModule: fromMod, symbols: names });
|
|
227
|
+
}
|
|
228
|
+
else if (lang === 'go') {
|
|
229
|
+
const mod = m[2] || (m[1] || '').replace(/"/g, '').trim();
|
|
230
|
+
if (mod)
|
|
231
|
+
out.push({ fromFile: file, toModule: mod, symbols: [] });
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
return out;
|
|
235
|
+
}
|
|
236
|
+
async fileSourceText(file) {
|
|
237
|
+
if (this.fileCache.has(file))
|
|
238
|
+
return this.fileCache.get(file);
|
|
239
|
+
const text = readFileSync(file, 'utf8');
|
|
240
|
+
this.fileCache.set(file, text);
|
|
241
|
+
return text;
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* Extract per-method facts via regex over the method body.
|
|
245
|
+
*
|
|
246
|
+
* Locates the method (parses class containing `qualifiedName`'s class part,
|
|
247
|
+
* scans for the method by name), pulls the body via brace-depth tracking,
|
|
248
|
+
* runs each pattern extractor on it.
|
|
249
|
+
*/
|
|
250
|
+
async getMethodDetails(qualifiedName) {
|
|
251
|
+
// Parse "ClassName.methodName" — we only support single-level qualified
|
|
252
|
+
// names for v1; namespaced classes (e.g. SomeModule.ClassName.method) fall
|
|
253
|
+
// through as if `ClassName.methodName`.
|
|
254
|
+
const lastDot = qualifiedName.lastIndexOf('.');
|
|
255
|
+
if (lastDot < 0)
|
|
256
|
+
return null;
|
|
257
|
+
const className = qualifiedName.slice(0, lastDot);
|
|
258
|
+
const methodName = qualifiedName.slice(lastDot + 1);
|
|
259
|
+
const classes = await this.listClasses({ namePattern: new RegExp(`^${className}$`) });
|
|
260
|
+
if (classes.length === 0)
|
|
261
|
+
return null;
|
|
262
|
+
const cls = classes[0];
|
|
263
|
+
const text = await this.fileSourceText(cls.filePath);
|
|
264
|
+
const lines = text.split('\n');
|
|
265
|
+
// Find the method declaration line within the class body
|
|
266
|
+
const classBody = lines.slice(cls.startLine - 1, cls.endLine);
|
|
267
|
+
let methodStartIdx = -1;
|
|
268
|
+
let methodSig = '';
|
|
269
|
+
for (let i = 0; i < classBody.length; i++) {
|
|
270
|
+
const line = classBody[i];
|
|
271
|
+
// Match: `[modifiers] [async] methodName(...)` — capture the method's name
|
|
272
|
+
const re = new RegExp(`^\\s+(?:public|private|protected|static|async)?\\s*(?:async\\s+)?${methodName}\\s*\\(`);
|
|
273
|
+
if (re.test(line)) {
|
|
274
|
+
methodStartIdx = i;
|
|
275
|
+
// Capture the signature line (single-line approximation; multi-line
|
|
276
|
+
// signatures roll up to the next `{`)
|
|
277
|
+
let sig = line.trim();
|
|
278
|
+
let j = i;
|
|
279
|
+
while (!sig.includes('{') && j + 1 < classBody.length) {
|
|
280
|
+
j++;
|
|
281
|
+
sig += ' ' + classBody[j].trim();
|
|
282
|
+
}
|
|
283
|
+
methodSig = sig.replace(/\s*\{\s*$/, '').trim();
|
|
284
|
+
break;
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
if (methodStartIdx < 0)
|
|
288
|
+
return null;
|
|
289
|
+
// Find body via brace depth — scan from the first `{` after methodStartIdx
|
|
290
|
+
const bodyStartFileLineIdx = cls.startLine - 1 + methodStartIdx;
|
|
291
|
+
let depth = 0;
|
|
292
|
+
let started = false;
|
|
293
|
+
let bodyEndFileLineIdx = bodyStartFileLineIdx;
|
|
294
|
+
for (let i = bodyStartFileLineIdx; i < lines.length; i++) {
|
|
295
|
+
for (const ch of lines[i]) {
|
|
296
|
+
if (ch === '{') {
|
|
297
|
+
depth++;
|
|
298
|
+
started = true;
|
|
299
|
+
}
|
|
300
|
+
else if (ch === '}') {
|
|
301
|
+
depth--;
|
|
302
|
+
if (started && depth === 0) {
|
|
303
|
+
bodyEndFileLineIdx = i;
|
|
304
|
+
i = lines.length; // break outer loop
|
|
305
|
+
break;
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
const bodyLines = lines.slice(bodyStartFileLineIdx, bodyEndFileLineIdx + 1);
|
|
311
|
+
const body = bodyLines.join('\n');
|
|
312
|
+
// Resolve called names → Symbol[] when possible (look up in our class index)
|
|
313
|
+
const callNames = extractCallNames(body);
|
|
314
|
+
const allMethods = await this.listMethods();
|
|
315
|
+
const calls = [];
|
|
316
|
+
for (const name of callNames) {
|
|
317
|
+
const match = allMethods.find((m) => m.name === name);
|
|
318
|
+
if (match)
|
|
319
|
+
calls.push(match);
|
|
320
|
+
}
|
|
321
|
+
return {
|
|
322
|
+
qualifiedName,
|
|
323
|
+
signature: methodSig,
|
|
324
|
+
body,
|
|
325
|
+
filePath: cls.filePath,
|
|
326
|
+
startLine: bodyStartFileLineIdx + 1,
|
|
327
|
+
endLine: bodyEndFileLineIdx + 1,
|
|
328
|
+
language: cls.language,
|
|
329
|
+
calls,
|
|
330
|
+
emits: extractEmits(body),
|
|
331
|
+
dbWrites: extractDbWrites(body),
|
|
332
|
+
externalCalls: extractExternalCalls(body),
|
|
333
|
+
throws: extractThrows(body),
|
|
334
|
+
asyncBoundaries: extractAsyncBoundaries(body),
|
|
335
|
+
branchPoints: countBranchPoints(body),
|
|
336
|
+
bodyTextSliced: sliceBody(body),
|
|
337
|
+
};
|
|
338
|
+
}
|
|
339
|
+
// ────────────────────────────────────────────────────────────────────
|
|
340
|
+
// Internals
|
|
341
|
+
// ────────────────────────────────────────────────────────────────────
|
|
342
|
+
/** Find the closing line of a class block by tracking brace depth. */
|
|
343
|
+
findClassEnd(lines, startLineIdx, lang) {
|
|
344
|
+
if (lang === 'python') {
|
|
345
|
+
// Indentation-based: find the next line at the SAME or LESS indent than the class line.
|
|
346
|
+
const classLine = lines[startLineIdx];
|
|
347
|
+
const baseIndent = classLine.match(/^(\s*)/)?.[1].length ?? 0;
|
|
348
|
+
for (let i = startLineIdx + 1; i < lines.length; i++) {
|
|
349
|
+
const line = lines[i];
|
|
350
|
+
if (line.trim() === '')
|
|
351
|
+
continue;
|
|
352
|
+
const indent = line.match(/^(\s*)/)?.[1].length ?? 0;
|
|
353
|
+
if (indent <= baseIndent)
|
|
354
|
+
return i; // 1-indexed, but i is 0-indexed; this is the first line AFTER the class
|
|
355
|
+
}
|
|
356
|
+
return lines.length;
|
|
357
|
+
}
|
|
358
|
+
// C-style: track brace depth
|
|
359
|
+
let depth = 0;
|
|
360
|
+
let started = false;
|
|
361
|
+
for (let i = startLineIdx; i < lines.length; i++) {
|
|
362
|
+
for (const char of lines[i]) {
|
|
363
|
+
if (char === '{') {
|
|
364
|
+
depth++;
|
|
365
|
+
started = true;
|
|
366
|
+
}
|
|
367
|
+
else if (char === '}') {
|
|
368
|
+
depth--;
|
|
369
|
+
if (started && depth === 0)
|
|
370
|
+
return i + 1; // 1-indexed line number
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
return lines.length;
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
//# sourceMappingURL=grep-only.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grep-only.js","sourceRoot":"","sources":["../../../src/analyse-prepass/backends/grep-only.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Backend selector — picks the best available `StructuralPrepass`.
|
|
3
|
+
*
|
|
4
|
+
* Order: gitnexus (if available + opted-in) → codegraph (if available)
|
|
5
|
+
* → grep-only (always works).
|
|
6
|
+
*
|
|
7
|
+
* GitNexus is more invasive (heavier stack, longer index time) but provides
|
|
8
|
+
* Leiden community detection (clusterFiles capability) which can help with
|
|
9
|
+
* multi-component codebases. Default `auto` prefers CodeGraph for the
|
|
10
|
+
* smaller-footprint case; explicitly request `gitnexus` for clustering.
|
|
11
|
+
*/
|
|
12
|
+
import type { StructuralPrepass } from '../interface.js';
|
|
13
|
+
import { GrepOnlyBackend } from './grep-only.js';
|
|
14
|
+
import { CodeGraphBackend } from './codegraph.js';
|
|
15
|
+
import { GitNexusBackend } from './gitnexus.js';
|
|
16
|
+
export { GrepOnlyBackend, CodeGraphBackend, GitNexusBackend };
|
|
17
|
+
export type BackendName = 'codegraph' | 'gitnexus' | 'grep-only' | 'auto';
|
|
18
|
+
/**
|
|
19
|
+
* Select a backend by name, or auto-pick a sensible default.
|
|
20
|
+
*
|
|
21
|
+
* `auto` semantics:
|
|
22
|
+
* - CodeGraph + sqlite3 both available → CodeGraph (lighter; richest baseline)
|
|
23
|
+
* - Otherwise → grep-only (always works, no external tools)
|
|
24
|
+
* - Note: GitNexus is NOT auto-selected even when available, because its
|
|
25
|
+
* index overhead is significant. Explicit opt-in via name='gitnexus'.
|
|
26
|
+
*/
|
|
27
|
+
export declare function selectBackend(name?: BackendName): StructuralPrepass;
|
|
28
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/analyse-prepass/backends/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAEhD,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,eAAe,EAAE,CAAC;AAE9D,MAAM,MAAM,WAAW,GAAG,WAAW,GAAG,UAAU,GAAG,WAAW,GAAG,MAAM,CAAC;AAE1E;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,IAAI,GAAE,WAAoB,GAAG,iBAAiB,CAyB3E"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { GrepOnlyBackend } from './grep-only.js';
|
|
2
|
+
import { CodeGraphBackend } from './codegraph.js';
|
|
3
|
+
import { GitNexusBackend } from './gitnexus.js';
|
|
4
|
+
export { GrepOnlyBackend, CodeGraphBackend, GitNexusBackend };
|
|
5
|
+
/**
|
|
6
|
+
* Select a backend by name, or auto-pick a sensible default.
|
|
7
|
+
*
|
|
8
|
+
* `auto` semantics:
|
|
9
|
+
* - CodeGraph + sqlite3 both available → CodeGraph (lighter; richest baseline)
|
|
10
|
+
* - Otherwise → grep-only (always works, no external tools)
|
|
11
|
+
* - Note: GitNexus is NOT auto-selected even when available, because its
|
|
12
|
+
* index overhead is significant. Explicit opt-in via name='gitnexus'.
|
|
13
|
+
*/
|
|
14
|
+
export function selectBackend(name = 'auto') {
|
|
15
|
+
if (name === 'codegraph') {
|
|
16
|
+
if (!CodeGraphBackend.isAvailable()) {
|
|
17
|
+
throw new Error('CodeGraph backend requested but not available. Install with `npm i -g @colbymchenry/codegraph` and ensure sqlite3 is on PATH.');
|
|
18
|
+
}
|
|
19
|
+
return new CodeGraphBackend();
|
|
20
|
+
}
|
|
21
|
+
if (name === 'gitnexus') {
|
|
22
|
+
if (!GitNexusBackend.isAvailable()) {
|
|
23
|
+
throw new Error('GitNexus backend requested but not available. Install with `npm i -g gitnexus`.');
|
|
24
|
+
}
|
|
25
|
+
return new GitNexusBackend();
|
|
26
|
+
}
|
|
27
|
+
if (name === 'grep-only') {
|
|
28
|
+
return new GrepOnlyBackend();
|
|
29
|
+
}
|
|
30
|
+
// auto — prefer CodeGraph (lighter, fast); GitNexus stays opt-in.
|
|
31
|
+
if (CodeGraphBackend.isAvailable()) {
|
|
32
|
+
return new CodeGraphBackend();
|
|
33
|
+
}
|
|
34
|
+
return new GrepOnlyBackend();
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/analyse-prepass/backends/index.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAEhD,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,eAAe,EAAE,CAAC;AAI9D;;;;;;;;GAQG;AACH,MAAM,UAAU,aAAa,CAAC,OAAoB,MAAM;IACtD,IAAI,IAAI,KAAK,WAAW,EAAE,CAAC;QACzB,IAAI,CAAC,gBAAgB,CAAC,WAAW,EAAE,EAAE,CAAC;YACpC,MAAM,IAAI,KAAK,CACb,+HAA+H,CAChI,CAAC;QACJ,CAAC;QACD,OAAO,IAAI,gBAAgB,EAAE,CAAC;IAChC,CAAC;IACD,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;QACxB,IAAI,CAAC,eAAe,CAAC,WAAW,EAAE,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CACb,iFAAiF,CAClF,CAAC;QACJ,CAAC;QACD,OAAO,IAAI,eAAe,EAAE,CAAC;IAC/B,CAAC;IACD,IAAI,IAAI,KAAK,WAAW,EAAE,CAAC;QACzB,OAAO,IAAI,eAAe,EAAE,CAAC;IAC/B,CAAC;IACD,kEAAkE;IAClE,IAAI,gBAAgB,CAAC,WAAW,EAAE,EAAE,CAAC;QACnC,OAAO,IAAI,gBAAgB,EAAE,CAAC;IAChC,CAAC;IACD,OAAO,IAAI,eAAe,EAAE,CAAC;AAC/B,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Method-body pattern extraction — shared between grep-only and CodeGraph
|
|
3
|
+
* backends. CodeGraph provides the call-graph piece via SQL; everything
|
|
4
|
+
* else (event emission, DB writes, throws, async boundaries, branch points,
|
|
5
|
+
* region slicing) is regex over raw source text. These patterns are
|
|
6
|
+
* deliberately broad — adapters can refine per framework.
|
|
7
|
+
*
|
|
8
|
+
* Patterns covered for v1: TypeScript / JavaScript. Python / Go / Java
|
|
9
|
+
* adapters add their own pattern sets per language.
|
|
10
|
+
*/
|
|
11
|
+
import type { MethodFactSheet } from '../interface.js';
|
|
12
|
+
/** Slice a method body into the canonical PRECONDITIONS/EXECUTE/POSTCONDITIONS/EVENTS regions. */
|
|
13
|
+
export declare function sliceBody(body: string): MethodFactSheet['bodyTextSliced'];
|
|
14
|
+
/** Extract event names emitted from a TS/JS method body. */
|
|
15
|
+
export declare function extractEmits(body: string): string[];
|
|
16
|
+
/** Extract Prisma-style DB writes from a TS/JS method body. */
|
|
17
|
+
export declare function extractDbWrites(body: string): MethodFactSheet['dbWrites'];
|
|
18
|
+
/** Extract external system calls from a TS/JS method body. */
|
|
19
|
+
export declare function extractExternalCalls(body: string): MethodFactSheet['externalCalls'];
|
|
20
|
+
/** Extract throw statements (the type of error being thrown). */
|
|
21
|
+
export declare function extractThrows(body: string): string[];
|
|
22
|
+
/** Find async boundaries (await / Promise.all / Promise.race). */
|
|
23
|
+
export declare function extractAsyncBoundaries(body: string): MethodFactSheet['asyncBoundaries'];
|
|
24
|
+
/** Count branch points — if / else if / switch case / catch / ternary. */
|
|
25
|
+
export declare function countBranchPoints(body: string): number;
|
|
26
|
+
export declare function extractCallNames(body: string): string[];
|
|
27
|
+
//# sourceMappingURL=method-patterns.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"method-patterns.d.ts","sourceRoot":"","sources":["../../../src/analyse-prepass/backends/method-patterns.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAUvD,kGAAkG;AAClG,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,CAAC,gBAAgB,CAAC,CAmBzE;AAED,4DAA4D;AAC5D,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAiBnD;AAED,+DAA+D;AAC/D,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,CAAC,UAAU,CAAC,CAqCzE;AAED,8DAA8D;AAC9D,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,CAAC,eAAe,CAAC,CAmBnF;AAED,iEAAiE;AACjE,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAQpD;AAED,kEAAkE;AAClE,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,CAAC,iBAAiB,CAAC,CAkBvF;AAED,0EAA0E;AAC1E,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAStD;AAcD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAWvD"}
|