52 lines
1.4 KiB
JavaScript
52 lines
1.4 KiB
JavaScript
import { mkdir, readFile, writeFile } from "node:fs/promises";
|
|
|
|
const ledger = JSON.parse(
|
|
await readFile("docs/architecture/review-ledger.json", "utf8"),
|
|
);
|
|
const results = [];
|
|
for (const [diagram, review] of Object.entries(ledger.reviews)) {
|
|
const content = await readFile(review.path, "utf8");
|
|
const hasDiagram = /```mermaid[\s\S]+```/.test(content);
|
|
const scorePass =
|
|
typeof ledger.reviewerThreshold === "number" &&
|
|
typeof review.score === "number" &&
|
|
review.score >= ledger.reviewerThreshold;
|
|
results.push({
|
|
diagram,
|
|
path: review.path,
|
|
hasDiagram,
|
|
reviewer: review.reviewer,
|
|
score: review.score,
|
|
scorePass,
|
|
passed:
|
|
hasDiagram &&
|
|
Boolean(review.reviewer) &&
|
|
scorePass &&
|
|
ledger.status === "PASS_SCOPED",
|
|
});
|
|
}
|
|
const passed = results.every((result) => result.passed);
|
|
await mkdir("artifacts/quality", { recursive: true });
|
|
await writeFile(
|
|
"artifacts/quality/documentation-review.json",
|
|
`${JSON.stringify(
|
|
{
|
|
schemaVersion: 1,
|
|
generatedAt: new Date().toISOString(),
|
|
status: ledger.status,
|
|
reviewerThreshold: ledger.reviewerThreshold,
|
|
results,
|
|
passed,
|
|
},
|
|
null,
|
|
2,
|
|
)}\n`,
|
|
);
|
|
if (!passed) {
|
|
process.stderr.write(
|
|
"Documentation readiness: FAIL_UNVERIFIED (reviewer threshold and signed reviews required)\n",
|
|
);
|
|
process.exit(1);
|
|
}
|
|
process.stdout.write("Documentation readiness: PASS_SCOPED\n");
|