@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.

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
@@ -0,0 +1,191 @@
1
+ /**
2
+ * Deterministic file scanner.
3
+ * Per D10: Lexicographic sorting, path normalization, hard limits.
4
+ */
5
+ import { readdirSync, statSync } from 'node:fs';
6
+ import { join, extname, basename } from 'node:path';
7
+ import { normalizePath, pathToId, detectCaseCollisions, checkPathLength } from './hashing.js';
8
+ import { LIMITS, SCHEMA_VERSION } from './constants.js';
9
+ const LANGUAGE_MAP = {
10
+ '.ts': { language: 'typescript', tier: 1 },
11
+ '.tsx': { language: 'typescript', tier: 1 },
12
+ '.js': { language: 'javascript', tier: 1 },
13
+ '.jsx': { language: 'javascript', tier: 1 },
14
+ '.mjs': { language: 'javascript', tier: 1 },
15
+ '.cjs': { language: 'javascript', tier: 1 },
16
+ '.py': { language: 'python', tier: 1 },
17
+ '.go': { language: 'go', tier: 1 },
18
+ '.rs': { language: 'rust', tier: 1 },
19
+ '.java': { language: 'java', tier: 2 },
20
+ '.kt': { language: 'kotlin', tier: 2 },
21
+ '.cs': { language: 'csharp', tier: 2 },
22
+ '.rb': { language: 'ruby', tier: 2 },
23
+ '.php': { language: 'php', tier: 2 },
24
+ };
25
+ const CONFIG_FILES = new Set([
26
+ 'package.json',
27
+ 'tsconfig.json',
28
+ 'pyproject.toml',
29
+ 'Cargo.toml',
30
+ 'go.mod',
31
+ 'pom.xml',
32
+ 'build.gradle',
33
+ '.eslintrc.json',
34
+ 'jest.config.js',
35
+ ]);
36
+ const BUILD_SYSTEM_MANIFESTS = {
37
+ bazel: ['WORKSPACE', 'WORKSPACE.bazel', 'MODULE.bazel', 'BUILD.bazel', 'BUILD'],
38
+ node: ['package.json'],
39
+ python: ['pyproject.toml', 'setup.py', 'requirements.txt'],
40
+ go: ['go.mod'],
41
+ rust: ['Cargo.toml'],
42
+ dotnet: ['*.csproj', '*.sln'],
43
+ maven: ['pom.xml'],
44
+ gradle: ['build.gradle', 'build.gradle.kts'],
45
+ };
46
+ const IGNORE_DIRS = new Set([
47
+ 'node_modules',
48
+ '.git',
49
+ 'dist',
50
+ 'build',
51
+ 'out',
52
+ '__pycache__',
53
+ '.venv',
54
+ 'venv',
55
+ 'target',
56
+ 'vendor',
57
+ '.next',
58
+ '.nuxt',
59
+ ]);
60
+ /**
61
+ * Scan a directory and produce repo_profile.json content.
62
+ */
63
+ export function scanDirectory(rootDir, toolchain, options = {}) {
64
+ const maxFiles = options.maxFiles ?? LIMITS.maxFiles;
65
+ const testPatterns = options.testPatterns ?? ['test', 'spec', '__tests__'];
66
+ const files = [];
67
+ const warnings = [];
68
+ const allPaths = [];
69
+ // Recursive walk
70
+ function walk(dir, relativeTo) {
71
+ if (files.length >= maxFiles) {
72
+ return;
73
+ }
74
+ let entries;
75
+ try {
76
+ entries = readdirSync(dir);
77
+ }
78
+ catch {
79
+ return;
80
+ }
81
+ // Sort for determinism (LC_ALL=C equivalent)
82
+ entries.sort((a, b) => a.localeCompare(b, 'en', { sensitivity: 'base' }));
83
+ for (const entry of entries) {
84
+ if (files.length >= maxFiles)
85
+ break;
86
+ const fullPath = join(dir, entry);
87
+ const relPath = normalizePath(fullPath.slice(relativeTo.length + 1));
88
+ let stat;
89
+ try {
90
+ stat = statSync(fullPath);
91
+ }
92
+ catch {
93
+ continue;
94
+ }
95
+ if (stat.isDirectory()) {
96
+ if (!IGNORE_DIRS.has(entry)) {
97
+ walk(fullPath, relativeTo);
98
+ }
99
+ }
100
+ else if (stat.isFile()) {
101
+ allPaths.push(relPath);
102
+ const pathCheck = checkPathLength(relPath);
103
+ if (pathCheck.warning) {
104
+ warnings.push(pathCheck.warning);
105
+ }
106
+ const ext = extname(entry).toLowerCase();
107
+ const langInfo = LANGUAGE_MAP[ext] ?? { language: 'other', tier: 3 };
108
+ const isTest = testPatterns.some((p) => relPath.toLowerCase().includes(p.toLowerCase()));
109
+ const isConfig = CONFIG_FILES.has(basename(entry));
110
+ files.push({
111
+ id: pathToId(relPath),
112
+ path: normalizePath(fullPath),
113
+ relativePath: relPath,
114
+ language: langInfo.language,
115
+ tier: langInfo.tier,
116
+ category: isConfig
117
+ ? 'config'
118
+ : isTest
119
+ ? 'test'
120
+ : langInfo.language !== 'other'
121
+ ? 'source'
122
+ : 'other',
123
+ sizeBytes: stat.size,
124
+ });
125
+ }
126
+ }
127
+ }
128
+ walk(rootDir, rootDir);
129
+ // Check for case collisions (D10)
130
+ const collisions = detectCaseCollisions(allPaths);
131
+ if (collisions.length > 0) {
132
+ throw new Error(`Case collisions detected (fail per D10):\n${collisions.join('\n')}`);
133
+ }
134
+ // Check hard limit
135
+ if (files.length >= maxFiles) {
136
+ throw new Error(`Exceeded maxFiles limit (${maxFiles}). Found ${files.length} files. Increase limit in config or reduce scope.`);
137
+ }
138
+ // Aggregate stats
139
+ const byLanguage = {};
140
+ const byCategory = { source: 0, test: 0, config: 0, other: 0 };
141
+ const extensionsByLang = {};
142
+ for (const f of files) {
143
+ byLanguage[f.language] = (byLanguage[f.language] ?? 0) + 1;
144
+ byCategory[f.category]++;
145
+ const ext = extname(f.relativePath);
146
+ if (!extensionsByLang[f.language]) {
147
+ extensionsByLang[f.language] = new Set();
148
+ }
149
+ extensionsByLang[f.language].add(ext);
150
+ }
151
+ // Build language summary
152
+ const languageSummary = Object.entries(byLanguage)
153
+ .sort(([a], [b]) => a.localeCompare(b))
154
+ .map(([id, count]) => ({
155
+ id,
156
+ tier: (LANGUAGE_MAP[Object.keys(LANGUAGE_MAP).find((k) => LANGUAGE_MAP[k].language === id) ?? '']?.tier ?? 3),
157
+ fileCount: count,
158
+ extensions: Array.from(extensionsByLang[id] ?? []).sort(),
159
+ }));
160
+ // Detect build systems
161
+ const buildSystems = Object.entries(BUILD_SYSTEM_MANIFESTS).map(([id, patterns]) => {
162
+ const manifests = files
163
+ .filter((f) => patterns.some((p) => p.includes('*')
164
+ ? f.relativePath.endsWith(p.replace('*', ''))
165
+ : basename(f.relativePath) === p))
166
+ .map((f) => f.relativePath);
167
+ return {
168
+ id,
169
+ detected: manifests.length > 0,
170
+ manifests,
171
+ };
172
+ });
173
+ // Compute scan ID
174
+ const scanId = pathToId(rootDir + JSON.stringify(toolchain));
175
+ return {
176
+ schemaVersion: SCHEMA_VERSION,
177
+ scanId,
178
+ rootDir: normalizePath(rootDir),
179
+ files: {
180
+ total: files.length,
181
+ byLanguage,
182
+ byCategory,
183
+ },
184
+ languages: languageSummary,
185
+ buildSystems,
186
+ toolchain,
187
+ warnings,
188
+ fileEntries: files,
189
+ };
190
+ }
191
+ //# sourceMappingURL=scanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scanner.js","sourceRoot":"","sources":["../../src/core/scanner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Toolchain manifest generation and runtime verification.
3
+ * Per D9: Mandatory toolchain pinning + runtime alignment verification.
4
+ */
5
+ export interface Toolchain {
6
+ node: string;
7
+ lockfileHash: string;
8
+ repoMapperVersion: string;
9
+ typescript?: string;
10
+ tsMorph?: string;
11
+ betterSqlite3?: string;
12
+ go?: string;
13
+ cargo?: string;
14
+ }
15
+ /**
16
+ * Collect current toolchain information.
17
+ */
18
+ export declare function collectToolchain(projectRoot: string): Toolchain;
19
+ export interface ToolchainVerificationResult {
20
+ valid: boolean;
21
+ errors: string[];
22
+ }
23
+ /**
24
+ * Verify runtime alignment with recorded toolchain.
25
+ * Per D9: Verifier fails if toolchain metadata is missing or misaligned.
26
+ */
27
+ export declare function verifyToolchainAlignment(recorded: Toolchain, projectRoot: string): ToolchainVerificationResult;
28
+ //# sourceMappingURL=toolchain.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toolchain.d.ts","sourceRoot":"","sources":["../../src/core/toolchain.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,MAAM,WAAW,SAAS;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,CAc/D;AAgBD,MAAM,WAAW,2BAA2B;IACxC,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;CACpB;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CACpC,QAAQ,EAAE,SAAS,EACnB,WAAW,EAAE,MAAM,GACpB,2BAA2B,CA6B7B"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Toolchain manifest generation and runtime verification.
3
+ * Per D9: Mandatory toolchain pinning + runtime alignment verification.
4
+ */
5
+ import { readFileSync, existsSync } from 'node:fs';
6
+ import { join } from 'node:path';
7
+ import { sha256 } from './hashing.js';
8
+ import { REPO_MAPPER_VERSION } from './constants.js';
9
+ /**
10
+ * Collect current toolchain information.
11
+ */
12
+ export function collectToolchain(projectRoot) {
13
+ const nodeVersion = process.version.replace(/^v/, '');
14
+ // Find and hash lockfile
15
+ const lockfilePath = findLockfile(projectRoot);
16
+ const lockfileHash = lockfilePath
17
+ ? sha256(readFileSync(lockfilePath))
18
+ : 'sha256:' + '0'.repeat(64); // No lockfile
19
+ return {
20
+ node: nodeVersion,
21
+ lockfileHash,
22
+ repoMapperVersion: REPO_MAPPER_VERSION,
23
+ };
24
+ }
25
+ /**
26
+ * Find the lockfile in project root.
27
+ */
28
+ function findLockfile(projectRoot) {
29
+ const candidates = ['package-lock.json', 'pnpm-lock.yaml', 'yarn.lock'];
30
+ for (const name of candidates) {
31
+ const path = join(projectRoot, name);
32
+ if (existsSync(path)) {
33
+ return path;
34
+ }
35
+ }
36
+ return null;
37
+ }
38
+ /**
39
+ * Verify runtime alignment with recorded toolchain.
40
+ * Per D9: Verifier fails if toolchain metadata is missing or misaligned.
41
+ */
42
+ export function verifyToolchainAlignment(recorded, projectRoot) {
43
+ const errors = [];
44
+ const current = collectToolchain(projectRoot);
45
+ // Check Node version
46
+ if (recorded.node !== current.node) {
47
+ errors.push(`Node version mismatch: recorded=${recorded.node}, runtime=${current.node}`);
48
+ }
49
+ // Check lockfile hash
50
+ if (recorded.lockfileHash !== current.lockfileHash) {
51
+ errors.push(`Lockfile hash mismatch: dependencies may have changed`);
52
+ }
53
+ // Required fields
54
+ if (!recorded.node) {
55
+ errors.push('Missing required toolchain field: node');
56
+ }
57
+ if (!recorded.lockfileHash) {
58
+ errors.push('Missing required toolchain field: lockfileHash');
59
+ }
60
+ if (!recorded.repoMapperVersion) {
61
+ errors.push('Missing required toolchain field: repoMapperVersion');
62
+ }
63
+ return {
64
+ valid: errors.length === 0,
65
+ errors,
66
+ };
67
+ }
68
+ //# sourceMappingURL=toolchain.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toolchain.js","sourceRoot":"","sources":["../../src/core/toolchain.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAarD;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,WAAmB;IAChD,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAEtD,yBAAyB;IACzB,MAAM,YAAY,GAAG,YAAY,CAAC,WAAW,CAAC,CAAC;IAC/C,MAAM,YAAY,GAAG,YAAY;QAC7B,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC;QACpC,CAAC,CAAC,SAAS,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,cAAc;IAEhD,OAAO;QACH,IAAI,EAAE,WAAW;QACjB,YAAY;QACZ,iBAAiB,EAAE,mBAAmB;KACzC,CAAC;AACN,CAAC;AAED;;GAEG;AACH,SAAS,YAAY,CAAC,WAAmB;IACrC,MAAM,UAAU,GAAG,CAAC,mBAAmB,EAAE,gBAAgB,EAAE,WAAW,CAAC,CAAC;IACxE,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;QACrC,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACnB,OAAO,IAAI,CAAC;QAChB,CAAC;IACL,CAAC;IACD,OAAO,IAAI,CAAC;AAChB,CAAC;AAOD;;;GAGG;AACH,MAAM,UAAU,wBAAwB,CACpC,QAAmB,EACnB,WAAmB;IAEnB,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,OAAO,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC;IAE9C,qBAAqB;IACrB,IAAI,QAAQ,CAAC,IAAI,KAAK,OAAO,CAAC,IAAI,EAAE,CAAC;QACjC,MAAM,CAAC,IAAI,CAAC,mCAAmC,QAAQ,CAAC,IAAI,aAAa,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAC7F,CAAC;IAED,sBAAsB;IACtB,IAAI,QAAQ,CAAC,YAAY,KAAK,OAAO,CAAC,YAAY,EAAE,CAAC;QACjD,MAAM,CAAC,IAAI,CAAC,uDAAuD,CAAC,CAAC;IACzE,CAAC;IAED,kBAAkB;IAClB,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QACjB,MAAM,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;IAC1D,CAAC;IACD,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,CAAC;QACzB,MAAM,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC;IAClE,CAAC;IACD,IAAI,CAAC,QAAQ,CAAC,iBAAiB,EAAE,CAAC;QAC9B,MAAM,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC;IACvE,CAAC;IAED,OAAO;QACH,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC;QAC1B,MAAM;KACT,CAAC;AACN,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Verification gate.
3
+ * Per D5: Executable rules that reject unproven edges.
4
+ * Per D9: Fails if toolchain metadata is missing.
5
+ */
6
+ export interface VerificationResult {
7
+ passed: boolean;
8
+ errors: string[];
9
+ warnings: string[];
10
+ }
11
+ /**
12
+ * Verify all artifacts in an output directory.
13
+ */
14
+ export declare function verifyOutputDir(outDir: string, projectRoot: string): Promise<VerificationResult>;
15
+ //# sourceMappingURL=verify.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../src/core/verify.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AA0BH,MAAM,WAAW,kBAAkB;IAC/B,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACtB;AAED;;GAEG;AACH,wBAAsB,eAAe,CACjC,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,GACpB,OAAO,CAAC,kBAAkB,CAAC,CAiC7B"}
@@ -0,0 +1,182 @@
1
+ /**
2
+ * Verification gate.
3
+ * Per D5: Executable rules that reject unproven edges.
4
+ * Per D9: Fails if toolchain metadata is missing.
5
+ */
6
+ import { readFileSync, existsSync } from 'node:fs';
7
+ import { join } from 'node:path';
8
+ import Ajv from 'ajv';
9
+ import { sha256 } from './hashing.js';
10
+ import { verifyToolchainAlignment } from './toolchain.js';
11
+ // Load schemas
12
+ const repoProfileSchema = JSON.parse(readFileSync(new URL('../../schemas/repo-profile.schema.json', import.meta.url), 'utf8'));
13
+ const graphSchema = JSON.parse(readFileSync(new URL('../../schemas/graph.schema.json', import.meta.url), 'utf8'));
14
+ const toolchainSchema = JSON.parse(readFileSync(new URL('../../schemas/toolchain.schema.json', import.meta.url), 'utf8'));
15
+ const ajv = new Ajv.default({ strict: false, allErrors: true, validateSchema: false });
16
+ ajv.addSchema(toolchainSchema, 'toolchain.schema.json');
17
+ const validateRepoProfile = ajv.compile(repoProfileSchema);
18
+ const validateGraph = ajv.compile(graphSchema);
19
+ /**
20
+ * Verify all artifacts in an output directory.
21
+ */
22
+ export async function verifyOutputDir(outDir, projectRoot) {
23
+ const errors = [];
24
+ const warnings = [];
25
+ // 1. Check repo_profile.json exists and validates
26
+ const profilePath = join(outDir, 'repo_profile.json');
27
+ if (!existsSync(profilePath)) {
28
+ errors.push('Missing required artifact: repo_profile.json');
29
+ }
30
+ else {
31
+ const profileResult = verifyRepoProfile(profilePath, projectRoot);
32
+ errors.push(...profileResult.errors);
33
+ warnings.push(...profileResult.warnings);
34
+ }
35
+ // 2. Check graph.json if it exists (may be empty in M0)
36
+ const graphPath = join(outDir, 'graph.json');
37
+ if (existsSync(graphPath)) {
38
+ const graphResult = await verifyGraph(graphPath);
39
+ errors.push(...graphResult.errors);
40
+ warnings.push(...graphResult.warnings);
41
+ }
42
+ // 3. Check toolchain.json exists
43
+ const toolchainPath = join(outDir, 'toolchain.json');
44
+ if (!existsSync(toolchainPath)) {
45
+ errors.push('Missing required artifact: toolchain.json (D9 violation)');
46
+ }
47
+ return {
48
+ passed: errors.length === 0,
49
+ errors,
50
+ warnings,
51
+ };
52
+ }
53
+ /**
54
+ * Verify repo_profile.json.
55
+ */
56
+ function verifyRepoProfile(path, projectRoot) {
57
+ const errors = [];
58
+ const warnings = [];
59
+ let data;
60
+ try {
61
+ data = JSON.parse(readFileSync(path, 'utf8'));
62
+ }
63
+ catch (e) {
64
+ errors.push(`Failed to parse repo_profile.json: ${e instanceof Error ? e.message : String(e)}`);
65
+ return { passed: false, errors, warnings };
66
+ }
67
+ // Schema validation
68
+ if (!validateRepoProfile(data)) {
69
+ const schemaErrors = validateRepoProfile.errors?.map((e) => `repo_profile.json${e.instancePath}: ${e.message}`) ?? [];
70
+ errors.push(...schemaErrors);
71
+ }
72
+ // Toolchain alignment (D9)
73
+ const profile = data;
74
+ if (profile.toolchain) {
75
+ const alignResult = verifyToolchainAlignment(profile.toolchain, projectRoot);
76
+ if (!alignResult.valid) {
77
+ errors.push(...alignResult.errors.map((e) => `Toolchain: ${e}`));
78
+ }
79
+ }
80
+ else {
81
+ errors.push('repo_profile.json missing toolchain field');
82
+ }
83
+ return { passed: errors.length === 0, errors, warnings };
84
+ }
85
+ /**
86
+ * Verify graph.json with referential integrity and proof requirements.
87
+ */
88
+ async function verifyGraph(path) {
89
+ const errors = [];
90
+ const warnings = [];
91
+ let data;
92
+ try {
93
+ data = JSON.parse(readFileSync(path, 'utf8'));
94
+ }
95
+ catch (e) {
96
+ errors.push(`Failed to parse graph.json: ${e instanceof Error ? e.message : String(e)}`);
97
+ return { passed: false, errors, warnings };
98
+ }
99
+ // Schema validation
100
+ if (!validateGraph(data)) {
101
+ const schemaErrors = validateGraph.errors?.map((e) => `graph.json${e.instancePath}: ${e.message}`) ?? [];
102
+ errors.push(...schemaErrors);
103
+ return { passed: false, errors, warnings };
104
+ }
105
+ // Content hash verification (D3)
106
+ const { canonicalize } = await import('json-canonicalize');
107
+ const hashableData = {
108
+ schemaVersion: data.schemaVersion,
109
+ nodes: data.nodes,
110
+ edges: data.edges,
111
+ };
112
+ const computedHash = sha256(canonicalize(hashableData));
113
+ if (data.meta.contentHash !== computedHash) {
114
+ errors.push(`graph.json contentHash mismatch: recorded=${data.meta.contentHash}, computed=${computedHash}`);
115
+ }
116
+ // Referential integrity: all edge sources/targets must exist
117
+ const nodeIds = new Set(data.nodes.map((n) => n.id));
118
+ for (const edge of data.edges) {
119
+ if (!nodeIds.has(edge.source)) {
120
+ errors.push(`Edge references non-existent source node: ${edge.source}`);
121
+ }
122
+ if (!nodeIds.has(edge.target)) {
123
+ errors.push(`Edge references non-existent target node: ${edge.target}`);
124
+ }
125
+ }
126
+ // Proof requirements (D5): All edges must have valid proof
127
+ for (const edge of data.edges) {
128
+ const proofResult = verifyEdgeProof(edge, data.nodes);
129
+ errors.push(...proofResult.errors);
130
+ }
131
+ // Deterministic ordering check
132
+ const sortedNodes = [...data.nodes].sort((a, b) => {
133
+ const typeCompare = a.type.localeCompare(b.type);
134
+ return typeCompare !== 0 ? typeCompare : a.id.localeCompare(b.id);
135
+ });
136
+ for (let i = 0; i < data.nodes.length; i++) {
137
+ if (data.nodes[i].id !== sortedNodes[i].id) {
138
+ errors.push('Nodes are not in canonical order (type ASC, id ASC)');
139
+ break;
140
+ }
141
+ }
142
+ return { passed: errors.length === 0, errors, warnings };
143
+ }
144
+ /**
145
+ * Verify edge proof meets per-language requirements (D5).
146
+ */
147
+ function verifyEdgeProof(edge, nodes) {
148
+ const errors = [];
149
+ const sourceNode = nodes.find((n) => n.id === edge.source);
150
+ if (!sourceNode)
151
+ return { errors };
152
+ const language = sourceNode.language;
153
+ const proof = edge.proof;
154
+ // Per-language proof requirements from D5
155
+ if (edge.kind === 'import') {
156
+ switch (language) {
157
+ case 'typescript':
158
+ case 'javascript':
159
+ if (proof.type !== 'ast_import') {
160
+ errors.push(`TS/JS import edge requires ast_import proof, got ${proof.type}`);
161
+ }
162
+ break;
163
+ case 'python':
164
+ if (proof.type !== 'ast_import') {
165
+ errors.push(`Python import edge requires ast_import proof, got ${proof.type}`);
166
+ }
167
+ break;
168
+ case 'go':
169
+ if (proof.type !== 'go_list') {
170
+ errors.push(`Go import edge requires go_list proof, got ${proof.type}`);
171
+ }
172
+ break;
173
+ case 'rust':
174
+ if (proof.type !== 'cargo_metadata') {
175
+ errors.push(`Rust import edge requires cargo_metadata proof, got ${proof.type}`);
176
+ }
177
+ break;
178
+ }
179
+ }
180
+ return { errors };
181
+ }
182
+ //# sourceMappingURL=verify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify.js","sourceRoot":"","sources":["../../src/core/verify.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * MCP Server for odd-repo-mapper.
3
+ * Per D1: Standalone CLI exposing MCP stdio server.
4
+ * Per D2: Artifact references, small inline summaries, 64KB fixed chunks.
5
+ */
6
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
7
+ declare const server: Server<{
8
+ method: string;
9
+ params?: {
10
+ [x: string]: unknown;
11
+ _meta?: {
12
+ [x: string]: unknown;
13
+ progressToken?: string | number | undefined;
14
+ "io.modelcontextprotocol/related-task"?: {
15
+ taskId: string;
16
+ } | undefined;
17
+ } | undefined;
18
+ } | undefined;
19
+ }, {
20
+ method: string;
21
+ params?: {
22
+ [x: string]: unknown;
23
+ _meta?: {
24
+ [x: string]: unknown;
25
+ progressToken?: string | number | undefined;
26
+ "io.modelcontextprotocol/related-task"?: {
27
+ taskId: string;
28
+ } | undefined;
29
+ } | undefined;
30
+ } | undefined;
31
+ }, {
32
+ [x: string]: unknown;
33
+ _meta?: {
34
+ [x: string]: unknown;
35
+ progressToken?: string | number | undefined;
36
+ "io.modelcontextprotocol/related-task"?: {
37
+ taskId: string;
38
+ } | undefined;
39
+ } | undefined;
40
+ }>;
41
+ /**
42
+ * Start the MCP server.
43
+ */
44
+ export declare function startMcpServer(): Promise<void>;
45
+ export { server };
46
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAoBnE,QAAA,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAWX,CAAC;AA2bF;;GAEG;AACH,wBAAsB,cAAc,kBAInC;AAGD,OAAO,EAAE,MAAM,EAAE,CAAC"}