@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
package/dist/diff.js ADDED
@@ -0,0 +1,328 @@
1
+ /**
2
+ * GitWand Diff Utilities
3
+ *
4
+ * Algorithme LCS (Longest Common Subsequence) et 3-way merge
5
+ * pour détecter et fusionner les changements non-overlapping.
6
+ */
7
+ /**
8
+ * Seuil au-delà duquel on bascule sur Hirschberg (mémoire O(min(n,m))) au lieu
9
+ * du DP plein (mémoire O(n*m)). À 4M cellules → ~16MB avec un Int32Array, déjà
10
+ * lourd en mémoire mais tolérable en pic. Au-dessus, Hirschberg est obligatoire
11
+ * pour éviter un OOM sur les gros fichiers (lockfiles, bundles minifiés…).
12
+ */
13
+ const HIRSCHBERG_THRESHOLD = 4_000_000;
14
+ /**
15
+ * Calcule la Longest Common Subsequence entre deux tableaux de lignes.
16
+ * Retourne les indices des lignes communes dans chaque tableau.
17
+ *
18
+ * Stratégie hybride (P2.1) :
19
+ * - petit/moyen (n*m ≤ 4M cellules) → DP plein O(n*m) avec `Int32Array`
20
+ * (4 octets/cellule vs 8-16 octets pour des `number[][]`) ;
21
+ * - gros → Hirschberg récursif, mémoire O(min(n,m)) + O(log n) de pile.
22
+ *
23
+ * Le comportement observable (tie-break, pairs retournées) est identique entre
24
+ * les deux branches — voir `src/__tests__/diff.test.ts`.
25
+ */
26
+ export function lcs(a, b) {
27
+ const n = a.length;
28
+ const m = b.length;
29
+ if (n === 0 || m === 0)
30
+ return [];
31
+ if (n * m <= HIRSCHBERG_THRESHOLD) {
32
+ return lcsDenseDP(a, b);
33
+ }
34
+ return lcsHirschberg(a, b);
35
+ }
36
+ /**
37
+ * DP plein avec `Int32Array` (mémoire compacte, 4 octets/cellule).
38
+ * Équivalent structurel à l'implémentation historique — même tie-break,
39
+ * mêmes paires retournées.
40
+ */
41
+ function lcsDenseDP(a, b) {
42
+ const n = a.length;
43
+ const m = b.length;
44
+ const W = m + 1;
45
+ // Table DP aplatie : dp[i*W + j] ≡ dp[i][j].
46
+ const dp = new Int32Array((n + 1) * W);
47
+ for (let i = 1; i <= n; i++) {
48
+ const row = i * W;
49
+ const prev = (i - 1) * W;
50
+ for (let j = 1; j <= m; j++) {
51
+ if (a[i - 1] === b[j - 1]) {
52
+ dp[row + j] = dp[prev + (j - 1)] + 1;
53
+ }
54
+ else {
55
+ const up = dp[prev + j];
56
+ const left = dp[row + (j - 1)];
57
+ dp[row + j] = up > left ? up : left;
58
+ }
59
+ }
60
+ }
61
+ // Backtrack : mêmes règles de tie-break que l'implémentation historique.
62
+ const result = [];
63
+ let i = n;
64
+ let j = m;
65
+ while (i > 0 && j > 0) {
66
+ if (a[i - 1] === b[j - 1]) {
67
+ result.push([i - 1, j - 1]);
68
+ i--;
69
+ j--;
70
+ }
71
+ else if (dp[(i - 1) * W + j] > dp[i * W + (j - 1)]) {
72
+ i--;
73
+ }
74
+ else {
75
+ j--;
76
+ }
77
+ }
78
+ result.reverse();
79
+ return result;
80
+ }
81
+ /**
82
+ * Implémentation Hirschberg exposée pour les tests (et usage avancé éventuel).
83
+ * L'API publique `lcs()` choisit automatiquement entre cette variante et le DP
84
+ * plein selon la taille de l'input. Exporter sous le préfixe `_` signale son
85
+ * caractère d'interne-testable.
86
+ */
87
+ export const _lcsHirschberg = (a, b) => lcsHirschberg(a, b);
88
+ /**
89
+ * Hirschberg : divide-and-conquer qui trouve le point de split optimal dans `a`
90
+ * en utilisant seulement 2 lignes de DP (mémoire O(min(n,m))), puis recurse sur
91
+ * les deux moitiés. Les paires LCS retournées peuvent différer de celles du DP
92
+ * plein **sur les ties**, mais la longueur et la validité sont garanties.
93
+ *
94
+ * Stratégie pour rester iso-comportement avec `lcsDenseDP` :
95
+ * - Sous un petit seuil de récursion (`n ≤ 2` ou `m ≤ 2`), on tombe sur des
96
+ * cas triviaux résolus directement (même tie-break que le DP plein).
97
+ * - Le split choisit le `j*` qui maximise `scoreL[j] + scoreR[m - j]`, et en
98
+ * cas d'ex-æquo on prend le **plus petit** `j*` (équivalent au tie-break
99
+ * "j-- d'abord" du backtrack historique).
100
+ */
101
+ function lcsHirschberg(a, b) {
102
+ const n = a.length;
103
+ const m = b.length;
104
+ // Cas de base : une seule ligne à gauche → chercher la première occurrence.
105
+ if (n === 0 || m === 0)
106
+ return [];
107
+ if (n === 1) {
108
+ const target = a[0];
109
+ for (let j = 0; j < m; j++) {
110
+ if (b[j] === target)
111
+ return [[0, j]];
112
+ }
113
+ return [];
114
+ }
115
+ const mid = n >> 1; // n / 2 floor
116
+ // Scores DP pour a[0..mid] contre b (forward), longueur m+1.
117
+ const scoreL = lcsScoreRow(a, 0, mid, b, 0, m, false);
118
+ // Scores DP pour a[mid..n] contre b (reverse), longueur m+1.
119
+ const scoreR = lcsScoreRow(a, mid, n, b, 0, m, true);
120
+ // Trouver le j* qui maximise scoreL[j] + scoreR[m - j].
121
+ // En cas d'ex-æquo, on prend le plus petit j pour rester proche du tie-break
122
+ // historique (backtrack « j-- en premier » ≈ préférer les splits « early »).
123
+ let bestJ = 0;
124
+ let bestScore = scoreL[0] + scoreR[m];
125
+ for (let j = 1; j <= m; j++) {
126
+ const s = scoreL[j] + scoreR[m - j];
127
+ if (s > bestScore) {
128
+ bestScore = s;
129
+ bestJ = j;
130
+ }
131
+ }
132
+ // Récursion + ajustement des indices pour la moitié droite.
133
+ const left = lcsHirschberg(a.slice(0, mid), b.slice(0, bestJ));
134
+ const rightRaw = lcsHirschberg(a.slice(mid), b.slice(bestJ));
135
+ const right = rightRaw.map(([i, j]) => [i + mid, j + bestJ]);
136
+ return left.concat(right);
137
+ }
138
+ /**
139
+ * Calcule la dernière ligne du tableau DP LCS en 2 lignes (mémoire O(m+1)).
140
+ *
141
+ * @param a - tableau source pour la dimension « rows »
142
+ * @param aStart - début (inclus) dans a
143
+ * @param aEnd - fin (exclus) dans a
144
+ * @param b - tableau source pour la dimension « cols »
145
+ * @param bStart - début (inclus) dans b
146
+ * @param bEnd - fin (exclus) dans b
147
+ * @param reverse - si true, parcourt a et b à l'envers (pour Hirschberg)
148
+ */
149
+ function lcsScoreRow(a, aStart, aEnd, b, bStart, bEnd, reverse) {
150
+ const n = aEnd - aStart;
151
+ const m = bEnd - bStart;
152
+ let prev = new Int32Array(m + 1);
153
+ let curr = new Int32Array(m + 1);
154
+ for (let i = 1; i <= n; i++) {
155
+ const ai = reverse ? a[aEnd - i] : a[aStart + i - 1];
156
+ for (let j = 1; j <= m; j++) {
157
+ const bj = reverse ? b[bEnd - j] : b[bStart + j - 1];
158
+ if (ai === bj) {
159
+ curr[j] = prev[j - 1] + 1;
160
+ }
161
+ else {
162
+ const up = prev[j];
163
+ const left = curr[j - 1];
164
+ curr[j] = up > left ? up : left;
165
+ }
166
+ }
167
+ // Swap prev ↔ curr (éviter une réallocation)
168
+ const tmp = prev;
169
+ prev = curr;
170
+ curr = tmp;
171
+ // Reset curr à 0 pour la prochaine itération
172
+ curr.fill(0);
173
+ }
174
+ // Après la boucle, la dernière ligne calculée est dans `prev`.
175
+ return prev;
176
+ }
177
+ /**
178
+ * Calcule le diff entre une base et une branche.
179
+ * Retourne la séquence d'opérations (keep, add, remove).
180
+ */
181
+ export function computeDiff(base, branch) {
182
+ const common = lcs(base, branch);
183
+ const ops = [];
184
+ let baseIdx = 0;
185
+ let branchIdx = 0;
186
+ for (const [bIdx, rIdx] of common) {
187
+ // Lignes supprimées de la base (avant le prochain match)
188
+ while (baseIdx < bIdx) {
189
+ ops.push({ type: "remove", line: base[baseIdx], index: baseIdx });
190
+ baseIdx++;
191
+ }
192
+ // Lignes ajoutées dans la branche (avant le prochain match)
193
+ while (branchIdx < rIdx) {
194
+ ops.push({ type: "add", line: branch[branchIdx], index: branchIdx });
195
+ branchIdx++;
196
+ }
197
+ // Ligne commune
198
+ ops.push({ type: "keep", line: base[baseIdx], index: baseIdx });
199
+ baseIdx++;
200
+ branchIdx++;
201
+ }
202
+ // Lignes restantes après le dernier match
203
+ while (baseIdx < base.length) {
204
+ ops.push({ type: "remove", line: base[baseIdx], index: baseIdx });
205
+ baseIdx++;
206
+ }
207
+ while (branchIdx < branch.length) {
208
+ ops.push({ type: "add", line: branch[branchIdx], index: branchIdx });
209
+ branchIdx++;
210
+ }
211
+ return ops;
212
+ }
213
+ /**
214
+ * Extrait les edits (changements groupés) d'un diff.
215
+ * Chaque groupe contigu de add/remove forme un edit.
216
+ */
217
+ export function extractEdits(diff, source) {
218
+ const edits = [];
219
+ let i = 0;
220
+ while (i < diff.length) {
221
+ if (diff[i].type === "keep") {
222
+ i++;
223
+ continue;
224
+ }
225
+ // Début d'un groupe de changements
226
+ const removedLines = [];
227
+ const addedLines = [];
228
+ while (i < diff.length && diff[i].type !== "keep") {
229
+ if (diff[i].type === "remove") {
230
+ removedLines.push(diff[i].index);
231
+ }
232
+ else {
233
+ addedLines.push(diff[i].line);
234
+ }
235
+ i++;
236
+ }
237
+ const baseStart = removedLines.length > 0
238
+ ? removedLines[0]
239
+ : // Pour un pur ajout, on utilise l'index de la prochaine ligne keep
240
+ findNextKeepBaseIndex(diff, i);
241
+ const baseEnd = removedLines.length > 0
242
+ ? removedLines[removedLines.length - 1] + 1
243
+ : baseStart; // Pur ajout : pas de suppression
244
+ edits.push({ baseStart, baseEnd, addedLines, source });
245
+ }
246
+ return edits;
247
+ }
248
+ /** Trouve l'index base de la prochaine opération "keep" à partir de la position i */
249
+ function findNextKeepBaseIndex(diff, fromIdx) {
250
+ for (let j = fromIdx; j < diff.length; j++) {
251
+ if (diff[j].type === "keep") {
252
+ return diff[j].index;
253
+ }
254
+ }
255
+ // Si pas de keep après, c'est un ajout en fin de fichier
256
+ // On retourne l'index après la dernière ligne de la base
257
+ for (let j = diff.length - 1; j >= 0; j--) {
258
+ if (diff[j].type === "keep" || diff[j].type === "remove") {
259
+ return diff[j].index + 1;
260
+ }
261
+ }
262
+ return 0;
263
+ }
264
+ /**
265
+ * Vérifie si deux edits se chevauchent (overlap).
266
+ * Deux edits overlap si leurs zones dans la base se croisent.
267
+ */
268
+ export function editsOverlap(a, b) {
269
+ // Les edits sont des intervalles [baseStart, baseEnd) dans la base
270
+ // Ils overlap si un commence avant que l'autre finisse
271
+ // Cas spécial : deux purs ajouts au même point
272
+ if (a.baseStart === a.baseEnd && b.baseStart === b.baseEnd) {
273
+ return a.baseStart === b.baseStart;
274
+ }
275
+ // Cas spécial : un pur ajout à un point touché par l'autre
276
+ if (a.baseStart === a.baseEnd) {
277
+ return a.baseStart >= b.baseStart && a.baseStart < b.baseEnd;
278
+ }
279
+ if (b.baseStart === b.baseEnd) {
280
+ return b.baseStart >= a.baseStart && b.baseStart < a.baseEnd;
281
+ }
282
+ // Cas général : overlap d'intervalles
283
+ return a.baseStart < b.baseEnd && b.baseStart < a.baseEnd;
284
+ }
285
+ /**
286
+ * Tente de fusionner les changements non-overlapping de deux branches.
287
+ *
288
+ * @returns Les lignes fusionnées, ou null si les changements se chevauchent
289
+ */
290
+ export function mergeNonOverlapping(base, ours, theirs) {
291
+ const oursDiff = computeDiff(base, ours);
292
+ const theirsDiff = computeDiff(base, theirs);
293
+ const oursEdits = extractEdits(oursDiff, "ours");
294
+ const theirsEdits = extractEdits(theirsDiff, "theirs");
295
+ // Vérifier qu'aucun edit ne chevauche un edit de l'autre branche
296
+ for (const oEdit of oursEdits) {
297
+ for (const tEdit of theirsEdits) {
298
+ if (editsOverlap(oEdit, tEdit)) {
299
+ return null; // Overlap détecté → pas de résolution automatique
300
+ }
301
+ }
302
+ }
303
+ // Fusionner les edits triés par position dans la base
304
+ const allEdits = [...oursEdits, ...theirsEdits].sort((a, b) => a.baseStart - b.baseStart || a.baseEnd - b.baseEnd);
305
+ // Reconstruire le fichier fusionné
306
+ const result = [];
307
+ let baseIdx = 0;
308
+ for (const edit of allEdits) {
309
+ // Copier les lignes de la base jusqu'au début de l'edit
310
+ while (baseIdx < edit.baseStart) {
311
+ result.push(base[baseIdx]);
312
+ baseIdx++;
313
+ }
314
+ // Ajouter les lignes de l'edit
315
+ result.push(...edit.addedLines);
316
+ // Avancer au-delà de la zone supprimée
317
+ if (edit.baseEnd > baseIdx) {
318
+ baseIdx = edit.baseEnd;
319
+ }
320
+ }
321
+ // Copier le reste de la base
322
+ while (baseIdx < base.length) {
323
+ result.push(base[baseIdx]);
324
+ baseIdx++;
325
+ }
326
+ return result;
327
+ }
328
+ //# sourceMappingURL=diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.js","sourceRoot":"","sources":["../src/diff.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * @gitwand/core
3
+ *
4
+ * Git's magic wand — automatic conflict resolution engine.
5
+ *
6
+ * @example
7
+ * ```ts
8
+ * import { resolve } from "@gitwand/core";
9
+ *
10
+ * const result = resolve(conflictedFileContent, "src/app.ts");
11
+ *
12
+ * console.log(`${result.stats.autoResolved}/${result.stats.totalConflicts} conflits résolus`);
13
+ *
14
+ * if (result.mergedContent) {
15
+ * // Tous les conflits ont été résolus !
16
+ * fs.writeFileSync("src/app.ts", result.mergedContent);
17
+ * }
18
+ * ```
19
+ */
20
+ export { resolve } from "./resolver.js";
21
+ export { parseConflictMarkers, classifyConflict } from "./parser.js";
22
+ export { mergeNonOverlapping, computeDiff, lcs } from "./diff.js";
23
+ export { tryResolveJsonConflict, stripJsoncComments } from "./resolvers/json.js";
24
+ export { tryResolveMarkdownConflict, parseSections, extractFrontmatter } from "./resolvers/markdown.js";
25
+ export { tryResolveYamlConflict } from "./resolvers/yaml.js";
26
+ export { tryResolveImportConflict, isImportBlock } from "./resolvers/imports.js";
27
+ export { tryResolveVueConflict, parseSfcBlocks } from "./resolvers/vue.js";
28
+ export { tryResolveCssConflict, parseCssRules } from "./resolvers/css.js";
29
+ export { tryResolveLockfileNpmConflict } from "./resolvers/lockfile-npm.js";
30
+ export { tryResolveYarnLockConflict } from "./resolvers/lockfile-yarn.js";
31
+ export { tryResolvePnpmLockConflict } from "./resolvers/lockfile-pnpm.js";
32
+ export { matchGlob, effectivePolicyForFile, policyToConfig, parseGitwandrc, DEFAULT_POLICY, } from "./config.js";
33
+ export { tryFormatAwareResolve, isJsonFile, isMarkdownFile, isYamlFile, isJsFile, isVueFile, isCssFile, isNpmLockfile, isYarnLockfile, isPnpmLockfile, isLockfile, } from "./resolvers/dispatcher.js";
34
+ export type { MergeInput, MergeResult, MergeStats, ConflictHunk, ConflictType, Confidence, ConfidenceScore, HunkResolution, GitWandOptions, DecisionTrace, TraceStep, ValidationResult, } from "./types.js";
35
+ export type { JsonMergeResult } from "./resolvers/json.js";
36
+ export type { MarkdownMergeResult, MarkdownSection } from "./resolvers/markdown.js";
37
+ export type { YamlMergeResult, YamlEntry } from "./resolvers/yaml.js";
38
+ export type { ImportMergeResult, ImportStatement } from "./resolvers/imports.js";
39
+ export type { VueMergeResult, SfcBlock } from "./resolvers/vue.js";
40
+ export type { CssMergeResult, CssRule } from "./resolvers/css.js";
41
+ export type { FormatResolveResult } from "./resolvers/dispatcher.js";
42
+ export type { LockfileMergeResult } from "./resolvers/lockfile-npm.js";
43
+ export type { YarnLockMergeResult } from "./resolvers/lockfile-yarn.js";
44
+ export type { PnpmLockMergeResult } from "./resolvers/lockfile-pnpm.js";
45
+ export type { ImportSortStrategy } from "./resolvers/imports.js";
46
+ export type { MergePolicy, PolicyConfig, GitWandrcConfig } from "./config.js";
47
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACrE,OAAO,EAAE,mBAAmB,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAGlE,OAAO,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACjF,OAAO,EAAE,0BAA0B,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAGxG,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,wBAAwB,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACjF,OAAO,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAC3E,OAAO,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAG1E,OAAO,EAAE,6BAA6B,EAAE,MAAM,6BAA6B,CAAC;AAC5E,OAAO,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAC;AAC1E,OAAO,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAC;AAG1E,OAAO,EACL,SAAS,EACT,sBAAsB,EACtB,cAAc,EACd,cAAc,EACd,cAAc,GACf,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,qBAAqB,EACrB,UAAU,EACV,cAAc,EACd,UAAU,EACV,QAAQ,EACR,SAAS,EACT,SAAS,EACT,aAAa,EACb,cAAc,EACd,cAAc,EACd,UAAU,GACX,MAAM,2BAA2B,CAAC;AAEnC,YAAY,EACV,UAAU,EACV,WAAW,EACX,UAAU,EACV,YAAY,EACZ,YAAY,EACZ,UAAU,EAEV,eAAe,EACf,cAAc,EACd,cAAc,EAEd,aAAa,EACb,SAAS,EAET,gBAAgB,GACjB,MAAM,YAAY,CAAC;AAEpB,YAAY,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC3D,YAAY,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AACpF,YAAY,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACtE,YAAY,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACjF,YAAY,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACnE,YAAY,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAClE,YAAY,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AACrE,YAAY,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AACvE,YAAY,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AACxE,YAAY,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AACxE,YAAY,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AACjE,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,38 @@
1
+ /**
2
+ * @gitwand/core
3
+ *
4
+ * Git's magic wand — automatic conflict resolution engine.
5
+ *
6
+ * @example
7
+ * ```ts
8
+ * import { resolve } from "@gitwand/core";
9
+ *
10
+ * const result = resolve(conflictedFileContent, "src/app.ts");
11
+ *
12
+ * console.log(`${result.stats.autoResolved}/${result.stats.totalConflicts} conflits résolus`);
13
+ *
14
+ * if (result.mergedContent) {
15
+ * // Tous les conflits ont été résolus !
16
+ * fs.writeFileSync("src/app.ts", result.mergedContent);
17
+ * }
18
+ * ```
19
+ */
20
+ export { resolve } from "./resolver.js";
21
+ export { parseConflictMarkers, classifyConflict } from "./parser.js";
22
+ export { mergeNonOverlapping, computeDiff, lcs } from "./diff.js";
23
+ // Phase 7.3 — Résolveurs spécialisés par format
24
+ export { tryResolveJsonConflict, stripJsoncComments } from "./resolvers/json.js";
25
+ export { tryResolveMarkdownConflict, parseSections, extractFrontmatter } from "./resolvers/markdown.js";
26
+ // Phase 7.3b — Résolveurs supplémentaires (YAML, imports TS/JS, Vue SFC, CSS)
27
+ export { tryResolveYamlConflict } from "./resolvers/yaml.js";
28
+ export { tryResolveImportConflict, isImportBlock } from "./resolvers/imports.js";
29
+ export { tryResolveVueConflict, parseSfcBlocks } from "./resolvers/vue.js";
30
+ export { tryResolveCssConflict, parseCssRules } from "./resolvers/css.js";
31
+ // Phase 8.1 — Résolveurs lockfile sémantiques (auto-resolve étendu)
32
+ export { tryResolveLockfileNpmConflict } from "./resolvers/lockfile-npm.js";
33
+ export { tryResolveYarnLockConflict } from "./resolvers/lockfile-yarn.js";
34
+ export { tryResolvePnpmLockConflict } from "./resolvers/lockfile-pnpm.js";
35
+ // Phase 7.4 — Politiques de merge et configuration par projet
36
+ export { matchGlob, effectivePolicyForFile, policyToConfig, parseGitwandrc, DEFAULT_POLICY, } from "./config.js";
37
+ export { tryFormatAwareResolve, isJsonFile, isMarkdownFile, isYamlFile, isJsFile, isVueFile, isCssFile, isNpmLockfile, isYarnLockfile, isPnpmLockfile, isLockfile, } from "./resolvers/dispatcher.js";
38
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACrE,OAAO,EAAE,mBAAmB,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAElE,gDAAgD;AAChD,OAAO,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACjF,OAAO,EAAE,0BAA0B,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAExG,8EAA8E;AAC9E,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,wBAAwB,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACjF,OAAO,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAC3E,OAAO,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAE1E,oEAAoE;AACpE,OAAO,EAAE,6BAA6B,EAAE,MAAM,6BAA6B,CAAC;AAC5E,OAAO,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAC;AAC1E,OAAO,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAC;AAE1E,8DAA8D;AAC9D,OAAO,EACL,SAAS,EACT,sBAAsB,EACtB,cAAc,EACd,cAAc,EACd,cAAc,GACf,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,qBAAqB,EACrB,UAAU,EACV,cAAc,EACd,UAAU,EACV,QAAQ,EACR,SAAS,EACT,SAAS,EACT,aAAa,EACb,cAAc,EACd,cAAc,EACd,UAAU,GACX,MAAM,2BAA2B,CAAC"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * GitWand Conflict Parser
3
+ *
4
+ * Parse les fichiers contenant des marqueurs de conflit Git
5
+ * et extrait les hunks structurés.
6
+ *
7
+ * v1.4 : classifyConflict() est maintenant implémenté dans classifier.ts
8
+ * via un registre de PatternPlugin. Ce fichier re-exporte classifyConflict
9
+ * pour la compatibilité ascendante — toutes les signatures publiques sont inchangées.
10
+ */
11
+ import type { ConflictHunk, ClassifyInput } from "./types.js";
12
+ import { classifyConflict } from "./classifier.js";
13
+ export { classifyConflict };
14
+ /** Alias backward-compatible — identique à ClassifyInput */
15
+ export type RawConflict = ClassifyInput;
16
+ /**
17
+ * Parse un fichier avec des marqueurs de conflit Git.
18
+ *
19
+ * Supporte les formats diff2 (sans base) et diff3 (avec base).
20
+ *
21
+ * @param content - Le contenu du fichier avec marqueurs de conflit
22
+ * @returns Les segments (texte résolu + conflits bruts) dans l'ordre
23
+ */
24
+ export declare function parseConflictMarkers(content: string): {
25
+ segments: Array<{
26
+ type: "text";
27
+ lines: string[];
28
+ } | {
29
+ type: "conflict";
30
+ conflict: RawConflict;
31
+ }>;
32
+ };
33
+ /**
34
+ * Convertit un conflit brut en ConflictHunk typé avec trace.
35
+ *
36
+ * v1.4 : détecte automatiquement zdiff3 et ajuste `baseAvailability` en conséquence.
37
+ */
38
+ export declare function toConflictHunk(conflict: RawConflict): ConflictHunk;
39
+ //# sourceMappingURL=parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAmB,MAAM,YAAY,CAAC;AAC/E,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEnD,OAAO,EAAE,gBAAgB,EAAE,CAAC;AAE5B,4DAA4D;AAC5D,MAAM,MAAM,WAAW,GAAG,aAAa,CAAC;AA4DxC;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG;IACrD,QAAQ,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG;QAAE,IAAI,EAAE,UAAU,CAAC;QAAC,QAAQ,EAAE,WAAW,CAAA;KAAE,CAAC,CAAC;CAClG,CAwEA;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,WAAW,GAAG,YAAY,CAmBlE"}
package/dist/parser.js ADDED
@@ -0,0 +1,164 @@
1
+ /**
2
+ * GitWand Conflict Parser
3
+ *
4
+ * Parse les fichiers contenant des marqueurs de conflit Git
5
+ * et extrait les hunks structurés.
6
+ *
7
+ * v1.4 : classifyConflict() est maintenant implémenté dans classifier.ts
8
+ * via un registre de PatternPlugin. Ce fichier re-exporte classifyConflict
9
+ * pour la compatibilité ascendante — toutes les signatures publiques sont inchangées.
10
+ */
11
+ import { classifyConflict } from "./classifier.js";
12
+ export { classifyConflict };
13
+ // ─── zdiff3 detection ─────────────────────────────────────────
14
+ /**
15
+ * Détecte si un conflit a été généré par `git merge --diff3` en style zdiff3.
16
+ *
17
+ * En zdiff3 (Git 2.35+), la section base ne montre que les lignes qui divergent
18
+ * des deux côtés — c'est une version tronquée de la vraie base.
19
+ *
20
+ * Heuristique : la base non-vide est un sous-ensemble strict de ours OU de theirs.
21
+ * (Si la base était complète, elle contiendrait toutes les lignes communes.)
22
+ *
23
+ * @param conflict - Le conflit brut parsé
24
+ * @returns true si le conflit ressemble à du zdiff3
25
+ */
26
+ function detectZdiff3(conflict) {
27
+ const { baseLines, oursLines, theirsLines } = conflict;
28
+ if (baseLines.length === 0)
29
+ return false; // diff2 — pas de base du tout
30
+ const oursSet = new Set(oursLines);
31
+ const theirsSet = new Set(theirsLines);
32
+ const baseSubsetOfOurs = baseLines.every((l) => oursSet.has(l));
33
+ const baseSubsetOfTheirs = baseLines.every((l) => theirsSet.has(l));
34
+ return baseSubsetOfOurs || baseSubsetOfTheirs;
35
+ }
36
+ /**
37
+ * Applique la dimension `baseAvailability` à un ConfidenceScore existant.
38
+ *
39
+ * Recompute le score avec la formule v1.4 complète.
40
+ * Utilisé quand zdiff3 est détecté après la classification (baseAvailability = 100).
41
+ */
42
+ function withBaseAvailability(cs, baseAvailability, booster) {
43
+ const { typeClassification, dataRisk, scopeImpact, fileFrequency = 0 } = cs.dimensions;
44
+ const raw = typeClassification
45
+ - dataRisk * 0.40
46
+ - scopeImpact * 0.15
47
+ - fileFrequency * 0.10
48
+ + baseAvailability * 0.05;
49
+ const score = Math.round(Math.max(0, Math.min(100, raw)));
50
+ const boosters = booster ? [...cs.boosters, booster] : cs.boosters;
51
+ return {
52
+ ...cs,
53
+ score,
54
+ label: score >= 92 ? "certain" : score >= 68 ? "high" : score >= 44 ? "medium" : "low",
55
+ dimensions: { ...cs.dimensions, baseAvailability },
56
+ boosters,
57
+ };
58
+ }
59
+ /** Marqueurs de conflit Git standard */
60
+ const MARKER_OURS = /^<{7}\s/;
61
+ const MARKER_BASE = /^\|{7}\s/;
62
+ const MARKER_SEPARATOR = /^={7}$/;
63
+ const MARKER_THEIRS = /^>{7}\s/;
64
+ /**
65
+ * Parse un fichier avec des marqueurs de conflit Git.
66
+ *
67
+ * Supporte les formats diff2 (sans base) et diff3 (avec base).
68
+ *
69
+ * @param content - Le contenu du fichier avec marqueurs de conflit
70
+ * @returns Les segments (texte résolu + conflits bruts) dans l'ordre
71
+ */
72
+ export function parseConflictMarkers(content) {
73
+ const lines = content.split("\n");
74
+ const segments = [];
75
+ let currentText = [];
76
+ let inConflict = false;
77
+ let section = "ours";
78
+ let conflictStart = 0;
79
+ let oursLines = [];
80
+ let baseLines = [];
81
+ let theirsLines = [];
82
+ for (let i = 0; i < lines.length; i++) {
83
+ const line = lines[i];
84
+ if (MARKER_OURS.test(line)) {
85
+ if (currentText.length > 0) {
86
+ segments.push({ type: "text", lines: [...currentText] });
87
+ currentText = [];
88
+ }
89
+ inConflict = true;
90
+ section = "ours";
91
+ conflictStart = i + 1; // 1-indexed
92
+ oursLines = [];
93
+ baseLines = [];
94
+ theirsLines = [];
95
+ continue;
96
+ }
97
+ if (inConflict && MARKER_BASE.test(line)) {
98
+ section = "base";
99
+ continue;
100
+ }
101
+ if (inConflict && MARKER_SEPARATOR.test(line)) {
102
+ section = "theirs";
103
+ continue;
104
+ }
105
+ if (inConflict && MARKER_THEIRS.test(line)) {
106
+ segments.push({
107
+ type: "conflict",
108
+ conflict: {
109
+ oursLines: [...oursLines],
110
+ baseLines: [...baseLines],
111
+ theirsLines: [...theirsLines],
112
+ startLine: conflictStart,
113
+ endLine: i + 1,
114
+ },
115
+ });
116
+ inConflict = false;
117
+ continue;
118
+ }
119
+ if (inConflict) {
120
+ switch (section) {
121
+ case "ours":
122
+ oursLines.push(line);
123
+ break;
124
+ case "base":
125
+ baseLines.push(line);
126
+ break;
127
+ case "theirs":
128
+ theirsLines.push(line);
129
+ break;
130
+ }
131
+ }
132
+ else {
133
+ currentText.push(line);
134
+ }
135
+ }
136
+ if (currentText.length > 0) {
137
+ segments.push({ type: "text", lines: currentText });
138
+ }
139
+ return { segments };
140
+ }
141
+ /**
142
+ * Convertit un conflit brut en ConflictHunk typé avec trace.
143
+ *
144
+ * v1.4 : détecte automatiquement zdiff3 et ajuste `baseAvailability` en conséquence.
145
+ */
146
+ export function toConflictHunk(conflict) {
147
+ const { type, confidence, explanation, trace } = classifyConflict(conflict);
148
+ const isZdiff3 = detectZdiff3(conflict);
149
+ const adjustedConfidence = isZdiff3
150
+ ? withBaseAvailability(confidence, 100, "zdiff3 — base tronquée aux sections divergentes")
151
+ : confidence;
152
+ return {
153
+ baseLines: conflict.baseLines,
154
+ oursLines: conflict.oursLines,
155
+ theirsLines: conflict.theirsLines,
156
+ startLine: conflict.startLine,
157
+ type,
158
+ confidence: adjustedConfidence,
159
+ explanation,
160
+ trace,
161
+ ...(isZdiff3 ? { zdiff3: true } : {}),
162
+ };
163
+ }
164
+ //# sourceMappingURL=parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.js","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { PatternPlugin } from "../types.js";
2
+ /** Fallback — s'applique toujours, placé en fin de registre */
3
+ declare const complex: PatternPlugin;
4
+ export default complex;
5
+ //# sourceMappingURL=complex.d.ts.map