/**
 * `opensquid doctor hooks` — health check for Claude Code hook wiring (G.2).
 *
 * Reads `~/.claude/settings.json` + `<cwd>/.claude/settings.json`, finds
 * opensquid-managed hook entries (regex `/opensquid-hook|opensquid.*anti-drift/`),
 * spawns each with a canonical Claude Code event payload, checks STDERR for
 * the `[opensquid-dispatch]` marker. Marker absence = silent-no-op (the G.1
 * root-cause failure mode). Exit 0 if all green, 1 if any red (CI-friendly).
 *
 * Security gate: NEVER spawns a command the shared ownership predicate
 * (`isOpensquidHookCommand`, settings-writer.ts) doesn't claim —
 * non-matching entries SKIPPED with note ("not opensquid-managed").
 * D9-guard prompt-type hooks SKIPPED ("non-spawnable hook type").
 *
 * Engine-vocabulary discipline: consumer-side file — knows about Claude
 * Code's settings.json + hook events. Runtime stays harness-agnostic.
 *
 * Imported by: src/cli.ts.
 */
import type { Command } from 'commander';
type Status = 'green' | 'red' | 'skipped';
export interface DoctorResult {
    scope: 'user' | 'project';
    event: string;
    command: string;
    status: Status;
    reason: string;
}
export interface DoctorOptions {
    userSettingsPath: string;
    projectSettingsPath: string;
    /** Override for unit tests — defaults to spawning real subprocesses. */
    spawnProbe?: (command: string, stdin: string) => Promise<{
        exitCode: number;
        stderr: string;
    }>;
}
/** CHS.1 — the codex-hooks section lines (pure in the path argument). */
export declare function checkCodexHooks(path: string): Promise<string[]>;
/** Pure runner — disk + spawn injectable for tests. */
export declare function runDoctorHooks(opts: DoctorOptions): Promise<DoctorResult[]>;
/** Pretty-print to stdout. Returns the number of RED results (caller maps to
 * process exit code). */
export declare function printReport(results: DoctorResult[]): number;
export declare function registerDoctor(program: Command): void;
export {};
//# sourceMappingURL=doctor.d.ts.map