feat(consistency): 增加V2.5一致性校验
This commit is contained in:
80
scripts/check-v25-consistency.mjs
Normal file
80
scripts/check-v25-consistency.mjs
Normal file
@@ -0,0 +1,80 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
const DEFAULT_URL = 'http://localhost:3001/api/v1/consistency';
|
||||
|
||||
const args = parseArgs(process.argv.slice(2));
|
||||
|
||||
if (args.help) {
|
||||
printHelp();
|
||||
process.exit(0);
|
||||
}
|
||||
|
||||
const url = args.url || process.env.CONSISTENCY_URL || DEFAULT_URL;
|
||||
const response = await fetch(url, {
|
||||
headers: {
|
||||
'x-ftb-user-id': process.env.CONSISTENCY_USER_ID || 'm-8',
|
||||
'x-ftb-user-role-id': process.env.CONSISTENCY_ROLE_ID || 'role-admin',
|
||||
'x-ftb-user-name': encodeURIComponent(process.env.CONSISTENCY_USER_NAME || '超级管理员'),
|
||||
},
|
||||
});
|
||||
|
||||
if (!response.ok) {
|
||||
console.error(`V2.5 consistency check failed to call ${url}: HTTP ${response.status}`);
|
||||
console.error(await response.text().catch(() => ''));
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
const result = await response.json();
|
||||
|
||||
if (args.json) {
|
||||
console.log(JSON.stringify(result, null, 2));
|
||||
} else {
|
||||
printHuman(result);
|
||||
}
|
||||
|
||||
process.exit(result.status === 'pass' ? 0 : 1);
|
||||
|
||||
function parseArgs(argv) {
|
||||
const parsed = { help: false, json: false, url: '' };
|
||||
for (let index = 0; index < argv.length; index += 1) {
|
||||
const arg = argv[index];
|
||||
if (arg === '--') continue;
|
||||
else if (arg === '--help' || arg === '-h') parsed.help = true;
|
||||
else if (arg === '--json') parsed.json = true;
|
||||
else if (arg === '--url') parsed.url = argv[++index];
|
||||
else if (arg.startsWith('--url=')) parsed.url = arg.slice('--url='.length);
|
||||
else throw new Error(`Unknown argument: ${arg}`);
|
||||
}
|
||||
return parsed;
|
||||
}
|
||||
|
||||
function printHuman(result) {
|
||||
console.log(result.summary?.human ?? `V2.5 consistency ${result.status}`);
|
||||
console.log(`Generated at: ${result.generatedAt}`);
|
||||
console.log(`Counts: ${Object.entries(result.counts ?? {}).map(([key, value]) => `${key}=${value}`).join(', ')}`);
|
||||
|
||||
for (const [group, checks] of Object.entries(result.checks ?? {})) {
|
||||
const failed = checks.filter((item) => item.severity !== 'ok');
|
||||
if (failed.length === 0) {
|
||||
console.log(`${group}: ok`);
|
||||
continue;
|
||||
}
|
||||
console.log(`${group}:`);
|
||||
for (const item of failed) {
|
||||
console.log(`- [${item.severity}] ${item.id}: ${item.message}`);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function printHelp() {
|
||||
console.log(`Usage: pnpm consistency:v25 -- --url http://localhost:3001/api/v1/consistency
|
||||
|
||||
Calls the V2.5 consistency endpoint and prints both human-readable and JSON-ready
|
||||
results for counts, partition keys, orphan references, and audit coverage.
|
||||
|
||||
Options:
|
||||
--url <url> Consistency endpoint URL. Defaults to ${DEFAULT_URL}.
|
||||
--json Print raw JSON response.
|
||||
-h, --help Show this help.
|
||||
`);
|
||||
}
|
||||
Reference in New Issue
Block a user