The conflicts list in front of the three-way merge - #55
Merged
Conversation
`git mergetool` walks conflicted files one launch at a time, and the app showed only the file git happened to be asking about. It now opens on the LIST: every unmerged path, what is left and what is done, and a whole-file Ours / Theirs per row that answers a file straight out of the index without opening an editor. Files can be resolved in any order — saving returns to the list, and closing it ends nothing. The take control moves out of Monaco's glyph margin onto real buttons on each pane's inner edge, against the result. A glyph margin only exists on an editor's LEFT edge, so "take ours" sat two panes from where its text lands, and being a CSS mask it could not be reached from the keyboard at all. Main keeps custody of the list. The renderer addresses a row by INDEX and never by path; main recomputes every path from the repository root and re-verifies it against `git diff --diff-filter=U` at WRITE time, so a row that went stale since the dialog opened fails closed. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
`locate()` derived the path from `path.relative` over realpath'd ends, which needs both in the same form — and they are not. Windows hands out an 8.3 temp path where git answers with the long one, so the result was a `..`-laden path `isRepoRelative` rejected: the conflicts list never opened on Windows at all, silently falling back to the single-file view. `ls-files --full-name -z` asks git for its own spelling. The computation stays as a fallback for a file git does not track. Caught by the Windows leg of the check matrix; the macOS host and the Linux container both missed it. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
git mergetoolwalks conflicted files one launch at a time, and Diff Bro showed only the file git happened to be asking about — a chip reading3 of 7was the whole picture.It now opens on the list: every unmerged path, what is left and what is done, and a whole-file Ours / Theirs per row that answers a file straight out of the index without opening an editor. Files can be resolved in any order; saving returns to the list, and closing it ends nothing — the walk chip, a toolbar chip and View ▸ Merge conflicts… (⌘⇧K) all bring it back.
The take control moves out of Monaco's glyph margin onto real buttons on each pane's inner edge, against the result. A glyph margin only exists on an editor's left edge, so "take ours" sat two panes from where its text lands — and being a CSS mask, it could not be reached from the keyboard at all.
The write fence
This widens the one place the app writes files it did not create, so it is fenced the same way rather than differently:
isRepoRelativegit diff --name-only --diff-filter=Uand refuses a row that is no longer in itwrittensentinel — refused there instead, it would hang the terminal for the launcher's full two hoursAudited
Two agents were run over the finished change. They reproduced every gate and found eight further defects, all fixed here — including a data-loss path (a launch outside any repo wrote the previous repo's file) and a hang on the dialog's primary button. Full table in
specs/2026-08-11-merge-conflicts-list/plan.md.A shortcut collision the audit caught (
⌘⇧Mwas already Tools ▸ XML) is now guarded by a uniqueness test overbuildMenus, proven red against the collision.Verified
npm run checkmake e2emake theme-sweep SWEEP_ONLY=conflict-list🤖 Generated with Claude Code