@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 CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAgCH;;;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,CAe1C"}
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":"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"}
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.18.0",
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.18.0"
37
+ "@gitwand/core": "2.20.0"
38
38
  },
39
39
  "devDependencies": {
40
40
  "@types/node": "^25.5.0",