Hunk — терминальный дифф-вьюер для ревью кода от AI-агентов
📂 Исходный код на GitHubHunk — ревью-first терминальный дифф-вьюер для изменений, созданных AI-агентами. Построен на OpenTUI и Pierre diffs: мультифайловое ревью с сайдбаром, инлайн-заметки агента, split/unified-режимы, watch-режим, интеграция с Git, Jujutsu и Sapling, экспериментальный API расширений на TypeScript.
Hunk — терминальный дифф-вьюер для ревью кода от AI-агентов
Hunk — ревью-first терминальный дифф-вьюер для changeset'ов, созданных AI-агентами. Проект от команды Modem построен на OpenTUI и Pierre diffs, распространяется по лицензии MIT и собрал более 9 тысяч звёзд на GitHub.
Идея простая: пока агент пишет код, разработчику всё равно приходится читать его изменения. Простыня git diff для этого приспособлена плохо — Hunk вместо текста открывает полноценный интерактивный интерфейс ревью.
Что умеет
- мультифайловый поток ревью с навигацией через сайдбар;
- инлайн-заметки AI и агента прямо рядом с кодом;
- split-, unified- и адаптивный auto-режимы компоновки;
- watch-режим с автоперезагрузкой файловых и Git-ревью;
- управление с клавиатуры и мыши, режим пейджера и поддержка Git difftool.
Установка
На macOS и Linux способ по умолчанию — standalone-бинарник в ~/.hunk с проверкой checksum релиза:
curl -fsSL https://hunk.dev/install.sh | sh
Альтернативные варианты:
npm i -g hunkdiff # macOS, Linux, Windows; нужен Node.js 22+
brew install hunk # macOS или Linux
mise use -g hunk # macOS, Linux, Windows
Начиная с версии 0.20 обновление делается штатной командой hunk update (или hunk update --check, если нужно только проверить наличие новой версии).
Базовые команды
Hunk зеркалит diff-команды Git, но открывает changeset в ревью-интерфейсе:
hunk diff # изменения рабочей копии, включая untracked-файлы
hunk diff --watch # автоперезагрузка при изменении рабочего дерева
hunk show # последний коммит
hunk show HEAD~1 # более ранний коммит
hunk log # история коммитов в терминале
hunk diff --files before.ts after.ts # сравнить два файла напрямую
git diff --no-color | hunk patch - # патч из stdin
hunk log — интерактивный браузер истории: коммиты группируются по дням, есть Graph view с топологическими линиями, а по клавише v можно выделить диапазон коммитов и открыть кумулятивное изменение по всему диапазону. При пайпе или редиректе вывод автоматически становится статическим.
Интеграция с агентами
Главная фишка Hunk — агент может работать с живой сессией ревью. Схема такая:
- Открываете Hunk в соседнем терминале:
hunk diffилиhunk show. - Просите агента подключить skill-файл, путь к которому возвращает
hunk skill path. - Даёте агенту команду использовать skill против живой сессии.
Универсальный промпт из документации:
Load the Hunk skill and use it for this review. Run `hunk skill path` to get the skill path.
В результате агент оставляет аннотации прямо внутри интерфейса ревью — рядом с кодом, который сам же и написал. Полный воркфлоу с живой сессией и флагом --agent-context описан в руководстве по работе с агентами.
Git, Jujutsu и Sapling
Hunk можно назначить пейджером, чтобы git diff и git show открывались сразу в нём:
git config --global core.pager "hunk pager"
Jujutsu и Sapling подхватываются автоматически: внутри их воркспейсов hunk diff [revset] и hunk show [revset] работают с нативными revsets, а hunk log --vcs jj читает историю jj даже в non-colocated воркспейсе. Пейджерная интеграция настраивается в конфигах jj (секция [ui]) и Sapling (секция [pager]). Тип VCS можно задать и вручную: vcs = "git" | "jj" | "sl".
Конфигурация
Настройки хранятся в ~/.config/hunk/config.toml или в .hunk/config.toml внутри репозитория:
theme = "github-dark-default"
mode = "auto" # auto, split, unified
vcs = "git"
watch = false
line_numbers = true
tab_width = 4
wrap_lines = false
sidebar = "auto"
agent_notes = false
Доступны встроенные и кастомные темы, а каждый шорткат — именованная команда, которую можно переназначить через таблицу [keybindings] в конфиге.
Расширения
Экспериментальный API позволяет писать расширения на чистом TypeScript: Hunk грузит их из ~/.config/hunk/extensions/ и .hunk/extensions/. Расширение может добавлять CLI-воркфлоу, темы, бэкенды VCS, переписывать changeset до ревью (например, схлопывать lock-файлы) и даже заменять сайдбар собственным React-компонентом:
// ~/.config/hunk/extensions/collapse-lockfiles.ts
import type { HunkExtensionAPI } from "hunkdiff/extension";
export default function (hunk: HunkExtensionAPI) {
hunk.transformChangeset((changeset, ctx) => {
const files = changeset.files.filter((file) => !file.path.endsWith(".lock"));
ctx.notify(`Collapsed ${changeset.files.length - files.length} lockfiles`);
return { ...changeset, files };
});
}
Установка расширений — одной командой (hunk extension install acme/hunk-word-diff@v1.2.0), сообщество помечает их темой hunk-extension на GitHub. Кроме того, пакет hunkdiff/opentui экспортирует компонент HunkDiffView — тот же рендерер диффов можно встроить в своё OpenTUI-приложение.
Как Hunk выглядит на фоне аналогов
| Возможность | hunk | lumen | difftastic | delta | diff-so-fancy |
|---|---|---|---|---|---|
| Интерактивный ревью-UI | ✅ | ✅ | ❌ | ❌ | ❌ |
| Мультифайловый поток + сайдбар | ✅ | ✅ | ❌ | ❌ | ❌ |
| Инлайн-заметки агента/AI | ✅ | ❌ | ❌ | ❌ | ❌ |
| Адаптивный split/unified | ✅ | ❌ | ❌ | ❌ | ❌ |
| Мышь во вьювере | ✅ | ✅ | ❌ | ❌ | ❌ |
| Подсветка синтаксиса | ✅ | ✅ | ✅ | ✅ | ❌ |
| Структурные диффы | ❌ | ❌ | ✅ | ❌ | ❌ |
| Режим пейджера | ✅ | ❌ | ✅ | ✅ | ✅ |
Авторы позиционируют Hunk как инструмент именно для интерактивного ревью полного changeset — структурных диффов в стиле difftastic он не делает.
Выводы
Hunk закрывает слабое место agentic-разработки: не генерацию кода, а его проверку. Три причины попробовать:
- ревью changeset'а целиком в одном интерактивном экране вместо простыни
git diff; - живая связь с агентом — он комментирует свой код прямо в интерфейсе ревью;
- привычная интеграция: пейджер для Git/Jujutsu/Sapling, watch-режим, расширения на TypeScript.
Ссылка на проект: https://github.com/modem-dev/hunk
Источник: https://github.com/modem-dev/hunk