连续 diff 流
GitHub 风格的连续 diff。在一个滚动流里浏览每一个被改动的文件,不必在文件间来回跳转。
tuicr 把 PR 审查的完整流程搬进终端:浏览、评论、跟踪、提交,一气呵成。
GitHub 风格的连续 diff。在一个滚动流里浏览每一个被改动的文件,不必在文件间来回跳转。
在行、区间、文件、评审四个层级添加 PR 风格的评论,覆盖从细节到整体的全部反馈。
以文件或 hunk 为粒度跟踪审查进度,跨会话持久化保存,下次打开继续。
将真实评审推送到 GitHub、GitLab、Gitea、Bitbucket、Azure DevOps 或 Gerrit。
自动检测 git、jj 和 mercurial。可审查未提交的改动、提交区间,或任意远程 PR。
单一静态二进制,无运行时依赖。选一种你习惯的方式安装,之后随时用一条命令更新。
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 | shLinux / 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 125GitHub、Gitea、Bitbucket 或 Azure DevOps 的 PR,或 Gerrit change
tuicr pr 125 --remote up使用具名 Git remote 的 fetch URL
tuicr mr 125GitLab 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安装一个已知可用的版本
j / k在连续 diff 中导航
c添加评论
y复制评审到剪贴板
:submit推送到六大平台
重新打开之前审查过的 pull request 时,只要元数据可用,tuicr 会预选出自上次提交评审以来更新的提交;已被该评审覆盖的提交在行内选择器中会标上 ✓。 审查过程中使用 :summary 可显示所有待处理的本地草稿评论。 tuicr 自动检测 git、jj 或 mercurial;SHA-256 的 Git 仓库会自动使用 Git CLI 后端,普通 SHA-1 仓库默认使用 libgit2。
与同类工具相比,tuicr 在保持终端体验的同时,覆盖了全部主流代码托管平台的行内评审推送。
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把评审结果管道输出到任意进程。
Comment、Approve、Request changes 或 Draft。行内评论作为真实的 PR 评审落在对应行上,评审层级的评论成为评审总结。
需要 gh 已对该仓库完成认证
Comment、Approve、Request changes 或 Draft。行内评论作为讨论笔记发布,Draft 作为草稿笔记,评审层级的评论成为总结。
需要 glab 已对所在主机完成认证;Request changes 需账号被指派为 reviewer
Comment、Approve、Request changes 或 Draft。行内评论作为评审评论发布,全部在一次请求内完成。
需要 tea 并登录该实例(tea logins add)
Comment 或 Approve。行内评论作为 PR 的行内评论发布(含多行区间),评审层级的评论成为 PR 的通用评论。
需要 bkt 已对 bitbucket.org 完成认证;暂不支持 Request changes 与 Draft
Comment、Approve 或 Request changes。行内评论作为 PR 评论线程发布;Approve / Request changes 同时投出 reviewer 票。
AZURE_DEVOPS_EXT_PAT 个人访问令牌(首选),回退到 az login
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 把 markdown 管道输出到另一个进程,便于在脚本与自动化流程中消费评审结果。
无需认证
关于让你的助手在 cmux、tmux、Zellij 或 Herdr 的分屏中打开 tuicr 的代理驱动工作流,见skills/tuicr/SKILL.md。
不打开 TUI 也能读写评审会话,或直接基于持久化会话构建自己的工具。
tuicr review在不打开 TUI 的情况下暴露已保存的会话:列出、添加、删除、清空评论,并打印已存储的评论。完整文档见docs/REVIEW_CLI.md。
tuicr review list列出已保存的评审会话,当前打开的 TUI 会话标记为 "active": truetuicr review add向会话添加评论(行、文件或区间)tuicr review remove删除指定的评论tuicr review clear清空会话中的全部评论tuicr review print打印已存储的评论,供代理与脚本消费审查目标变为活跃状态时,TUI 会创建一个持久化的会话文件,协作工具可以立即添加评论;TUI 退出时删除自动创建的空会话文件。在 TUI 内部,审查目标选择器的 Sessions 标签页列出当前 checkout 下已保存的评审,用 :sessions 打开,或用 Tab 切换,直接选中即可恢复。
tuicr 暴露了一个 Rust 库 API。ReviewStore可以列出某个 checkout 下的会话、加载会话,并使用与 TUI 相同的插入原语添加评审、文件、行或区间评论。
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。
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 的开发得以持续,我在这里做的事能被认可,这对我意义重大!