// One-line-per-failure digest of the last e2e run: reads // runs///result.json and prints pass/fail counts plus each // failure's scenario name. `bun run summary [target...]` (default: all). import { readdirSync, readFileSync } from "node:fs"; import { join } from "node:path"; import { fileURLToPath } from "node:url"; const runsDir = fileURLToPath(new URL("../runs/", import.meta.url)); const targets = process.argv.length > 2 ? process.argv.slice(2) : readdirSync(runsDir, { withFileTypes: true }) .filter((entry) => entry.isDirectory()) .map((entry) => entry.name); for (const target of targets) { const targetDir = join(runsDir, target); let slugs: string[]; try { slugs = readdirSync(targetDir); } catch { console.log(`${target}: no runs`); continue; } const failures: { scenario: string; endedAt: string }[] = []; let passed = 0; for (const slug of slugs) { try { const result = JSON.parse(readFileSync(join(targetDir, slug, "result.json"), "utf8")); if (result.ok) passed++; else failures.push({ scenario: result.scenario ?? slug, endedAt: result.endedAt ?? "?" }); } catch { // No result.json (partial run dir) — not a verdict either way. } } console.log(`${target}: ${passed} passed, ${failures.length} failed`); for (const failure of failures) console.log(` FAIL ${failure.scenario} (${failure.endedAt})`); }