code-review-agent/docs/PR_CONTEXT_FEATURE.md

9.2 KiB
Raw Blame History

📋 Добавлен контекст PR в анализ

Что добавлено

Описание PR теперь передается агенту!

Агент теперь получает полный контекст PR:

  • 📝 Название PR
  • 📄 Описание PR (body)
  • 👤 Автор
  • 🔀 Ветки (source → target)

🎯 Зачем это нужно?

Проверка соответствия кода описанию

Теперь агент может найти логические ошибки:

Пример 1: Несоответствие описанию

PR: "Добавление функционала редактирования аватара"

Изменения в коде:
+ 'Content-Type': 'shmapplication/json'

Агент обнаружит:
❌ WARNING - Изменение не связано с редактированием аватара. 
В описании PR указано добавление функционала аватара, 
но код меняет Content-Type. Это не соответствует описанию.

Пример 2: Удаление функционала

PR: "Добавление валидации email"

Изменения в коде:
- if (validateEmail(email)) {
-   return true;
- }

Агент обнаружит:
❌ ERROR - Удаляется валидация email, но в описании PR 
указано "Добавление валидации". Это противоречие!

🔍 Как это работает

1. Получение информации о PR

# backend/app/agents/reviewer.py
async def fetch_pr_info(self, state: ReviewState):
    pr_info = await git_service.get_pull_request(state["pr_number"])
    
    # Логируем информацию
    print("📋 ИНФОРМАЦИЯ О PR")
    print(f"Название: {pr_info.title}")
    print(f"Описание: {pr_info.description}")
    
    # Сохраняем в state
    state["pr_info"] = {
        "title": pr_info.title,
        "description": pr_info.description,
        ...
    }

2. Передача контекста в промпт

# backend/app/agents/tools.py
async def analyze_diff(..., pr_title: str, pr_description: str):
    pr_context = f"""
**КОНТЕКСТ PR:**
Название: {pr_title}
Описание: {pr_description}

ОБЯЗАТЕЛЬНО проверь: соответствует ли код описанию PR!
"""
    
    prompt = DIFF_REVIEW_PROMPT.format(
        file_path=file_path,
        diff=diff,
        pr_context=pr_context  # <-- добавили контекст
    )

3. AI анализирует с учетом контекста

Промпт теперь содержит:

Ты СТРОГИЙ code reviewer.

**КОНТЕКСТ PR:**
Название: Добавление функционала редактирования аватара
Описание: Реализована возможность загрузки и изменения 
          пользовательского аватара.

ОБЯЗАТЕЛЬНО проверь: соответствует ли код описанию PR!

Анализируй изменения в файле:
...

📊 Логирование

В терминале backend теперь видно:

📋📋📋📋📋 ИНФОРМАЦИЯ О PR 📋📋📋📋📋

📝 Название: Добавление функционала редактирования аватара
👤 Автор: primakov
🔀 Ветки: feature/avatar → main
📄 Описание:
--------------------------------------------------------------------------------
Реализована возможность:
- Загрузки нового аватара
- Предпросмотра перед сохранением
- Удаления текущего аватара
--------------------------------------------------------------------------------
📋📋📋📋📋📋📋📋📋📋📋📋📋📋📋📋📋📋

...

================================================================================
🔍 АНАЛИЗ ФАЙЛА: src/pages/SearchCharacterPage.tsx
================================================================================

📋 КОНТЕКСТ PR:
--------------------------------------------------------------------------------
Название: Добавление функционала редактирования аватара
Описание: Реализована возможность загрузки и изменения аватара...
--------------------------------------------------------------------------------

📝 DIFF:
+ 'Content-Type': 'shmapplication/json'

🤖 ОТВЕТ AI:
{
  "comments": [
    {
      "line": 58,
      "severity": "ERROR",
      "message": "Опечатка в Content-Type: 'shmapplication/json'"
    },
    {
      "line": 58,
      "severity": "WARNING",
      "message": "Изменение не связано с редактированием аватара"
    }
  ]
}

📋 Обновленный промпт

Добавлен новый тип проверки:

❌ НЕСООТВЕТСТВИЕ ОПИСАНИЮ PR:
Описание PR: "Добавление функционала редактирования аватара"
Код: меняет Content-Type на 'shmapplication/json'
// ОШИБКА! не связано с аватарами

ОБЯЗАТЕЛЬНО ПРОВЕРЬ:
1. СООТВЕТСТВИЕ ОПИСАНИЮ PR ⭐ НОВОЕ!
   - делает ли код то что написано в описании?
   - не удаляется ли то что должно добавляться?
   - не добавляется ли то что не упомянуто?
2. Все строки в кавычках - нет ли опечаток?
3. Все скобки - все ли закрыты?
4. Все JSX элементы - правильно ли?
5. React key - на правильном элементе?

🎯 Примеры использования

Сценарий 1: PR с описанием

PR:

Название: Исправление бага с поиском
Описание: Исправлена проблема когда поиск не работал с пустыми строками

Код:

+ if (search === '') {
+   return;
+ }

AI: Соответствует описанию - добавлена проверка на пустую строку


Сценарий 2: PR без описания

PR:

Название: Рефакторинг
Описание: (пусто)

Код:

+ 'Content-Type': 'shmapplication/json'

AI: ERROR - Опечатка в Content-Type (не проверяет соответствие описанию, т.к. описания нет)


Сценарий 3: Противоречие

PR:

Название: Добавление логирования
Описание: Добавлены логи для отладки

Код:

- console.log('debug:', data);
- console.error('error:', err);

AI: WARNING - Удаляются логи, но в описании PR указано "Добавление логирования". Это противоречие!

Преимущества

  1. Логические ошибки - находит несоответствия между кодом и описанием
  2. Контекст - AI понимает что ДОЛЖНО быть сделано
  3. Качество PR - мотивирует писать хорошие описания
  4. Отладка - видно весь контекст в логах

🧪 Как проверить

  1. Создайте PR с описанием:

    Название: Добавление валидации формы
    Описание: Добавлена проверка email и телефона
    
  2. Сделайте изменение НЕ связанное с валидацией:

    + const newColor = 'blue';
    
  3. Запустите ревью

  4. Смотрите логи backend - видите контекст PR?

  5. Проверьте комментарии - AI должна заметить несоответствие!

📝 Измененные файлы

  • backend/app/agents/reviewer.py - получение и логирование PR info
  • backend/app/agents/tools.py - передача PR context в промпт
  • backend/app/agents/prompts.py - добавлен PR context в промпт
  • backend/app/services/gitea.py - уже получал description (не изменено)
  • backend/app/services/base.py - PRInfo уже содержал description

🚀 Готово!

Теперь агент понимает контекст PR и может:

  • Проверять соответствие кода описанию
  • Находить логические противоречия
  • Давать более осмысленные комментарии

Все логи видны в терминале backend! 📊