Code Quality — детерминированный шлюз качества кода (quality gate) для ИИ-агентов программирования: Claude Code, Codex, Grok, pi, omp и OpenCode. Через Git-хуки и Stop-хуки он поможет понять, действительно ли агент починил код или просто «подогнал» тесты под зелёный цвет. Пригодится разработчикам и командам, которые отдают агентам реальную работу в репозитории. Инструмент открытый, распространяется под лицензией MIT.
Главная идея в том, что проверки не спрашивают мнения модели. Скрипт смотрит на дифф и либо пропускает его, либо возвращает код выхода 1 с отчётом, где указаны правило, файл и строка. Так агент не сможет уговорить шлюз, что «всё и так нормально». Если результат — GATE FAIL, у агента будет один раунд на исправление. Когда на изменённых строках не останется новых находок, он получит GATE PASS.
Прежде всего Code Quality поможет поймать подделку тестов. Классический трюк агента — пометить падающий тест как пропущенный через it.skip. Шлюз выдаст на это tamper/test-skipped. Удаление или ослабление утверждений тоже не пройдёт незамеченным: если toEqual вдруг превратился в toBeTruthy, в отчёте появится tamper/assertion-weakened. Заблокирована и правка baseline вместе с кодом (tamper/baseline-touched). А вот новый мок для тестируемого модуля попадёт в отчёт только как заметка, без блокировки. Таксономия подделок взята из исследования TRACE.
Для каждой изменённой функции действует одна и та же планка:
- цикломатическая сложность — не выше 10;
- метрика CRAP — не выше 30;
- покрытие добавленных строк — не ниже 80%;
- никаких новых циклических зависимостей и нового мёртвого кода;
- никаких секретов.
Покрытие считается именно по диффу. Допустим, агент добавил 50 строк, а тесты задевают 31 из них. Тогда отчёт покажет cov/diff: 62% при минимуме 80%. Старый технический долг работе не помешает. Командой --update-baseline создаётся снимок, который фиксирует существующие находки как долг. Провал вызовут только новые проблемы на изменённых строках, так что легаси-проект можно подключить без предварительного рефакторинга.
Команда check на реальном репозитории отрабатывает за 3–19 секунд. Полный прогон с тестами и покрытием запускается вручную. Поддерживаются 12 языков через адаптеры: TypeScript, Python, Go, Rust, Java, Kotlin, C#, Swift, PHP, Ruby, C/C++ и Dart. Сложность считается через lizard, покрытие берётся из lcov. Под капотом также работают jscpd, ast-grep, gitleaks, osv-scanner, dependency-cruiser, knip, ESLint и Radon. Вся настройка живёт в одном файле .quality.toml, сервер не нужен.
Отдельно продумана защита от обхода. В репозитории с .quality.toml по умолчанию заблокированы git commit --no-verify и -n, git push --no-verify, а также подмена core.hooksPath через git -c или git config. Если такая строгость мешает, защиту можно отключить параметром block_bypass = false в секции [hooks].
Есть и опциональный классификатор Jev на основе модели. Он включается через [review] jev = true и задаёт пять откалиброванных вопросов «да/нет» о новых фрагментах тестов. Например, проверяет, не тавтологическое ли свойство проверяет тест и не скрывает ли мок изменение. Jev только добавляет заметки и никогда не меняет код выхода, поэтому детерминированность шлюза сохраняется. Для него понадобится ключ TypeSafe (TYPESAFE_API_KEY) или OpenRouter (OPENROUTER_API_KEY) в переменных окружения.
В Claude Code и Codex плагин ставится двумя командами через маркетплейс и подгружает хуки Stop и PreToolUse. В Codex эти хуки нужно просмотреть и подтвердить через /hooks. Для pi, omp и OpenCode есть свои способы установки. С Grok сложнее: на версии 1.0.40 хуки плагина не вызывались, поэтому их придётся установить глобально отдельной командой. После перемещения или обновления плагина эту команду нужно запустить заново. Можно поставить только навык через npx skills add, но тогда хуков не будет. Каждый репозиторий подключается командой install-hooks, при этом существующие хуки выстраиваются в цепочку. Для Claude Code, Codex, pi и OpenCode V2 плагин можно включить всей команде, закоммитив настройки проекта.
Для работы шлюза и shell-хуков нужен Bun. В OpenCode есть нюанс: попытку обхода инструмент заблокирует заранее, а при красном шлюзе напишет сообщение в сессию. Заставить агента сделать ещё один ход по событию простоя он не сможет. В документации есть справочник всех правил с пометками, что блокирует, а что только отмечается, описание адаптеров, настройка .quality.toml и хуков, а также SKILL.md — справочник, который читает сам агент.