/*
Unit tests for flag alias covering resolveSiteFlagAlias (RFC-1126). It also guards the documented public contract and regression-sensitive edge cases.
- Not a contract source of truth — the module under test owns the authoritative behavior; fixtures are minimal scaffolding only.
- Fixtures stay inline and minimal so each case states its own setup.
- RFC-1311: Compass header sweep — declares the flag suite's contract for test-file scaffold coverage.
*/
// @ai-invariant fixtures must not couple to kernel internals beyond the public surface under test
import { mkdtempSync, mkdirSync, rmSync, writeFileSync } from "node:fs";
import { tmpdir } from "node:os";
import { join } from "node:path";
import { afterEach, beforeEach, describe, expect, it } from "vitest";
import type { KernelCommandDefinition } from "@warpgogol/werkstatt-shared/kernel";
import { resolveSiteFlagAlias } from "../flag-alias.ts";
function missionYaml(missionId: string, systemId: string, state: string): string {
return [
"schemaVersion: '1'",
`missionId: ${missionId}`,
`systemId: ${systemId}`,
`state: ${state}`,
"brief: test mission",
"openedAt: '2026-01-01T00:00:00Z'",
"openedBy: test",
"closedAt: null",
"closedBy: null",
"pinAtOpen: abc123",
"materializedAt: null",
"reconciledAt: null",
"migratedAt: null",
"releaseId: null",
"operationId: op-1",
"",
].join("\n");
}
function str(required = false): { kind: "string"; required?: boolean; description: string } {
return { kind: "string", ...(required ? { required } : {}), description: "test flag" };
}
function cmd(
flags: KernelCommandDefinition["flags"],
scope = "workspace",
): KernelCommandDefinition {
return {
name: "test.command",
description: "test command",
scope: scope as KernelCommandDefinition["scope"],
flags,
execute: async () => ({ data: {}, exitCode: 0 }),
} as KernelCommandDefinition;
}
describe("resolveSiteFlagAlias (RFC-1126)", () => {
let root: string;
beforeEach(() => {
root = mkdtempSync(join(tmpdir(), "flag-alias-"));
});
afterEach(() => {
rmSync(root, { recursive: true, force: true });
});
function addMission(missionId: string, systemId: string, state = "open"): void {
const dir = join(root, "missions", missionId);
mkdirSync(dir, { recursive: true });
writeFileSync(join(dir, "mission.yaml"), missionYaml(missionId, systemId, state));
}
it("rewrites --site into --mission via the single open mission", async () => {
addMission("warpgogol-com-m000042", "warpgogol-com");
const { argv, diagnostic } = await resolveSiteFlagAlias(
["--site", "warpgogol-com"],
cmd({ mission: str(true) }),
root,
);
expect(diagnostic).toBeUndefined();
expect(argv).toEqual(["--mission", "warpgogol-com-m000042"]);
});
it("supports the --site=value inline form", async () => {
const { argv } = await resolveSiteFlagAlias(["--site=warpgogol-com"], cmd({ id: str() }), root);
expect(argv).toEqual(["--id", "warpgogol-com"]);
});
it("errors when no open mission exists for the system", async () => {
addMission("warpgogol-com-m000001", "warpgogol-com", "closed");
const { diagnostic } = await resolveSiteFlagAlias(
["--site", "warpgogol-com"],
cmd({ mission: str() }),
root,
);
expect(diagnostic?.ruleId).toBe("KERNEL-FLAG-02");
expect(diagnostic?.message).toContain("no open mission");
});
it("errors on ambiguous open missions", async () => {
addMission("warpgogol-com-m000001", "warpgogol-com");
addMission("warpgogol-com-m000002", "warpgogol-com");
const { diagnostic } = await resolveSiteFlagAlias(
["--site", "warpgogol-com"],
cmd({ mission: str() }),
root,
);
expect(diagnostic?.ruleId).toBe("KERNEL-FLAG-02");
expect(diagnostic?.message).toContain("multiple open missions");
});
it("drops --site silently when --mission already targets the same system", async () => {
addMission("warpgogol-com-m000042", "warpgogol-com");
const { argv, diagnostic } = await resolveSiteFlagAlias(
["--mission", "warpgogol-com-m000042", "--site", "warpgogol-com"],
cmd({ mission: str() }),
root,
);
expect(diagnostic).toBeUndefined();
expect(argv).toEqual(["--mission", "warpgogol-com-m000042"]);
});
it("errors when --mission and --site target different systems", async () => {
addMission("other-system-m000007", "other-system");
const { diagnostic } = await resolveSiteFlagAlias(
["--mission", "other-system-m000007", "--site", "warpgogol-com"],
cmd({ mission: str() }),
root,
);
expect(diagnostic?.ruleId).toBe("KERNEL-FLAG-02");
expect(diagnostic?.message).toContain("Conflicting targets");
});
it("rewrites --site into --id for sternsystem-style commands", async () => {
const { argv } = await resolveSiteFlagAlias(
["--site", "warpgogol-com"],
cmd({ id: str(true) }),
root,
);
expect(argv).toEqual(["--id", "warpgogol-com"]);
});
it("drops --site when --id carries the same value", async () => {
const { argv, diagnostic } = await resolveSiteFlagAlias(
["--id", "warpgogol-com", "--site", "warpgogol-com"],
cmd({ id: str() }),
root,
);
expect(diagnostic).toBeUndefined();
expect(argv).toEqual(["--id", "warpgogol-com"]);
});
it("errors on conflicting --id and --site", async () => {
const { diagnostic } = await resolveSiteFlagAlias(
["--id", "a", "--site", "b"],
cmd({ id: str() }),
root,
);
expect(diagnostic?.ruleId).toBe("KERNEL-FLAG-02");
});
it("rewrites --site into --system for mission.open-style commands", async () => {
const { argv } = await resolveSiteFlagAlias(
["--site", "warpgogol-com"],
cmd({ system: str(true) }),
root,
);
expect(argv).toEqual(["--system", "warpgogol-com"]);
});
it("is a no-op when the command declares its own site flag", async () => {
const { argv } = await resolveSiteFlagAlias(
["--site", "warpgogol-com"],
cmd({ site: str(true), id: str() }),
root,
);
expect(argv).toEqual(["--site", "warpgogol-com"]);
});
it("is a no-op for site-scoped commands", async () => {
const { argv } = await resolveSiteFlagAlias(
["--site", "warpgogol-com"],
cmd({ id: str() }, "app"),
root,
);
expect(argv).toEqual(["--site", "warpgogol-com"]);
});
it("is a no-op without --site in argv", async () => {
const { argv } = await resolveSiteFlagAlias(["--id", "x"], cmd({ id: str() }), root);
expect(argv).toEqual(["--id", "x"]);
});
});