code-review-agent/docs/PR_CONTEXT_FEATURE.md

280 lines
9.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 📋 Добавлен контекст 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
```python
# 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. Передача контекста в промпт
```python
# 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:**
```
Название: Исправление бага с поиском
Описание: Исправлена проблема когда поиск не работал с пустыми строками
```
**Код:**
```diff
+ if (search === '') {
+ return;
+ }
```
**AI:**
✅ Соответствует описанию - добавлена проверка на пустую строку
---
### Сценарий 2: PR без описания
**PR:**
```
Название: Рефакторинг
Описание: (пусто)
```
**Код:**
```diff
+ 'Content-Type': 'shmapplication/json'
```
**AI:**
❌ ERROR - Опечатка в Content-Type
(не проверяет соответствие описанию, т.к. описания нет)
---
### Сценарий 3: Противоречие
**PR:**
```
Название: Добавление логирования
Описание: Добавлены логи для отладки
```
**Код:**
```diff
- console.log('debug:', data);
- console.error('error:', err);
```
**AI:**
❌ WARNING - Удаляются логи, но в описании PR указано
"Добавление логирования". Это противоречие!
## ✅ Преимущества
1. **Логические ошибки** - находит несоответствия между кодом и описанием
2. **Контекст** - AI понимает что ДОЛЖНО быть сделано
3. **Качество PR** - мотивирует писать хорошие описания
4. **Отладка** - видно весь контекст в логах
## 🧪 Как проверить
1. Создайте PR с описанием:
```
Название: Добавление валидации формы
Описание: Добавлена проверка email и телефона
```
2. Сделайте изменение НЕ связанное с валидацией:
```javascript
+ 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!** 📊