milens 0.4.1 → 0.4.2
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 +75 -75
- package/README.md +479 -453
- package/dist/analyzer/config.d.ts +8 -0
- package/dist/analyzer/config.d.ts.map +1 -0
- package/dist/analyzer/config.js +132 -0
- package/dist/analyzer/config.js.map +1 -0
- package/dist/analyzer/engine.d.ts.map +1 -1
- package/dist/analyzer/engine.js +77 -4
- package/dist/analyzer/engine.js.map +1 -1
- package/dist/analyzer/enrich.d.ts +18 -0
- package/dist/analyzer/enrich.d.ts.map +1 -0
- package/dist/analyzer/enrich.js +139 -0
- package/dist/analyzer/enrich.js.map +1 -0
- package/dist/analyzer/resolver.d.ts +10 -1
- package/dist/analyzer/resolver.d.ts.map +1 -1
- package/dist/analyzer/resolver.js +309 -18
- package/dist/analyzer/resolver.js.map +1 -1
- package/dist/cli.js +474 -31
- package/dist/cli.js.map +1 -1
- package/dist/parser/extract.d.ts +2 -0
- package/dist/parser/extract.d.ts.map +1 -1
- package/dist/parser/extract.js +27 -3
- package/dist/parser/extract.js.map +1 -1
- package/dist/parser/lang-go.js +22 -22
- package/dist/parser/lang-go.js.map +1 -1
- package/dist/parser/lang-java.d.ts.map +1 -1
- package/dist/parser/lang-java.js +29 -25
- package/dist/parser/lang-java.js.map +1 -1
- package/dist/parser/lang-js.d.ts.map +1 -1
- package/dist/parser/lang-js.js +60 -43
- package/dist/parser/lang-js.js.map +1 -1
- package/dist/parser/lang-php.d.ts.map +1 -1
- package/dist/parser/lang-php.js +39 -33
- package/dist/parser/lang-php.js.map +1 -1
- package/dist/parser/lang-py.js +31 -31
- package/dist/parser/lang-ruby.d.ts +4 -0
- package/dist/parser/lang-ruby.d.ts.map +1 -0
- package/dist/parser/lang-ruby.js +50 -0
- package/dist/parser/lang-ruby.js.map +1 -0
- package/dist/parser/lang-rust.js +24 -24
- package/dist/parser/lang-ts.d.ts.map +1 -1
- package/dist/parser/lang-ts.js +73 -57
- package/dist/parser/lang-ts.js.map +1 -1
- package/dist/parser/languages.d.ts.map +1 -1
- package/dist/parser/languages.js +2 -1
- package/dist/parser/languages.js.map +1 -1
- package/dist/server/mcp.d.ts.map +1 -1
- package/dist/server/mcp.js +860 -98
- package/dist/server/mcp.js.map +1 -1
- package/dist/skills.js +100 -100
- package/dist/store/db.d.ts +62 -0
- package/dist/store/db.d.ts.map +1 -1
- package/dist/store/db.js +244 -59
- package/dist/store/db.js.map +1 -1
- package/dist/store/schema.sql +83 -60
- package/dist/types.d.ts +14 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +60 -60
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auto-detect project aliases from config files.
|
|
3
|
+
* Supports: tsconfig.json, jsconfig.json, composer.json (PSR-4),
|
|
4
|
+
* pyproject.toml (tool.poetry / [project] packages),
|
|
5
|
+
* Cargo.toml (workspace members), go.mod (module name).
|
|
6
|
+
*/
|
|
7
|
+
export declare function loadAliases(rootPath: string): Record<string, string>;
|
|
8
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/analyzer/config.ts"],"names":[],"mappings":"AAGA;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAsBpE"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { join, resolve } from 'node:path';
|
|
2
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
3
|
+
/**
|
|
4
|
+
* Auto-detect project aliases from config files.
|
|
5
|
+
* Supports: tsconfig.json, jsconfig.json, composer.json (PSR-4),
|
|
6
|
+
* pyproject.toml (tool.poetry / [project] packages),
|
|
7
|
+
* Cargo.toml (workspace members), go.mod (module name).
|
|
8
|
+
*/
|
|
9
|
+
export function loadAliases(rootPath) {
|
|
10
|
+
const aliases = {};
|
|
11
|
+
// ── TypeScript: tsconfig.json paths ──
|
|
12
|
+
readTsConfigPaths(join(rootPath, 'tsconfig.json'), aliases);
|
|
13
|
+
// ── JavaScript: jsconfig.json paths ──
|
|
14
|
+
readTsConfigPaths(join(rootPath, 'jsconfig.json'), aliases);
|
|
15
|
+
// ── PHP: composer.json PSR-4 autoload ──
|
|
16
|
+
readComposerPsr4(join(rootPath, 'composer.json'), aliases);
|
|
17
|
+
// ── Python: pyproject.toml package dirs ──
|
|
18
|
+
readPyprojectAliases(join(rootPath, 'pyproject.toml'), aliases);
|
|
19
|
+
// ── Go: go.mod module name ──
|
|
20
|
+
readGoModAliases(join(rootPath, 'go.mod'), aliases);
|
|
21
|
+
// ── Rust: Cargo.toml workspace members ──
|
|
22
|
+
readCargoAliases(join(rootPath, 'Cargo.toml'), aliases);
|
|
23
|
+
return aliases;
|
|
24
|
+
}
|
|
25
|
+
function readTsConfigPaths(configPath, aliases) {
|
|
26
|
+
if (!existsSync(configPath))
|
|
27
|
+
return;
|
|
28
|
+
try {
|
|
29
|
+
const raw = readFileSync(configPath, 'utf-8')
|
|
30
|
+
.replace(/\/\/.*$/gm, '') // strip line comments
|
|
31
|
+
.replace(/\/\*[\s\S]*?\*\//g, ''); // strip block comments
|
|
32
|
+
const cfg = JSON.parse(raw);
|
|
33
|
+
// Handle "extends" — resolve base config paths
|
|
34
|
+
if (cfg.extends) {
|
|
35
|
+
const baseDir = resolve(configPath, '..');
|
|
36
|
+
const basePath = resolveExtendsPath(baseDir, cfg.extends);
|
|
37
|
+
if (basePath)
|
|
38
|
+
readTsConfigPaths(basePath, aliases);
|
|
39
|
+
}
|
|
40
|
+
const paths = cfg.compilerOptions?.paths ?? {};
|
|
41
|
+
for (const [alias, targets] of Object.entries(paths)) {
|
|
42
|
+
const clean = alias.replace('/*', '');
|
|
43
|
+
const target = targets[0]?.replace('/*', '').replace('./', '') ?? '';
|
|
44
|
+
if (clean && target)
|
|
45
|
+
aliases[clean] = target;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
catch { /* ignore parse errors */ }
|
|
49
|
+
}
|
|
50
|
+
function resolveExtendsPath(baseDir, extendsValue) {
|
|
51
|
+
// Could be a relative path or a node_modules package
|
|
52
|
+
if (extendsValue.startsWith('.')) {
|
|
53
|
+
const resolved = resolve(baseDir, extendsValue);
|
|
54
|
+
for (const candidate of [resolved, resolved + '.json']) {
|
|
55
|
+
if (existsSync(candidate))
|
|
56
|
+
return candidate;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
function readComposerPsr4(composerPath, aliases) {
|
|
62
|
+
if (!existsSync(composerPath))
|
|
63
|
+
return;
|
|
64
|
+
try {
|
|
65
|
+
const composer = JSON.parse(readFileSync(composerPath, 'utf-8'));
|
|
66
|
+
for (const section of ['autoload', 'autoload-dev']) {
|
|
67
|
+
for (const [ns, dir] of Object.entries(composer[section]?.['psr-4'] ?? {})) {
|
|
68
|
+
aliases[ns] = dir.replace(/\/$/, '');
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
catch { /* ignore */ }
|
|
73
|
+
}
|
|
74
|
+
function readPyprojectAliases(pyprojectPath, aliases) {
|
|
75
|
+
if (!existsSync(pyprojectPath))
|
|
76
|
+
return;
|
|
77
|
+
try {
|
|
78
|
+
const content = readFileSync(pyprojectPath, 'utf-8');
|
|
79
|
+
// Simple TOML parsing for package name → src mapping
|
|
80
|
+
// Look for [tool.poetry] name or [project] name
|
|
81
|
+
const nameMatch = content.match(/^\s*name\s*=\s*"([^"]+)"/m);
|
|
82
|
+
if (nameMatch) {
|
|
83
|
+
const pkgName = nameMatch[1].replace(/-/g, '_');
|
|
84
|
+
// Check common Python source layouts
|
|
85
|
+
const rootDir = resolve(pyprojectPath, '..');
|
|
86
|
+
if (existsSync(join(rootDir, 'src', pkgName))) {
|
|
87
|
+
aliases[pkgName] = `src/${pkgName}`;
|
|
88
|
+
}
|
|
89
|
+
else if (existsSync(join(rootDir, pkgName))) {
|
|
90
|
+
aliases[pkgName] = pkgName;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
catch { /* ignore */ }
|
|
95
|
+
}
|
|
96
|
+
function readGoModAliases(goModPath, aliases) {
|
|
97
|
+
if (!existsSync(goModPath))
|
|
98
|
+
return;
|
|
99
|
+
try {
|
|
100
|
+
const content = readFileSync(goModPath, 'utf-8');
|
|
101
|
+
const moduleMatch = content.match(/^module\s+(\S+)/m);
|
|
102
|
+
if (moduleMatch) {
|
|
103
|
+
aliases[moduleMatch[1]] = '.';
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
catch { /* ignore */ }
|
|
107
|
+
}
|
|
108
|
+
function readCargoAliases(cargoPath, aliases) {
|
|
109
|
+
if (!existsSync(cargoPath))
|
|
110
|
+
return;
|
|
111
|
+
try {
|
|
112
|
+
const content = readFileSync(cargoPath, 'utf-8');
|
|
113
|
+
// Extract [package] name for crate:: alias
|
|
114
|
+
const nameMatch = content.match(/^\s*name\s*=\s*"([^"]+)"/m);
|
|
115
|
+
if (nameMatch) {
|
|
116
|
+
aliases[`crate::${nameMatch[1].replace(/-/g, '_')}`] = 'src';
|
|
117
|
+
}
|
|
118
|
+
// Extract workspace members
|
|
119
|
+
const membersMatch = content.match(/members\s*=\s*\[([^\]]+)\]/);
|
|
120
|
+
if (membersMatch) {
|
|
121
|
+
const members = membersMatch[1].match(/"([^"]+)"/g);
|
|
122
|
+
if (members) {
|
|
123
|
+
for (const m of members) {
|
|
124
|
+
const dir = m.replace(/"/g, '');
|
|
125
|
+
aliases[dir] = dir;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
catch { /* ignore */ }
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/analyzer/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/analyzer/engine.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/analyzer/engine.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAA8E,aAAa,EAAE,MAAM,aAAa,CAAC;AAI7H,UAAU,aAAa;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAED,wBAAsB,OAAO,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC,CAmMzE"}
|
package/dist/analyzer/engine.js
CHANGED
|
@@ -5,7 +5,8 @@ import { langForFile } from '../parser/languages.js';
|
|
|
5
5
|
import { getParser, loadLanguage } from '../parser/loader.js';
|
|
6
6
|
import { extractFromTree, clearQueryCache } from '../parser/extract.js';
|
|
7
7
|
import { extractVueScript, extractVueTemplateRefs } from '../parser/lang-vue.js';
|
|
8
|
-
import {
|
|
8
|
+
import { resolveLinksWithStats } from './resolver.js';
|
|
9
|
+
import { enrichMetadata } from './enrich.js';
|
|
9
10
|
import { Database } from '../store/db.js';
|
|
10
11
|
export async function analyze(opts) {
|
|
11
12
|
const t0 = Date.now();
|
|
@@ -35,6 +36,7 @@ export async function analyze(opts) {
|
|
|
35
36
|
const allImports = [];
|
|
36
37
|
const allCalls = [];
|
|
37
38
|
const allHeritage = [];
|
|
39
|
+
const allReExports = [];
|
|
38
40
|
const resolvedImportPaths = new Map();
|
|
39
41
|
const parsedFiles = new Set();
|
|
40
42
|
let filesParsed = 0;
|
|
@@ -59,6 +61,7 @@ export async function analyze(opts) {
|
|
|
59
61
|
allImports.push(...result.imports);
|
|
60
62
|
allCalls.push(...result.calls);
|
|
61
63
|
allHeritage.push(...result.heritage);
|
|
64
|
+
allReExports.push(...result.reExports);
|
|
62
65
|
// Resolve import paths eagerly
|
|
63
66
|
for (const imp of result.imports) {
|
|
64
67
|
const resolved = file.spec.resolveImport(imp.modulePath, imp.filePath, rootPath, aliases);
|
|
@@ -66,6 +69,13 @@ export async function analyze(opts) {
|
|
|
66
69
|
resolvedImportPaths.set(`${imp.filePath}::${imp.modulePath}`, resolved);
|
|
67
70
|
}
|
|
68
71
|
}
|
|
72
|
+
// Resolve re-export paths
|
|
73
|
+
for (const re of result.reExports) {
|
|
74
|
+
const resolved = file.spec.resolveImport(re.modulePath, re.filePath, rootPath, aliases);
|
|
75
|
+
if (resolved) {
|
|
76
|
+
resolvedImportPaths.set(`${re.filePath}::${re.modulePath}`, resolved);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
69
79
|
db.upsertFileHash(file.relativePath, source);
|
|
70
80
|
parsedFiles.add(file.relativePath);
|
|
71
81
|
filesParsed++;
|
|
@@ -93,17 +103,51 @@ export async function analyze(opts) {
|
|
|
93
103
|
}
|
|
94
104
|
}
|
|
95
105
|
// Phase 5: Resolve cross-file links
|
|
96
|
-
const
|
|
106
|
+
const resolution = resolveLinksWithStats({
|
|
97
107
|
symbolsByFile,
|
|
98
108
|
allSymbols,
|
|
99
109
|
imports: allImports,
|
|
100
110
|
calls: allCalls,
|
|
101
111
|
heritage: allHeritage,
|
|
112
|
+
reExports: allReExports,
|
|
102
113
|
resolvedImportPaths,
|
|
103
114
|
});
|
|
104
|
-
|
|
115
|
+
const links = resolution.links;
|
|
116
|
+
if (opts.verbose) {
|
|
105
117
|
console.log(`[link] Resolved ${links.length} relationships`);
|
|
106
|
-
|
|
118
|
+
if (resolution.unresolvedImports > 0 || resolution.unresolvedCalls > 0) {
|
|
119
|
+
console.log(`[link] ⚠ ${resolution.unresolvedImports} unresolved imports, ${resolution.unresolvedCalls} unresolved calls (internal)`);
|
|
120
|
+
}
|
|
121
|
+
if (resolution.externalImports > 0 || resolution.externalCalls > 0) {
|
|
122
|
+
console.log(`[link] ✓ ${resolution.externalImports} external imports, ${resolution.externalCalls} external calls (expected)`);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
// Phase 6: Enrich — compute roles, heat, zones from resolved graph
|
|
126
|
+
const enriched = enrichMetadata({ symbols: allSymbols, links });
|
|
127
|
+
if (opts.verbose)
|
|
128
|
+
console.log(`[enrich] Computed metadata for ${allSymbols.length} symbols, ${enriched.zones.size} zones`);
|
|
129
|
+
// Phase 6.5: Test coverage — count symbols referenced from test files
|
|
130
|
+
const testFileSymbolIds = new Set();
|
|
131
|
+
const testFiles = new Set();
|
|
132
|
+
for (const sym of allSymbols) {
|
|
133
|
+
if (isTestFile(sym.filePath)) {
|
|
134
|
+
testFileSymbolIds.add(sym.id);
|
|
135
|
+
testFiles.add(sym.filePath);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
const testedSymbolIds = new Set();
|
|
139
|
+
for (const link of links) {
|
|
140
|
+
if (link.type === 'contains')
|
|
141
|
+
continue;
|
|
142
|
+
// Link from test file symbol → production symbol
|
|
143
|
+
const fromIsTest = testFileSymbolIds.has(link.fromId) ||
|
|
144
|
+
[...testFiles].some(f => link.fromId.startsWith(f + '#'));
|
|
145
|
+
if (fromIsTest && !testFileSymbolIds.has(link.toId)) {
|
|
146
|
+
testedSymbolIds.add(link.toId);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
const exportedProduction = allSymbols.filter(s => s.exported && !isTestFile(s.filePath));
|
|
150
|
+
// Phase 7: Persist to database in single transaction
|
|
107
151
|
db.transaction(() => {
|
|
108
152
|
if (opts.force) {
|
|
109
153
|
db.clearSymbolsAndLinks();
|
|
@@ -116,8 +160,25 @@ export async function analyze(opts) {
|
|
|
116
160
|
if (opts.force || parsedFiles.has(sym.filePath))
|
|
117
161
|
db.insertSymbol(sym);
|
|
118
162
|
}
|
|
163
|
+
// Incremental: update role/heat for unchanged files (enrichment recomputes all)
|
|
164
|
+
if (!opts.force) {
|
|
165
|
+
for (const sym of allSymbols) {
|
|
166
|
+
if (!parsedFiles.has(sym.filePath)) {
|
|
167
|
+
db.updateSymbolMetadata(sym.id, sym.role ?? 'leaf', sym.heat ?? 0);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
}
|
|
119
171
|
for (const link of links)
|
|
120
172
|
db.insertLink(link);
|
|
173
|
+
for (const [filePath, zone] of enriched.zones)
|
|
174
|
+
db.setFileZone(filePath, zone);
|
|
175
|
+
db.setMeta('unresolved_imports', String(resolution.unresolvedImports));
|
|
176
|
+
db.setMeta('unresolved_calls', String(resolution.unresolvedCalls));
|
|
177
|
+
db.setMeta('external_imports', String(resolution.externalImports));
|
|
178
|
+
db.setMeta('external_calls', String(resolution.externalCalls));
|
|
179
|
+
db.setMeta('test_files', String(testFiles.size));
|
|
180
|
+
db.setMeta('tested_symbols', String(testedSymbolIds.size));
|
|
181
|
+
db.setMeta('exported_production_symbols', String(exportedProduction.length));
|
|
121
182
|
db.rebuildSearch();
|
|
122
183
|
});
|
|
123
184
|
const stats = {
|
|
@@ -126,6 +187,10 @@ export async function analyze(opts) {
|
|
|
126
187
|
symbolCount: allSymbols.length,
|
|
127
188
|
linkCount: links.length,
|
|
128
189
|
durationMs: Date.now() - t0,
|
|
190
|
+
unresolvedImports: resolution.unresolvedImports,
|
|
191
|
+
unresolvedCalls: resolution.unresolvedCalls,
|
|
192
|
+
externalImports: resolution.externalImports,
|
|
193
|
+
externalCalls: resolution.externalCalls,
|
|
129
194
|
};
|
|
130
195
|
if (opts.verbose) {
|
|
131
196
|
console.log(`[done] ${stats.symbolCount} symbols, ${stats.linkCount} links in ${stats.durationMs}ms`);
|
|
@@ -165,4 +230,12 @@ function parseFile(source, filePath, spec, parser, lang) {
|
|
|
165
230
|
}
|
|
166
231
|
return result;
|
|
167
232
|
}
|
|
233
|
+
/** Check if a file path looks like a test/spec file */
|
|
234
|
+
function isTestFile(filePath) {
|
|
235
|
+
return /\.(test|spec)\.[jt]sx?$/.test(filePath) ||
|
|
236
|
+
/^tests?[/\\]/.test(filePath) ||
|
|
237
|
+
/__tests__[/\\]/.test(filePath) ||
|
|
238
|
+
/_test\.(go|py|rb|rs|java|php)$/.test(filePath) ||
|
|
239
|
+
/^test_.*\.py$/.test(filePath.split('/').pop() ?? '');
|
|
240
|
+
}
|
|
168
241
|
//# sourceMappingURL=engine.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/analyzer/engine.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACxE,OAAO,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AACjF,OAAO,
|
|
1
|
+
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/analyzer/engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { CodeSymbol, SymbolLink } from '../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Phase 6 "Enrich" — compute role, heat, and zone metadata from the resolved graph.
|
|
4
|
+
* Zero new dependencies: pure computation over symbols + links arrays.
|
|
5
|
+
*/
|
|
6
|
+
interface EnrichInput {
|
|
7
|
+
symbols: CodeSymbol[];
|
|
8
|
+
links: SymbolLink[];
|
|
9
|
+
}
|
|
10
|
+
interface EnrichOutput {
|
|
11
|
+
/** symbols with role + heat assigned */
|
|
12
|
+
symbols: CodeSymbol[];
|
|
13
|
+
/** file path → zone name */
|
|
14
|
+
zones: Map<string, string>;
|
|
15
|
+
}
|
|
16
|
+
export declare function enrichMetadata(input: EnrichInput): EnrichOutput;
|
|
17
|
+
export {};
|
|
18
|
+
//# sourceMappingURL=enrich.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enrich.d.ts","sourceRoot":"","sources":["../../src/analyzer/enrich.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAc,MAAM,aAAa,CAAC;AAEtE;;;GAGG;AAEH,UAAU,WAAW;IACnB,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,KAAK,EAAE,UAAU,EAAE,CAAC;CACrB;AAED,UAAU,YAAY;IACpB,wCAAwC;IACxC,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,4BAA4B;IAC5B,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC5B;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,WAAW,GAAG,YAAY,CAuB/D"}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import { dirname } from 'node:path';
|
|
2
|
+
export function enrichMetadata(input) {
|
|
3
|
+
const { symbols, links } = input;
|
|
4
|
+
// ── Build adjacency counts ──
|
|
5
|
+
const inCount = new Map(); // incoming refs (excluding 'contains')
|
|
6
|
+
const outCount = new Map(); // outgoing refs (excluding 'contains')
|
|
7
|
+
for (const link of links) {
|
|
8
|
+
if (link.type === 'contains')
|
|
9
|
+
continue;
|
|
10
|
+
inCount.set(link.toId, (inCount.get(link.toId) ?? 0) + 1);
|
|
11
|
+
outCount.set(link.fromId, (outCount.get(link.fromId) ?? 0) + 1);
|
|
12
|
+
}
|
|
13
|
+
// ── Assign roles ──
|
|
14
|
+
for (const sym of symbols) {
|
|
15
|
+
sym.role = classifyRole(sym, inCount.get(sym.id) ?? 0, outCount.get(sym.id) ?? 0);
|
|
16
|
+
sym.heat = computeHeat(sym, inCount.get(sym.id) ?? 0, outCount.get(sym.id) ?? 0);
|
|
17
|
+
}
|
|
18
|
+
// ── Compute domains (graph-based clustering via link weights) ──
|
|
19
|
+
const zones = computeDomains(symbols, links);
|
|
20
|
+
return { symbols, zones };
|
|
21
|
+
}
|
|
22
|
+
function classifyRole(sym, inDeg, outDeg) {
|
|
23
|
+
// Datatypes: classes/interfaces/types/structs/enums with no outgoing calls
|
|
24
|
+
if (['interface', 'type', 'enum', 'struct'].includes(sym.kind)) {
|
|
25
|
+
return 'datatype';
|
|
26
|
+
}
|
|
27
|
+
// Entrypoints: exported symbols with 0 incoming refs (nobody calls them from code)
|
|
28
|
+
if (sym.exported && inDeg === 0 && outDeg > 0) {
|
|
29
|
+
return 'entrypoint';
|
|
30
|
+
}
|
|
31
|
+
// Hubs: high fan-in AND high fan-out (connectors)
|
|
32
|
+
if (inDeg >= 3 && outDeg >= 3) {
|
|
33
|
+
return 'hub';
|
|
34
|
+
}
|
|
35
|
+
// Leaves: called by others but call nothing (pure logic)
|
|
36
|
+
if (inDeg > 0 && outDeg === 0) {
|
|
37
|
+
return 'leaf';
|
|
38
|
+
}
|
|
39
|
+
// Utility: exported but low fan-in (helper functions)
|
|
40
|
+
if (sym.exported && inDeg >= 1 && inDeg <= 2) {
|
|
41
|
+
return 'utility';
|
|
42
|
+
}
|
|
43
|
+
// Default: leaf for non-exported, utility for exported
|
|
44
|
+
return sym.exported ? 'utility' : 'leaf';
|
|
45
|
+
}
|
|
46
|
+
function computeHeat(sym, inDeg, outDeg) {
|
|
47
|
+
// Heat = weighted combination of fan-in + fan-out + export status
|
|
48
|
+
// Scale: 0-100
|
|
49
|
+
const fanInScore = Math.min(inDeg * 15, 50);
|
|
50
|
+
const fanOutScore = Math.min(outDeg * 5, 25);
|
|
51
|
+
const exportBonus = sym.exported ? 10 : 0;
|
|
52
|
+
const kindBonus = ['function', 'class', 'method'].includes(sym.kind) ? 5 : 0;
|
|
53
|
+
return Math.min(fanInScore + fanOutScore + exportBonus + kindBonus, 100);
|
|
54
|
+
}
|
|
55
|
+
function computeDomains(symbols, links) {
|
|
56
|
+
// Graph-based domain clustering: files connected by 2+ cross-file links = same domain
|
|
57
|
+
const allFiles = new Set();
|
|
58
|
+
const symToFile = new Map();
|
|
59
|
+
for (const sym of symbols) {
|
|
60
|
+
allFiles.add(sym.filePath);
|
|
61
|
+
symToFile.set(sym.id, sym.filePath);
|
|
62
|
+
}
|
|
63
|
+
// Count cross-file link weights
|
|
64
|
+
const edgeWeights = new Map();
|
|
65
|
+
for (const link of links) {
|
|
66
|
+
if (link.type === 'contains')
|
|
67
|
+
continue;
|
|
68
|
+
const fromFile = symToFile.get(link.fromId);
|
|
69
|
+
const toFile = symToFile.get(link.toId);
|
|
70
|
+
if (fromFile && toFile && fromFile !== toFile) {
|
|
71
|
+
const key = fromFile < toFile ? `${fromFile}::${toFile}` : `${toFile}::${fromFile}`;
|
|
72
|
+
edgeWeights.set(key, (edgeWeights.get(key) ?? 0) + 1);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
// Union-Find: merge files with 2+ mutual links
|
|
76
|
+
const parent = new Map();
|
|
77
|
+
const ufRank = new Map();
|
|
78
|
+
function find(x) {
|
|
79
|
+
if (!parent.has(x)) {
|
|
80
|
+
parent.set(x, x);
|
|
81
|
+
ufRank.set(x, 0);
|
|
82
|
+
}
|
|
83
|
+
if (parent.get(x) !== x)
|
|
84
|
+
parent.set(x, find(parent.get(x)));
|
|
85
|
+
return parent.get(x);
|
|
86
|
+
}
|
|
87
|
+
function union(a, b) {
|
|
88
|
+
const ra = find(a), rb = find(b);
|
|
89
|
+
if (ra === rb)
|
|
90
|
+
return;
|
|
91
|
+
const rankA = ufRank.get(ra), rankB = ufRank.get(rb);
|
|
92
|
+
if (rankA < rankB)
|
|
93
|
+
parent.set(ra, rb);
|
|
94
|
+
else if (rankA > rankB)
|
|
95
|
+
parent.set(rb, ra);
|
|
96
|
+
else {
|
|
97
|
+
parent.set(rb, ra);
|
|
98
|
+
ufRank.set(ra, rankA + 1);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
for (const [key, weight] of edgeWeights) {
|
|
102
|
+
if (weight >= 2) {
|
|
103
|
+
const [a, b] = key.split('::');
|
|
104
|
+
union(a, b);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
// Group files by cluster root
|
|
108
|
+
const clusters = new Map();
|
|
109
|
+
for (const file of allFiles) {
|
|
110
|
+
const root = find(file);
|
|
111
|
+
const arr = clusters.get(root) ?? [];
|
|
112
|
+
arr.push(file);
|
|
113
|
+
clusters.set(root, arr);
|
|
114
|
+
}
|
|
115
|
+
// Name each cluster by most common directory segment
|
|
116
|
+
const zones = new Map();
|
|
117
|
+
for (const [, clusterFiles] of clusters) {
|
|
118
|
+
const dirCounts = new Map();
|
|
119
|
+
for (const f of clusterFiles) {
|
|
120
|
+
const dir = dirname(f).replace(/\\/g, '/');
|
|
121
|
+
const parts = dir.split('/').filter(Boolean);
|
|
122
|
+
const segment = parts.length > 0 ? parts[parts.length - 1] : 'root';
|
|
123
|
+
dirCounts.set(segment, (dirCounts.get(segment) ?? 0) + 1);
|
|
124
|
+
}
|
|
125
|
+
let bestName = 'root';
|
|
126
|
+
let bestCount = 0;
|
|
127
|
+
for (const [name, count] of dirCounts) {
|
|
128
|
+
if (count > bestCount) {
|
|
129
|
+
bestName = name;
|
|
130
|
+
bestCount = count;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
for (const f of clusterFiles) {
|
|
134
|
+
zones.set(f, bestName);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
return zones;
|
|
138
|
+
}
|
|
139
|
+
//# sourceMappingURL=enrich.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enrich.js","sourceRoot":"","sources":["../../src/analyzer/enrich.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +1,21 @@
|
|
|
1
|
-
import type { CodeSymbol, SymbolLink, RawImport, RawCall, RawHeritage } from '../types.js';
|
|
1
|
+
import type { CodeSymbol, SymbolLink, RawImport, RawCall, RawHeritage, RawReExport } from '../types.js';
|
|
2
2
|
interface ResolutionInput {
|
|
3
3
|
symbolsByFile: Map<string, CodeSymbol[]>;
|
|
4
4
|
allSymbols: CodeSymbol[];
|
|
5
5
|
imports: RawImport[];
|
|
6
6
|
calls: RawCall[];
|
|
7
7
|
heritage: RawHeritage[];
|
|
8
|
+
reExports?: RawReExport[];
|
|
8
9
|
resolvedImportPaths: Map<string, string>;
|
|
9
10
|
}
|
|
11
|
+
export interface ResolutionResult {
|
|
12
|
+
links: SymbolLink[];
|
|
13
|
+
unresolvedImports: number;
|
|
14
|
+
unresolvedCalls: number;
|
|
15
|
+
externalImports: number;
|
|
16
|
+
externalCalls: number;
|
|
17
|
+
}
|
|
10
18
|
export declare function resolveLinks(input: ResolutionInput): SymbolLink[];
|
|
19
|
+
export declare function resolveLinksWithStats(input: ResolutionInput): ResolutionResult;
|
|
11
20
|
export {};
|
|
12
21
|
//# sourceMappingURL=resolver.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../src/analyzer/resolver.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../src/analyzer/resolver.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAY,MAAM,aAAa,CAAC;AAElH,UAAU,eAAe;IACvB,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;IACzC,UAAU,EAAE,UAAU,EAAE,CAAC;IACzB,OAAO,EAAE,SAAS,EAAE,CAAC;IACrB,KAAK,EAAE,OAAO,EAAE,CAAC;IACjB,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,SAAS,CAAC,EAAE,WAAW,EAAE,CAAC;IAC1B,mBAAmB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC1C;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,eAAe,GAAG,UAAU,EAAE,CAGjE;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,eAAe,GAAG,gBAAgB,CAyL9E"}
|