@gitwand/cli 2.18.0 → 2.20.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/cli.d.ts.map +1 -1
- package/dist/cli.js +10 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/preview.d.ts +23 -0
- package/dist/commands/preview.d.ts.map +1 -0
- package/dist/commands/preview.js +356 -0
- package/dist/commands/preview.js.map +1 -0
- package/package.json +2 -2
package/dist/cli.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAuCH;;;GAGG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG;IACzC,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,CAAC,CAAC;CACzC,CAoBA;AAED;;;;GAIG;AACH,wBAAsB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAiB1C"}
|
package/dist/cli.js
CHANGED
|
@@ -20,11 +20,13 @@ import { c, printBanner } from "./ui.js";
|
|
|
20
20
|
import { DEFAULT_CONCURRENCY } from "./concurrency.js";
|
|
21
21
|
import { cmdResolve } from "./commands/resolve.js";
|
|
22
22
|
import { cmdStatus } from "./commands/status.js";
|
|
23
|
+
import { cmdPreview } from "./commands/preview.js";
|
|
23
24
|
function printHelp() {
|
|
24
25
|
printBanner();
|
|
25
26
|
console.log(`${c.bold}Usage:${c.reset}`);
|
|
26
27
|
console.log(` gitwand resolve [files...] Auto-resolve trivial conflicts`);
|
|
27
28
|
console.log(` gitwand status Show conflict status`);
|
|
29
|
+
console.log(` gitwand preview Predict conflicts before merge/rebase/cherry-pick`);
|
|
28
30
|
console.log(` gitwand --help Show this help`);
|
|
29
31
|
console.log();
|
|
30
32
|
console.log(`${c.bold}Options:${c.reset}`);
|
|
@@ -34,6 +36,11 @@ function printHelp() {
|
|
|
34
36
|
console.log(` --concurrency=N Parallel file workers (default ${DEFAULT_CONCURRENCY}, min 1)`);
|
|
35
37
|
console.log(` --ci CI mode: JSON output + exit code 1 if unresolved`);
|
|
36
38
|
console.log(` --json Output results as JSON (implies --ci behavior)`);
|
|
39
|
+
console.log();
|
|
40
|
+
console.log(`${c.bold}Preview options:${c.reset}`);
|
|
41
|
+
console.log(` --onto=<ref> Rebase preview: HEAD rebased onto <ref>`);
|
|
42
|
+
console.log(` --commit=<sha> Cherry-pick preview: <sha> applied onto HEAD`);
|
|
43
|
+
console.log(` --branch=<name> Merge preview: <name> merged into HEAD`);
|
|
37
44
|
console.log(` --llm-fallback Enable LLM fallback for unresolved conflicts (opt-in, experimental)`);
|
|
38
45
|
console.log(` --llm-provider=X LLM provider: claude (default) | openai | ollama`);
|
|
39
46
|
console.log(` --llm-model=X Model name (e.g. claude-sonnet-4-6, gpt-4o-mini, llama3)`);
|
|
@@ -86,6 +93,9 @@ export async function main() {
|
|
|
86
93
|
else if (command === "status") {
|
|
87
94
|
await cmdStatus(flags);
|
|
88
95
|
}
|
|
96
|
+
else if (command === "preview") {
|
|
97
|
+
await cmdPreview(flags);
|
|
98
|
+
}
|
|
89
99
|
else {
|
|
90
100
|
console.error(`${c.red}Unknown command: ${command}${c.reset}`);
|
|
91
101
|
printHelp();
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,CAAC,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Commande `gitwand preview` — Conflict Predictor étendu (v2.20).
|
|
3
|
+
*
|
|
4
|
+
* Simule un merge, rebase ou cherry-pick SANS toucher le working tree,
|
|
5
|
+
* l'index ou HEAD. Utilise `git merge-file` sur des blobs temporaires
|
|
6
|
+
* pour produire un contenu balisé conflit, puis passe chaque fichier
|
|
7
|
+
* par le moteur `resolve()` de `@gitwand/core` pour évaluer ce que
|
|
8
|
+
* GitWand peut auto-résoudre vs. ce qui nécessite une intervention.
|
|
9
|
+
*
|
|
10
|
+
* Options :
|
|
11
|
+
* --onto <ref> Rebase preview : rebaser HEAD sur <ref>
|
|
12
|
+
* --commit <sha> Cherry-pick preview : cherry-picker <sha> sur HEAD
|
|
13
|
+
* --branch <name> Merge preview : merger <name> dans HEAD
|
|
14
|
+
* --json Output machine-readable JSON
|
|
15
|
+
* --ci Identique à --json (pour CI/CD pipelines)
|
|
16
|
+
*
|
|
17
|
+
* Exit codes :
|
|
18
|
+
* 0 — aucun conflit prédit (ou aucune modification qui se chevauche)
|
|
19
|
+
* 1 — au moins un conflit prédit
|
|
20
|
+
* 2 — erreur (ref invalide, hors repo git, etc.)
|
|
21
|
+
*/
|
|
22
|
+
export declare function cmdPreview(flags: Record<string, boolean | string>): Promise<void>;
|
|
23
|
+
//# sourceMappingURL=preview.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preview.d.ts","sourceRoot":"","sources":["../../src/commands/preview.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAiOH,wBAAsB,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAyKvF"}
|
|
@@ -0,0 +1,356 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Commande `gitwand preview` — Conflict Predictor étendu (v2.20).
|
|
3
|
+
*
|
|
4
|
+
* Simule un merge, rebase ou cherry-pick SANS toucher le working tree,
|
|
5
|
+
* l'index ou HEAD. Utilise `git merge-file` sur des blobs temporaires
|
|
6
|
+
* pour produire un contenu balisé conflit, puis passe chaque fichier
|
|
7
|
+
* par le moteur `resolve()` de `@gitwand/core` pour évaluer ce que
|
|
8
|
+
* GitWand peut auto-résoudre vs. ce qui nécessite une intervention.
|
|
9
|
+
*
|
|
10
|
+
* Options :
|
|
11
|
+
* --onto <ref> Rebase preview : rebaser HEAD sur <ref>
|
|
12
|
+
* --commit <sha> Cherry-pick preview : cherry-picker <sha> sur HEAD
|
|
13
|
+
* --branch <name> Merge preview : merger <name> dans HEAD
|
|
14
|
+
* --json Output machine-readable JSON
|
|
15
|
+
* --ci Identique à --json (pour CI/CD pipelines)
|
|
16
|
+
*
|
|
17
|
+
* Exit codes :
|
|
18
|
+
* 0 — aucun conflit prédit (ou aucune modification qui se chevauche)
|
|
19
|
+
* 1 — au moins un conflit prédit
|
|
20
|
+
* 2 — erreur (ref invalide, hors repo git, etc.)
|
|
21
|
+
*/
|
|
22
|
+
import { writeFileSync, mkdtempSync, rmSync } from "node:fs";
|
|
23
|
+
import { execFileSync } from "node:child_process";
|
|
24
|
+
import { join as joinPath } from "node:path";
|
|
25
|
+
import { tmpdir } from "node:os";
|
|
26
|
+
import { resolve } from "@gitwand/core";
|
|
27
|
+
import { c, printBanner } from "../ui.js";
|
|
28
|
+
// ─── Git helpers ───────────────────────────────────────────
|
|
29
|
+
/** Run git with args as a discrete array — no shell interpolation. */
|
|
30
|
+
function gitTry(cwd, args) {
|
|
31
|
+
try {
|
|
32
|
+
const out = execFileSync("git", args, {
|
|
33
|
+
cwd,
|
|
34
|
+
encoding: "utf-8",
|
|
35
|
+
stdio: ["ignore", "pipe", "ignore"],
|
|
36
|
+
});
|
|
37
|
+
return out.trim();
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Run `git merge-file` and return the merged content INCLUDING conflict markers.
|
|
45
|
+
*
|
|
46
|
+
* Unlike gitTry, this must NOT discard output on a non-zero exit: `git merge-file`
|
|
47
|
+
* exits with a code equal to the number of conflicts (>0 means there ARE
|
|
48
|
+
* conflicts — exactly the case the predictor cares about), and the conflict-marked
|
|
49
|
+
* content is still written to stdout. Returns the content as-is, or null only on a
|
|
50
|
+
* real spawn failure or a fatal git error (exit 255 / no captured stdout).
|
|
51
|
+
*/
|
|
52
|
+
function gitMergeFile(cwd, args) {
|
|
53
|
+
try {
|
|
54
|
+
const out = execFileSync("git", ["merge-file", ...args], {
|
|
55
|
+
cwd,
|
|
56
|
+
encoding: "utf-8",
|
|
57
|
+
stdio: ["ignore", "pipe", "ignore"],
|
|
58
|
+
});
|
|
59
|
+
return out; // clean merge, exit 0
|
|
60
|
+
}
|
|
61
|
+
catch (e) {
|
|
62
|
+
const err = e;
|
|
63
|
+
if (typeof err.stdout === "string" && err.stdout.length > 0) {
|
|
64
|
+
return err.stdout;
|
|
65
|
+
}
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
/** Resolve a ref to a commit SHA, null if unknown. */
|
|
70
|
+
function revParse(cwd, rev) {
|
|
71
|
+
return gitTry(cwd, ["rev-parse", "--verify", "--quiet", `${rev}^{commit}`]);
|
|
72
|
+
}
|
|
73
|
+
/** Files changed between two revs (--name-only). */
|
|
74
|
+
function changedFiles(cwd, base, rev) {
|
|
75
|
+
const out = gitTry(cwd, ["diff", "--name-only", base, rev]);
|
|
76
|
+
if (!out)
|
|
77
|
+
return [];
|
|
78
|
+
return out
|
|
79
|
+
.split("\n")
|
|
80
|
+
.map((l) => l.trim())
|
|
81
|
+
.filter((l) => l.length > 0);
|
|
82
|
+
}
|
|
83
|
+
/** Read a file's blob at a given rev, null if absent. */
|
|
84
|
+
function showBlob(cwd, rev, file) {
|
|
85
|
+
return gitTry(cwd, ["show", `${rev}:${file}`]);
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Build conflict-marked content for files changed on BOTH sides of a 3-way
|
|
89
|
+
* operation. Uses `git merge-file` in a system temp dir — never writes to the
|
|
90
|
+
* repo. Same algorithm as the MCP `gitwand_preview_merge` tool.
|
|
91
|
+
*/
|
|
92
|
+
function simulate3way(cwd, ancestor, ours, theirs) {
|
|
93
|
+
const oursFiles = new Set(changedFiles(cwd, ancestor, ours));
|
|
94
|
+
const theirsFiles = changedFiles(cwd, ancestor, theirs);
|
|
95
|
+
const both = theirsFiles.filter((f) => oursFiles.has(f));
|
|
96
|
+
if (both.length === 0)
|
|
97
|
+
return [];
|
|
98
|
+
const tmp = mkdtempSync(joinPath(tmpdir(), "gitwand-preview-"));
|
|
99
|
+
const out = [];
|
|
100
|
+
try {
|
|
101
|
+
for (const file of both) {
|
|
102
|
+
const baseBlob = showBlob(cwd, ancestor, file);
|
|
103
|
+
const oursBlob = showBlob(cwd, ours, file);
|
|
104
|
+
const theirsBlob = showBlob(cwd, theirs, file);
|
|
105
|
+
if (oursBlob === null || theirsBlob === null) {
|
|
106
|
+
out.push({ file, content: "", addDelete: true });
|
|
107
|
+
continue;
|
|
108
|
+
}
|
|
109
|
+
const safe = file.replace(/[\\/.]/g, "_");
|
|
110
|
+
const pBase = joinPath(tmp, `${safe}.base`);
|
|
111
|
+
const pOurs = joinPath(tmp, `${safe}.ours`);
|
|
112
|
+
const pTheirs = joinPath(tmp, `${safe}.theirs`);
|
|
113
|
+
writeFileSync(pBase, baseBlob ?? "", "utf-8");
|
|
114
|
+
writeFileSync(pOurs, oursBlob, "utf-8");
|
|
115
|
+
writeFileSync(pTheirs, theirsBlob, "utf-8");
|
|
116
|
+
// Must use gitMergeFile, not gitTry: merge-file exits non-zero on conflict
|
|
117
|
+
// (the very case we want), and gitTry would discard the conflict content.
|
|
118
|
+
const merged = gitMergeFile(cwd, ["-p", "--diff3", pOurs, pBase, pTheirs]);
|
|
119
|
+
out.push({ file, content: merged ?? "", addDelete: false });
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
finally {
|
|
123
|
+
rmSync(tmp, { recursive: true, force: true });
|
|
124
|
+
}
|
|
125
|
+
return out;
|
|
126
|
+
}
|
|
127
|
+
// ─── Output helpers ────────────────────────────────────────
|
|
128
|
+
function riskColor(risk) {
|
|
129
|
+
if (risk === "low")
|
|
130
|
+
return c.green;
|
|
131
|
+
if (risk === "medium")
|
|
132
|
+
return c.yellow;
|
|
133
|
+
return c.red;
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Overall risk level, using the SAME status-based model as the desktop
|
|
137
|
+
* `useMergePreview` `riskLevel` computed and the MCP `previewResponse` (spec
|
|
138
|
+
* §4.2), so all three predictor surfaces agree for identical inputs:
|
|
139
|
+
* - high : at least one file is "manual" (conflicts, none auto-resolved) or
|
|
140
|
+
* an add/delete conflict;
|
|
141
|
+
* - medium : at least one file is "partial" (some but not all auto-resolved);
|
|
142
|
+
* - low : no conflicting files, or every conflict auto-resolved.
|
|
143
|
+
* Deliberately status-based, NOT count/threshold-based.
|
|
144
|
+
*/
|
|
145
|
+
function computeRisk(previews, addDeleteCount) {
|
|
146
|
+
if (addDeleteCount > 0)
|
|
147
|
+
return "high";
|
|
148
|
+
const hasManual = previews.some((p) => p.totalConflicts > 0 && p.autoResolved === 0);
|
|
149
|
+
if (hasManual)
|
|
150
|
+
return "high";
|
|
151
|
+
const hasPartial = previews.some((p) => p.totalConflicts > 0 && p.autoResolved > 0 && p.autoResolved < p.totalConflicts);
|
|
152
|
+
return hasPartial ? "medium" : "low";
|
|
153
|
+
}
|
|
154
|
+
function printPreviewTable(operation, ref, sims, previews, addDeleteCount) {
|
|
155
|
+
const totalConflicts = previews.reduce((s, p) => s + p.totalConflicts, 0);
|
|
156
|
+
const totalResolved = previews.reduce((s, p) => s + p.autoResolved, 0);
|
|
157
|
+
const risk = computeRisk(previews, addDeleteCount);
|
|
158
|
+
const opLabel = operation === "rebase" ? "Rebase onto" : operation === "cherry-pick" ? "Cherry-pick" : "Merge";
|
|
159
|
+
console.log(`\n${c.bold}${opLabel}:${c.reset} ${c.cyan}${ref}${c.reset}`);
|
|
160
|
+
console.log(`${riskColor(risk)}${c.bold}Risk: ${risk.toUpperCase()}${c.reset}`);
|
|
161
|
+
console.log();
|
|
162
|
+
// Only claim "clean" when there are genuinely no overlapping changes — i.e.
|
|
163
|
+
// no resolvable sims AND no add/delete conflicts. `sims` here is the
|
|
164
|
+
// add/delete-filtered list, so guarding on its length alone would print
|
|
165
|
+
// "predicted clean" immediately above an add/delete conflict line.
|
|
166
|
+
if (sims.length === 0 && addDeleteCount === 0) {
|
|
167
|
+
console.log(`${c.green}No overlapping changes — operation predicted clean.${c.reset}\n`);
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
for (let i = 0; i < previews.length; i++) {
|
|
171
|
+
const p = previews[i];
|
|
172
|
+
const s = sims[i];
|
|
173
|
+
if (!s)
|
|
174
|
+
continue;
|
|
175
|
+
const pct = p.totalConflicts > 0 ? Math.round((p.autoResolved / p.totalConflicts) * 100) : 100;
|
|
176
|
+
const color = pct === 100 ? c.green : pct > 0 ? c.yellow : c.red;
|
|
177
|
+
console.log(` ${color}${s.file}${c.reset} — ${p.autoResolved}/${p.totalConflicts} auto-resolvable (${pct}%)`);
|
|
178
|
+
}
|
|
179
|
+
if (addDeleteCount > 0) {
|
|
180
|
+
console.log(` ${c.red}+${addDeleteCount} add/delete conflict(s) (require manual resolution)${c.reset}`);
|
|
181
|
+
}
|
|
182
|
+
console.log();
|
|
183
|
+
console.log(` Total: ${totalResolved}/${totalConflicts + addDeleteCount} conflicts auto-resolvable`);
|
|
184
|
+
console.log();
|
|
185
|
+
}
|
|
186
|
+
function buildFilePreview(content, file) {
|
|
187
|
+
const result = resolve(content, file, { explainOnly: true });
|
|
188
|
+
const pct = result.stats.totalConflicts > 0
|
|
189
|
+
? Math.round((result.stats.autoResolved / result.stats.totalConflicts) * 100)
|
|
190
|
+
: 100;
|
|
191
|
+
return {
|
|
192
|
+
file,
|
|
193
|
+
totalConflicts: result.stats.totalConflicts,
|
|
194
|
+
autoResolved: result.stats.autoResolved,
|
|
195
|
+
remaining: result.stats.remaining,
|
|
196
|
+
percentage: pct,
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
// ─── Command entry point ────────────────────────────────────
|
|
200
|
+
export async function cmdPreview(flags) {
|
|
201
|
+
const isCIMode = flags.ci || flags.json;
|
|
202
|
+
const onto = flags.onto;
|
|
203
|
+
const commit = flags.commit;
|
|
204
|
+
const branch = flags.branch;
|
|
205
|
+
const cwd = process.cwd();
|
|
206
|
+
if (!isCIMode)
|
|
207
|
+
printBanner();
|
|
208
|
+
// Determine operation
|
|
209
|
+
let operation;
|
|
210
|
+
let ref;
|
|
211
|
+
if (onto) {
|
|
212
|
+
operation = "rebase";
|
|
213
|
+
ref = onto;
|
|
214
|
+
}
|
|
215
|
+
else if (commit) {
|
|
216
|
+
operation = "cherry-pick";
|
|
217
|
+
ref = commit;
|
|
218
|
+
}
|
|
219
|
+
else if (branch) {
|
|
220
|
+
operation = "merge";
|
|
221
|
+
ref = branch;
|
|
222
|
+
}
|
|
223
|
+
else {
|
|
224
|
+
console.error(`${c.red}Error: specify --onto <ref>, --commit <sha>, or --branch <name>.${c.reset}\n`);
|
|
225
|
+
process.exit(2);
|
|
226
|
+
}
|
|
227
|
+
// Resolve refs
|
|
228
|
+
const headSha = revParse(cwd, "HEAD");
|
|
229
|
+
if (!headSha) {
|
|
230
|
+
console.error(`${c.red}Error: not in a git repository or HEAD is unborn.${c.reset}\n`);
|
|
231
|
+
process.exit(2);
|
|
232
|
+
}
|
|
233
|
+
const refSha = revParse(cwd, ref);
|
|
234
|
+
if (!refSha) {
|
|
235
|
+
console.error(`${c.red}Error: cannot resolve ref '${ref}'. Does it exist?${c.reset}\n`);
|
|
236
|
+
process.exit(2);
|
|
237
|
+
}
|
|
238
|
+
// Build 3-way parameters
|
|
239
|
+
let ancestor;
|
|
240
|
+
let ours;
|
|
241
|
+
let theirs;
|
|
242
|
+
if (operation === "rebase") {
|
|
243
|
+
const mb = gitTry(cwd, ["merge-base", headSha, refSha]);
|
|
244
|
+
if (!mb) {
|
|
245
|
+
console.error(`${c.red}Error: no common ancestor between HEAD and '${ref}'.${c.reset}\n`);
|
|
246
|
+
process.exit(2);
|
|
247
|
+
}
|
|
248
|
+
ancestor = mb;
|
|
249
|
+
// Orientation per commit: ours = onto (target base), theirs = commit (replayed).
|
|
250
|
+
ours = refSha;
|
|
251
|
+
theirs = headSha; // used below only for cherry-pick / merge; rebase uses per-commit loop
|
|
252
|
+
}
|
|
253
|
+
else if (operation === "cherry-pick") {
|
|
254
|
+
const parentSha = revParse(cwd, `${refSha}^`);
|
|
255
|
+
if (!parentSha) {
|
|
256
|
+
console.error(`${c.red}Error: cannot preview cherry-pick of root commit '${ref}' (no parent).${c.reset}\n`);
|
|
257
|
+
process.exit(2);
|
|
258
|
+
}
|
|
259
|
+
ancestor = parentSha;
|
|
260
|
+
ours = headSha;
|
|
261
|
+
theirs = refSha;
|
|
262
|
+
}
|
|
263
|
+
else {
|
|
264
|
+
const mb = gitTry(cwd, ["merge-base", headSha, refSha]);
|
|
265
|
+
if (!mb) {
|
|
266
|
+
console.error(`${c.red}Error: no common ancestor between HEAD and '${ref}'.${c.reset}\n`);
|
|
267
|
+
process.exit(2);
|
|
268
|
+
}
|
|
269
|
+
ancestor = mb;
|
|
270
|
+
ours = headSha;
|
|
271
|
+
theirs = refSha;
|
|
272
|
+
}
|
|
273
|
+
// Simulate
|
|
274
|
+
let sims;
|
|
275
|
+
try {
|
|
276
|
+
if (operation === "rebase") {
|
|
277
|
+
// Per-commit replay (oldest-first) for accurate multi-commit stack detection.
|
|
278
|
+
// ancestor = merge-base, ours = onto, theirs = individual commit being replayed.
|
|
279
|
+
const commitsRaw = gitTry(cwd, ["rev-list", "--reverse", `${ancestor}..${headSha}`]);
|
|
280
|
+
const commits = commitsRaw ? commitsRaw.split("\n").filter((l) => l.trim()) : [];
|
|
281
|
+
const allSims = [];
|
|
282
|
+
for (const commitSha of commits) {
|
|
283
|
+
const parentSha = revParse(cwd, `${commitSha}^`);
|
|
284
|
+
if (!parentSha)
|
|
285
|
+
continue; // root commit — skip
|
|
286
|
+
const perCommitSims = simulate3way(cwd, parentSha, ours, commitSha);
|
|
287
|
+
allSims.push(...perCommitSims);
|
|
288
|
+
}
|
|
289
|
+
// Deduplicate: keep the entry with the most conflict signal per file.
|
|
290
|
+
const seenFiles = new Map();
|
|
291
|
+
for (const s of allSims) {
|
|
292
|
+
const existing = seenFiles.get(s.file);
|
|
293
|
+
if (!existing) {
|
|
294
|
+
seenFiles.set(s.file, s);
|
|
295
|
+
}
|
|
296
|
+
else {
|
|
297
|
+
const score = (f) => f.addDelete ? 2 : f.content.includes("<<<<<<<") ? 1 : 0;
|
|
298
|
+
if (score(s) > score(existing))
|
|
299
|
+
seenFiles.set(s.file, s);
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
sims = Array.from(seenFiles.values());
|
|
303
|
+
}
|
|
304
|
+
else {
|
|
305
|
+
sims = simulate3way(cwd, ancestor, ours, theirs);
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
catch (err) {
|
|
309
|
+
console.error(`${c.red}Error during conflict simulation: ${err instanceof Error ? err.message : String(err)}${c.reset}\n`);
|
|
310
|
+
process.exit(2);
|
|
311
|
+
}
|
|
312
|
+
const addDeleteCount = sims.filter((s) => s.addDelete).length;
|
|
313
|
+
const resolvableSims = sims.filter((s) => !s.addDelete);
|
|
314
|
+
const previews = resolvableSims.map((s) => buildFilePreview(s.content, s.file));
|
|
315
|
+
const totalConflicts = previews.reduce((sum, p) => sum + p.totalConflicts, 0);
|
|
316
|
+
const totalResolved = previews.reduce((sum, p) => sum + p.autoResolved, 0);
|
|
317
|
+
const remaining = totalConflicts - totalResolved;
|
|
318
|
+
const risk = computeRisk(previews, addDeleteCount);
|
|
319
|
+
if (isCIMode) {
|
|
320
|
+
console.log(JSON.stringify({
|
|
321
|
+
operation,
|
|
322
|
+
ref,
|
|
323
|
+
risk,
|
|
324
|
+
summary: {
|
|
325
|
+
filesWithOverlap: sims.length,
|
|
326
|
+
totalConflicts: totalConflicts + addDeleteCount,
|
|
327
|
+
autoResolvable: totalResolved,
|
|
328
|
+
remaining: remaining + addDeleteCount,
|
|
329
|
+
autoResolvePercentage: totalConflicts + addDeleteCount > 0
|
|
330
|
+
? Math.round((totalResolved / (totalConflicts + addDeleteCount)) * 100)
|
|
331
|
+
: 100,
|
|
332
|
+
},
|
|
333
|
+
files: [
|
|
334
|
+
...previews.map((p) => ({ ...p, addDelete: false })),
|
|
335
|
+
...sims
|
|
336
|
+
.filter((s) => s.addDelete)
|
|
337
|
+
.map((s) => ({
|
|
338
|
+
file: s.file,
|
|
339
|
+
totalConflicts: 1,
|
|
340
|
+
autoResolved: 0,
|
|
341
|
+
remaining: 1,
|
|
342
|
+
percentage: 0,
|
|
343
|
+
addDelete: true,
|
|
344
|
+
})),
|
|
345
|
+
],
|
|
346
|
+
}, null, 2));
|
|
347
|
+
}
|
|
348
|
+
else {
|
|
349
|
+
printPreviewTable(operation, ref, resolvableSims, previews, addDeleteCount);
|
|
350
|
+
}
|
|
351
|
+
// Exit 1 if any predicted conflict remains
|
|
352
|
+
if (remaining > 0 || addDeleteCount > 0) {
|
|
353
|
+
process.exit(1);
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
//# sourceMappingURL=preview.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preview.js","sourceRoot":"","sources":["../../src/commands/preview.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gitwand/cli",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.20.0",
|
|
4
4
|
"description": "GitWand CLI — resolve Git conflicts from your terminal or CI pipeline",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
"access": "public"
|
|
35
35
|
},
|
|
36
36
|
"dependencies": {
|
|
37
|
-
"@gitwand/core": "2.
|
|
37
|
+
"@gitwand/core": "2.20.0"
|
|
38
38
|
},
|
|
39
39
|
"devDependencies": {
|
|
40
40
|
"@types/node": "^25.5.0",
|