Files
bare-operating-system/scripts/verify-doc-contracts.mjs
T
2026-08-18 18:11:34 -04:00

131 lines
4.7 KiB
JavaScript

#!/usr/bin/env node
/**
* CI: cross-check versioned contracts appear consistently across source + key docs.
* Complements verify-compat-matrix.mjs (matrix table) with syscall example + JSON Schema.
*/
import fs from 'node:fs'
import path from 'node:path'
import process from 'node:process'
import { fileURLToPath } from 'node:url'
const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..')
function read(rel) {
return fs.readFileSync(path.join(root, rel), 'utf8')
}
function must(cond, msg) {
if (!cond) {
console.error('verify-doc-contracts:', msg)
process.exit(1)
}
}
function main() {
const ctxSrc = read('packages/bare-os-booter/lib/ctx/bare-os-ctx-api.js')
const ctxM = ctxSrc.match(/export const BARE_OS_CTX_API_VERSION = '([^']+)'/)
must(ctxM, 'parse BARE_OS_CTX_API_VERSION failed')
const ctxVer = ctxM[1]
const compat = read('docs/reference/compatibility-matrix.md')
must(
compat.includes('`' + ctxVer + '`'),
'compatibility-matrix.md must list bareOsCtxApiVersion ' + ctxVer
)
const posixSrc = read('packages/bare-os-protocol/lib/bare-os-posix-profile.js')
const posixM = posixSrc.match(
/export const BARE_OS_POSIX_PROFILE_VERSION = '([^']+)'/
)
must(posixM, 'parse BARE_OS_POSIX_PROFILE_VERSION failed')
const posixVer = posixM[1]
must(
compat.includes('`' + posixVer + '`'),
'compatibility-matrix.md must list BARE_OS_POSIX_PROFILE_VERSION ' + posixVer
)
const declared = read('docs/architecture/POSIX_DECLARED_PROFILE.md')
must(
declared.includes('`' + posixVer + '`'),
'POSIX_DECLARED_PROFILE.md must list profile version ' + posixVer
)
const procJsonSrc = read(
'packages/bare-os-booter/lib/posix/bare-os-syscalls-proc-json.js'
)
const schM = procJsonSrc.match(/schemaVersion:\s*(\d+)/)
must(schM, 'parse syscalls proc schemaVersion failed')
const syscallSchema = schM[1]
const exRaw = read('kernel/etc/bare-os/syscalls.example.json')
const exM = exRaw.match(/"schemaVersion":\s*(\d+)/)
must(exM, 'parse syscalls.example.json schemaVersion failed')
must(
exM[1] === syscallSchema,
`syscalls.example.json schemaVersion ${exM[1]} !== proc builder ${syscallSchema}`
)
const schemaPath = 'docs/schemas/bare-os-syscalls.schema.json'
const schemaRaw = read(schemaPath)
const jsonSchemaM = schemaRaw.match(
/"schemaVersion"\s*:\s*\{\s*"type"\s*:\s*"integer"\s*,\s*"const"\s*:\s*(\d+)/
)
must(jsonSchemaM, 'parse bare-os-syscalls.schema.json schemaVersion const failed')
must(
jsonSchemaM[1] === syscallSchema,
`${schemaPath} const ${jsonSchemaM[1]} !== proc builder ${syscallSchema}`
)
must(
compat.includes('Schema **' + syscallSchema + '**'),
'compatibility-matrix.md must document syscalls.json schema ' + syscallSchema
)
const genPath = 'docs/reference/ctx-client-helper.generated.ts'
if (fs.existsSync(path.join(root, genPath))) {
const genRaw = read(genPath)
const genM = genRaw.match(
/BARE_OS_CTX_API_CLIENT_VERSION = '([^']+)'/
)
must(genM, 'parse BARE_OS_CTX_API_CLIENT_VERSION from ' + genPath + ' failed')
must(
genM[1] === ctxVer,
`${genPath} BARE_OS_CTX_API_CLIENT_VERSION ${genM[1]} !== bare-os-ctx-api.js ${ctxVer} (run node scripts/gen-ctx-client-helper.mjs)`
)
}
const posixMatrixRaw = read('docs/reference/posix-compliance-matrix.json')
const posixMatrix = JSON.parse(posixMatrixRaw)
const procTableSchema = Number(posixMatrix?.synthetic_proc?.process_table_schema)
const syscallsSchemaFromMatrix = Number(
posixMatrix?.synthetic_proc?.syscalls_json_schema
)
must(
Number.isFinite(procTableSchema) && procTableSchema > 0,
'posix-compliance-matrix.json missing synthetic_proc.process_table_schema'
)
must(
Number.isFinite(syscallsSchemaFromMatrix) && syscallsSchemaFromMatrix > 0,
'posix-compliance-matrix.json missing synthetic_proc.syscalls_json_schema'
)
must(
String(syscallsSchemaFromMatrix) === syscallSchema,
`posix-compliance-matrix syscalls_json_schema ${syscallsSchemaFromMatrix} !== proc builder ${syscallSchema}`
)
const handbookPosix = read('handbook/09-posix-utilities-shell-and-vfs.md')
must(
handbookPosix.includes(
'`/proc/bare_os/syscalls.json`** (schema **' + syscallsSchemaFromMatrix + '**'
),
`handbook/09-posix-utilities-shell-and-vfs.md must mention /proc/bare_os/syscalls.json schema ${syscallsSchemaFromMatrix}`
)
must(
handbookPosix.includes(
'`/proc/bare_os/process_table.json`** (**schema ' + procTableSchema + '**'
),
`handbook/09-posix-utilities-shell-and-vfs.md must mention /proc/bare_os/process_table.json schema ${procTableSchema}`
)
console.log('verify-doc-contracts: OK')
}
main()