import fs from 'fs'; import crypto from 'crypto'; const classification = JSON.parse(fs.readFileSync('docs/audit/28-full-repository-classification.json', 'utf8')); const evidenceEntries = []; for (const file of classification) { if (!file.includedInAudit) continue; try { const fileBytes = fs.readFileSync(file.path); const sha256 = crypto.createHash('sha256').update(fileBytes).digest('hex'); const textContent = fileBytes.toString('utf8'); const lines = textContent.split(/\r?\n/); const lineCount = lines.length; const byteCount = fileBytes.length; // Extract imports const importMatches = textContent.match(/^import\s+.*?from\s+['"].*?['"];?/gm) || []; const imports = importMatches.map(i => i.trim()).slice(0, 15); // Extract exports const exportMatches = textContent.match(/^export\s+.*?$/gm) || []; const exports = exportMatches.map(e => e.trim()).slice(0, 15); // Extract top-level symbols (functions, classes, consts) const symbolMatches = textContent.match(/export\s+(class|function|const|interface|type)\s+([A-Za-z0-9_]+)/g) || []; const topLevelSymbols = symbolMatches.map(s => s.replace(/export\s+(class|function|const|interface|type)\s+/, '')).slice(0, 15); // Extract decorators const decoratorMatches = textContent.match(/@[A-Za-z0-9_]+\s*\(/g) || []; const frameworkDecorators = [...new Set(decoratorMatches.map(d => d.replace(/[\s(]/g, '')))].slice(0, 15); // Extract test suites const suiteMatches = textContent.match(/(describe|it|test)\s*\(\s*['"](.*?)['"]/g) || []; const testSuiteNames = suiteMatches.map(s => s.replace(/(describe|it|test)\s*\(\s*['"]/, '').replace(/['"]$/, '')).slice(0, 15); // Extract JSON keys or config keys let configurationKeys = []; if (file.path.endsWith('.json') || file.path.endsWith('.yml') || file.path.endsWith('.toml')) { const keyMatches = textContent.match(/"([^"]+)":/g) || []; configurationKeys = [...new Set(keyMatches.map(k => k.replace(/"/g, '').replace(':', '')))].slice(0, 15); } evidenceEntries.push({ path: file.path, sha256, byteCount, lineCount, language: file.path.endsWith('.ts') || file.path.endsWith('.tsx') ? 'TypeScript' : (file.path.endsWith('.json') ? 'JSON' : 'Plain text'), imports, exports, topLevelSymbols, frameworkDecorators, testSuiteNames, configurationKeys, readSucceeded: true, readError: null }); } catch (err) { evidenceEntries.push({ path: file.path, sha256: null, byteCount: 0, lineCount: 0, language: 'Unknown', imports: [], exports: [], topLevelSymbols: [], frameworkDecorators: [], testSuiteNames: [], configurationKeys: [], readSucceeded: false, readError: err.message }); } } fs.writeFileSync('docs/audit/29-file-content-evidence.json', JSON.stringify(evidenceEntries, null, 2), 'utf8'); console.log(`Generated content evidence for ${evidenceEntries.length} files in 29-file-content-evidence.json`);