init
This commit is contained in:
@@ -0,0 +1,279 @@
|
||||
# 📋 Добавлен контекст 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!** 📊
|
||||
|
||||
Reference in New Issue
Block a user