/**
 * Yii3 attribute conversion candidates (M2).
 *
 * Yii3 is natively PHP 8 attribute-based. The mechanical mapping from
 * Yii2 array-config idioms to Yii3 attributes is well-defined, but
 * applying it across thousands of files is the bottleneck for any
 * Yii2→Yii3 migration. This tool surfaces every site that's a candidate
 * for the conversion + a proposed attribute form, capped by sample limit
 * so the consumer can triage at their own pace.
 *
 * Conversions covered:
 *
 *   behaviors-to-attributes
 *     behaviors() returning an array with TimestampBehavior /
 *     BlameableBehavior / SluggableBehavior / etc → #[Behavior(class)] on
 *     the class. We surface the entire behaviors() body in `current_form`
 *     so the auditor sees the array-shape that needs conversion.
 *
 *   rules-to-attributes
 *     rules() returning array of [['field'], 'validator'] tuples →
 *     #[Required], #[Email], #[StringLength(min: 1)] on the property.
 *     Each tuple becomes one or more proposed attributes.
 *
 *   urlmanager-rule-to-route
 *     'GET api/users/<id>' => 'user/view' (in urlManager rules) →
 *     #[Route(method: 'GET', path: '/api/users/{id}')] on the controller
 *     action. We resolve the controller/action target from the rule's
 *     right side. {param} placeholders are emitted but type constraints
 *     are dropped (Yii2 supports inline regex like <id:\\d+>; Yii3 uses
 *     route attributes like #[Route('/{id<int>}')]).
 *
 * Output shape:
 *   - candidates[]    — flat list of all conversions
 *   - by_rule[]       — grouped + sample-capped, sorted by count desc
 *   - summary         — total + per-rule counts
 *
 * Like M1, this tool never auto-applies. Each candidate ships:
 *   current_form         (the source as written today)
 *   suggested_replacement (the attribute equivalent)
 *   confidence           ("high" | "medium" | "low")
 *   blockers[]           (string reasons the conversion may be unsafe —
 *                         e.g. "rule references a Closure validator that
 *                         can't be lifted to an attribute")
 */
export type Yii3AttributeRuleId = "behaviors-to-attributes" | "rules-to-attributes" | "urlmanager-rule-to-route";
export interface Yii3AttributeCandidate {
    rule_id: Yii3AttributeRuleId;
    file: string;
    line: number;
    current_form: string;
    suggested_replacement: string;
    confidence: "high" | "medium" | "low";
    blockers: string[];
}
export interface Yii3AttributeCandidates {
    repo: string;
    scanned_files: number;
    total_candidates: number;
    by_rule: Array<{
        rule_id: Yii3AttributeRuleId;
        count: number;
        samples: Yii3AttributeCandidate[];
    }>;
    candidates: Yii3AttributeCandidate[];
}
export declare function findYii3AttributeCandidates(repo: string, options?: {
    file_pattern?: string;
    rules?: Yii3AttributeRuleId[];
    max_samples_per_rule?: number;
    include_vendor?: boolean;
}): Promise<Yii3AttributeCandidates>;
//# sourceMappingURL=yii3-attribute-candidates-tools.d.ts.map