跳到主要内容

终端代码审查工具

带 vim 键绑定的
代码审查 TUI

在一个滚动流里浏览每个改动文件,写 PR 风格评论,一键推送到 GitHub、GitLab、Gitea 等六大平台。

tuicr pr 125
tuicr 界面演示:在终端中浏览连续 diff 并添加评论

连续 diff 流 · 行内评论 · vim 导航

为终端而生的审查体验

tuicr 把 PR 审查的完整流程搬进终端:浏览、评论、跟踪、提交,一气呵成。

连续 diff 流

GitHub 风格的连续 diff。在一个滚动流里浏览每一个被改动的文件,不必在文件间来回跳转。

-const verbose = true;
+const verbose = opts.verbose ?? false;
+if (verbose) log("review mode");

四层评论

在行、区间、文件、评审四个层级添加 PR 风格的评论,覆盖从细节到整体的全部反馈。

评审跟踪

以文件或 hunk 为粒度跟踪审查进度,跨会话持久化保存,下次打开继续。

src/auth.rs ✓hunk 2/5跨会话持久化

六平台导出

将真实评审推送到 GitHub、GitLab、Gitea、Bitbucket、Azure DevOps 或 Gerrit。

githubgitlabgiteabitbucketazuredevopsgerrit

多引擎支持

自动检测 git、jj 和 mercurial。可审查未提交的改动、提交区间,或任意远程 PR。

gitjjmercurial

一条命令,装好即用

单一静态二进制,无运行时依赖。选一种你习惯的方式安装,之后随时用一条命令更新。

保持更新

更新
tuicr update        # 更新当前安装
tuicr update 0.18.0 # 安装一个已知可用的版本

tuicr update在对应包管理器拥有该可执行文件时,会使用 Homebrew、Cargo、Mise 或 Nix profile 来更新;通过安装脚本或手动下载的二进制文件,会在 SHA-256 校验后从对应的 GitHub release 资源原地更新。

指定版本号安装支持 Cargo 和直接下载的二进制;Homebrew、Mise、Nix 请使用各自的版本固定流程。nix run属于临时运行而非安装,需要重新运行以使用当前的 flake;或者使用nix profile install github:agavra/tuicr进行安装,这样 tuicr update 就能升级它。

curl -fsSL tuicr.dev/install.sh | sh

Linux / macOS

其他安装方式+

Cargo / Mise / Nix

cargo install tuicr
mise use github:agavra/tuicr
nix run github:agavra/tuicr

预编译二进制见 GitHub Releases。Linux 版本包含动态链接的 GNU 变体和静态 musl 变体。

从源码安装

git clone https://github.com/agavra/tuicr.git
cd tuicr
cargo install --path .

三十秒进入审查

所有标志位、环境变量和退出码见 docs/CLI.md。

发起审查

  • tuicr

    从提交选择器中选择

  • tuicr tui

    同一个 TUI,显式子命令

  • tuicr -w

    未提交的改动(跳过选择器)

  • tuicr -r main..HEAD

    提交区间

远程评审

  • tuicr pr 125

    GitHub、Gitea、Bitbucket 或 Azure DevOps 的 PR,或 Gerrit change

  • tuicr pr 125 --remote up

    使用具名 Git remote 的 fetch URL

  • tuicr mr 125

    GitLab MR

  • tuicr tui pr 125

    通过显式 TUI 子命令发起 GitHub PR

  • tuicr tui mr 125

    通过显式 TUI 子命令发起 GitLab MR

导出与会话

  • tuicr --stdout

    把评审管道输出到 stdout

  • tuicr review list

    列出已保存的本地评审会话

  • tuicr update

    更新当前安装

  • tuicr update 0.18.0

    安装一个已知可用的版本

在 tuicr 内部

j / k

在连续 diff 中导航

c

添加评论

y

复制评审到剪贴板

:submit

推送到六大平台

重新打开之前审查过的 pull request 时,只要元数据可用,tuicr 会预选出自上次提交评审以来更新的提交;已被该评审覆盖的提交在行内选择器中会标上 ✓。 审查过程中使用 :summary 可显示所有待处理的本地草稿评论。 tuicr 自动检测 git、jj 或 mercurial;SHA-256 的 Git 仓库会自动使用 Git CLI 后端,普通 SHA-1 仓库默认使用 libgit2。

横向对比

