```
███ █████ ███ ██████ ██████
░░░ ░░███ ░░░ ███░░███ ███░░███
████████ ████ ████████ ███████ ████ ░███ ░░░ ░███ ░░░
░░███░░███░░███ ░░███░░███ ███░░███ ░░███ ███████ ███████
░███ ░░░ ░███ ░███ ░███░███ ░███ ░███ ░░░███░ ░░░███░
░███ ░███ ░███ ░███░███ ░███ ░███ ░███ ░███
█████ █████ ░███████ ░░████████ █████ █████ █████
░░░░░ ░░░░░ ░███░░░ ░░░░░░░░ ░░░░░ ░░░░░ ░░░░░
░███
█████
░░░░░
```
A terminal UI for watching and reviewing agent progress, designed for a tmux panel workflow where you monitor agent changes on one side while working on the other.
Uses [difftastic](https://difftastic.wilfred.me/) for structural, syntax-aware diffs with ANSI color output. Falls back to plain `git diff` if difft is not installed.
## Install
### Install from crates.io
```bash
cargo install ripdiff
```
This installs `ripdiff` into `~/.cargo/bin/`.
### Install from source (local checkout)
```bash
cargo install --path .
```
For best results, install difftastic:
```bash
cargo install difftastic
```
## Publishing and release process
`ripdiff` follows [Semantic Versioning](https://semver.org/) (`MAJOR.MINOR.PATCH`):
- **PATCH** for bug fixes and internal improvements.
- **MINOR** for backwards-compatible features.
- **MAJOR** for breaking changes.
### Maintainer release checklist
1. Bump `version` in `Cargo.toml`.
2. Ensure CI passes (`cargo fmt`, `cargo clippy`, `cargo test`, `cargo build`).
3. Commit and tag the release:
```bash
git tag vX.Y.Z
git push origin vX.Y.Z
```
4. The GitHub Actions release workflow publishes the crate when a `v*` tag is pushed.
To publish from CI, set a `CARGO_REGISTRY_TOKEN` repository secret with a crates.io API token.
## Usage
Run inside any git repo with uncommitted changes:
```
ripdiff
```
Or point it at a specific repo:
```
ripdiff --path /some/repo
```
## Key Bindings
### Global
| `Tab` / `Shift-Tab` | Toggle focus between panels |
| `h` / `?` | Open or close help |
| `t` | Toggle between inline and side-by-side diff |
| `r` | Force refresh |
| `q` / `Esc` | Quit |
### File List Panel
| `j` / `↓` | Move file selection down |
| `k` / `↑` | Move file selection up |
| `→` | Switch to diff panel |
| `gg` / `G` | Jump to top / bottom of file list |
| `s` / `S` | Toggle selected file staged / toggle all files staged |
| `Space e` | Hide / show file list sidebar |
| `Enter` | Toggle diff visibility for selected file |
### Diff Panel
| `j` / `↓` | Scroll down one line |
| `k` / `↑` | Scroll up one line |
| `←` | Switch to file list |
| `Ctrl-d` / `Ctrl-u` | Scroll half page down / up |
| `gg` / `G` | Jump to top / bottom of diff |
| `s` / `S` | Toggle selected file staged / toggle all files staged |
| `]` / `[` | Jump to next / previous hunk |
| `Space e` | Hide / show file list sidebar |
| `Enter` | Toggle diff visibility for selected file |
## Quick Test
```
cd $(mktemp -d)
git init && git commit --allow-empty -m "init"
echo "hello" > test.txt
git add test.txt
ripdiff
```
Edit a file in another terminal — the diff auto-updates within ~1 second.
## Layout
```
ripdiff [repo: myproject] main 3 files changed mode: inline panel: files
M src/main.rs +5-2 │ src/main.rs
A src/lib.rs +3 │
M README.md +1-1 │ fn main() {
? new_file.rs +12 │ - println!("old");
│ + println!("new");
│ }
```
- 25% left: file list with status indicators (M/A/D/R/?) and stage markers (`●` staged, `○` unstaged, `◐` mixed)
- 75% right: diff output with scrollbar
- `h` opens a help popup with keybinding and symbol descriptions
- Minimal borders — just a vertical divider between panels
- Auto-refreshes on `.git/index` changes and every 500ms