CLI в любом репозитории
reviewgate review читает те же .reviewgate/config.yml и пресеты, что бот, и гоняет тот же двухпроходный судья. Один файл без Node и Docker — шесть платформ, включая Windows и Alpine.
Не generic-проверки, а соблюдение конвенций конкретной команды — на её стеке, с её правилами. В двух точках: у агента в редакторе, пока код пишется, и на MR/PR, когда его пора принимать. Вот что умеет движок.
Код всё чаще пишут агенты, и ловить их ошибки только на MR/PR поздно — правки возвращаются через полный круг. Поэтому те же правила команды и тот же судья работают прямо в цикле агента. А бот на MR/PR остаётся независимым гейтом: агент не может сам себя принять, и в точке change control остаётся аудит-трейл.
reviewgate review читает те же .reviewgate/config.yml и пресеты, что бот, и гоняет тот же двухпроходный судья. Один файл без Node и Docker — шесть платформ, включая Windows и Alpine.
Агент не отправит изменения с блокирующими находками. Гейт стоит именно на push, а не на каждом шаге: замер показал, что судья добавляет 35–47% стоимости прогона, поэтому экономить надо на частоте вызова.
Два инструмента: проверить изменения и узнать стандарты команды ДО написания кода, а не из ревью после. Работает в MCP-совместимых клиентах; у нас прогнано на Claude Code.
Ни Node, ни Docker на машине разработчика не нужно, а ключ провайдера берётся из окружения процесса или из вашего личного конфига CLI — как поставить и подключить →
Замечания привязаны к конкретным строкам диффа — GitLab discussions, GitHub review comments — как от живого ревьюера.
Один сводный комментарий с находками, сгруппированными по критичности, и вердиктом по severity gate.
Бот публикует check run в GitHub и commit status в GitLab. При «pipeline must succeed» или обязательной проверке это блокирует merge — гейт с реальной силой.
Главная боль AI-ревью — шум и повторы. Движок бьёт по ней тремя механизмами.
Дешёвая модель находит, сильная — судит каждую находку по реальному коду (полные файлы и импортируемые соседи) и стандартам команды. Контракт судьи жёсткий: новых находок не ищет, severity может только понижать, при сомнении обязан отбросить — в MR/PR попадает меньше false positives. Включается одной ролью в llm.judges.
Ре-пуш ревьюит только изменившиеся файлы, не повторяет открытые находки и уважает Resolved-треды — одна живая сводка вместо лавины дублей. Экономит и токены, и нервы ревьюеров.
Опционально бот берёт изменённые файлы целиком, их импортируемых соседей и версии стека из манифестов — ловит проблемы за пределами ханка, не домысливая несуществующее. Жёсткий анти-галлюцинационный рейл остаётся.
Для однозначных проблем бот прикладывает предложение прямо в треде: GitLab и GitHub показывают кнопку «Применить» — правка ложится в ветку одним кликом, без копипасты. Включая многострочные правки — до 20 строк за раз. А при включённом судье (llm.judges) сильная модель сперва проверяет сам фикс по коду — и его диапазон, — чтобы в один клик применялось только то, что действительно чинит. Обе опции включаются в конфиге.
Как включить →🔴 web-api-di-tokens · auth.ts:42
Direct localStorage access breaks SSR.
- localStorage.setItem('token', v)
+ this.storage.set('token', v)
[ ✓ Apply suggestion ]Разработчик отвечает на замечание вопросом — и бот поясняет в том же треде, обычно за минуту-другую, опираясь на код и стандарты команды из вашего конфига. Ответ приходит сам: не нужно запускать джобу в CI или звать бота командой. На «поправил» и «ок, спасибо» бот не шумит в ответ, а в одном треде даёт по умолчанию не больше трёх ответов. Если возражение справедливо, бот прямо это признаёт, а предложение коллеги может поддержать — со ссылкой на правило команды. Закрывает тред всегда человек. По @упоминанию бота можно позвать и в чужой тред.
Как включить →🟠 magic-values · recently-viewed.ts:52
the id is concatenated with a «magic»
prefix 4200000 before it goes into the
shared list — the other write path stores
a clean id: one list, two formats.
├ author: that is intended — items from
│ the external catalogue carry a
│ prefixed id. isn't this a false
│ positive?
│
├ lead: @author, let's move the prefix
│ into a constant anyway
│
└ bot: Not a false positive: a deliberate
prefix does not remove the two id
formats living in one list. I back
@lead: by your magic-values rule
the prefix belongs in a constant and
the encoding in a single helper.В сводку можно добавить цену прогона на вашем ключе: токены и деньги — по вашему прайсу, в вашей валюте. И свёрнутый блок диагностики: какой контекст видела модель, какие вызовы шли и, главное, решения судьи с причинами — включая отброшенные находки. Почему судья снял находку — видно прямо в MR/PR, без доступа к серверу бота и логам. Кода в блоке нет, только метаданные. Обе опции — по флагу в конфиге.
⚙️ This review: 46.2K tokens in · 3.8K out · ≈ $0.21 🔬 Run diagnostics Model context: diff: 14 files · environment: ✓ Calls: · generator sonnet — 41.3K→2.9K tokens · 38s · findings: 5 · judge opus — 96K→1.1K tokens · 64s · dropped: 1 Judge dropped / lowered: ❌ cart.service.ts:42 error-handling — «catchError is already one line above»
11 языковых ядер и десятки фреймворков с первого дня. Ядро знает идиомы и ловушки языка, фреймворк-слой — специфику стека. Ядро языконезависимо — без пресета работает на любом языке через ваши правила.
Строгие типы вместо any, гонки в async/await, утечки подписок, граница доверия к вводу.
Типизация и контракты, блокировки в async, ресурсы через context manager, инъекции.
Обработка каждого err, отмена через context, гонки и утечки горутин, defer для ресурсов.
Optional вместо null, потокобезопасность, ресурсы через try-with-resources, валидация границ.
Nullable-ссылки, async/await без дедлоков, IDisposable/using, аллокации в LINQ.
Строгие сравнения вместо ==, типизация и readonly, SQL-инъекции, небезопасная десериализация.
Null-safety, структурная конкуррентность корутин, исчерпание when, утечки CoroutineScope.
Риски метапрограммирования, N+1 и блокировки, обработка исключений, инъекции.
Заимствования и lifetimes, отказ от unwrap/panic, ошибки через Result, unsafe под лупой.
Опционалы без force-unwrap, retain-циклы и [weak self], async/await, value vs reference.
Null safety, dispose и async gap, ошибки Future/Stream, лишние перестройки виджетов.
Правила команды накладываются поверх любого пресета, а у части пресетов есть свои опции. Полный список и опции — в справочнике конфигурации →
Стандарты живут в .reviewgate/config.yml рядом с кодом и версионируются через MR/PR. Вы описываете соглашения по-русски — модель применяет их к диффу. Это и есть отличие от линтера. Правила видят и метаданные MR/PR: правило «нет описания — попроси {mr:author} добавить» подставит в замечание @автора — и платформа пришлёт ему уведомление. А через review_prompt задаётся и весь гайдлайн ревью — дополнить дефолтный (extend) или заменить целиком (replace).
rules:
- id: commit-prefix
description: "Commits carry TASK-<number>"
severity: critical
- id: no-any
description: "No any, except in *.spec.ts"
severity: major
- id: mr-description
description: "No PR description —
ask {mr:author} to add one"
severity: minor
severity_gate: offОблако Anthropic, любой OpenAI-совместимый endpoint (DeepSeek, OpenRouter, Yandex AI Studio, свой vLLM) или локальная модель через Ollama — тогда наружу не уходит вообще ничего. Код не покидает ваш контур.
Поднимите бота в своём контуре и откройте тестовый MR/PR.