/**
 * Detection helpers for `neotoma doctor` and `neotoma hooks`.
 *
 * Returns a consolidated `HooksReport` describing, per hook-capable harness,
 * whether Neotoma's lifecycle hooks are already installed and whether any
 * non-Neotoma hook plugin is registered in the same file. This is the state
 * the activation flow in install.md reads before offering `neotoma hooks
 * install`.
 *
 * The module re-implements the small amount of "is this entry Neotoma's?"
 * logic that the per-package installers already own, intentionally duplicated
 * (rather than imported) so the CLI does not pay the cost of loading
 * `@neotoma/client` and its transitive deps just to read a JSON/TOML file.
 */
/** Hook-capable harness identifiers. Broader than `ToolId` since it includes
 * surfaces (opencode, claude-agent-sdk) that don't install the `neotoma`
 * binary but can still consume the hook packages. */
export type HookHarnessId = "cursor" | "claude-code" | "codex" | "opencode" | "claude-agent-sdk";
export declare const HOOK_HARNESSES: readonly HookHarnessId[];
export interface HookStatus {
    /** Neotoma hook entries are present in this harness's config. */
    present: boolean;
    /** Path to the config file consulted (absolute), or null if the harness
     * does not have a filesystem-resident config (e.g. claude-agent-sdk). */
    path: string | null;
    /** Names of non-Neotoma hook plugins/entries detected alongside Neotoma
     * entries. Empty array when no other plugins are present. */
    other_hook_plugins: string[];
}
export interface HooksReport {
    /** True iff the current tool (via hint) supports hooks. */
    supported_by_tool: boolean;
    /** Per-harness installation state. */
    installed: Record<HookHarnessId, HookStatus>;
    /** Activation may offer hooks iff supported_by_tool and the current tool
     * is not already installed and MCP is configured (caller enforces the MCP
     * check since doctor computes that separately). */
    eligible_for_offer: boolean;
}
export interface DetectHooksOptions {
    cwd?: string;
    /** The currently-detected harness (from doctor.current_tool_hint). When
     * set, eligibility uses its installation status. */
    currentTool?: HookHarnessId | null;
    /** Whether MCP is already configured for the current tool. Activation
     * requires this so hooks only layer on top of a working MCP setup. */
    mcpConfigured?: boolean;
}
/** Collect per-harness installation state for activation / `neotoma hooks`. */
export declare function detectHooks(opts?: DetectHooksOptions): Promise<HooksReport>;
/** Narrow an arbitrary string to a `HookHarnessId` or `null`. */
export declare function toHookHarness(value: unknown): HookHarnessId | null;
//# sourceMappingURL=hooks_detect.d.ts.map