与同类工具相比,tuicr 在保持终端体验的同时,覆盖了全部主流代码托管平台的行内评审推送。

tuicr 与 hunk、lumen、gh pr review、git diff 的功能对比
tuicrhunklumengh pr reviewgit diff
TUI diff 查看器
在 TUI 内写评论
Vim 键绑定partial¹
推送行内评审到 GitHubpartial²
推送行内评审到 GitLab
推送行内评审到 Gitea
推送行内评审到 Bitbucket
推送行内评审到 Azure DevOps
推送行内评审到 Gerrit
面向代理的 markdown 导出通过 CLI skill
git
jj
Mercurial (hg)
单一静态二进制

1 Lumen 支持 j/k 导航,但缺少更完整的 vim 模式(可视模式、{N}G、Ctrl-d/Ctrl-u 等)。

2 gh pr review 仅在评审层级发布 approve/comment/request-changes,没有行内评论。

导出你的评审

审查完毕,把评论发送到工作继续进行的地方。在 tuicr 内部按 :submit 即可推送到对应平台。

剪贴板导出(:clip)

I reviewed your code and have the following comments. Please address them.

1. `src/auth.rs` - Consider adding unit tests
2. `src/auth.rs:42` - Magic number should be a named constant
3. `src/auth.rs:50-55` - This block could be refactored

粘贴回任意编程助手(Claude、Codex、Cursor 等)。

stdout 管道(--stdout)

tuicr --stdout > review.md
tuicr --stdout | pbcopy

把评审结果管道输出到任意进程。

GitHub

Comment、Approve、Request changes 或 Draft。行内评论作为真实的 PR 评审落在对应行上,评审层级的评论成为评审总结。

需要 gh 已对该仓库完成认证

GitLab

Comment、Approve、Request changes 或 Draft。行内评论作为讨论笔记发布,Draft 作为草稿笔记,评审层级的评论成为总结。

需要 glab 已对所在主机完成认证;Request changes 需账号被指派为 reviewer

Gitea

Comment、Approve、Request changes 或 Draft。行内评论作为评审评论发布,全部在一次请求内完成。

需要 tea 并登录该实例(tea logins add)

Bitbucket

Comment 或 Approve。行内评论作为 PR 的行内评论发布(含多行区间),评审层级的评论成为 PR 的通用评论。

需要 bkt 已对 bitbucket.org 完成认证;暂不支持 Request changes 与 Draft

Azure DevOps

Comment、Approve 或 Request changes。行内评论作为 PR 评论线程发布;Approve / Request changes 同时投出 reviewer 票。

AZURE_DEVOPS_EXT_PAT 个人访问令牌(首选),回退到 az login

Gerrit

Comment、Approve、Request changes 或 Draft。Approve 投出 Code-Review +2,Request changes 投出 -1;Draft 保留为 Gerrit 草稿评论。

GERRIT_USERNAME / GERRIT_PASSWORD 中的 Gerrit HTTP 密码

编程助手

y 或 :clip 会把一个结构化的 markdown 块复制到剪贴板,每条评论带有编号以及文件 / 行锚点,可直接粘贴回 Claude、Codex、Cursor 等任意编程助手。

无需认证

stdout 管道

使用 --stdout 把 markdown 管道输出到另一个进程,便于在脚本与自动化流程中消费评审结果。

无需认证

关于让你的助手在 cmux、tmux、Zellij 或 Herdr 的分屏中打开 tuicr 的代理驱动工作流,见skills/tuicr/SKILL.md。

为代理与脚本而建

不打开 TUI 也能读写评审会话,或直接基于持久化会话构建自己的工具。

评审会话 CLI

tuicr review在不打开 TUI 的情况下暴露已保存的会话:列出、添加、删除、清空评论,并打印已存储的评论。完整文档见docs/REVIEW_CLI.md。

  • tuicr review list列出已保存的评审会话,当前打开的 TUI 会话标记为 "active": true
  • tuicr review add向会话添加评论(行、文件或区间)
  • tuicr review remove删除指定的评论
  • tuicr review clear清空会话中的全部评论
  • tuicr review print打印已存储的评论,供代理与脚本消费

审查目标变为活跃状态时,TUI 会创建一个持久化的会话文件,协作工具可以立即添加评论;TUI 退出时删除自动创建的空会话文件。在 TUI 内部,审查目标选择器的 Sessions 标签页列出当前 checkout 下已保存的评审,用 :sessions 打开,或用 Tab 切换,直接选中即可恢复。

