@oddessentials/odd-repo-mapper 3.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.
- package/LICENSE +81 -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 +115 -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 +49 -0
- package/dist/core/scanner.d.ts.map +1 -0
- package/dist/core/scanner.js +196 -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 +88 -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,175 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Go indexer using go list command.
|
|
3
|
+
* Per D5: Import edges require go_list proof.
|
|
4
|
+
*/
|
|
5
|
+
import { execSync } from 'node:child_process';
|
|
6
|
+
import { dirname, relative } from 'node:path';
|
|
7
|
+
import { existsSync } from 'node:fs';
|
|
8
|
+
import { normalizePath, pathToId } from '../hashing.js';
|
|
9
|
+
/**
|
|
10
|
+
* Index Go files using go list.
|
|
11
|
+
*/
|
|
12
|
+
export function indexGo(options) {
|
|
13
|
+
const { rootDir } = options;
|
|
14
|
+
const nodes = [];
|
|
15
|
+
const edges = [];
|
|
16
|
+
// Find go.mod to determine module root
|
|
17
|
+
const goModPath = findGoMod(rootDir);
|
|
18
|
+
if (!goModPath) {
|
|
19
|
+
// No go.mod, skip Go indexing
|
|
20
|
+
return { nodes, edges };
|
|
21
|
+
}
|
|
22
|
+
const moduleRoot = dirname(goModPath);
|
|
23
|
+
try {
|
|
24
|
+
// Run go list to get package information
|
|
25
|
+
const output = execSync('go list -json ./...', {
|
|
26
|
+
cwd: moduleRoot,
|
|
27
|
+
encoding: 'utf8',
|
|
28
|
+
timeout: 60000,
|
|
29
|
+
windowsHide: true,
|
|
30
|
+
});
|
|
31
|
+
// Parse JSON output (one object per line, but may be multiple objects)
|
|
32
|
+
const packages = parseGoListOutput(output);
|
|
33
|
+
for (const pkg of packages) {
|
|
34
|
+
// Skip external packages
|
|
35
|
+
if (!pkg.Dir.startsWith(moduleRoot))
|
|
36
|
+
continue;
|
|
37
|
+
const pkgRelPath = normalizePath(relative(rootDir, pkg.Dir));
|
|
38
|
+
const pkgId = pathToId(pkgRelPath);
|
|
39
|
+
// Add package node
|
|
40
|
+
nodes.push({
|
|
41
|
+
id: pkgId,
|
|
42
|
+
type: 'module',
|
|
43
|
+
path: pkgRelPath,
|
|
44
|
+
name: pkg.Name,
|
|
45
|
+
fqn: pkg.ImportPath,
|
|
46
|
+
language: 'go',
|
|
47
|
+
tier: 1,
|
|
48
|
+
});
|
|
49
|
+
// Add file nodes
|
|
50
|
+
for (const goFile of pkg.GoFiles || []) {
|
|
51
|
+
const filePath = normalizePath(`${pkgRelPath}/${goFile}`);
|
|
52
|
+
const fileId = pathToId(filePath);
|
|
53
|
+
nodes.push({
|
|
54
|
+
id: fileId,
|
|
55
|
+
type: 'file',
|
|
56
|
+
path: filePath,
|
|
57
|
+
language: 'go',
|
|
58
|
+
tier: 1,
|
|
59
|
+
});
|
|
60
|
+
// File contains edge
|
|
61
|
+
edges.push({
|
|
62
|
+
source: pkgId,
|
|
63
|
+
target: fileId,
|
|
64
|
+
kind: 'contains',
|
|
65
|
+
proof: {
|
|
66
|
+
type: 'go_list',
|
|
67
|
+
location: { file: filePath },
|
|
68
|
+
},
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
// Add test file nodes
|
|
72
|
+
for (const testFile of pkg.TestGoFiles || []) {
|
|
73
|
+
const filePath = normalizePath(`${pkgRelPath}/${testFile}`);
|
|
74
|
+
const fileId = pathToId(filePath);
|
|
75
|
+
nodes.push({
|
|
76
|
+
id: fileId,
|
|
77
|
+
type: 'test',
|
|
78
|
+
path: filePath,
|
|
79
|
+
language: 'go',
|
|
80
|
+
tier: 1,
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
// Add import edges
|
|
84
|
+
for (const importPath of pkg.Imports || []) {
|
|
85
|
+
// Only track internal imports
|
|
86
|
+
if (importPath.startsWith(getModulePath(goModPath))) {
|
|
87
|
+
const targetId = pathToId(importPath);
|
|
88
|
+
edges.push({
|
|
89
|
+
source: pkgId,
|
|
90
|
+
target: targetId,
|
|
91
|
+
kind: 'import',
|
|
92
|
+
proof: {
|
|
93
|
+
type: 'go_list',
|
|
94
|
+
location: { file: pkgRelPath },
|
|
95
|
+
},
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
// Check for main package (entrypoint)
|
|
100
|
+
if (pkg.Name === 'main') {
|
|
101
|
+
const epId = pathToId(`${pkgRelPath}#main`);
|
|
102
|
+
nodes.push({
|
|
103
|
+
id: epId,
|
|
104
|
+
type: 'entrypoint',
|
|
105
|
+
path: pkgRelPath,
|
|
106
|
+
name: 'main',
|
|
107
|
+
fqn: `${pkg.ImportPath}#main`,
|
|
108
|
+
language: 'go',
|
|
109
|
+
tier: 1,
|
|
110
|
+
});
|
|
111
|
+
edges.push({
|
|
112
|
+
source: epId,
|
|
113
|
+
target: pkgId,
|
|
114
|
+
kind: 'entrypoint',
|
|
115
|
+
proof: {
|
|
116
|
+
type: 'go_list',
|
|
117
|
+
location: { file: pkgRelPath },
|
|
118
|
+
},
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
catch {
|
|
124
|
+
// go list failed (Go not installed, invalid module, etc.)
|
|
125
|
+
}
|
|
126
|
+
return { nodes, edges };
|
|
127
|
+
}
|
|
128
|
+
function findGoMod(startDir) {
|
|
129
|
+
let dir = startDir;
|
|
130
|
+
while (dir !== dirname(dir)) {
|
|
131
|
+
const goModPath = `${dir}/go.mod`;
|
|
132
|
+
if (existsSync(goModPath)) {
|
|
133
|
+
return goModPath;
|
|
134
|
+
}
|
|
135
|
+
dir = dirname(dir);
|
|
136
|
+
}
|
|
137
|
+
return null;
|
|
138
|
+
}
|
|
139
|
+
function getModulePath(goModPath) {
|
|
140
|
+
try {
|
|
141
|
+
const content = require('node:fs').readFileSync(goModPath, 'utf8');
|
|
142
|
+
const match = content.match(/^module\s+(\S+)/m);
|
|
143
|
+
return match ? match[1] : '';
|
|
144
|
+
}
|
|
145
|
+
catch {
|
|
146
|
+
return '';
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
function parseGoListOutput(output) {
|
|
150
|
+
const packages = [];
|
|
151
|
+
// go list -json outputs concatenated JSON objects
|
|
152
|
+
let depth = 0;
|
|
153
|
+
let start = 0;
|
|
154
|
+
for (let i = 0; i < output.length; i++) {
|
|
155
|
+
if (output[i] === '{') {
|
|
156
|
+
if (depth === 0)
|
|
157
|
+
start = i;
|
|
158
|
+
depth++;
|
|
159
|
+
}
|
|
160
|
+
else if (output[i] === '}') {
|
|
161
|
+
depth--;
|
|
162
|
+
if (depth === 0) {
|
|
163
|
+
try {
|
|
164
|
+
const obj = JSON.parse(output.slice(start, i + 1));
|
|
165
|
+
packages.push(obj);
|
|
166
|
+
}
|
|
167
|
+
catch {
|
|
168
|
+
// Skip malformed JSON
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
return packages;
|
|
174
|
+
}
|
|
175
|
+
//# sourceMappingURL=go.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"go.js","sourceRoot":"","sources":["../../../src/core/indexers/go.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Index orchestrator - runs all language indexers and populates graph.
|
|
3
|
+
*/
|
|
4
|
+
import { type IndexResult } from './typescript.js';
|
|
5
|
+
export interface IndexOptions {
|
|
6
|
+
rootDir: string;
|
|
7
|
+
files: Map<string, string[]>;
|
|
8
|
+
tsConfigPath?: string;
|
|
9
|
+
}
|
|
10
|
+
export interface AggregatedIndexResult extends IndexResult {
|
|
11
|
+
stats: {
|
|
12
|
+
typescript: {
|
|
13
|
+
files: number;
|
|
14
|
+
nodes: number;
|
|
15
|
+
edges: number;
|
|
16
|
+
};
|
|
17
|
+
python: {
|
|
18
|
+
files: number;
|
|
19
|
+
nodes: number;
|
|
20
|
+
edges: number;
|
|
21
|
+
};
|
|
22
|
+
go: {
|
|
23
|
+
files: number;
|
|
24
|
+
nodes: number;
|
|
25
|
+
edges: number;
|
|
26
|
+
};
|
|
27
|
+
rust: {
|
|
28
|
+
files: number;
|
|
29
|
+
nodes: number;
|
|
30
|
+
edges: number;
|
|
31
|
+
};
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Run all indexers and aggregate results.
|
|
36
|
+
*/
|
|
37
|
+
export declare function indexAll(options: IndexOptions): AggregatedIndexResult;
|
|
38
|
+
export type { IndexResult } from './typescript.js';
|
|
39
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/indexers/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAmB,KAAK,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAKpE,MAAM,WAAW,YAAY;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAC7B,YAAY,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,qBAAsB,SAAQ,WAAW;IACtD,KAAK,EAAE;QACH,UAAU,EAAE;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,CAAC;QAC5D,MAAM,EAAE;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,CAAC;QACxD,EAAE,EAAE;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,CAAC;QACpD,IAAI,EAAE;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,CAAC;KACzD,CAAC;CACL;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,OAAO,EAAE,YAAY,GAAG,qBAAqB,CAuErE;AAGD,YAAY,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC"}
|
|
@@ -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":"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"}
|
|
@@ -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"}
|