milens 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +213 -0
- package/dist/analyzer/engine.d.ts +11 -0
- package/dist/analyzer/engine.d.ts.map +1 -0
- package/dist/analyzer/engine.js +163 -0
- package/dist/analyzer/engine.js.map +1 -0
- package/dist/analyzer/resolver.d.ts +12 -0
- package/dist/analyzer/resolver.d.ts.map +1 -0
- package/dist/analyzer/resolver.js +119 -0
- package/dist/analyzer/resolver.js.map +1 -0
- package/dist/analyzer/scanner.d.ts +6 -0
- package/dist/analyzer/scanner.d.ts.map +1 -0
- package/dist/analyzer/scanner.js +73 -0
- package/dist/analyzer/scanner.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +269 -0
- package/dist/cli.js.map +1 -0
- package/dist/parser/extract.d.ts +24 -0
- package/dist/parser/extract.d.ts.map +1 -0
- package/dist/parser/extract.js +239 -0
- package/dist/parser/extract.js.map +1 -0
- package/dist/parser/lang-go.d.ts +4 -0
- package/dist/parser/lang-go.d.ts.map +1 -0
- package/dist/parser/lang-go.js +45 -0
- package/dist/parser/lang-go.js.map +1 -0
- package/dist/parser/lang-java.d.ts +4 -0
- package/dist/parser/lang-java.d.ts.map +1 -0
- package/dist/parser/lang-java.js +46 -0
- package/dist/parser/lang-java.js.map +1 -0
- package/dist/parser/lang-js.d.ts +4 -0
- package/dist/parser/lang-js.d.ts.map +1 -0
- package/dist/parser/lang-js.js +64 -0
- package/dist/parser/lang-js.js.map +1 -0
- package/dist/parser/lang-php.d.ts +4 -0
- package/dist/parser/lang-php.d.ts.map +1 -0
- package/dist/parser/lang-php.js +54 -0
- package/dist/parser/lang-php.js.map +1 -0
- package/dist/parser/lang-py.d.ts +4 -0
- package/dist/parser/lang-py.d.ts.map +1 -0
- package/dist/parser/lang-py.js +46 -0
- package/dist/parser/lang-py.js.map +1 -0
- package/dist/parser/lang-rust.d.ts +4 -0
- package/dist/parser/lang-rust.d.ts.map +1 -0
- package/dist/parser/lang-rust.js +54 -0
- package/dist/parser/lang-rust.js.map +1 -0
- package/dist/parser/lang-ts.d.ts +4 -0
- package/dist/parser/lang-ts.d.ts.map +1 -0
- package/dist/parser/lang-ts.js +88 -0
- package/dist/parser/lang-ts.js.map +1 -0
- package/dist/parser/lang-vue.d.ts +12 -0
- package/dist/parser/lang-vue.d.ts.map +1 -0
- package/dist/parser/lang-vue.js +28 -0
- package/dist/parser/lang-vue.js.map +1 -0
- package/dist/parser/languages.d.ts +6 -0
- package/dist/parser/languages.d.ts.map +1 -0
- package/dist/parser/languages.js +24 -0
- package/dist/parser/languages.js.map +1 -0
- package/dist/parser/loader.d.ts +5 -0
- package/dist/parser/loader.d.ts.map +1 -0
- package/dist/parser/loader.js +37 -0
- package/dist/parser/loader.js.map +1 -0
- package/dist/server/mcp.d.ts +5 -0
- package/dist/server/mcp.d.ts.map +1 -0
- package/dist/server/mcp.js +355 -0
- package/dist/server/mcp.js.map +1 -0
- package/dist/skills.d.ts +8 -0
- package/dist/skills.d.ts.map +1 -0
- package/dist/skills.js +178 -0
- package/dist/skills.js.map +1 -0
- package/dist/store/db.d.ts +59 -0
- package/dist/store/db.d.ts.map +1 -0
- package/dist/store/db.js +260 -0
- package/dist/store/db.js.map +1 -0
- package/dist/store/registry.d.ts +13 -0
- package/dist/store/registry.d.ts.map +1 -0
- package/dist/store/registry.js +69 -0
- package/dist/store/registry.js.map +1 -0
- package/dist/store/schema.sql +60 -0
- package/dist/types.d.ts +67 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/package.json +60 -0
package/dist/cli.js
ADDED
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Command } from 'commander';
|
|
3
|
+
import { resolve, join, dirname, basename } from 'node:path';
|
|
4
|
+
import { mkdirSync, existsSync, readFileSync, rmSync } from 'node:fs';
|
|
5
|
+
import { createHash } from 'node:crypto';
|
|
6
|
+
const program = new Command();
|
|
7
|
+
program
|
|
8
|
+
.name('milens')
|
|
9
|
+
.description('Code intelligence engine — analyze codebases, build knowledge graphs, serve via MCP')
|
|
10
|
+
.version('0.2.0');
|
|
11
|
+
program
|
|
12
|
+
.command('analyze')
|
|
13
|
+
.description('Index a codebase: parse symbols, resolve dependencies, build search index')
|
|
14
|
+
.option('-p, --path <path>', 'Repository root path', '.')
|
|
15
|
+
.option('-o, --output <dir>', 'Output directory for database')
|
|
16
|
+
.option('-v, --verbose', 'Show detailed progress')
|
|
17
|
+
.option('-f, --force', 'Force full re-index')
|
|
18
|
+
.option('-s, --skills', 'Generate SKILL.md files for each code area')
|
|
19
|
+
.action(async (opts) => {
|
|
20
|
+
const rootPath = resolve(opts.path);
|
|
21
|
+
const outDir = opts.output ?? join(rootPath, '.milens');
|
|
22
|
+
mkdirSync(outDir, { recursive: true });
|
|
23
|
+
const dbPath = join(outDir, 'milens.db');
|
|
24
|
+
// Load project aliases (tsconfig paths, etc.)
|
|
25
|
+
const aliases = loadAliases(rootPath);
|
|
26
|
+
const { analyze } = await import('./analyzer/engine.js');
|
|
27
|
+
const stats = await analyze({
|
|
28
|
+
rootPath,
|
|
29
|
+
dbPath,
|
|
30
|
+
verbose: opts.verbose,
|
|
31
|
+
force: opts.force,
|
|
32
|
+
aliases,
|
|
33
|
+
});
|
|
34
|
+
// Register in global registry
|
|
35
|
+
const contentHash = createHash('sha256').update(JSON.stringify(stats)).digest('hex').slice(0, 12);
|
|
36
|
+
const { RepoRegistry } = await import('./store/registry.js');
|
|
37
|
+
new RepoRegistry().register(rootPath, dbPath, contentHash);
|
|
38
|
+
console.log(`\n✓ Indexed ${stats.symbolCount} symbols, ${stats.linkCount} links across ${stats.filesParsed} files (${stats.durationMs}ms)`);
|
|
39
|
+
if (opts.skills) {
|
|
40
|
+
const { Database } = await import('./store/db.js');
|
|
41
|
+
const { generateSkills } = await import('./skills.js');
|
|
42
|
+
const db = new Database(dbPath);
|
|
43
|
+
const result = generateSkills(db, rootPath);
|
|
44
|
+
db.close();
|
|
45
|
+
console.log(`✓ Generated ${result.count} skill files for each editor:`);
|
|
46
|
+
for (const d of result.dirs)
|
|
47
|
+
console.log(` ${d}`);
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
program
|
|
51
|
+
.command('search <query>')
|
|
52
|
+
.description('Search symbols by name')
|
|
53
|
+
.option('-l, --limit <n>', 'Max results', '20')
|
|
54
|
+
.option('-p, --path <path>', 'Repository root path', '.')
|
|
55
|
+
.action(async (query, opts) => {
|
|
56
|
+
const { Database } = await import('./store/db.js');
|
|
57
|
+
const { RepoRegistry } = await import('./store/registry.js');
|
|
58
|
+
const dbPath = new RepoRegistry().findDbPath(resolve(opts.path));
|
|
59
|
+
if (!dbPath) {
|
|
60
|
+
console.error('Not indexed. Run `milens analyze` first.');
|
|
61
|
+
process.exit(1);
|
|
62
|
+
}
|
|
63
|
+
const db = new Database(dbPath);
|
|
64
|
+
const results = db.searchSymbols(query, parseInt(opts.limit));
|
|
65
|
+
for (const s of results) {
|
|
66
|
+
console.log(`${s.name} [${s.kind}] ${s.filePath}:${s.startLine}${s.exported ? ' (exported)' : ''}`);
|
|
67
|
+
}
|
|
68
|
+
db.close();
|
|
69
|
+
});
|
|
70
|
+
program
|
|
71
|
+
.command('inspect <symbol>')
|
|
72
|
+
.description('360° view of a symbol: refs, deps, hierarchy')
|
|
73
|
+
.option('-p, --path <path>', 'Repository root path', '.')
|
|
74
|
+
.action(async (symbol, opts) => {
|
|
75
|
+
const { Database } = await import('./store/db.js');
|
|
76
|
+
const { RepoRegistry } = await import('./store/registry.js');
|
|
77
|
+
const dbPath = new RepoRegistry().findDbPath(resolve(opts.path));
|
|
78
|
+
if (!dbPath) {
|
|
79
|
+
console.error('Not indexed. Run `milens analyze` first.');
|
|
80
|
+
process.exit(1);
|
|
81
|
+
}
|
|
82
|
+
const db = new Database(dbPath);
|
|
83
|
+
const symbols = db.findSymbolByName(symbol);
|
|
84
|
+
for (const sym of symbols) {
|
|
85
|
+
console.log(`\n${sym.name} [${sym.kind}] ${sym.filePath}:${sym.startLine}`);
|
|
86
|
+
const incoming = db.getIncomingLinks(sym.id);
|
|
87
|
+
if (incoming.length) {
|
|
88
|
+
console.log(' incoming:');
|
|
89
|
+
for (const l of incoming) {
|
|
90
|
+
const from = db.findSymbolById(l.fromId);
|
|
91
|
+
console.log(` ${l.type}: ${from?.name ?? l.fromId} (${from?.filePath ?? '?'})`);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
const outgoing = db.getOutgoingLinks(sym.id);
|
|
95
|
+
if (outgoing.length) {
|
|
96
|
+
console.log(' outgoing:');
|
|
97
|
+
for (const l of outgoing) {
|
|
98
|
+
const to = db.findSymbolById(l.toId);
|
|
99
|
+
console.log(` ${l.type}: ${to?.name ?? l.toId} (${to?.filePath ?? '?'})`);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
db.close();
|
|
104
|
+
});
|
|
105
|
+
program
|
|
106
|
+
.command('impact <symbol>')
|
|
107
|
+
.description('Blast radius: what breaks if this symbol changes?')
|
|
108
|
+
.option('-d, --direction <dir>', 'upstream or downstream', 'upstream')
|
|
109
|
+
.option('--depth <n>', 'Max traversal depth', '3')
|
|
110
|
+
.option('-p, --path <path>', 'Repository root path', '.')
|
|
111
|
+
.action(async (symbol, opts) => {
|
|
112
|
+
const { Database } = await import('./store/db.js');
|
|
113
|
+
const { RepoRegistry } = await import('./store/registry.js');
|
|
114
|
+
const dbPath = new RepoRegistry().findDbPath(resolve(opts.path));
|
|
115
|
+
if (!dbPath) {
|
|
116
|
+
console.error('Not indexed. Run `milens analyze` first.');
|
|
117
|
+
process.exit(1);
|
|
118
|
+
}
|
|
119
|
+
const db = new Database(dbPath);
|
|
120
|
+
const symbols = db.findSymbolByName(symbol);
|
|
121
|
+
const depth = parseInt(opts.depth);
|
|
122
|
+
for (const sym of symbols) {
|
|
123
|
+
console.log(`\nTARGET: ${sym.name} [${sym.kind}] ${sym.filePath}:${sym.startLine}`);
|
|
124
|
+
const refs = opts.direction === 'upstream'
|
|
125
|
+
? db.findUpstream(sym.id, depth)
|
|
126
|
+
: db.findDownstream(sym.id, depth);
|
|
127
|
+
if (refs.length === 0) {
|
|
128
|
+
console.log(` No ${opts.direction} dependencies.`);
|
|
129
|
+
}
|
|
130
|
+
for (const { symbol: ref, depth: d, via } of refs) {
|
|
131
|
+
console.log(` [depth ${d}] ${ref.name} [${ref.kind}] ${ref.filePath}:${ref.startLine} (${via})`);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
db.close();
|
|
135
|
+
});
|
|
136
|
+
program
|
|
137
|
+
.command('serve')
|
|
138
|
+
.description('Start MCP server')
|
|
139
|
+
.option('-p, --path <path>', 'Repository root path', '.')
|
|
140
|
+
.option('--http', 'Use HTTP transport instead of stdio')
|
|
141
|
+
.option('--port <port>', 'HTTP port', '3100')
|
|
142
|
+
.action(async (opts) => {
|
|
143
|
+
if (opts.http) {
|
|
144
|
+
const { startHttp } = await import('./server/mcp.js');
|
|
145
|
+
await startHttp(parseInt(opts.port), resolve(opts.path));
|
|
146
|
+
}
|
|
147
|
+
else {
|
|
148
|
+
const { startStdio } = await import('./server/mcp.js');
|
|
149
|
+
await startStdio(resolve(opts.path));
|
|
150
|
+
}
|
|
151
|
+
});
|
|
152
|
+
program
|
|
153
|
+
.command('status')
|
|
154
|
+
.description('Show index status')
|
|
155
|
+
.option('-p, --path <path>', 'Repository root path', '.')
|
|
156
|
+
.action(async (opts) => {
|
|
157
|
+
const { Database } = await import('./store/db.js');
|
|
158
|
+
const { RepoRegistry } = await import('./store/registry.js');
|
|
159
|
+
const reg = new RepoRegistry();
|
|
160
|
+
const entry = reg.findByRoot(resolve(opts.path));
|
|
161
|
+
if (!entry) {
|
|
162
|
+
console.log('Not indexed.');
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
const db = new Database(entry.dbPath);
|
|
166
|
+
const stats = db.getStats();
|
|
167
|
+
console.log(`Repository: ${entry.rootPath}`);
|
|
168
|
+
console.log(`Database: ${entry.dbPath}`);
|
|
169
|
+
console.log(`Indexed: ${entry.analyzedAt}`);
|
|
170
|
+
console.log(`Symbols: ${stats.symbols}`);
|
|
171
|
+
console.log(`Links: ${stats.links}`);
|
|
172
|
+
console.log(`Files: ${stats.files}`);
|
|
173
|
+
db.close();
|
|
174
|
+
});
|
|
175
|
+
program
|
|
176
|
+
.command('list')
|
|
177
|
+
.description('List all indexed repositories')
|
|
178
|
+
.action(async () => {
|
|
179
|
+
const { RepoRegistry } = await import('./store/registry.js');
|
|
180
|
+
const entries = new RepoRegistry().listAll();
|
|
181
|
+
if (entries.length === 0) {
|
|
182
|
+
console.log('No indexed repositories.');
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
console.log(`${entries.length} indexed repositories:\n`);
|
|
186
|
+
for (const entry of entries) {
|
|
187
|
+
console.log(` ${entry.rootPath}`);
|
|
188
|
+
console.log(` DB: ${entry.dbPath}`);
|
|
189
|
+
console.log(` Indexed: ${entry.analyzedAt}`);
|
|
190
|
+
console.log('');
|
|
191
|
+
}
|
|
192
|
+
});
|
|
193
|
+
program
|
|
194
|
+
.command('clean')
|
|
195
|
+
.description('Remove index for a repository')
|
|
196
|
+
.option('-p, --path <path>', 'Repository root path', '.')
|
|
197
|
+
.option('--all', 'Remove all indexes')
|
|
198
|
+
.action(async (opts) => {
|
|
199
|
+
const { RepoRegistry } = await import('./store/registry.js');
|
|
200
|
+
const reg = new RepoRegistry();
|
|
201
|
+
if (opts.all) {
|
|
202
|
+
const entries = reg.listAll();
|
|
203
|
+
for (const e of entries) {
|
|
204
|
+
deleteIndex(e.dbPath);
|
|
205
|
+
reg.remove(e.rootPath);
|
|
206
|
+
}
|
|
207
|
+
console.log(`Cleaned ${entries.length} repositories.`);
|
|
208
|
+
}
|
|
209
|
+
else {
|
|
210
|
+
const rootPath = resolve(opts.path);
|
|
211
|
+
const entry = reg.findByRoot(rootPath);
|
|
212
|
+
if (!entry) {
|
|
213
|
+
console.log('Not indexed.');
|
|
214
|
+
return;
|
|
215
|
+
}
|
|
216
|
+
deleteIndex(entry.dbPath);
|
|
217
|
+
reg.remove(rootPath);
|
|
218
|
+
console.log(`Cleaned index for ${rootPath}`);
|
|
219
|
+
}
|
|
220
|
+
});
|
|
221
|
+
program.parse();
|
|
222
|
+
// ── Helpers ──
|
|
223
|
+
function loadAliases(rootPath) {
|
|
224
|
+
const aliases = {};
|
|
225
|
+
const tsconfigPath = join(rootPath, 'tsconfig.json');
|
|
226
|
+
if (existsSync(tsconfigPath)) {
|
|
227
|
+
try {
|
|
228
|
+
const raw = readFileSync(tsconfigPath, 'utf-8')
|
|
229
|
+
.replace(/\/\/.*$/gm, '')
|
|
230
|
+
.replace(/\/\*[\s\S]*?\*\//g, '');
|
|
231
|
+
const cfg = JSON.parse(raw);
|
|
232
|
+
const paths = cfg.compilerOptions?.paths ?? {};
|
|
233
|
+
for (const [alias, targets] of Object.entries(paths)) {
|
|
234
|
+
const clean = alias.replace('/*', '');
|
|
235
|
+
const target = targets[0]?.replace('/*', '').replace('./', '') ?? '';
|
|
236
|
+
if (clean && target)
|
|
237
|
+
aliases[clean] = target;
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
catch { /* ignore */ }
|
|
241
|
+
}
|
|
242
|
+
// PSR-4 from composer.json
|
|
243
|
+
const composerPath = join(rootPath, 'composer.json');
|
|
244
|
+
if (existsSync(composerPath)) {
|
|
245
|
+
try {
|
|
246
|
+
const composer = JSON.parse(readFileSync(composerPath, 'utf-8'));
|
|
247
|
+
for (const [ns, dir] of Object.entries(composer.autoload?.['psr-4'] ?? {})) {
|
|
248
|
+
aliases[ns] = dir.replace(/\/$/, '');
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
catch { /* ignore */ }
|
|
252
|
+
}
|
|
253
|
+
return aliases;
|
|
254
|
+
}
|
|
255
|
+
function deleteIndex(dbPath) {
|
|
256
|
+
const dir = dirname(dbPath);
|
|
257
|
+
if (basename(dir) === '.milens') {
|
|
258
|
+
rmSync(dir, { recursive: true, force: true });
|
|
259
|
+
}
|
|
260
|
+
else {
|
|
261
|
+
for (const suffix of ['', '-wal', '-shm']) {
|
|
262
|
+
try {
|
|
263
|
+
rmSync(dbPath + suffix, { force: true });
|
|
264
|
+
}
|
|
265
|
+
catch { /* ignore */ }
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type Parser from 'web-tree-sitter';
|
|
2
|
+
import type { ExtractionResult } from '../types.js';
|
|
3
|
+
export interface LangSpec {
|
|
4
|
+
id: string;
|
|
5
|
+
extensions: string[];
|
|
6
|
+
wasmName: string;
|
|
7
|
+
queries: {
|
|
8
|
+
functions?: string;
|
|
9
|
+
classes?: string;
|
|
10
|
+
methods?: string;
|
|
11
|
+
interfaces?: string;
|
|
12
|
+
enums?: string;
|
|
13
|
+
structs?: string;
|
|
14
|
+
traits?: string;
|
|
15
|
+
imports?: string;
|
|
16
|
+
calls?: string;
|
|
17
|
+
exports?: string;
|
|
18
|
+
heritage?: string;
|
|
19
|
+
};
|
|
20
|
+
resolveImport(raw: string, fromFile: string, root: string, aliases: Record<string, string>): string | null;
|
|
21
|
+
}
|
|
22
|
+
export declare function clearQueryCache(): void;
|
|
23
|
+
export declare function extractFromTree(tree: Parser.Tree, lang: Parser.Language, spec: LangSpec, filePath: string): ExtractionResult;
|
|
24
|
+
//# sourceMappingURL=extract.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extract.d.ts","sourceRoot":"","sources":["../../src/parser/extract.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,iBAAiB,CAAC;AAC1C,OAAO,KAAK,EAA+C,gBAAgB,EAAc,MAAM,aAAa,CAAC;AAI7G,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE;QACP,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,GAAG,IAAI,CAAC;CAC5G;AAqBD,wBAAgB,eAAe,IAAI,IAAI,CAEtC;AAqHD,wBAAgB,eAAe,CAC7B,IAAI,EAAE,MAAM,CAAC,IAAI,EACjB,IAAI,EAAE,MAAM,CAAC,QAAQ,EACrB,IAAI,EAAE,QAAQ,EACd,QAAQ,EAAE,MAAM,GACf,gBAAgB,CAmIlB"}
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
// ── Compiled query cache: compile once per (language, queryString) ──
|
|
2
|
+
// Key = langPtr + "|" + queryString, Value = compiled Query (or null if invalid)
|
|
3
|
+
const queryCache = new Map();
|
|
4
|
+
function getOrCompileQuery(lang, queryStr) {
|
|
5
|
+
// Use the language pointer address as part of cache key (each Language instance is unique per WASM)
|
|
6
|
+
const cacheKey = `${lang.ptr ?? lang.toString()}|${queryStr}`;
|
|
7
|
+
if (queryCache.has(cacheKey))
|
|
8
|
+
return queryCache.get(cacheKey);
|
|
9
|
+
try {
|
|
10
|
+
const q = lang.query(queryStr);
|
|
11
|
+
queryCache.set(cacheKey, q);
|
|
12
|
+
return q;
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
queryCache.set(cacheKey, null);
|
|
16
|
+
return null;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
export function clearQueryCache() {
|
|
20
|
+
queryCache.clear();
|
|
21
|
+
}
|
|
22
|
+
// ── Helpers (stateless, hoisted out of hot path) ──
|
|
23
|
+
function captureText(match, captureName) {
|
|
24
|
+
const captures = match.captures;
|
|
25
|
+
for (let i = 0; i < captures.length; i++) {
|
|
26
|
+
if (captures[i].name === captureName)
|
|
27
|
+
return captures[i].node.text;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
function captureNode(match, captureName) {
|
|
31
|
+
const captures = match.captures;
|
|
32
|
+
for (let i = 0; i < captures.length; i++) {
|
|
33
|
+
if (captures[i].name === captureName)
|
|
34
|
+
return captures[i].node;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
// ── Import name extraction from AST ──
|
|
38
|
+
function collectImportNames(defNode) {
|
|
39
|
+
const names = [];
|
|
40
|
+
walkImportNames(defNode, names);
|
|
41
|
+
return names;
|
|
42
|
+
}
|
|
43
|
+
function walkImportNames(node, out) {
|
|
44
|
+
// TS/JS: import { Foo, Bar as B }
|
|
45
|
+
if (node.type === 'import_specifier') {
|
|
46
|
+
const n = node.childForFieldName('name');
|
|
47
|
+
const a = node.childForFieldName('alias');
|
|
48
|
+
if (n)
|
|
49
|
+
out.push({ name: n.text, alias: a?.text });
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
// TS/JS: default import (identifier directly under import_clause)
|
|
53
|
+
if (node.type === 'identifier' && node.parent?.type === 'import_clause') {
|
|
54
|
+
out.push({ name: node.text });
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
// Python: from x import Foo, Bar as B
|
|
58
|
+
if (node.type === 'import_from_statement') {
|
|
59
|
+
for (let i = 0; i < node.namedChildCount; i++) {
|
|
60
|
+
const child = node.namedChild(i);
|
|
61
|
+
if (child === node.childForFieldName('module_name'))
|
|
62
|
+
continue;
|
|
63
|
+
if (child.type === 'dotted_name')
|
|
64
|
+
out.push({ name: child.text });
|
|
65
|
+
else if (child.type === 'aliased_import') {
|
|
66
|
+
const n = child.childForFieldName('name');
|
|
67
|
+
const a = child.childForFieldName('alias');
|
|
68
|
+
if (n)
|
|
69
|
+
out.push({ name: n.text, alias: a?.text });
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
// Recurse for other node types (import_clause, named_imports, etc.)
|
|
75
|
+
for (let i = 0; i < node.namedChildCount; i++) {
|
|
76
|
+
walkImportNames(node.namedChild(i), out);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
// ── Heritage type detection from AST ancestry ──
|
|
80
|
+
function detectHeritageType(node) {
|
|
81
|
+
let cur = node.parent;
|
|
82
|
+
while (cur) {
|
|
83
|
+
const t = cur.type;
|
|
84
|
+
if (t === 'implements_clause' || t === 'super_interfaces' || t === 'class_interface_clause' || t === 'impl_item') {
|
|
85
|
+
return 'implements';
|
|
86
|
+
}
|
|
87
|
+
if (t === 'extends_clause' || t === 'superclass' || t === 'base_clause') {
|
|
88
|
+
return 'extends';
|
|
89
|
+
}
|
|
90
|
+
cur = cur.parent;
|
|
91
|
+
}
|
|
92
|
+
return 'extends';
|
|
93
|
+
}
|
|
94
|
+
function buildSpanIndex(symbols) {
|
|
95
|
+
const spans = [];
|
|
96
|
+
for (const s of symbols) {
|
|
97
|
+
if (s.kind === 'function' || s.kind === 'method' || s.kind === 'class' || s.kind === 'struct' || s.kind === 'trait') {
|
|
98
|
+
spans.push({ startLine: s.startLine, endLine: s.endLine, id: s.id });
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
// Sort by startLine desc so we find the innermost (tightest) enclosing first
|
|
102
|
+
spans.sort((a, b) => b.startLine - a.startLine);
|
|
103
|
+
return spans;
|
|
104
|
+
}
|
|
105
|
+
function findEnclosing(spans, line) {
|
|
106
|
+
// Linear scan on pre-sorted array — tightest match wins (innermost symbol)
|
|
107
|
+
for (let i = 0; i < spans.length; i++) {
|
|
108
|
+
const sp = spans[i];
|
|
109
|
+
if (sp.startLine <= line && sp.endLine >= line)
|
|
110
|
+
return sp.id;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
// ── Symbol query type mapping (constant) ──
|
|
114
|
+
const SYMBOL_QUERY_TYPES = [
|
|
115
|
+
{ key: 'functions', kind: 'function' },
|
|
116
|
+
{ key: 'classes', kind: 'class' },
|
|
117
|
+
{ key: 'methods', kind: 'method' },
|
|
118
|
+
{ key: 'interfaces', kind: 'interface' },
|
|
119
|
+
{ key: 'enums', kind: 'enum' },
|
|
120
|
+
{ key: 'structs', kind: 'struct' },
|
|
121
|
+
{ key: 'traits', kind: 'trait' },
|
|
122
|
+
];
|
|
123
|
+
// Container kinds for method → parent resolution
|
|
124
|
+
const CONTAINER_KINDS = new Set(['class', 'struct', 'trait']);
|
|
125
|
+
// ── Universal symbol extractor ──
|
|
126
|
+
export function extractFromTree(tree, lang, spec, filePath) {
|
|
127
|
+
const symbols = [];
|
|
128
|
+
const imports = [];
|
|
129
|
+
const calls = [];
|
|
130
|
+
const heritage = [];
|
|
131
|
+
const exportedNames = new Set();
|
|
132
|
+
const root = tree.rootNode;
|
|
133
|
+
function runQuery(queryStr) {
|
|
134
|
+
const q = getOrCompileQuery(lang, queryStr);
|
|
135
|
+
return q ? q.matches(root) : [];
|
|
136
|
+
}
|
|
137
|
+
function makeSymbolId(kind, name, line) {
|
|
138
|
+
return `${filePath}#${kind}:${name}:${line}`;
|
|
139
|
+
}
|
|
140
|
+
// ── Extract symbol definitions ──
|
|
141
|
+
for (const { key, kind } of SYMBOL_QUERY_TYPES) {
|
|
142
|
+
const queryStr = spec.queries[key];
|
|
143
|
+
if (!queryStr)
|
|
144
|
+
continue;
|
|
145
|
+
for (const match of runQuery(queryStr)) {
|
|
146
|
+
const name = captureText(match, 'name');
|
|
147
|
+
const defNode = captureNode(match, 'def');
|
|
148
|
+
if (!name || !defNode)
|
|
149
|
+
continue;
|
|
150
|
+
const sym = {
|
|
151
|
+
id: makeSymbolId(kind, name, defNode.startPosition.row + 1),
|
|
152
|
+
name,
|
|
153
|
+
kind,
|
|
154
|
+
filePath,
|
|
155
|
+
startLine: defNode.startPosition.row + 1,
|
|
156
|
+
endLine: defNode.endPosition.row + 1,
|
|
157
|
+
exported: false,
|
|
158
|
+
};
|
|
159
|
+
// For methods, find parent class/struct/trait
|
|
160
|
+
if (kind === 'method') {
|
|
161
|
+
const parentClass = symbols.find(s => CONTAINER_KINDS.has(s.kind) &&
|
|
162
|
+
s.startLine <= sym.startLine && s.endLine >= sym.endLine);
|
|
163
|
+
if (parentClass)
|
|
164
|
+
sym.parentId = parentClass.id;
|
|
165
|
+
}
|
|
166
|
+
symbols.push(sym);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
// ── Extract exports ──
|
|
170
|
+
if (spec.queries.exports) {
|
|
171
|
+
for (const match of runQuery(spec.queries.exports)) {
|
|
172
|
+
const name = captureText(match, 'name');
|
|
173
|
+
if (name)
|
|
174
|
+
exportedNames.add(name);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
// Mark exported symbols
|
|
178
|
+
for (const sym of symbols) {
|
|
179
|
+
if (exportedNames.has(sym.name))
|
|
180
|
+
sym.exported = true;
|
|
181
|
+
}
|
|
182
|
+
// ── Extract imports ──
|
|
183
|
+
if (spec.queries.imports) {
|
|
184
|
+
for (const match of runQuery(spec.queries.imports)) {
|
|
185
|
+
const source = captureText(match, 'source');
|
|
186
|
+
const defNode = captureNode(match, 'def');
|
|
187
|
+
if (!source || !defNode)
|
|
188
|
+
continue;
|
|
189
|
+
const cleanSource = source.replace(/^['"]|['"]$/g, '');
|
|
190
|
+
const names = collectImportNames(defNode);
|
|
191
|
+
imports.push({
|
|
192
|
+
filePath,
|
|
193
|
+
modulePath: cleanSource,
|
|
194
|
+
names,
|
|
195
|
+
isDefault: false,
|
|
196
|
+
isWildcard: names.length === 0,
|
|
197
|
+
line: defNode.startPosition.row + 1,
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
// ── Extract calls (with span index for fast enclosing lookup) ──
|
|
202
|
+
if (spec.queries.calls) {
|
|
203
|
+
const spans = buildSpanIndex(symbols);
|
|
204
|
+
for (const match of runQuery(spec.queries.calls)) {
|
|
205
|
+
const callee = captureText(match, 'callee');
|
|
206
|
+
const defNode = captureNode(match, 'def');
|
|
207
|
+
if (!callee || !defNode)
|
|
208
|
+
continue;
|
|
209
|
+
const callLine = defNode.startPosition.row + 1;
|
|
210
|
+
const receiver = captureText(match, 'receiver');
|
|
211
|
+
calls.push({
|
|
212
|
+
filePath,
|
|
213
|
+
enclosingSymbolId: findEnclosing(spans, callLine) ?? `${filePath}#module:_top:0`,
|
|
214
|
+
calleeName: callee,
|
|
215
|
+
receiver,
|
|
216
|
+
line: callLine,
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
// ── Extract heritage (extends/implements) ──
|
|
221
|
+
if (spec.queries.heritage) {
|
|
222
|
+
for (const match of runQuery(spec.queries.heritage)) {
|
|
223
|
+
const child = captureText(match, 'child');
|
|
224
|
+
const parentNode = captureNode(match, 'parent');
|
|
225
|
+
if (!child || !parentNode)
|
|
226
|
+
continue;
|
|
227
|
+
const defNode = captureNode(match, 'def');
|
|
228
|
+
heritage.push({
|
|
229
|
+
filePath,
|
|
230
|
+
childName: child,
|
|
231
|
+
parentName: parentNode.text,
|
|
232
|
+
type: detectHeritageType(parentNode),
|
|
233
|
+
line: defNode?.startPosition.row ? defNode.startPosition.row + 1 : 0,
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
return { symbols, imports, calls, heritage, exportedNames };
|
|
238
|
+
}
|
|
239
|
+
//# sourceMappingURL=extract.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extract.js","sourceRoot":"","sources":["../../src/parser/extract.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lang-go.d.ts","sourceRoot":"","sources":["../../src/parser/lang-go.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAE7C,QAAA,MAAM,IAAI,EAAE,QAsCX,CAAC;AAEF,eAAe,IAAI,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { join, relative } from 'node:path';
|
|
2
|
+
import { existsSync } from 'node:fs';
|
|
3
|
+
const spec = {
|
|
4
|
+
id: 'go',
|
|
5
|
+
extensions: ['.go'],
|
|
6
|
+
wasmName: 'tree-sitter-go',
|
|
7
|
+
queries: {
|
|
8
|
+
functions: `(function_declaration name: (identifier) @name) @def`,
|
|
9
|
+
methods: `(method_declaration
|
|
10
|
+
name: (field_identifier) @name
|
|
11
|
+
) @def`,
|
|
12
|
+
structs: `(type_declaration
|
|
13
|
+
(type_spec
|
|
14
|
+
name: (type_identifier) @name
|
|
15
|
+
type: (struct_type)
|
|
16
|
+
)
|
|
17
|
+
) @def`,
|
|
18
|
+
interfaces: `(type_declaration
|
|
19
|
+
(type_spec
|
|
20
|
+
name: (type_identifier) @name
|
|
21
|
+
type: (interface_type)
|
|
22
|
+
)
|
|
23
|
+
) @def`,
|
|
24
|
+
imports: `(import_spec
|
|
25
|
+
path: (interpreted_string_literal) @source
|
|
26
|
+
) @def`,
|
|
27
|
+
calls: `
|
|
28
|
+
(call_expression function: (identifier) @callee) @def
|
|
29
|
+
(call_expression function: (selector_expression field: (field_identifier) @callee)) @def
|
|
30
|
+
`,
|
|
31
|
+
},
|
|
32
|
+
resolveImport(raw, fromFile, root, _aliases) {
|
|
33
|
+
// Go imports are package paths — only resolve local packages
|
|
34
|
+
const cleanPath = raw.replace(/^"|"$/g, '');
|
|
35
|
+
if (cleanPath.includes('.'))
|
|
36
|
+
return null; // external module
|
|
37
|
+
// Local package: look for directory under root
|
|
38
|
+
const pkgDir = join(root, cleanPath);
|
|
39
|
+
if (existsSync(pkgDir))
|
|
40
|
+
return relative(root, pkgDir).replace(/\\/g, '/');
|
|
41
|
+
return null;
|
|
42
|
+
},
|
|
43
|
+
};
|
|
44
|
+
export default spec;
|
|
45
|
+
//# sourceMappingURL=lang-go.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lang-go.js","sourceRoot":"","sources":["../../src/parser/lang-go.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAW,QAAQ,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAGrC,MAAM,IAAI,GAAa;IACrB,EAAE,EAAE,IAAI;IACR,UAAU,EAAE,CAAC,KAAK,CAAC;IACnB,QAAQ,EAAE,gBAAgB;IAC1B,OAAO,EAAE;QACP,SAAS,EAAE,sDAAsD;QACjE,OAAO,EAAE;;WAEF;QACP,OAAO,EAAE;;;;;WAKF;QACP,UAAU,EAAE;;;;;WAKL;QACP,OAAO,EAAE;;WAEF;QACP,KAAK,EAAE;;;KAGN;KACF;IACD,aAAa,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ;QACzC,6DAA6D;QAC7D,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QAC5C,IAAI,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC,CAAC,kBAAkB;QAC5D,+CAA+C;QAC/C,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QACrC,IAAI,UAAU,CAAC,MAAM,CAAC;YAAE,OAAO,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAC1E,OAAO,IAAI,CAAC;IACd,CAAC;CACF,CAAC;AAEF,eAAe,IAAI,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lang-java.d.ts","sourceRoot":"","sources":["../../src/parser/lang-java.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAE7C,QAAA,MAAM,IAAI,EAAE,QAuCX,CAAC;AAEF,eAAe,IAAI,CAAC"}
|