Intelligence

Artifacts

Browse the repository, read documents, and manage the governance folders. Source, runtime, and infrastructure are read-only.

Repository
README.md
CONSTITUTION_COMPLIANCE_AUDIT_V1.mdREADME.md
repositories/aaf-holdings/hq01/lib/content/missions.ts
1.6 KB
import path from "node:path";
import { cache } from "react";
import { CONTENT_ROOT } from "./config";
import { parseDoc, pick, pickList, readText, relPath, walkFiles } from "./fs";
import { normalizeStatus } from "./normalize";
import type { Mission } from "./types";

function isMissionFile(p: string): boolean {
  const norm = p.split(path.sep).join("/");
  return /\/missions\/.+\/mission\.md$/.test(norm) || /\/mission\.md$/.test(norm);
}

/** Derive a stable mission id from its folder name, e.g. MS-0001-build-holdings. */
function missionId(filePath: string): string {
  const dir = path.basename(path.dirname(filePath));
  return dir && dir !== "missions" ? dir : path.basename(filePath, ".md");
}

function toMission(filePath: string): Mission {
  const doc = parseDoc(readText(filePath));
  const id = missionId(filePath);
  return {
    id,
    title: doc.title || id,
    status: normalizeStatus(pick(doc.meta, "status")),
    owner: pick(doc.meta, "owner", "owned by") ?? "—",
    mission: pick(doc.blocks, "mission") ?? doc.blocks["objective"] ?? "",
    successCriteria: pickList(doc.lists, "success criteria", "acceptance criteria"),
    body: doc.body,
    sourcePath: relPath(filePath),
  };
}

export const getMissions = cache((): Mission[] => {
  const files = walkFiles(CONTENT_ROOT, isMissionFile);
  const byId = new Map<string, Mission>();
  for (const f of files) {
    const m = toMission(f);
    if (!byId.has(m.id)) byId.set(m.id, m);
  }
  return [...byId.values()].sort((a, b) => a.id.localeCompare(b.id));
});

export const getMission = cache((id: string): Mission | undefined => {
  return getMissions().find((m) => m.id === id);
});

root · /srv/aaf