@oddessentials/odd-repo-mapper 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of @oddessentials/odd-repo-mapper might be problematic. Click here for more details.
- package/LICENSE +21 -0
- package/README.md +45 -0
- package/dist/cli/commands/mcp.d.ts +6 -0
- package/dist/cli/commands/mcp.d.ts.map +1 -0
- package/dist/cli/commands/mcp.js +11 -0
- package/dist/cli/commands/mcp.js.map +1 -0
- package/dist/cli/commands/report.d.ts +6 -0
- package/dist/cli/commands/report.d.ts.map +1 -0
- package/dist/cli/commands/report.js +96 -0
- package/dist/cli/commands/report.js.map +1 -0
- package/dist/cli/commands/scan.d.ts +6 -0
- package/dist/cli/commands/scan.d.ts.map +1 -0
- package/dist/cli/commands/scan.js +118 -0
- package/dist/cli/commands/scan.js.map +1 -0
- package/dist/cli/commands/verify.d.ts +6 -0
- package/dist/cli/commands/verify.d.ts.map +1 -0
- package/dist/cli/commands/verify.js +47 -0
- package/dist/cli/commands/verify.js.map +1 -0
- package/dist/cli/index.d.ts +5 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +20 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/core/config.d.ts +53 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +106 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/constants.d.ts +31 -0
- package/dist/core/constants.d.ts.map +1 -0
- package/dist/core/constants.js +31 -0
- package/dist/core/constants.js.map +1 -0
- package/dist/core/graph.d.ts +61 -0
- package/dist/core/graph.d.ts.map +1 -0
- package/dist/core/graph.js +163 -0
- package/dist/core/graph.js.map +1 -0
- package/dist/core/hashing.d.ts +37 -0
- package/dist/core/hashing.d.ts.map +1 -0
- package/dist/core/hashing.js +66 -0
- package/dist/core/hashing.js.map +1 -0
- package/dist/core/indexers/go.d.ts +14 -0
- package/dist/core/indexers/go.d.ts.map +1 -0
- package/dist/core/indexers/go.js +175 -0
- package/dist/core/indexers/go.js.map +1 -0
- package/dist/core/indexers/index.d.ts +39 -0
- package/dist/core/indexers/index.d.ts.map +1 -0
- package/dist/core/indexers/index.js +76 -0
- package/dist/core/indexers/index.js.map +1 -0
- package/dist/core/indexers/python.d.ts +14 -0
- package/dist/core/indexers/python.d.ts.map +1 -0
- package/dist/core/indexers/python.js +186 -0
- package/dist/core/indexers/python.js.map +1 -0
- package/dist/core/indexers/rust.d.ts +14 -0
- package/dist/core/indexers/rust.d.ts.map +1 -0
- package/dist/core/indexers/rust.js +156 -0
- package/dist/core/indexers/rust.js.map +1 -0
- package/dist/core/indexers/typescript.d.ts +19 -0
- package/dist/core/indexers/typescript.d.ts.map +1 -0
- package/dist/core/indexers/typescript.js +223 -0
- package/dist/core/indexers/typescript.js.map +1 -0
- package/dist/core/reports/coverage.d.ts +38 -0
- package/dist/core/reports/coverage.d.ts.map +1 -0
- package/dist/core/reports/coverage.js +175 -0
- package/dist/core/reports/coverage.js.map +1 -0
- package/dist/core/reports/index.d.ts +10 -0
- package/dist/core/reports/index.d.ts.map +1 -0
- package/dist/core/reports/index.js +7 -0
- package/dist/core/reports/index.js.map +1 -0
- package/dist/core/reports/mermaid.d.ts +41 -0
- package/dist/core/reports/mermaid.d.ts.map +1 -0
- package/dist/core/reports/mermaid.js +171 -0
- package/dist/core/reports/mermaid.js.map +1 -0
- package/dist/core/reports/traceability.d.ts +45 -0
- package/dist/core/reports/traceability.d.ts.map +1 -0
- package/dist/core/reports/traceability.js +190 -0
- package/dist/core/reports/traceability.js.map +1 -0
- package/dist/core/scanner.d.ts +48 -0
- package/dist/core/scanner.d.ts.map +1 -0
- package/dist/core/scanner.js +191 -0
- package/dist/core/scanner.js.map +1 -0
- package/dist/core/toolchain.d.ts +28 -0
- package/dist/core/toolchain.d.ts.map +1 -0
- package/dist/core/toolchain.js +68 -0
- package/dist/core/toolchain.js.map +1 -0
- package/dist/core/verify.d.ts +15 -0
- package/dist/core/verify.d.ts.map +1 -0
- package/dist/core/verify.js +182 -0
- package/dist/core/verify.js.map +1 -0
- package/dist/mcp/server.d.ts +46 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +421 -0
- package/dist/mcp/server.js.map +1 -0
- package/package.json +86 -0
- package/schemas/config.schema.json +140 -0
- package/schemas/graph.schema.json +132 -0
- package/schemas/repo-profile.schema.json +118 -0
- package/schemas/toolchain.schema.json +37 -0
|
@@ -0,0 +1,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"}
|