import type { DigestAction, PlanContext } from "../internals/plan.js"; import { type DimensionResult, type Grade } from "./grade.js"; type Dimension = "machine" | "repo-contract" | "harness-wiring"; /** A blocker/warn row echoed into `.data` for the (later) v9 panel + the text body. */ export interface ReadinessRow { id: string; title: string; cmd: string; dimension: Dimension; } /** * The full computed readiness picture — one composition of aih's read-only probes, * shared by the digest (rich body) and the `aih ready` gate (exit-code probe) so the * signal is computed ONCE per run. Deterministic: no clock, no random. */ export interface ReadinessResult { banner: "NOT READY" | "READY" | "READY, WITH GAPS"; blockers: ReadinessRow[]; warns: ReadinessRow[]; score: number; rawScore: number; grade: Grade; dims: DimensionResult[]; firstCommand: string | null; } /** * The core shell tools (rg/fd/jq) NOT on PATH, via the same `which`/`where` probe the * readiness gate uses. Exported so `aih ready --apply` can emit install actions for the * exact set the `core-shell-tools` gate flagged — the two never drift. */ export declare function coreToolsMissing(ctx: PlanContext): Promise; /** * Compute the full {@link ReadinessResult} from aih's read-only probes. Failing gates * ⇒ blockers; failing warns ⇒ score dings; `skip` never counts. The single source of * truth shared by {@link readinessDigest} (the rich body) and the `aih ready` gate * (the exit-code probe), so both agree without double-computing. */ export declare function computeReadiness(ctx: PlanContext): Promise; /** Failing gates ⇒ blockers; failing warns ⇒ score dings. `skip` never counts. */ export declare function readinessDigest(ctx: PlanContext): DigestAction; /** Terse, deterministic human summary: banner, blockers, per-dimension line, warn count. */ export declare function renderReadinessBody(r: ReadinessResult): string; export {};