@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.
Files changed (95) hide show
  1. package/LICENSE +81 -0
  2. package/README.md +45 -0
  3. package/dist/cli/commands/mcp.d.ts +6 -0
  4. package/dist/cli/commands/mcp.d.ts.map +1 -0
  5. package/dist/cli/commands/mcp.js +11 -0
  6. package/dist/cli/commands/mcp.js.map +1 -0
  7. package/dist/cli/commands/report.d.ts +6 -0
  8. package/dist/cli/commands/report.d.ts.map +1 -0
  9. package/dist/cli/commands/report.js +115 -0
  10. package/dist/cli/commands/report.js.map +1 -0
  11. package/dist/cli/commands/scan.d.ts +6 -0
  12. package/dist/cli/commands/scan.d.ts.map +1 -0
  13. package/dist/cli/commands/scan.js +118 -0
  14. package/dist/cli/commands/scan.js.map +1 -0
  15. package/dist/cli/commands/verify.d.ts +6 -0
  16. package/dist/cli/commands/verify.d.ts.map +1 -0
  17. package/dist/cli/commands/verify.js +47 -0
  18. package/dist/cli/commands/verify.js.map +1 -0
  19. package/dist/cli/index.d.ts +5 -0
  20. package/dist/cli/index.d.ts.map +1 -0
  21. package/dist/cli/index.js +20 -0
  22. package/dist/cli/index.js.map +1 -0
  23. package/dist/core/config.d.ts +53 -0
  24. package/dist/core/config.d.ts.map +1 -0
  25. package/dist/core/config.js +106 -0
  26. package/dist/core/config.js.map +1 -0
  27. package/dist/core/constants.d.ts +31 -0
  28. package/dist/core/constants.d.ts.map +1 -0
  29. package/dist/core/constants.js +31 -0
  30. package/dist/core/constants.js.map +1 -0
  31. package/dist/core/graph.d.ts +61 -0
  32. package/dist/core/graph.d.ts.map +1 -0
  33. package/dist/core/graph.js +163 -0
  34. package/dist/core/graph.js.map +1 -0
  35. package/dist/core/hashing.d.ts +37 -0
  36. package/dist/core/hashing.d.ts.map +1 -0
  37. package/dist/core/hashing.js +66 -0
  38. package/dist/core/hashing.js.map +1 -0
  39. package/dist/core/indexers/go.d.ts +14 -0
  40. package/dist/core/indexers/go.d.ts.map +1 -0
  41. package/dist/core/indexers/go.js +175 -0
  42. package/dist/core/indexers/go.js.map +1 -0
  43. package/dist/core/indexers/index.d.ts +39 -0
  44. package/dist/core/indexers/index.d.ts.map +1 -0
  45. package/dist/core/indexers/index.js +76 -0
  46. package/dist/core/indexers/index.js.map +1 -0
  47. package/dist/core/indexers/python.d.ts +14 -0
  48. package/dist/core/indexers/python.d.ts.map +1 -0
  49. package/dist/core/indexers/python.js +186 -0
  50. package/dist/core/indexers/python.js.map +1 -0
  51. package/dist/core/indexers/rust.d.ts +14 -0
  52. package/dist/core/indexers/rust.d.ts.map +1 -0
  53. package/dist/core/indexers/rust.js +156 -0
  54. package/dist/core/indexers/rust.js.map +1 -0
  55. package/dist/core/indexers/typescript.d.ts +19 -0
  56. package/dist/core/indexers/typescript.d.ts.map +1 -0
  57. package/dist/core/indexers/typescript.js +223 -0
  58. package/dist/core/indexers/typescript.js.map +1 -0
  59. package/dist/core/reports/coverage.d.ts +38 -0
  60. package/dist/core/reports/coverage.d.ts.map +1 -0
  61. package/dist/core/reports/coverage.js +175 -0
  62. package/dist/core/reports/coverage.js.map +1 -0
  63. package/dist/core/reports/index.d.ts +10 -0
  64. package/dist/core/reports/index.d.ts.map +1 -0
  65. package/dist/core/reports/index.js +7 -0
  66. package/dist/core/reports/index.js.map +1 -0
  67. package/dist/core/reports/mermaid.d.ts +41 -0
  68. package/dist/core/reports/mermaid.d.ts.map +1 -0
  69. package/dist/core/reports/mermaid.js +171 -0
  70. package/dist/core/reports/mermaid.js.map +1 -0
  71. package/dist/core/reports/traceability.d.ts +45 -0
  72. package/dist/core/reports/traceability.d.ts.map +1 -0
  73. package/dist/core/reports/traceability.js +190 -0
  74. package/dist/core/reports/traceability.js.map +1 -0
  75. package/dist/core/scanner.d.ts +49 -0
  76. package/dist/core/scanner.d.ts.map +1 -0
  77. package/dist/core/scanner.js +196 -0
  78. package/dist/core/scanner.js.map +1 -0
  79. package/dist/core/toolchain.d.ts +28 -0
  80. package/dist/core/toolchain.d.ts.map +1 -0
  81. package/dist/core/toolchain.js +68 -0
  82. package/dist/core/toolchain.js.map +1 -0
  83. package/dist/core/verify.d.ts +15 -0
  84. package/dist/core/verify.d.ts.map +1 -0
  85. package/dist/core/verify.js +182 -0
  86. package/dist/core/verify.js.map +1 -0
  87. package/dist/mcp/server.d.ts +46 -0
  88. package/dist/mcp/server.d.ts.map +1 -0
  89. package/dist/mcp/server.js +421 -0
  90. package/dist/mcp/server.js.map +1 -0
  91. package/package.json +88 -0
  92. package/schemas/config.schema.json +140 -0
  93. package/schemas/graph.schema.json +132 -0
  94. package/schemas/repo-profile.schema.json +118 -0
  95. 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"}