chore: initialize POM 2 repo (docs guards green; release gates recorded NOT RUN pending install)

This commit is contained in:
Antigravity
2026-08-19 10:31:00 +02:00
commit 7ffd00b5c5
111 changed files with 12522 additions and 0 deletions

35
tests/validators.test.ts Normal file
View File

@@ -0,0 +1,35 @@
import assert from "node:assert/strict";
import test from "node:test";
import { mkdtemp, readFile, rm, writeFile } from "node:fs/promises";
import { tmpdir } from "node:os";
import { join } from "node:path";
import { DEFAULT_CONFIG, stage } from "../src/domain";
import { bootstrapProject } from "../src/persistence";
import { createState, recordEvidence, startStage } from "../src/state";
import { validatePom } from "../src/validators";
test("stage gate rejects starter shell then accepts substantive evidence-backed artifact", async () => {
const parent = await mkdtemp(join(tmpdir(), "pom-validation-"));
try {
const config = { ...DEFAULT_CONFIG, projectRootMode: "child" as const };
let state = createState("Validation Test", parent, config, true);
await bootstrapProject(state);
state = startStage(state, 0);
const initial = await validatePom(state, "stage", { writeReport: false });
assert.equal(initial.passed, false);
assert.ok(initial.checks.some((item) => item.id.includes("bytes") && item.status === "fail"));
const sections = ["Vision", "Audience", "Constraints", "Success Criteria", "Open Questions"];
const body = sections.map((heading) => `## ${heading}\n\n${("Specific, measurable, original production detail. ").repeat(18)}`).join("\n\n");
const briefPath = join(state.projectRoot, "01_planning", "00_project_brief.md");
const original = await readFile(briefPath, "utf8");
await writeFile(briefPath, `${original.split("## Vision")[0]}${body}\n`);
for (const criterion of stage(0).acceptance) {
state = recordEvidence(state, criterion.id, `Verified ${criterion.description}`, ["01_planning/00_project_brief.md"], "Test");
}
const final = await validatePom(state, "stage", { writeReport: false });
assert.equal(final.passed, true, final.checks.filter((item) => item.status === "fail").map((item) => item.message).join("\n"));
} finally {
await rm(parent, { recursive: true, force: true });
}
});