{/ Эта страница автоматически активируется из инструментов SKILL.md с помощью сайта/scripts/generate-skill-docs.py. Редактируйте исходный SKILL.md, а не эту страницу. /}

Обзор кода Github

Ревью PR: различия, инлайн-комментарии через gh или REST.

Метаданные навыки

Источник Встроенный (устанавливается по умолчанию)
Путь skills/github/github-code-review
Версия 1.1.0
Автор Агент Гермес
Лицензия Массачусетский технологический институт
Платформы Linux, MacOS, Windows
Теги GitHub, Code-Review, Pull-Requests, Git, Quality
Связанные навыки github-auth, github-pr-workflow

Справочник: полный SKILL.md:::информация

приведено полное определение навыков, которые Hermes загружает при активации этого навыка ниже. Это то, что агент видит в качестве инструкций, когда навыки активны.

Обзор кода GitHub

Выполните ревью кода локальных изменений перед отправкой или ревью открытого PR на GitHub. Большая часть этого навыка использует обычный git — разделение gh/curl имеет значение только для взаимодействий на уровне PR.

Предварительные требования

Настройка (для взаимодействий с PR)

if command -v gh &>/dev/null && gh auth status &>/dev/null; then
  AUTH="gh"
else
  AUTH="git"
  if [ -z "$GITHUB_TOKEN" ]; then
    if [ -f ~/.hermes/.env ] && grep -q "^GITHUB_TOKEN=" ~/.hermes/.env; then
      GITHUB_TOKEN=$(grep "^GITHUB_TOKEN=" ~/.hermes/.env | head -1 | cut -d= -f2 | tr -d '\n\r')
    elif grep -q "github.com" ~/.git-credentials 2>/dev/null; then
      GITHUB_TOKEN=$(grep "github.com" ~/.git-credentials 2>/dev/null | head -1 | sed 's|https://[^:]*:\([^@]*\)@.*|\1|')
    fi
  fi
fi

REMOTE_URL=$(git remote get-url origin)
OWNER_REPO=$(echo "$REMOTE_URL" | sed -E 's|.*github\.com[:/]||; s|\.git$||')
OWNER=$(echo "$OWNER_REPO" | cut -d/ -f1)
REPO=$(echo "$OWNER_REPO" | cut -d/ -f2)

1. Ревью локальных изменений (перед отправкой)

Это чистый git — работает везде, API не нужен.

Получить разницу

# Индексированные изменения (что будет закоммичено)
git diff --staged

# Все изменения относительно main (что будет содержать PR)
git diff main...HEAD

# Только имена файлов
git diff main...HEAD --name-only

# Статистика (вставки/удаления на файл)
git diff main...HEAD --stat

Стратегия обзора

  1. Сначала была нанесена схематическая картина:
git diff main...HEAD --stat
git log main..HEAD --oneline
  1. Просмотр файла за файлом — воспользуйтесь read_file для измененных файлов для полного контекста и текста, чтобы увидеть, что изменилось:
git diff main...HEAD -- src/auth/login.py
  1. Проверьте распространённые проблемы:
# Отладочные операторы, TODO, console.log, оставленные
git diff main...HEAD | grep -n "print(\|console\.log\|TODO\|FIXME\|HACK\|XXX\|debugger"

# Большие файлы, случайно проиндексированные
git diff main...HEAD --stat | sort -t'|' -k2 -rn | head -10

# Секреты или шаблоны учётных данных
git diff main...HEAD | grep -in "password\|secret\|api_key\|token.*=\|private_key"

# Маркеры конфликтов слияния
git diff main...HEAD | grep -n "<<<<<<\|>>>>>>\|======="
  1. Представьте структурированную обратную связь пользователю.

Формат вывода обзора

При просмотре локальных изменений в этом случае получаются предварительные результаты:

## Сводка ревью кода

### Критично
- **src/auth.py:45** — SQL-инъекция: пользовательский ввод передаётся напрямую в запрос.
  Предложение: Используйте параметризованные запросы.

