8.9 KiB
8.9 KiB
✨ Новые возможности ревью
🎯 Что добавлено
1. Inline комментарии в PR 💬
Теперь комментарии публикуются на конкретных строках кода!
Было:
- Один общий комментарий в PR
Стало:
- Комментарии прямо на проблемных строках
- Видно в какой строке какого файла ошибка
- Удобнее исправлять
Пример в Gitea:
src/pages/search-character.tsx
Строка 58: 'Content-Type': 'shmapplication/json'
↑
[AI Comment] ❌ ERROR: Опечатка в строке: 'shmapplication/json'
должно быть 'application/json'
2. Автоматический статус PR 🚦
Агент сам устанавливает статус PR в зависимости от найденных проблем:
- ✅ APPROVE - Если проблем не найдено
- 💬 COMMENT - Если найдены только WARNING/INFO
- ❌ REQUEST_CHANGES - Если найдены ERROR (критичные проблемы)
В Gitea:
PR Status: Changes Requested ❌
AI Code Review: 4 критичные проблемы найдены
3. Markdown summary 📄
Красивый общий комментарий в markdown с:
Если есть проблемы:
## 🤖 AI Code Review
### 📊 Статистика
- **Всего проблем:** 4
- ❌ **Критичных:** 4
### 🔍 Детали
#### ❌ Критичные проблемы
- **src/pages/search-character.tsx:58**
Опечатка в строке: 'shmapplication/json' должно быть 'application/json'
- **src/pages/search-character.tsx:104**
Незакрытая скобка в JSX: {searchValueError && ( ... }
### 💡 Рекомендации
Пожалуйста, исправьте найденные проблемы перед мержем в main.
Детальные комментарии оставлены inline на соответствующих строках кода.
Если проблем нет:
## 🤖 AI Code Review
✅ **Отличная работа!** Серьезных проблем не обнаружено.
Код выглядит хорошо и соответствует стандартам.
4. Фильтрация <think> блоков 🧹
Если LLM создает блоки <think>...</think> (рассуждения), они автоматически удаляются:
Ответ LLM:
<think>
Сначала проверю синтаксис... затем логику...
</think>
Опечатка в Content-Type: 'shmapplication/json'
В Gitea видно:
Опечатка в Content-Type: 'shmapplication/json'
🔧 Как это работает
1. Генерация комментариев
# backend/app/agents/reviewer.py
# Для каждого файла AI генерирует комментарии
comments = await analyzer.analyze_diff(
file_path=file_path,
diff=patch,
pr_title=pr_info.get("title"),
pr_description=pr_info.get("description")
)
# Результат:
[
{
"file_path": "src/pages/search-character.tsx",
"line": 58,
"severity": "ERROR",
"message": "Опечатка: 'shmapplication/json'"
},
...
]
2. Генерация summary
# Создаем markdown summary
summary = await analyzer.generate_summary(
all_comments=db_comments,
pr_title=pr_info.get("title"),
pr_description=pr_info.get("description")
)
# summary - это markdown текст
3. Определение статуса
# Если есть ERROR - требуем изменения
has_errors = any(c.get('severity') == 'ERROR' for c in comments)
event = "REQUEST_CHANGES" if has_errors else "COMMENT"
# Если вообще проблем нет - approve
if not comments:
event = "APPROVE"
4. Публикация в Gitea
# Одним запросом:
# - Inline комментарии
# - Общий summary
# - Статус PR
await git_service.create_review(
pr_number=pr_number,
comments=formatted_comments, # Inline комментарии
body=summary, # Markdown summary
event=event # APPROVE/COMMENT/REQUEST_CHANGES
)
📊 Gitea API
Формат запроса:
POST /repos/{owner}/{repo}/pulls/{pr}/reviews
{
"body": "## 🤖 AI Code Review\n...",
"commit_id": "abc123...",
"event": "REQUEST_CHANGES",
"comments": [
{
"path": "src/pages/search-character.tsx",
"body": "**ERROR**: Опечатка...",
"new_position": 58
}
]
}
Поля:
- body - общий markdown комментарий
- commit_id - SHA последнего коммита
- event - статус (APPROVE/COMMENT/REQUEST_CHANGES)
- comments - массив inline комментариев
- path - путь к файлу
- body - текст комментария (markdown)
- new_position - номер строки
🎨 Что видит пользователь в Gitea
В списке PR:
PR #5: Добавление функционала аватара
Status: ❌ Changes Requested
Reviews: 🤖 AI Code Review (4 комментария)
В самом PR:
┌─────────────────────────────────────────┐
│ 🤖 AI Code Review │
│ Status: ❌ Changes Requested │
├─────────────────────────────────────────┤
│ │
│ ## 🤖 AI Code Review │
│ │
│ ### 📊 Статистика │
│ - Всего проблем: 4 │
│ - ❌ Критичных: 4 │
│ │
│ ### 🔍 Детали │
│ ... │
└─────────────────────────────────────────┘
Files Changed (1):
┌─────────────────────────────────────────┐
│ src/pages/search-character.tsx │
├─────────────────────────────────────────┤
│ 55 | search: searchValue │
│ 56 | }), │
│ 57 | headers: { │
│ 58 | 'Content-Type': 'shmap... │ 👈 [AI Comment]
│ │ │ ❌ ERROR: Опечатка
│ 59 | } │
│ ... | │
│ 104 | {searchValueError && ( │ 👈 [AI Comment]
│ | │ ❌ ERROR: Незакрытая
│ | │ скобка
└─────────────────────────────────────────┘
✅ Преимущества
- Наглядность - видно ЧТО и ГДЕ не так
- Статус PR - сразу понятно можно ли мержить
- Markdown - красивое форматирование
- Inline - комментарии прямо на коде
- Чистота -
<think>блоки удаляются
🧪 Как проверить
- Запустите ревью на любом PR
- Дождитесь завершения
- Откройте PR в Gitea
- Проверьте:
- ✅ Inline комментарии на строках
- ✅ Общий markdown summary
- ✅ Статус PR (Approved/Changes Requested)
- ✅ Красивое форматирование
📝 Измененные файлы
-
backend/app/agents/reviewer.py:- Генерация summary
- Определение статуса
- Фильтрация
<think>блоков
-
backend/app/agents/tools.py:- Метод
generate_summary()
- Метод
-
backend/app/services/gitea.py:- Параметр
eventвcreate_review() - Детальное логирование
- Параметр
🚀 Готово!
Теперь ревью полноценное:
- ✅ Inline комментарии
- ✅ Статус PR
- ✅ Markdown summary
- ✅ Чистый вывод
Попробуйте! 🎉