/** * `openlore coverage-gaps` — the structural test-coverage gap report's CLI surface * (change: add-test-coverage-gap-report). * * Prints the conclusion-shaped ranked list of important code with NO reaching test * (the same report the `report_coverage_gaps` MCP tool returns) so a reviewer or CI * job can audit the untested surface without an MCP client. Read-only, deterministic, * offline. SOUND DIRECTION ONLY: it reports "no reaching test" and never claims a * symbol is tested. Not a hook and never blocks — it is a report. */ import { Command } from 'commander'; interface CoverageGapItem { name: string; file: string; language: string; fanIn: number; signals: Array<{ label: string; evidence: Record; }>; alsoFlaggedDead?: true; deadReason?: 'no-callers' | 'dead-via-unreachable-callers'; /** The dead label was withheld at a dynamic boundary (change: disclose-dynamic-boundary-regions). */ deadLabelWithheld?: { reason: string; site: { file: string; line: number; kind: string; }; }; } /** * Live vs dead-flagged vs boundary-withheld split of a gap list (change: * demote-dead-flagged-coverage-gaps; third bucket from disclose-dynamic-boundary-regions). * * Three buckets, not two: a gap whose dead label was withheld is UNDECIDED, and folding it into * either side would publish it as decided. Rendering only two also made the printed line stop * adding up — measured at 505 gaps missing from a 794-gap remainder. */ interface GapComposition { live: number; deadFlagged: number; boundaryWithheld?: number; } interface CoverageGapsResult { scope: 'repo' | 'diff' | 'region'; changed?: string[]; filePattern?: string; analyzedSymbols: number; reachableFromTest: number; gapCount: number; coverageGaps: CoverageGapItem[]; composition?: { returned: GapComposition; omittedRemainder?: GapComposition; total: GapComposition; }; omitted?: number; note?: string; soundness: { posture: string; claim: string; caveats: string[]; }; coverage: { languages: string[]; testDetection: 'full' | 'partial' | 'none'; }; confidenceBoundary?: { staleness?: { detail?: string; }; integrity?: { verdict?: string; detail?: string; }; knownUnknowable?: Array<{ kind: string; detail?: string; }>; }; } /** * Compact human rendering of the gap report. Exported for its test: this renderer went a whole * change without one, and silently stopped agreeing with the JSON it renders. */ export declare function renderHuman(r: CoverageGapsResult): string; export interface CoverageGapsCliOptions { cwd?: string; max?: number; filePattern?: string; base?: string; symbols?: string[]; json?: boolean; } export declare function runCoverageGapsCli(opts: CoverageGapsCliOptions): Promise; export declare const coverageGapsCommand: Command; export {}; //# sourceMappingURL=coverage-gaps.d.ts.map