import { test } from "node:test"; import assert from "node:assert/strict"; import { formatAgents, formatInbox, formatTasks, formatTrail } from "../src/format.mjs"; test("empty views say so", () => { assert.equal(formatInbox([]), "inbox: empty\n"); assert.equal(formatAgents([]), "agents: no role is claimed\n"); assert.equal(formatTasks([]), "tasks: none\n"); }); test("the trail keeps the broker's order and names a decision's task without its rows", () => { const rows = [ { at: "2026-10-08T10:00:00Z", table: "decisions", seq: 4, id: "d-1", class: "gated", action: "deploy", route_to: "human", blocking: 1, question: "Ship?", task_ref: "vikunja:1/7" }, { at: "2026-10-08T09:00:00Z", table: "events", seq: 2, kind: "decision.raised", actor_role: "coder" }, { at: "2026-10-08T11:00:00Z", table: "decision_events", seq: 1, op: "resolved", choice: "yes", by: "jason", via: "cli" }, ]; const lines = formatTrail("d-1", rows).trimEnd().split("\n"); assert.deepEqual(lines.slice(1, 4).map((l) => l.split(" ")[1]), ["decisions#4", "events#2", "decision_events#1"]); assert.match(lines[1], /gated deploy → human \(blocking\): Ship\?/); assert.match(lines[3], /resolved choice yes by jason via cli/); assert.deepEqual(lines.slice(-2), ["task: vikunja:1/7", "follow with: mosaic trail vikunja:1/7"]); assert.doesNotMatch(formatTrail("vikunja:1/7", rows), /follow with/); }); test("tasks print the tracker fields the snapshot carries", () => { assert.equal(formatTasks([{ task_ref: "vikunja:1/7", fields: { title: "Build S4", done: false } }]), "vikunja:1/7 open Build S4\n"); });