/**
 * One `execFile`-backed CLI runner, configured per binary.
 *
 * `git` and `gh` were each wrapped by hand — the same dynamic import, the same promise
 * around `execFile`, the same `String(stdout)` — differing only in the binary, the timeout
 * and how a failure is reported. Those are the parameters; the wrapper is not worth writing
 * twice, and it was written five times.
 */
/** Runs a CLI binary in `cwd`, resolving its stdout. Rejects on a non-zero exit. */
export type CliRunner = (args: string[], cwd: string) => Promise<string>;
/**
 * How long one invocation may run: a flat budget, or one derived from the args (#997).
 *
 * One binary is not one operation. `git push` talks to a remote and `git worktree add` writes a
 * whole checkout, while `git rev-parse` reads a file; a single number has to be either too short
 * for the first two or too long for the third.
 */
export type CliTimeout = number | ((args: string[]) => number);
/**
 * A CLI killed for outrunning its timeout, as opposed to one the tool itself rejected (#997).
 *
 * `execFile` SIGTERMs on timeout, and a killed `git push` usually writes nothing to stderr, so
 * without this the failure surfaces as a bare "Command failed: git push ..." that reads like a
 * rejected push.
 */
export declare class CliTimeoutError extends Error {
    readonly bin: string;
    readonly args: string[];
    readonly timeoutMs: number;
    /** Brand, so a value that crossed a module boundary is still recognisable. */
    readonly timedOut = true;
    constructor(bin: string, args: string[], timeoutMs: number);
}
/** True when a {@link CliRunner} rejection is a timeout kill rather than a non-zero exit (#997). */
export declare function isCliTimeout(err: unknown): err is CliTimeoutError;
/** How to invoke one binary. */
export interface CliRunnerOptions {
    bin: string;
    /** Kill the process after this long, so a hung CLI cannot hang the caller. */
    timeoutMs: CliTimeout;
    /** Raise the stdout cap for a command whose output can be large (a repo crawl). */
    maxBuffer?: number;
    /**
     * Reject with the CLI's own stderr rather than the generic exec message. `gh` puts the
     * useful part there ("not logged in", "no default remote"), and that is exactly what the
     * dashboard should show instead of a generic failure.
     */
    preferStderr?: boolean;
}
/** Build a {@link CliRunner} for one binary. */
export declare function cliRunner(opts: CliRunnerOptions): CliRunner;
//# sourceMappingURL=cli-exec.d.ts.map