/*
Lazy-loading kernel module for RFC-0964 fleet commands: fleet.sites.generate, fleet.apply.
RFC-0967: fleet.ownership.register, fleet.ownership.verify, fleet.ownership.transfer.
RFC-1124: fleet.claims.init, fleet.claims.publish, fleet.claims.sync, fleet.claims.verify, fleet.claims.status.
- Do not re-export types or utilities — the barrel fleet/index.ts remains the public API surface.
- Do not register sternsystem, mission, or leitstand commands here.
- RFC-0964: initial fleet module — fleet.sites.generate (moved from werkstatt-site), fleet.apply (wave orchestration).
- RFC-0967: add fleet.ownership.register, fleet.ownership.verify, fleet.ownership.transfer commands.
- RFC-1124: add fleet.claims.* commands — git-native claims registry as permissioned-era ownership authority.
- RFC-1249: wire werkstatt.commands.validate into packages.check + retire CMD-OUTPUT debt
*/
import type { ModuleExport } from "@warpgogol/werkstatt-shared/kernel";
export async function createFleetModule(): Promise {
const { runFleetSitesGenerate } = await import("./fleet-sites-generate.ts");
const { runFleetApply } = await import("./apply.ts");
const { runFleetOwnershipRegister, runFleetOwnershipVerify, runFleetOwnershipTransfer } =
await import("./ownership-commands.ts");
const {
runFleetClaimsInit,
runFleetClaimsPublish,
runFleetClaimsSync,
runFleetClaimsVerify,
runFleetClaimsStatus,
} = await import("./claims-commands.ts");
return {
name: "fleet",
version: "0.1.0",
declarations: [],
commands: [
{
name: "fleet.sites.generate",
coverage: "operator" as const,
modulePath: "packages/werkstatt-engine/src/fleet/fleet.module.ts",
description:
"Generate fleet/fleet.sites.yaml from RFC-0790 convention-based discovery (systems-cache). Enriched with platformVersion, channels, mirrors, activeMission, canary fields (RFC-0964).",
scope: "workspace",
flags: {},
mutatesState: true,
writes: ["fleet/fleet.sites.yaml"],
generates: [],
reads: [
"../systems-cache/*/system-config.yaml",
"../systems-cache/*/system.pin.json",
"../systems-cache/*/system-state.yaml",
],
execute: runFleetSitesGenerate,
},
{
name: "fleet.apply",
coverage: "operator" as const,
modulePath: "packages/werkstatt-engine/src/fleet/fleet.module.ts",
description:
"Cross-site wave orchestration: run a command or pipeline across fleet sites with canary-first waves, concurrency, stop-threshold, and journal-backed resume (RFC-0964). Required flags: `--run`.",
scope: "workspace",
flags: {
run: {
kind: "string",
required: true,
description:
"Command or pipeline to run per site. Prefix with 'pipeline ' for pipelines.",
},
sites: {
kind: "string",
description: "Comma-separated site ids to target. Mutually exclusive with --all-sites.",
},
"all-sites": { kind: "boolean", description: "Target all discovered sites." },
wave: {
kind: "string",
description: "Wave selection: canary, rest, or all (default: all).",
},
concurrency: {
kind: "string",
description: "Max parallel site invocations per wave (default: 1).",
},
"stop-after-failures": {
kind: "string",
description: "Abort after N failures across all waves (default: 1).",
},
resume: { kind: "string", description: "Resume a previous operation by opId." },
json: { kind: "boolean", description: "Output as JSON." },
},
mutatesState: true,
writes: ["fleet/operations/{opId}.jsonl", "fleet/reports/{opId}.json"],
generates: [],
reads: [
"fleet/fleet.sites.yaml",
"../systems-cache/*/system-config.yaml",
"../systems-cache/*/system-state.yaml",
],
execute: runFleetApply,
},
{
name: "fleet.ownership.register",
coverage: "operator" as const,
modulePath: "packages/werkstatt-engine/src/fleet/fleet.module.ts",
description:
"Register a site's ownership claim in the fleet ownership registry (RFC-0967). Reads passport from cache clone and sends it to the registry Worker. Required flags: `--id`.",
scope: "workspace",
flags: {
id: { kind: "string", required: true, description: "Sternsystem ID to register." },
json: { kind: "boolean", description: "Output as JSON." },
},
mutatesState: false,
writes: [],
generates: [],
reads: ["../systems-cache/*/passport.json"],
requiresNetwork: true,
execute: runFleetOwnershipRegister,
},
{
name: "fleet.ownership.verify",
coverage: "operator" as const,
coverageNote: "requires --id",
modulePath: "packages/werkstatt-engine/src/fleet/fleet.module.ts",
description:
"Verify a site's ownership claim in the fleet ownership registry (RFC-0967). Returns the current claim or not-registered status. Required flags: `--id`.",
scope: "workspace",
flags: {
id: { kind: "string", required: true, description: "Sternsystem ID to verify." },
json: { kind: "boolean", description: "Output as JSON." },
},
mutatesState: false,
writes: [],
generates: [],
reads: ["../systems-cache/*/passport.json"],
requiresNetwork: true,
execute: runFleetOwnershipVerify,
},
{
name: "fleet.ownership.transfer",
coverage: "operator" as const,
modulePath: "packages/werkstatt-engine/src/fleet/fleet.module.ts",
description:
"Transfer ownership of a site to a new instance after a handover (RFC-0967, RFC-0968). Requires a signed handover authorization file. Required flags: `--id`, `--authorization`.",
scope: "workspace",
flags: {
id: { kind: "string", required: true, description: "Sternsystem ID to transfer." },
authorization: {
kind: "string",
required: true,
description: "Path to the signed handover authorization JSON file.",
},
json: { kind: "boolean", description: "Output as JSON." },
},
mutatesState: false,
writes: [],
generates: [],
reads: ["../systems-cache/*/passport.json"],
requiresNetwork: true,
execute: runFleetOwnershipTransfer,
},
{
name: "fleet.claims.init",
coverage: "operator" as const,
cacheable: false,
modulePath: "packages/werkstatt-engine/src/fleet/fleet.module.ts",
description:
"Point this workshop at the per-fleet claims repository (RFC-1124). Writes werkstatt.fleet.json and clones/inits the local claims repo. Idempotent. Required flags: `--remote`.",
scope: "workspace",
flags: {
remote: {
kind: "string",
required: true,
description: "Remote URL(s) of the claims repo, comma-separated for multiple.",
},
"local-path": {
kind: "string",
description: "Local clone path (default: .werkstatt/fleet-claims).",
},
"worker-url": {
kind: "string",
description: "Optional RFC-0967 Worker URL — accelerator only, never required.",
},
json: { kind: "boolean", description: "Output as JSON." },
},
mutatesState: true,
writes: ["werkstatt.fleet.json", ".werkstatt/fleet-claims/"],
generates: [],
reads: [],
execute: runFleetClaimsInit,
},
{
name: "fleet.claims.publish",
coverage: "operator" as const,
modulePath: "packages/werkstatt-engine/src/fleet/fleet.module.ts",
description:
"Publish or refresh the signed ownership claim for a system into the fleet claims repo (RFC-1124). Called automatically by mission.close / sternsystem.register / sternsystem.handover.complete; manual use for repair. Required flags: `--id`.",
scope: "workspace",
flags: {
id: { kind: "string", required: true, description: "Sternsystem ID to claim." },
"no-push": {
kind: "boolean",
description: "Commit locally without pushing (offline; pushed on next sync).",
},
"authorization-hash": {
kind: "string",
description: "Transfer claims only: sha256 of handover-authorization.json.",
},
json: { kind: "boolean", description: "Output as JSON." },
},
mutatesState: true,
writes: [".werkstatt/fleet-claims/claims/{id}.json"],
generates: [],
reads: [
"werkstatt.fleet.json",
"../systems-cache/*/passport.json",
"../systems-cache/*/bordbuch/",
],
execute: runFleetClaimsPublish,
},
{
name: "fleet.claims.sync",
coverage: "operator" as const,
modulePath: "packages/werkstatt-engine/src/fleet/fleet.module.ts",
description:
"Fetch all claims remotes, fast-forward the local clone, verify all claim signatures, and push pending claims (RFC-1124). Non-fast-forward divergence is a manual-resolution diagnostic — never auto-merged.",
scope: "workspace",
flags: {
json: { kind: "boolean", description: "Output as JSON." },
},
mutatesState: true,
writes: [".werkstatt/fleet-claims/", ".werkstatt/fleet-claims-state.json"],
generates: [],
reads: ["werkstatt.fleet.json"],
requiresNetwork: true,
execute: runFleetClaimsSync,
},
{
name: "fleet.claims.verify",
coverage: "operator" as const,
coverageNote: "requires --id",
modulePath: "packages/werkstatt-engine/src/fleet/fleet.module.ts",
description:
"Resolve the current ownership claim for a system entirely offline (RFC-1124): signature + legitimacy (self-claim vs transfer claim via bordbuch handover event) + LWW. Exits 1 on invalid-signature or stale; no-claim is informational. Required flags: `--id`.",
scope: "workspace",
flags: {
id: { kind: "string", required: true, description: "Sternsystem ID to verify." },
json: { kind: "boolean", description: "Output as JSON." },
},
mutatesState: false,
execOnReadOnly: true,
writes: [],
generates: [],
reads: [
"werkstatt.fleet.json",
".werkstatt/fleet-claims/",
"../systems-cache/*/passport.json",
"../systems-cache/*/bordbuch/",
],
execute: runFleetClaimsVerify,
},
{
name: "fleet.claims.status",
coverage: "operator" as const,
modulePath: "packages/werkstatt-engine/src/fleet/fleet.module.ts",
description:
"Show local claims clone vs remote state, pending unpushed claims, and last sync time (RFC-1124). Fully offline.",
scope: "workspace",
flags: {
json: { kind: "boolean", description: "Output as JSON." },
},
mutatesState: false,
execOnReadOnly: true,
writes: [],
generates: [],
reads: ["werkstatt.fleet.json", ".werkstatt/fleet-claims/"],
execute: runFleetClaimsStatus,
},
],
pipelines: [],
};
}