[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-96204":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":9,"totalLinesOfCode":9,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":9,"subscribersCount":14,"size":14,"stars1d":14,"stars7d":14,"stars30d":14,"stars90d":14,"forks30d":14,"starsTrendScore":14,"compositeScore":16,"rankGlobal":9,"rankLanguage":9,"license":9,"archived":17,"fork":17,"defaultBranch":18,"hasWiki":17,"hasPages":17,"topics":9,"createdAt":9,"pushedAt":9,"updatedAt":19,"readmeContent":20,"aiSummary":21,"trendingCount":14,"starSnapshotCount":14,"syncStatus":22,"lastSyncTime":23,"discoverSource":24},96204,"herdr-reviewr","persiyanov\u002Fherdr-reviewr","persiyanov","A code review + file viewer sidebar for herdr. Comment on a diff and send back to agent. Inspect diffs, files, and a PR state.",null,"https:\u002F\u002Fgithub.com\u002Fpersiyanov\u002Fherdr-reviewr","Rust",675,69,0,22,9.54,false,"main","2026-09-21 02:04:30","# herdr-reviewr\n\n[![CI](https:\u002F\u002Fgithub.com\u002Fpersiyanov\u002Fherdr-reviewr\u002Factions\u002Fworkflows\u002Fci.yml\u002Fbadge.svg)](https:\u002F\u002Fgithub.com\u002Fpersiyanov\u002Fherdr-reviewr\u002Factions\u002Fworkflows\u002Fci.yml)\n[![Release](https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fv\u002Frelease\u002Fpersiyanov\u002Fherdr-reviewr)](https:\u002F\u002Fgithub.com\u002Fpersiyanov\u002Fherdr-reviewr\u002Freleases\u002Flatest)\n[![License](https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Flicense\u002Fpersiyanov\u002Fherdr-reviewr)](LICENSE)\n\n\u003Cp align=\"center\">\n  \u003Ca href=\"#install\">install\u003C\u002Fa> · \u003Ca href=\"#quick-start\">quick start\u003C\u002Fa> · \u003Ca href=\"#controls\">controls\u003C\u002Fa> · \u003Ca href=\"#diff-scopes\">scopes\u003C\u002Fa> · \u003Ca href=\"#configuration\">configuration\u003C\u002Fa> · \u003Ca href=\"#limitations\">limitations\u003C\u002Fa> · \u003Ca href=\"CHANGELOG.md\">changelog\u003C\u002Fa>\n\u003C\u002Fp>\n\nA code-review pane for [herdr](https:\u002F\u002Fherdr.dev). Your agent writes the code. You read its\ndiff in a pane beside the chat, comment on the lines, and send the notes back. You never leave\nthe terminal.\n\n![demo](assets\u002Fdemo.gif)\n\nOne persistent pane, pointed at a git worktree:\n\n- **Diff review** — the agent's changed files, syntax-highlighted.\n- **Four diff scopes** — uncommitted, branch, last turn, commits.\n- **Last-turn diff** — what the worktree's latest turn changed, on its own.\n- **Line comments** — comment on a line or a range. Then send it to the agent.\n- **Text selection** — drag over any text to copy it, like an editor.\n- **File viewer** — any file's current content from the whole worktree.\n- **Search** — fuzzy file names and live code grep across the worktree, powered by [fff](https:\u002F\u002Fgithub.com\u002FdmtrKovalenko\u002Ffff).\n- **Find in file** — search the open file and step between every match.\n- **PR view** — the branch's pull request in the pane, read-only.\n- **Markdown preview** — flip a `.md` file between source and rendered view.\n- **Themes** — 18 palettes in dark and light.\n\nIt never edits your worktree and sends nothing on its own. The **PR** tab reads GitHub,\nGitLab, or Azure DevOps and never posts.\n\n## Requirements\n\n- **herdr ≥ 0.7.5** (the plugin system).\n- **git** on `PATH`.\n- A **truecolor** terminal with Unicode box-drawing.\n- **macOS or Linux.**\n- **`gh`** (GitHub), **`glab`** (GitLab), or **`az`** (Azure DevOps, with the `azure-devops` extension), authenticated. Only the **PR** tab needs one.\n\n## Install\n\nPrebuilt binaries, no Rust toolchain needed:\n\n```bash\nherdr plugin install persiyanov\u002Fherdr-reviewr\n```\n\nOpen it in the current workspace:\n\n```bash\nherdr plugin action invoke open --plugin persiyanov.reviewr\n```\n\nreviewr auto-opens when herdr creates a workspace for a worktree, whether the checkout is new or\nopened from disk. `auto_open = false` keeps it hidden until you ask\n([Configuration](#configuration)).\n\n**To update**, reinstall. Your config is keyed by plugin id and survives:\n\n```bash\nherdr plugin uninstall persiyanov.reviewr && herdr plugin install persiyanov\u002Fherdr-reviewr\n```\n\n**Without herdr**, reviewr runs as a plain terminal app. Grab a\n[release binary](https:\u002F\u002Fgithub.com\u002Fpersiyanov\u002Fherdr-reviewr\u002Freleases\u002Flatest) and point it at a\nrepo:\n\n```bash\nherdr-reviewr ~\u002Fsome\u002Frepo\n```\n\nEverything works except **Send** and the **last turn** scope. Those need herdr around.\n\n## Quick start\n\nOpen reviewr next to your agent:\n\n1. **Pick a file.** Changed files are in the navigator. `j` \u002F `k` moves, the diff follows. Or\n   `]` walks the changes hunk by hunk, file after file.\n2. **Focus the diff.** `Tab` switches panes.\n3. **Select lines.** `v`, then `j` \u002F `k` to extend (or click or drag the gutter).\n4. **Comment.** `c`, type, `Enter`.\n5. **Send.** `s` sends every comment to the agent's input.\n\nThe footer shows the next step. Press `?` for every key that works right now.\n\nFor a shortcut, bind a key to the toggle in your herdr config (user config, not the plugin manifest):\n\n```toml\n[[keys.command]]\nkey = \"cmd+r\"\ntype = \"plugin_action\"\ncommand = \"persiyanov.reviewr.toggle\"   # \u003Cplugin_id>.\u003Caction_id> — note the id, not the name\n```\n\n`cmd+…` chords reach herdr. Many macOS terminals swallow `alt+…` themselves.\n\n## Controls\n\nThe keys below are defaults. You can rebind every action, even to several keys at once\n([Keybindings](#keybindings)).\n\n**Getting around**\n\n| Key | Action |\n| --- | --- |\n| `1` `2` `3` | Switch tab — Changes \u002F All files \u002F PR |\n| `u` `b` `t` `g` | Switch scope — uncommitted \u002F branch \u002F last turn \u002F commits |\n| `B` | Pick the base branch |\n| `G` | Pick the commits to review |\n| `j` `k` · `↑` `↓` | Move cursor |\n| `]` `[` | Jump to next \u002F previous hunk |\n| `f` `F` | Jump to next \u002F previous file |\n| `PageUp` `PageDown` | Move a page |\n| `Ctrl+U` `Ctrl+D` | Move a half-page |\n| `Tab` | Switch focus |\n| `→` `←` | Expand \u002F collapse, or scroll sideways |\n| `\u002F` | Search files and code |\n| `Ctrl+F` | Find in file |\n| `w` | Toggle line wrap |\n| `m` | Preview markdown file |\n| `p` | Rotate navigator |\n| `z` | Hide \u002F show navigator |\n| `\u003C` `>` | Grow \u002F shrink navigator |\n| `r` | Refresh |\n| `?` | Open shortcuts helper |\n| `q` | Quit |\n\n**Reviewing** (in the diff)\n\n| Key | Action |\n| --- | --- |\n| `v` | Select lines |\n| `c` | Comment on line or selection |\n| `e` | Edit the comment under the cursor, or open the file in your editor |\n| `d` | Delete comment |\n| `n` `N` | Jump to next \u002F previous comment |\n| `l` | List all comments |\n| `s` | Send comments to agent |\n| `y` | Copy comments to clipboard |\n| `esc` | Clear selection |\n\n**In the comment box**\n\n| Key | Action |\n| --- | --- |\n| `Enter` | Save comment |\n| `Esc` | Cancel |\n| `Shift+Enter` · `Alt+Enter` · `Ctrl+J` | Insert newline |\n\nPlus the usual caret moves: arrows, `Home` \u002F `End`, `Ctrl+A` \u002F `Ctrl+E`, `Alt+b` \u002F `Alt+f` word\njumps, and `Ctrl+W` \u002F `Ctrl+U` \u002F `Ctrl+K` deletes.\n\n**PR tab** (read-only)\n\n| Key | Action |\n| --- | --- |\n| `j` `k` | Move through description and comments |\n| `PageUp` `PageDown` | Scroll focused pane |\n| `o` | Open PR in browser |\n| `r` | Refresh |\n\nThe mouse works too. Drag over any text to select and copy it, double-click a word,\ntriple-click a line. Click or drag the line-number gutter to comment. Click files, tabs, and\nlinks, and scroll with the wheel.\n\n## The three tabs\n\n- **Changes** — the active scope's changed files with `+\u002F-` stats and totals in the header.\n- **All files** — any file's current content from the whole worktree, comments too. Ignored\n  paths show dimmed.\n- **PR** — a read-only mirror of the branch's pull request (GitHub, Azure DevOps) or merge\n  request (GitLab): state, checks, description, and comments, rendered as markdown. reviewr\n  never writes to the forge.\n\n## Diff scopes\n\n- **uncommitted** — the working tree vs `HEAD` (staged, unstaged, and untracked).\n- **branch** — the working tree vs the merge-base with the base branch: **uncommitted** plus\n  the branch's commits. The base is your repo's default branch until you pick another with\n  `B` ([Base branch](#base-branch)).\n- **last turn** — everything that changed in this worktree since its most recent turn started\n  ([Limitations](#limitations)).\n- **commits** — one commit, or several in a row, picked with `G`. Read what the agent\n  committed one step at a time, without its unsaved edits mixed in.\n\nreviewr starts in **uncommitted**. `default_scope` changes that. Switching with `u`\u002F`b`\u002F`t`\u002F`g`\nwins for the rest of the session. `g` without a pick opens the picker.\n\nEvery scope respects `.gitignore`, so build output never clutters **Changes**. To review a file,\ntrack it. **All files** still browses any ignored path.\n\n## Configuration\n\nCLI flags on the pane command:\n\n| Flag | Default | Meaning |\n| --- | --- | --- |\n| `--poll \u003Cms>` | `2000` | worktree poll interval (min `200`) |\n| `--base \u003Cref>` | auto | base for `branch` scope, any rev, overrides the pick |\n| `--theme \u003Cname>` | `catppuccin` | UI + syntax theme (see below) |\n| `--wrap \u003Con\\|off>` | `on` | soft-wrap long diff lines (`w` toggles at runtime) |\n\nEverything else lives in reviewr's config file:\n\n```text\n~\u002F.config\u002Fherdr\u002Fplugins\u002Fconfig\u002Fpersiyanov.reviewr\u002Fconfig.toml\n```\n\nCreate it if missing. It is reviewr's file. Settings in herdr's `~\u002F.config\u002Fherdr\u002Fconfig.toml`\nnever reach it. reviewr re-reads it on every refresh and toggle, so edits apply without a\nrelaunch.\n\nThe file accepts these keys:\n\n```toml\ntheme = \"tokyo-night\"\ndefault_scope = \"branch\"\nnavigator_position = \"right\"\ntoggle_placement = \"overlay\"\ntoggle_direction = \"down\"\nauto_open = false\ngithub_host = \"github.example.com\"\neditor = \"code -g {file}:{line}\"\n\n[keybindings]\ncomment = [\"c\", \"ㅊ\"]\nselect  = [\"v\", \"ㅍ\"]\n```\n\nA missing file or omitted key uses its default. An invalid file is rejected whole — the pane\nshows the error and recovers on the next refresh after you fix it.\n\n### Theme\n\nOne theme colors the whole UI, chrome and syntax together:\n\n```toml\ntheme = \"tokyo-night\"\n```\n\n`--theme` overrides the file. Match your terminal's light or dark background. Available:\n\n- **Dark:** `catppuccin`, `catppuccin-frappe`, `catppuccin-macchiato`, `dracula`, `nord`,\n  `gruvbox`, `one-dark`, `solarized`, `monokai`, `tokyo-night`, `rose-pine`.\n- **Light:** `catppuccin-latte`, `gruvbox-light`, `one-light`, `solarized-light`,\n  `github-light`, `tokyo-night-day`, `rose-pine-dawn`.\n\nNames match herdr's where both ship a palette.\n\n### Navigator position\n\nThe navigator starts on the right. Set `navigator_position` to `right`, `bottom`, `left`, or\n`top`, or press `p` to cycle clockwise:\n\n```toml\nnavigator_position = \"bottom\"\n```\n\n`\u003C` grows, `>` shrinks, or drag the divider. `z` hides the navigator altogether and brings it\nback.\n\n### Base branch\n\nThe **branch** scope diffs against the merge-base with your repo's default branch, the one\n`origin\u002FHEAD` names. The header shows the resolved base, `vs main`.\n\nWhen the trunk is something else, or you review a stacked branch, press `B` (or click the\nbase name) and pick the branch. The pick is stored for this worktree and holds until you\npick again. Other worktrees on the same clone keep their own pick. Choosing the default\nbranch records that name.\n\nYou can also type any revision, like `HEAD~2`, a tag, or a SHA prefix. The header shows what\nresolved: `vs HEAD~2 (a1b2c3d)`.\n\n`--base \u003Cref>` sets the base for this pane. It wins over the pick and disables the picker.\n\n### Editor\n\n`e` opens the file at the line you're on, or the navigator's selected file. On a line you have\nalready commented, `e` edits the comment instead.\n\nSet `$EDITOR` (or `$VISUAL`) and reviewr opens it at the right line. It knows vim, neovim,\nhelix, emacs, nano, VS Code and its forks, Zed, Sublime Text, JetBrains, and the rest of the\nusual set.\n\nA terminal editor takes the pane, and reviewr refreshes when you quit it. A window editor opens\nits own window, so the diff stays up and your save turns up in it on the next poll.\n\nWrite the command yourself when you need to. `{file}` and `{line}` are reviewr's, everything\nelse is your editor's:\n\n```toml\neditor = \"code -g {file}:{line}\"\n```\n\n### Keybindings\n\n`[keybindings]` maps an action name to an array of keys. The array replaces that action's\ndefaults, actions you don't mention keep theirs, and hints show the first key:\n\n```toml\n[keybindings]\ncomment = [\"c\", \"ㅊ\"]\nselect  = [\"v\", \"ㅍ\"]\n```\n\nSeveral keys per action serves CJK input sources — bind the character your layout produces\non the same physical key.\n\nThe action names and their defaults:\n\n| Action | Default |\n| --- | --- |\n| `down` \u002F `up` | `j` \u002F `k` |\n| `next-hunk` \u002F `prev-hunk` | `]` \u002F `[` |\n| `next-file` \u002F `prev-file` | `f` \u002F `F` |\n| `scope-uncommitted` \u002F `scope-branch` \u002F `scope-last-turn` \u002F `scope-commits` | `u` \u002F `b` \u002F `t` \u002F `g` |\n| `base-pick` \u002F `commit-pick` | `B` \u002F `G` |\n| `tab-changes` \u002F `tab-all-files` \u002F `tab-pr` | `1` \u002F `2` \u002F `3` |\n| `wrap` | `w` |\n| `preview` | `m` |\n| `navigator-position` | `p` |\n| `navigator-hide` | `z` |\n| `navigator-grow` \u002F `navigator-shrink` | `\u003C` \u002F `>` |\n| `select` | `v` |\n| `comment` | `c` |\n| `edit` \u002F `delete` | `e` \u002F `d` |\n| `next-comment` \u002F `prev-comment` | `n` \u002F `N` |\n| `comments` | `l` |\n| `search` | `\u002F` |\n| `find` | `ctrl+f` |\n| `keys` | `?` |\n| `send` | `s`, `S` |\n| `copy` | `y`, `Y` |\n| `open-pr` | `o` |\n| `refresh` | `r` |\n| `quit` | `q` |\n\nA key is one printable character, or a `ctrl+`\u002F`alt+` chord like `ctrl+f`. `Tab`, `Esc`, and\n`Enter` are fixed. Keys still type normally in the comment box.\n\n### Forge repositories and hosts\n\nThe PR tab reads `upstream` when you have one, otherwise `origin`. A standard fork clone works\nwithout setup.\n\nGitHub.com, GitLab.com, dev.azure.com, and the `*.visualstudio.com` organization hosts work\nwithout configuration. For one self-hosted instance per forge, set its bare hostname:\n\n```toml\ngithub_host = \"github.example.com\"\ngitlab_host = \"git.corp.example\"\nazure_devops_host = \"tfs.corp.example\"\n```\n\nMatching is exact. reviewr does not infer SSH aliases like `github.com-work` — use a\ncanonical-host remote or an `insteadOf` rewrite. Authenticate with\n`gh auth login --hostname github.example.com`, `glab auth login --hostname git.corp.example`,\nor `az login`.\n\n### Pane placement\n\nThe toggle opens reviewr as a split to the right of your agent. `toggle_placement` changes the\nshape:\n\n```toml\ntoggle_placement = \"overlay\"   # split | overlay | zoomed | tab   (default: split)\ntoggle_direction = \"down\"      # right | down — split only        (default: right)\n```\n\n- **`split`** sits next to your agent. `toggle_direction` puts reviewr on the right (default) or below.\n- **`overlay`** covers the tab. Toggle again to drop back.\n- **`zoomed`** fills the tab.\n- **`tab`** opens its own tab.\n\nEvery placement takes the keyboard on toggle. New worktree workspaces auto-open only `split` and\n`tab`, and never steal focus.\n\n### Auto-open and layout plugins\n\nreviewr auto-opens when herdr creates a workspace for a new or existing worktree checkout. Opening\nan already-live workspace does not resurrect a reviewr pane you closed there. `auto_open = false`\nmakes it wait for the toggle:\n\n```toml\nauto_open = false   # default: true\n```\n\nA layout places reviewr like any other program. Give one pane the command:\n\n```toml\ncommand = \"herdr-reviewr\"\n```\n\nThat pane is a full reviewr pane. The install links the binary at `~\u002F.local\u002Fbin\u002Fherdr-reviewr`\nand at `~\u002F.local\u002Fstate\u002Fherdr\u002Fplugins\u002Fpersiyanov.reviewr\u002Fbin\u002Fherdr-reviewr`. Use the long path\nif `~\u002F.local\u002Fbin` is not on your `PATH`.\n\nA layout hook can also invoke the actions, once its panes are in place:\n\n```bash\nherdr plugin action invoke open --plugin persiyanov.reviewr\n```\n\n`open` ignores `auto_open`, and both actions are safe to repeat. They target the focused\nworkspace. Put `herdr-reviewr` itself in a layout pane, never the invoke.\n\n## Limitations\n\nThe known constraints:\n\n**Terminal & theme**\n- **Truecolor required** — colors are 24-bit RGB with no 256\u002F8-color fallback. Basic terminals\n  render wrong colors.\n- **Theme must match the terminal** — the pane keeps the terminal's background, and there is no\n  auto light\u002Fdark detection yet. You match the theme by hand.\n- **Add \u002F remove are red \u002F green** — no secondary cue for colorblind users yet.\n- **Box-drawing glyphs required**, but no Nerd Font.\n\n**Platform**\n- **macOS and Linux only** — no Windows.\n- **Clipboard export** uses `pbcopy`, `wl-copy`, `xclip`, or `xsel`. With none installed it\n  says so, and **Send** still works.\n\n**herdr coupling**\n- **Send needs an agent in the workspace** — one agent takes the comments straight away, and\n  several open a picker so you choose. With no agent, Send says so and keeps your comments.\n- **last turn relies on polling** (2 s default) — a turn that starts and finishes inside one\n  poll is missed, and the scope shows everything since the last *observed* turn start, your\n  own edits included.\n\n**PR tab (GitHub, GitLab, and Azure DevOps)**\n- **Read-only** — needs the forge's authenticated CLI (`gh`, `glab`, or `az`) and a\n  recognized `upstream` or `origin`. Without either it tells you what to fix, and the other\n  tabs keep working. Other forges are not supported.\n- **One repository, never a cross-repository search** — a readable, recognized `upstream` is\n  authoritative, otherwise `origin`. Clones that target different parent repositories stay\n  separate.\n- **Mirrors the branch's *open* PR or MR** — merged or closed shows as history. Each comment\n  surface caps at its newest 100 rows, with a `+more` marker naming the forge when there is\n  more.\n\n**Review model**\n- **Comments are in-memory and single-session** — closing the pane loses any you haven't sent\n  or copied out.\n- **Sending is all-or-nothing** — Send (or copy) delivers the whole set and clears it. A\n  failure leaves everything in place.\n- **No line-number rebasing** — a comment stays locatable by its diff snippet, not its line\n  number. reviewr flags a stale comment instead of dropping it.\n\n**Budgets**\n- Files over 2 MB or 50,000 lines show a \"too large\" notice. Binary files get no diff.\n\n## Building from source\n\nFor the dev setup, tests, and benchmarks, see [CONTRIBUTING.md](CONTRIBUTING.md). To run your\nown build inside herdr panes, link the checkout. `herdr plugin link` runs the binary you build\nat `bin\u002Fherdr-reviewr`:\n\n```bash\ngit clone https:\u002F\u002Fgithub.com\u002Fpersiyanov\u002Fherdr-reviewr\ncd herdr-reviewr\njust install   # build release → bin\u002Fherdr-reviewr, ad-hoc re-signed on macOS\nherdr plugin link .\n```\n\nAfter every `just install`, toggle the reviewr pane off and on. An open pane keeps running the old\nprocess. The loop only works while the plugin is linked: a `github:…` source in\n`herdr plugin list` runs a downloaded binary that local rebuilds never touch. Switch with:\n\n```bash\nherdr plugin uninstall persiyanov.reviewr   # config is keyed by id and survives\nherdr plugin link .\n```\n\n## Roadmap\n\nStructured (JSON) export, a side-by-side split view, mark-file-reviewed,\nnamed-key notation for keybindings, OSC light\u002Fdark theme autodetect, more themes\n(`kanagawa`, `vesper`, `everforest`, `ayu`, a dark `github`), a `terminal`-following palette,\nand OSC 52 clipboard.\n\n## Design\n\nChange specs live in [`docs\u002Fspecs\u002F`](docs\u002Fspecs\u002F), one folder per change.\n\n## License\n\n[MIT](LICENSE). Syntax highlighting comes from [syntect](https:\u002F\u002Fgithub.com\u002Ftrishume\u002Fsyntect)\nand [two-face](https:\u002F\u002Fgithub.com\u002FCosmicHorrorDev\u002Ftwo-face). Most themes' syntax colors come\nfrom two-face's bundled set.\n\nBundled `.tmTheme` syntax files in `assets\u002F`, each under its own license:\n\n- [Catppuccin Mocha](https:\u002F\u002Fgithub.com\u002Fcatppuccin\u002Fbat) — MIT.\n- [Tokyo Night](https:\u002F\u002Fgithub.com\u002Ffolke\u002Ftokyonight.nvim) (`tokyo-night`, `tokyo-night-day`) — Apache-2.0.\n- [Rosé Pine](https:\u002F\u002Fgithub.com\u002Frose-pine\u002Ftm-theme) (`rose-pine`, `rose-pine-dawn`) — MIT.\n","herdr-reviewr 是一个面向终端的代码审查与文件浏览侧边栏插件，专为 herdr AI 编程代理工作流设计。它提供语法高亮的 diff 查看、多粒度变更范围（未提交\u002F分支\u002F上一轮\u002F提交）、行级评论、全工作树文件浏览、模糊文件搜索、代码内搜索、PR 状态只读查看及 Markdown 预览等功能，所有操作均在终端内完成，不修改工作树且无自动外发行为。适用于使用 herdr 进行 AI 辅助开发的工程师，在本地 Git 工作区中高效审阅 AI 生成代码变更。",2,"2026-09-12 02:30:06","trending"]