### Предупреждения
- **src/models/user.py:23** — Пароль хранится в открытом виде. Используйте bcrypt или argon2.
- **src/api/routes.py:112** — Отсутствует ограничение скорости на endpoint входа.

### Предложения
- **src/utils/helpers.py:8** — Дублирует логику в `src/core/utils.py:34`. Объедините.
- **tests/test_auth.py** — Отсутствует граничный случай: тест с истёкшим токеном.

### Выглядит хорошо
- Чистое разделение ответственности в слое middleware
- Хорошее покрытие тестами для счастливого пути

2. Запрос на получение отзыва на GitHub

Просмотр деталей PR

С хх:

gh pr view 123
gh pr diff 123
gh pr diff 123 --name-only

С git + curl:

PR_NUMBER=123

# Получить детали PR
curl -s \
  -H "Authorization: token $GITHUB_TOKEN" \
  https://api.github.com/repos/$OWNER/$REPO/pulls/$PR_NUMBER \
  | python3 -c "
import sys, json
pr = json.load(sys.stdin)
print(f\"Title: {pr['title']}\")
print(f\"Author: {pr['user']['login']}\")
print(f\"Branch: {pr['head']['ref']} -> {pr['base']['ref']}\")
print(f\"State: {pr['state']}\")
print(f\"Body:\n{pr['body']}\")"

# Список изменённых файлов
curl -s \
  -H "Authorization: token $GITHUB_TOKEN" \
  https://api.github.com/repos/$OWNER/$REPO/pulls/$PR_NUMBER/files \
  | python3 -c "
import sys, json
for f in json.load(sys.stdin):
    print(f\"{f['status']:10} +{f['additions']:-4} -{f['deletions']:-4}  {f['filename']}\")"

Выкачивать PR локально для общего обзора

Это работает с обычным gitgh не нужен:

# Получить ветку PR и переключиться на неё
git fetch origin pull/123/head:pr-123
git checkout pr-123

# Теперь вы можете использовать read_file, search_files, запускать тесты и т.д.

# Просмотреть diff относительно базовой ветки
git diff main...pr-123

С gh (сокращение):

gh pr checkout 123

Оставить комментарии на пиар

Общий комментарий к PR — с gh:

gh pr comment 123 --body "В целом выглядит хорошо, несколько предложений ниже."

Общий комментарий к PR — с завитком:

curl -s -X POST \
  -H "Authorization: token $GITHUB_TOKEN" \
  https://api.github.com/repos/$OWNER/$REPO/issues/$PR_NUMBER/comments \
  -d '{"body": "В целом выглядит хорошо, несколько предложений ниже."}'

Оставить инлайн-комментарии ревью

Один инлайн-комментарий — с gh (через API):

HEAD_SHA=$(gh pr view 123 --json headRefOid --jq '.headRefOid')

gh api repos/$OWNER/$REPO/pulls/123/comments \
  --method POST \
  -f body="Это можно упростить с помощью list comprehension." \
  -f path="src/auth/login.py" \
  -f commit_id="$HEAD_SHA" \
  -f line=45 \
  -f side="RIGHT"

Один инлайн-комментарий — с завитком:

# Получить SHA головного коммита
HEAD_SHA=$(curl -s \
  -H "Authorization: token $GITHUB_TOKEN" \
  https://api.github.com/repos/$OWNER/$REPO/pulls/$PR_NUMBER \
  | python3 -c "import sys,json; print(json.load(sys.stdin)['head']['sha'])")

curl -s -X POST \
  -H "Authorization: token $GITHUB_TOKEN" \
  https://api.github.com/repos/$OWNER/$REPO/pulls/$PR_NUMBER/comments \
  -d "{
    \"body\": \"Это можно упростить с помощью list comprehension.\",
    \"path\": \"src/auth/login.py\",
    \"commit_id\": \"$HEAD_SHA\",
    \"line\": 45,
    \"side\": \"RIGHT\"
  }"

Отправить официальное ревью (Одобрить/Запросить изменения)

С хх:

gh pr review 123 --approve --body "LGTM!"
gh pr review 123 --request-changes --body "См. инлайн-комментарии."
gh pr review 123 --comment --body "Несколько предложений, ничего блокирующего."

С локон — атомарное обозрение с несколькими комментариями:

HEAD_SHA=$(curl -s \
  -H "Authorization: token $GITHUB_TOKEN" \
  https://api.github.com/repos/$OWNER/$REPO/pulls/$PR_NUMBER \
  | python3 -c "import sys,json; print(json.load(sys.stdin)['head']['sha'])")

curl -s -X POST \
  -H "Authorization: token $GITHUB_TOKEN" \
  https://api.github.com/repos/$OWNER/$REPO/pulls/$PR_NUMBER/reviews \
  -d "{
    \"commit_id\": \"$HEAD_SHA\",
    \"event\": \"COMMENT\",
    \"body\": \"Ревью кода от Hermes Agent\",
    \"comments\": [
      {\"path\": \"src/auth.py\", \"line\": 45, \"body\": \"Используйте параметризованные запросы для предотвращения SQL-инъекций.\"},
      {\"path\": \"src/models/user.py\", \"line\": 23, \"body\": \"Хешируйте пароли с помощью bcrypt перед сохранением.\"},
      {\"path\": \"tests/test_auth.py\", \"line\": 1, \"body\": \"Добавьте тест для граничного случая с истёкшим токеном.\"}
    ]
  }"

Значения событий: "APPROVE", "REQUEST_CHANGES", "COMMENT"

Поле line относится к номеру строки в новой версии файла. Для удаления второй строки используйте "side": "LEFT".


3. Чеклист ревью

При выполнении ревью кода (локального или PR) систематически проверяйте:

Корректность

Безопасность

Качество кода

Тестирование

Производительность

Документация


4. Проверка рабочего процесса перед отправкой

Когда пользователь просит вас «проверить код» или «проверить перед отправкой»:

  1. git diff main...HEAD --stat — увидеть объём изменений
  2. git diff main...HEAD — проверен полный diff
  3. Для каждого изменённого файла используйте read_file, если нужен дополнительный контекст.
  4. Замените чеклист выше
  5. Представьте результаты в структурированном формате (Критично / Предупреждения / Предложения / Выглядит хорошо)
  6. Если обнаружены серьезные проблемы, предложите исправить их перед отправкой.

5. Обзор рабочего процесса PR (от начала до конца)

Когда пользователь просит вас «проверить PR #N», «посмотреть этот PR» или дает вам URL-адрес PR, следуйте этому рецепту:

Шаг 1: Установка окружения

source "${HERMES_HOME:-$HOME/.hermes}/skills/github/github-auth/scripts/gh-env.sh"
# Или выполните встроенный блок настройки из начала этого навыка

Шаг 2: Соберите контекст PR

Получите метаданные PR, описания и список измененных материалов, чтобы понять объем перед включением в код.

С хх:

gh pr view 123
gh pr diff 123 --name-only
gh pr checks 123

С локон:

PR_NUMBER=123

# Детали PR (название, автор, описание, ветка)
curl -s -H "Authorization: token $GITHUB_TOKEN" \
  https://api.github.com/repos/$GH_OWNER/$GH_REPO/pulls/$PR_NUMBER

# Изменённые файлы с количеством строк
curl -s -H "Authorization: token $GITHUB_TOKEN" \
  https://api.github.com/repos/$GH_OWNER/$GH_REPO/pulls/$PR_NUMBER/files

Шаг 3: Выкачивайте PR локально

Это дает вам полный доступ к read_file, search_files и возможность запустить тесты.

git fetch origin pull/$PR_NUMBER/head:pr-$PR_NUMBER
git checkout pr-$PR_NUMBER

Шаг 4: Прочитайте различия и поймите изменения

# Полный diff относительно базовой ветки
git diff main...HEAD

# Или пофайлово для больших PR
git diff main...HEAD --name-only
# Затем для каждого файла:
git diff main...HEAD -- path/to/file.py

Для каждого изменённого файла воспользуйтесь read_file, чтобы увидеть изменения контекста — некоторые изменения могут пропустить проблемы, видимые только с удалением кода.

Шаг 5: Запустите автоматические проверки локально (если применимо)

# Запустите тесты, если есть набор тестов
python -m pytest 2>&1 | tail -20
# или: npm test, cargo test, go test./..., и т.д.

# Запустите линтер, если настроен
ruff check. 2>&1 | head -30
# или: eslint, clippy, и т.д.

Шаг 6: Примените ревью чеклиста (Раздел 3)

Пройдитесь по каждой категории: Корректность, Безопасность, Качество кода, Тестирование, Производительность, Документация.

Шаг 7: Опубликовать обзор на GitHub

Соберите свои выводы и отформатируйте их как формальный обзор с инлайн-комментариями.

С хх:

# Если проблем нет — approve
gh pr review $PR_NUMBER --approve --body "Проверено Hermes Agent. Код выглядит чистым — хорошее покрытие тестами, нет проблем с безопасностью."

# Если найдены проблемы — request changes с инлайн-комментариями
gh pr review $PR_NUMBER --request-changes --body "Найдено несколько проблем — см. инлайн-комментарии."

С завитком — атомарное обозрение с несколькими инлайн-комментариями:

HEAD_SHA=$(curl -s -H "Authorization: token $GITHUB_TOKEN" \
  https://api.github.com/repos/$GH_OWNER/$GH_REPO/pulls/$PR_NUMBER \
  | python3 -c "import sys,json; print(json.load(sys.stdin)['head']['sha'])")

# Постройте JSON ревью — event может быть APPROVE, REQUEST_CHANGES или COMMENT
curl -s -X POST \
  -H "Authorization: token $GITHUB_TOKEN" \
  https://api.github.com/repos/$GH_OWNER/$GH_REPO/pulls/$PR_NUMBER/reviews \
  -d "{
    \"commit_id\": \"$HEAD_SHA\",
    \"event\": \"REQUEST_CHANGES\",
    \"body\": \"## Ревью Hermes Agent\n\nНайдено 2 проблемы, 1 предложение. См. инлайн-комментарии.\",
    \"comments\": [
      {\"path\": \"src/auth.py\", \"line\": 45, \"body\": \"🔴 **Критично:** Пользовательский ввод передаётся напрямую в SQL-запрос — используйте параметризованные запросы.\"},
      {\"path\": \"src/models.py\", \"line\": 23, \"body\": \"⚠️ **Предупреждение:** Пароль хранится без хеширования.\"},
      {\"path\": \"src/utils.py\", \"line\": 8, \"body\": \"💡 **Предложение:** Эта логика дублирует core/utils.py:34.\"}
    ]
  }"

Шаг 8: Также опубликуйте сводный комментарий

В дополнениях к инлайн-комментариям оставьте комментарии верхних уровней, чтобы автор PR получил полную картину с первого взгляда. Используйте формат вывода представления references/review-output-template.md.

С хх:

gh pr comment $PR_NUMBER --body "$(cat <<'EOF'
## Сводка ревью кода

**Вердикт: Запрошены изменения** (2 проблемы, 1 предложение)

### 🔴 Критично
- **src/auth.py:45** — Уязвимость SQL-инъекции

### ⚠️ Предупреждения
- **src/models.py:23** — Хранение пароля в открытом виде

### 💡 Предложения
- **src/utils.py:8** — Дублированная логика, рассмотрите объединение

### ✅ Выглядит хорошо
- Чистый дизайн API
- Хорошая обработка ошибок в слое middleware

---
*Проверено Hermes Agent*
EOF
)"

Шаг 9: Очистка

git checkout main
git branch -D pr-$PR_NUMBER

Решение: предложить, запросить изменения или прокомментировать