[--run-id Wiki root (where outputs/atlas/ Wiki root (where wiki/ lives)
Stdout: JSON array of absolute paths removed.
`;
export function main(argv: readonly string[] = process.argv.slice(2)): number {
if (argv.length === 0 || argv[0] === "-h" || argv[0] === "--help") {
process.stdout.write(_CSP_HELP);
return 0;
}
const sub = argv[0];
if (sub !== "render" && sub !== "prune") {
process.stderr.write(`unknown subcommand: ${argv[0]}\n`);
return 2;
}
let parsed;
try {
parsed = parseFlags(argv.slice(1), _CSP_FLAG_SPEC);
} catch (e) {
process.stderr.write(`${(e as Error).message}\n`);
return 2;
}
if (parsed.help) {
process.stdout.write(_CSP_HELP);
return 0;
}
const wikiRoot = parsed.values["wikiRoot"];
if (typeof wikiRoot !== "string" || wikiRoot.length === 0) {
process.stderr.write("--wiki-root is required\n");
return 2;
}
// prune: no inventory/graph/run-id needed — just remove the six slugs.
if (sub === "prune") {
const removed = pruneCrossServicePages(wikiRoot);
process.stdout.write(JSON.stringify(removed) + "\n");
return 0;
}
const runId = parsed.values["runId"];
if (typeof runId !== "string" || !_CSP_RUN_ID_RE.test(runId)) {
process.stderr.write("--run-id is required and must match YYYY-MM-DDTHH-MM-SS\n");
return 2;
}
const inventory = loadInventory(wikiRoot, runId);
if (!inventory) {
process.stderr.write(`no code-inventory.json for run ${runId} under ${wikiRoot}\n`);
return 1;
}
const graph = loadServiceGraph(wikiRoot, runId);
if (!graph) {
process.stderr.write(`no service-graph.json for run ${runId} under ${wikiRoot}\n`);
return 1;
}
let written: string[];
try {
written = writeCrossServicePages(wikiRoot, inventory, graph);
} catch (e) {
process.stderr.write(`write failed: ${(e as Error).message}\n`);
return 1;
}
process.stdout.write(JSON.stringify(written) + "\n");
return 0;
}
const _cspThisFile = fileURLToPath(import.meta.url);
if (process.argv[1] && path.resolve(process.argv[1]) === _cspThisFile) {
process.exit(main());
}