Files
deepseek-harness/scripts/gen-package-invariants.ts
T

45 lines
1.5 KiB
TypeScript

/** Generate or verify package-owned invariant companion baselines. */
import { readFileSync, writeFileSync } from 'node:fs'
import { resolve } from 'node:path'
import {
GENERATED_INVARIANT_MARKER,
collectPackageInvariantViolations,
formatPackageInvariantViolation,
packageInvariantOwners,
renderBaselineInvariant,
} from './package-invariants.ts'
const root = resolve(import.meta.dirname, '..')
const check = process.argv.includes('--check')
if (!check) {
let generated = 0
for (const owner of packageInvariantOwners(root)) {
const path = resolve(root, owner.sourcePath)
let current: string | undefined
try {
current = readFileSync(path, 'utf8')
} catch (error) {
if ((error as NodeJS.ErrnoException).code !== 'ENOENT') throw error
}
if (current !== undefined && !current.includes(GENERATED_INVARIANT_MARKER)) continue
const expected = renderBaselineInvariant(owner)
if (current === expected) continue
writeFileSync(path, expected)
generated += 1
}
console.log(`gen-package-invariants: wrote ${generated} generated baseline companion(s).`)
}
const violations = collectPackageInvariantViolations(root)
if (violations.length > 0) {
console.error('verify-package-invariants: violations found:')
for (const violation of violations) {
console.error(` ${formatPackageInvariantViolation(root, violation)}`)
}
process.exit(1)
}
console.log(`verify-package-invariants: ${packageInvariantOwners(root).length} package companion(s) conform.`)