@oddessentials/odd-repo-mapper 1.0.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.
Potentially problematic release.
This version of @oddessentials/odd-repo-mapper might be problematic. Click here for more details.
- package/LICENSE +21 -0
- package/README.md +45 -0
- package/dist/cli/commands/mcp.d.ts +6 -0
- package/dist/cli/commands/mcp.d.ts.map +1 -0
- package/dist/cli/commands/mcp.js +11 -0
- package/dist/cli/commands/mcp.js.map +1 -0
- package/dist/cli/commands/report.d.ts +6 -0
- package/dist/cli/commands/report.d.ts.map +1 -0
- package/dist/cli/commands/report.js +96 -0
- package/dist/cli/commands/report.js.map +1 -0
- package/dist/cli/commands/scan.d.ts +6 -0
- package/dist/cli/commands/scan.d.ts.map +1 -0
- package/dist/cli/commands/scan.js +118 -0
- package/dist/cli/commands/scan.js.map +1 -0
- package/dist/cli/commands/verify.d.ts +6 -0
- package/dist/cli/commands/verify.d.ts.map +1 -0
- package/dist/cli/commands/verify.js +47 -0
- package/dist/cli/commands/verify.js.map +1 -0
- package/dist/cli/index.d.ts +5 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +20 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/core/config.d.ts +53 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +106 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/constants.d.ts +31 -0
- package/dist/core/constants.d.ts.map +1 -0
- package/dist/core/constants.js +31 -0
- package/dist/core/constants.js.map +1 -0
- package/dist/core/graph.d.ts +61 -0
- package/dist/core/graph.d.ts.map +1 -0
- package/dist/core/graph.js +163 -0
- package/dist/core/graph.js.map +1 -0
- package/dist/core/hashing.d.ts +37 -0
- package/dist/core/hashing.d.ts.map +1 -0
- package/dist/core/hashing.js +66 -0
- package/dist/core/hashing.js.map +1 -0
- package/dist/core/indexers/go.d.ts +14 -0
- package/dist/core/indexers/go.d.ts.map +1 -0
- package/dist/core/indexers/go.js +175 -0
- package/dist/core/indexers/go.js.map +1 -0
- package/dist/core/indexers/index.d.ts +39 -0
- package/dist/core/indexers/index.d.ts.map +1 -0
- package/dist/core/indexers/index.js +76 -0
- package/dist/core/indexers/index.js.map +1 -0
- package/dist/core/indexers/python.d.ts +14 -0
- package/dist/core/indexers/python.d.ts.map +1 -0
- package/dist/core/indexers/python.js +186 -0
- package/dist/core/indexers/python.js.map +1 -0
- package/dist/core/indexers/rust.d.ts +14 -0
- package/dist/core/indexers/rust.d.ts.map +1 -0
- package/dist/core/indexers/rust.js +156 -0
- package/dist/core/indexers/rust.js.map +1 -0
- package/dist/core/indexers/typescript.d.ts +19 -0
- package/dist/core/indexers/typescript.d.ts.map +1 -0
- package/dist/core/indexers/typescript.js +223 -0
- package/dist/core/indexers/typescript.js.map +1 -0
- package/dist/core/reports/coverage.d.ts +38 -0
- package/dist/core/reports/coverage.d.ts.map +1 -0
- package/dist/core/reports/coverage.js +175 -0
- package/dist/core/reports/coverage.js.map +1 -0
- package/dist/core/reports/index.d.ts +10 -0
- package/dist/core/reports/index.d.ts.map +1 -0
- package/dist/core/reports/index.js +7 -0
- package/dist/core/reports/index.js.map +1 -0
- package/dist/core/reports/mermaid.d.ts +41 -0
- package/dist/core/reports/mermaid.d.ts.map +1 -0
- package/dist/core/reports/mermaid.js +171 -0
- package/dist/core/reports/mermaid.js.map +1 -0
- package/dist/core/reports/traceability.d.ts +45 -0
- package/dist/core/reports/traceability.d.ts.map +1 -0
- package/dist/core/reports/traceability.js +190 -0
- package/dist/core/reports/traceability.js.map +1 -0
- package/dist/core/scanner.d.ts +48 -0
- package/dist/core/scanner.d.ts.map +1 -0
- package/dist/core/scanner.js +191 -0
- package/dist/core/scanner.js.map +1 -0
- package/dist/core/toolchain.d.ts +28 -0
- package/dist/core/toolchain.d.ts.map +1 -0
- package/dist/core/toolchain.js +68 -0
- package/dist/core/toolchain.js.map +1 -0
- package/dist/core/verify.d.ts +15 -0
- package/dist/core/verify.d.ts.map +1 -0
- package/dist/core/verify.js +182 -0
- package/dist/core/verify.js.map +1 -0
- package/dist/mcp/server.d.ts +46 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +421 -0
- package/dist/mcp/server.js.map +1 -0
- package/package.json +86 -0
- package/schemas/config.schema.json +140 -0
- package/schemas/graph.schema.json +132 -0
- package/schemas/repo-profile.schema.json +118 -0
- package/schemas/toolchain.schema.json +37 -0
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Index orchestrator - runs all language indexers and populates graph.
|
|
3
|
+
*/
|
|
4
|
+
import { indexTypeScript } from './typescript.js';
|
|
5
|
+
import { indexPython } from './python.js';
|
|
6
|
+
import { indexGo } from './go.js';
|
|
7
|
+
import { indexRust } from './rust.js';
|
|
8
|
+
/**
|
|
9
|
+
* Run all indexers and aggregate results.
|
|
10
|
+
*/
|
|
11
|
+
export function indexAll(options) {
|
|
12
|
+
const { rootDir, files, tsConfigPath } = options;
|
|
13
|
+
const results = {
|
|
14
|
+
nodes: [],
|
|
15
|
+
edges: [],
|
|
16
|
+
stats: {
|
|
17
|
+
typescript: { files: 0, nodes: 0, edges: 0 },
|
|
18
|
+
python: { files: 0, nodes: 0, edges: 0 },
|
|
19
|
+
go: { files: 0, nodes: 0, edges: 0 },
|
|
20
|
+
rust: { files: 0, nodes: 0, edges: 0 },
|
|
21
|
+
},
|
|
22
|
+
};
|
|
23
|
+
// TypeScript/JavaScript
|
|
24
|
+
const tsFiles = [...(files.get('typescript') || []), ...(files.get('javascript') || [])];
|
|
25
|
+
if (tsFiles.length > 0) {
|
|
26
|
+
const tsResult = indexTypeScript({ rootDir, files: tsFiles, tsConfigPath });
|
|
27
|
+
results.nodes.push(...tsResult.nodes);
|
|
28
|
+
results.edges.push(...tsResult.edges);
|
|
29
|
+
results.stats.typescript = {
|
|
30
|
+
files: tsFiles.length,
|
|
31
|
+
nodes: tsResult.nodes.length,
|
|
32
|
+
edges: tsResult.edges.length,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
// Python
|
|
36
|
+
const pyFiles = files.get('python') || [];
|
|
37
|
+
if (pyFiles.length > 0) {
|
|
38
|
+
const pyResult = indexPython({ rootDir, files: pyFiles });
|
|
39
|
+
results.nodes.push(...pyResult.nodes);
|
|
40
|
+
results.edges.push(...pyResult.edges);
|
|
41
|
+
results.stats.python = {
|
|
42
|
+
files: pyFiles.length,
|
|
43
|
+
nodes: pyResult.nodes.length,
|
|
44
|
+
edges: pyResult.edges.length,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
// Go
|
|
48
|
+
const goFiles = files.get('go') || [];
|
|
49
|
+
if (goFiles.length > 0) {
|
|
50
|
+
const goResult = indexGo({ rootDir, files: goFiles });
|
|
51
|
+
results.nodes.push(...goResult.nodes);
|
|
52
|
+
results.edges.push(...goResult.edges);
|
|
53
|
+
results.stats.go = {
|
|
54
|
+
files: goFiles.length,
|
|
55
|
+
nodes: goResult.nodes.length,
|
|
56
|
+
edges: goResult.edges.length,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
// Rust
|
|
60
|
+
const rsFiles = files.get('rust') || [];
|
|
61
|
+
if (rsFiles.length > 0) {
|
|
62
|
+
const rsResult = indexRust({ rootDir, files: rsFiles });
|
|
63
|
+
results.nodes.push(...rsResult.nodes);
|
|
64
|
+
results.edges.push(...rsResult.edges);
|
|
65
|
+
results.stats.rust = {
|
|
66
|
+
files: rsFiles.length,
|
|
67
|
+
nodes: rsResult.nodes.length,
|
|
68
|
+
edges: rsResult.edges.length,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
// Deduplicate nodes by ID
|
|
72
|
+
const nodeMap = new Map(results.nodes.map((n) => [n.id, n]));
|
|
73
|
+
results.nodes = Array.from(nodeMap.values());
|
|
74
|
+
return results;
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/indexers/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Python indexer using Python ast module via subprocess.
|
|
3
|
+
* Per D6: Python ast is authoritative for import/module facts.
|
|
4
|
+
*/
|
|
5
|
+
import type { IndexResult } from './typescript.js';
|
|
6
|
+
export interface PythonIndexerOptions {
|
|
7
|
+
rootDir: string;
|
|
8
|
+
files: string[];
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Index Python files for imports using the ast module.
|
|
12
|
+
*/
|
|
13
|
+
export declare function indexPython(options: PythonIndexerOptions): IndexResult;
|
|
14
|
+
//# sourceMappingURL=python.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"python.d.ts","sourceRoot":"","sources":["../../../src/core/indexers/python.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAkEnD,MAAM,WAAW,oBAAoB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,oBAAoB,GAAG,WAAW,CAqGtE"}
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Python indexer using Python ast module via subprocess.
|
|
3
|
+
* Per D6: Python ast is authoritative for import/module facts.
|
|
4
|
+
*/
|
|
5
|
+
import { execSync } from 'node:child_process';
|
|
6
|
+
import { writeFileSync, unlinkSync } from 'node:fs';
|
|
7
|
+
import { join, relative } from 'node:path';
|
|
8
|
+
import { tmpdir } from 'node:os';
|
|
9
|
+
import { normalizePath, pathToId } from '../hashing.js';
|
|
10
|
+
const PYTHON_SCRIPT = `
|
|
11
|
+
import ast
|
|
12
|
+
import json
|
|
13
|
+
import sys
|
|
14
|
+
|
|
15
|
+
def extract_imports(filepath):
|
|
16
|
+
with open(filepath, 'r', encoding='utf-8', errors='replace') as f:
|
|
17
|
+
source = f.read()
|
|
18
|
+
|
|
19
|
+
try:
|
|
20
|
+
tree = ast.parse(source, filename=filepath)
|
|
21
|
+
except SyntaxError:
|
|
22
|
+
return {'imports': [], 'entrypoints': []}
|
|
23
|
+
|
|
24
|
+
imports = []
|
|
25
|
+
entrypoints = []
|
|
26
|
+
|
|
27
|
+
for node in ast.walk(tree):
|
|
28
|
+
if isinstance(node, ast.Import):
|
|
29
|
+
for alias in node.names:
|
|
30
|
+
imports.append({
|
|
31
|
+
'module': alias.name,
|
|
32
|
+
'line': node.lineno,
|
|
33
|
+
'col': node.col_offset
|
|
34
|
+
})
|
|
35
|
+
elif isinstance(node, ast.ImportFrom):
|
|
36
|
+
module = node.module or ''
|
|
37
|
+
imports.append({
|
|
38
|
+
'module': module,
|
|
39
|
+
'line': node.lineno,
|
|
40
|
+
'col': node.col_offset,
|
|
41
|
+
'level': node.level # Relative import level
|
|
42
|
+
})
|
|
43
|
+
|
|
44
|
+
# Check for __main__ block
|
|
45
|
+
for node in ast.iter_child_nodes(tree):
|
|
46
|
+
if isinstance(node, ast.If):
|
|
47
|
+
test = node.test
|
|
48
|
+
if isinstance(test, ast.Compare):
|
|
49
|
+
left = test.left
|
|
50
|
+
if isinstance(left, ast.Name) and left.id == '__name__':
|
|
51
|
+
for comp in test.comparators:
|
|
52
|
+
if isinstance(comp, ast.Constant) and comp.value == '__main__':
|
|
53
|
+
entrypoints.append({
|
|
54
|
+
'name': '__main__',
|
|
55
|
+
'line': node.lineno
|
|
56
|
+
})
|
|
57
|
+
|
|
58
|
+
# Find top-level function definitions
|
|
59
|
+
for node in ast.iter_child_nodes(tree):
|
|
60
|
+
if isinstance(node, ast.FunctionDef):
|
|
61
|
+
entrypoints.append({
|
|
62
|
+
'name': node.name,
|
|
63
|
+
'line': node.lineno
|
|
64
|
+
})
|
|
65
|
+
|
|
66
|
+
return {'imports': imports, 'entrypoints': entrypoints}
|
|
67
|
+
|
|
68
|
+
if __name__ == '__main__':
|
|
69
|
+
filepath = sys.argv[1]
|
|
70
|
+
result = extract_imports(filepath)
|
|
71
|
+
print(json.dumps(result))
|
|
72
|
+
`;
|
|
73
|
+
/**
|
|
74
|
+
* Index Python files for imports using the ast module.
|
|
75
|
+
*/
|
|
76
|
+
export function indexPython(options) {
|
|
77
|
+
const { rootDir, files } = options;
|
|
78
|
+
const nodes = [];
|
|
79
|
+
const edges = [];
|
|
80
|
+
// Write Python script to temp file
|
|
81
|
+
const scriptPath = join(tmpdir(), `repo-mapper-ast-${Date.now()}.py`);
|
|
82
|
+
writeFileSync(scriptPath, PYTHON_SCRIPT, 'utf8');
|
|
83
|
+
try {
|
|
84
|
+
for (const filePath of files) {
|
|
85
|
+
const relativePath = normalizePath(relative(rootDir, filePath));
|
|
86
|
+
const fileId = pathToId(relativePath);
|
|
87
|
+
// Skip if not a Python file
|
|
88
|
+
if (!filePath.endsWith('.py'))
|
|
89
|
+
continue;
|
|
90
|
+
// Add file node
|
|
91
|
+
const isTest = isTestFile(relativePath);
|
|
92
|
+
nodes.push({
|
|
93
|
+
id: fileId,
|
|
94
|
+
type: isTest ? 'test' : 'file',
|
|
95
|
+
path: relativePath,
|
|
96
|
+
language: 'python',
|
|
97
|
+
tier: 1,
|
|
98
|
+
});
|
|
99
|
+
try {
|
|
100
|
+
// Run Python ast extraction
|
|
101
|
+
const output = execSync(`python "${scriptPath}" "${filePath}"`, {
|
|
102
|
+
encoding: 'utf8',
|
|
103
|
+
timeout: 10000,
|
|
104
|
+
windowsHide: true,
|
|
105
|
+
});
|
|
106
|
+
const result = JSON.parse(output.trim());
|
|
107
|
+
// Process imports
|
|
108
|
+
for (const imp of result.imports) {
|
|
109
|
+
const targetPath = resolvePythonImport(imp.module, relativePath, imp.level);
|
|
110
|
+
if (targetPath) {
|
|
111
|
+
const targetId = pathToId(targetPath);
|
|
112
|
+
edges.push({
|
|
113
|
+
source: fileId,
|
|
114
|
+
target: targetId,
|
|
115
|
+
kind: 'import',
|
|
116
|
+
proof: {
|
|
117
|
+
type: 'ast_import',
|
|
118
|
+
location: {
|
|
119
|
+
file: relativePath,
|
|
120
|
+
line: imp.line,
|
|
121
|
+
column: imp.col,
|
|
122
|
+
},
|
|
123
|
+
},
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
// Process entrypoints
|
|
128
|
+
for (const ep of result.entrypoints) {
|
|
129
|
+
nodes.push({
|
|
130
|
+
id: pathToId(`${relativePath}#${ep.name}`),
|
|
131
|
+
type: 'entrypoint',
|
|
132
|
+
path: relativePath,
|
|
133
|
+
name: ep.name,
|
|
134
|
+
fqn: `${relativePath}#${ep.name}`,
|
|
135
|
+
language: 'python',
|
|
136
|
+
tier: 1,
|
|
137
|
+
});
|
|
138
|
+
edges.push({
|
|
139
|
+
source: pathToId(`${relativePath}#${ep.name}`),
|
|
140
|
+
target: fileId,
|
|
141
|
+
kind: 'entrypoint',
|
|
142
|
+
proof: {
|
|
143
|
+
type: 'ast_import',
|
|
144
|
+
location: {
|
|
145
|
+
file: relativePath,
|
|
146
|
+
line: ep.line,
|
|
147
|
+
},
|
|
148
|
+
},
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
catch {
|
|
153
|
+
// Skip files that fail extraction (Python not installed, syntax error, etc.)
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
finally {
|
|
158
|
+
// Clean up temp script
|
|
159
|
+
try {
|
|
160
|
+
unlinkSync(scriptPath);
|
|
161
|
+
}
|
|
162
|
+
catch {
|
|
163
|
+
// Ignore cleanup errors
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
return { nodes, edges };
|
|
167
|
+
}
|
|
168
|
+
function resolvePythonImport(module, _fromFile, _level) {
|
|
169
|
+
if (!module)
|
|
170
|
+
return null;
|
|
171
|
+
// Convert module to path
|
|
172
|
+
// e.g., 'foo.bar' -> 'foo/bar.py' or 'foo/bar/__init__.py'
|
|
173
|
+
const parts = module.split('.');
|
|
174
|
+
const relativePath = parts.join('/') + '.py';
|
|
175
|
+
// For relative imports (level > 0), would need more complex resolution
|
|
176
|
+
// For now, return the normalized module path
|
|
177
|
+
return normalizePath(relativePath);
|
|
178
|
+
}
|
|
179
|
+
function isTestFile(path) {
|
|
180
|
+
const lower = path.toLowerCase();
|
|
181
|
+
return (lower.includes('test') ||
|
|
182
|
+
lower.includes('_test') ||
|
|
183
|
+
lower.startsWith('test_') ||
|
|
184
|
+
lower.includes('/tests/'));
|
|
185
|
+
}
|
|
186
|
+
//# sourceMappingURL=python.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"python.js","sourceRoot":"","sources":["../../../src/core/indexers/python.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACpD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAIxD,MAAM,aAAa,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8DrB,CAAC;AAOF;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,OAA6B;IACrD,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC;IACnC,MAAM,KAAK,GAAgB,EAAE,CAAC;IAC9B,MAAM,KAAK,GAAgB,EAAE,CAAC;IAE9B,mCAAmC;IACnC,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,mBAAmB,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACtE,aAAa,CAAC,UAAU,EAAE,aAAa,EAAE,MAAM,CAAC,CAAC;IAEjD,IAAI,CAAC;QACD,KAAK,MAAM,QAAQ,IAAI,KAAK,EAAE,CAAC;YAC3B,MAAM,YAAY,GAAG,aAAa,CAAC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;YAChE,MAAM,MAAM,GAAG,QAAQ,CAAC,YAAY,CAAC,CAAC;YAEtC,4BAA4B;YAC5B,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC;gBAAE,SAAS;YAExC,gBAAgB;YAChB,MAAM,MAAM,GAAG,UAAU,CAAC,YAAY,CAAC,CAAC;YACxC,KAAK,CAAC,IAAI,CAAC;gBACP,EAAE,EAAE,MAAM;gBACV,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;gBAC9B,IAAI,EAAE,YAAY;gBAClB,QAAQ,EAAE,QAAQ;gBAClB,IAAI,EAAE,CAAC;aACV,CAAC,CAAC;YAEH,IAAI,CAAC;gBACD,4BAA4B;gBAC5B,MAAM,MAAM,GAAG,QAAQ,CAAC,WAAW,UAAU,MAAM,QAAQ,GAAG,EAAE;oBAC5D,QAAQ,EAAE,MAAM;oBAChB,OAAO,EAAE,KAAK;oBACd,WAAW,EAAE,IAAI;iBACpB,CAAC,CAAC;gBAEH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,CAGtC,CAAC;gBAEF,kBAAkB;gBAClB,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;oBAC/B,MAAM,UAAU,GAAG,mBAAmB,CAAC,GAAG,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;oBAC5E,IAAI,UAAU,EAAE,CAAC;wBACb,MAAM,QAAQ,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC;wBAEtC,KAAK,CAAC,IAAI,CAAC;4BACP,MAAM,EAAE,MAAM;4BACd,MAAM,EAAE,QAAQ;4BAChB,IAAI,EAAE,QAAQ;4BACd,KAAK,EAAE;gCACH,IAAI,EAAE,YAAY;gCAClB,QAAQ,EAAE;oCACN,IAAI,EAAE,YAAY;oCAClB,IAAI,EAAE,GAAG,CAAC,IAAI;oCACd,MAAM,EAAE,GAAG,CAAC,GAAG;iCAClB;6BACJ;yBACJ,CAAC,CAAC;oBACP,CAAC;gBACL,CAAC;gBAED,sBAAsB;gBACtB,KAAK,MAAM,EAAE,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;oBAClC,KAAK,CAAC,IAAI,CAAC;wBACP,EAAE,EAAE,QAAQ,CAAC,GAAG,YAAY,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;wBAC1C,IAAI,EAAE,YAAY;wBAClB,IAAI,EAAE,YAAY;wBAClB,IAAI,EAAE,EAAE,CAAC,IAAI;wBACb,GAAG,EAAE,GAAG,YAAY,IAAI,EAAE,CAAC,IAAI,EAAE;wBACjC,QAAQ,EAAE,QAAQ;wBAClB,IAAI,EAAE,CAAC;qBACV,CAAC,CAAC;oBAEH,KAAK,CAAC,IAAI,CAAC;wBACP,MAAM,EAAE,QAAQ,CAAC,GAAG,YAAY,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;wBAC9C,MAAM,EAAE,MAAM;wBACd,IAAI,EAAE,YAAY;wBAClB,KAAK,EAAE;4BACH,IAAI,EAAE,YAAY;4BAClB,QAAQ,EAAE;gCACN,IAAI,EAAE,YAAY;gCAClB,IAAI,EAAE,EAAE,CAAC,IAAI;6BAChB;yBACJ;qBACJ,CAAC,CAAC;gBACP,CAAC;YACL,CAAC;YAAC,MAAM,CAAC;gBACL,6EAA6E;YACjF,CAAC;QACL,CAAC;IACL,CAAC;YAAS,CAAC;QACP,uBAAuB;QACvB,IAAI,CAAC;YACD,UAAU,CAAC,UAAU,CAAC,CAAC;QAC3B,CAAC;QAAC,MAAM,CAAC;YACL,wBAAwB;QAC5B,CAAC;IACL,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;AAC5B,CAAC;AAED,SAAS,mBAAmB,CAAC,MAAc,EAAE,SAAiB,EAAE,MAAe;IAC3E,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IAEzB,yBAAyB;IACzB,2DAA2D;IAC3D,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAChC,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IAE7C,uEAAuE;IACvE,6CAA6C;IAC7C,OAAO,aAAa,CAAC,YAAY,CAAC,CAAC;AACvC,CAAC;AAED,SAAS,UAAU,CAAC,IAAY;IAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IACjC,OAAO,CACH,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC;QACtB,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC;QACvB,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC;QACzB,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,CAC5B,CAAC;AACN,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rust indexer using cargo metadata.
|
|
3
|
+
* Per D5: Import edges require cargo_metadata proof.
|
|
4
|
+
*/
|
|
5
|
+
import type { IndexResult } from './typescript.js';
|
|
6
|
+
export interface RustIndexerOptions {
|
|
7
|
+
rootDir: string;
|
|
8
|
+
files: string[];
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Index Rust files using cargo metadata.
|
|
12
|
+
*/
|
|
13
|
+
export declare function indexRust(options: RustIndexerOptions): IndexResult;
|
|
14
|
+
//# sourceMappingURL=rust.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rust.d.ts","sourceRoot":"","sources":["../../../src/core/indexers/rust.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAEnD,MAAM,WAAW,kBAAkB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,EAAE,CAAC;CACnB;AAqBD;;GAEG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,kBAAkB,GAAG,WAAW,CAgIlE"}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rust indexer using cargo metadata.
|
|
3
|
+
* Per D5: Import edges require cargo_metadata proof.
|
|
4
|
+
*/
|
|
5
|
+
import { execSync } from 'node:child_process';
|
|
6
|
+
import { dirname, relative, join } from 'node:path';
|
|
7
|
+
import { existsSync, readdirSync } from 'node:fs';
|
|
8
|
+
import { normalizePath, pathToId } from '../hashing.js';
|
|
9
|
+
/**
|
|
10
|
+
* Index Rust files using cargo metadata.
|
|
11
|
+
*/
|
|
12
|
+
export function indexRust(options) {
|
|
13
|
+
const { rootDir } = options;
|
|
14
|
+
const nodes = [];
|
|
15
|
+
const edges = [];
|
|
16
|
+
// Find Cargo.toml
|
|
17
|
+
const cargoPath = findCargoToml(rootDir);
|
|
18
|
+
if (!cargoPath) {
|
|
19
|
+
return { nodes, edges };
|
|
20
|
+
}
|
|
21
|
+
const workspaceRoot = dirname(cargoPath);
|
|
22
|
+
try {
|
|
23
|
+
// Run cargo metadata
|
|
24
|
+
const output = execSync('cargo metadata --no-deps --format-version 1', {
|
|
25
|
+
cwd: workspaceRoot,
|
|
26
|
+
encoding: 'utf8',
|
|
27
|
+
timeout: 60000,
|
|
28
|
+
windowsHide: true,
|
|
29
|
+
});
|
|
30
|
+
const metadata = JSON.parse(output);
|
|
31
|
+
for (const pkg of metadata.packages) {
|
|
32
|
+
const pkgDir = dirname(pkg.manifest_path);
|
|
33
|
+
const pkgRelPath = normalizePath(relative(rootDir, pkgDir));
|
|
34
|
+
const pkgId = pathToId(pkgRelPath);
|
|
35
|
+
// Add package node
|
|
36
|
+
nodes.push({
|
|
37
|
+
id: pkgId,
|
|
38
|
+
type: 'module',
|
|
39
|
+
path: pkgRelPath,
|
|
40
|
+
name: pkg.name,
|
|
41
|
+
fqn: pkg.name,
|
|
42
|
+
language: 'rust',
|
|
43
|
+
tier: 1,
|
|
44
|
+
});
|
|
45
|
+
// Add target nodes (binaries, libs)
|
|
46
|
+
for (const target of pkg.targets) {
|
|
47
|
+
const targetPath = normalizePath(relative(rootDir, target.src_path));
|
|
48
|
+
const targetId = pathToId(targetPath);
|
|
49
|
+
const isBinary = target.kind.includes('bin');
|
|
50
|
+
const isTest = target.kind.includes('test') || targetPath.includes('tests/');
|
|
51
|
+
nodes.push({
|
|
52
|
+
id: targetId,
|
|
53
|
+
type: isTest ? 'test' : isBinary ? 'entrypoint' : 'file',
|
|
54
|
+
path: targetPath,
|
|
55
|
+
name: target.name,
|
|
56
|
+
language: 'rust',
|
|
57
|
+
tier: 1,
|
|
58
|
+
});
|
|
59
|
+
// Target belongs to package
|
|
60
|
+
edges.push({
|
|
61
|
+
source: pkgId,
|
|
62
|
+
target: targetId,
|
|
63
|
+
kind: 'contains',
|
|
64
|
+
proof: {
|
|
65
|
+
type: 'cargo_metadata',
|
|
66
|
+
location: { file: targetPath },
|
|
67
|
+
},
|
|
68
|
+
});
|
|
69
|
+
// Binary entrypoint
|
|
70
|
+
if (isBinary) {
|
|
71
|
+
edges.push({
|
|
72
|
+
source: targetId,
|
|
73
|
+
target: pkgId,
|
|
74
|
+
kind: 'entrypoint',
|
|
75
|
+
proof: {
|
|
76
|
+
type: 'cargo_metadata',
|
|
77
|
+
location: { file: targetPath },
|
|
78
|
+
},
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
// Add source files from src/
|
|
83
|
+
const srcDir = join(pkgDir, 'src');
|
|
84
|
+
if (existsSync(srcDir)) {
|
|
85
|
+
const rustFiles = findRustFiles(srcDir);
|
|
86
|
+
for (const filePath of rustFiles) {
|
|
87
|
+
const relativePath = normalizePath(relative(rootDir, filePath));
|
|
88
|
+
const fileId = pathToId(relativePath);
|
|
89
|
+
// Skip if already added as target
|
|
90
|
+
if (nodes.some((n) => n.id === fileId))
|
|
91
|
+
continue;
|
|
92
|
+
const isTest = relativePath.includes('test') || relativePath.includes('tests/');
|
|
93
|
+
nodes.push({
|
|
94
|
+
id: fileId,
|
|
95
|
+
type: isTest ? 'test' : 'file',
|
|
96
|
+
path: relativePath,
|
|
97
|
+
language: 'rust',
|
|
98
|
+
tier: 1,
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
// Add internal dependency edges
|
|
103
|
+
for (const dep of pkg.dependencies) {
|
|
104
|
+
if (dep.path) {
|
|
105
|
+
// Local path dependency
|
|
106
|
+
const depPath = normalizePath(relative(rootDir, dep.path));
|
|
107
|
+
const depId = pathToId(depPath);
|
|
108
|
+
edges.push({
|
|
109
|
+
source: pkgId,
|
|
110
|
+
target: depId,
|
|
111
|
+
kind: 'import',
|
|
112
|
+
proof: {
|
|
113
|
+
type: 'cargo_metadata',
|
|
114
|
+
location: { file: pkgRelPath },
|
|
115
|
+
},
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
catch {
|
|
122
|
+
// cargo metadata failed
|
|
123
|
+
}
|
|
124
|
+
return { nodes, edges };
|
|
125
|
+
}
|
|
126
|
+
function findCargoToml(startDir) {
|
|
127
|
+
let dir = startDir;
|
|
128
|
+
while (dir !== dirname(dir)) {
|
|
129
|
+
const cargoPath = join(dir, 'Cargo.toml');
|
|
130
|
+
if (existsSync(cargoPath)) {
|
|
131
|
+
return cargoPath;
|
|
132
|
+
}
|
|
133
|
+
dir = dirname(dir);
|
|
134
|
+
}
|
|
135
|
+
return null;
|
|
136
|
+
}
|
|
137
|
+
function findRustFiles(dir) {
|
|
138
|
+
const files = [];
|
|
139
|
+
try {
|
|
140
|
+
const entries = readdirSync(dir, { withFileTypes: true });
|
|
141
|
+
for (const entry of entries) {
|
|
142
|
+
const fullPath = join(dir, entry.name);
|
|
143
|
+
if (entry.isDirectory()) {
|
|
144
|
+
files.push(...findRustFiles(fullPath));
|
|
145
|
+
}
|
|
146
|
+
else if (entry.isFile() && entry.name.endsWith('.rs')) {
|
|
147
|
+
files.push(fullPath);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
catch {
|
|
152
|
+
// Ignore read errors
|
|
153
|
+
}
|
|
154
|
+
return files;
|
|
155
|
+
}
|
|
156
|
+
//# sourceMappingURL=rust.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rust.js","sourceRoot":"","sources":["../../../src/core/indexers/rust.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TypeScript/JavaScript indexer using ts-morph.
|
|
3
|
+
* Per D5: Import edges require ast_import proof.
|
|
4
|
+
*/
|
|
5
|
+
import type { GraphNode, GraphEdge } from '../graph.js';
|
|
6
|
+
export interface IndexResult {
|
|
7
|
+
nodes: GraphNode[];
|
|
8
|
+
edges: GraphEdge[];
|
|
9
|
+
}
|
|
10
|
+
export interface TypeScriptIndexerOptions {
|
|
11
|
+
rootDir: string;
|
|
12
|
+
files: string[];
|
|
13
|
+
tsConfigPath?: string;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Index TypeScript/JavaScript files for imports and symbols.
|
|
17
|
+
*/
|
|
18
|
+
export declare function indexTypeScript(options: TypeScriptIndexerOptions): IndexResult;
|
|
19
|
+
//# sourceMappingURL=typescript.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typescript.d.ts","sourceRoot":"","sources":["../../../src/core/indexers/typescript.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExD,MAAM,WAAW,WAAW;IACxB,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,KAAK,EAAE,SAAS,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,wBAAwB;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,wBAAwB,GAAG,WAAW,CA8F9E"}
|