import { type ProgramIO } from '../cli-helpers.js'; export declare function bestPracticeDir(projectRoot: string): string; /** `/best-practice/-.md`. The slug is lossy by design: * every character outside `[A-Za-z0-9_-]` collapses to `-` and the result is * truncated to 32, so no intent can introduce a path separator. */ export declare function scanArtifactPath(projectRoot: string, slugSource: string): string; export declare function intentIdLine(intent: string): string; /** The intent the artifact at `path` was written for, or null when it records * none (an artifact written before this marker existed) or cannot be read. * * Only the FIRST line is read, and the marker is always written first, so a * caller-supplied intent cannot forge a match by putting a marker of its own * into the text it carries. */ export declare function readArtifactIntentId(path: string): string | null; /** * The collision §12.3 recorded: the artifact path keys on `(date, slug)` and * the slug is capped at 32 characters, so two intents that agree in their * first 32 slug characters land on one file and the second silently overwrote * the first one's recommendation. * * The same intent again is NOT a collision — it is the same scan re-running, * and it overwrites as it always did. An artifact this command cannot * attribute is treated as another intent's: the refusal is unconditional, * because an artifact that cannot be named cannot be cleared. */ export type SlugCollision = { readonly project: string; readonly intent: string; readonly language: string; readonly artifactPath: string; readonly existingIntent: string | null; }; /** The collision a scan would cause, or null when it would cause none. */ export declare function detectSlugCollision(project: string, intent: string, language: string): SlugCollision | null; export declare const SLUG_COLLISION_MESSAGE: string; /** * Refuse a scan whose artifact path is already owned by another intent. * * Nothing is rendered: the refusal is the whole answer, exactly as the * synthetic and no-fragments refusals are. */ export declare function emitSlugCollisionRefusal(io: ProgramIO, asJson: boolean, collision: SlugCollision): void;