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!** 📊
 | ||
| 
 |