Во многих корпоративных продуктах нет встроенных инструментов LLM-ревью (по типу GitLab Duo), а использовать публичные облачные модели нельзя. При этом часто доступны только внутренние/закрытые LLM или прокси с OpenAI-совместимым API.
ai-review — небольшой CLI, который:
- берёт текущие изменения из git,
- отправляет диффы в LLM,
- печатает отчёт в консоль и/или сохраняет markdown-репорт,
- умеет кешировать ответы и чистить артефакты.
P.S. Изначально я делал этот проект для себя и личных задач. Буду развивать его постепенно, по мере времени и возможностей.
Нужен Rust toolchain (Cargo). Если Rust ещё не установлен, самый простой способ — rustup:
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | shПосле установки перезапустите терминал и проверьте:
rustc --version
cargo --versioncargo run -- init
cargo run -- run./install.sh
ai-review init
ai-review runПодсказка: полный список команд — ai-review --help (или cargo run -- --help).
cargo run -- init
cargo run -- run --debugcargo build --release
./target/release/ai-review --help
./target/release/ai-review runЕсли вы не хотите собирать из исходников, можно скачать готовый бинарник из GitHub Releases (например ai-review_x86_64-linux-gnu) и положить его в директорию из PATH.
Пример (bash):
mkdir -p "$HOME/.local/bin"
# 1) либо скачайте файл из релиза (замените URL на нужный asset)
curl -L -o "$HOME/.local/bin/ai-review" "<ASSET_URL>"
#
# ... либо если файл уже скачан, переместите и переименуйте его:
# mv ~/Downloads/ai-review_x86_64-linux-gnu "$HOME/.local/bin/ai-review"
# 2) сделайте исполняемым
chmod +x "$HOME/.local/bin/ai-review"
# 3) добавьте в PATH (если ещё не добавлено)
export PATH="$HOME/.local/bin:$PATH"
echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bashrc
# 4) проверка
ai-review --helpСкрипт соберёт бинарник в release и установит его так, чтобы можно было вызывать ai-review из терминала.
Что делает ./install.sh:
- проверяет наличие
cargo; если Rust не установлен — предложит поставить его черезrustupи затем продолжит - запускает
cargo build --release - копирует
target/release/ai-reviewв каталог для установки:- по умолчанию
/usr/local/bin(если доступно на запись), иначе~/.local/bin - либо в
<prefix>/bin, если указан--prefix <prefix>
- по умолчанию
- если каталог установки не в
PATH, подсказывает строку для добавления в профиль шелла (например~/.zshrc)
./install.shОпционально:
./install.sh --prefix "$HOME/.local" # установит в $HOME/.local/bin
./install.sh --force # без вопроса перезапишет существующий бинарникЕсли выбранный каталог не в PATH, скрипт выведет строку, которую нужно добавить в профиль шелла (например, ~/.zshrc).
./uninstall.shОпционально:
./uninstall.sh --prefix "$HOME/.local"
./uninstall.sh --forceПоддерживаются два конфига (они сливаются):
- глобальный:
~/.ai-review/config.json - локальный (в текущей директории проекта):
.ai-review/config.json
Если указаны оба, локальный перекрывает глобальный; вложенные объекты объединяются рекурсивно (как git config).
{
"llm": {
"api_url": "https://openrouter.ai/api/v1/chat/completions",
"api_key": "YOUR_API_KEY",
"model": "openrouter/auto"
}
}llm.api_url(string, required): OpenAI-совместимый endpoint chat-completions.llm.api_key(string, required): ключ доступа. Хранится в открытом виде в файле.llm.model(string, required): идентификатор модели (формат зависит от вашего провайдера/прокси).llm.max_retry_count(number, optional, default=3): сколько раз повторять запрос, если LLM вернул невалидный JSON.llm.candidate_reviews_per_diff(number, optional, default=2): сколько «кандидатных» ревью генерировать на один diff-файл перед дедупликацией.llm.extra_body(object, optional): дополнительные поля, которые будут добавлены в JSON body запроса к LLM на одном уровне сmodelиmessages(напримерtemperature,max_tokens).include(array[string], optional): список путей/папок, которые нужно проверять.exclude(array[string], optional): список путей/папок, которые нужно исключить.
Семантика фильтров:
- если указаны оба, сначала применяется
include, потом из результата выкидываетсяexclude - можно указывать и файлы, и директории; поддерживаются варианты
srcиsrc/
{
"include": ["src/", "README.md"],
"exclude": ["vendor/"],
"llm": {
"api_url": "https://openrouter.ai/api/v1/chat/completions",
"api_key": "YOUR_API_KEY",
"model": "openrouter/hunter-alpha",
"max_retry_count": 3,
"candidate_reviews_per_diff": 2,
"extra_body": {
"temperature": 0.2,
"max_tokens": 1200
}
}
}Подкоманда передаётся первым аргументом.
Если используете cargo run, синтаксис такой: cargo run -- <команда> [флаги].
-
ai-review init— создатьconfig.json(интерактивно).--global: записать в~/.ai-review/config.json(иначе —.ai-review/config.jsonв текущей директории).--yes: без вопросов записать шаблон (какeslint init --yes).
-
ai-review run— запустить ревью текущих изменений git.--json: вывести результат в JSON.--md: сохранить markdown-отчёт в.ai-review/reviews(и напечатать путь).--debug: подробные диагностические логи.--no-cache: не читать и не писать кеш ревью.
-
ai-review clean-cache— удалить кеш LLM-ответов:.ai-review/cache. -
ai-review clean-review— удалить сохранённые markdown-отчёты:.ai-review/reviews. -
ai-review clean— удалить и кеш, и отчёты.