export interface ComposeTreeNode {
    name: string;
    file: string;
    start_line: number;
    is_preview: boolean;
    children: ComposeTreeNode[];
}
export interface ComposeTreeResult {
    root: ComposeTreeNode;
    total_components: number;
    max_depth: number;
    leaf_components: string[];
}
/**
 * Build the Compose component call tree rooted at `rootName`. Walks
 * @Composable function bodies lexically to find PascalCase calls matching
 * other indexed composables. @Preview composables are excluded from the
 * tree since they're design-time only.
 *
 * Cycle-safe: visited set prevents infinite recursion on A→B→A patterns.
 */
export declare function traceComposeTree(repo: string, rootName: string, options?: {
    depth?: number;
}): Promise<ComposeTreeResult>;
export interface RecompositionIssue {
    component: string;
    file: string;
    start_line: number;
    issue: string;
    severity: "warning" | "critical";
    param?: string;
}
export interface RecompositionResult {
    issues: RecompositionIssue[];
    components_scanned: number;
    components_with_issues: number;
}
/**
 * Scan @Composable functions for recomposition hazards.
 *
 * Detects:
 * 1. **Unstable lambda params** — function-type parameter without `remember`
 *    wrapper at call site; every recomposition allocates a new closure, causing
 *    the child to recompose even when nothing changed.
 * 2. **Mutable collections** — `List<T>` / `MutableList<T>` / `Map<K,V>` /
 *    `Set<T>` params that aren't `@Stable` / `@Immutable` annotated; Compose
 *    can't skip recomposition because it can't prove the collection hasn't
 *    mutated between compositions.
 * 3. **Missing remember for state allocation** — `mutableStateOf()` /
 *    `mutableStateListOf()` / `derivedStateOf()` called without a `remember`
 *    wrapper; the state resets on every recomposition, causing infinite loops
 *    or lost user input.
 * 4. **Inline object allocation** — `object : ClickListener { }` or
 *    `SomeClass()` constructed inside composition body; creates new identity
 *    every frame.
 */
export declare function analyzeComposeRecomposition(repo: string, options?: {
    file_pattern?: string;
}): Promise<RecompositionResult>;
//# sourceMappingURL=compose-tools.d.ts.map