С появлением автономных кодинг-агентов вроде Claude Code, Cursor и Aider привычный ритм разработки изменился: нейросети за пару минут переписывают десятки файлов, меняют сигнатуры функций и перекраивают целые модули. Но как только дело доходит до проверки того, что именно наворотил агент, разработчик упирается в глухую стену.
Стандартный git diff в терминале превращается в бесконечную кашу из зеленых и красных строк. Цвета сливаются, длинные строки уродливо ломаются по ширине консоли, а сопоставить код «до» и «после» бок о бок практически невозможно. Самое естественное желание в этот момент — запушить ветку на GitHub, открыть черновой Pull Request и спокойно посмотреть изменения в аккуратном веб-интерфейсе.
Но тут же возникает серьезный конфликт безопасности и здравого смысла. Выкатывать сырой, возможно сломанный или содержащий приватные токены код на внешние облачные сервера компании попросту рискованно. Да и плодить десятки мусорных коммитов в удаленном репозитории только ради визуализации — сомнительное удовольствие. Разработчик под ником yoshiko-pg предложил изящное инженерное решение этой боли, опубликовав открытую утилиту yoshiko-pg/difit. Это легковесный локальный инструмент, который одной командой разворачивает на твоем компьютере полноценный веб-интерфейс код-ревью в стиле GitHub, не отправляя наружу ни единого сетевого пакета.
Под капотом: архитектура локального инспектора
Меня в difit сразу подкупила чистота технической реализации. Вместо попыток упаковать проект в неповоротливый Electron на полгигабайта памяти автор собрал компактный тандем из Node.js и легковесного одностраничного приложения.
Вся связка запускается через утилиту Commander.js, которая валидирует аргументы командной строки и поднимает локальный HTTP-сервер на базе Express. Сервер привязывается исключительно к локальному интерфейсу 127.0.0.1 на случайном свободном порту (или порту, заданном через ключ --port). Для извлечения данных из Git инструмент использует проверенную библиотеку simple-git, вызывающую бинарник git в контексте твоего репозитория.
Клиентская часть собрана на React 18 с помощью Vite, а визуальный стиль практически до пикселя воспроизводит темную тему GitHub Dark Mode на базе Tailwind CSS v4. За подсветку синтаксиса отвечает легковесный движок Prism.js с динамической подгрузкой грамматик: независимо от того, правит ли твой агент TypeScript, Rust, Go, Python, C++, SQL или шаблоны Terraform, строки подсвечиваются моментально и без задержек.
# Мгновенный запуск инспекции всех незакоммиченных изменений (индекс + рабочий каталог)
npx difit .
# Просмотр только проиндексированных файлов, готовых к коммиту
npx difit staged
# Сравнение текущей рабочей ветки с целевой веткой main
npx difit main...HEAD
# Проверка конкретного коммита по его хэшу
npx difit 7a3b1c9
При запуске утилита автоматически открывает дефолтный браузер. Ты получаешь знакомое двухколоночное дерево файлов слева и центральную область с переключением между режимами Split (бок о бок) и Unified (построчно), сворачиванием просмотренных файлов и подсчетом добавленных и удаленных строк.
Мостик к языковым моделям: от комментариев к промптам
Однако если бы difit был просто еще одним локальным средством для просмотра диффов, он вряд ли заслуживал бы столь пристального внимания. Настоящая суперсила утилиты раскрывается в том, как она встраивается в рабочий цикл взаимодействия с искусственным интеллектом.
Представь типичный сценарий: агент написал реализацию метода, но ошибся в обработке краевого случая или забыл закрыть соединение с базой данных. В терминале тебе приходится вручную копировать имя файла, вспоминать точные номера строк и формулировать контекст для чата с моделью. В difit этот процесс доведен до автоматизма.
Наведя курсор на любую строку диффа (как в старой, так и в новой версии), ты можешь нажать кнопку добавления комментария или выделить мышью целый диапазон строк. В появившемся поле ввода ты пишешь замечание на обычном человеческом языке — например: «Здесь нужно добавить проверку на nil перед разыменованием указателя и вернуть ошибку ErrNotFound».
Рядом с кнопкой сохранения комментария в difit предусмотрены две ключевые функции:
- Copy Prompt: копирует в буфер обмена структурированный снимок конкретного замечания, где автоматически прописан относительный путь к файлу, диапазон строк и твой комментарий;
- Copy All Prompt: собирает абсолютно все замечания, оставленные в текущей сессии ревью по разным файлам, и формирует единый структурированный перечень правок для передачи в Claude Code, Cursor или Aider.
{
"task": "review_feedback",
"files": [
{
"path": "internal/service/user.go",
"lines": "L45-L52",
"issue": "Отсутствует проверка контекста на истечение таймаута перед вызовом внешнего API",
"fix": "Добавить select с ctx.Done() и возвратом ctx.Err()"
},
{
"path": "internal/repository/postgres.go",
"lines": "L118-L124",
"issue": "Потенциальная утечка соединений в пуле: rows.Close() должен вызываться через defer",
"fix": "Обернуть закрытие выборки в defer rows.Close() сразу после проверки err"
}
]
}
Все оставленные комментарии difit бережно сохраняет в локальном хранилище браузера (localStorage), привязывая их к хэшу текущего коммита или имени ветки. Даже если ты случайно закроешь вкладку браузера или перезапустишь сервер терминала, твои наработки и замечания не пропадут.
Автоматизация через Agent Skills и конвейеры CLI
Еще одна любопытная инженерная грань difit — возможность превратить его в автономный навык (Agent Skill) для самих ИИ-ассистентов. Поддерживается спецификация открытых навыков, благодаря чему агент может самостоятельно инициализировать сессию ревью и приглашать человека к интерактивной проверке.
# Подключение навыков difit в рабочее окружение кодинг-агента
npx skills add yoshiko-pg/difit
После добавления навыка агент получает доступ к двум программным манифестам: difit и difit-review. Когда модель завершает масштабный рефакторинг, она может не просто вывести сухой отчет в терминал, а вызвать команду запуска difit в фоновом режиме и отправить разработчику ссылку на локальный дашборд. Человек размечает спорные места, нажимает «Copy All Prompt», вставляет результат обратно в диалог, и агент приступает к исправлению замечаний во второй итерации.
Такой подход отлично дополняет многоагентные системы управления рабочими сессиями вроде утилиты codeg, о которой мы рассказывали ранее: пока codeg изолирует консоли параллельных агентов, difit берет на себя роль единого экрана верификации кода.
Более того, утилита поддерживает работу со стандартным потоком ввода (stdin). Это позволяет использовать difit в любых Unix-пайплайнах:
# Инспекция произвольного патча через стандартный поток ввода
git diff --cached | npx difit -
# Сравнение двух произвольных файлов на диске через системную утилиту diff
diff -u old_config.yaml new_config.yaml | npx difit
А если тебе все же требуется проинспектировать удаленный Pull Request коллеги на GitHub, флаг --pr <url> использует установленный в системе GitHub CLI (gh), скачивает патч через gh pr diff и подтягивает существующие треды обсуждений прямо в локальное окно.
Где границы применимости и о чем стоит помнить
Как у любого практичного инструмента, у difit есть свои архитектурные особенности, которые важно учитывать перед внедрением в повседневный воркфлоу.
Во-первых, инструмент спроектирован для репозиториев умеренного и среднего размера. Если твой кодинг-агент сгенерировал колоссальный дифф с изменением нескольких сотен тысяч строк (например, случайно затронул скомпилированные бандлы или сгенерированные файлы схемы GraphQL), первоначальный парсинг JSON-пейлоада на клиенте может вызвать кратковременное зависание вкладки браузера. Для таких сценариев в difit рекомендуется явно передавать маску путей — например, npx difit . -- "src/**/*.ts".
Во-вторых, помни об изоляции хранилища: поскольку замечания сохраняются в localStorage, они привязаны к конкретному браузеру на твоей машине. Поделиться сессией ревью с коллегой по локальной сети без ручного экспорта промпта не получится, так как сервер слушает только петлевой адрес 127.0.0.1 ради безопасности твоих исходников.
В сухом остатке перед нами отличный пример прикладной утилиты новой волны: вместо перегруженных облачных комбайнов автор дал инженерам быстрый, автономный и безопасный инструмент, экономящий часы времени при работе с вездесущими кодинг-агентами.
