47 lines
2.2 KiB
JavaScript
47 lines
2.2 KiB
JavaScript
import fs from 'node:fs'
|
|
import path from 'node:path'
|
|
|
|
const root = process.cwd()
|
|
const required = [
|
|
'packages/kbx-contracts/src/runtime.ts',
|
|
'packages/kbx-contracts/src/performance.ts',
|
|
'packages/kbx-ui/src/components/KbxRuntimeBanner.vue',
|
|
'packages/kbx-ui/src/components/KbxFreshnessIndicator.vue',
|
|
'packages/kbx-ui/src/components/KbxConflictResolver.vue',
|
|
'packages/kbx-ui/src/components/KbxOperationCenter.vue',
|
|
'packages/kbx-ui/src/components/KbxNotificationCenter.vue',
|
|
'apps/web/src/runtime/KbxRuntimeShell.vue',
|
|
'apps/web/src/http/kbxHttpClient.ts',
|
|
'backend/Database/Migrations/20260808_008_kbx_runtime_operations.sql',
|
|
'backend/Shared/Runtime/KbxOperationPolicy.cs',
|
|
'backend/Shared/Runtime/KbxTelemetry.cs',
|
|
'backend/Shared/Runtime/KbxCorrelationMiddleware.cs',
|
|
'docs/production-readiness-v9.md',
|
|
'docs/failure-recovery-matrix-v9.md',
|
|
'docs/performance-budget-v9.md',
|
|
'docs/observability-runtime-v9.md',
|
|
]
|
|
|
|
const missing = required.filter(file => !fs.existsSync(path.join(root, file)))
|
|
if (missing.length) {
|
|
console.error('KBX v9 production readiness files missing:\n' + missing.join('\n'))
|
|
process.exit(1)
|
|
}
|
|
|
|
const migration = fs.readFileSync(path.join(root, 'backend/Database/Migrations/20260808_008_kbx_runtime_operations.sql'), 'utf8')
|
|
for (const token of ['kbx.operation_runs', 'kbx.user_notifications', 'kbx.runtime_incidents', 'idempotency_key', 'correlation_id']) {
|
|
if (!migration.includes(token)) throw new Error(`runtime migration missing ${token}`)
|
|
}
|
|
|
|
const http = fs.readFileSync(path.join(root, 'apps/web/src/http/kbxHttpClient.ts'), 'utf8')
|
|
if (/interceptors\.response[\s\S]*axios\([^)]*\)/.test(http)) {
|
|
throw new Error('response interceptor must not implement hidden mutation retries')
|
|
}
|
|
if (!http.includes('Idempotency-Key')) throw new Error('idempotency helper missing')
|
|
if (!http.includes('X-Correlation-Id')) throw new Error('correlation id propagation missing')
|
|
|
|
const policy = fs.readFileSync(path.join(root, 'backend/Shared/Runtime/KbxOperationPolicy.cs'), 'utf8')
|
|
if (!policy.includes('hasIdempotencyKey')) throw new Error('server retry policy must require idempotency for mutation')
|
|
|
|
console.log('production readiness guard PASS')
|