@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 @@
1
+ {"version":3,"file":"complex.d.ts","sourceRoot":"","sources":["../../src/patterns/complex.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAkC,aAAa,EAAE,MAAM,aAAa,CAAC;AAGjF,+DAA+D;AAC/D,QAAA,MAAM,OAAO,EAAE,aA2Bd,CAAC;AAEF,eAAe,OAAO,CAAC"}
@@ -0,0 +1,27 @@
1
+ import { makeScore } from "./utils.js";
2
+ /** Fallback — s'applique toujours, placé en fin de registre */
3
+ const complex = {
4
+ type: "complex",
5
+ priority: 999,
6
+ requires: "both",
7
+ detect(_h) {
8
+ return true; // always matches — unreachable guard
9
+ },
10
+ confidence(_h) {
11
+ return makeScore(100, 100, 0, [], [
12
+ "Aucune heuristique automatique applicable",
13
+ "Les deux branches ont modifié le bloc de façon incompatible",
14
+ ]);
15
+ },
16
+ explanation(_h) {
17
+ return "Conflit complexe nécessitant une résolution manuelle. Les deux branches ont modifié ce bloc différemment.";
18
+ },
19
+ passReason(_h) {
20
+ return "Aucun pattern automatique ne s'applique — résolution manuelle requise.";
21
+ },
22
+ failReason(_h) {
23
+ return ""; // ne peut pas échouer
24
+ },
25
+ };
26
+ export default complex;
27
+ //# sourceMappingURL=complex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"complex.js","sourceRoot":"","sources":["../../src/patterns/complex.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvC,+DAA+D;AAC/D,MAAM,OAAO,GAAkB;IAC7B,IAAI,EAAE,SAAS;IACf,QAAQ,EAAE,GAAG;IACb,QAAQ,EAAE,MAAM;IAEhB,MAAM,CAAC,EAAiB;QACtB,OAAO,IAAI,CAAC,CAAC,qCAAqC;IACpD,CAAC;IAED,UAAU,CAAC,EAAiB;QAC1B,OAAO,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE;YAChC,2CAA2C;YAC3C,6DAA6D;SAC9D,CAAC,CAAC;IACL,CAAC;IAED,WAAW,CAAC,EAAiB;QAC3B,OAAO,2GAA2G,CAAC;IACrH,CAAC;IAED,UAAU,CAAC,EAAiB;QAC1B,OAAO,wEAAwE,CAAC;IAClF,CAAC;IAED,UAAU,CAAC,EAAiB;QAC1B,OAAO,EAAE,CAAC,CAAC,sBAAsB;IACnC,CAAC;CACF,CAAC;AAEF,eAAe,OAAO,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { PatternPlugin } from "../types.js";
2
+ declare const deleteNoChange: PatternPlugin;
3
+ export default deleteNoChange;
4
+ //# sourceMappingURL=delete-no-change.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete-no-change.d.ts","sourceRoot":"","sources":["../../src/patterns/delete-no-change.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAkC,aAAa,EAAE,MAAM,aAAa,CAAC;AAGjF,QAAA,MAAM,cAAc,EAAE,aAgFrB,CAAC;AAEF,eAAe,cAAc,CAAC"}
@@ -0,0 +1,75 @@
1
+ import { makeScore } from "./utils.js";
2
+ const deleteNoChange = {
3
+ type: "delete_no_change",
4
+ priority: 20,
5
+ requires: "both",
6
+ detect(h) {
7
+ const hasBase = h.baseLines.length > 0;
8
+ if (hasBase) {
9
+ const baseText = h.baseLines.join("\n");
10
+ const oursText = h.oursLines.join("\n");
11
+ const theirsText = h.theirsLines.join("\n");
12
+ return ((h.oursLines.length === 0 && theirsText === baseText) ||
13
+ (h.theirsLines.length === 0 && oursText === baseText));
14
+ }
15
+ // diff2 fallback
16
+ return ((h.oursLines.length === 0 && h.theirsLines.length > 0) ||
17
+ (h.theirsLines.length === 0 && h.oursLines.length > 0));
18
+ },
19
+ confidence(h) {
20
+ const hasBase = h.baseLines.length > 0;
21
+ if (hasBase) {
22
+ const baseText = h.baseLines.join("\n");
23
+ const theirsText = h.theirsLines.join("\n");
24
+ const oursDeleted = h.oursLines.length === 0 && theirsText === baseText;
25
+ return makeScore(100, 5, 0, [
26
+ "Base disponible",
27
+ oursDeleted
28
+ ? "Ours a supprimé, theirs identique à la base"
29
+ : "Theirs a supprimé, ours identique à la base",
30
+ ], []);
31
+ }
32
+ return makeScore(60, 30, 0, [], [
33
+ "Sans base (diff2) — suppression non confirmée par rapport à l'ancêtre commun",
34
+ ]);
35
+ },
36
+ explanation(h) {
37
+ const hasBase = h.baseLines.length > 0;
38
+ if (hasBase) {
39
+ const baseText = h.baseLines.join("\n");
40
+ const theirsText = h.theirsLines.join("\n");
41
+ if (h.oursLines.length === 0 && theirsText === baseText) {
42
+ return "La branche courante (ours) a supprimé ce bloc, l'autre ne l'a pas modifié. Résolution : supprimer.";
43
+ }
44
+ return "La branche entrante (theirs) a supprimé ce bloc, l'autre ne l'a pas modifié. Résolution : supprimer.";
45
+ }
46
+ if (h.oursLines.length === 0) {
47
+ return "La branche courante (ours) a supprimé ce bloc. Sans base, confiance moyenne. Résolution proposée : supprimer.";
48
+ }
49
+ return "La branche entrante (theirs) a supprimé ce bloc. Sans base, confiance moyenne. Résolution proposée : supprimer.";
50
+ },
51
+ passReason(h) {
52
+ const hasBase = h.baseLines.length > 0;
53
+ if (hasBase) {
54
+ const baseText = h.baseLines.join("\n");
55
+ const theirsText = h.theirsLines.join("\n");
56
+ if (h.oursLines.length === 0 && theirsText === baseText) {
57
+ return "Ours a supprimé le bloc (0 lignes) et theirs n'a pas modifié la base.";
58
+ }
59
+ return "Theirs a supprimé le bloc (0 lignes) et ours n'a pas modifié la base.";
60
+ }
61
+ if (h.oursLines.length === 0) {
62
+ return "Ours est vide (0 lignes) en diff2. Suppression probable mais incertaine sans base.";
63
+ }
64
+ return "Theirs est vide (0 lignes) en diff2. Suppression probable mais incertaine sans base.";
65
+ },
66
+ failReason(h) {
67
+ const hasBase = h.baseLines.length > 0;
68
+ if (hasBase) {
69
+ return "Ni ours ni theirs n'est une suppression unilatérale avec l'autre côté identique à la base.";
70
+ }
71
+ return "Ni ours ni theirs n'est vide en diff2 — pas de suppression unilatérale évidente.";
72
+ },
73
+ };
74
+ export default deleteNoChange;
75
+ //# sourceMappingURL=delete-no-change.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete-no-change.js","sourceRoot":"","sources":["../../src/patterns/delete-no-change.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvC,MAAM,cAAc,GAAkB;IACpC,IAAI,EAAE,kBAAkB;IACxB,QAAQ,EAAE,EAAE;IACZ,QAAQ,EAAE,MAAM;IAEhB,MAAM,CAAC,CAAgB;QACrB,MAAM,OAAO,GAAG,CAAC,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;QACvC,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,QAAQ,GAAG,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACxC,MAAM,QAAQ,GAAG,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACxC,MAAM,UAAU,GAAG,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC5C,OAAO,CACL,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,IAAI,UAAU,KAAK,QAAQ,CAAC;gBACrD,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC,IAAI,QAAQ,KAAK,QAAQ,CAAC,CACtD,CAAC;QACJ,CAAC;QACD,iBAAiB;QACjB,OAAO,CACL,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC;YACtD,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CACvD,CAAC;IACJ,CAAC;IAED,UAAU,CAAC,CAAgB;QACzB,MAAM,OAAO,GAAG,CAAC,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;QACvC,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,QAAQ,GAAG,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACxC,MAAM,UAAU,GAAG,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC5C,MAAM,WAAW,GAAG,CAAC,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,IAAI,UAAU,KAAK,QAAQ,CAAC;YACxE,OAAO,SAAS,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE;gBAC1B,iBAAiB;gBACjB,WAAW;oBACT,CAAC,CAAC,6CAA6C;oBAC/C,CAAC,CAAC,6CAA6C;aAClD,EAAE,EAAE,CAAC,CAAC;QACT,CAAC;QACD,OAAO,SAAS,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE;YAC9B,8EAA8E;SAC/E,CAAC,CAAC;IACL,CAAC;IAED,WAAW,CAAC,CAAgB;QAC1B,MAAM,OAAO,GAAG,CAAC,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;QACvC,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,QAAQ,GAAG,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACxC,MAAM,UAAU,GAAG,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC5C,IAAI,CAAC,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,IAAI,UAAU,KAAK,QAAQ,EAAE,CAAC;gBACxD,OAAO,oGAAoG,CAAC;YAC9G,CAAC;YACD,OAAO,sGAAsG,CAAC;QAChH,CAAC;QACD,IAAI,CAAC,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7B,OAAO,+GAA+G,CAAC;QACzH,CAAC;QACD,OAAO,iHAAiH,CAAC;IAC3H,CAAC;IAED,UAAU,CAAC,CAAgB;QACzB,MAAM,OAAO,GAAG,CAAC,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;QACvC,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,QAAQ,GAAG,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACxC,MAAM,UAAU,GAAG,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC5C,IAAI,CAAC,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,IAAI,UAAU,KAAK,QAAQ,EAAE,CAAC;gBACxD,OAAO,uEAAuE,CAAC;YACjF,CAAC;YACD,OAAO,uEAAuE,CAAC;QACjF,CAAC;QACD,IAAI,CAAC,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7B,OAAO,oFAAoF,CAAC;QAC9F,CAAC;QACD,OAAO,sFAAsF,CAAC;IAChG,CAAC;IAED,UAAU,CAAC,CAAgB;QACzB,MAAM,OAAO,GAAG,CAAC,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;QACvC,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,4FAA4F,CAAC;QACtG,CAAC;QACD,OAAO,kFAAkF,CAAC;IAC5F,CAAC;CACF,CAAC;AAEF,eAAe,cAAc,CAAC"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Pattern `insertion_at_boundary` — v1.4
3
+ *
4
+ * Détecte les conflits où les deux branches ont uniquement ajouté des lignes
5
+ * par rapport à la base — sans suppression ni modification.
6
+ * Inspiré du comportement ORT merge (Git 2.34+).
7
+ *
8
+ * Cas typiques : liste de dépendances, tableau de routes, définitions d'enum,
9
+ * listes d'exports dans des fichiers partagés.
10
+ *
11
+ * Priority : 57 (après reorder_only, avant value_only_change)
12
+ * Requires : both (diff3 = haute confiance, diff2 = heuristique, confiance réduite)
13
+ *
14
+ * Relation avec non_overlapping (priority 40) :
15
+ * - non_overlapping traite les cas où le LCS 3-way merge réussit directement
16
+ * - insertion_at_boundary traite les cas où les insertions tombent au MÊME
17
+ * point de frontière (le LCS échoue) mais l'analyse sémantique réussit
18
+ */
19
+ import type { PatternPlugin } from "../types.js";
20
+ declare const insertionAtBoundary: PatternPlugin;
21
+ export default insertionAtBoundary;
22
+ //# sourceMappingURL=insertion-at-boundary.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"insertion-at-boundary.d.ts","sourceRoot":"","sources":["../../src/patterns/insertion-at-boundary.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAkC,aAAa,EAAE,MAAM,aAAa,CAAC;AAoGjF,QAAA,MAAM,mBAAmB,EAAE,aA6D1B,CAAC;AAEF,eAAe,mBAAmB,CAAC"}
@@ -0,0 +1,164 @@
1
+ /**
2
+ * Pattern `insertion_at_boundary` — v1.4
3
+ *
4
+ * Détecte les conflits où les deux branches ont uniquement ajouté des lignes
5
+ * par rapport à la base — sans suppression ni modification.
6
+ * Inspiré du comportement ORT merge (Git 2.34+).
7
+ *
8
+ * Cas typiques : liste de dépendances, tableau de routes, définitions d'enum,
9
+ * listes d'exports dans des fichiers partagés.
10
+ *
11
+ * Priority : 57 (après reorder_only, avant value_only_change)
12
+ * Requires : both (diff3 = haute confiance, diff2 = heuristique, confiance réduite)
13
+ *
14
+ * Relation avec non_overlapping (priority 40) :
15
+ * - non_overlapping traite les cas où le LCS 3-way merge réussit directement
16
+ * - insertion_at_boundary traite les cas où les insertions tombent au MÊME
17
+ * point de frontière (le LCS échoue) mais l'analyse sémantique réussit
18
+ */
19
+ import { scopeImpact, makeScore, normalizeLine } from "./utils.js";
20
+ // ─── LCS helpers ─────────────────────────────────────────────
21
+ /**
22
+ * Calcule la Longest Common Subsequence entre deux tableaux de lignes.
23
+ * Retourne les indices des lignes de `a` qui sont dans le LCS.
24
+ */
25
+ function lcsIndices(a, b) {
26
+ const m = a.length;
27
+ const n = b.length;
28
+ // dp[i][j] = longueur du LCS de a[0..i-1] et b[0..j-1]
29
+ const dp = Array.from({ length: m + 1 }, () => new Array(n + 1).fill(0));
30
+ for (let i = 1; i <= m; i++) {
31
+ for (let j = 1; j <= n; j++) {
32
+ dp[i][j] = a[i - 1] === b[j - 1]
33
+ ? dp[i - 1][j - 1] + 1
34
+ : Math.max(dp[i - 1][j], dp[i][j - 1]);
35
+ }
36
+ }
37
+ // Backtrack pour récupérer les indices dans `a`
38
+ const inLcs = new Set();
39
+ let i = m;
40
+ let j = n;
41
+ while (i > 0 && j > 0) {
42
+ if (a[i - 1] === b[j - 1]) {
43
+ inLcs.add(i - 1);
44
+ i--;
45
+ j--;
46
+ }
47
+ else if (dp[i - 1][j] > dp[i][j - 1]) {
48
+ i--;
49
+ }
50
+ else {
51
+ j--;
52
+ }
53
+ }
54
+ return inLcs;
55
+ }
56
+ /**
57
+ * Retourne les lignes de `modified` qui ne sont pas dans le LCS avec `base`.
58
+ * Ces lignes sont les "additions" par rapport à la base.
59
+ */
60
+ function lcsAdditions(base, modified) {
61
+ const lcs = lcsIndices(modified, base); // indices dans modified qui sont dans le LCS
62
+ return modified.filter((_, i) => !lcs.has(i));
63
+ }
64
+ /**
65
+ * Retourne les lignes de `base` qui ne sont plus dans `modified`.
66
+ * Ces lignes sont les "suppressions" par rapport à la base.
67
+ */
68
+ function lcsRemovals(base, modified) {
69
+ const lcs = lcsIndices(base, modified); // indices dans base qui sont dans le LCS
70
+ return base.filter((_, i) => !lcs.has(i));
71
+ }
72
+ /** Vérifie si deux tableaux ont des éléments communs */
73
+ function hasOverlap(a, b) {
74
+ const setA = new Set(a);
75
+ return b.some((l) => setA.has(l));
76
+ }
77
+ // ─── Heuristique diff2 ────────────────────────────────────────
78
+ /**
79
+ * En l'absence de base (diff2), on vérifie que les deux côtés sont
80
+ * des sur-ensembles l'un de l'autre (union sans suppression).
81
+ */
82
+ /**
83
+ * Heuristique diff2 stricte : détecte uniquement le cas où un côté est
84
+ * un sous-ensemble de l'autre (tailles différentes).
85
+ * Exemple valide : ours = [A, B, C, NEW] et theirs = [A, B, C]
86
+ * → theirs est un sous-ensemble de ours → ours a inséré NEW.
87
+ *
88
+ * NON applicable quand les deux côtés ont la même taille (cas value_only_change)
89
+ * ou quand les lignes ne sont pas comparables par inclusion.
90
+ */
91
+ function detectWithoutBase(h) {
92
+ const oursNorm = h.oursLines.map(normalizeLine).filter((l) => l.length > 0);
93
+ const theirsNorm = h.theirsLines.map(normalizeLine).filter((l) => l.length > 0);
94
+ if (oursNorm.length === 0 || theirsNorm.length === 0)
95
+ return false;
96
+ if (oursNorm.join("\n") === theirsNorm.join("\n"))
97
+ return false;
98
+ const oursSet = new Set(oursNorm);
99
+ const theirsSet = new Set(theirsNorm);
100
+ // Les tailles doivent différer : un côté a plus de lignes que l'autre
101
+ if (oursSet.size === theirsSet.size)
102
+ return false;
103
+ // Le plus petit doit être un sous-ensemble du plus grand
104
+ if (oursSet.size < theirsSet.size) {
105
+ return [...oursSet].every((l) => theirsSet.has(l));
106
+ }
107
+ else {
108
+ return [...theirsSet].every((l) => oursSet.has(l));
109
+ }
110
+ }
111
+ // ─── Plugin ──────────────────────────────────────────────────
112
+ const insertionAtBoundary = {
113
+ type: "insertion_at_boundary",
114
+ priority: 57,
115
+ requires: "both",
116
+ detect(h) {
117
+ const hasBase = h.baseLines.length > 0;
118
+ if (!hasBase) {
119
+ return detectWithoutBase(h);
120
+ }
121
+ // diff3 : vérifier qu'il n'y a que des ajouts (pas de suppressions)
122
+ const oursRemovals = lcsRemovals(h.baseLines, h.oursLines);
123
+ const theirsRemovals = lcsRemovals(h.baseLines, h.theirsLines);
124
+ const oursAdded = lcsAdditions(h.baseLines, h.oursLines);
125
+ const theirsAdded = lcsAdditions(h.baseLines, h.theirsLines);
126
+ return (oursRemovals.length === 0 &&
127
+ theirsRemovals.length === 0 &&
128
+ oursAdded.length > 0 &&
129
+ theirsAdded.length > 0 &&
130
+ !hasOverlap(oursAdded, theirsAdded));
131
+ },
132
+ confidence(h) {
133
+ const hasBase = h.baseLines.length > 0;
134
+ const totalLines = Math.max(h.oursLines.length, h.theirsLines.length);
135
+ if (hasBase) {
136
+ return makeScore(90, 8, scopeImpact(totalLines), [
137
+ "Insertions pures — base intacte des deux côtés",
138
+ ], []);
139
+ }
140
+ return makeScore(68, 20, scopeImpact(totalLines), [], [
141
+ "Sans base (diff2) — heuristique d'union (−22)",
142
+ ]);
143
+ },
144
+ explanation(h) {
145
+ const hasBase = h.baseLines.length > 0;
146
+ return hasBase
147
+ ? "Les deux branches ont uniquement ajouté des lignes sans modifier la base. Résolution : union des insertions (ours en premier)."
148
+ : "Les deux branches semblent avoir uniquement ajouté des lignes (heuristique diff2). Résolution : union (ours en premier).";
149
+ },
150
+ passReason(h) {
151
+ const hasBase = h.baseLines.length > 0;
152
+ return hasBase
153
+ ? "Aucune suppression des deux côtés, insertions distinctes — insertions pures confirmées par la base."
154
+ : "Heuristique diff2 : les deux côtés sont des sur-ensembles l'un de l'autre.";
155
+ },
156
+ failReason(h) {
157
+ const hasBase = h.baseLines.length > 0;
158
+ return hasBase
159
+ ? "Au moins un côté a des suppressions ou des insertions qui se chevauchent."
160
+ : "La heuristique diff2 d'union échoue — des lignes sont présentes d'un côté mais absentes de l'autre de façon asymétrique.";
161
+ },
162
+ };
163
+ export default insertionAtBoundary;
164
+ //# sourceMappingURL=insertion-at-boundary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"insertion-at-boundary.js","sourceRoot":"","sources":["../../src/patterns/insertion-at-boundary.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { PatternPlugin } from "../types.js";
2
+ declare const nonOverlapping: PatternPlugin;
3
+ export default nonOverlapping;
4
+ //# sourceMappingURL=non-overlapping.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"non-overlapping.d.ts","sourceRoot":"","sources":["../../src/patterns/non-overlapping.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAkC,aAAa,EAAE,MAAM,aAAa,CAAC;AAIjF,QAAA,MAAM,cAAc,EAAE,aA4BrB,CAAC;AAEF,eAAe,cAAc,CAAC"}
@@ -0,0 +1,28 @@
1
+ import { mergeNonOverlapping } from "../diff.js";
2
+ import { scopeImpact, makeScore } from "./utils.js";
3
+ const nonOverlapping = {
4
+ type: "non_overlapping",
5
+ priority: 40,
6
+ requires: "diff3",
7
+ detect(h) {
8
+ return mergeNonOverlapping(h.baseLines, h.oursLines, h.theirsLines) !== null;
9
+ },
10
+ confidence(h) {
11
+ const mergedSize = Math.max(h.oursLines.length, h.theirsLines.length);
12
+ return makeScore(90, 20, scopeImpact(mergedSize), [
13
+ "Base disponible",
14
+ "Merge LCS 3-way réussi sans chevauchement",
15
+ ], []);
16
+ },
17
+ explanation(_h) {
18
+ return "Les deux branches ont modifié des zones différentes du même bloc. Fusion automatique possible.";
19
+ },
20
+ passReason(_h) {
21
+ return "Le merge 3-way LCS a réussi sans conflit — les modifications ne se chevauchent pas.";
22
+ },
23
+ failReason(_h) {
24
+ return "Le merge 3-way LCS détecte un chevauchement — les deux branches ont modifié les mêmes lignes.";
25
+ },
26
+ };
27
+ export default nonOverlapping;
28
+ //# sourceMappingURL=non-overlapping.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"non-overlapping.js","sourceRoot":"","sources":["../../src/patterns/non-overlapping.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEpD,MAAM,cAAc,GAAkB;IACpC,IAAI,EAAE,iBAAiB;IACvB,QAAQ,EAAE,EAAE;IACZ,QAAQ,EAAE,OAAO;IAEjB,MAAM,CAAC,CAAgB;QACrB,OAAO,mBAAmB,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,WAAW,CAAC,KAAK,IAAI,CAAC;IAC/E,CAAC;IAED,UAAU,CAAC,CAAgB;QACzB,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QACtE,OAAO,SAAS,CAAC,EAAE,EAAE,EAAE,EAAE,WAAW,CAAC,UAAU,CAAC,EAAE;YAChD,iBAAiB;YACjB,2CAA2C;SAC5C,EAAE,EAAE,CAAC,CAAC;IACT,CAAC;IAED,WAAW,CAAC,EAAiB;QAC3B,OAAO,gGAAgG,CAAC;IAC1G,CAAC;IAED,UAAU,CAAC,EAAiB;QAC1B,OAAO,qFAAqF,CAAC;IAC/F,CAAC;IAED,UAAU,CAAC,EAAiB;QAC1B,OAAO,+FAA+F,CAAC;IACzG,CAAC;CACF,CAAC;AAEF,eAAe,cAAc,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { PatternPlugin } from "../types.js";
2
+ declare const oneSideChange: PatternPlugin;
3
+ export default oneSideChange;
4
+ //# sourceMappingURL=one-side-change.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"one-side-change.d.ts","sourceRoot":"","sources":["../../src/patterns/one-side-change.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAkC,aAAa,EAAE,MAAM,aAAa,CAAC;AAGjF,QAAA,MAAM,aAAa,EAAE,aA8CpB,CAAC;AAEF,eAAe,aAAa,CAAC"}
@@ -0,0 +1,45 @@
1
+ import { scopeImpact, makeScore } from "./utils.js";
2
+ const oneSideChange = {
3
+ type: "one_side_change",
4
+ priority: 30,
5
+ requires: "diff3",
6
+ detect(h) {
7
+ const baseText = h.baseLines.join("\n");
8
+ const oursText = h.oursLines.join("\n");
9
+ const theirsText = h.theirsLines.join("\n");
10
+ const oursMatchesBase = oursText === baseText;
11
+ const theirsMatchesBase = theirsText === baseText;
12
+ return (oursMatchesBase && !theirsMatchesBase) || (!oursMatchesBase && theirsMatchesBase);
13
+ },
14
+ confidence(h) {
15
+ const baseText = h.baseLines.join("\n");
16
+ const oursText = h.oursLines.join("\n");
17
+ const oursMatchesBase = oursText === baseText;
18
+ const changedLines = oursMatchesBase ? h.theirsLines.length : h.oursLines.length;
19
+ return makeScore(100, 0, scopeImpact(changedLines), [
20
+ "Base disponible",
21
+ oursMatchesBase ? "Seul theirs a modifié le bloc" : "Seul ours a modifié le bloc",
22
+ ], []);
23
+ },
24
+ explanation(h) {
25
+ const oursText = h.oursLines.join("\n");
26
+ const baseText = h.baseLines.join("\n");
27
+ if (oursText === baseText) {
28
+ return "Seule la branche entrante (theirs) a modifié ce bloc. Résolution : accepter theirs.";
29
+ }
30
+ return "Seule la branche courante (ours) a modifié ce bloc. Résolution : accepter ours.";
31
+ },
32
+ passReason(h) {
33
+ const oursText = h.oursLines.join("\n");
34
+ const baseText = h.baseLines.join("\n");
35
+ if (oursText === baseText) {
36
+ return "Ours est identique à la base, seul theirs a changé.";
37
+ }
38
+ return "Theirs est identique à la base, seul ours a changé.";
39
+ },
40
+ failReason(_h) {
41
+ return "Les deux branches ont modifié le bloc par rapport à la base.";
42
+ },
43
+ };
44
+ export default oneSideChange;
45
+ //# sourceMappingURL=one-side-change.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"one-side-change.js","sourceRoot":"","sources":["../../src/patterns/one-side-change.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEpD,MAAM,aAAa,GAAkB;IACnC,IAAI,EAAE,iBAAiB;IACvB,QAAQ,EAAE,EAAE;IACZ,QAAQ,EAAE,OAAO;IAEjB,MAAM,CAAC,CAAgB;QACrB,MAAM,QAAQ,GAAG,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxC,MAAM,QAAQ,GAAG,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxC,MAAM,UAAU,GAAG,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5C,MAAM,eAAe,GAAG,QAAQ,KAAK,QAAQ,CAAC;QAC9C,MAAM,iBAAiB,GAAG,UAAU,KAAK,QAAQ,CAAC;QAClD,OAAO,CAAC,eAAe,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,eAAe,IAAI,iBAAiB,CAAC,CAAC;IAC5F,CAAC;IAED,UAAU,CAAC,CAAgB;QACzB,MAAM,QAAQ,GAAG,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxC,MAAM,QAAQ,GAAG,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxC,MAAM,eAAe,GAAG,QAAQ,KAAK,QAAQ,CAAC;QAC9C,MAAM,YAAY,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC;QACjF,OAAO,SAAS,CAAC,GAAG,EAAE,CAAC,EAAE,WAAW,CAAC,YAAY,CAAC,EAAE;YAClD,iBAAiB;YACjB,eAAe,CAAC,CAAC,CAAC,+BAA+B,CAAC,CAAC,CAAC,6BAA6B;SAClF,EAAE,EAAE,CAAC,CAAC;IACT,CAAC;IAED,WAAW,CAAC,CAAgB;QAC1B,MAAM,QAAQ,GAAG,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxC,MAAM,QAAQ,GAAG,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxC,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAC1B,OAAO,qFAAqF,CAAC;QAC/F,CAAC;QACD,OAAO,iFAAiF,CAAC;IAC3F,CAAC;IAED,UAAU,CAAC,CAAgB;QACzB,MAAM,QAAQ,GAAG,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxC,MAAM,QAAQ,GAAG,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxC,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAC1B,OAAO,qDAAqD,CAAC;QAC/D,CAAC;QACD,OAAO,qDAAqD,CAAC;IAC/D,CAAC;IAED,UAAU,CAAC,EAAiB;QAC1B,OAAO,8DAA8D,CAAC;IACxE,CAAC;CACF,CAAC;AAEF,eAAe,aAAa,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Pattern `reorder_only` — v1.4
3
+ *
4
+ * Détecte les conflits où les deux branches contiennent exactement les mêmes
5
+ * lignes mais dans un ordre différent. Cas typiques : imports triés
6
+ * alphabétiquement, clés de config réorganisées, listes d'exports réordonnées.
7
+ *
8
+ * Priority : 55 (après whitespace_only, avant value_only_change)
9
+ * Requires : both (fonctionne avec ou sans base)
10
+ */
11
+ import type { PatternPlugin } from "../types.js";
12
+ declare const reorderOnly: PatternPlugin;
13
+ export default reorderOnly;
14
+ //# sourceMappingURL=reorder-only.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reorder-only.d.ts","sourceRoot":"","sources":["../../src/patterns/reorder-only.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAkC,aAAa,EAAE,MAAM,aAAa,CAAC;AA+BjF,QAAA,MAAM,WAAW,EAAE,aA8ClB,CAAC;AAEF,eAAe,WAAW,CAAC"}
@@ -0,0 +1,81 @@
1
+ /**
2
+ * Pattern `reorder_only` — v1.4
3
+ *
4
+ * Détecte les conflits où les deux branches contiennent exactement les mêmes
5
+ * lignes mais dans un ordre différent. Cas typiques : imports triés
6
+ * alphabétiquement, clés de config réorganisées, listes d'exports réordonnées.
7
+ *
8
+ * Priority : 55 (après whitespace_only, avant value_only_change)
9
+ * Requires : both (fonctionne avec ou sans base)
10
+ */
11
+ import { scopeImpact, makeScore, normalizeLine } from "./utils.js";
12
+ // ─── Helpers ─────────────────────────────────────────────────
13
+ /**
14
+ * Vérifie si deux tableaux sont des multisets égaux (même éléments, peu importe l'ordre).
15
+ * Gère correctement les lignes dupliquées.
16
+ */
17
+ function isMultisetEqual(a, b) {
18
+ if (a.length !== b.length)
19
+ return false;
20
+ const freq = new Map();
21
+ for (const l of a)
22
+ freq.set(l, (freq.get(l) ?? 0) + 1);
23
+ for (const l of b) {
24
+ const n = freq.get(l);
25
+ if (!n)
26
+ return false;
27
+ n === 1 ? freq.delete(l) : freq.set(l, n - 1);
28
+ }
29
+ return freq.size === 0;
30
+ }
31
+ /**
32
+ * Compte les lignes dupliquées dans un tableau normalisé.
33
+ * Retourne vrai si au moins une ligne apparaît plus d'une fois.
34
+ */
35
+ function hasDuplicates(lines) {
36
+ return new Set(lines).size !== lines.length;
37
+ }
38
+ // ─── Plugin ──────────────────────────────────────────────────
39
+ const reorderOnly = {
40
+ type: "reorder_only",
41
+ priority: 55,
42
+ requires: "both",
43
+ detect(h) {
44
+ const ours = h.oursLines.map(normalizeLine).filter((l) => l.length > 0);
45
+ const theirs = h.theirsLines.map(normalizeLine).filter((l) => l.length > 0);
46
+ if (ours.length === 0 || theirs.length === 0)
47
+ return false;
48
+ // Les deux listes doivent être des permutations l'une de l'autre
49
+ // mais pas identiques (same_change aurait déjà matchéi)
50
+ if (ours.join("\n") === theirs.join("\n"))
51
+ return false;
52
+ return isMultisetEqual(ours, theirs);
53
+ },
54
+ confidence(h) {
55
+ const ours = h.oursLines.map(normalizeLine).filter((l) => l.length > 0);
56
+ const duplicates = hasDuplicates(ours);
57
+ const si = scopeImpact(h.oursLines.length);
58
+ const boosters = ["Permutation pure — mêmes lignes, ordre différent"];
59
+ const penalties = [];
60
+ if (duplicates) {
61
+ penalties.push("Lignes dupliquées — ordre ambigu (−10)");
62
+ }
63
+ // typeClassification 92 sauf si doublons (−10 → 82)
64
+ const tc = duplicates ? 82 : 92;
65
+ return makeScore(tc, 5, si, boosters, penalties);
66
+ },
67
+ explanation(h) {
68
+ const hasBase = h.baseLines.length > 0;
69
+ return hasBase
70
+ ? "Les deux branches contiennent les mêmes lignes dans un ordre différent. Résolution : accepter l'ordre theirs (ou ours si la base correspond à theirs)."
71
+ : "Les deux branches contiennent les mêmes lignes dans un ordre différent. Résolution : accepter l'ordre theirs.";
72
+ },
73
+ passReason(_h) {
74
+ return "Les deux côtés sont des permutations l'un de l'autre — mêmes lignes, ordre différent.";
75
+ },
76
+ failReason(_h) {
77
+ return "Les lignes ne sont pas une simple permutation — des ajouts ou suppressions sont présents.";
78
+ },
79
+ };
80
+ export default reorderOnly;
81
+ //# sourceMappingURL=reorder-only.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reorder-only.js","sourceRoot":"","sources":["../../src/patterns/reorder-only.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { PatternPlugin } from "../types.js";
2
+ declare const sameChange: PatternPlugin;
3
+ export default sameChange;
4
+ //# sourceMappingURL=same-change.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"same-change.d.ts","sourceRoot":"","sources":["../../src/patterns/same-change.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAkC,aAAa,EAAE,MAAM,aAAa,CAAC;AAGjF,QAAA,MAAM,UAAU,EAAE,aA0BjB,CAAC;AAEF,eAAe,UAAU,CAAC"}
@@ -0,0 +1,25 @@
1
+ import { scopeImpact, makeScore } from "./utils.js";
2
+ const sameChange = {
3
+ type: "same_change",
4
+ priority: 10,
5
+ requires: "both",
6
+ detect(h) {
7
+ return h.oursLines.join("\n") === h.theirsLines.join("\n");
8
+ },
9
+ confidence(h) {
10
+ return makeScore(100, 0, scopeImpact(h.oursLines.length), [
11
+ "Les deux branches ont exactement le même contenu",
12
+ ], []);
13
+ },
14
+ explanation(_h) {
15
+ return "Les deux branches ont effectué exactement la même modification.";
16
+ },
17
+ passReason(_h) {
18
+ return "Les deux branches ont exactement le même contenu — modification identique des deux côtés.";
19
+ },
20
+ failReason(_h) {
21
+ return "Les deux branches ont des contenus différents.";
22
+ },
23
+ };
24
+ export default sameChange;
25
+ //# sourceMappingURL=same-change.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"same-change.js","sourceRoot":"","sources":["../../src/patterns/same-change.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEpD,MAAM,UAAU,GAAkB;IAChC,IAAI,EAAE,aAAa;IACnB,QAAQ,EAAE,EAAE;IACZ,QAAQ,EAAE,MAAM;IAEhB,MAAM,CAAC,CAAgB;QACrB,OAAO,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7D,CAAC;IAED,UAAU,CAAC,CAAgB;QACzB,OAAO,SAAS,CAAC,GAAG,EAAE,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE;YACxD,kDAAkD;SACnD,EAAE,EAAE,CAAC,CAAC;IACT,CAAC;IAED,WAAW,CAAC,EAAiB;QAC3B,OAAO,iEAAiE,CAAC;IAC3E,CAAC;IAED,UAAU,CAAC,EAAiB;QAC1B,OAAO,2FAA2F,CAAC;IACrG,CAAC;IAED,UAAU,CAAC,EAAiB;QAC1B,OAAO,gDAAgD,CAAC;IAC1D,CAAC;CACF,CAAC;AAEF,eAAe,UAAU,CAAC"}