В условиях интенсивной разработки, когда ежемесячно обрабатываются тысячи pull-запросов в более чем 100 репозиториях, ручное ревью кода превращается в узкое место, замедляющее выпуск обновлений. Требовалось решение, способное анализировать код, учитывая специфические паттерны и соглашения проекта, интегрироваться в существующие инструменты (Bitbucket и Jira), обучаться на основе предыдущих проверок и работать полностью внутри защищённого периметра.
Архитектурный выбор: от оценки к решению
При поиске подхода рассматривалось несколько вариантов. Готовые AI-инструменты для ревью кода хорошо справляются с общими проверками, но неспособны понимать контекст предметной области, например, специфику платежных систем на Haskell или внутренние соглашения команды. Прямая интеграция с API языковых моделей требовала бы самостоятельной реализации абстракции над разными провайдерами, управления памятью и интеграции инструментов, что создавало бы значительную дополнительную нагрузку.
Оптимальным решением стало использование NeuroLink — универсального TypeScript SDK для работы с AI, в сочетании с Model Context Protocol (MCP). Этот подход предоставил гибкость в выборе провайдеров AI вместе со стандартизированной интеграцией инструментов.
NeuroLink был выбран благодаря ключевым преимуществам:
- Единый API для работы с 13+ провайдерами AI, что позволило использовать Claude для сложного логического анализа и Gemini для экономичных массовых проверок.
- Поддержка MCP для бесшовной интеграции с Bitbucket и Jira.
- Встроенная система памяти диалогов для обучения на предпочтениях ревьюеров.
- Поддержка потоковой передачи ответов для отображения прогресса в реальном времени.
Базовая архитектура системы
Система, получившая название Yama, построена по следующей схеме:
- Bitbucket PR Webhook: При создании или обновлении pull-запроса в Bitbucket срабатывает вебхук.
- Yama API (Node.js): Центральный сервис, написанный на Node.js, принимает вебхук, обрабатывает запрос и управляет процессом ревью.
- NeuroLink SDK: SDK получает задачу от API, координирует выполнение AI-моделями и управляет контекстом.
- MCP-серверы (Bitbucket/Jira): Через Model Context Protocol NeuroLink получает доступ к данным из Bitbucket (код, история коммитов) и Jira (описания задач, статусы).
- Jira Issues (контекст): Информация из связанных задач Jira используется для обогащения контекста ревью.
Реализация конвейера анализа кода
Процесс начинается с инициализации NeuroLink и подключения MCP-серверов, которые предоставляют инструментам AI доступ к данным Bitbucket и Jira.
import { NeuroLink } from "@juspay/neurolink";
const neurolink = new NeuroLink({
conversationMemory: {
enabled: true,
redisConfig: {
host: process.env.REDIS_HOST,
port: 6379
}
},
mcpServers: [
{
name: "bitbucket-mcp",
url: process.env.BITBUCKET_MCP_URL
},
{
name: "jira-mcp",
url: process.env.JIRA_MCP_URL
}
]
});
Инициализация с включенной памятью диалогов (на базе Redis) позволяет системе сохранять историю взаимодействий и учиться на фидбэке ревьюеров, постепенно адаптируясь к стилю команды.
Следующим шагом является настройка самого процесса ревью. Создается специализированный агент, который использует подключенные инструменты (MCP-серверы) для сбора контекста — кода из пул-реквеста, связанных задач Jira, истории изменений.
const reviewAgent = neurolink.createAgent({
model: "claude-3-5-sonnet", // Для глубокого анализа
tools: ["bitbucket_mcp.get_pr_diff", "jira_mcp.get_issue_details"],
systemPrompt: `Ты — ассистент по код-ревью. Анализируй изменения в пул-реквесте...
Учитывай контекст задачи из Jira...`
});
Для обработки объемных изменений эффективно используется стратегия разделения диффа на логические части (чанки). Это позволяет анализировать крупные пул-реквесты, сохраняя полноту контекста для AI-модели и не превышая лимиты токенов. Агент последовательно анализирует каждый чанк, после чего формируется сводный отчет.
Интеграция в рабочий процесс разработчика
Итоговый отчет публикуется непосредственно в пул-реквест Bitbucket в виде комментария. Это обеспечивает привычный интерфейс для разработчиков и сохраняет всю дискуссию в одном месте. Комментарий от Yama структурирован: он содержит общую оценку, список выявленных проблем с классификацией по критичности (ошибка безопасности, баг, улучшение, вопрос), ссылки на соответствующие строки кода и конкретные предложения по исправлению.
Важной особенностью системы является интерактивность. Разработчики могут отвечать на комментарии AI, задавать уточняющие вопросы или отмечать предложения как нерелевантные. Эти взаимодействия сохраняются в памяти диалогов (Redis) и используются для тонкой настройки будущих ответов агента, делая его со временем более точным и релевантным для конкретной команды.
Такой подход позволяет значительно сократить время рутинной проверки кода, перенося фокус человеческих ревьюеров на сложные архитектурные решения и знание предметной области, в то время как AI надежно отслеживает соблюдение стандартов, потенциальные уязвимости и очевидные ошибки.