tools/core/runners/checklist.runner.ts

tools/core/runners/checklist.runner.ts is a file in Coordination Surface. 60 lines of code and 11 definitions.

import { existsSync, readFileSync, writeFileSync } from "node:fs";
import {
    retireContended,
    retireLineMissing,
    retireMissing,
    retireNotPlanning,
    retireNothingDistributed,
    retirePreview,
    retireVenueOpen,
    retired,
    retiredDeclaration,
} from "../strings/venue.strings.ts";
import { CHECKLIST_CONCERN } from "../constants/checklist.constants.ts";
import { DISTRIBUTES_FIELD } from "../resolvers/converge.resolver.ts";
import type { RaiseOutcome } from "../types/venue.types.ts";
import { resolve } from "node:path";
import { surfacePath } from "../../../config/surface.config.ts";
import { venueRefusal } from "../factories/venue.factory.ts";

export const runRetire = function runRetire(options: {
    readonly repoRoot: string;
    readonly name: string;
    readonly declares: string;
    readonly live: readonly string[];
    readonly citedBy: readonly string[];
    readonly heal: boolean;
}): RaiseOutcome {
    const planning = surfacePath("planning");
    const source = `${planning}/${options.name}`;
    const absolute = resolve(options.repoRoot, source);

    if (!options.name.endsWith(CHECKLIST_CONCERN)) {
        return venueRefusal(retireNotPlanning(options.name));
    }

    if (!existsSync(absolute)) {
        return venueRefusal(retireMissing(source));
    }

    if (options.declares.length === 0) {
        return venueRefusal(retireNothingDistributed(source));
    }

    if (options.live.some((venue) => venue.endsWith(options.declares))) {
        return venueRefusal(retireVenueOpen(source, options.declares));
    }

    const pinning = options.citedBy.filter((citer) => citer.length > 0);
    const before = readFileSync(absolute, "utf8");
    const lines = before.split("\n");
    const at = lines.findIndex((line) => line.trim().startsWith(DISTRIBUTES_FIELD));

    if (at === -1) {
        return venueRefusal(retireLineMissing(source));
    }

    const line = lines[at] ?? "";
    const retiredLine = retiredDeclaration(line.slice(0, line.indexOf(DISTRIBUTES_FIELD)), pinning);
    const written = [...lines.slice(0, at), retiredLine, ...lines.slice(at + 1)].join("\n");

    if (!options.heal) {
        return { code: 0, message: retirePreview(source, options.declares), raised: source };
    }

    if (readFileSync(absolute, "utf8") !== before) {
        return venueRefusal(retireContended(source));
    }

    writeFileSync(absolute, written, "utf8");

    return { code: 0, message: retired(source), raised: source };
};