|
| 1 | +<div align="center"> |
| 2 | + |
| 3 | +<img src="assets/logo.svg" alt="Galley" width="84" /> |
| 4 | + |
| 5 | +# Galley |
| 6 | + |
| 7 | +**An integrated review environment (IRE) for code you didn't write by hand.** |
| 8 | + |
| 9 | +[](https://github.com/ymansurozer/galley/actions/workflows/ci.yml) [](https://www.npmjs.com/package/@ymansurozer/galley) [](./LICENSE) |
| 10 | + |
| 11 | +<img src="assets/screenshot.png" alt="Galley — a guided review: pending changes with accept/reject, a question waiting on the agent, and a change request" width="80%" /> |
| 12 | + |
| 13 | +</div> |
| 14 | + |
| 15 | +<br> |
| 16 | + |
| 17 | +Code editors and IDEs were built for a coding-first world. Their diff view is fine for a quick glance, but not for working through a big change or going back and forth with the agent that wrote it. |
| 18 | + |
| 19 | +Galley is my attempt at a real review surface: you review, hit **Send to Agent**, and your agent acts on your decisions and replies in place. |
| 20 | + |
| 21 | +I'm not saying this is *the* review surface. I built it in a week and I'm still figuring out the shape. But this is what I think it should be. |
| 22 | + |
| 23 | +> The name comes from the *galley proof*: in printing, the rough proof pulled for proofreading and corrections before a text goes to press. You mark it up, then it ships. Same idea, for code. |
| 24 | +
|
| 25 | +## Principles |
| 26 | + |
| 27 | +Galley is opinionated about exactly one thing: the review surface. It's a protocol and an interface, nothing more. How you review, and what you review with, stays yours. |
| 28 | + |
| 29 | +- **No model runs here.** Galley doesn't call an LLM or orchestrate one. It renders the diff, validates the structured input it's given, and hands a result back. |
| 30 | +- **Your agent, not ours.** The contract is plain JSON over stdout and a localhost server, with no assumption about who's on the other end: Claude Code, Cursor, Codex, a shell script. The guided review, the answers to your questions, the code changes themselves are all *your* agent's work. Galley just gives it somewhere to land. |
| 31 | +- **Local and private.** The server binds to localhost on a random port. No telemetry. Your browser may fetch a web font; switch to system fonts and even that stops. |
| 32 | +- **It won't touch your repo unless you ask.** Galley never edits your tracked files. |
| 33 | + |
| 34 | +## Features |
| 35 | + |
| 36 | +- **A beautiful and functional diff view** built on `@pierre/diffs`. |
| 37 | +- **Per-line comment threads.** Comment on any line. Ask a question and your agent answers live in the thread; leave a change request and it rides to the handoff. |
| 38 | +- **Per-change accept/reject.** Accept or reject individual changes, or sign off a whole file. |
| 39 | +- **A tight handoff loop.** Hit **Send to Agent** and your agent gets a structured review. It makes the edits, re-diffs into the same tab, and replies in place. |
| 40 | +- **Guided review.** Your agent can attach a guide: an overview, the files in a sensible order, a per-file summary and category, and the risky ones flagged. |
| 41 | +- **Four review modes.** The working tree, the staged diff, a single file (tracked or not, like a plan, PRD, or issue), or a branch against its merge-base. |
| 42 | +- **Keyboard-first.** Intuitive navigation: move by file, line, or change, and accept, reject, comment, or approve without touching the mouse. |
| 43 | +- **Customize** diff layout, intra-line, hunk separators, wrapping, code-highlight theme, and fonts. |
| 44 | + |
| 45 | +## Getting started |
| 46 | + |
| 47 | +1. **Install the CLI** (needs **Node 20+** and **git**): |
| 48 | + |
| 49 | + ```bash |
| 50 | + npm install -g @ymansurozer/galley # global, for any repo |
| 51 | + # or: npm install -D @ymansurozer/galley # per-project |
| 52 | + ``` |
| 53 | + |
| 54 | +2. **Teach your agent to drive it.** Install the skill for on-demand use: |
| 55 | + |
| 56 | + ```bash |
| 57 | + npx skills add ymansurozer/galley |
| 58 | + ``` |
| 59 | + |
| 60 | + Or paste the [snippet](./skills/galley/agents-snippet.md) into your agent's `AGENTS.md` / `CLAUDE.md` to always review via Galley. |
| 61 | + |
| 62 | +3. **Start a review:** |
| 63 | + |
| 64 | + ```bash |
| 65 | + galley # review the working-tree diff |
| 66 | + galley --diff staged # review the staged diff |
| 67 | + galley file path/to/plan.md # review a single file or artifact (e.g. a generated plan) |
| 68 | + galley pr feature-branch # review a branch's commits vs its merge-base |
| 69 | + ``` |
| 70 | + |
| 71 | + Galley opens in your browser and stays open. You review and click **Send to Agent**; the agent attaches, acts on each send, and replies in the same tab. More flags (`--repo`, `--path`, `--port`, `--no-open`, `--guide`, …) are documented in the skill. |
| 72 | + |
| 73 | +## Roadmap |
| 74 | + |
| 75 | +Immediate to-dos, in rough priority order. |
| 76 | + |
| 77 | +- [ ] **Anchor repair instead of stale-flagging**: when re-diffing on `reload`, try to re-anchor each guide entry to its nearest surviving section/line before declaring the guide stale, so a guide degrades gracefully across rounds (the agent edits between rounds, Galley's hot path) instead of invalidating wholesale on any drift. Keep clean "vanished → stale" semantics for anchors that genuinely no longer resolve. |
| 78 | +- [ ] **Command palette**: add a discoverable Cmd/Ctrl+Shift+P palette for common review actions: file filter, find in diffs, next/previous file or change, accept/reject/request change, approve file, toggle layout/settings/sidebar, open in editor, reload, and Send to Agent. Keep keyboard shortcuts as the fast path, but make every major action searchable. |
| 79 | +- [ ] **Commit/range/branch review modes**: expand beyond working/staged/file/PR branch reviews with `galley commit <ref>`, `galley range <base>..<head>` / `<base>...<head>`, and `galley branch <base>` so Galley can review historical or comparison diffs without requiring a dirty working tree. |
| 80 | +- [ ] **Open file in editor**: add a configurable editor command and UI/shortcut action to open the selected file at the current line from the review desk. Support placeholders like `{repo}`, `{file}`, and `{line}` and keep it safe for repo-relative paths. |
| 81 | +- [ ] **Lazy diff/content loading + large/binary-file guards**: today every changed file's full contents are read and shipped up front; the only large-file handling is client-side render deferral. Move the guard to the data layer: classify each file by byte size and ship lightweight patch data first, hydrating full contents, highlighting, and rendered markdown on demand when a file is opened. Per-file `loadState` (`ready | deferred | too-large | binary | error`) with two byte tiers — an *eager* limit (~1 MiB, loaded up front) and a *manual* limit (~2 MiB, deferred until opened); over that is `too-large` (skipped with a summary + explicit load-anyway action), plus an image byte cap. Add **binary detection** (NUL-byte scan) so binaries are skipped rather than read as UTF-8 and handed to @pierre. |
| 82 | + |
| 83 | +## License |
| 84 | + |
| 85 | +[MIT](./LICENSE) © Yusuf Mansur Özer |
0 commit comments