/**
 * detectCycle — Pre-mortem #5 mitigation.
 *
 * Given a task graph keyed by `depends_on` edges, determines whether
 * adding a proposed edge `newEdge.from → newEdge.to` would create a cycle.
 * Returns the cycle path (as an array of task ids starting at the re-visited
 * node) or `null` when the graph remains acyclic.
 *
 * The graph is read-only. `tasks` maps id → depends_on[] (after parsing).
 */
export interface CycleEdge {
    from: string;
    to: string;
}
/**
 * Return the first cycle path that would exist if `newEdge` were added,
 * or `null` if adding the edge keeps the graph acyclic.
 */
export declare function detectCycle(dependsOnByTaskId: Map<string, string[]>, newEdge: CycleEdge): string[] | null;
/**
 * Return the transitive set of task ids that depend (directly or indirectly)
 * on `targetId`. Used by `task list --blocked-by`.
 */
export declare function collectBlockedBy(dependsOnByTaskId: Map<string, string[]>, targetId: string): string[];
//# sourceMappingURL=cycle.d.ts.map