Files
branchgraph/AGENTS.md
Jean-Gabriel Gill-Couture e03a92c570 Remove dead code, merge duplicated logic, match docs to the code
- Drop fields and functions nothing reads: job and proc tips, fetch time,
  PR url/author (and their GraphQL fields), spine summaries, diff::commit,
  unread data attributes, unused CSS and tokens.
- One home each for state wording (naming main as the repo does), lane
  lookup, unseen, outdated, main's tip, the stop wait and the token header.
- Narrow visibility; rename render::View to Filter; queue ranking moves
  to the CLI, its only user.
- Token test covers every route; shared checkout snapshot in the fixture.
- Client: errors outside Run/Send are toasts, history only after a good
  load, a drag stays in one file, the agent marker is a ring.
- design.md, the skill and AGENTS.md describe what is built.
2026-10-09 12:24:24 -04:00

121 lines
6.0 KiB
Markdown

# branchgraph
Job: let a lead review every open branch of one repository fast: see what a
branch changes (`diff --stat`, then the diff), run it in its own worktree, and
send comments on lines, files or commits to a coding agent working there. The
branch graph is the navigation. It changes the user's own checkout only on
an explicit Check out or Merge in a branch's menu.
- Product design: `docs/design.md` (source doc:
https://claude.ai/code/artifact/f81e88f0-1704-4ff7-9427-293ba42d312c).
- Target look: `docs/mockup.png` (screenshot of the build, demo repo).
## Owner decisions (2026-10-08)
- Binary and crate name: `branchgraph`. The folder stays `gitui`; the name
`gitui` clashes with the TUI installed at `/usr/bin/gitui`.
- Architecture: option A of the design, a local binary that serves the page
on localhost. The artifact prototype (milestone 1) is skipped.
- Work starts at milestone 2. The LLM ask box is milestone 3: do not build it
yet.
## Owner decisions (2026-10-08, revision 4)
- The product is the review loop, not the graph (owner: "I can browse
branches but that's it").
- Writes allowed: worktree creation (and the local tracking branch it needs),
and running the configured run command in that worktree. Still never:
checkout in the user's worktree, merge, rebase, push, branch delete.
- "Send to agent" runs a user-set command template (`agent` in the
branch's `.branchgraph`, see the hard rules), any agent CLI; values only
as environment variables.
## Owner decisions (2026-10-09)
- `.branchgraph` settings: see the hard rules.
- Clicking a branch label opens a menu, as gitk does: Review, Check out,
Merge into the branch checked out in the user's checkout, Preview merge,
Compare with this, Copy name.
- Base selector in the top bar: the branch "All" compares with (merge base
with it), main by default, kept while moving between branches and shown
in amber whenever it is not main.
## Current milestone: 3, the review loop
Scope: `docs/design.md`, revision 5. Milestone 2 (the live graph) is built and
becomes the graph overlay and the data layer.
Gate (done when a test shows it):
- A branch's stat equals `git diff --numstat -M <merge-base> <tip>` for every
branch of a fixture repo.
- Run or Send on a remote-only branch creates a worktree that `git worktree
list` shows, on a local branch tracking origin; the user's checkout (HEAD,
index, status, local branches) is unchanged; `branchgraph.copy` files are
copied and `branchgraph.setup` ran once.
- Send runs `branchgraph.agent` in the worktree with the `BG_*` variables; the
brief holds every draft with its anchor and excerpt; a branch name holding
shell syntax runs nothing extra; the drafts are marked sent.
- Stop sends SIGTERM to the run's main process (a trap in the script shows it).
- POST endpoints and run output refuse requests without the page token.
- `branchgraph brief` prints the unsent brief of the current worktree's
branch; `--ack` marks it sent.
## Hard rules
- Writes to the clone: fetch (objects, remote-tracking refs and their
reflogs; never prune, wait while a `*.lock` exists) and worktree creation.
Merge previews run in object memory. Check out and merge touch the user's
checkout only from a branch's menu: refused over modified tracked files, a
conflicting merge is aborted, never in another worktree, never pushed.
gix cannot switch or merge a working tree yet, so these two run the git
CLI with arguments, never a shell. No rebase, push or branch delete.
- Commands (run, setup, copy, agent, verify) come from the branch's
`.branchgraph` (owner, 2026-10-09): the file in its worktree, else as
committed on the branch, else main's. No git-config source: settings are
shared through the repository, not kept per machine. A command the branch
adds over main's is shown and asked about once before it runs; one the
user saved in the page counts as approved. Commands start only on a user
action, and every route needs the page's per-launch token.
- `.branchgraph` is the only file branchgraph edits in a checkout, saved
from the page into the branch's worktree. It never commits or pushes it.
- Bind `127.0.0.1` by default. `--bind <ip>` (owner, 2026-10-08) listens
wider, for example `0.0.0.0`: then any Host is accepted, every route still
needs the token, an Origin must match the Host, and startup warns that the
page is plain HTTP and can run code.
- Network: only `git fetch` and the GitHub API. No other host, no telemetry.
branchgraph calls no LLM; the agent it starts is the user's own tool.
- GitHub token: read from `GH_TOKEN` (run as
`GH_TOKEN=$(gh auth token) branchgraph`). Never log it, put it in a URL or
write it to disk. Without a token, draw the graph without PR labels and say
so on the page.
- Native libraries over shelling out: read and fetch with `gix`. Tests may use
the `git` CLI to build fixture repos and to check results.
- Bounded work: cap commits per lane, diff size (200 KB for the diff pane,
2 MB for one file loaded on its own) and API pages.
## Default stack
Change only with a stated reason: `gix`, `tokio` + `axum`, `maud` for HTML,
SVG drawn on the server, `clap` for arguments, `reqwest` for one GitHub
GraphQL query (PRs with draft, mergeable and review state). Little or no
client JS.
Approved additions (2026-10-08): `serde` + `serde_json`, `futures-util`,
`anyhow`, `tempfile` (dev).
Ask the owner before adding a dependency outside this list, calling another
host, or writing to the repository.
## Workflow
- UI work (comps, templates, CSS, client script, UI review): read
`.agents/skills/quiet-ui/SKILL.md` first and keep to its budgets.
Design canvas: https://claude.ai/artifact/Jxue8Rvy2AayN9xDDvcCwV
- `cargo fmt`, `cargo clippy --all-targets -- -D warnings`, `cargo test`.
Zero warnings.
- Prove each behavior with the smallest test. Build fixture repos in temp
directories.
- Comments explain why, never what.
- Commits: short subject and tight bullets. Never add Co-Authored-By or other AI attribution anywhere
- Use the code review skill ./.agents/skills/code-review/ in a loop until satisfied