一个你肯定遇到过但没当回事的痛点

用 Claude Code、Codex、Aider 跑一个任务,它改了 7 个文件,加了 300 行,删了 150 行。然后呢?

你敲 git diff,终端刷出来一大屏绿色和红色的文本。你盯着看了两分钟,试图理解 Agent 到底干了什么。最后你放弃了,直接 git commit 然后祈祷不出问题。

这个场景我每天都在重复,直到用了 Hunk 才意识到:终端里的 diff 工具还活在上个时代。

Git 自带的 git diff 是纯文本输出,没有任何交互能力。你不能跳到下一个修改的文件、不能折叠没改的上下文、不能给某行加备注。当你 review 的是人写的代码时,这还凑合——你能理解同事故意改了啥。但 Agent 改代码的逻辑跟人完全不同:它可能同时改了 10 个文件、重写了一个函数、在第 3 个文件里加了一行配置来配合第 7 个文件的改动。你用传统 diff 根本看不出这种关联。

Hunk 到底解决什么问题

Hunk 是一个终端交互式 Diff 查看器,专门为 review Agent 生成的代码变更而生。它不是 git diff 的美化版,而是从"Agent 写代码"这个场景出发,重新设计了 diff 的呈现方式。

核心能力有三个:

1. 多文件 review 流 + 侧边栏导航

打开 hunk diff,左侧是文件列表,右侧是 diff 内容。你可以用键盘或鼠标在文件之间跳转,不用像 git diff 那样滚动一大段才能看到下一个文件的修改。这个设计 lumen 也有,但 Hunk 多了一个关键功能——

2. 内联 Agent 注释

这是 Hunk 跟其他 diff 工具的本质区别。Agent 可以在 diff 的特定行旁边留下注释,解释"我为什么改这一行"。

想象一下:Agent 改了一个数据库查询的 WHERE 条件。在传统 diff 里你只能看到"这里从 A 变成了 B",但不知道为什么。有了 Agent 注释,那一行旁边会显示 Agent 的说明:"旧条件在分页时会跳过 offset,改为 BETWEEN 解决了 #42 issue。"

这不是事后复盘——它是 Agent 在 review 过程中实时告诉你的。

3. Session 控制:Agent 能操作你的 Review 界面

这是最让我意外的功能。Hunk 内置了一个本地 daemon,Agent 可以通过 hunk session 命令控制正在运行的 Hunk 窗口:

$ hunk session list              # 列出活跃的 review 会话

$ hunk session review --repo . --json  # Agent 检查当前 diff 结构

$ hunk session navigate --repo . --file src/app.tsx --hunk 2  # 跳到指定文件的第 2 个 hunk

$ hunk session comment add --repo . --file src/app.tsx --new-line 42 --summary "这里有潜在的 race condition"  # 在第 42 行加注释

实际工作流是这样的:你在终端 A 开着 Hunk 看 diff,同时在终端 B 跟 Agent 对话。Agent 通过 session 命令把你正在看的 Hunk 窗口导航到它想讨论的代码位置,然后在那里放一个注释。你看到注释,理解了 Agent 的意图,决定接受或拒绝。

这个设计把"review"从被动阅读变成了主动对话。

跟同赛道工具比,它在哪

终端 diff viewer 这个赛道里,主要选手是这几个:

difftastic(19K Star,Rust):它的卖点是"结构化 diff"——不是按行比较,而是理解代码的语法树,知道你改的是一个函数体而不是随机几行。但它没有交互 UI,输出到终端就是文本,不能导航、不能加注释。

delta(25K Star,Rust):本质是 git diff 的 pager 美化版。加了语法高亮、行号、侧边框,让 diff 好看一点。但它不改变 diff 的结构——你还是在一个扁平的文本流里滚动。

lumen(2.5K Star,Rust):跟 Hunk 最像的竞品。也是交互式 TUI diff viewer,有侧边栏、有鼠标支持。但 lumen 没有 Agent 注释和 session 控制——它只是给人看的 diff 工具,不是给 Agent 协作的。

diff-so-fancy(17K Star,Perl):最老的一个,纯粹美化 git diff 输出,没有交互能力。

Hunk 的定位很清楚:它是唯一一个从设计之初就考虑了"人+Agent 协作 review"的 diff 工具。difftastic 解决的是"理解代码结构",delta 解决的是"好看",lumen 解决的是"交互",Hunk 解决的是"Agent 和人怎么一起 review"。

技术实现:怎么做到的

Hunk 的技术栈挺有意思:

OpenTUI:自研的终端 UI 框架,也是 modem.dev(Hunk 的母公司)开源的项目。Hunk 的整个交互界面——侧边栏、diff 渲染、注释浮层——都跑在 OpenTUI 上。它还单独发布了 HunkDiffView 组件,你可以在自己的 OpenTUI 应用里嵌入同样的 diff 渲染器。