库 API

tuicr 暴露了一个 Rust 库 API。ReviewStore可以列出某个 checkout 下的会话、加载会话,并使用与 TUI 相同的插入原语添加评审、文件、行或区间评论。

ReviewStore 示例
use tuicr::{AddCommentRequest, CommentTarget, CommentType, LineSide, ReviewStore};

let store = ReviewStore::new();
let sessions = store.list_sessions_for_repo("/path/to/repo")?;
let session = &sessions[0].session_ref;

store.add_comment(
    session,
    AddCommentRequest {
        target: CommentTarget::Line {
            path: "src/main.rs".into(),
            line: 42,
            side: LineSide::New,
        },
        content: "Handle the empty case here.".into(),
        comment_type: CommentType::from_id("issue"),
    },
)?;

按你的方式配置

配置文件路径:Linux/macOS 上为 ~/.config/tuicr/config.toml,Windows 上为 %APPDATA%\tuicr\config.toml。

config.toml
theme = "catppuccin-mocha"
diff_view = "side-by-side"   # 或 "unified"
ignore_whitespace = false    # 忽略本地 VCS diff 中的所有空白
appearance = "system"        # 或 "dark" / "light"
mouse = true
leader = ";"                  # 可配置的 leader 快捷键前缀
editor = "nvim"               # `e` / `:edit` 使用的编辑器;覆盖 $EDITOR
comment_vim = false           # 在评审评论框中使用 vim 模态编辑
relative_line_numbers = false # 在 diff 行号槽显示渲染行的相对距离

完整选项、主题解析优先级、comment_types 语义以及 .tuicrignore 规则见docs/CONFIG.md。

内置主题

在 tuicr 内部用 :theme 打开实时预览的主题选择器(/ 筛选),:theme <name> 直接应用。仅会话内有效,要在 config.toml 中设置才能保留。

darklightayu-lightayu-mirageonedarkgithub-lightgithub-darkcatppuccin-lattecatppuccin-frappecatppuccin-macchiatocatppuccin-mochaeverforest-darkeverforest-lightgruvbox-darkgruvbox-lightnord-darknord-lightnord-dark-high-contrastnord-light-high-contrastsolarized-lightsolarized-darktokyo-night-stormtokyo-night-day

本地主题:设置 theme = "my-theme" 或运行 tuicr --theme my-theme,然后创建 ~/.config/tuicr/themes/my-theme.toml。本地主题可以引用一个本地 syntax_theme = "my-syntax.tmTheme" 文件用于语法高亮。可直接复制的示例见examples/tuicr-teal.toml 及配套的tmTheme。

键绑定速查

首次使用的速查表。在 tuicr 内部按 ? 查看完整参考。

导航

  • 下 / 上

    jk

  • 半页下 / 半页上

    Ctrl-dCtrl-u

  • 顶部 / 底部

    gG

  • 上一个 / 下一个文件

    {}

  • 上一个 / 下一个 hunk

    []

  • 下一条 / 上一条评论

    mM

搜索与筛选

  • 搜索 diff、文件树或帮助,取决于当前聚焦 / 打开的对象(不区分大小写)

    /

  • 下一个 / 上一个搜索匹配(循环);匹配保持高亮,Esc 清除

    nN

  • (文件树)按正则把文件筛入 / 筛出,同时收窄文件树和 diff

    ie

  • (文件树)清除包含 / 排除筛选器

    IE

评论与审查

  • 添加行 / 文件评论

    cC

  • 可视模式(区间评论)

    vV

  • 切换文件已审查

    r

  • 切换 hunk 已审查

    R

  • 在 $EDITOR 中打开聚焦的文件(PR 审查时为 PR 的修订版)

    e

  • 复制评审到剪贴板

    y

命令

  • 在 $EDITOR 中打开聚焦的文件

    :edit

  • 推送评审到 GitHub、GitLab、Gitea、Bitbucket、Azure DevOps 或 Gerrit

    :submit

  • 打开实时预览的主题选择器(/ 筛选);:theme <name> 直接应用

    :theme

  • 在 : 提示符中补全或循环命令

    Tab

  • 切换完整帮助

    ?

完整参考见 docs/KEYBINDINGS.md。

赞助者

感谢下面这些人让 tuicr 的开发得以持续,我在这里做的事能被认可,这对我意义重大!