/*
Lazy-loading kernel module for RFC-0357 release discipline commands: prepare, ready, validate, list, and rollback.
- Do not re-export types or utilities — the barrel release/index.ts remains the public API surface.
- Do not register artifact-store or leitstand commands here.
- RFC-1231: step 1 — rename supportsAllSites to acceptsAllFlag
Mechanical sweep: the field only ever gated --all argv acceptance; fan-out
follows the parsed selector. Guard renamed assertAllSitesAllowed ->
assertAllFlagAccepted, message updated. 417 declaration sites + type
surfaces (KernelCommandMetadata, ForgeCommandMetadata) in one atomic pass.
- RFC-1248: VITE-CLIENT-DEP-02 lazy-import gate + SCAN-02 validator reads-root existence check (RFC-1248)
- RFC-1248: suppress transient releases/.werkstatt/ validator reads + complete PIPELINE-LOG rules declaration (RFC-1248 review r2)
- RFC-1327: run-twice idempotency — declarations, command.idempotency.validate, rerun tests, reconcile/ship/abort convergence fixes
- RFC-1327: review r1 — lock-safe reconcile gate, residue sweep, honest idempotency classes
RFC-0655, RFC-0656, RFC-0931, RFC-1097, RFC-1173
*/
import type { ModuleExport } from "@warpgogol/werkstatt-shared/kernel";
export async function createReleaseModule(): Promise {
const {
runReleasePrepare,
runReleaseReady,
runReleaseValidate,
runReleaseList,
runReleaseStateValidate,
runDistDeterminismValidate,
runReleaseSign,
} = await import("./release-commands.ts");
const { runBootSmokeCommand } = await import("./boot-smoke.ts");
return {
name: "release",
version: "0.1.0",
declarations: [],
commands: [
{
name: "release.prepare",
modulePath: "packages/werkstatt-engine/src/release/release.module.ts",
generates: [],
description:
"Prepare a release candidate from a validated mission (RFC-0357). Flags: --mission, [--semver].",
scope: "workspace",
acceptsAllFlag: false,
mutatesState: true,
idempotency: "not-idempotent",
idempotencyNote:
"Each run mints a new release id — re-running creates a new release, not a no-op.",
flags: {
mission: { kind: "string", required: true, description: "Mission id to release." },
semver: { kind: "string", default: "0.1.0", description: "Release semantic version." },
},
writes: ["releases/{release}/**"],
reads: ["missions/{mission}/**", "../systems-cache/{system}/system-config.yaml"],
cacheable: false,
execute: runReleasePrepare,
},
{
name: "release.ready",
modulePath: "packages/werkstatt-engine/src/release/release.module.ts",
generates: [],
description:
"Mark a prepared release as ready with discipline gates and artifact storage (RFC-0357, RFC-0724). Flags: --release.",
scope: "workspace",
acceptsAllFlag: false,
mutatesState: true,
flags: {
release: { kind: "string", required: true, description: "Release id to mark ready." },
},
writes: [
"releases/{release}/release.yaml",
"../systems-cache/{system}/system-state.yaml",
"../systems-cache/{system}/bordbuch/events.ndjson",
],
reads: [
"releases/{release}/**",
"../systems-cache/{system}/system-config.yaml",
"../systems-cache/{system}/system-state.yaml",
],
cacheable: false,
execute: runReleaseReady,
},
{
name: "release.validate",
coverage: "operator" as const,
coverageNote: "requires --release",
mutatesState: false,
contract: "release",
rules: [],
modulePath: "packages/werkstatt-engine/src/release/release.module.ts",
description: "Validate a release artifact (RFC-0357). Flags: --release.",
scope: "workspace",
acceptsAllFlag: false,
flags: {
release: { kind: "string", required: true, description: "Release id to validate." },
},
reads: ["releases/{release}/**"], // scan-coverage: transient release root — releases/ is gitignored, absent on clean checkouts
execute: runReleaseValidate,
},
{
name: "release.list",
coverage: "operator" as const,
mutatesState: false,
modulePath: "packages/werkstatt-engine/src/release/release.module.ts",
description: "List releases, optionally filtered by site (RFC-0357). Flags: [--site].",
scope: "workspace",
acceptsAllFlag: false,
flags: {
site: { kind: "string", description: "Filter by Sternsystem id." },
},
reads: ["releases/*/release.yaml", "../systems-cache/*/system-config.yaml"],
execute: runReleaseList,
},
{
name: "release.state.validate",
coverage: "operator" as const,
coverageNote: "requires --mission, --release, or --site",
mutatesState: false,
contract: "release",
rules: [],
modulePath: "packages/werkstatt-engine/src/release/release.module.ts",
description:
"Validate release pipeline consistency between mission.yaml, close-report.json, release.yaml, bordbuch, and registry.yaml (RFC-0655). Flags: --mission, --release, --site.",
scope: "workspace",
acceptsAllFlag: false,
flags: {
mission: { kind: "string", description: "Mission id to validate." },
release: { kind: "string", description: "Release id to validate." },
site: {
kind: "string",
description: "Site id — validates all releases for the system.",
},
},
reads: [
"missions/{mission}/mission.yaml", // scan-coverage: transient workpiece root — missions/ is gitignored, absent on clean checkouts
"missions/{mission}/evidence/close-report.json", // scan-coverage: transient workpiece root — missions/ is gitignored, absent on clean checkouts
"releases/{release}/release.yaml", // scan-coverage: transient release root — releases/ is gitignored, absent on clean checkouts
"../systems-cache/{system}/system-config.yaml",
"../systems-cache/{system}/system-state.yaml",
"../systems-cache/{system}/bordbuch/events.ndjson",
],
execute: runReleaseStateValidate,
},
{
name: "dist.determinism.validate",
coverage: "operator" as const,
coverageNote: "requires --release or --mission",
contract: "dist",
rules: [],
modulePath: "packages/werkstatt-engine/src/release/release.module.ts",
description:
"Report non-deterministic files in a dist directory by comparing stable vs byte hashes (RFC-0656). Flags: --release, --mission.",
scope: "workspace",
acceptsAllFlag: false,
mutatesState: false,
flags: {
release: { kind: "string", description: "Release id whose dist to validate." },
mission: {
kind: "string",
description: "Mission id whose workpiece/dist or distribution/dist to validate.",
},
},
reads: [
"releases/{release}/dist/**", // scan-coverage: transient release root — releases/ is gitignored, absent on clean checkouts
"missions/{mission}/workpiece/dist/**", // scan-coverage: transient workpiece root — missions/ is gitignored, absent on clean checkouts
"missions/{mission}/distribution/dist/**", // scan-coverage: transient workpiece root — missions/ is gitignored, absent on clean checkouts
],
execute: runDistDeterminismValidate,
},
{
name: "release.sign",
coverage: "operator" as const,
modulePath: "packages/werkstatt-engine/src/release/release.module.ts",
generates: [],
description:
"Sign build-identity.json and produce signed-manifest.json for a release using Ed25519 (RFC-0931). Flags: --release.",
scope: "workspace",
acceptsAllFlag: false,
mutatesState: true,
flags: {
release: { kind: "string", required: true, description: "Release id to sign." },
},
writes: [
"releases/{release}/dist/client/.well-known/build-identity.json",
"releases/{release}/dist/client/.well-known/release-pubkey.json",
"releases/{release}/.integrity/build/latest/signed-manifest.json",
],
reads: ["releases/{release}/dist/**", "releases/{release}/.integrity/**"],
cacheable: false,
execute: runReleaseSign,
},
{
name: "release.boot-smoke",
coverage: "operator" as const,
modulePath: "packages/werkstatt-engine/src/release/release.module.ts",
generates: [],
description:
"Boot built worker in miniflare/workerd and execute representative requests to catch runtime crashes before deploy (RFC-0961, RFC-0979). Flags: --site, [--dist], [--wrangler-config], [--languages], [--diagnose].",
scope: "workspace",
acceptsAllFlag: false,
mutatesState: true,
flags: {
site: { kind: "string", required: true, description: "Sternsystem id." },
dist: {
kind: "string",
description: "Path to dist directory (defaults to workpiece or release dist).",
},
"wrangler-config": {
kind: "string",
description:
"Path to wrangler config. Defaults to dist/server/wrangler.json, falling back to dist/../wrangler.jsonc.",
},
languages: {
kind: "string",
description:
"Comma-separated language codes. If omitted, auto-detected from dist/client/ per RFC-0978.",
},
diagnose: {
kind: "boolean",
default: false,
description: "Print resolved binding map and planned requests for debugging.",
},
},
writes: ["boot-smoke.json"],
reads: ["dist/**"],
execute: runBootSmokeCommand,
},
],
pipelines: [],
};
}