# claude-mergetool
<a href="https://crates.io/crates/claude-mergetool">
<img src="https://img.shields.io/crates/v/claude-mergetool" alt="Crates.io">
</a>
Have you ever wished that resolving Git merge conflicts could cost you
real-world dollars? Now it can!
`claude-mergetool` implements AI-powered merge conflict resolution using [Claude Code](https://docs.anthropic.com/en/docs/claude-code).
When `git` or `jj` hits a merge conflict, `claude-mergetool` launches Claude to read the three versions of the file, resolve the conflict, and write the result — fully automatically.
It works surprisingly well, although I feel much more comfortable using it in `jj` where the conflicted files are written to a temporary directory (so the AI doesn't get free write access to my checkout) and I can easily run `jj diff` to inspect how the conflicts were resolved once it finishes.
> [!WARNING]
>
> Note that `claude` is launched with `--permission-mode=acceptEdits` to the various conflicted files.
> With `jj`, these are in a temporary directory, but with `git` I'm not sure.
> There is, as always with AI tools that can touch files on your disk, some risk of unintended changes!
## Install
```sh
cargo install claude-mergetool
# or
nix profile install nixpkgs#claude-mergetool
nix profile install github:9999years/claude-mergetool
```
### Prerequisites
[Claude Code](https://docs.anthropic.com/en/docs/claude-code) (`claude` CLI) must be installed and available in PATH.
## Setup
You can configure `claude-mergetool` automatically:
```
claude-mergetool install
```
Then, you can use `git mergetool -t claude` to resolve conflicts with Git or `jj resolve --tool claude` to resolve conflicts with JJ.
To configure `claude-mergetool` only for one program or the other, use (e.g.) `claude-mergetool install jj`.
<details>
<summary><h3>Configuration details</h3></summary>
#### jj
Add to `~/.config/jj/config.toml`:
```toml
[merge-tools.claude]
program = "claude-mergetool"
merge-args = ["merge", "$base", "$left", "$right", "-o", "$output", "-p", "$path"]
```
Then resolve conflicts with:
```sh
jj resolve -r REVSET --tool claude
```
#### git
Add to `~/.config/git/config` (or `~/.gitconfig`):
```ini
[mergetool "claude"]
cmd = claude-mergetool merge "$BASE" "$LOCAL" "$REMOTE" -o "$MERGED"
trustExitCode = true
```
Then resolve conflicts with:
```sh
git mergetool -t claude
```
</details>
## Usage
claude-mergetool is normally invoked by git or jj, but you can also run it directly:
```sh
claude-mergetool merge base.txt left.txt right.txt -o resolved.txt
```
### CLI reference
```
Usage: claude-mergetool merge [OPTIONS] <BASE> <LEFT> <RIGHT>
Arguments:
<BASE> Base version (common ancestor)
<LEFT> Left version (ours / current branch)
<RIGHT> Right version (theirs / incoming)
Options:
--git-merge-driver Git merge driver mode (writes result to `<left>` path)
-o, --output <OUTPUT> Output file path (jj mode)
-s <ANCESTOR_LABEL> Ancestor conflict label
-x <LEFT_LABEL> Left/ours conflict label [default: ours]
-y <RIGHT_LABEL> Right/theirs conflict label [default: theirs]
-p <FILEPATH> Original file path [default: "unknown file"]
-l <MARKER_SIZE> Conflict marker size
-h, --help Print help
```
## How it works
`claude-mergetool` runs `claude` in non-interactive mode (`--print`) with `--permission-mode=acceptEdits`, so tool calls (Read, Edit, Write) are auto-approved with no user interaction required.
Claude's reasoning and tool calls are streamed to stderr as dimmed text so you can follow along.
When Claude finishes, the merge continues automatically.