import { type ProgramIO } from '../cli-helpers.js'; export declare const CATCH_GATE_PROMPT: string; export declare const INTENT_REQUIRED_MESSAGE: string; export declare const SYNTHETIC_SOURCE_MESSAGE: string; /** * The catch-gate reply: the `PEAKS_BEST_PRACTICE_STDIN` seam in tests, the * real stdin in production. * * Moved here from the command file: that file had three lines of headroom * under the 300-line cap, and the collision check needed more than that. */ export declare function readUserInput(): Promise; /** Refusal body for a synthetic scan. It is written to the artifact path so * the skip survives the fire-and-forget caller (`best-practice-auto-trigger` * spawns with `stdio: 'ignore'`, so stdout never reaches anyone). */ export declare function renderSyntheticRefusal(opts: { readonly intent: string; readonly language: string; readonly source: string; }): string; /** * A refusal must never overwrite anything. * * The rendered table and the refusal are keyed on the same `(date, intent)`, and * an auto-triggered scan runs with the same intent as the injected one, so a * refusal landing second used to destroy a real recommendation. The rule is now * unconditional — *any* existing file at the primary path wins — because the * only way to tell a refusal from a recommendation without a forgeable content * test is to not need the test at all. Refusals for an occupied path go to * `best-practice/skipped/`, a directory no primary path can reach: the slug * collapses every character outside `[A-Za-z0-9_-]`, so no intent can produce a * separator. A fresh project still records its refusal at the primary path, * which `tests/unit/cli/commands/best-practice-scan-command.test.ts` pins. * * Returns where the refusal landed. */ export declare function writeRefusal(projectRoot: string, intent: string, refusal: string): string; /** * Write the rendered table to `artifactPath` and return nothing. * * The artifact is the durable side effect and the envelope is not, so the * payload is proved to serialise *before* anything is written: a payload the * printer cannot render must not leave behind an artifact claiming a scan that * never reported. * * The first line is the intent-id marker, so a later scan can tell which * intent owns this artifact. */ export declare function writeRenderedArtifact(artifactPath: string, table: string, payload: unknown, intent: string): void; export declare const NO_FRAGMENTS_MESSAGE: string; /** * Refuse a scan that resolved against real lookups and still found nothing. * * This is not the synthetic path: no stub took part, so `scan.synthetic` is * false, and the orchestrator is right to say so — it answers "was anything * fabricated?", not "was anything found?". Without this refusal the empty * fallback renders a full table with a `★` on it, from zero fragments, and exits * 0. Writes nothing: an absent artifact is the honest record of an empty scan. */ export declare function emitNoFragmentsRefusal(io: ProgramIO, asJson: boolean, scope: { readonly project: string; readonly intent: string; readonly language: string; readonly source: string; }): void;