@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.
Files changed (219) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +52 -0
  3. package/dist/__tests__/bench.bench.d.ts +14 -0
  4. package/dist/__tests__/bench.bench.d.ts.map +1 -0
  5. package/dist/__tests__/bench.bench.js +137 -0
  6. package/dist/__tests__/bench.bench.js.map +1 -0
  7. package/dist/__tests__/confidence-v14.test.d.ts +13 -0
  8. package/dist/__tests__/confidence-v14.test.d.ts.map +1 -0
  9. package/dist/__tests__/confidence-v14.test.js +284 -0
  10. package/dist/__tests__/confidence-v14.test.js.map +1 -0
  11. package/dist/__tests__/config.test.d.ts +2 -0
  12. package/dist/__tests__/config.test.d.ts.map +1 -0
  13. package/dist/__tests__/config.test.js +317 -0
  14. package/dist/__tests__/config.test.js.map +1 -0
  15. package/dist/__tests__/corpus.d.ts +36 -0
  16. package/dist/__tests__/corpus.d.ts.map +1 -0
  17. package/dist/__tests__/corpus.js +541 -0
  18. package/dist/__tests__/corpus.js.map +1 -0
  19. package/dist/__tests__/corpus.test.d.ts +17 -0
  20. package/dist/__tests__/corpus.test.d.ts.map +1 -0
  21. package/dist/__tests__/corpus.test.js +179 -0
  22. package/dist/__tests__/corpus.test.js.map +1 -0
  23. package/dist/__tests__/diff.test.d.ts +10 -0
  24. package/dist/__tests__/diff.test.d.ts.map +1 -0
  25. package/dist/__tests__/diff.test.js +178 -0
  26. package/dist/__tests__/diff.test.js.map +1 -0
  27. package/dist/__tests__/format-resolvers.test.d.ts +2 -0
  28. package/dist/__tests__/format-resolvers.test.d.ts.map +1 -0
  29. package/dist/__tests__/format-resolvers.test.js +577 -0
  30. package/dist/__tests__/format-resolvers.test.js.map +1 -0
  31. package/dist/__tests__/imports-extended.test.d.ts +2 -0
  32. package/dist/__tests__/imports-extended.test.d.ts.map +1 -0
  33. package/dist/__tests__/imports-extended.test.js +94 -0
  34. package/dist/__tests__/imports-extended.test.js.map +1 -0
  35. package/dist/__tests__/lockfile-resolvers.test.d.ts +2 -0
  36. package/dist/__tests__/lockfile-resolvers.test.d.ts.map +1 -0
  37. package/dist/__tests__/lockfile-resolvers.test.js +200 -0
  38. package/dist/__tests__/lockfile-resolvers.test.js.map +1 -0
  39. package/dist/__tests__/patterns/insertion-at-boundary.test.d.ts +10 -0
  40. package/dist/__tests__/patterns/insertion-at-boundary.test.d.ts.map +1 -0
  41. package/dist/__tests__/patterns/insertion-at-boundary.test.js +185 -0
  42. package/dist/__tests__/patterns/insertion-at-boundary.test.js.map +1 -0
  43. package/dist/__tests__/patterns/reorder-only.test.d.ts +10 -0
  44. package/dist/__tests__/patterns/reorder-only.test.d.ts.map +1 -0
  45. package/dist/__tests__/patterns/reorder-only.test.js +181 -0
  46. package/dist/__tests__/patterns/reorder-only.test.js.map +1 -0
  47. package/dist/__tests__/phase-7-2-3b.test.d.ts +6 -0
  48. package/dist/__tests__/phase-7-2-3b.test.d.ts.map +1 -0
  49. package/dist/__tests__/phase-7-2-3b.test.js +730 -0
  50. package/dist/__tests__/phase-7-2-3b.test.js.map +1 -0
  51. package/dist/__tests__/resolver.test.d.ts +2 -0
  52. package/dist/__tests__/resolver.test.d.ts.map +1 -0
  53. package/dist/__tests__/resolver.test.js +927 -0
  54. package/dist/__tests__/resolver.test.js.map +1 -0
  55. package/dist/__tests__/resolvers/cargo.test.d.ts +10 -0
  56. package/dist/__tests__/resolvers/cargo.test.d.ts.map +1 -0
  57. package/dist/__tests__/resolvers/cargo.test.js +158 -0
  58. package/dist/__tests__/resolvers/cargo.test.js.map +1 -0
  59. package/dist/__tests__/resolvers/dockerfile.test.d.ts +8 -0
  60. package/dist/__tests__/resolvers/dockerfile.test.d.ts.map +1 -0
  61. package/dist/__tests__/resolvers/dockerfile.test.js +120 -0
  62. package/dist/__tests__/resolvers/dockerfile.test.js.map +1 -0
  63. package/dist/__tests__/resolvers/dotenv.test.d.ts +9 -0
  64. package/dist/__tests__/resolvers/dotenv.test.d.ts.map +1 -0
  65. package/dist/__tests__/resolvers/dotenv.test.js +113 -0
  66. package/dist/__tests__/resolvers/dotenv.test.js.map +1 -0
  67. package/dist/__tests__/resolvers/improvements-v14.test.d.ts +8 -0
  68. package/dist/__tests__/resolvers/improvements-v14.test.d.ts.map +1 -0
  69. package/dist/__tests__/resolvers/improvements-v14.test.js +306 -0
  70. package/dist/__tests__/resolvers/improvements-v14.test.js.map +1 -0
  71. package/dist/__tests__/validation.test.d.ts +12 -0
  72. package/dist/__tests__/validation.test.d.ts.map +1 -0
  73. package/dist/__tests__/validation.test.js +136 -0
  74. package/dist/__tests__/validation.test.js.map +1 -0
  75. package/dist/classifier.d.ts +21 -0
  76. package/dist/classifier.d.ts.map +1 -0
  77. package/dist/classifier.js +127 -0
  78. package/dist/classifier.js.map +1 -0
  79. package/dist/config.d.ts +108 -0
  80. package/dist/config.d.ts.map +1 -0
  81. package/dist/config.js +200 -0
  82. package/dist/config.js.map +1 -0
  83. package/dist/diff.d.ts +69 -0
  84. package/dist/diff.d.ts.map +1 -0
  85. package/dist/diff.js +328 -0
  86. package/dist/diff.js.map +1 -0
  87. package/dist/index.d.ts +47 -0
  88. package/dist/index.d.ts.map +1 -0
  89. package/dist/index.js +38 -0
  90. package/dist/index.js.map +1 -0
  91. package/dist/parser.d.ts +39 -0
  92. package/dist/parser.d.ts.map +1 -0
  93. package/dist/parser.js +164 -0
  94. package/dist/parser.js.map +1 -0
  95. package/dist/patterns/complex.d.ts +5 -0
  96. package/dist/patterns/complex.d.ts.map +1 -0
  97. package/dist/patterns/complex.js +27 -0
  98. package/dist/patterns/complex.js.map +1 -0
  99. package/dist/patterns/delete-no-change.d.ts +4 -0
  100. package/dist/patterns/delete-no-change.d.ts.map +1 -0
  101. package/dist/patterns/delete-no-change.js +75 -0
  102. package/dist/patterns/delete-no-change.js.map +1 -0
  103. package/dist/patterns/insertion-at-boundary.d.ts +22 -0
  104. package/dist/patterns/insertion-at-boundary.d.ts.map +1 -0
  105. package/dist/patterns/insertion-at-boundary.js +164 -0
  106. package/dist/patterns/insertion-at-boundary.js.map +1 -0
  107. package/dist/patterns/non-overlapping.d.ts +4 -0
  108. package/dist/patterns/non-overlapping.d.ts.map +1 -0
  109. package/dist/patterns/non-overlapping.js +28 -0
  110. package/dist/patterns/non-overlapping.js.map +1 -0
  111. package/dist/patterns/one-side-change.d.ts +4 -0
  112. package/dist/patterns/one-side-change.d.ts.map +1 -0
  113. package/dist/patterns/one-side-change.js +45 -0
  114. package/dist/patterns/one-side-change.js.map +1 -0
  115. package/dist/patterns/reorder-only.d.ts +14 -0
  116. package/dist/patterns/reorder-only.d.ts.map +1 -0
  117. package/dist/patterns/reorder-only.js +81 -0
  118. package/dist/patterns/reorder-only.js.map +1 -0
  119. package/dist/patterns/same-change.d.ts +4 -0
  120. package/dist/patterns/same-change.d.ts.map +1 -0
  121. package/dist/patterns/same-change.js +25 -0
  122. package/dist/patterns/same-change.js.map +1 -0
  123. package/dist/patterns/utils.d.ts +70 -0
  124. package/dist/patterns/utils.d.ts.map +1 -0
  125. package/dist/patterns/utils.js +206 -0
  126. package/dist/patterns/utils.js.map +1 -0
  127. package/dist/patterns/value-only-change.d.ts +4 -0
  128. package/dist/patterns/value-only-change.d.ts.map +1 -0
  129. package/dist/patterns/value-only-change.js +34 -0
  130. package/dist/patterns/value-only-change.js.map +1 -0
  131. package/dist/patterns/whitespace-only.d.ts +4 -0
  132. package/dist/patterns/whitespace-only.d.ts.map +1 -0
  133. package/dist/patterns/whitespace-only.js +32 -0
  134. package/dist/patterns/whitespace-only.js.map +1 -0
  135. package/dist/resolver/assemble.d.ts +25 -0
  136. package/dist/resolver/assemble.d.ts.map +1 -0
  137. package/dist/resolver/assemble.js +170 -0
  138. package/dist/resolver/assemble.js.map +1 -0
  139. package/dist/resolver/format-dispatch.d.ts +40 -0
  140. package/dist/resolver/format-dispatch.d.ts.map +1 -0
  141. package/dist/resolver/format-dispatch.js +51 -0
  142. package/dist/resolver/format-dispatch.js.map +1 -0
  143. package/dist/resolver/generated-detection.d.ts +48 -0
  144. package/dist/resolver/generated-detection.d.ts.map +1 -0
  145. package/dist/resolver/generated-detection.js +123 -0
  146. package/dist/resolver/generated-detection.js.map +1 -0
  147. package/dist/resolver/index.d.ts +26 -0
  148. package/dist/resolver/index.d.ts.map +1 -0
  149. package/dist/resolver/index.js +147 -0
  150. package/dist/resolver/index.js.map +1 -0
  151. package/dist/resolver/policy.d.ts +53 -0
  152. package/dist/resolver/policy.d.ts.map +1 -0
  153. package/dist/resolver/policy.js +99 -0
  154. package/dist/resolver/policy.js.map +1 -0
  155. package/dist/resolver/validation.d.ts +28 -0
  156. package/dist/resolver/validation.d.ts.map +1 -0
  157. package/dist/resolver/validation.js +96 -0
  158. package/dist/resolver/validation.js.map +1 -0
  159. package/dist/resolver.d.ts +18 -0
  160. package/dist/resolver.d.ts.map +1 -0
  161. package/dist/resolver.js +18 -0
  162. package/dist/resolver.js.map +1 -0
  163. package/dist/resolvers/cargo.d.ts +34 -0
  164. package/dist/resolvers/cargo.d.ts.map +1 -0
  165. package/dist/resolvers/cargo.js +262 -0
  166. package/dist/resolvers/cargo.js.map +1 -0
  167. package/dist/resolvers/css.d.ts +60 -0
  168. package/dist/resolvers/css.d.ts.map +1 -0
  169. package/dist/resolvers/css.js +531 -0
  170. package/dist/resolvers/css.js.map +1 -0
  171. package/dist/resolvers/dispatcher.d.ts +78 -0
  172. package/dist/resolvers/dispatcher.d.ts.map +1 -0
  173. package/dist/resolvers/dispatcher.js +290 -0
  174. package/dist/resolvers/dispatcher.js.map +1 -0
  175. package/dist/resolvers/dockerfile.d.ts +24 -0
  176. package/dist/resolvers/dockerfile.d.ts.map +1 -0
  177. package/dist/resolvers/dockerfile.js +221 -0
  178. package/dist/resolvers/dockerfile.js.map +1 -0
  179. package/dist/resolvers/dotenv.d.ts +27 -0
  180. package/dist/resolvers/dotenv.d.ts.map +1 -0
  181. package/dist/resolvers/dotenv.js +114 -0
  182. package/dist/resolvers/dotenv.js.map +1 -0
  183. package/dist/resolvers/imports.d.ts +63 -0
  184. package/dist/resolvers/imports.d.ts.map +1 -0
  185. package/dist/resolvers/imports.js +513 -0
  186. package/dist/resolvers/imports.js.map +1 -0
  187. package/dist/resolvers/json.d.ts +48 -0
  188. package/dist/resolvers/json.d.ts.map +1 -0
  189. package/dist/resolvers/json.js +363 -0
  190. package/dist/resolvers/json.js.map +1 -0
  191. package/dist/resolvers/lockfile-npm.d.ts +38 -0
  192. package/dist/resolvers/lockfile-npm.d.ts.map +1 -0
  193. package/dist/resolvers/lockfile-npm.js +267 -0
  194. package/dist/resolvers/lockfile-npm.js.map +1 -0
  195. package/dist/resolvers/lockfile-pnpm.d.ts +44 -0
  196. package/dist/resolvers/lockfile-pnpm.d.ts.map +1 -0
  197. package/dist/resolvers/lockfile-pnpm.js +277 -0
  198. package/dist/resolvers/lockfile-pnpm.js.map +1 -0
  199. package/dist/resolvers/lockfile-yarn.d.ts +40 -0
  200. package/dist/resolvers/lockfile-yarn.d.ts.map +1 -0
  201. package/dist/resolvers/lockfile-yarn.js +184 -0
  202. package/dist/resolvers/lockfile-yarn.js.map +1 -0
  203. package/dist/resolvers/markdown.d.ts +64 -0
  204. package/dist/resolvers/markdown.d.ts.map +1 -0
  205. package/dist/resolvers/markdown.js +335 -0
  206. package/dist/resolvers/markdown.js.map +1 -0
  207. package/dist/resolvers/vue.d.ts +65 -0
  208. package/dist/resolvers/vue.d.ts.map +1 -0
  209. package/dist/resolvers/vue.js +258 -0
  210. package/dist/resolvers/vue.js.map +1 -0
  211. package/dist/resolvers/yaml.d.ts +65 -0
  212. package/dist/resolvers/yaml.d.ts.map +1 -0
  213. package/dist/resolvers/yaml.js +405 -0
  214. package/dist/resolvers/yaml.js.map +1 -0
  215. package/dist/types.d.ts +256 -0
  216. package/dist/types.d.ts.map +1 -0
  217. package/dist/types.js +8 -0
  218. package/dist/types.js.map +1 -0
  219. 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"}