{"id":50775107,"url":"https://github.com/nmbr7/turboreview","last_synced_at":"2026-06-28T03:00:47.690Z","repository":{"id":363871849,"uuid":"1265077400","full_name":"nmbr7/turboreview","owner":"nmbr7","description":"A terminal based code review tool","archived":false,"fork":false,"pushed_at":"2026-06-26T17:33:28.000Z","size":584,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-26T19:13:08.419Z","etag":null,"topics":["code-coverage","code-review","git"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-3-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/nmbr7.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-06-10T12:51:01.000Z","updated_at":"2026-06-26T17:32:28.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/nmbr7/turboreview","commit_stats":null,"previous_names":["nmbr7/turboreview"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/nmbr7/turboreview","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nmbr7%2Fturboreview","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nmbr7%2Fturboreview/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nmbr7%2Fturboreview/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nmbr7%2Fturboreview/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/nmbr7","download_url":"https://codeload.github.com/nmbr7/turboreview/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nmbr7%2Fturboreview/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34875362,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-28T02:00:05.809Z","response_time":54,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["code-coverage","code-review","git"],"created_at":"2026-06-11T23:00:16.379Z","updated_at":"2026-06-28T03:00:47.677Z","avatar_url":"https://github.com/nmbr7.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003ch1 align=\"center\"\u003eTurboReview\u003c/h1\u003e\n\n[![Rust](https://img.shields.io/badge/Rust-stable-orange)](https://www.rust-lang.org/)\n[![Platform](https://img.shields.io/badge/Platform-macOS%20%7C%20Linux%20%7C%20Windows-blue)](#)\n[![UI](https://img.shields.io/badge/UI-Terminal%20TUI-6f42c1)](#)\n\n`turboreview` is a terminal code-review tool for git repositories. Review the\nworking tree or browse the branch's commit history, with a file tree on the left\nand the selected diff (syntax-highlighted, adjustable context) on the right.\nStage files, mark them reviewed, leave line comments — and let an AI coding agent\nread those comments, fix the code, and respond. It can also **debug** straight\nfrom the diff (breakpoints, stepping, variable inspection, even debugging a past\ncommit) and overlay **test coverage**.\n\n\u003cp align=\"center\"\u003e\n  \u003cimg width=\"800\" alt=\"turboreview screenshot\" src=\"https://github.com/user-attachments/assets/69ca499b-052b-47e0-b567-72e123ac4568\" /\u003e\n  \u003cbr\u003e\n  \u003cem\u003eTurboReview diff\u003c/em\u003e\n\u003c/p\u003e\n\n\n## Install\n\n**Prerequisites:**\n\n- A recent stable Rust toolchain (`cargo`) and `git`. Install Rust via\n  [rustup](https://rustup.rs/): `curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh`.\n- A C compiler / build toolchain — `git2` (libgit2) and `libz` are built from\n  source. macOS: Xcode Command Line Tools (`xcode-select --install`). Linux:\n  `build-essential` and `pkg-config`.\n- **Linux only:** X11 clipboard libraries for copy support (`arboard`), e.g. on\n  Debian/Ubuntu: `libxcb1-dev libxcb-render0-dev libxcb-shape0-dev libxcb-xfixes0-dev`.\n- A [Nerd Font](https://www.nerdfonts.com/) set in your terminal for the\n  file-type glyphs.\n\n### From crates.io\n\n```sh\ncargo install turboreview\n```\n\nThe `turboreview` binary lands in `~/.cargo/bin` — make sure that's on your\n`PATH`.\n\n### From source\n\n```sh\ngit clone https://github.com/nmbr7/turboreview.git\ncd turboreview\ncargo install --path .          # installs the release binary to ~/.cargo/bin\n```\n\n### Developing\n\n```sh\ncargo run -- [REPO_PATH]        # run against a repo (defaults to .)\ncargo test                      # run the test suite\ncargo fmt \u0026\u0026 cargo clippy       # format + lint\n```\n\nUpdating later: re-run `cargo install turboreview` (add `--force` to overwrite\nan older build).\n\n## Usage\n\n```\nturboreview [REPO_PATH]   # defaults to the current directory\nturboreview --skill       # print the AI-agent guide and exit\n```\n\nRun inside (or point at) any git repository.\n\n## Layout\n\nTwo views, toggled with `[` / `]`:\n\n- **Changes** — the working tree. Left pane has two sections, `▌ Unstaged (N)`\n  and `▌ Staged (N)`, each a collapsible directory tree.\n- **Commits** — the branch history. Left pane lists commits (short hash, summary,\n  author, date, and per-commit diff stats `N files +ins -del`). Diff stats are\n  computed lazily for the rows in view. The list loads 50 commits at a time;\n  scroll to the bottom and press `L` to load the next page. Press `Enter` on a\n  commit to drill into its changed files (diff vs the commit's first parent);\n  `Esc` steps back out.\n\nIn both views:\n\n- **Left pane — Files.** Each file row shows a colored status letter\n  (`A` added, `M` modified, `D` deleted, `R` renamed), a review tick\n  (`✓` reviewed / `○` not), and a Nerd Font file-type icon. The pane can be\n  resized or hidden entirely (see keys).\n- **Right pane — Diff.** Syntax-highlighted code with a line-number gutter.\n  Added/removed lines are bright with a green/red background; unchanged context\n  lines are dimmed so changes stand out. A line cursor (highlighted row) marks\n  where comments attach. The title shows `(ctx N)` or `(full file)`. Press `v`\n  for a side-by-side (split) view — old on the left, new on the right — which is\n  remembered across sessions.\n- **Comments pane (toggle with `C`).** An optional third column listing the\n  current scope's comments grouped by status (Open / NeedsInfo / Wontfix /\n  Resolved). Press `Enter` on a comment to jump to its file and line.\n\nPress `?` at any time for an in-app keybinding overlay.\n\n## Keys\n\n| Key              | Action                                                          |\n|------------------|-----------------------------------------------------------------|\n| `[` / `]`        | switch view (Changes ⇆ Commits)                                 |\n| `Tab`            | switch focus across the visible panes                           |\n| `↑`/`↓` `j`/`k`  | move selection / commit / line cursor in the focused pane       |\n| `⇧↑`/`⇧↓` `J`/`K`| jump (fast scroll) in the focused pane                          |\n| mouse wheel      | move the focused pane's cursor                                  |\n| `gg` / `G`       | jump to top / bottom of the focused pane                        |\n| `L`              | load more commits (Commits view, when more history exists)       |\n| `Enter`          | open commit · focus a file's Diff · fold dir · jump to comment  |\n| `C`              | toggle the comment-list pane                                    |\n| `Esc`            | step back (Diff → files → commit list) / focus the Files pane   |\n| `h`/`l` `←`/`→`  | scroll the diff horizontally (Diff pane)                        |\n| `+` / `-`        | increase / decrease diff context (step 5; `+` at max → full file) |\n| `F`              | toggle full-file view (shortcut; also reachable via `+`)          |\n| `v`              | toggle side-by-side (split) vs unified diff (persisted)          |\n| `H`              | file-history overlay for the selected file's diff               |\n| `{` / `}`        | step to older / newer revision (in the history overlay)         |\n| `/`              | search within the current diff                                  |\n| `n` / `N`        | jump to next / previous search match                            |\n| `a`              | fold / unfold all directories in the file tree                 |\n| `O`              | view all tracked files / changed files only                     |\n| `z`              | hide / show the file pane (diff goes full-width)               |\n| `\u003c` / `\u003e`        | narrow / widen the focused pane (files or the right pane)        |\n| `c`              | comment on the cursor line (opens a modal input box)            |\n| `s`              | stage the selected file (Unstaged) / unstage it (Staged)        |\n| `Space`          | toggle the reviewed checkbox on the selected file               |\n| `R`              | toggle hiding reviewed files                                    |\n| `r`              | refresh everything from disk / git                              |\n| `%`              | toggle test-coverage highlight (LCOV)                            |\n| `M`              | run the configured coverage command, then show it               |\n| `?`              | show the keybinding help overlay                                |\n| `qq` / `Ctrl-C`  | quit (press `q` twice to avoid accidental exits)                |\n\n**Debugging** (right pane Debug tab; see [Debugging](#debugging)):\n\n| Key              | Action                                                          |\n|------------------|-----------------------------------------------------------------|\n| `b`              | toggle a breakpoint on the cursor line (Diff pane)              |\n| `D`              | launch a debug session (a selected commit in Commits, else worktree) |\n| `[` / `]`        | right pane: switch the Comments / Debug tab (when focused)       |\n| `t`              | Debug tab: switch the Vars / Breakpoints view                   |\n| `c`/`n`/`i`/`o`  | continue / step over / step in / step out (Debug focused)       |\n| `Enter`          | Vars: expand a variable · Breakpoints: jump to it                |\n| `Space` / `d`    | Breakpoints tab: enable-disable / delete a breakpoint           |\n| `h` / `l`        | scroll the Debug pane horizontally                              |\n| `Ctrl-D`         | in the comment box: attach the stopped call stack to the comment |\n| `X`              | end all debug sessions                                          |\n\nIn the comment input box: type freely, **Enter** for a newline, **Ctrl-S** to\nsave, **Esc** to cancel. Saving an empty comment deletes it.\n\n## Staging\n\n`s` on a file in the **Unstaged** section stages it; on a file in the **Staged**\nsection it unstages it. Staging only moves changes into or out of the git index —\nyour working-tree files are never modified. (Hunk-level staging is not yet\nsupported.)\n\n## Comments\n\nPress `c` on a diff line to attach a comment. Comments render in a bordered box\ndirectly under their line.\n\nEach comment is **anchored** to its line's content plus the surrounding lines, so\nit follows the line when the file shifts (e.g. lines inserted above). If a comment\ncan no longer be confidently placed, it is shown as `⚠ outdated` rather than lost.\n\n### AI-agent review loop\n\nComments carry a `status` (`open`, `resolved`, `wontfix`, `needs_info`) and an\noptional `response`. An AI coding agent can close the loop:\n\n1. Run `turboreview --skill` to print a guide describing the on-disk schema and\n   workflow.\n2. The agent reads the open comments, makes the requested changes, then writes a\n   `response` and sets the `status` in the relevant `comments.json`.\n3. Reopen turboreview — each comment box shows the agent's status badge\n   (`✓ resolved`, `✗ wontfix`, `? needs-info`) and its response inline.\n\n## File history \u0026 search\n\nPress `H` on a file's diff to enter the **history overlay** — it walks the\ncommits that touched that file (newest first). `{` steps to an older revision,\n`}` to a newer one; `}` past the newest returns to the live diff, and `Esc`\nexits. While stepping, the cursor stays on the same line number, the view\nscrolls to keep it centered, and context is expanded (up to full file) if needed\nto show that line. Comments made on a past revision are stored in that commit's\nscope (`.turboreview/commits/\u003csha\u003e/`).\n\nPress `/` to **search** within the current diff (case-insensitive substring).\n`n` and `N` jump to the next and previous match.\n\n## Debugging\n\nturboreview can drive a debugger straight from the diff, using the [Debug Adapter\nProtocol](https://microsoft.github.io/debug-adapter-protocol/) (any DAP adapter:\n`lldb-dap`, `codelldb`, `debugpy`, …). Configure it under `debug` in\n`.turboreview/config.json` (see [docs/debug-config-example.md](docs/debug-config-example.md)):\n\n```jsonc\n\"debug\": {\n  \"adapter\": { \"command\": \"lldb-dap\", \"args\": [] },\n  \"build\":   \"cargo build\",                 // run before launch\n  \"program\": \"target/debug/your-binary\",    // built binary (relative to source root)\n  \"args\": [], \"cwd\": \".\",\n  \"source_map\": []\n}\n```\n\n- Press `b` on a diff line to set a breakpoint (a `●` shows in the gutter), then\n  `D` to build + launch. The **right pane's Debug tab** shows the call stack and\n  the selected frame's variables; `▶` marks the stopped line.\n- `Tab` to focus the Debug pane, then step with `c` / `n` / `i` / `o`. `Enter`\n  expands a structured value (String/Vec/struct/map) to its contents; each\n  variable shows its type and memory address.\n- `t` switches the Debug pane between **Vars** and **Breakpoints** (the\n  breakpoint list: `Enter` jumps, `Space` enables/disables, `d` deletes).\n- Press `D` to open the **launch picker**: debug the working tree, a selected\n  commit, attach to a running process, or attach to a remote target.\n- **Attach to a process:** pick *process* to open a filterable list of running\n  processes (type to filter by name or pid, `Enter` to attach).\n- **Debug a past commit:** pick *commit* in the Commits view — turboreview checks\n  it out in a throwaway `git worktree`, builds it there, and debugs that\n  historical binary (cleaned up when the session ends).\n- **Remote attach (gdbserver / Docker):** pick *remote* to attach to a running\n  target. Configure it under `debug.remote` (and use `source_map` to map the\n  remote source paths to your local checkout):\n\n  ```jsonc\n  \"debug\": {\n    \"remote\": { \"host\": \"localhost\", \"port\": 1234 },\n    \"source_map\": [[\"/build/src\", \"/local/repo/src\"]]\n  }\n  ```\n\n  `host`/`port` run `gdb-remote host:port`; for other setups set\n  `remote.attach_commands` to raw adapter commands instead.\n- **Attach a snapshot to a comment:** while stopped, press `c` to comment, then\n  `Ctrl-D` to attach the current call stack + locals. It's saved with the comment\n  and shown inline, so a reviewer keeps the exact runtime state.\n- `O` toggles **view all files** (every tracked file, not just changed ones) so\n  you can open and breakpoint anywhere in the codebase. `X` ends the session.\n\n## Test coverage\n\nPress `%` to overlay **coverage** from an LCOV file: a `▌` bar in the gutter is\ngreen for covered lines, red for uncovered. The footer shows overall and\ncurrent-file percentages. Configure the file (and, optionally, a command that\ngenerates it) in `.turboreview/config.json`:\n\n```jsonc\n\"coverage_file\": \"coverage/lcov.info\",\n\"coverage_command\": \"cargo llvm-cov --lcov --output-path coverage/lcov.info\"\n```\n\nPress `M` to run the command and reload. Any tool that emits LCOV works\n(`cargo llvm-cov`, `tarpaulin`, `nyc`, `gcov`, …).\n\n## Review state \u0026 storage\n\nReviewed flags and comments persist under `\u003crepo\u003e/.turboreview/`:\n\n| Path                                              | Holds                                   |\n|---------------------------------------------------|-----------------------------------------|\n| `.turboreview/comments.json` · `reviewed.json`    | working-tree review (Changes view)      |\n| `.turboreview/commits/\u003csha\u003e/comments.json` · `…`  | per-commit review (Commits view)        |\n| `.turboreview/comment-log.jsonl`                  | append-only activity log (newest last)  |\n\nThe comment log records one JSON object per comment add/edit\n(`{path, line, scope, date, action}`, where `date` is a `YYYY-MM-DD HH:MM:SS`\ntimestamp), so an agent can read the tail to find the latest review activity. Add `.turboreview/` to your `.gitignore` if you don't\nwant it tracked. `R` hides reviewed files to declutter the list.\n\n## Display notes\n\nFile-type icons use [Nerd Fonts](https://www.nerdfonts.com/) — install a Nerd\nFont in your terminal for the glyphs to render correctly (otherwise you'll see\nfallback boxes). Code highlighting uses the bundled Catppuccin Mocha–style dark\ntheme.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnmbr7%2Fturboreview","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnmbr7%2Fturboreview","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnmbr7%2Fturboreview/lists"}