feat: Add review events persistence, version display, and auto-versioning system

This commit is contained in:
Primakov Alexandr Alexandrovich
2025-10-13 14:18:37 +03:00
parent cfba28f913
commit 2db1225618
56 changed files with 750 additions and 436 deletions
+279
View File
@@ -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!** 📊