/** * GitWand — Utilitaires partagés entre les patterns * * Contient les fonctions de scoring, de normalisation et de détection * de valeurs volatiles utilisées par plusieurs PatternPlugin. */ import type { Confidence, ConfidenceScore } from "../types.js"; /** * Calcule le scopeImpact à partir du nombre total de lignes concernées. * 1–2 lignes → 0, 3–10 → 15, 11–30 → 35, >30 → 55 */ export declare function scopeImpact(lines: number): number; /** * Dérive le label Confidence depuis un score numérique 0–100. * - score ≥ 92 → "certain" * - score ≥ 68 → "high" * - score ≥ 44 → "medium" * - score < 44 → "low" */ export declare function labelFromScore(score: number): Confidence; /** * Calcule `{ score, label }` à partir des dimensions d'un ConfidenceScore. * * Formule v2.4 — seule copie de cette formule dans le codebase. `makeScore` * et `withBaseAvailability` (parser.ts) délèguent tous les deux ici pour * qu'un futur changement de formule n'ait qu'un seul endroit à modifier : * `score = typeClassification * − dataRisk × 0.40 * − scopeImpact × 0.15 * − fileFrequency × 0.10 * + baseAvailability × 0.05 * − algorithmStability × 0.10 * − postMergeRisk × 0.20` * * Prend la forme exacte de `ConfidenceScore["dimensions"]` (voir types.ts pour * la plage et la sémantique de chaque champ) — `algorithmStability` et * `postMergeRisk` y sont déjà optionnels, défaut 0 ici si absents. */ export declare function scoreFromDimensions(dimensions: ConfidenceScore["dimensions"]): { score: number; label: Confidence; }; /** * Construit un ConfidenceScore à partir des dimensions et des justifications. * * Tous les paramètres après `penalties` sont optionnels (défaut 0). Les * dimensions optionnelles (`algorithmStability`, `postMergeRisk`) ne sont * poussées dans l'objet `dimensions` que lorsqu'elles sont non-nulles, pour * que les snapshots de tests existants restent verts. */ export declare function makeScore(typeClassification: number, dataRisk: number, si: number, boosters: string[], penalties: string[], fileFrequency?: number, baseAvailability?: number, algorithmStability?: number, postMergeRisk?: number): ConfidenceScore; /** * Normalise les lignes d'un bloc pour la comparaison whitespace-only. * * Étapes : * 1. Tabs → 2 espaces * 2. Trim leading/trailing sur chaque ligne * 3. Strip des lignes vides en tête et queue du bloc * 4. Collapse des espaces internes multiples → un seul espace */ export declare function normalizeForWhitespaceCheck(lines: string[]): string; /** * Normalise une ligne individuelle pour les comparaisons de patterns * (reorder_only, insertion_at_boundary). * Tabs → espaces, trim, collapse. */ export declare function normalizeLine(line: string): string; /** * Extrait la séquence des contenus de string literals (`"…"`, `'…'`, `` `…` ``) * d'un bloc de lignes, dans l'ordre. Scan naïf caractère par caractère avec * gestion de l'échappement `\"` — pas un vrai lexer (un apostrophe de prose * dans un commentaire ouvre une "string"), mais les deux côtés d'un conflit * subissent la même approximation : la comparaison des séquences reste * équitable, et l'erreur pousse vers le refus de résoudre (direction sûre). * * Utilisé par whitespace_only : le whitespace À L'INTÉRIEUR d'une string est * de la donnée, pas de la mise en forme — deux blocs "identiques modulo * whitespace" mais dont les strings diffèrent ne doivent pas être résolus * en préférant silencieusement un côté. */ export declare function extractQuotedSegments(lines: string[]): string[]; /** Regex qui matche les tokens "volatiles" : hashes, UUIDs, semver, timestamps, URLs */ export declare const VOLATILE_PATTERNS: RegExp[]; /** * Vérifie si deux tokens diffèrent uniquement par une sous-chaîne "hash-like". */ export declare function isPairwiseVolatile(a: string, b: string): boolean; /** * Tokenize une ligne en parties structurelles et valeurs. */ export declare function tokenizeLine(line: string): string[]; /** * Variante quote-aware de tokenizeLine : le contenu d'une string literal est * gardé ATOMIQUE (un seul token), quotes émises comme délimiteurs séparés. * * Indispensable pour les valeurs volatiles multi-mots : `'2026-07-06 11:42:00'` * splitté sur l'espace donne deux fragments dont aucun ne matche la regex * datetime — le cas résiduel le plus récurrent du corpus réel (config PHP * `last_update`). Utilisé par detectValueOnlyChange/pickNewerVersionSide ; * token_level_merge garde volontairement tokenizeLine (fusion INTRA-string * voulue là-bas, cf. ses fixtures Tailwind). */ export declare function tokenizeLineQuoteAware(line: string): string[]; /** * Détecte si deux ensembles de lignes ne diffèrent que par des valeurs atomiques. * Retourne un résultat de classification ou null si non applicable. */ export declare function detectValueOnlyChange(oursLines: string[], theirsLines: string[], hasBase?: boolean): { confidenceScore: ConfidenceScore; explanation: string; traceReason: string; } | null; /** * Si TOUTES les paires de tokens qui diffèrent entre ours et theirs sont des * semver comparables ET que le même côté est ≥ sur chaque paire (avec au * moins un >), retourne ce côté. Sinon null (résolution par politique). * * Consommé par assembleResolution (value_only_change) : « accepter la version * la plus récente » n'est déterministe que quand les valeurs sont ORDONNABLES * (semver, ou datetime ISO où l'ordre lexicographique est chronologique) — * pour les hashes et autres valeurs ambiguës on retombe sur la politique. */ export declare function pickNewerSemverSide(oursLines: string[], theirsLines: string[]): "ours" | "theirs" | null; //# sourceMappingURL=utils.d.ts.map