280 lines
9.2 KiB
Markdown
280 lines
9.2 KiB
Markdown
# 📋 Добавлен контекст 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!** 📊
|
||
|