/*
RFC-1028: validation.state.inspect command handler — reads the
.validation-state.json file and the persistent SQLite cache to report
per-validator status for a mission.
- Do not execute validators — this command is read-only.
- Do not modify the cache or validation state.
- RFC-1028: initial implementation — readValidationState + cache list() for inspection.
- RFC-1249: wire werkstatt.commands.validate into packages.check + retire CMD-OUTPUT debt
*/
import type {
KernelCommandInput,
KernelCommandResult,
KernelRuntimeContext,
} from "@warpgogol/werkstatt-shared/kernel";
import { readValidationState, type ValidatorState } from "./validation-state.ts";
import { createCacheLayer, type CacheEntryInfo } from "../kernel/cache/cache-layer.ts";
import { COMMAND_RESULT_CACHE_NAMESPACE } from "../kernel/cache/command-result-cache.ts";
export interface ValidationStateInspectData {
missionId: string;
lastValidatedAt: string | null;
lastValidationStatus: "pass" | "fail" | "incomplete" | null;
validatorStates: ValidatorState[];
cacheEntries: CacheEntryInfo[];
}
export async function runValidationStateInspect(
input: KernelCommandInput,
context: KernelRuntimeContext,
): Promise> {
const missionId = input.flags.mission as string | undefined;
if (!missionId) {
return {
data: undefined,
exitCode: 1,
summary: "[validation.state.inspect] missing required --mission flag",
nextSteps: [{ action: "Provide --mission flag", kind: "required" }],
};
}
const state = await readValidationState(context.workspaceRoot, missionId);
const cache = await createCacheLayer(context.workspaceRoot);
try {
const cacheEntries = cache.list
? await cache.list({ namespace: COMMAND_RESULT_CACHE_NAMESPACE })
: [];
const validatorStates = state?.validatorStates ?? [];
const data: ValidationStateInspectData = {
missionId,
lastValidatedAt: state?.lastValidatedAt ?? null,
lastValidationStatus: state?.lastValidationStatus ?? null,
validatorStates,
cacheEntries,
};
return {
data,
exitCode: 0,
summary: "[validation.state.inspect] Done",
};
} finally {
await cache.close();
}
}