@gitwand/core 2.3.0 → 2.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/__tests__/corpus.d.ts.map +1 -1
- package/dist/__tests__/corpus.js +377 -0
- package/dist/__tests__/corpus.js.map +1 -1
- package/dist/__tests__/patterns/complex.test.d.ts +9 -0
- package/dist/__tests__/patterns/complex.test.d.ts.map +1 -0
- package/dist/__tests__/patterns/complex.test.js +198 -0
- package/dist/__tests__/patterns/complex.test.js.map +1 -0
- package/dist/__tests__/patterns/delete-no-change.test.d.ts +11 -0
- package/dist/__tests__/patterns/delete-no-change.test.d.ts.map +1 -0
- package/dist/__tests__/patterns/delete-no-change.test.js +178 -0
- package/dist/__tests__/patterns/delete-no-change.test.js.map +1 -0
- package/dist/__tests__/patterns/llm-proposed.test.d.ts +10 -0
- package/dist/__tests__/patterns/llm-proposed.test.d.ts.map +1 -0
- package/dist/__tests__/patterns/llm-proposed.test.js +306 -0
- package/dist/__tests__/patterns/llm-proposed.test.js.map +1 -0
- package/dist/__tests__/patterns/non-overlapping.test.d.ts +11 -0
- package/dist/__tests__/patterns/non-overlapping.test.d.ts.map +1 -0
- package/dist/__tests__/patterns/non-overlapping.test.js +240 -0
- package/dist/__tests__/patterns/non-overlapping.test.js.map +1 -0
- package/dist/__tests__/patterns/one-side-change.test.d.ts +10 -0
- package/dist/__tests__/patterns/one-side-change.test.d.ts.map +1 -0
- package/dist/__tests__/patterns/one-side-change.test.js +191 -0
- package/dist/__tests__/patterns/one-side-change.test.js.map +1 -0
- package/dist/__tests__/patterns/same-change.test.d.ts +9 -0
- package/dist/__tests__/patterns/same-change.test.d.ts.map +1 -0
- package/dist/__tests__/patterns/same-change.test.js +173 -0
- package/dist/__tests__/patterns/same-change.test.js.map +1 -0
- package/dist/__tests__/patterns/value-only-change.test.d.ts +11 -0
- package/dist/__tests__/patterns/value-only-change.test.d.ts.map +1 -0
- package/dist/__tests__/patterns/value-only-change.test.js +159 -0
- package/dist/__tests__/patterns/value-only-change.test.js.map +1 -0
- package/dist/__tests__/patterns/whitespace-only.test.d.ts +10 -0
- package/dist/__tests__/patterns/whitespace-only.test.d.ts.map +1 -0
- package/dist/__tests__/patterns/whitespace-only.test.js +177 -0
- package/dist/__tests__/patterns/whitespace-only.test.js.map +1 -0
- package/dist/__tests__/resolvers/css.test.d.ts +12 -0
- package/dist/__tests__/resolvers/css.test.d.ts.map +1 -0
- package/dist/__tests__/resolvers/css.test.js +171 -0
- package/dist/__tests__/resolvers/css.test.js.map +1 -0
- package/dist/__tests__/resolvers/imports.test.d.ts +12 -0
- package/dist/__tests__/resolvers/imports.test.d.ts.map +1 -0
- package/dist/__tests__/resolvers/imports.test.js +135 -0
- package/dist/__tests__/resolvers/imports.test.js.map +1 -0
- package/dist/__tests__/resolvers/json.test.d.ts +12 -0
- package/dist/__tests__/resolvers/json.test.d.ts.map +1 -0
- package/dist/__tests__/resolvers/json.test.js +184 -0
- package/dist/__tests__/resolvers/json.test.js.map +1 -0
- package/dist/__tests__/resolvers/lockfile-npm.test.d.ts +12 -0
- package/dist/__tests__/resolvers/lockfile-npm.test.d.ts.map +1 -0
- package/dist/__tests__/resolvers/lockfile-npm.test.js +187 -0
- package/dist/__tests__/resolvers/lockfile-npm.test.js.map +1 -0
- package/dist/__tests__/resolvers/lockfile-pnpm.test.d.ts +12 -0
- package/dist/__tests__/resolvers/lockfile-pnpm.test.d.ts.map +1 -0
- package/dist/__tests__/resolvers/lockfile-pnpm.test.js +175 -0
- package/dist/__tests__/resolvers/lockfile-pnpm.test.js.map +1 -0
- package/dist/__tests__/resolvers/lockfile-yarn.test.d.ts +12 -0
- package/dist/__tests__/resolvers/lockfile-yarn.test.d.ts.map +1 -0
- package/dist/__tests__/resolvers/lockfile-yarn.test.js +165 -0
- package/dist/__tests__/resolvers/lockfile-yarn.test.js.map +1 -0
- package/dist/__tests__/resolvers/markdown.test.d.ts +12 -0
- package/dist/__tests__/resolvers/markdown.test.d.ts.map +1 -0
- package/dist/__tests__/resolvers/markdown.test.js +188 -0
- package/dist/__tests__/resolvers/markdown.test.js.map +1 -0
- package/dist/__tests__/resolvers/vue.test.d.ts +12 -0
- package/dist/__tests__/resolvers/vue.test.d.ts.map +1 -0
- package/dist/__tests__/resolvers/vue.test.js +225 -0
- package/dist/__tests__/resolvers/vue.test.js.map +1 -0
- package/dist/__tests__/resolvers/yaml.test.d.ts +12 -0
- package/dist/__tests__/resolvers/yaml.test.d.ts.map +1 -0
- package/dist/__tests__/resolvers/yaml.test.js +203 -0
- package/dist/__tests__/resolvers/yaml.test.js.map +1 -0
- package/dist/__tests__/v2-core-scenarios.test.d.ts +35 -0
- package/dist/__tests__/v2-core-scenarios.test.d.ts.map +1 -0
- package/dist/__tests__/v2-core-scenarios.test.js +692 -0
- package/dist/__tests__/v2-core-scenarios.test.js.map +1 -0
- package/dist/__tests__/validation-parse-tree.test.d.ts +15 -0
- package/dist/__tests__/validation-parse-tree.test.d.ts.map +1 -0
- package/dist/__tests__/validation-parse-tree.test.js +243 -0
- package/dist/__tests__/validation-parse-tree.test.js.map +1 -0
- package/dist/classifier.d.ts.map +1 -1
- package/dist/classifier.js +3 -0
- package/dist/classifier.js.map +1 -1
- package/dist/config.d.ts +54 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +42 -0
- package/dist/config.js.map +1 -1
- package/dist/diff/index.d.ts.map +1 -1
- package/dist/diff/index.js +1 -3
- package/dist/diff/index.js.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/patterns/llm-proposed.d.ts +8 -0
- package/dist/patterns/llm-proposed.d.ts.map +1 -0
- package/dist/patterns/llm-proposed.js +66 -0
- package/dist/patterns/llm-proposed.js.map +1 -0
- package/dist/patterns/utils.d.ts +8 -7
- package/dist/patterns/utils.d.ts.map +1 -1
- package/dist/patterns/utils.js +13 -12
- package/dist/patterns/utils.js.map +1 -1
- package/dist/resolver/adapters/strict-node.d.ts +32 -0
- package/dist/resolver/adapters/strict-node.d.ts.map +1 -0
- package/dist/resolver/adapters/strict-node.js +117 -0
- package/dist/resolver/adapters/strict-node.js.map +1 -0
- package/dist/resolver/index.d.ts +20 -1
- package/dist/resolver/index.d.ts.map +1 -1
- package/dist/resolver/index.js +106 -5
- package/dist/resolver/index.js.map +1 -1
- package/dist/resolver/llm-pipeline.d.ts +33 -0
- package/dist/resolver/llm-pipeline.d.ts.map +1 -0
- package/dist/resolver/llm-pipeline.js +218 -0
- package/dist/resolver/llm-pipeline.js.map +1 -0
- package/dist/resolver/policy.d.ts.map +1 -1
- package/dist/resolver/policy.js +5 -0
- package/dist/resolver/policy.js.map +1 -1
- package/dist/resolver/validate-parse-tree.d.ts +52 -0
- package/dist/resolver/validate-parse-tree.d.ts.map +1 -0
- package/dist/resolver/validate-parse-tree.js +87 -0
- package/dist/resolver/validate-parse-tree.js.map +1 -0
- package/dist/resolver/validate-strict.d.ts +27 -0
- package/dist/resolver/validate-strict.d.ts.map +1 -0
- package/dist/resolver/validate-strict.js +41 -0
- package/dist/resolver/validate-strict.js.map +1 -0
- package/dist/resolver/validation.d.ts.map +1 -1
- package/dist/resolver/validation.js +15 -1
- package/dist/resolver/validation.js.map +1 -1
- package/dist/resolvers/dispatcher.d.ts.map +1 -1
- package/dist/resolvers/dispatcher.js.map +1 -1
- package/dist/resolvers/llm-fallback.d.ts +41 -0
- package/dist/resolvers/llm-fallback.d.ts.map +1 -0
- package/dist/resolvers/llm-fallback.js +231 -0
- package/dist/resolvers/llm-fallback.js.map +1 -0
- package/dist/types.d.ts +183 -4
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,306 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests du pattern llm_proposed (v2.5) et de la pipeline LLM fallback.
|
|
3
|
+
*
|
|
4
|
+
* Couvre :
|
|
5
|
+
* 1. Comportement du PatternPlugin (flag module-level, confidence, priority)
|
|
6
|
+
* 2. tryLlmFallbackResolve (endpoint mock, parsing, validation, trace)
|
|
7
|
+
* 3. Intégration resolveAsync avec mock endpoint déterministe
|
|
8
|
+
*/
|
|
9
|
+
import { describe, it, expect, afterEach } from "vitest";
|
|
10
|
+
import llmProposed, { setLlmFallbackEnabled, isLlmFallbackEnabled, } from "../../patterns/llm-proposed.js";
|
|
11
|
+
import { tryLlmFallbackResolve } from "../../resolvers/llm-fallback.js";
|
|
12
|
+
import { resolveAsync } from "../../resolver/index.js";
|
|
13
|
+
// ─── Helpers ──────────────────────────────────────────────────
|
|
14
|
+
/** Hunk fictif minimal pour les tests unitaires du pattern */
|
|
15
|
+
const SIMPLE_HUNK = {
|
|
16
|
+
oursLines: [" level: 'warn',", " format: 'json',"],
|
|
17
|
+
baseLines: [" level: 'info',", " format: 'text',"],
|
|
18
|
+
theirsLines: [" level: 'error',", " format: 'logfmt',"],
|
|
19
|
+
startLine: 10,
|
|
20
|
+
endLine: 20,
|
|
21
|
+
};
|
|
22
|
+
/** Conflit diff3 simple pour les tests d'intégration */
|
|
23
|
+
const COMPLEX_DIFF3 = [
|
|
24
|
+
`<<<<<<< ours`,
|
|
25
|
+
` level: "warn",`,
|
|
26
|
+
` format: "json",`,
|
|
27
|
+
`||||||| base`,
|
|
28
|
+
` level: "info",`,
|
|
29
|
+
` format: "text",`,
|
|
30
|
+
`=======`,
|
|
31
|
+
` level: "error",`,
|
|
32
|
+
` format: "logfmt",`,
|
|
33
|
+
`>>>>>>> theirs`,
|
|
34
|
+
].join("\n");
|
|
35
|
+
/** Endpoint mock déterministe — retourne toujours une résolution valide */
|
|
36
|
+
function makeMockEndpoint(responseText) {
|
|
37
|
+
return {
|
|
38
|
+
async call(_prompt) {
|
|
39
|
+
return responseText;
|
|
40
|
+
},
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
// ─── 1. PatternPlugin unit tests ──────────────────────────────
|
|
44
|
+
describe("llm_proposed PatternPlugin — métadonnées", () => {
|
|
45
|
+
it("a le bon type", () => {
|
|
46
|
+
expect(llmProposed.type).toBe("llm_proposed");
|
|
47
|
+
});
|
|
48
|
+
it("a la bonne priorité (998, juste avant complex 999)", () => {
|
|
49
|
+
expect(llmProposed.priority).toBe(998);
|
|
50
|
+
});
|
|
51
|
+
it("requires === 'both' (évalué quelle que soit la disponibilité de la base)", () => {
|
|
52
|
+
expect(llmProposed.requires).toBe("both");
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
describe("llm_proposed PatternPlugin — flag module-level", () => {
|
|
56
|
+
afterEach(() => {
|
|
57
|
+
// Toujours réinitialiser le flag après chaque test
|
|
58
|
+
setLlmFallbackEnabled(false);
|
|
59
|
+
});
|
|
60
|
+
it("detect() retourne false par défaut (LLM désactivé)", () => {
|
|
61
|
+
expect(llmProposed.detect(SIMPLE_HUNK)).toBe(false);
|
|
62
|
+
});
|
|
63
|
+
it("isLlmFallbackEnabled() retourne false par défaut", () => {
|
|
64
|
+
expect(isLlmFallbackEnabled()).toBe(false);
|
|
65
|
+
});
|
|
66
|
+
it("detect() retourne true après setLlmFallbackEnabled(true)", () => {
|
|
67
|
+
setLlmFallbackEnabled(true);
|
|
68
|
+
expect(llmProposed.detect(SIMPLE_HUNK)).toBe(true);
|
|
69
|
+
});
|
|
70
|
+
it("detect() retourne false après reset setLlmFallbackEnabled(false)", () => {
|
|
71
|
+
setLlmFallbackEnabled(true);
|
|
72
|
+
setLlmFallbackEnabled(false);
|
|
73
|
+
expect(llmProposed.detect(SIMPLE_HUNK)).toBe(false);
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
describe("llm_proposed PatternPlugin — confidence", () => {
|
|
77
|
+
it("typeClassification = 50 (incertitude LLM)", () => {
|
|
78
|
+
const score = llmProposed.confidence(SIMPLE_HUNK);
|
|
79
|
+
expect(score.dimensions.typeClassification).toBe(50);
|
|
80
|
+
});
|
|
81
|
+
it("dataRisk = 60 (risque d'hallucination)", () => {
|
|
82
|
+
const score = llmProposed.confidence(SIMPLE_HUNK);
|
|
83
|
+
expect(score.dimensions.dataRisk).toBe(60);
|
|
84
|
+
});
|
|
85
|
+
it("score composite trop bas pour auto-résolution (label low ou medium)", () => {
|
|
86
|
+
const score = llmProposed.confidence(SIMPLE_HUNK);
|
|
87
|
+
// score = 50 - 60*0.40 = 50 - 24 = 26 → "low"
|
|
88
|
+
expect(score.label).toBe("low");
|
|
89
|
+
expect(score.score).toBeLessThan(44);
|
|
90
|
+
});
|
|
91
|
+
it("penalties liste les risques LLM", () => {
|
|
92
|
+
const score = llmProposed.confidence(SIMPLE_HUNK);
|
|
93
|
+
expect(score.penalties.length).toBeGreaterThan(0);
|
|
94
|
+
expect(score.penalties.some((p) => p.toLowerCase().includes("llm") || p.toLowerCase().includes("déterministe"))).toBe(true);
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
// ─── 2. tryLlmFallbackResolve ─────────────────────────────────
|
|
98
|
+
describe("tryLlmFallbackResolve — sans endpoint", () => {
|
|
99
|
+
it("retourne lines: null quand endpoint absent", async () => {
|
|
100
|
+
const hunk = {
|
|
101
|
+
...SIMPLE_HUNK,
|
|
102
|
+
type: "llm_proposed",
|
|
103
|
+
confidence: llmProposed.confidence(SIMPLE_HUNK),
|
|
104
|
+
explanation: llmProposed.explanation(SIMPLE_HUNK),
|
|
105
|
+
trace: {
|
|
106
|
+
steps: [],
|
|
107
|
+
selected: "llm_proposed",
|
|
108
|
+
summary: "test",
|
|
109
|
+
hasBase: true,
|
|
110
|
+
},
|
|
111
|
+
zdiff3: false,
|
|
112
|
+
};
|
|
113
|
+
const result = await tryLlmFallbackResolve(hunk, "src/config.ts", "// contexte fictif", { enabled: true });
|
|
114
|
+
expect(result.lines).toBeNull();
|
|
115
|
+
expect(result.llmTrace.accepted).toBe(false);
|
|
116
|
+
expect(result.reason).toMatch(/endpoint/i);
|
|
117
|
+
});
|
|
118
|
+
});
|
|
119
|
+
describe("tryLlmFallbackResolve — endpoint mock", () => {
|
|
120
|
+
const MOCK_HUNK = {
|
|
121
|
+
oursLines: [` level: "warn",`, ` format: "json",`],
|
|
122
|
+
baseLines: [` level: "info",`, ` format: "text",`],
|
|
123
|
+
theirsLines: [` level: "error",`, ` format: "logfmt",`],
|
|
124
|
+
startLine: 10,
|
|
125
|
+
endLine: 20,
|
|
126
|
+
type: "llm_proposed",
|
|
127
|
+
confidence: llmProposed.confidence(SIMPLE_HUNK),
|
|
128
|
+
explanation: llmProposed.explanation(SIMPLE_HUNK),
|
|
129
|
+
trace: {
|
|
130
|
+
steps: [],
|
|
131
|
+
selected: "llm_proposed",
|
|
132
|
+
summary: "LLM fallback activé",
|
|
133
|
+
hasBase: true,
|
|
134
|
+
},
|
|
135
|
+
zdiff3: false,
|
|
136
|
+
};
|
|
137
|
+
it("extrait les lignes d'un bloc fencé valide", async () => {
|
|
138
|
+
const endpoint = makeMockEndpoint("```\n level: \"warn\",\n format: \"json\",\n```");
|
|
139
|
+
const result = await tryLlmFallbackResolve(MOCK_HUNK, "src/config.ts", "", {
|
|
140
|
+
enabled: true,
|
|
141
|
+
endpoint,
|
|
142
|
+
});
|
|
143
|
+
expect(result.lines).not.toBeNull();
|
|
144
|
+
expect(result.lines).toEqual([` level: "warn",`, ` format: "json",`]);
|
|
145
|
+
expect(result.llmTrace.accepted).toBe(true);
|
|
146
|
+
});
|
|
147
|
+
it("retourne lines: null pour CANNOT_RESOLVE", async () => {
|
|
148
|
+
const endpoint = makeMockEndpoint("CANNOT_RESOLVE");
|
|
149
|
+
const result = await tryLlmFallbackResolve(MOCK_HUNK, "src/config.ts", "", {
|
|
150
|
+
enabled: true,
|
|
151
|
+
endpoint,
|
|
152
|
+
});
|
|
153
|
+
expect(result.lines).toBeNull();
|
|
154
|
+
expect(result.llmTrace.accepted).toBe(false);
|
|
155
|
+
expect(result.reason).toMatch(/cannot_resolve|refusé/i);
|
|
156
|
+
});
|
|
157
|
+
it("retourne lines: null quand l'endpoint throw une erreur", async () => {
|
|
158
|
+
const endpoint = {
|
|
159
|
+
async call() { throw new Error("network timeout"); },
|
|
160
|
+
};
|
|
161
|
+
const result = await tryLlmFallbackResolve(MOCK_HUNK, "src/config.ts", "", {
|
|
162
|
+
enabled: true,
|
|
163
|
+
endpoint,
|
|
164
|
+
});
|
|
165
|
+
expect(result.lines).toBeNull();
|
|
166
|
+
expect(result.llmTrace.accepted).toBe(false);
|
|
167
|
+
expect(result.reason).toMatch(/erreur|network timeout/i);
|
|
168
|
+
});
|
|
169
|
+
it("LlmTrace — promptHash est un hash SHA-256 hexadécimal (64 chars)", async () => {
|
|
170
|
+
const endpoint = makeMockEndpoint("```\n level: \"warn\",\n```");
|
|
171
|
+
const result = await tryLlmFallbackResolve(MOCK_HUNK, "src/config.ts", "", {
|
|
172
|
+
enabled: true,
|
|
173
|
+
endpoint,
|
|
174
|
+
});
|
|
175
|
+
expect(result.llmTrace.promptHash).toMatch(/^[0-9a-f]{64}$/);
|
|
176
|
+
});
|
|
177
|
+
it("LlmTrace — rawResponseTruncated est ≤ 500 chars", async () => {
|
|
178
|
+
const longResponse = "x".repeat(1000);
|
|
179
|
+
const endpoint = makeMockEndpoint(longResponse);
|
|
180
|
+
const result = await tryLlmFallbackResolve(MOCK_HUNK, "src/config.ts", "", {
|
|
181
|
+
enabled: true,
|
|
182
|
+
endpoint,
|
|
183
|
+
});
|
|
184
|
+
expect(result.llmTrace.rawResponseTruncated.length).toBeLessThanOrEqual(500);
|
|
185
|
+
});
|
|
186
|
+
it("LlmTrace — calledAt est un ISO 8601 valide", async () => {
|
|
187
|
+
const endpoint = makeMockEndpoint("```\n level: \"warn\",\n```");
|
|
188
|
+
const result = await tryLlmFallbackResolve(MOCK_HUNK, "src/config.ts", "", {
|
|
189
|
+
enabled: true,
|
|
190
|
+
endpoint,
|
|
191
|
+
});
|
|
192
|
+
expect(() => new Date(result.llmTrace.calledAt)).not.toThrow();
|
|
193
|
+
expect(new Date(result.llmTrace.calledAt).toISOString()).toBe(result.llmTrace.calledAt);
|
|
194
|
+
});
|
|
195
|
+
it("LlmTrace — model par défaut est claude-sonnet-4-6", async () => {
|
|
196
|
+
const endpoint = makeMockEndpoint("```\n level: \"warn\",\n```");
|
|
197
|
+
const result = await tryLlmFallbackResolve(MOCK_HUNK, "src/config.ts", "", {
|
|
198
|
+
enabled: true,
|
|
199
|
+
endpoint,
|
|
200
|
+
});
|
|
201
|
+
expect(result.llmTrace.model).toBe("claude-sonnet-4-6");
|
|
202
|
+
});
|
|
203
|
+
it("refus si validationScore < minPostMergeScore (marqueurs résiduels)", async () => {
|
|
204
|
+
// Endpoint qui retourne des marqueurs de conflit résiduels
|
|
205
|
+
const endpoint = makeMockEndpoint("```\n<<<<<<< ours\n bad content\n>>>>>>> theirs\n```");
|
|
206
|
+
const result = await tryLlmFallbackResolve(MOCK_HUNK, "src/config.ts", "", {
|
|
207
|
+
enabled: true,
|
|
208
|
+
endpoint,
|
|
209
|
+
minPostMergeScore: 80,
|
|
210
|
+
});
|
|
211
|
+
expect(result.lines).toBeNull();
|
|
212
|
+
expect(result.llmTrace.validationScore).toBe(0);
|
|
213
|
+
expect(result.llmTrace.accepted).toBe(false);
|
|
214
|
+
});
|
|
215
|
+
});
|
|
216
|
+
// ─── 3. resolveAsync — intégration LLM fallback ───────────────
|
|
217
|
+
describe("resolveAsync — sans llmFallback", () => {
|
|
218
|
+
it("un hunk complex reste complex et non résolu", async () => {
|
|
219
|
+
const result = await resolveAsync(COMPLEX_DIFF3, "src/config.ts");
|
|
220
|
+
expect(result.hunks[0].type).toBe("complex");
|
|
221
|
+
expect(result.stats.autoResolved).toBe(0);
|
|
222
|
+
expect(result.mergedContent).toBeNull();
|
|
223
|
+
});
|
|
224
|
+
});
|
|
225
|
+
describe("resolveAsync — avec llmFallback enabled sans endpoint", () => {
|
|
226
|
+
it("le hunk reste complex quand l'endpoint est absent (flag LLM non activé)", async () => {
|
|
227
|
+
// Sans endpoint, llmEnabled = false → setLlmFallbackEnabled jamais appelé
|
|
228
|
+
// → classification normale → "complex"
|
|
229
|
+
const result = await resolveAsync(COMPLEX_DIFF3, "src/config.ts", {
|
|
230
|
+
llmFallback: { enabled: true }, // enabled mais pas d'endpoint → llmEnabled = false
|
|
231
|
+
});
|
|
232
|
+
expect(result.hunks[0].type).toBe("complex");
|
|
233
|
+
expect(result.stats.autoResolved).toBe(0);
|
|
234
|
+
expect(result.mergedContent).toBeNull();
|
|
235
|
+
});
|
|
236
|
+
});
|
|
237
|
+
describe("resolveAsync — avec llmFallback enabled et endpoint mock", () => {
|
|
238
|
+
// Note : on utilise validationLevel: "off" pour éviter la validation parse-tree
|
|
239
|
+
// sur des contenus partiels (lignes de code hors d'un fichier complet).
|
|
240
|
+
// En production, l'appelant fournit un fichier complet qui parse correctement.
|
|
241
|
+
it("résout le hunk complex via LLM, mergedContent non null", async () => {
|
|
242
|
+
const resolvedLines = ` level: "warn",\n format: "json",`;
|
|
243
|
+
const endpoint = makeMockEndpoint(`\`\`\`\n${resolvedLines}\n\`\`\``);
|
|
244
|
+
const result = await resolveAsync(COMPLEX_DIFF3, "src/config.ts", {
|
|
245
|
+
llmFallback: { enabled: true, endpoint },
|
|
246
|
+
validationLevel: "off",
|
|
247
|
+
});
|
|
248
|
+
expect(result.stats.autoResolved).toBe(1);
|
|
249
|
+
expect(result.mergedContent).not.toBeNull();
|
|
250
|
+
expect(result.hunks[0].type).toBe("llm_proposed");
|
|
251
|
+
});
|
|
252
|
+
it("la DecisionTrace contient llmTrace quand résolu par LLM", async () => {
|
|
253
|
+
const resolvedLines = ` level: "warn",\n format: "json",`;
|
|
254
|
+
const endpoint = makeMockEndpoint(`\`\`\`\n${resolvedLines}\n\`\`\``);
|
|
255
|
+
const result = await resolveAsync(COMPLEX_DIFF3, "src/config.ts", {
|
|
256
|
+
llmFallback: { enabled: true, endpoint },
|
|
257
|
+
validationLevel: "off",
|
|
258
|
+
});
|
|
259
|
+
const hunk = result.resolutions[0].hunk;
|
|
260
|
+
expect(hunk.trace.llmTrace).toBeDefined();
|
|
261
|
+
expect(hunk.trace.llmTrace.accepted).toBe(true);
|
|
262
|
+
expect(hunk.trace.llmTrace.promptHash).toMatch(/^[0-9a-f]{64}$/);
|
|
263
|
+
});
|
|
264
|
+
it("reste non résolu si l'endpoint retourne CANNOT_RESOLVE", async () => {
|
|
265
|
+
const endpoint = makeMockEndpoint("CANNOT_RESOLVE");
|
|
266
|
+
const result = await resolveAsync(COMPLEX_DIFF3, "src/config.ts", {
|
|
267
|
+
llmFallback: { enabled: true, endpoint },
|
|
268
|
+
validationLevel: "off",
|
|
269
|
+
});
|
|
270
|
+
expect(result.stats.autoResolved).toBe(0);
|
|
271
|
+
expect(result.mergedContent).toBeNull();
|
|
272
|
+
// La trace LLM est quand même attachée pour l'audit
|
|
273
|
+
expect(result.resolutions[0].hunk.trace.llmTrace).toBeDefined();
|
|
274
|
+
expect(result.resolutions[0].hunk.trace.llmTrace.accepted).toBe(false);
|
|
275
|
+
});
|
|
276
|
+
it("les hunks déjà résolus (non-complex) ne sont pas re-classifiés llm_proposed", async () => {
|
|
277
|
+
// Conflit trivial + conflit complexe
|
|
278
|
+
const mixedInput = [
|
|
279
|
+
`<<<<<<< ours`,
|
|
280
|
+
`const x = 1;`,
|
|
281
|
+
`||||||| base`,
|
|
282
|
+
`const x = 1;`,
|
|
283
|
+
`=======`,
|
|
284
|
+
`const x = 1;`,
|
|
285
|
+
`>>>>>>> theirs`,
|
|
286
|
+
`some text`,
|
|
287
|
+
`<<<<<<< ours`,
|
|
288
|
+
` level: "warn",`,
|
|
289
|
+
`||||||| base`,
|
|
290
|
+
` level: "info",`,
|
|
291
|
+
`=======`,
|
|
292
|
+
` level: "error",`,
|
|
293
|
+
`>>>>>>> theirs`,
|
|
294
|
+
].join("\n");
|
|
295
|
+
const endpoint = makeMockEndpoint("```\n level: \"warn\",\n```");
|
|
296
|
+
const result = await resolveAsync(mixedInput, "src/config.ts", {
|
|
297
|
+
llmFallback: { enabled: true, endpoint },
|
|
298
|
+
validationLevel: "off",
|
|
299
|
+
});
|
|
300
|
+
// Premier hunk : same_change, auto-résolu par le moteur déterministe
|
|
301
|
+
expect(result.hunks[0].type).toBe("same_change");
|
|
302
|
+
// Deuxième hunk : llm_proposed, résolu via LLM
|
|
303
|
+
expect(result.hunks[1].type).toBe("llm_proposed");
|
|
304
|
+
});
|
|
305
|
+
});
|
|
306
|
+
//# sourceMappingURL=llm-proposed.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"llm-proposed.test.js","sourceRoot":"","sources":["../../../src/__tests__/patterns/llm-proposed.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests du pattern non_overlapping (priority 40)
|
|
3
|
+
*
|
|
4
|
+
* Nécessite diff3 (base obligatoire).
|
|
5
|
+
* Détection : l'algorithme mergeNonOverlapping() interne réussit —
|
|
6
|
+
* les zones modifiées par ours et theirs ne se chevauchent pas.
|
|
7
|
+
* Cas typique : ours ajoute des lignes en haut, theirs ajoute en bas.
|
|
8
|
+
* Auto-résolu en combinant les deux ensembles de changements.
|
|
9
|
+
*/
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=non-overlapping.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"non-overlapping.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/patterns/non-overlapping.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}
|
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests du pattern non_overlapping (priority 40)
|
|
3
|
+
*
|
|
4
|
+
* Nécessite diff3 (base obligatoire).
|
|
5
|
+
* Détection : l'algorithme mergeNonOverlapping() interne réussit —
|
|
6
|
+
* les zones modifiées par ours et theirs ne se chevauchent pas.
|
|
7
|
+
* Cas typique : ours ajoute des lignes en haut, theirs ajoute en bas.
|
|
8
|
+
* Auto-résolu en combinant les deux ensembles de changements.
|
|
9
|
+
*/
|
|
10
|
+
import { describe, it, expect } from "vitest";
|
|
11
|
+
import { resolve } from "../../resolver.js";
|
|
12
|
+
// ─── Cas qui doivent matcher non_overlapping ─────────────────
|
|
13
|
+
describe("non_overlapping : ours insère en haut, theirs insère en bas (diff3)", () => {
|
|
14
|
+
const input = [
|
|
15
|
+
`<<<<<<< ours`,
|
|
16
|
+
` INSERTED_BY_OURS,`,
|
|
17
|
+
` alpha,`,
|
|
18
|
+
` beta,`,
|
|
19
|
+
`||||||| base`,
|
|
20
|
+
` alpha,`,
|
|
21
|
+
` beta,`,
|
|
22
|
+
`=======`,
|
|
23
|
+
` alpha,`,
|
|
24
|
+
` beta,`,
|
|
25
|
+
` INSERTED_BY_THEIRS,`,
|
|
26
|
+
`>>>>>>> theirs`,
|
|
27
|
+
].join("\n");
|
|
28
|
+
it("classifie en non_overlapping", () => {
|
|
29
|
+
const result = resolve(input, "src/list.ts");
|
|
30
|
+
expect(result.hunks[0].type).toBe("non_overlapping");
|
|
31
|
+
});
|
|
32
|
+
it("auto-résout (autoResolved === 1)", () => {
|
|
33
|
+
const result = resolve(input, "src/list.ts");
|
|
34
|
+
expect(result.stats.autoResolved).toBe(1);
|
|
35
|
+
});
|
|
36
|
+
it("le résultat contient les insertions des deux côtés", () => {
|
|
37
|
+
const result = resolve(input, "src/list.ts");
|
|
38
|
+
const merged = result.mergedContent;
|
|
39
|
+
expect(merged).toContain("INSERTED_BY_OURS");
|
|
40
|
+
expect(merged).toContain("INSERTED_BY_THEIRS");
|
|
41
|
+
expect(merged).toContain("alpha");
|
|
42
|
+
expect(merged).toContain("beta");
|
|
43
|
+
});
|
|
44
|
+
});
|
|
45
|
+
describe("non_overlapping : ours modifie première ligne, theirs modifie dernière ligne (diff3)", () => {
|
|
46
|
+
const input = [
|
|
47
|
+
`<<<<<<< ours`,
|
|
48
|
+
` host: "prod.example.com",`,
|
|
49
|
+
` port: 5432,`,
|
|
50
|
+
` name: "mydb",`,
|
|
51
|
+
`||||||| base`,
|
|
52
|
+
` host: "localhost",`,
|
|
53
|
+
` port: 5432,`,
|
|
54
|
+
` name: "mydb",`,
|
|
55
|
+
`=======`,
|
|
56
|
+
` host: "localhost",`,
|
|
57
|
+
` port: 5432,`,
|
|
58
|
+
` name: "production_db",`,
|
|
59
|
+
`>>>>>>> theirs`,
|
|
60
|
+
].join("\n");
|
|
61
|
+
it("classifie en non_overlapping", () => {
|
|
62
|
+
const result = resolve(input, "src/db-config.ts");
|
|
63
|
+
expect(result.hunks[0].type).toBe("non_overlapping");
|
|
64
|
+
});
|
|
65
|
+
it("auto-résout", () => {
|
|
66
|
+
const result = resolve(input, "src/db-config.ts");
|
|
67
|
+
expect(result.stats.autoResolved).toBe(1);
|
|
68
|
+
});
|
|
69
|
+
it("le résultat combine les deux modifications", () => {
|
|
70
|
+
const result = resolve(input, "src/db-config.ts");
|
|
71
|
+
const merged = result.mergedContent;
|
|
72
|
+
expect(merged).toContain("prod.example.com");
|
|
73
|
+
expect(merged).toContain("production_db");
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
describe("non_overlapping : ours ajoute avant, theirs ajoute au milieu (diff3)", () => {
|
|
77
|
+
const input = [
|
|
78
|
+
`<<<<<<< ours`,
|
|
79
|
+
` alpha,`,
|
|
80
|
+
` INSERTED_BY_OURS,`,
|
|
81
|
+
` beta,`,
|
|
82
|
+
` gamma,`,
|
|
83
|
+
`||||||| base`,
|
|
84
|
+
` alpha,`,
|
|
85
|
+
` beta,`,
|
|
86
|
+
` gamma,`,
|
|
87
|
+
`=======`,
|
|
88
|
+
` alpha,`,
|
|
89
|
+
` beta,`,
|
|
90
|
+
` INSERTED_BY_THEIRS,`,
|
|
91
|
+
` gamma,`,
|
|
92
|
+
`>>>>>>> theirs`,
|
|
93
|
+
].join("\n");
|
|
94
|
+
it("classifie en non_overlapping", () => {
|
|
95
|
+
const result = resolve(input, "src/items.ts");
|
|
96
|
+
expect(result.hunks[0].type).toBe("non_overlapping");
|
|
97
|
+
});
|
|
98
|
+
it("auto-résout", () => {
|
|
99
|
+
const result = resolve(input, "src/items.ts");
|
|
100
|
+
expect(result.stats.autoResolved).toBe(1);
|
|
101
|
+
});
|
|
102
|
+
});
|
|
103
|
+
describe("non_overlapping : modifications sur lignes distinctes (diff3)", () => {
|
|
104
|
+
const input = [
|
|
105
|
+
`<<<<<<< ours`,
|
|
106
|
+
` firstName: "John",`,
|
|
107
|
+
` age: 30,`,
|
|
108
|
+
` city: "Paris",`,
|
|
109
|
+
`||||||| base`,
|
|
110
|
+
` firstName: "John",`,
|
|
111
|
+
` age: 25,`,
|
|
112
|
+
` city: "Paris",`,
|
|
113
|
+
`=======`,
|
|
114
|
+
` firstName: "Jane",`,
|
|
115
|
+
` age: 25,`,
|
|
116
|
+
` city: "Paris",`,
|
|
117
|
+
`>>>>>>> theirs`,
|
|
118
|
+
].join("\n");
|
|
119
|
+
it("classifie en non_overlapping", () => {
|
|
120
|
+
const result = resolve(input, "src/user.ts");
|
|
121
|
+
expect(result.hunks[0].type).toBe("non_overlapping");
|
|
122
|
+
});
|
|
123
|
+
it("auto-résout", () => {
|
|
124
|
+
const result = resolve(input, "src/user.ts");
|
|
125
|
+
expect(result.stats.autoResolved).toBe(1);
|
|
126
|
+
});
|
|
127
|
+
});
|
|
128
|
+
describe("non_overlapping : ajout d'imports dans des branches (diff3)", () => {
|
|
129
|
+
const input = [
|
|
130
|
+
`<<<<<<< ours`,
|
|
131
|
+
`import { ComponentA } from "./a";`,
|
|
132
|
+
`import { NewFromOurs } from "./ours";`,
|
|
133
|
+
`import { ComponentB } from "./b";`,
|
|
134
|
+
`||||||| base`,
|
|
135
|
+
`import { ComponentA } from "./a";`,
|
|
136
|
+
`import { ComponentB } from "./b";`,
|
|
137
|
+
`=======`,
|
|
138
|
+
`import { ComponentA } from "./a";`,
|
|
139
|
+
`import { ComponentB } from "./b";`,
|
|
140
|
+
`import { NewFromTheirs } from "./theirs";`,
|
|
141
|
+
`>>>>>>> theirs`,
|
|
142
|
+
].join("\n");
|
|
143
|
+
it("classifie en non_overlapping", () => {
|
|
144
|
+
const result = resolve(input, "src/imports.ts");
|
|
145
|
+
expect(result.hunks[0].type).toBe("non_overlapping");
|
|
146
|
+
});
|
|
147
|
+
it("auto-résout", () => {
|
|
148
|
+
const result = resolve(input, "src/imports.ts");
|
|
149
|
+
expect(result.stats.autoResolved).toBe(1);
|
|
150
|
+
});
|
|
151
|
+
it("le résultat contient les imports des deux branches", () => {
|
|
152
|
+
const result = resolve(input, "src/imports.ts");
|
|
153
|
+
const merged = result.mergedContent;
|
|
154
|
+
expect(merged).toContain("NewFromOurs");
|
|
155
|
+
expect(merged).toContain("NewFromTheirs");
|
|
156
|
+
});
|
|
157
|
+
});
|
|
158
|
+
// ─── Cas qui ne doivent PAS matcher non_overlapping ──────────
|
|
159
|
+
describe("non_overlapping : cas qui ne doivent pas matcher", () => {
|
|
160
|
+
it("ne matche pas si les deux côtés modifient la même ligne", () => {
|
|
161
|
+
const input = [
|
|
162
|
+
`<<<<<<< ours`,
|
|
163
|
+
` value: "ours",`,
|
|
164
|
+
`||||||| base`,
|
|
165
|
+
` value: "base",`,
|
|
166
|
+
`=======`,
|
|
167
|
+
` value: "theirs",`,
|
|
168
|
+
`>>>>>>> theirs`,
|
|
169
|
+
].join("\n");
|
|
170
|
+
// Les deux modifient la même ligne → pas non_overlapping
|
|
171
|
+
const result = resolve(input, "src/test.ts");
|
|
172
|
+
expect(result.hunks[0].type).not.toBe("non_overlapping");
|
|
173
|
+
});
|
|
174
|
+
it("ne matche pas si les deux insèrent la même ligne (same_change prioritaire)", () => {
|
|
175
|
+
const input = [
|
|
176
|
+
`<<<<<<< ours`,
|
|
177
|
+
` foo,`,
|
|
178
|
+
` SAME_INSERTION,`,
|
|
179
|
+
`||||||| base`,
|
|
180
|
+
` foo,`,
|
|
181
|
+
`=======`,
|
|
182
|
+
` foo,`,
|
|
183
|
+
` SAME_INSERTION,`,
|
|
184
|
+
`>>>>>>> theirs`,
|
|
185
|
+
].join("\n");
|
|
186
|
+
// same_change (prio 10) prend la main
|
|
187
|
+
const result = resolve(input, "src/test.ts");
|
|
188
|
+
expect(result.hunks[0].type).toBe("same_change");
|
|
189
|
+
});
|
|
190
|
+
it("ne matche pas sans base (diff2)", () => {
|
|
191
|
+
const input = [
|
|
192
|
+
`<<<<<<< ours`,
|
|
193
|
+
` alpha,`,
|
|
194
|
+
` OURS,`,
|
|
195
|
+
` beta,`,
|
|
196
|
+
`=======`,
|
|
197
|
+
` alpha,`,
|
|
198
|
+
` beta,`,
|
|
199
|
+
` THEIRS,`,
|
|
200
|
+
`>>>>>>> theirs`,
|
|
201
|
+
].join("\n");
|
|
202
|
+
// Sans base on ne peut pas appliquer non_overlapping
|
|
203
|
+
const result = resolve(input, "src/test.ts");
|
|
204
|
+
expect(result.hunks[0].type).not.toBe("non_overlapping");
|
|
205
|
+
});
|
|
206
|
+
it("ne matche pas si les deux côtés modifient des zones adjacentes qui se chevauchent", () => {
|
|
207
|
+
const input = [
|
|
208
|
+
`<<<<<<< ours`,
|
|
209
|
+
` a: 1,`,
|
|
210
|
+
` b: 20,`,
|
|
211
|
+
` c: 30,`,
|
|
212
|
+
`||||||| base`,
|
|
213
|
+
` a: 1,`,
|
|
214
|
+
` b: 2,`,
|
|
215
|
+
` c: 3,`,
|
|
216
|
+
`=======`,
|
|
217
|
+
` a: 1,`,
|
|
218
|
+
` b: 200,`,
|
|
219
|
+
` c: 300,`,
|
|
220
|
+
`>>>>>>> theirs`,
|
|
221
|
+
].join("\n");
|
|
222
|
+
// Les deux modifient b et c → chevauchement
|
|
223
|
+
const result = resolve(input, "src/test.ts");
|
|
224
|
+
expect(result.hunks[0].type).not.toBe("non_overlapping");
|
|
225
|
+
});
|
|
226
|
+
it("ne matche pas si ours === theirs (same_change prioritaire)", () => {
|
|
227
|
+
const input = [
|
|
228
|
+
`<<<<<<< ours`,
|
|
229
|
+
` x: 42,`,
|
|
230
|
+
`||||||| base`,
|
|
231
|
+
` x: 1,`,
|
|
232
|
+
`=======`,
|
|
233
|
+
` x: 42,`,
|
|
234
|
+
`>>>>>>> theirs`,
|
|
235
|
+
].join("\n");
|
|
236
|
+
const result = resolve(input, "src/test.ts");
|
|
237
|
+
expect(result.hunks[0].type).toBe("same_change");
|
|
238
|
+
});
|
|
239
|
+
});
|
|
240
|
+
//# sourceMappingURL=non-overlapping.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"non-overlapping.test.js","sourceRoot":"","sources":["../../../src/__tests__/patterns/non-overlapping.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests du pattern one_side_change (priority 30)
|
|
3
|
+
*
|
|
4
|
+
* Nécessite diff3 (base obligatoire).
|
|
5
|
+
* Détection : (ours === base ET theirs ≠ base) OU (ours ≠ base ET theirs === base).
|
|
6
|
+
* Un seul côté a modifié par rapport à la base — l'autre est resté identique.
|
|
7
|
+
* Auto-résolu en prenant le côté qui a changé.
|
|
8
|
+
*/
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=one-side-change.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"one-side-change.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/patterns/one-side-change.test.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
|