Hunk — терминальный дифф-вьюер для ревью кода от AI-агентов

· 2 мин чтения
code-review diff git cli ai-agents
📂 Исходный код на GitHub

Hunk — ревью-first терминальный дифф-вьюер для изменений, созданных AI-агентами. Построен на OpenTUI и Pierre diffs: мультифайловое ревью с сайдбаром, инлайн-заметки агента, split/unified-режимы, watch-режим, интеграция с Git, Jujutsu и Sapling, экспериментальный API расширений на TypeScript.

Hunk — терминальный дифф-вьюер для ревью кода от AI-агентов

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 — агент может работать с живой сессией ревью. Схема такая:

  1. Открываете Hunk в соседнем терминале: hunk diff или hunk show.
  2. Просите агента подключить skill-файл, путь к которому возвращает hunk skill path.
  3. Даёте агенту команду использовать 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