@gitwand/core 1.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +52 -0
- package/dist/__tests__/bench.bench.d.ts +14 -0
- package/dist/__tests__/bench.bench.d.ts.map +1 -0
- package/dist/__tests__/bench.bench.js +137 -0
- package/dist/__tests__/bench.bench.js.map +1 -0
- package/dist/__tests__/confidence-v14.test.d.ts +13 -0
- package/dist/__tests__/confidence-v14.test.d.ts.map +1 -0
- package/dist/__tests__/confidence-v14.test.js +284 -0
- package/dist/__tests__/confidence-v14.test.js.map +1 -0
- package/dist/__tests__/config.test.d.ts +2 -0
- package/dist/__tests__/config.test.d.ts.map +1 -0
- package/dist/__tests__/config.test.js +317 -0
- package/dist/__tests__/config.test.js.map +1 -0
- package/dist/__tests__/corpus.d.ts +36 -0
- package/dist/__tests__/corpus.d.ts.map +1 -0
- package/dist/__tests__/corpus.js +541 -0
- package/dist/__tests__/corpus.js.map +1 -0
- package/dist/__tests__/corpus.test.d.ts +17 -0
- package/dist/__tests__/corpus.test.d.ts.map +1 -0
- package/dist/__tests__/corpus.test.js +179 -0
- package/dist/__tests__/corpus.test.js.map +1 -0
- package/dist/__tests__/diff.test.d.ts +10 -0
- package/dist/__tests__/diff.test.d.ts.map +1 -0
- package/dist/__tests__/diff.test.js +178 -0
- package/dist/__tests__/diff.test.js.map +1 -0
- package/dist/__tests__/format-resolvers.test.d.ts +2 -0
- package/dist/__tests__/format-resolvers.test.d.ts.map +1 -0
- package/dist/__tests__/format-resolvers.test.js +577 -0
- package/dist/__tests__/format-resolvers.test.js.map +1 -0
- package/dist/__tests__/imports-extended.test.d.ts +2 -0
- package/dist/__tests__/imports-extended.test.d.ts.map +1 -0
- package/dist/__tests__/imports-extended.test.js +94 -0
- package/dist/__tests__/imports-extended.test.js.map +1 -0
- package/dist/__tests__/lockfile-resolvers.test.d.ts +2 -0
- package/dist/__tests__/lockfile-resolvers.test.d.ts.map +1 -0
- package/dist/__tests__/lockfile-resolvers.test.js +200 -0
- package/dist/__tests__/lockfile-resolvers.test.js.map +1 -0
- package/dist/__tests__/patterns/insertion-at-boundary.test.d.ts +10 -0
- package/dist/__tests__/patterns/insertion-at-boundary.test.d.ts.map +1 -0
- package/dist/__tests__/patterns/insertion-at-boundary.test.js +185 -0
- package/dist/__tests__/patterns/insertion-at-boundary.test.js.map +1 -0
- package/dist/__tests__/patterns/reorder-only.test.d.ts +10 -0
- package/dist/__tests__/patterns/reorder-only.test.d.ts.map +1 -0
- package/dist/__tests__/patterns/reorder-only.test.js +181 -0
- package/dist/__tests__/patterns/reorder-only.test.js.map +1 -0
- package/dist/__tests__/phase-7-2-3b.test.d.ts +6 -0
- package/dist/__tests__/phase-7-2-3b.test.d.ts.map +1 -0
- package/dist/__tests__/phase-7-2-3b.test.js +730 -0
- package/dist/__tests__/phase-7-2-3b.test.js.map +1 -0
- package/dist/__tests__/resolver.test.d.ts +2 -0
- package/dist/__tests__/resolver.test.d.ts.map +1 -0
- package/dist/__tests__/resolver.test.js +927 -0
- package/dist/__tests__/resolver.test.js.map +1 -0
- package/dist/__tests__/resolvers/cargo.test.d.ts +10 -0
- package/dist/__tests__/resolvers/cargo.test.d.ts.map +1 -0
- package/dist/__tests__/resolvers/cargo.test.js +158 -0
- package/dist/__tests__/resolvers/cargo.test.js.map +1 -0
- package/dist/__tests__/resolvers/dockerfile.test.d.ts +8 -0
- package/dist/__tests__/resolvers/dockerfile.test.d.ts.map +1 -0
- package/dist/__tests__/resolvers/dockerfile.test.js +120 -0
- package/dist/__tests__/resolvers/dockerfile.test.js.map +1 -0
- package/dist/__tests__/resolvers/dotenv.test.d.ts +9 -0
- package/dist/__tests__/resolvers/dotenv.test.d.ts.map +1 -0
- package/dist/__tests__/resolvers/dotenv.test.js +113 -0
- package/dist/__tests__/resolvers/dotenv.test.js.map +1 -0
- package/dist/__tests__/resolvers/improvements-v14.test.d.ts +8 -0
- package/dist/__tests__/resolvers/improvements-v14.test.d.ts.map +1 -0
- package/dist/__tests__/resolvers/improvements-v14.test.js +306 -0
- package/dist/__tests__/resolvers/improvements-v14.test.js.map +1 -0
- package/dist/__tests__/validation.test.d.ts +12 -0
- package/dist/__tests__/validation.test.d.ts.map +1 -0
- package/dist/__tests__/validation.test.js +136 -0
- package/dist/__tests__/validation.test.js.map +1 -0
- package/dist/classifier.d.ts +21 -0
- package/dist/classifier.d.ts.map +1 -0
- package/dist/classifier.js +127 -0
- package/dist/classifier.js.map +1 -0
- package/dist/config.d.ts +108 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +200 -0
- package/dist/config.js.map +1 -0
- package/dist/diff.d.ts +69 -0
- package/dist/diff.d.ts.map +1 -0
- package/dist/diff.js +328 -0
- package/dist/diff.js.map +1 -0
- package/dist/index.d.ts +47 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +38 -0
- package/dist/index.js.map +1 -0
- package/dist/parser.d.ts +39 -0
- package/dist/parser.d.ts.map +1 -0
- package/dist/parser.js +164 -0
- package/dist/parser.js.map +1 -0
- package/dist/patterns/complex.d.ts +5 -0
- package/dist/patterns/complex.d.ts.map +1 -0
- package/dist/patterns/complex.js +27 -0
- package/dist/patterns/complex.js.map +1 -0
- package/dist/patterns/delete-no-change.d.ts +4 -0
- package/dist/patterns/delete-no-change.d.ts.map +1 -0
- package/dist/patterns/delete-no-change.js +75 -0
- package/dist/patterns/delete-no-change.js.map +1 -0
- package/dist/patterns/insertion-at-boundary.d.ts +22 -0
- package/dist/patterns/insertion-at-boundary.d.ts.map +1 -0
- package/dist/patterns/insertion-at-boundary.js +164 -0
- package/dist/patterns/insertion-at-boundary.js.map +1 -0
- package/dist/patterns/non-overlapping.d.ts +4 -0
- package/dist/patterns/non-overlapping.d.ts.map +1 -0
- package/dist/patterns/non-overlapping.js +28 -0
- package/dist/patterns/non-overlapping.js.map +1 -0
- package/dist/patterns/one-side-change.d.ts +4 -0
- package/dist/patterns/one-side-change.d.ts.map +1 -0
- package/dist/patterns/one-side-change.js +45 -0
- package/dist/patterns/one-side-change.js.map +1 -0
- package/dist/patterns/reorder-only.d.ts +14 -0
- package/dist/patterns/reorder-only.d.ts.map +1 -0
- package/dist/patterns/reorder-only.js +81 -0
- package/dist/patterns/reorder-only.js.map +1 -0
- package/dist/patterns/same-change.d.ts +4 -0
- package/dist/patterns/same-change.d.ts.map +1 -0
- package/dist/patterns/same-change.js +25 -0
- package/dist/patterns/same-change.js.map +1 -0
- package/dist/patterns/utils.d.ts +70 -0
- package/dist/patterns/utils.d.ts.map +1 -0
- package/dist/patterns/utils.js +206 -0
- package/dist/patterns/utils.js.map +1 -0
- package/dist/patterns/value-only-change.d.ts +4 -0
- package/dist/patterns/value-only-change.d.ts.map +1 -0
- package/dist/patterns/value-only-change.js +34 -0
- package/dist/patterns/value-only-change.js.map +1 -0
- package/dist/patterns/whitespace-only.d.ts +4 -0
- package/dist/patterns/whitespace-only.d.ts.map +1 -0
- package/dist/patterns/whitespace-only.js +32 -0
- package/dist/patterns/whitespace-only.js.map +1 -0
- package/dist/resolver/assemble.d.ts +25 -0
- package/dist/resolver/assemble.d.ts.map +1 -0
- package/dist/resolver/assemble.js +170 -0
- package/dist/resolver/assemble.js.map +1 -0
- package/dist/resolver/format-dispatch.d.ts +40 -0
- package/dist/resolver/format-dispatch.d.ts.map +1 -0
- package/dist/resolver/format-dispatch.js +51 -0
- package/dist/resolver/format-dispatch.js.map +1 -0
- package/dist/resolver/generated-detection.d.ts +48 -0
- package/dist/resolver/generated-detection.d.ts.map +1 -0
- package/dist/resolver/generated-detection.js +123 -0
- package/dist/resolver/generated-detection.js.map +1 -0
- package/dist/resolver/index.d.ts +26 -0
- package/dist/resolver/index.d.ts.map +1 -0
- package/dist/resolver/index.js +147 -0
- package/dist/resolver/index.js.map +1 -0
- package/dist/resolver/policy.d.ts +53 -0
- package/dist/resolver/policy.d.ts.map +1 -0
- package/dist/resolver/policy.js +99 -0
- package/dist/resolver/policy.js.map +1 -0
- package/dist/resolver/validation.d.ts +28 -0
- package/dist/resolver/validation.d.ts.map +1 -0
- package/dist/resolver/validation.js +96 -0
- package/dist/resolver/validation.js.map +1 -0
- package/dist/resolver.d.ts +18 -0
- package/dist/resolver.d.ts.map +1 -0
- package/dist/resolver.js +18 -0
- package/dist/resolver.js.map +1 -0
- package/dist/resolvers/cargo.d.ts +34 -0
- package/dist/resolvers/cargo.d.ts.map +1 -0
- package/dist/resolvers/cargo.js +262 -0
- package/dist/resolvers/cargo.js.map +1 -0
- package/dist/resolvers/css.d.ts +60 -0
- package/dist/resolvers/css.d.ts.map +1 -0
- package/dist/resolvers/css.js +531 -0
- package/dist/resolvers/css.js.map +1 -0
- package/dist/resolvers/dispatcher.d.ts +78 -0
- package/dist/resolvers/dispatcher.d.ts.map +1 -0
- package/dist/resolvers/dispatcher.js +290 -0
- package/dist/resolvers/dispatcher.js.map +1 -0
- package/dist/resolvers/dockerfile.d.ts +24 -0
- package/dist/resolvers/dockerfile.d.ts.map +1 -0
- package/dist/resolvers/dockerfile.js +221 -0
- package/dist/resolvers/dockerfile.js.map +1 -0
- package/dist/resolvers/dotenv.d.ts +27 -0
- package/dist/resolvers/dotenv.d.ts.map +1 -0
- package/dist/resolvers/dotenv.js +114 -0
- package/dist/resolvers/dotenv.js.map +1 -0
- package/dist/resolvers/imports.d.ts +63 -0
- package/dist/resolvers/imports.d.ts.map +1 -0
- package/dist/resolvers/imports.js +513 -0
- package/dist/resolvers/imports.js.map +1 -0
- package/dist/resolvers/json.d.ts +48 -0
- package/dist/resolvers/json.d.ts.map +1 -0
- package/dist/resolvers/json.js +363 -0
- package/dist/resolvers/json.js.map +1 -0
- package/dist/resolvers/lockfile-npm.d.ts +38 -0
- package/dist/resolvers/lockfile-npm.d.ts.map +1 -0
- package/dist/resolvers/lockfile-npm.js +267 -0
- package/dist/resolvers/lockfile-npm.js.map +1 -0
- package/dist/resolvers/lockfile-pnpm.d.ts +44 -0
- package/dist/resolvers/lockfile-pnpm.d.ts.map +1 -0
- package/dist/resolvers/lockfile-pnpm.js +277 -0
- package/dist/resolvers/lockfile-pnpm.js.map +1 -0
- package/dist/resolvers/lockfile-yarn.d.ts +40 -0
- package/dist/resolvers/lockfile-yarn.d.ts.map +1 -0
- package/dist/resolvers/lockfile-yarn.js +184 -0
- package/dist/resolvers/lockfile-yarn.js.map +1 -0
- package/dist/resolvers/markdown.d.ts +64 -0
- package/dist/resolvers/markdown.d.ts.map +1 -0
- package/dist/resolvers/markdown.js +335 -0
- package/dist/resolvers/markdown.js.map +1 -0
- package/dist/resolvers/vue.d.ts +65 -0
- package/dist/resolvers/vue.d.ts.map +1 -0
- package/dist/resolvers/vue.js +258 -0
- package/dist/resolvers/vue.js.map +1 -0
- package/dist/resolvers/yaml.d.ts +65 -0
- package/dist/resolvers/yaml.d.ts.map +1 -0
- package/dist/resolvers/yaml.js +405 -0
- package/dist/resolvers/yaml.js.map +1 -0
- package/dist/types.d.ts +256 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +8 -0
- package/dist/types.js.map +1 -0
- package/package.json +57 -0
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dispatch vers les résolveurs format-aware (Phase 7.3).
|
|
3
|
+
*
|
|
4
|
+
* Avant de passer au moteur textuel, on tente un résolveur spécialisé par
|
|
5
|
+
* format (JSON/JSONC, Markdown, YAML, Vue, CSS, Dockerfile, Dotenv, Cargo,
|
|
6
|
+
* imports…). Ces résolveurs effectuent une validation sémantique, ce qui
|
|
7
|
+
* justifie de bypasser le filtre de confiance textuel.
|
|
8
|
+
*
|
|
9
|
+
* Exception : le résolveur `imports` est sémantiquement équivalent à
|
|
10
|
+
* `non_overlapping` — il doit respecter la politique `allowNonOverlapping`
|
|
11
|
+
* ainsi que l'option globale `resolveNonOverlapping`.
|
|
12
|
+
*
|
|
13
|
+
* Ce module encapsule à la fois l'appel au dispatcher et la politique
|
|
14
|
+
* appliquée aux imports, et retourne un résultat tagué (`status`) que le
|
|
15
|
+
* moteur principal sait consommer.
|
|
16
|
+
*/
|
|
17
|
+
import { tryFormatAwareResolve } from "../resolvers/dispatcher.js";
|
|
18
|
+
import { computeEffectivePolicy } from "./policy.js";
|
|
19
|
+
/**
|
|
20
|
+
* Essaie les résolveurs format-aware pour ce hunk. Retourne le résultat
|
|
21
|
+
* tagué que le moteur principal sait router.
|
|
22
|
+
*/
|
|
23
|
+
export function dispatchFormatAware(hunk, filePath, options) {
|
|
24
|
+
const formatResult = tryFormatAwareResolve(hunk, filePath);
|
|
25
|
+
if (formatResult.resolverUsed === "none") {
|
|
26
|
+
return { status: "not-applicable", note: "" };
|
|
27
|
+
}
|
|
28
|
+
if (formatResult.lines === null) {
|
|
29
|
+
// Le résolveur spécialisé a échoué — pas de résolution, mais on garde
|
|
30
|
+
// le reason pour l'annoter dans le refus final du moteur textuel.
|
|
31
|
+
return { status: "not-applicable", note: formatResult.reason };
|
|
32
|
+
}
|
|
33
|
+
// Gate politique pour le résolveur d'imports (≈ non_overlapping)
|
|
34
|
+
if (formatResult.resolverUsed === "imports") {
|
|
35
|
+
if (!options.resolveNonOverlapping) {
|
|
36
|
+
return {
|
|
37
|
+
status: "rejected-policy",
|
|
38
|
+
reason: "Résolution d'imports (non-overlapping) désactivée par options (resolveNonOverlapping: false).",
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
const { policy, cfg } = computeEffectivePolicy(filePath, options);
|
|
42
|
+
if (!cfg.allowNonOverlapping) {
|
|
43
|
+
return {
|
|
44
|
+
status: "rejected-policy",
|
|
45
|
+
reason: `Résolution d'imports (non-overlapping) désactivée par la politique "${policy}".`,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return { status: "resolved", lines: formatResult.lines, reason: formatResult.reason };
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=format-dispatch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format-dispatch.js","sourceRoot":"","sources":["../../src/resolver/format-dispatch.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAUrD;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CACjC,IAAkB,EAClB,QAAgB,EAChB,OAAiC;IAEjC,MAAM,YAAY,GAAG,qBAAqB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC3D,IAAI,YAAY,CAAC,YAAY,KAAK,MAAM,EAAE,CAAC;QACzC,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;IAChD,CAAC;IAED,IAAI,YAAY,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;QAChC,sEAAsE;QACtE,kEAAkE;QAClE,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAE,IAAI,EAAE,YAAY,CAAC,MAAM,EAAE,CAAC;IACjE,CAAC;IAED,iEAAiE;IACjE,IAAI,YAAY,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;QAC5C,IAAI,CAAC,OAAO,CAAC,qBAAqB,EAAE,CAAC;YACnC,OAAO;gBACL,MAAM,EAAE,iBAAiB;gBACzB,MAAM,EAAE,+FAA+F;aACxG,CAAC;QACJ,CAAC;QACD,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,sBAAsB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAClE,IAAI,CAAC,GAAG,CAAC,mBAAmB,EAAE,CAAC;YAC7B,OAAO;gBACL,MAAM,EAAE,iBAAiB;gBACzB,MAAM,EAAE,uEAAuE,MAAM,IAAI;aAC1F,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,CAAC,MAAM,EAAE,CAAC;AACxF,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Détection des fichiers auto-générés (lockfiles, bundles, manifests…).
|
|
3
|
+
*
|
|
4
|
+
* Ces fichiers ne doivent pas être mergés ligne par ligne : le moteur les
|
|
5
|
+
* reclassifie en `generated_file` et utilise `stripVolatileValues` pour
|
|
6
|
+
* comparer les deux côtés modulo les valeurs volatiles (hashes, URLs,
|
|
7
|
+
* timestamps). Extrait de `resolver.ts` lors du split P1.1.
|
|
8
|
+
*/
|
|
9
|
+
import type { ConflictHunk } from "../types.js";
|
|
10
|
+
/** Patterns de fichiers auto-générés qui ne doivent pas être mergés ligne par ligne. */
|
|
11
|
+
export declare const GENERATED_FILE_PATTERNS: Array<{
|
|
12
|
+
pattern: RegExp;
|
|
13
|
+
label: string;
|
|
14
|
+
}>;
|
|
15
|
+
/**
|
|
16
|
+
* Retourne `generated: true` si le chemin correspond à un pattern auto-généré.
|
|
17
|
+
*
|
|
18
|
+
* Les `userGlobs` optionnels (P2.4) permettent d'étendre les built-ins avec des
|
|
19
|
+
* patterns glob définis dans `.gitwandrc` (ex: `src/**\/*.generated.ts`, `*.pb.go`,
|
|
20
|
+
* `api/openapi-client/**`). Les built-ins sont checkés en premier (plus rapide,
|
|
21
|
+
* label descriptif) ; les user patterns ne sont évalués qu'en fallback.
|
|
22
|
+
*
|
|
23
|
+
* @param filePath - Chemin du fichier à tester
|
|
24
|
+
* @param userGlobs - Patterns glob supplémentaires issus de la config projet
|
|
25
|
+
*/
|
|
26
|
+
export declare function isGeneratedFile(filePath: string, userGlobs?: readonly string[]): {
|
|
27
|
+
generated: boolean;
|
|
28
|
+
label: string;
|
|
29
|
+
};
|
|
30
|
+
/**
|
|
31
|
+
* Supprime les valeurs volatiles (hashes, timestamps, resolved URLs, integrity)
|
|
32
|
+
* d'un bloc de lignes pour permettre une comparaison structurelle.
|
|
33
|
+
* Utilisé pour détecter les conflits cosmétiques dans les fichiers générés.
|
|
34
|
+
*/
|
|
35
|
+
export declare function stripVolatileValues(lines: string[]): string;
|
|
36
|
+
/**
|
|
37
|
+
* Reclassifie un hunk `complex` en `generated_file` lorsque le chemin
|
|
38
|
+
* correspond à un pattern auto-généré. Retourne une copie du hunk avec
|
|
39
|
+
* le type, la confiance, l'explication et la trace mis à jour.
|
|
40
|
+
*
|
|
41
|
+
* Si le hunk n'est pas `complex` ou si le fichier n'est pas auto-généré,
|
|
42
|
+
* le hunk est retourné tel quel.
|
|
43
|
+
*/
|
|
44
|
+
export declare function reclassifyIfGenerated(hunk: ConflictHunk, genInfo: {
|
|
45
|
+
generated: boolean;
|
|
46
|
+
label: string;
|
|
47
|
+
}): ConflictHunk;
|
|
48
|
+
//# sourceMappingURL=generated-detection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generated-detection.d.ts","sourceRoot":"","sources":["../../src/resolver/generated-detection.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAiC,MAAM,aAAa,CAAC;AAG/E,wFAAwF;AACxF,eAAO,MAAM,uBAAuB,EAAE,KAAK,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAY7E,CAAC;AAEF;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,MAAM,EAChB,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,GAC5B;IAAE,SAAS,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAcvC;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAkB3D;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,YAAY,EAClB,OAAO,EAAE;IAAE,SAAS,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAC7C,YAAY,CA4Cd"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Détection des fichiers auto-générés (lockfiles, bundles, manifests…).
|
|
3
|
+
*
|
|
4
|
+
* Ces fichiers ne doivent pas être mergés ligne par ligne : le moteur les
|
|
5
|
+
* reclassifie en `generated_file` et utilise `stripVolatileValues` pour
|
|
6
|
+
* comparer les deux côtés modulo les valeurs volatiles (hashes, URLs,
|
|
7
|
+
* timestamps). Extrait de `resolver.ts` lors du split P1.1.
|
|
8
|
+
*/
|
|
9
|
+
import { matchGlob } from "../config.js";
|
|
10
|
+
/** Patterns de fichiers auto-générés qui ne doivent pas être mergés ligne par ligne. */
|
|
11
|
+
export const GENERATED_FILE_PATTERNS = [
|
|
12
|
+
{ pattern: /package-lock\.json$/i, label: "npm lockfile" },
|
|
13
|
+
{ pattern: /yarn\.lock$/i, label: "yarn lockfile" },
|
|
14
|
+
{ pattern: /pnpm-lock\.yaml$/i, label: "pnpm lockfile" },
|
|
15
|
+
{ pattern: /composer\.lock$/i, label: "composer lockfile" },
|
|
16
|
+
{ pattern: /Gemfile\.lock$/i, label: "bundler lockfile" },
|
|
17
|
+
{ pattern: /Cargo\.lock$/i, label: "cargo lockfile" },
|
|
18
|
+
{ pattern: /\.min\.(js|css)$/i, label: "fichier minifié" },
|
|
19
|
+
{ pattern: /\bdist\//, label: "fichier build dist/" },
|
|
20
|
+
{ pattern: /\bbuild\/manifest\.json$/i, label: "manifest de build" },
|
|
21
|
+
{ pattern: /\.bundle\.(js|css)$/i, label: "bundle" },
|
|
22
|
+
{ pattern: /mix-manifest\.json$/i, label: "Laravel Mix manifest" },
|
|
23
|
+
];
|
|
24
|
+
/**
|
|
25
|
+
* Retourne `generated: true` si le chemin correspond à un pattern auto-généré.
|
|
26
|
+
*
|
|
27
|
+
* Les `userGlobs` optionnels (P2.4) permettent d'étendre les built-ins avec des
|
|
28
|
+
* patterns glob définis dans `.gitwandrc` (ex: `src/**\/*.generated.ts`, `*.pb.go`,
|
|
29
|
+
* `api/openapi-client/**`). Les built-ins sont checkés en premier (plus rapide,
|
|
30
|
+
* label descriptif) ; les user patterns ne sont évalués qu'en fallback.
|
|
31
|
+
*
|
|
32
|
+
* @param filePath - Chemin du fichier à tester
|
|
33
|
+
* @param userGlobs - Patterns glob supplémentaires issus de la config projet
|
|
34
|
+
*/
|
|
35
|
+
export function isGeneratedFile(filePath, userGlobs) {
|
|
36
|
+
for (const { pattern, label } of GENERATED_FILE_PATTERNS) {
|
|
37
|
+
if (pattern.test(filePath)) {
|
|
38
|
+
return { generated: true, label };
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
if (userGlobs) {
|
|
42
|
+
for (const glob of userGlobs) {
|
|
43
|
+
if (matchGlob(glob, filePath)) {
|
|
44
|
+
return { generated: true, label: `user pattern: ${glob}` };
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return { generated: false, label: "" };
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Supprime les valeurs volatiles (hashes, timestamps, resolved URLs, integrity)
|
|
52
|
+
* d'un bloc de lignes pour permettre une comparaison structurelle.
|
|
53
|
+
* Utilisé pour détecter les conflits cosmétiques dans les fichiers générés.
|
|
54
|
+
*/
|
|
55
|
+
export function stripVolatileValues(lines) {
|
|
56
|
+
return lines
|
|
57
|
+
.map((line) => line
|
|
58
|
+
// SHA/integrity hashes
|
|
59
|
+
.replace(/sha[0-9]+-[A-Za-z0-9+/=]+/g, "<hash>")
|
|
60
|
+
// npm resolved URLs with version+hash
|
|
61
|
+
.replace(/"resolved":\s*"[^"]+"/g, '"resolved": "<url>"')
|
|
62
|
+
// integrity fields
|
|
63
|
+
.replace(/"integrity":\s*"[^"]+"/g, '"integrity": "<hash>"')
|
|
64
|
+
// Generic hex hashes (7+ chars)
|
|
65
|
+
.replace(/\b[a-f0-9]{7,64}\b/g, "<hex>")
|
|
66
|
+
// ISO timestamps
|
|
67
|
+
.replace(/\d{4}-\d{2}-\d{2}[T ]\d{2}:\d{2}(:\d{2})?(\.\d+)?(Z|[+-]\d{2}:?\d{2})?/g, "<ts>")
|
|
68
|
+
// Semver with build metadata
|
|
69
|
+
.replace(/\d+\.\d+\.\d+[-+][A-Za-z0-9.]+/g, "<ver>"))
|
|
70
|
+
.join("\n");
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Reclassifie un hunk `complex` en `generated_file` lorsque le chemin
|
|
74
|
+
* correspond à un pattern auto-généré. Retourne une copie du hunk avec
|
|
75
|
+
* le type, la confiance, l'explication et la trace mis à jour.
|
|
76
|
+
*
|
|
77
|
+
* Si le hunk n'est pas `complex` ou si le fichier n'est pas auto-généré,
|
|
78
|
+
* le hunk est retourné tel quel.
|
|
79
|
+
*/
|
|
80
|
+
export function reclassifyIfGenerated(hunk, genInfo) {
|
|
81
|
+
if (!genInfo.generated || hunk.type !== "complex") {
|
|
82
|
+
return hunk;
|
|
83
|
+
}
|
|
84
|
+
const generatedScore = {
|
|
85
|
+
score: 72,
|
|
86
|
+
label: "high",
|
|
87
|
+
dimensions: {
|
|
88
|
+
typeClassification: 90,
|
|
89
|
+
dataRisk: 30,
|
|
90
|
+
scopeImpact: 15,
|
|
91
|
+
fileFrequency: 0,
|
|
92
|
+
baseAvailability: 0,
|
|
93
|
+
},
|
|
94
|
+
boosters: [`Chemin correspond au pattern de fichier auto-généré : ${genInfo.label}`],
|
|
95
|
+
penalties: ["Le contenu sera régénéré — theirs est supposé plus récent"],
|
|
96
|
+
};
|
|
97
|
+
return {
|
|
98
|
+
...hunk,
|
|
99
|
+
type: "generated_file",
|
|
100
|
+
confidence: generatedScore,
|
|
101
|
+
explanation: `Fichier auto-généré (${genInfo.label}). Ce fichier sera régénéré après le merge. Résolution proposée : accepter theirs et relancer le build.`,
|
|
102
|
+
// Update the trace to reflect the reclassification
|
|
103
|
+
trace: {
|
|
104
|
+
...hunk.trace,
|
|
105
|
+
selected: "generated_file",
|
|
106
|
+
summary: `Fichier auto-généré (${genInfo.label}) — reclassifié depuis complex.`,
|
|
107
|
+
steps: [
|
|
108
|
+
...hunk.trace.steps.slice(0, -1), // remove the "complex passed: true" step
|
|
109
|
+
{
|
|
110
|
+
type: "complex",
|
|
111
|
+
passed: false,
|
|
112
|
+
reason: `Reclassifié : fichier auto-généré (${genInfo.label}) détecté par son chemin.`,
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
type: "generated_file",
|
|
116
|
+
passed: true,
|
|
117
|
+
reason: `Chemin correspond au pattern de fichier auto-généré : ${genInfo.label}.`,
|
|
118
|
+
},
|
|
119
|
+
],
|
|
120
|
+
},
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=generated-detection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generated-detection.js","sourceRoot":"","sources":["../../src/resolver/generated-detection.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GitWand Conflict Resolver — orchestration.
|
|
3
|
+
*
|
|
4
|
+
* Moteur de résolution automatique des conflits. Pour chaque hunk :
|
|
5
|
+
* 1. applique la pénalité « zone chaude » (v1.4) si nécessaire,
|
|
6
|
+
* 2. reclassifie les hunks complex en `generated_file` si le chemin matche,
|
|
7
|
+
* 3. tente un résolveur format-aware (JSON/MD/YAML/Vue/CSS/imports…),
|
|
8
|
+
* 4. à défaut, applique la politique de merge et le seuil de confiance,
|
|
9
|
+
* 5. invoque le moteur textuel (`assembleResolution`),
|
|
10
|
+
* 6. valide le contenu fusionné en sortie (marqueurs résiduels, JSON).
|
|
11
|
+
*
|
|
12
|
+
* Issu du split P1.1 de `resolver.ts`. Le fichier `packages/core/src/resolver.ts`
|
|
13
|
+
* reste en place comme shim de re-export pour les consommateurs qui importent
|
|
14
|
+
* `resolve` depuis `../resolver.js`.
|
|
15
|
+
*/
|
|
16
|
+
import type { GitWandOptions, MergeResult } from "../types.js";
|
|
17
|
+
/**
|
|
18
|
+
* Analyse et résout automatiquement les conflits d'un fichier.
|
|
19
|
+
*
|
|
20
|
+
* @param conflictedContent - Le contenu du fichier avec marqueurs de conflit Git
|
|
21
|
+
* @param filePath - Le chemin du fichier (pour le reporting)
|
|
22
|
+
* @param userOptions - Options de configuration
|
|
23
|
+
* @returns Le résultat de la résolution avec traces et validation
|
|
24
|
+
*/
|
|
25
|
+
export declare function resolve(conflictedContent: string, filePath: string, userOptions?: GitWandOptions): MergeResult;
|
|
26
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/resolver/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAGV,cAAc,EAEd,WAAW,EAGZ,MAAM,aAAa,CAAC;AAgErB;;;;;;;GAOG;AACH,wBAAgB,OAAO,CACrB,iBAAiB,EAAE,MAAM,EACzB,QAAQ,EAAE,MAAM,EAChB,WAAW,GAAE,cAAmB,GAC/B,WAAW,CAgGb"}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GitWand Conflict Resolver — orchestration.
|
|
3
|
+
*
|
|
4
|
+
* Moteur de résolution automatique des conflits. Pour chaque hunk :
|
|
5
|
+
* 1. applique la pénalité « zone chaude » (v1.4) si nécessaire,
|
|
6
|
+
* 2. reclassifie les hunks complex en `generated_file` si le chemin matche,
|
|
7
|
+
* 3. tente un résolveur format-aware (JSON/MD/YAML/Vue/CSS/imports…),
|
|
8
|
+
* 4. à défaut, applique la politique de merge et le seuil de confiance,
|
|
9
|
+
* 5. invoque le moteur textuel (`assembleResolution`),
|
|
10
|
+
* 6. valide le contenu fusionné en sortie (marqueurs résiduels, JSON).
|
|
11
|
+
*
|
|
12
|
+
* Issu du split P1.1 de `resolver.ts`. Le fichier `packages/core/src/resolver.ts`
|
|
13
|
+
* reste en place comme shim de re-export pour les consommateurs qui importent
|
|
14
|
+
* `resolve` depuis `../resolver.js`.
|
|
15
|
+
*/
|
|
16
|
+
import { parseConflictMarkers, toConflictHunk } from "../parser.js";
|
|
17
|
+
import { EMPTY_VALIDATION, validateMergedContent } from "./validation.js";
|
|
18
|
+
import { isGeneratedFile, reclassifyIfGenerated } from "./generated-detection.js";
|
|
19
|
+
import { CONFIDENCE_ORDER, DEFAULT_OPTIONS, applyFileFrequencyPenalty, computeEffectiveMinConfidence, computeEffectivePolicy, } from "./policy.js";
|
|
20
|
+
import { dispatchFormatAware } from "./format-dispatch.js";
|
|
21
|
+
import { assembleResolution } from "./assemble.js";
|
|
22
|
+
/**
|
|
23
|
+
* Résout automatiquement un hunk de conflit.
|
|
24
|
+
*
|
|
25
|
+
* @param hunk - Le hunk à résoudre
|
|
26
|
+
* @param filePath - Chemin du fichier (pour le dispatch format-aware et la politique)
|
|
27
|
+
* @param options - Options de configuration (complètes, déjà fusionnées avec les défauts)
|
|
28
|
+
* @returns Les lignes résolues + la raison, ou `null` + raison de refus
|
|
29
|
+
*/
|
|
30
|
+
function resolveHunk(hunk, filePath, options) {
|
|
31
|
+
// explainOnly : ne pas appliquer de résolution, juste tracer
|
|
32
|
+
if (options.explainOnly) {
|
|
33
|
+
return {
|
|
34
|
+
lines: null,
|
|
35
|
+
reason: `Mode explain-only : résolution non appliquée (type: ${hunk.type}, confiance: ${hunk.confidence.label} [score: ${hunk.confidence.score}]).`,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
// Phase 7.3 — Dispatch format-aware (bypasse le seuil de confiance textuel
|
|
39
|
+
// car les résolveurs spécialisés font une validation sémantique).
|
|
40
|
+
const dispatch = dispatchFormatAware(hunk, filePath, options);
|
|
41
|
+
if (dispatch.status === "resolved") {
|
|
42
|
+
return { lines: dispatch.lines, reason: dispatch.reason };
|
|
43
|
+
}
|
|
44
|
+
if (dispatch.status === "rejected-policy") {
|
|
45
|
+
return { lines: null, reason: dispatch.reason };
|
|
46
|
+
}
|
|
47
|
+
// dispatch.status === "not-applicable" → on continue vers le moteur textuel.
|
|
48
|
+
// `dispatch.note` porte la raison d'échec du résolveur spécialisé (pour
|
|
49
|
+
// annotation du refus final si le seuil de confiance bloque aussi).
|
|
50
|
+
// Phase 7.4 — Politique de merge effective pour ce fichier
|
|
51
|
+
const { policy: effectivePolicy, cfg: policyCfg } = computeEffectivePolicy(filePath, options);
|
|
52
|
+
const effectiveMinConfidence = computeEffectiveMinConfidence(policyCfg, options);
|
|
53
|
+
// Vérifier le niveau de confiance minimum
|
|
54
|
+
if (CONFIDENCE_ORDER[hunk.confidence.label] < CONFIDENCE_ORDER[effectiveMinConfidence]) {
|
|
55
|
+
return {
|
|
56
|
+
lines: null,
|
|
57
|
+
reason: `Confiance ${hunk.confidence.label} (score: ${hunk.confidence.score}) insuffisante (minimum requis : ${effectiveMinConfidence}, politique : ${effectivePolicy}).${dispatch.note ? ` [${dispatch.note}]` : ""}`,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
return assembleResolution(hunk, options, effectivePolicy, policyCfg);
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Analyse et résout automatiquement les conflits d'un fichier.
|
|
64
|
+
*
|
|
65
|
+
* @param conflictedContent - Le contenu du fichier avec marqueurs de conflit Git
|
|
66
|
+
* @param filePath - Le chemin du fichier (pour le reporting)
|
|
67
|
+
* @param userOptions - Options de configuration
|
|
68
|
+
* @returns Le résultat de la résolution avec traces et validation
|
|
69
|
+
*/
|
|
70
|
+
export function resolve(conflictedContent, filePath, userOptions = {}) {
|
|
71
|
+
const options = { ...DEFAULT_OPTIONS, ...userOptions };
|
|
72
|
+
const { segments } = parseConflictMarkers(conflictedContent);
|
|
73
|
+
const hunks = [];
|
|
74
|
+
const resolutions = [];
|
|
75
|
+
const outputLines = [];
|
|
76
|
+
let allResolved = true;
|
|
77
|
+
// Détecter si le fichier est auto-généré (built-ins + user patterns P2.4)
|
|
78
|
+
const genInfo = isGeneratedFile(filePath, options.generatedFiles);
|
|
79
|
+
// v1.4 — fileFrequency : compteur de hunks "complex" déjà vus dans ce fichier.
|
|
80
|
+
// Appliqué comme pénalité sur la dimension fileFrequency du score de confiance.
|
|
81
|
+
let priorComplexHunks = 0;
|
|
82
|
+
for (const segment of segments) {
|
|
83
|
+
if (segment.type === "text") {
|
|
84
|
+
outputLines.push(...segment.lines);
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
let hunk = toConflictHunk(segment.conflict);
|
|
88
|
+
// v1.4 — Appliquer la pénalité fileFrequency si des hunks complexes ont déjà été vus
|
|
89
|
+
hunk = applyFileFrequencyPenalty(hunk, priorComplexHunks);
|
|
90
|
+
// Si fichier auto-généré et hunk classifié "complex", reclassifier en "generated_file"
|
|
91
|
+
hunk = reclassifyIfGenerated(hunk, genInfo);
|
|
92
|
+
hunks.push(hunk);
|
|
93
|
+
const { lines: resolvedLines, reason: resolutionReason } = resolveHunk(hunk, filePath, options);
|
|
94
|
+
const autoResolved = resolvedLines !== null;
|
|
95
|
+
// v1.4 — Incrémenter le compteur de hunks complexes non résolus pour fileFrequency
|
|
96
|
+
if (!autoResolved && hunk.type === "complex") {
|
|
97
|
+
priorComplexHunks++;
|
|
98
|
+
}
|
|
99
|
+
resolutions.push({ hunk, resolvedLines, autoResolved, resolutionReason });
|
|
100
|
+
if (autoResolved) {
|
|
101
|
+
outputLines.push(...resolvedLines);
|
|
102
|
+
if (options.verbose) {
|
|
103
|
+
console.log(` [GitWand] Auto-resolved (${hunk.type}): L${hunk.startLine} — ${hunk.explanation}`);
|
|
104
|
+
console.log(` Trace: ${hunk.trace.summary}`);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
// Remettre les marqueurs de conflit pour les conflits non résolus
|
|
109
|
+
outputLines.push(`<<<<<<< ours`);
|
|
110
|
+
outputLines.push(...hunk.oursLines);
|
|
111
|
+
if (hunk.baseLines.length > 0) {
|
|
112
|
+
outputLines.push(`||||||| base`);
|
|
113
|
+
outputLines.push(...hunk.baseLines);
|
|
114
|
+
}
|
|
115
|
+
outputLines.push(`=======`);
|
|
116
|
+
outputLines.push(...hunk.theirsLines);
|
|
117
|
+
outputLines.push(`>>>>>>> theirs`);
|
|
118
|
+
allResolved = false;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
// Calculer les stats
|
|
122
|
+
const byType = {};
|
|
123
|
+
for (const hunk of hunks) {
|
|
124
|
+
byType[hunk.type] = (byType[hunk.type] || 0) + 1;
|
|
125
|
+
}
|
|
126
|
+
const autoResolvedCount = resolutions.filter((r) => r.autoResolved).length;
|
|
127
|
+
const stats = {
|
|
128
|
+
totalConflicts: hunks.length,
|
|
129
|
+
autoResolved: autoResolvedCount,
|
|
130
|
+
remaining: hunks.length - autoResolvedCount,
|
|
131
|
+
byType,
|
|
132
|
+
};
|
|
133
|
+
const mergedContent = allResolved ? outputLines.join("\n") : null;
|
|
134
|
+
// Phase 7.2 — Validation post-merge
|
|
135
|
+
const validation = mergedContent !== null
|
|
136
|
+
? validateMergedContent(mergedContent, filePath)
|
|
137
|
+
: EMPTY_VALIDATION;
|
|
138
|
+
return {
|
|
139
|
+
filePath,
|
|
140
|
+
mergedContent,
|
|
141
|
+
hunks,
|
|
142
|
+
resolutions,
|
|
143
|
+
stats,
|
|
144
|
+
validation,
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/resolver/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Politique de merge effective + helpers de scoring.
|
|
3
|
+
*
|
|
4
|
+
* Regroupe :
|
|
5
|
+
* - `DEFAULT_OPTIONS` — valeurs par défaut des `GitWandOptions`
|
|
6
|
+
* - `CONFIDENCE_ORDER` — ordre total sur les labels de confiance
|
|
7
|
+
* - `computeEffectivePolicy` — résout la politique applicable à un fichier
|
|
8
|
+
* (glob overrides > politique globale) et sa `PolicyConfig` dérivée
|
|
9
|
+
* - `computeEffectiveMinConfidence` — seuil de confiance effectif (min entre
|
|
10
|
+
* option globale et politique, donc le plus permissif des deux)
|
|
11
|
+
* - `applyFileFrequencyPenalty` — v1.4 « zone chaude » : pénalise la confiance
|
|
12
|
+
* d'un hunk si le même fichier contient déjà des hunks complexes non résolus
|
|
13
|
+
*
|
|
14
|
+
* Extrait de `resolver.ts` lors du split P1.1.
|
|
15
|
+
*/
|
|
16
|
+
import type { ConflictHunk, Confidence, GitWandOptions } from "../types.js";
|
|
17
|
+
import { type MergePolicy, type PolicyConfig } from "../config.js";
|
|
18
|
+
/** Options par défaut. */
|
|
19
|
+
export declare const DEFAULT_OPTIONS: Required<GitWandOptions>;
|
|
20
|
+
/** Ordre de confiance pour comparaison. */
|
|
21
|
+
export declare const CONFIDENCE_ORDER: Record<Confidence, number>;
|
|
22
|
+
/**
|
|
23
|
+
* Résout la politique effective pour un fichier donné.
|
|
24
|
+
*
|
|
25
|
+
* La priorité est : pattern-override le plus spécifique → politique globale.
|
|
26
|
+
* Retourne à la fois la politique et sa `PolicyConfig` dérivée, afin de ne
|
|
27
|
+
* pas recalculer la conversion chez les appelants.
|
|
28
|
+
*/
|
|
29
|
+
export declare function computeEffectivePolicy(filePath: string, options: Required<GitWandOptions>): {
|
|
30
|
+
policy: MergePolicy;
|
|
31
|
+
cfg: PolicyConfig;
|
|
32
|
+
};
|
|
33
|
+
/**
|
|
34
|
+
* Calcule le seuil de confiance effectif : le `min` entre la politique et
|
|
35
|
+
* l'option globale. Motivation : la politique peut abaisser le seuil, et
|
|
36
|
+
* une option explicite peut aussi l'abaisser en dessous du défaut de la
|
|
37
|
+
* politique — on prend donc toujours le plus permissif.
|
|
38
|
+
*/
|
|
39
|
+
export declare function computeEffectiveMinConfidence(policyCfg: PolicyConfig, options: Required<GitWandOptions>): Confidence;
|
|
40
|
+
/**
|
|
41
|
+
* v1.4 — Applique la pénalité « zone chaude » sur la confiance d'un hunk si
|
|
42
|
+
* `priorComplexHunks > 0` hunks complexes non résolus ont déjà été vus dans
|
|
43
|
+
* le même fichier. Ne s'applique pas aux hunks `complex` eux-mêmes.
|
|
44
|
+
*
|
|
45
|
+
* La formule recalcule `score` à partir des dimensions, avec :
|
|
46
|
+
* `fileFrequency = min(100, priorComplexHunks × 20)`
|
|
47
|
+
* `score = typeClassification − 0.40·dataRisk − 0.15·scopeImpact
|
|
48
|
+
* − 0.10·fileFrequency + 0.05·baseAvailability`
|
|
49
|
+
*
|
|
50
|
+
* Les labels sont re-dérivés via les seuils : 92 / 68 / 44.
|
|
51
|
+
*/
|
|
52
|
+
export declare function applyFileFrequencyPenalty(hunk: ConflictHunk, priorComplexHunks: number): ConflictHunk;
|
|
53
|
+
//# sourceMappingURL=policy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../../src/resolver/policy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC5E,OAAO,EAIL,KAAK,WAAW,EAChB,KAAK,YAAY,EAClB,MAAM,cAAc,CAAC;AAEtB,0BAA0B;AAC1B,eAAO,MAAM,eAAe,EAAE,QAAQ,CAAC,cAAc,CASpD,CAAC;AAEF,2CAA2C;AAC3C,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAKvD,CAAC;AAEF;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,QAAQ,CAAC,cAAc,CAAC,GAChC;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,GAAG,EAAE,YAAY,CAAA;CAAE,CAO5C;AAED;;;;;GAKG;AACH,wBAAgB,6BAA6B,CAC3C,SAAS,EAAE,YAAY,EACvB,OAAO,EAAE,QAAQ,CAAC,cAAc,CAAC,GAChC,UAAU,CAIZ;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,YAAY,EAClB,iBAAiB,EAAE,MAAM,GACxB,YAAY,CAiCd"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Politique de merge effective + helpers de scoring.
|
|
3
|
+
*
|
|
4
|
+
* Regroupe :
|
|
5
|
+
* - `DEFAULT_OPTIONS` — valeurs par défaut des `GitWandOptions`
|
|
6
|
+
* - `CONFIDENCE_ORDER` — ordre total sur les labels de confiance
|
|
7
|
+
* - `computeEffectivePolicy` — résout la politique applicable à un fichier
|
|
8
|
+
* (glob overrides > politique globale) et sa `PolicyConfig` dérivée
|
|
9
|
+
* - `computeEffectiveMinConfidence` — seuil de confiance effectif (min entre
|
|
10
|
+
* option globale et politique, donc le plus permissif des deux)
|
|
11
|
+
* - `applyFileFrequencyPenalty` — v1.4 « zone chaude » : pénalise la confiance
|
|
12
|
+
* d'un hunk si le même fichier contient déjà des hunks complexes non résolus
|
|
13
|
+
*
|
|
14
|
+
* Extrait de `resolver.ts` lors du split P1.1.
|
|
15
|
+
*/
|
|
16
|
+
import { DEFAULT_POLICY, effectivePolicyForFile, policyToConfig, } from "../config.js";
|
|
17
|
+
/** Options par défaut. */
|
|
18
|
+
export const DEFAULT_OPTIONS = {
|
|
19
|
+
resolveWhitespace: true,
|
|
20
|
+
resolveNonOverlapping: true,
|
|
21
|
+
minConfidence: "high",
|
|
22
|
+
verbose: false,
|
|
23
|
+
explainOnly: false,
|
|
24
|
+
policy: DEFAULT_POLICY,
|
|
25
|
+
patternOverrides: {},
|
|
26
|
+
generatedFiles: [],
|
|
27
|
+
};
|
|
28
|
+
/** Ordre de confiance pour comparaison. */
|
|
29
|
+
export const CONFIDENCE_ORDER = {
|
|
30
|
+
certain: 4,
|
|
31
|
+
high: 3,
|
|
32
|
+
medium: 2,
|
|
33
|
+
low: 1,
|
|
34
|
+
};
|
|
35
|
+
/**
|
|
36
|
+
* Résout la politique effective pour un fichier donné.
|
|
37
|
+
*
|
|
38
|
+
* La priorité est : pattern-override le plus spécifique → politique globale.
|
|
39
|
+
* Retourne à la fois la politique et sa `PolicyConfig` dérivée, afin de ne
|
|
40
|
+
* pas recalculer la conversion chez les appelants.
|
|
41
|
+
*/
|
|
42
|
+
export function computeEffectivePolicy(filePath, options) {
|
|
43
|
+
const policy = effectivePolicyForFile(filePath, options.policy, options.patternOverrides);
|
|
44
|
+
return { policy, cfg: policyToConfig(policy) };
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Calcule le seuil de confiance effectif : le `min` entre la politique et
|
|
48
|
+
* l'option globale. Motivation : la politique peut abaisser le seuil, et
|
|
49
|
+
* une option explicite peut aussi l'abaisser en dessous du défaut de la
|
|
50
|
+
* politique — on prend donc toujours le plus permissif.
|
|
51
|
+
*/
|
|
52
|
+
export function computeEffectiveMinConfidence(policyCfg, options) {
|
|
53
|
+
return CONFIDENCE_ORDER[policyCfg.minConfidence] < CONFIDENCE_ORDER[options.minConfidence]
|
|
54
|
+
? policyCfg.minConfidence
|
|
55
|
+
: options.minConfidence;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* v1.4 — Applique la pénalité « zone chaude » sur la confiance d'un hunk si
|
|
59
|
+
* `priorComplexHunks > 0` hunks complexes non résolus ont déjà été vus dans
|
|
60
|
+
* le même fichier. Ne s'applique pas aux hunks `complex` eux-mêmes.
|
|
61
|
+
*
|
|
62
|
+
* La formule recalcule `score` à partir des dimensions, avec :
|
|
63
|
+
* `fileFrequency = min(100, priorComplexHunks × 20)`
|
|
64
|
+
* `score = typeClassification − 0.40·dataRisk − 0.15·scopeImpact
|
|
65
|
+
* − 0.10·fileFrequency + 0.05·baseAvailability`
|
|
66
|
+
*
|
|
67
|
+
* Les labels sont re-dérivés via les seuils : 92 / 68 / 44.
|
|
68
|
+
*/
|
|
69
|
+
export function applyFileFrequencyPenalty(hunk, priorComplexHunks) {
|
|
70
|
+
if (priorComplexHunks <= 0 || hunk.type === "complex") {
|
|
71
|
+
return hunk;
|
|
72
|
+
}
|
|
73
|
+
const ff = Math.min(100, priorComplexHunks * 20);
|
|
74
|
+
const d = hunk.confidence.dimensions;
|
|
75
|
+
const raw = d.typeClassification
|
|
76
|
+
- d.dataRisk * 0.40
|
|
77
|
+
- d.scopeImpact * 0.15
|
|
78
|
+
- ff * 0.10
|
|
79
|
+
+ (d.baseAvailability ?? 0) * 0.05;
|
|
80
|
+
const newScore = Math.round(Math.max(0, Math.min(100, raw)));
|
|
81
|
+
const newLabel = newScore >= 92 ? "certain"
|
|
82
|
+
: newScore >= 68 ? "high"
|
|
83
|
+
: newScore >= 44 ? "medium"
|
|
84
|
+
: "low";
|
|
85
|
+
return {
|
|
86
|
+
...hunk,
|
|
87
|
+
confidence: {
|
|
88
|
+
...hunk.confidence,
|
|
89
|
+
score: newScore,
|
|
90
|
+
label: newLabel,
|
|
91
|
+
dimensions: { ...d, fileFrequency: ff },
|
|
92
|
+
penalties: [
|
|
93
|
+
...hunk.confidence.penalties,
|
|
94
|
+
`Zone chaude — ${priorComplexHunks} hunk${priorComplexHunks > 1 ? "s" : ""} complexe${priorComplexHunks > 1 ? "s" : ""} déjà vus dans ce fichier (−${(ff * 0.10).toFixed(1)} pts)`,
|
|
95
|
+
],
|
|
96
|
+
},
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=policy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy.js","sourceRoot":"","sources":["../../src/resolver/policy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Post-merge validation (Phase 7.2).
|
|
3
|
+
*
|
|
4
|
+
* Vérifie que le contenu fusionné ne laisse pas de marqueurs de conflit
|
|
5
|
+
* résiduels et, pour les formats structurés (JSON/JSONC, YAML, TOML),
|
|
6
|
+
* qu'il reste syntaxiquement valide. Extrait de `resolver.ts` lors du
|
|
7
|
+
* split P1.1, puis étendu YAML/TOML en P2.5.
|
|
8
|
+
*/
|
|
9
|
+
import type { ValidationResult } from "../types.js";
|
|
10
|
+
/** Patterns de marqueurs de conflit résiduels. */
|
|
11
|
+
export declare const RESIDUAL_MARKER_PATTERNS: RegExp[];
|
|
12
|
+
/**
|
|
13
|
+
* Valide le contenu fusionné pour détecter les problèmes résiduels.
|
|
14
|
+
*
|
|
15
|
+
* Vérifie :
|
|
16
|
+
* 1. Marqueurs de conflit résiduels (indique une résolution incomplète)
|
|
17
|
+
* 2. Erreurs de syntaxe pour les formats structurés :
|
|
18
|
+
* - JSON/JSONC (`.json`, `.jsonc`)
|
|
19
|
+
* - YAML (`.yaml`, `.yml`)
|
|
20
|
+
* - TOML (`.toml`)
|
|
21
|
+
*
|
|
22
|
+
* @param content - Contenu fusionné à valider
|
|
23
|
+
* @param filePath - Chemin du fichier (pour détecter le type)
|
|
24
|
+
*/
|
|
25
|
+
export declare function validateMergedContent(content: string, filePath: string): ValidationResult;
|
|
26
|
+
/** Validation vide (pour les cas où le contenu n'est pas encore fusionné). */
|
|
27
|
+
export declare const EMPTY_VALIDATION: ValidationResult;
|
|
28
|
+
//# sourceMappingURL=validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/resolver/validation.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEpD,kDAAkD;AAClD,eAAO,MAAM,wBAAwB,UAKpC,CAAC;AA8CF;;;;;;;;;;;;GAYG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,gBAAgB,CAqBzF;AAED,8EAA8E;AAC9E,eAAO,MAAM,gBAAgB,EAAE,gBAK9B,CAAC"}
|