@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,108 @@
1
+ /**
2
+ * GitWand — Politiques de merge et configuration par projet
3
+ *
4
+ * Phase 7.4 : stratégies configurables, .gitwandrc, overrides par pattern glob.
5
+ *
6
+ * ## Politiques disponibles
7
+ *
8
+ * | Politique | Usage typique |
9
+ * |-----------------|-----------------------------------------------|
10
+ * | `prefer-ours` | Monorepo — protéger les changements locaux |
11
+ * | `prefer-theirs` | Intégration continue — accepter l'upstream |
12
+ * | `prefer-merge` | Développement actif — résoudre le plus possible (défaut) |
13
+ * | `prefer-safety` | Code sensible — ne résoudre que l'évident |
14
+ * | `strict` | Release branch — seulement le trivial |
15
+ *
16
+ * ## Choix implicites du moteur textuel (documentation des conventions)
17
+ *
18
+ * - `whitespace_only` → **ours** (préserver l'indentation locale)
19
+ * - `value_only_change` → **theirs** (les valeurs volatiles — hash, versions — viennent du merge)
20
+ * - `generated_file` → **theirs** (le fichier sera régénéré, theirs est plus récent)
21
+ * - `one_side_change` → la branche modifiée (logique de préservation du changement)
22
+ * - `non_overlapping` → merge LCS (les deux changements coexistent)
23
+ * - `complex` → **pas de résolution automatique** (risque trop élevé)
24
+ *
25
+ * ## Format .gitwandrc
26
+ * ```json
27
+ * {
28
+ * "policy": "prefer-safety",
29
+ * "patterns": {
30
+ * "*.lock": "prefer-theirs",
31
+ * "package.json": "prefer-theirs",
32
+ * "src/**\/*.ts": "prefer-ours"
33
+ * }
34
+ * }
35
+ * ```
36
+ * Ou dans `package.json` sous la clé `"gitwand"`.
37
+ */
38
+ /**
39
+ * Politique de résolution automatique des conflits.
40
+ */
41
+ export type MergePolicy = "prefer-ours" | "prefer-theirs" | "prefer-merge" | "prefer-safety" | "strict";
42
+ /**
43
+ * Configuration dérivée d'une `MergePolicy`.
44
+ * Utilisée en interne par `resolveHunk` pour appliquer la politique.
45
+ */
46
+ export interface PolicyConfig {
47
+ /** Pour les types ambigus (whitespace_only, value_only_change) : prendre ours ou theirs ? */
48
+ preferOurs: boolean;
49
+ /** Résoudre les conflits `whitespace_only` ? */
50
+ allowWhitespace: boolean;
51
+ /** Résoudre les conflits `value_only_change` ? */
52
+ allowValueOnly: boolean;
53
+ /** Résoudre les conflits `non_overlapping` ? */
54
+ allowNonOverlapping: boolean;
55
+ /** Seuil de confiance effectif (override du paramètre global) */
56
+ minConfidence: "certain" | "high" | "medium" | "low";
57
+ }
58
+ /** Convertit une `MergePolicy` en `PolicyConfig` exploitable. */
59
+ export declare function policyToConfig(policy: MergePolicy): PolicyConfig;
60
+ /** Politique par défaut (comportement historique du moteur) */
61
+ export declare const DEFAULT_POLICY: MergePolicy;
62
+ /**
63
+ * Implémentation minimale de pattern glob pour les overrides de fichiers.
64
+ *
65
+ * Supporte :
66
+ * - `*` — n'importe quel caractère sauf `/`
67
+ * - `**` — n'importe quel caractère (y compris `/`)
68
+ * - `?` — exactement un caractère sauf `/`
69
+ * - Correspondance sur le basename si le pattern ne contient pas de `/`
70
+ *
71
+ * @param pattern - Motif glob (ex: `*.lock`, `src/**\/*.ts`, `package.json`)
72
+ * @param filePath - Chemin du fichier (ex: `src/utils/helper.ts`)
73
+ * @returns `true` si le chemin correspond au motif
74
+ */
75
+ export declare function matchGlob(pattern: string, filePath: string): boolean;
76
+ /**
77
+ * Détermine la politique effective pour un fichier donné.
78
+ *
79
+ * Priorité :
80
+ * 1. Pattern override le plus spécifique (par longueur de pattern)
81
+ * 2. Politique globale
82
+ * 3. Politique par défaut (`"prefer-theirs"`)
83
+ *
84
+ * @param filePath - Chemin du fichier
85
+ * @param globalPolicy - Politique globale (depuis .gitwandrc ou options)
86
+ * @param patternOverrides - Map pattern → politique
87
+ */
88
+ export declare function effectivePolicyForFile(filePath: string, globalPolicy?: MergePolicy, patternOverrides?: Record<string, MergePolicy>): MergePolicy;
89
+ /**
90
+ * Structure du fichier `.gitwandrc` ou de la clé `"gitwand"` dans `package.json`.
91
+ */
92
+ export interface GitWandrcConfig {
93
+ /** Politique de merge globale */
94
+ policy?: MergePolicy;
95
+ /** Overrides par pattern glob */
96
+ patterns?: Record<string, MergePolicy>;
97
+ /**
98
+ * Patterns glob supplémentaires pour fichiers auto-générés (P2.4).
99
+ * S'ajoutent aux built-ins (lockfiles, bundles, `dist/`…) sans les remplacer.
100
+ */
101
+ generatedFiles?: string[];
102
+ }
103
+ /**
104
+ * Parse une configuration GitWandrc depuis une string JSON.
105
+ * Retourne `null` en cas d'erreur de parsing.
106
+ */
107
+ export declare function parseGitwandrc(json: string): GitWandrcConfig | null;
108
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AAIH;;GAEG;AACH,MAAM,MAAM,WAAW,GACnB,aAAa,GACb,eAAe,GACf,cAAc,GACd,eAAe,GACf,QAAQ,CAAC;AAIb;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B,6FAA6F;IAC7F,UAAU,EAAE,OAAO,CAAC;IACpB,gDAAgD;IAChD,eAAe,EAAE,OAAO,CAAC;IACzB,kDAAkD;IAClD,cAAc,EAAE,OAAO,CAAC;IACxB,gDAAgD;IAChD,mBAAmB,EAAE,OAAO,CAAC;IAC7B,iEAAiE;IACjE,aAAa,EAAE,SAAS,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;CACtD;AAED,iEAAiE;AACjE,wBAAgB,cAAc,CAAC,MAAM,EAAE,WAAW,GAAG,YAAY,CA2ChE;AAED,+DAA+D;AAC/D,eAAO,MAAM,cAAc,EAAE,WAA6B,CAAC;AAI3D;;;;;;;;;;;;GAYG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAapE;AAiBD;;;;;;;;;;;GAWG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,MAAM,EAChB,YAAY,CAAC,EAAE,WAAW,EAC1B,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,GAC7C,WAAW,CAmBb;AAID;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,iCAAiC;IACjC,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,iCAAiC;IACjC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACvC;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CAgDnE"}
package/dist/config.js ADDED
@@ -0,0 +1,200 @@
1
+ /**
2
+ * GitWand — Politiques de merge et configuration par projet
3
+ *
4
+ * Phase 7.4 : stratégies configurables, .gitwandrc, overrides par pattern glob.
5
+ *
6
+ * ## Politiques disponibles
7
+ *
8
+ * | Politique | Usage typique |
9
+ * |-----------------|-----------------------------------------------|
10
+ * | `prefer-ours` | Monorepo — protéger les changements locaux |
11
+ * | `prefer-theirs` | Intégration continue — accepter l'upstream |
12
+ * | `prefer-merge` | Développement actif — résoudre le plus possible (défaut) |
13
+ * | `prefer-safety` | Code sensible — ne résoudre que l'évident |
14
+ * | `strict` | Release branch — seulement le trivial |
15
+ *
16
+ * ## Choix implicites du moteur textuel (documentation des conventions)
17
+ *
18
+ * - `whitespace_only` → **ours** (préserver l'indentation locale)
19
+ * - `value_only_change` → **theirs** (les valeurs volatiles — hash, versions — viennent du merge)
20
+ * - `generated_file` → **theirs** (le fichier sera régénéré, theirs est plus récent)
21
+ * - `one_side_change` → la branche modifiée (logique de préservation du changement)
22
+ * - `non_overlapping` → merge LCS (les deux changements coexistent)
23
+ * - `complex` → **pas de résolution automatique** (risque trop élevé)
24
+ *
25
+ * ## Format .gitwandrc
26
+ * ```json
27
+ * {
28
+ * "policy": "prefer-safety",
29
+ * "patterns": {
30
+ * "*.lock": "prefer-theirs",
31
+ * "package.json": "prefer-theirs",
32
+ * "src/**\/*.ts": "prefer-ours"
33
+ * }
34
+ * }
35
+ * ```
36
+ * Ou dans `package.json` sous la clé `"gitwand"`.
37
+ */
38
+ /** Convertit une `MergePolicy` en `PolicyConfig` exploitable. */
39
+ export function policyToConfig(policy) {
40
+ switch (policy) {
41
+ case "prefer-ours":
42
+ return {
43
+ preferOurs: true,
44
+ allowWhitespace: true,
45
+ allowValueOnly: true,
46
+ allowNonOverlapping: true,
47
+ minConfidence: "high",
48
+ };
49
+ case "prefer-theirs":
50
+ return {
51
+ preferOurs: false,
52
+ allowWhitespace: true,
53
+ allowValueOnly: true,
54
+ allowNonOverlapping: true,
55
+ minConfidence: "high",
56
+ };
57
+ case "prefer-merge":
58
+ return {
59
+ preferOurs: false,
60
+ allowWhitespace: true,
61
+ allowValueOnly: true,
62
+ allowNonOverlapping: true,
63
+ minConfidence: "medium", // plus permissif
64
+ };
65
+ case "prefer-safety":
66
+ return {
67
+ preferOurs: false,
68
+ allowWhitespace: false, // skip whitespace (risque d'indentation)
69
+ allowValueOnly: false, // skip value_only (valeurs sensibles)
70
+ allowNonOverlapping: true,
71
+ minConfidence: "high",
72
+ };
73
+ case "strict":
74
+ return {
75
+ preferOurs: false,
76
+ allowWhitespace: false,
77
+ allowValueOnly: false,
78
+ allowNonOverlapping: false, // pas de merge LCS automatique
79
+ minConfidence: "high",
80
+ };
81
+ }
82
+ }
83
+ /** Politique par défaut (comportement historique du moteur) */
84
+ export const DEFAULT_POLICY = "prefer-theirs";
85
+ // ─── Glob matching ────────────────────────────────────────
86
+ /**
87
+ * Implémentation minimale de pattern glob pour les overrides de fichiers.
88
+ *
89
+ * Supporte :
90
+ * - `*` — n'importe quel caractère sauf `/`
91
+ * - `**` — n'importe quel caractère (y compris `/`)
92
+ * - `?` — exactement un caractère sauf `/`
93
+ * - Correspondance sur le basename si le pattern ne contient pas de `/`
94
+ *
95
+ * @param pattern - Motif glob (ex: `*.lock`, `src/**\/*.ts`, `package.json`)
96
+ * @param filePath - Chemin du fichier (ex: `src/utils/helper.ts`)
97
+ * @returns `true` si le chemin correspond au motif
98
+ */
99
+ export function matchGlob(pattern, filePath) {
100
+ // Normaliser les séparateurs de chemin
101
+ const normalizedPath = filePath.replace(/\\/g, "/");
102
+ const normalizedPattern = pattern.replace(/\\/g, "/");
103
+ // Si le pattern ne contient pas de /, correspondre sur le basename
104
+ if (!normalizedPattern.includes("/")) {
105
+ const basename = normalizedPath.split("/").pop() ?? normalizedPath;
106
+ return globRegex(normalizedPattern).test(basename);
107
+ }
108
+ // Correspondance sur le chemin complet
109
+ return globRegex(normalizedPattern).test(normalizedPath);
110
+ }
111
+ /** Convertit un pattern glob en RegExp. */
112
+ function globRegex(pattern) {
113
+ // Échapper les caractères spéciaux regex, puis replacer les globs
114
+ const escaped = pattern
115
+ .replace(/[.+^${}()|[\]\\]/g, "\\$&") // échapper les caractères regex
116
+ .replace(/\*\*/g, "§DSTAR§") // placeholder pour **
117
+ .replace(/\*/g, "[^/]*") // * → tout sauf /
118
+ .replace(/\?/g, "[^/]") // ? → un char sauf /
119
+ .replace(/§DSTAR§/g, ".*"); // ** → tout (y compris /)
120
+ return new RegExp(`^${escaped}$`);
121
+ }
122
+ // ─── Effective policy ─────────────────────────────────────
123
+ /**
124
+ * Détermine la politique effective pour un fichier donné.
125
+ *
126
+ * Priorité :
127
+ * 1. Pattern override le plus spécifique (par longueur de pattern)
128
+ * 2. Politique globale
129
+ * 3. Politique par défaut (`"prefer-theirs"`)
130
+ *
131
+ * @param filePath - Chemin du fichier
132
+ * @param globalPolicy - Politique globale (depuis .gitwandrc ou options)
133
+ * @param patternOverrides - Map pattern → politique
134
+ */
135
+ export function effectivePolicyForFile(filePath, globalPolicy, patternOverrides) {
136
+ if (patternOverrides) {
137
+ // Trouver tous les patterns qui matchent, prendre le plus spécifique (plus long)
138
+ const matches = [];
139
+ for (const [pattern, policy] of Object.entries(patternOverrides)) {
140
+ if (matchGlob(pattern, filePath)) {
141
+ matches.push({ pattern, policy });
142
+ }
143
+ }
144
+ if (matches.length > 0) {
145
+ // Pattern le plus spécifique = le plus long
146
+ matches.sort((a, b) => b.pattern.length - a.pattern.length);
147
+ return matches[0].policy;
148
+ }
149
+ }
150
+ return globalPolicy ?? DEFAULT_POLICY;
151
+ }
152
+ /**
153
+ * Parse une configuration GitWandrc depuis une string JSON.
154
+ * Retourne `null` en cas d'erreur de parsing.
155
+ */
156
+ export function parseGitwandrc(json) {
157
+ try {
158
+ const parsed = JSON.parse(json);
159
+ if (typeof parsed !== "object" || parsed === null)
160
+ return null;
161
+ const result = {};
162
+ // Valider la politique
163
+ const validPolicies = [
164
+ "prefer-ours",
165
+ "prefer-theirs",
166
+ "prefer-merge",
167
+ "prefer-safety",
168
+ "strict",
169
+ ];
170
+ if (parsed.policy && validPolicies.includes(parsed.policy)) {
171
+ result.policy = parsed.policy;
172
+ }
173
+ // Valider les patterns
174
+ if (parsed.patterns && typeof parsed.patterns === "object") {
175
+ const patterns = {};
176
+ for (const [pattern, policyRaw] of Object.entries(parsed.patterns)) {
177
+ if (typeof policyRaw === "string" && validPolicies.includes(policyRaw)) {
178
+ patterns[pattern] = policyRaw;
179
+ }
180
+ }
181
+ if (Object.keys(patterns).length > 0) {
182
+ result.patterns = patterns;
183
+ }
184
+ }
185
+ // Valider les patterns de fichiers auto-générés (P2.4).
186
+ // On accepte un tableau de strings non vides ; on skip tout ce qui n'est pas
187
+ // une string pour rester tolérant aux configs « presque valides ».
188
+ if (Array.isArray(parsed.generatedFiles)) {
189
+ const generatedFiles = parsed.generatedFiles.filter((p) => typeof p === "string" && p.length > 0);
190
+ if (generatedFiles.length > 0) {
191
+ result.generatedFiles = generatedFiles;
192
+ }
193
+ }
194
+ return result;
195
+ }
196
+ catch {
197
+ return null;
198
+ }
199
+ }
200
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
package/dist/diff.d.ts ADDED
@@ -0,0 +1,69 @@
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
+ /** Une opération de diff sur une ligne */
8
+ export interface DiffOp {
9
+ type: "keep" | "add" | "remove";
10
+ line: string;
11
+ /** Index dans le tableau source (base pour keep/remove, branch pour add) */
12
+ index: number;
13
+ }
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 declare function lcs(a: string[], b: string[]): Array<[number, number]>;
27
+ /**
28
+ * Implémentation Hirschberg exposée pour les tests (et usage avancé éventuel).
29
+ * L'API publique `lcs()` choisit automatiquement entre cette variante et le DP
30
+ * plein selon la taille de l'input. Exporter sous le préfixe `_` signale son
31
+ * caractère d'interne-testable.
32
+ */
33
+ export declare const _lcsHirschberg: (a: string[], b: string[]) => Array<[number, number]>;
34
+ /**
35
+ * Calcule le diff entre une base et une branche.
36
+ * Retourne la séquence d'opérations (keep, add, remove).
37
+ */
38
+ export declare function computeDiff(base: string[], branch: string[]): DiffOp[];
39
+ /**
40
+ * Représente un changement (edit) d'une branche par rapport à la base.
41
+ * start/end sont les indices dans la base où le changement s'applique.
42
+ */
43
+ export interface Edit {
44
+ /** Index de début dans la base (inclus) — position avant laquelle insérer ou début de la zone supprimée */
45
+ baseStart: number;
46
+ /** Index de fin dans la base (exclus) — fin de la zone supprimée */
47
+ baseEnd: number;
48
+ /** Lignes ajoutées à cette position */
49
+ addedLines: string[];
50
+ /** Source : "ours" ou "theirs" */
51
+ source: "ours" | "theirs";
52
+ }
53
+ /**
54
+ * Extrait les edits (changements groupés) d'un diff.
55
+ * Chaque groupe contigu de add/remove forme un edit.
56
+ */
57
+ export declare function extractEdits(diff: DiffOp[], source: "ours" | "theirs"): Edit[];
58
+ /**
59
+ * Vérifie si deux edits se chevauchent (overlap).
60
+ * Deux edits overlap si leurs zones dans la base se croisent.
61
+ */
62
+ export declare function editsOverlap(a: Edit, b: Edit): boolean;
63
+ /**
64
+ * Tente de fusionner les changements non-overlapping de deux branches.
65
+ *
66
+ * @returns Les lignes fusionnées, ou null si les changements se chevauchent
67
+ */
68
+ export declare function mergeNonOverlapping(base: string[], ours: string[], theirs: string[]): string[] | null;
69
+ //# sourceMappingURL=diff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../src/diff.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,0CAA0C;AAC1C,MAAM,WAAW,MAAM;IACrB,IAAI,EAAE,MAAM,GAAG,KAAK,GAAG,QAAQ,CAAC;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,4EAA4E;IAC5E,KAAK,EAAE,MAAM,CAAC;CACf;AAUD;;;;;;;;;;;GAWG;AACH,wBAAgB,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CASrE;AA+CD;;;;;GAKG;AACH,eAAO,MAAM,cAAc,GAAI,GAAG,MAAM,EAAE,EAAE,GAAG,MAAM,EAAE,KAAG,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAC3D,CAAC;AAuGtB;;;GAGG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAmCtE;AAED;;;GAGG;AACH,MAAM,WAAW,IAAI;IACnB,2GAA2G;IAC3G,SAAS,EAAE,MAAM,CAAC;IAClB,oEAAoE;IACpE,OAAO,EAAE,MAAM,CAAC;IAChB,uCAAuC;IACvC,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,kCAAkC;IAClC,MAAM,EAAE,MAAM,GAAG,QAAQ,CAAC;CAC3B;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,EAAE,EACd,MAAM,EAAE,MAAM,GAAG,QAAQ,GACxB,IAAI,EAAE,CAqCR;AAmBD;;;GAGG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,GAAG,OAAO,CAmBtD;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,MAAM,EAAE,EACd,IAAI,EAAE,MAAM,EAAE,EACd,MAAM,EAAE,MAAM,EAAE,GACf,MAAM,EAAE,GAAG,IAAI,CAgDjB"}