60 lines
2.1 KiB
JavaScript
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`);
|
|
}
|