Files
pikasTech-HWLAB/scripts/repo-reports-guard.mjs
2026-05-24 02:31:36 +00:00

60 lines
2.1 KiB
JavaScript

#!/usr/bin/env node
import { execFileSync } from "node:child_process";
import { existsSync } from "node:fs";
import path from "node:path";
import { fileURLToPath } from "node:url";
const repoRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..");
const reportsDirName = "reports";
const reportsPath = path.join(repoRoot, reportsDirName);
function gitLines(args) {
try {
const output = execFileSync("git", args, {
cwd: repoRoot,
encoding: "utf8",
stdio: ["ignore", "pipe", "pipe"]
}).trim();
return output ? output.split(/\r?\n/u).filter(Boolean) : [];
} catch (error) {
const stderr = error?.stderr?.toString?.().trim();
throw new Error(stderr || error.message);
}
}
function statusReportPaths() {
return gitLines(["status", "--porcelain=v1", "--untracked-files=all", "--", reportsDirName])
.map((line) => line.slice(3).trim())
.filter(Boolean);
}
const tracked = gitLines(["ls-files", reportsDirName]);
const staged = gitLines(["diff", "--cached", "--name-only", "--", reportsDirName]);
const workingTree = statusReportPaths();
const exists = existsSync(reportsPath);
const failures = [];
if (exists) failures.push("forbidden repository report directory exists in the worktree");
if (tracked.length > 0) failures.push(`tracked reports files: ${tracked.slice(0, 8).join(", ")}`);
if (staged.length > 0) failures.push(`staged reports files: ${staged.slice(0, 8).join(", ")}`);
if (workingTree.length > 0) failures.push(`working-tree reports files: ${workingTree.slice(0, 8).join(", ")}`);
if (failures.length > 0) {
process.stderr.write(`${JSON.stringify({
ok: false,
status: "blocked",
taskId: "repo-reports-guard",
policy: "repository report directories are forbidden; use GitHub issue/PR comments, /tmp, .state, or CI artifacts",
failures
}, null, 2)}\n`);
process.exitCode = 1;
} else {
process.stdout.write(`${JSON.stringify({
ok: true,
status: "pass",
taskId: "repo-reports-guard",
checked: ["directory", "tracked", "staged", "working-tree"],
policy: "repository report directory is absent"
})}\n`);
}