/** * `slowcook recon` — 0.17.6 — structural backstop after refine + history-aware * vibe + testgen + plate + brew. Pure deterministic; no LLM. * * Runs as a CI pre-step in slowcook-brew-auto.yml (after both mockup PR * + tests PR are merged, BEFORE brew dispatch). Catches residual vibe ⇄ * testgen divergence by comparing names + prop shapes + testid hooks. * * Output: `.brewing/recon-result.json` + a PR comment with the renaming * map and any escalations. * * Exit codes: * 0 — clean (or only "warn" issues; brew can proceed) * 2 — `STORY_HISTORY_CONFLICT` or `VIBE_RECIPE_NAME_DRIFT` — escalates * to PM via PR comment; brew should NOT dispatch * * What recon checks: * 1. Test imports → file exists in mock + src/ * 2. Test prop usage → matches mock's component signature * 3. Testid selectors in tests → present in mock JSX * 4. Brownfield safety: rename target collides with EXISTING prod * component covered by ANOTHER story's tests */ import { type HistoryIndex } from "../refine/history-index.js"; interface RenameProposal { kind: "component" | "import_path"; from: string; to: string; reason: string; rename_safe: boolean; blocker?: string; } interface TestidGap { selector: string; queried_by: string[]; in_mock: boolean; } interface StructuralGap { kind: "missing_component" | "missing_route" | "prop_shape_mismatch" | "story_history_conflict" | "missing_migration"; test: string; detail: string; recommendation: string; } export interface ReconResult { story: string; generated_at: string; generator: "slowcook-recon@0.17.6"; status: "clean" | "rename_needed" | "escalate"; renames: RenameProposal[]; testid_gaps: TestidGap[]; structural_gaps: StructuralGap[]; history_index_components: number; warnings: string[]; } export declare function recon(argv: string[], cliVersion: string): Promise; export declare function findStoryTestFiles(repoRoot: string, story: string): string[]; export declare function extractImports(body: string): string[]; export declare function extractTestids(body: string): string[]; export declare function resolveImport(repoRoot: string, imp: string, /** * Repo-relative path of the file that emits this import. Required for * relative imports (./ or ../) so they can be resolved against the * source file's directory. `@/` imports ignore this argument. * * Optional + nullable for back-compat with callers that only ever * pass `@/`-style imports. cli α.48: any caller passing a `.`-prefixed * import MUST supply this — without it relative resolution returns * null and recon falsely flags missing_component (delgoosh#656 dogfood * 2026-05-24 / runs 26372728345 + 26373548396 burned 3 brew-auto * attempts on this exact gap before α.48). */ sourceFileRel?: string): string | null; export type { HistoryIndex }; //# sourceMappingURL=index.d.ts.map