@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.
Files changed (95) hide show
  1. package/LICENSE +21 -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 +96 -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 +48 -0
  76. package/dist/core/scanner.d.ts.map +1 -0
  77. package/dist/core/scanner.js +191 -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 +86 -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
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2024 Odd Essentials
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,45 @@
1
+ # odd-repo-mapper
2
+
3
+ Deterministic code intelligence tool producing evidence-backed architecture diagrams and feature-test traceability matrices.
4
+
5
+ ## Quick Start
6
+
7
+ ```bash
8
+ npm install
9
+ npm run build
10
+
11
+ # Scan a repository
12
+ npx repo-mapper scan --root . --out ./out
13
+
14
+ # Verify outputs
15
+ npx repo-mapper verify ./out
16
+ ```
17
+
18
+ ## Philosophy
19
+
20
+ > The mapper does not explain the codebase.
21
+ > It produces evidence that allows humans (and tools) to explain it safely.
22
+
23
+ - **Evidence-first**: Every claim is backed by file/symbol/edge proof
24
+ - **Deterministic**: Same inputs → same outputs, byte-for-byte
25
+ - **Fail-closed**: Missing evidence → failure, not silent degradation
26
+
27
+ ## Commands
28
+
29
+ | Command | Description |
30
+ | -------- | ------------------------------------------------------------- |
31
+ | `scan` | Produce `repo_profile.json`, `toolchain.json`, `graph.sqlite` |
32
+ | `verify` | Validate artifacts against schemas and invariants |
33
+
34
+ ## Artifacts
35
+
36
+ | File | Description |
37
+ | ------------------- | -------------------------------------------------- |
38
+ | `repo_profile.json` | File classification, language stats, build systems |
39
+ | `toolchain.json` | Node version, lockfile hash, dependencies |
40
+ | `graph.sqlite` | SQLite knowledge graph (canonical) |
41
+ | `graph.json` | Portable JSON export with contentHash |
42
+
43
+ ## License
44
+
45
+ MIT
@@ -0,0 +1,6 @@
1
+ /**
2
+ * MCP server CLI command.
3
+ */
4
+ import { Command } from 'commander';
5
+ export declare const mcpCommand: Command;
6
+ //# sourceMappingURL=mcp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/mcp.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,eAAO,MAAM,UAAU,SAIjB,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * MCP server CLI command.
3
+ */
4
+ import { Command } from 'commander';
5
+ import { startMcpServer } from '../../mcp/server.js';
6
+ export const mcpCommand = new Command('mcp')
7
+ .description('Start the MCP (Model Context Protocol) server')
8
+ .action(async () => {
9
+ await startMcpServer();
10
+ });
11
+ //# sourceMappingURL=mcp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../../src/cli/commands/mcp.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,OAAO,CAAC,KAAK,CAAC;KACvC,WAAW,CAAC,+CAA+C,CAAC;KAC5D,MAAM,CAAC,KAAK,IAAI,EAAE;IACf,MAAM,cAAc,EAAE,CAAC;AAC3B,CAAC,CAAC,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Report command: generates diagrams and traceability reports.
3
+ */
4
+ import { Command } from 'commander';
5
+ export declare const reportCommand: Command;
6
+ //# sourceMappingURL=report.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/report.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAWpC,eAAO,MAAM,aAAa,SA2GpB,CAAC"}
@@ -0,0 +1,96 @@
1
+ /**
2
+ * Report command: generates diagrams and traceability reports.
3
+ */
4
+ import { Command } from 'commander';
5
+ import { resolve, join } from 'node:path';
6
+ import { existsSync } from 'node:fs';
7
+ import Database from 'better-sqlite3';
8
+ import { writeMermaidDiagram, importCoverage, writeTraceabilityMatrix, writeTraceabilityMarkdown, } from '../../core/reports/index.js';
9
+ export const reportCommand = new Command('report')
10
+ .description('Generate architecture diagrams and traceability reports')
11
+ .option('-d, --dir <path>', 'Output directory containing graph.sqlite', './out')
12
+ .option('-o, --out <path>', 'Report output directory', './out/reports')
13
+ .option('-c, --coverage <path>', 'Path to coverage file (lcov or cobertura)')
14
+ .option('--format <format>', 'Output format: mermaid, json, markdown, all', 'all')
15
+ .action(async (options) => {
16
+ const dataDir = resolve(options.dir);
17
+ const outDir = resolve(options.out);
18
+ const dbPath = join(dataDir, 'graph.sqlite');
19
+ console.log(`Loading graph: ${dbPath}`);
20
+ console.log(`Reports output: ${outDir}`);
21
+ if (!existsSync(dbPath)) {
22
+ console.error(`✗ Graph database not found: ${dbPath}`);
23
+ console.error(' Run "repo-mapper scan" first to generate the graph.');
24
+ process.exit(1);
25
+ }
26
+ const db = new Database(dbPath, { readonly: true });
27
+ try {
28
+ const formats = options.format === 'all' ? ['mermaid', 'json', 'markdown'] : [options.format];
29
+ // 1. Import coverage if provided
30
+ let coverageData = undefined;
31
+ if (options.coverage && existsSync(options.coverage)) {
32
+ console.log(`\nImporting coverage: ${options.coverage}`);
33
+ const coverageResult = importCoverage(options.coverage, resolve('.'));
34
+ if (coverageResult.errors.length > 0) {
35
+ for (const err of coverageResult.errors) {
36
+ console.error(` ⚠ ${err}`);
37
+ }
38
+ }
39
+ if (coverageResult.data.files.length > 0) {
40
+ console.log(` Files: ${coverageResult.data.files.length}`);
41
+ console.log(` Coverage: ${coverageResult.data.percentage}%`);
42
+ coverageData = coverageResult.data;
43
+ }
44
+ }
45
+ // 2. Generate Mermaid diagrams
46
+ if (formats.includes('mermaid')) {
47
+ console.log('\n--- Generating Diagrams ---');
48
+ // Import graph
49
+ const importGraphPath = join(outDir, 'import-graph.mmd');
50
+ const importResult = writeMermaidDiagram(db, importGraphPath, {
51
+ nodeTypes: ['file', 'module'],
52
+ edgeKinds: ['import'],
53
+ direction: 'LR',
54
+ groupByDirectory: true,
55
+ });
56
+ console.log(` Import graph: ${importResult.nodeCount} nodes, ${importResult.edgeCount} edges`);
57
+ if (importResult.truncated) {
58
+ console.log(` ⚠ Diagram truncated (max 250 nodes)`);
59
+ }
60
+ console.log(` Wrote: ${importGraphPath}`);
61
+ // Full architecture diagram
62
+ const fullGraphPath = join(outDir, 'architecture.mmd');
63
+ const fullResult = writeMermaidDiagram(db, fullGraphPath, {
64
+ direction: 'TB',
65
+ groupByDirectory: true,
66
+ });
67
+ console.log(` Architecture: ${fullResult.nodeCount} nodes, ${fullResult.edgeCount} edges`);
68
+ console.log(` Wrote: ${fullGraphPath}`);
69
+ }
70
+ // 3. Generate traceability matrix
71
+ console.log('\n--- Generating Traceability Matrix ---');
72
+ if (formats.includes('json')) {
73
+ const jsonPath = join(outDir, 'traceability.json');
74
+ const matrix = writeTraceabilityMatrix(db, jsonPath, { coverageData });
75
+ console.log(` Links: ${matrix.stats.totalLinks}`);
76
+ console.log(` By type: ${Object.entries(matrix.stats.byLinkType)
77
+ .map(([k, v]) => `${k}=${v}`)
78
+ .join(', ')}`);
79
+ console.log(` Wrote: ${jsonPath}`);
80
+ }
81
+ if (formats.includes('markdown')) {
82
+ const mdPath = join(outDir, 'traceability.md');
83
+ writeTraceabilityMarkdown(db, mdPath, { coverageData });
84
+ console.log(` Wrote: ${mdPath}`);
85
+ }
86
+ console.log('\n✓ Reports generated');
87
+ }
88
+ catch (err) {
89
+ console.error(`\n✗ Report generation failed: ${err instanceof Error ? err.message : String(err)}`);
90
+ process.exit(1);
91
+ }
92
+ finally {
93
+ db.close();
94
+ }
95
+ });
96
+ //# sourceMappingURL=report.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report.js","sourceRoot":"","sources":["../../../src/cli/commands/report.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Scan command: produces repo_profile.json + populated graph.
3
+ */
4
+ import { Command } from 'commander';
5
+ export declare const scanCommand: Command;
6
+ //# sourceMappingURL=scan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/scan.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC,eAAO,MAAM,WAAW,SAwIlB,CAAC"}
@@ -0,0 +1,118 @@
1
+ /**
2
+ * Scan command: produces repo_profile.json + populated graph.
3
+ */
4
+ import { Command } from 'commander';
5
+ import { resolve, join } from 'node:path';
6
+ import { writeFileSync, mkdirSync, existsSync } from 'node:fs';
7
+ import { loadConfig, createDefaultConfig } from '../../core/config.js';
8
+ import { collectToolchain } from '../../core/toolchain.js';
9
+ import { scanDirectory } from '../../core/scanner.js';
10
+ import { initGraphDatabase, insertNode, insertEdge, writeGraphJson } from '../../core/graph.js';
11
+ import { indexAll } from '../../core/indexers/index.js';
12
+ export const scanCommand = new Command('scan')
13
+ .description('Scan a repository and produce repo_profile.json + knowledge graph')
14
+ .option('-c, --config <path>', 'Path to config file', 'repo-mapper.config.json')
15
+ .option('-r, --root <path>', 'Repository root directory', '.')
16
+ .option('-o, --out <path>', 'Output directory', './out')
17
+ .option('--skip-index', 'Skip language indexing (M0 mode)', false)
18
+ .action(async (options) => {
19
+ const rootDir = resolve(options.root);
20
+ const outDir = resolve(options.out);
21
+ console.log(`Scanning: ${rootDir}`);
22
+ console.log(`Output: ${outDir}`);
23
+ // Load or create config
24
+ const configPath = resolve(options.config);
25
+ let config = createDefaultConfig(rootDir);
26
+ const loadResult = loadConfig(configPath);
27
+ if (loadResult.success && loadResult.config) {
28
+ config = loadResult.config;
29
+ }
30
+ else if (loadResult.errors) {
31
+ console.log('Using default config (no config file found)');
32
+ }
33
+ // Collect toolchain
34
+ const toolchain = collectToolchain(rootDir);
35
+ console.log(`Node: ${toolchain.node}`);
36
+ // Scan
37
+ try {
38
+ const scanResult = scanDirectory(rootDir, toolchain, {
39
+ maxFiles: config.limits?.maxFiles ?? undefined,
40
+ testPatterns: config.indexing?.tests?.patterns ?? undefined,
41
+ });
42
+ // Write outputs
43
+ mkdirSync(outDir, { recursive: true });
44
+ // repo_profile.json (remove internal fileEntries before serialization)
45
+ const profilePath = join(outDir, 'repo_profile.json');
46
+ const { fileEntries: _fileEntries, ...profileForJson } = scanResult;
47
+ writeFileSync(profilePath, JSON.stringify(profileForJson, null, 2).replace(/\r\n/g, '\n'), 'utf8');
48
+ console.log(`Wrote: ${profilePath}`);
49
+ // toolchain.json
50
+ const toolchainPath = join(outDir, 'toolchain.json');
51
+ writeFileSync(toolchainPath, JSON.stringify(toolchain, null, 2).replace(/\r\n/g, '\n'), 'utf8');
52
+ console.log(`Wrote: ${toolchainPath}`);
53
+ // Initialize graph
54
+ const dbPath = join(outDir, 'graph.sqlite');
55
+ const db = initGraphDatabase(dbPath);
56
+ console.log(`Initialized: ${dbPath}`);
57
+ // Index if not skipped
58
+ if (!options.skipIndex) {
59
+ // Group files by language for indexers
60
+ const filesByLanguage = groupFilesByLanguage(scanResult.fileEntries ?? []);
61
+ console.log('\n--- Indexing ---');
62
+ const tsConfigPath = join(rootDir, 'tsconfig.json');
63
+ const indexResult = indexAll({
64
+ rootDir,
65
+ files: filesByLanguage,
66
+ tsConfigPath: existsSync(tsConfigPath) ? tsConfigPath : undefined,
67
+ });
68
+ // Insert nodes
69
+ for (const node of indexResult.nodes) {
70
+ insertNode(db, node);
71
+ }
72
+ // Insert edges
73
+ for (const edge of indexResult.edges) {
74
+ insertEdge(db, edge);
75
+ }
76
+ console.log(`TypeScript: ${indexResult.stats.typescript.nodes} nodes, ${indexResult.stats.typescript.edges} edges`);
77
+ console.log(`Python: ${indexResult.stats.python.nodes} nodes, ${indexResult.stats.python.edges} edges`);
78
+ console.log(`Go: ${indexResult.stats.go.nodes} nodes, ${indexResult.stats.go.edges} edges`);
79
+ console.log(`Rust: ${indexResult.stats.rust.nodes} nodes, ${indexResult.stats.rust.edges} edges`);
80
+ }
81
+ // Export graph.json
82
+ const graphPath = join(outDir, 'graph.json');
83
+ const graphExport = await writeGraphJson(db, graphPath);
84
+ console.log(`\nWrote: ${graphPath} (${graphExport.meta.nodeCount} nodes, ${graphExport.meta.edgeCount} edges)`);
85
+ db.close();
86
+ // Print summary
87
+ console.log('\n--- Scan Summary ---');
88
+ console.log(`Files: ${scanResult.files.total}`);
89
+ console.log(`Languages: ${scanResult.languages.map((l) => `${l.id}(${l.fileCount})`).join(', ')}`);
90
+ console.log(`Build sys: ${scanResult.buildSystems
91
+ .filter((b) => b.detected)
92
+ .map((b) => b.id)
93
+ .join(', ') || 'none'}`);
94
+ if (scanResult.warnings.length > 0) {
95
+ console.log('\nWarnings:');
96
+ for (const w of scanResult.warnings) {
97
+ console.log(` ⚠ ${w}`);
98
+ }
99
+ }
100
+ console.log('\n✓ Scan complete');
101
+ }
102
+ catch (err) {
103
+ console.error(`\n✗ Scan failed: ${err instanceof Error ? err.message : String(err)}`);
104
+ process.exit(1);
105
+ }
106
+ });
107
+ function groupFilesByLanguage(files) {
108
+ const map = new Map();
109
+ for (const file of files) {
110
+ const lang = file.language;
111
+ if (!map.has(lang)) {
112
+ map.set(lang, []);
113
+ }
114
+ map.get(lang).push(file.path);
115
+ }
116
+ return map;
117
+ }
118
+ //# sourceMappingURL=scan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan.js","sourceRoot":"","sources":["../../../src/cli/commands/scan.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Verify command: validates all artifacts in output directory.
3
+ */
4
+ import { Command } from 'commander';
5
+ export declare const verifyCommand: Command;
6
+ //# sourceMappingURL=verify.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/verify.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,eAAO,MAAM,aAAa,SA4CpB,CAAC"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Verify command: validates all artifacts in output directory.
3
+ */
4
+ import { Command } from 'commander';
5
+ import { resolve } from 'node:path';
6
+ import { verifyOutputDir } from '../../core/verify.js';
7
+ export const verifyCommand = new Command('verify')
8
+ .description('Verify artifacts in an output directory')
9
+ .argument('<outDir>', 'Output directory to verify')
10
+ .option('-r, --root <path>', 'Repository root directory (for toolchain alignment)', '.')
11
+ .action(async (outDir, options) => {
12
+ const resolvedOut = resolve(outDir);
13
+ const resolvedRoot = resolve(options.root);
14
+ console.log(`Verifying: ${resolvedOut}`);
15
+ console.log(`Root: ${resolvedRoot}`);
16
+ console.log('');
17
+ try {
18
+ const result = await verifyOutputDir(resolvedOut, resolvedRoot);
19
+ if (result.warnings.length > 0) {
20
+ console.log('Warnings:');
21
+ for (const w of result.warnings) {
22
+ console.log(` ⚠ ${w}`);
23
+ }
24
+ console.log('');
25
+ }
26
+ if (result.errors.length > 0) {
27
+ console.log('Errors:');
28
+ for (const e of result.errors) {
29
+ console.log(` ✗ ${e}`);
30
+ }
31
+ console.log('');
32
+ }
33
+ if (result.passed) {
34
+ console.log('✓ Verification passed');
35
+ process.exit(0);
36
+ }
37
+ else {
38
+ console.log(`✗ Verification failed (${result.errors.length} errors)`);
39
+ process.exit(1);
40
+ }
41
+ }
42
+ catch (err) {
43
+ console.error(`\n✗ Verification error: ${err instanceof Error ? err.message : String(err)}`);
44
+ process.exit(1);
45
+ }
46
+ });
47
+ //# sourceMappingURL=verify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify.js","sourceRoot":"","sources":["../../../src/cli/commands/verify.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvD,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC;KAC7C,WAAW,CAAC,yCAAyC,CAAC;KACtD,QAAQ,CAAC,UAAU,EAAE,4BAA4B,CAAC;KAClD,MAAM,CAAC,mBAAmB,EAAE,qDAAqD,EAAE,GAAG,CAAC;KACvF,MAAM,CAAC,KAAK,EAAE,MAAc,EAAE,OAAO,EAAE,EAAE;IACtC,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACpC,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAE3C,OAAO,CAAC,GAAG,CAAC,cAAc,WAAW,EAAE,CAAC,CAAC;IACzC,OAAO,CAAC,GAAG,CAAC,cAAc,YAAY,EAAE,CAAC,CAAC;IAC1C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,IAAI,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;QAEhE,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7B,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;YACzB,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;gBAC9B,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAC5B,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACpB,CAAC;QAED,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3B,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YACvB,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;gBAC5B,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAC5B,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACpB,CAAC;QAED,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;YACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,CAAC;aAAM,CAAC;YACJ,OAAO,CAAC,GAAG,CAAC,0BAA0B,MAAM,CAAC,MAAM,CAAC,MAAM,UAAU,CAAC,CAAC;YACtE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CACT,2BAA2B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAChF,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * CLI entry point for repo-mapper.
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * CLI entry point for repo-mapper.
3
+ */
4
+ import { Command } from 'commander';
5
+ import { scanCommand } from './commands/scan.js';
6
+ import { verifyCommand } from './commands/verify.js';
7
+ import { reportCommand } from './commands/report.js';
8
+ import { mcpCommand } from './commands/mcp.js';
9
+ import { REPO_MAPPER_VERSION } from '../core/constants.js';
10
+ const program = new Command();
11
+ program
12
+ .name('repo-mapper')
13
+ .description('Deterministic code intelligence tool')
14
+ .version(REPO_MAPPER_VERSION);
15
+ program.addCommand(scanCommand);
16
+ program.addCommand(verifyCommand);
17
+ program.addCommand(reportCommand);
18
+ program.addCommand(mcpCommand);
19
+ program.parse();
20
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAE3D,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACF,IAAI,CAAC,aAAa,CAAC;KACnB,WAAW,CAAC,sCAAsC,CAAC;KACnD,OAAO,CAAC,mBAAmB,CAAC,CAAC;AAElC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;AAE/B,OAAO,CAAC,KAAK,EAAE,CAAC"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Configuration loading and validation.
3
+ * Uses Ajv for strict JSON Schema validation.
4
+ */
5
+ export interface RepoMapperConfig {
6
+ version: '0.1.0';
7
+ project: {
8
+ rootDir: string;
9
+ name?: string;
10
+ repoId?: string;
11
+ };
12
+ indexing?: {
13
+ languages?: {
14
+ tier1?: ('typescript' | 'javascript' | 'python' | 'go' | 'rust')[];
15
+ tier2?: ('java' | 'kotlin' | 'csharp' | 'ruby' | 'php')[];
16
+ };
17
+ tests?: {
18
+ patterns?: string[];
19
+ linking?: {
20
+ minConfidence?: number;
21
+ allowBelowThreshold?: boolean;
22
+ };
23
+ };
24
+ };
25
+ output: {
26
+ outDir: string;
27
+ writeIntermediateArtifacts?: boolean;
28
+ };
29
+ determinism?: {
30
+ sortOrder?: 'path_then_name' | 'name_then_path';
31
+ stableIdMode?: 'path_hash' | 'content_hash';
32
+ };
33
+ limits?: {
34
+ maxFiles?: number;
35
+ maxEdges?: number;
36
+ maxSymbols?: number;
37
+ maxNodesPerDiagram?: number;
38
+ };
39
+ }
40
+ export interface ConfigLoadResult {
41
+ success: boolean;
42
+ config?: RepoMapperConfig;
43
+ errors?: string[];
44
+ }
45
+ /**
46
+ * Load and validate configuration from file.
47
+ */
48
+ export declare function loadConfig(configPath: string): ConfigLoadResult;
49
+ /**
50
+ * Create a minimal default config for a project.
51
+ */
52
+ export declare function createDefaultConfig(rootDir: string): RepoMapperConfig;
53
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAWH,MAAM,WAAW,gBAAgB;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE;QACL,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,MAAM,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,QAAQ,CAAC,EAAE;QACP,SAAS,CAAC,EAAE;YACR,KAAK,CAAC,EAAE,CAAC,YAAY,GAAG,YAAY,GAAG,QAAQ,GAAG,IAAI,GAAG,MAAM,CAAC,EAAE,CAAC;YACnE,KAAK,CAAC,EAAE,CAAC,MAAM,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,GAAG,KAAK,CAAC,EAAE,CAAC;SAC7D,CAAC;QACF,KAAK,CAAC,EAAE;YACJ,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;YACpB,OAAO,CAAC,EAAE;gBACN,aAAa,CAAC,EAAE,MAAM,CAAC;gBACvB,mBAAmB,CAAC,EAAE,OAAO,CAAC;aACjC,CAAC;SACL,CAAC;KACL,CAAC;IACF,MAAM,EAAE;QACJ,MAAM,EAAE,MAAM,CAAC;QACf,0BAA0B,CAAC,EAAE,OAAO,CAAC;KACxC,CAAC;IACF,WAAW,CAAC,EAAE;QACV,SAAS,CAAC,EAAE,gBAAgB,GAAG,gBAAgB,CAAC;QAChD,YAAY,CAAC,EAAE,WAAW,GAAG,cAAc,CAAC;KAC/C,CAAC;IACF,MAAM,CAAC,EAAE;QACL,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,kBAAkB,CAAC,EAAE,MAAM,CAAC;KAC/B,CAAC;CACL;AAKD,MAAM,WAAW,gBAAgB;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAC1B,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,gBAAgB,CAgC/D;AAyDD;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,gBAAgB,CAMrE"}
@@ -0,0 +1,106 @@
1
+ /**
2
+ * Configuration loading and validation.
3
+ * Uses Ajv for strict JSON Schema validation.
4
+ */
5
+ import { readFileSync, existsSync } from 'node:fs';
6
+ import Ajv from 'ajv';
7
+ import { SCHEMA_VERSION, LIMITS, DEFAULT_MIN_CONFIDENCE } from './constants.js';
8
+ // Import schema at runtime
9
+ const configSchema = JSON.parse(readFileSync(new URL('../../schemas/config.schema.json', import.meta.url), 'utf8'));
10
+ const ajv = new Ajv.default({ strict: false, allErrors: true, validateSchema: false });
11
+ const validateConfig = ajv.compile(configSchema);
12
+ /**
13
+ * Load and validate configuration from file.
14
+ */
15
+ export function loadConfig(configPath) {
16
+ if (!existsSync(configPath)) {
17
+ return {
18
+ success: false,
19
+ errors: [`Configuration file not found: ${configPath}`],
20
+ };
21
+ }
22
+ let rawConfig;
23
+ try {
24
+ const content = readFileSync(configPath, 'utf8');
25
+ rawConfig = JSON.parse(content);
26
+ }
27
+ catch (err) {
28
+ return {
29
+ success: false,
30
+ errors: [
31
+ `Failed to parse config file: ${err instanceof Error ? err.message : String(err)}`,
32
+ ],
33
+ };
34
+ }
35
+ if (!validateConfig(rawConfig)) {
36
+ const errors = validateConfig.errors?.map((e) => `${e.instancePath || '/'}: ${e.message}`) ?? ['Unknown validation error'];
37
+ return { success: false, errors };
38
+ }
39
+ // Apply defaults
40
+ const config = applyDefaults(rawConfig);
41
+ return { success: true, config };
42
+ }
43
+ /**
44
+ * Apply default values to config.
45
+ */
46
+ function applyDefaults(raw) {
47
+ return {
48
+ ...raw,
49
+ output: {
50
+ outDir: raw.output.outDir ?? './out',
51
+ writeIntermediateArtifacts: raw.output.writeIntermediateArtifacts ?? true,
52
+ },
53
+ determinism: {
54
+ sortOrder: raw.determinism?.sortOrder ?? 'path_then_name',
55
+ stableIdMode: raw.determinism?.stableIdMode ?? 'path_hash',
56
+ },
57
+ limits: {
58
+ maxFiles: raw.limits?.maxFiles ?? LIMITS.maxFiles,
59
+ maxEdges: raw.limits?.maxEdges ?? LIMITS.maxEdges,
60
+ maxSymbols: raw.limits?.maxSymbols ?? LIMITS.maxSymbols,
61
+ maxNodesPerDiagram: raw.limits?.maxNodesPerDiagram ?? LIMITS.maxNodesPerDiagram,
62
+ },
63
+ indexing: {
64
+ languages: {
65
+ tier1: raw.indexing?.languages?.tier1 ?? [
66
+ 'typescript',
67
+ 'javascript',
68
+ 'python',
69
+ 'go',
70
+ 'rust',
71
+ ],
72
+ tier2: raw.indexing?.languages?.tier2 ?? [
73
+ 'java',
74
+ 'kotlin',
75
+ 'csharp',
76
+ 'ruby',
77
+ 'php',
78
+ ],
79
+ },
80
+ tests: {
81
+ patterns: raw.indexing?.tests?.patterns ?? [
82
+ '**/*test*.*',
83
+ '**/*spec*.*',
84
+ '**/test/**',
85
+ '**/tests/**',
86
+ '**/__tests__/**',
87
+ ],
88
+ linking: {
89
+ minConfidence: raw.indexing?.tests?.linking?.minConfidence ?? DEFAULT_MIN_CONFIDENCE,
90
+ allowBelowThreshold: raw.indexing?.tests?.linking?.allowBelowThreshold ?? false,
91
+ },
92
+ },
93
+ },
94
+ };
95
+ }
96
+ /**
97
+ * Create a minimal default config for a project.
98
+ */
99
+ export function createDefaultConfig(rootDir) {
100
+ return {
101
+ version: SCHEMA_VERSION,
102
+ project: { rootDir },
103
+ output: { outDir: './out' },
104
+ };
105
+ }
106
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"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"}