feat: complete TASK-WP0-01 toolchain skeleton
This commit is contained in:
@@ -0,0 +1,79 @@
|
||||
import { createHash } from "node:crypto";
|
||||
import { spawnSync } from "node:child_process";
|
||||
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
||||
import { resolve } from "node:path";
|
||||
|
||||
const runId = process.env.DADA_TDD_RUN_ID ?? `wp0-01-green-${new Date().toISOString().replace(/[^0-9]/g, "")}`;
|
||||
const caseId = "TDD-WP0-DEP-001-frozen-toolchain";
|
||||
const evidenceDirectory = resolve("artifacts", "tdd", runId, "cases", caseId);
|
||||
|
||||
if (existsSync(evidenceDirectory)) {
|
||||
throw new Error(`Evidence run already exists: ${runId}`);
|
||||
}
|
||||
mkdirSync(evidenceDirectory, { recursive: true });
|
||||
|
||||
const commandDefinitions = [
|
||||
{ command: "pnpm install --frozen-lockfile --offline", args: ["install", "--frozen-lockfile", "--offline"] },
|
||||
{ command: "pnpm test:unit", args: ["test:unit"] },
|
||||
{ command: "pnpm test:security", args: ["test:security"] },
|
||||
{ command: "pnpm test:package", args: ["test:package"] },
|
||||
{ command: "pnpm validate:tdd-trace", args: ["validate:tdd-trace"] },
|
||||
];
|
||||
|
||||
const startedAt = new Date().toISOString();
|
||||
const commands = [];
|
||||
for (const definition of commandDefinitions) {
|
||||
const commandStartedAt = new Date().toISOString();
|
||||
const executable = process.platform === "win32" ? (process.env.ComSpec ?? "cmd.exe") : "pnpm";
|
||||
const args = process.platform === "win32"
|
||||
? ["/d", "/s", "/c", `pnpm ${definition.args.join(" ")}`]
|
||||
: definition.args;
|
||||
const result = spawnSync(executable, args, {
|
||||
env: { ...process.env, DADA_EVIDENCE_DIR: evidenceDirectory },
|
||||
stdio: "inherit",
|
||||
});
|
||||
commands.push({
|
||||
command: definition.command,
|
||||
exit_code: result.status ?? 1,
|
||||
finished_at: new Date().toISOString(),
|
||||
started_at: commandStartedAt,
|
||||
});
|
||||
}
|
||||
|
||||
const allPassed = commands.every((command) => command.exit_code === 0);
|
||||
const requiredEvidence = ["dependency-tree.json", "native-smoke.json"];
|
||||
const missingEvidence = requiredEvidence.filter((path) => !existsSync(resolve(evidenceDirectory, path)));
|
||||
const passed = allPassed && missingEvidence.length === 0;
|
||||
|
||||
writeFileSync(
|
||||
resolve(evidenceDirectory, "commands.json"),
|
||||
`${JSON.stringify({ schema_version: "1.0", run_id: runId, phase: "green", commands }, null, 2)}\n`,
|
||||
);
|
||||
|
||||
const manifestBytes = readFileSync("tasks.manifest.json");
|
||||
const result = {
|
||||
schema_version: "1.0",
|
||||
run_id: runId,
|
||||
task_id: "TASK-WP0-01",
|
||||
case_id: caseId,
|
||||
parent_family: "TDD-WP0-DEP-001",
|
||||
phase: "green",
|
||||
status: passed ? "passed" : "failed",
|
||||
manifest: {
|
||||
path: "tasks.manifest.json",
|
||||
sha256: createHash("sha256").update(manifestBytes).digest("hex").toUpperCase(),
|
||||
},
|
||||
environment: {
|
||||
arch: process.arch,
|
||||
node: process.version.slice(1),
|
||||
os: process.platform,
|
||||
},
|
||||
evidence_files: ["commands.json", ...requiredEvidence],
|
||||
missing_evidence: missingEvidence,
|
||||
started_at: startedAt,
|
||||
finished_at: new Date().toISOString(),
|
||||
};
|
||||
writeFileSync(resolve(evidenceDirectory, "result.json"), `${JSON.stringify(result, null, 2)}\n`);
|
||||
|
||||
console.log(JSON.stringify(result, null, 2));
|
||||
if (!passed) process.exit(1);
|
||||
Reference in New Issue
Block a user