Pierre diffs:一个独立的 diff 解析库(npm 包 @pierre/diffs),负责把 Git diff 转换成结构化数据。Hunk 不是简单地解析 unified diff 文本,而是用专门的库来做语义级别的 diff 分析。

Session daemon:Hunk 启动时会注册一个本地 loopback daemon(默认端口 47657),hunk session 命令通过 HTTP 调用这个 daemon 来控制运行中的 TUI 窗口。这个设计让 Agent 可以在另一个终端(甚至另一个沙箱)里操控 review 界面。

多 VCS 支持:不只是 Git,还自动检测 Jujutsu(jj)和 Sapling 的 checkout,用各自的原生 revset 语法。这意味着如果你用 jj 或 Sapling 做版本管理,Hunk 也能无缝工作。

实际用起来什么感觉

我在一个实际项目里试了一下,整个 review 流程大概长这样:

我用 Claude Code 跑了一个重构任务——把一个 Express API 的错误处理从 try-catch 改成统一中间件。Agent 改了 8 个文件。

先开一个终端窗口:

$ hunk diff --watch

左侧文件列表自动刷新,右侧显示当前文件的 diff。我用方向键在文件之间跳转,每个 hunk 的修改一目了然。

然后在 Claude Code 的终端里,我让 Agent 加载 Hunk skill:

Load the Hunk skill and use it for this review. Run `hunk skill path` to get the skill path.

Agent 读取了 skill 文件,然后通过 hunk session 命令开始跟我互动。它先用 hunk session review --repo . --json 理解了 diff 的整体结构,然后把我的 Hunk 窗口导航到了它最想解释的改动——错误中间件的核心实现。在那行旁边,它放了一个注释,解释为什么选择用 Express 的错误中间件模式而不是独立的 error handler 函数。

说实话,这个体验比我自己盯着 git diff 猜 Agent 的意图好太多了。

不过也有不爽的地方

安装依赖偏重。Hunk 是 TypeScript 写的,需要 Node.js 18+。对一个终端工具来说,npm 全局安装还要拉一堆依赖,不如 Rust/Go 编译出的单二进制来得干净。Homebrew 安装倒是简单,但你得接受它在你机器上装一套 Node 运行时。

Session daemon 的稳定性。Issue #115 讨论了"如何让 Agent 的注释和人的注释互相可见"的问题,到现在还是 open 的。说明 Agent 和人之间的双向 review 对话还没有完全打通——Agent 能给你加注释,但你在 Hunk 里手动加的 c 键注释,Agent 目前看不到。

没有 Agent 以外的注释来源。如果你想接入 CI 的 lint 结果或者 PR review 的 comment,目前没有现成的方案。Agent 注释是硬编码的 Agent→Hunk 通道,不是通用的注释协议。

谁应该用这个

Hunk 不是所有人都需要的工具。如果你用 Cursor 或 Windsurf 这种 IDE 内嵌 Agent,它们自带 diff view,你不需要 Hunk。

但如果你是终端党——用 Claude Code、Aider、Codex CLI、或者 oh-my-pi——然后你发现自己每天花大量时间在终端里 review Agent 的改动,Hunk 会省你很多时间。

特别是这些场景:

你让 Agent 做一个跨 5+ 文件的重构,你需要快速理解全局改动而不是逐行审阅。

你在跑多个 Agent(用 Claude Squad、Orca、Emdash 之类的工具),每个 Agent 都在改不同的代码,你需要一个统一的 review 入口。

你想让 Agent 在 review 过程中跟你"对话",而不是改完就跑。

安装和快速上手

# npm 全局安装

npm i -g hunkdiff

# 或者 Homebrew(macOS/Linux)

brew install hunk

# 在任意 Git 仓库里试试

cd your-project

hunk diff             # review 工作区改动

hunk diff --watch       # 自动刷新模式

hunk show              # review 最新 commit

hunk show HEAD~3        # review 3 个 commit 前的改动

配置文件在 ~/.config/hunk/config.toml,可以设置主题、布局、是否显示行号等。支持自定义主题继承内置主题。

如果你日常用 git diff,可以直接把 Hunk 设为 Git 的默认 pager:

git config --global core.pager "hunk pager"

这样你敲 git diffgit show 会自动打开 Hunk。

最后说一句

2026 年了,Coding Agent 已经能写出让大部分工程师满意的代码。但"review Agent 的代码"这件事,工具链还非常原始。我们花了几千小时优化 Agent 的编码能力,却几乎没花时间优化人类 review Agent 输出的体验。

Hunk 是第一个认真对待这个问题的工具。它不完美——TypeScript 栈有点重、Agent 双向通信还没打通、跟 CI/CD 的集成还是空白。但它选对了方向:review 不该是 Agent 改完之后的被动环节,而应该是人和 Agent 协作的一部分。

如果你每天在终端里跟 Agent 打交道,花 5 分钟装一个试试。大概率你会回不去了。