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