Intelligence
Artifacts
Browse the repository, read documents, and manage the governance folders. Source, runtime, and infrastructure are read-only.
Repository
repositories/aaf-holdings/hq01/lib/content/work-orders.ts
2.3 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 { normalizePriority, normalizeStatus } from "./normalize";
import type { WorkOrder } from "./types";
function isWorkOrderFile(p: string): boolean {
const norm = p.split(path.sep).join("/");
return (
/\/work-orders\/.+\/work-order\.md$/.test(norm) ||
/\/work-order\.md$/.test(norm) ||
/\/work-orders\/WO-[^/]+\.md$/.test(norm)
);
}
function workOrderId(filePath: string): string {
const dir = path.basename(path.dirname(filePath));
if (dir && dir !== "work-orders") return dir;
return path.basename(filePath, ".md");
}
/** Normalise a mission reference to a comparable id ("MS-0001…"). */
function normalizeMissionRef(ref?: string): string | null {
if (!ref) return null;
return ref.trim().replace(/\s+/g, "-");
}
function toWorkOrder(filePath: string): WorkOrder {
const doc = parseDoc(readText(filePath));
const id = workOrderId(filePath);
return {
id,
title: doc.title || id,
status: normalizeStatus(pick(doc.meta, "status")),
priority: normalizePriority(pick(doc.meta, "priority")),
missionId: normalizeMissionRef(
pick(doc.meta, "mission session", "mission", "mission id"),
),
owner: pick(doc.meta, "owner", "owned by") ?? "—",
objective: pick(doc.blocks, "objective", "scope") ?? "",
acceptanceCriteria: pickList(doc.lists, "acceptance criteria", "completion criteria"),
body: doc.body,
sourcePath: relPath(filePath),
};
}
export const getWorkOrders = cache((): WorkOrder[] => {
const files = walkFiles(CONTENT_ROOT, isWorkOrderFile);
const byId = new Map<string, WorkOrder>();
for (const f of files) {
const wo = toWorkOrder(f);
if (!byId.has(wo.id)) byId.set(wo.id, wo);
}
return [...byId.values()].sort((a, b) => a.id.localeCompare(b.id));
});
export const getWorkOrder = cache((id: string): WorkOrder | undefined => {
return getWorkOrders().find((w) => w.id === id);
});
export const getWorkOrdersForMission = cache((missionId: string): WorkOrder[] => {
return getWorkOrders().filter((w) => {
if (!w.missionId) return false;
return (
w.missionId === missionId ||
missionId.startsWith(w.missionId) ||
w.missionId.startsWith(missionId)
);
});
});
root · /srv/aaf