/** Read-only git invocation — array args only (SafeGitExecutor.readSync shape). */
export type ReadGit = (args: string[], cwd: string) => string;
export interface WorktreeDirtyCheckConfig {
    /** Build-residue path prefixes/globs; a worktree dirty ONLY in these is not "work". */
    residueDenylist: readonly string[];
    /** Cache TTL per resolved path (ms). */
    cacheTtlMs: number;
}
export declare const DEFAULT_RESIDUE_DENYLIST: readonly string[];
export declare const DEFAULT_DIRTY_CHECK_CONFIG: WorktreeDirtyCheckConfig;
export interface WorktreeDirtyCheckDeps {
    readGit: ReadGit;
    now?: () => number;
    /** Injectable for tests; defaults to fs.realpathSync. */
    realpath?: (p: string) => string;
    config?: Partial<WorktreeDirtyCheckConfig>;
}
/**
 * One porcelain line → its path (strip the 2-char status + space; handle the
 * `R old -> new` rename arrow and quoted paths). Returns '' if unparseable.
 */
export declare function porcelainPath(line: string): string;
/** Does a porcelain path match a residue-denylist entry (prefix dir or *.ext glob)? */
export declare function isResiduePath(p: string, denylist: readonly string[]): boolean;
/**
 * Decide dirtiness from porcelain output + denylist. Exported pure for tests:
 * non-empty AND at least one non-residue entry.
 */
export declare function classifyPorcelain(porcelain: string, denylist: readonly string[]): boolean;
export declare function makeWorktreeDirtyCheck(deps: WorktreeDirtyCheckDeps): (worktreePath: string) => boolean;
//# sourceMappingURL=worktreeDirtyCheck.d.ts.map