code-review-agent/REVIEW_FEATURES.md
Primakov Alexandr Alexandrovich 09cdd06307 init
2025-10-12 23:15:09 +03:00

8.9 KiB
Raw Blame History

Новые возможности ревью

🎯 Что добавлено

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: Незакрытая
│      |                                   │    скобка
└─────────────────────────────────────────┘

Преимущества

  1. Наглядность - видно ЧТО и ГДЕ не так
  2. Статус PR - сразу понятно можно ли мержить
  3. Markdown - красивое форматирование
  4. Inline - комментарии прямо на коде
  5. Чистота - <think> блоки удаляются

🧪 Как проверить

  1. Запустите ревью на любом PR
  2. Дождитесь завершения
  3. Откройте PR в Gitea
  4. Проверьте:
    • 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
  • Чистый вывод

Попробуйте! 🎉