mr-review
MR Review — ревью чужого Merge Request с публикацией threads в GitLab. Используй когда просят отревьюить MR коллеги по ссылке или ID (fetch diff → /go-review → публикация замечаний).
- License 许可
- MIT
- 最近更新
- 2026-11-05
- Stars
- ★ 7
- Forks
- 1
01 前言 Front Matter
- name
- mr-review
- description
- MR Review — ревью чужого Merge Request с публикацией threads в GitLab. Используй когда просят отревьюить MR коллеги по ссылке или ID (fetch diff → /go-review → публикация замечаний).
- argument-hint
- <mr_iid> [--focus security|performance|...]
03 SKILL.md 正文
MR Review — ревью чужого Merge Request
Полный цикл code review для MR в GitLab: получить diff, проанализировать код, опубликовать замечания как inline threads.
Подключения — из project-index.md в auto-memory проекта и ~/.claude/memory/infra-{group}.md.
Использование
/mr-review 42
/mr-review 42 --focus security
/mr-review 42 --focus performance
Flow
FETCH MR → READ CODE → REVIEW → SUMMARY → ⏸ HITL → PUBLISH
1. FETCH — получить MR
# Детали MR (title, description, author, source/target branch, diff_refs)
pcurl @{gl_profile} 'https://{gl_host}/api/v4/projects/{gl_project_id}/merge_requests/{mr_iid}' -s
# Diff (список изменённых файлов с содержимым)
pcurl @{gl_profile} 'https://{gl_host}/api/v4/projects/{gl_project_id}/merge_requests/{mr_iid}/changes' -s
# Коммиты MR
pcurl @{gl_profile} 'https://{gl_host}/api/v4/projects/{gl_project_id}/merge_requests/{mr_iid}/commits' -s
# Существующие discussions (чтобы не дублировать замечания)
pcurl @{gl_profile} 'https://{gl_host}/api/v4/projects/{gl_project_id}/merge_requests/{mr_iid}/discussions?per_page=100' -s
Извлечь:
diff_refs(base_sha, start_sha, head_sha) — нужны для inline comments- Список изменённых файлов и их diff
- Описание MR и связанную задачу (из title или description)
- Уже существующие замечания (не дублировать)
2. READ CODE — прочитать контекст
Для каждого изменённого файла:
- Прочитать полный файл локально (не только diff) — для понимания контекста
- Если ветка MR доступна локально —
git fetch origin && git checkout {source_branch} - Если нет — читать через API или анализировать diff as-is
Дополнительно:
- Прочитать связанную задачу из YouTrack (если ID в title/description)
- Понять что должен делать MR — сравнить intent с реализацией
3. REVIEW — анализ кода
Запустить /go-review в режиме MR: изменения — diff из шага 1 (или git diff origin/{target_branch}...origin/{source_branch}), preflight локальной базы не нужен. 6 ревьюеров:
- Common — соответствие задаче, полнота
- Architecture (Dave Cheney) — структура, зависимости
- Code (Rob Pike) — простота, читаемость
- Security (Filippo Valsorda) — уязвимости, authz
- Tests (Mitchell Hashimoto) — покрытие, качество тестов
- Operability (Peter Bourgon) — логирование, метрики, graceful degradation
Если указан --focus — углубиться в этот аспект, не отбрасывая находки по остальным.
Дополнительные проверки (сверх /go-review):
- Сгенерированные файлы (
*_zenrpc.go,*_colgen.go,*_mfd.go) — пропустить, но убедиться что они обновлены - Миграции — проверить на блокирующие ALTER, наличие отката
make generateconsistency — если менялись структуры/аннотации, обновлены ли сгенерированные файлы?
4. SUMMARY — подготовить результат
Сформировать два артефакта:
a) Summary comment (общий комментарий к MR)
## Code Review Summary
**MR:** !{mr_iid} — {title}
**Reviewed by:** Claude (/go-review — 6 perspectives)
### Verdict: {Approve / Request Changes / Comment}
### Acceptance
- met: {критерий из задачи}
- unmet: {критерий} — {почему}
### Findings
| # | Severity | Confidence | File | Line | Issue |
|---|----------|------------|------|------|-------|
| 1 | blocker | high | {file} | {line} | {description} |
| 2 | major | medium | {file} | {line} | {description} |
| 3 | minor | low | {file} | {line} | {description} |
### What's good
- {positive finding 1}
- {positive finding 2}
### Recommendations
- {recommendation 1}
b) Inline comments (привязанные к строкам кода)
Для каждого замечания severity blocker/major/minor — подготовить inline comment с:
- Severity tag:
**[blocker]**,**[major]**,**[minor]** - Описание проблемы
- Предложение исправления (с примером кода если уместно)
Замечания nit — только в summary, без отдельных threads. Находки с уверенностью low пометь в тексте замечания как предположение — пользователь решит на HITL, публиковать ли их.
⏸ HITL: Утверждение ревью
Показать пользователю:
- Summary comment
- Список inline comments с файлами и строками
- Рекомендованный verdict (Approve / Request Changes / Comment)
Пользователь решает:
- Publish all — опубликовать summary + все inline threads
- Publish selected — выбрать какие замечания публиковать
- Edit — скорректировать текст замечаний
- Cancel — не публиковать
5. PUBLISH — опубликовать в GitLab
Тексты замечаний — многострочный markdown с кавычками и кодом, поэтому JSON собирается через jq, а не руками.
Summary comment:
pcurl @{gl_profile} 'https://{gl_host}/api/v4/projects/{gl_project_id}/merge_requests/{mr_iid}/notes' -s -X POST \
-H 'Content-Type: application/json' \
-d "$(jq -n --arg body "$SUMMARY" '{body: $body}')"
Inline threads (для каждого замечания):
pcurl @{gl_profile} 'https://{gl_host}/api/v4/projects/{gl_project_id}/merge_requests/{mr_iid}/discussions' -s -X POST \
-H 'Content-Type: application/json' \
-d "$(jq -n --arg body "$COMMENT" --arg path '{file_path}' --argjson line {line_number} \
--arg base '{base_sha}' --arg start '{start_sha}' --arg head '{head_sha}' \
'{body: $body, position: {position_type: "text", base_sha: $base, start_sha: $start, head_sha: $head, old_path: $path, new_path: $path, new_line: $line}}')"
base_sha,start_sha,head_shaизdiff_refs(шаг 1).new_line— номер строки в новой версии файла. Для удалённых строк использоватьold_lineвместоnew_line.
Approve (если verdict = Approve):
pcurl @{gl_profile} 'https://{gl_host}/api/v4/projects/{gl_project_id}/merge_requests/{mr_iid}/approve' -s -X POST
Правила
- Никогда не публиковать без подтверждения пользователя
- Не дублировать замечания, которые уже есть в discussions
- Пропускать сгенерированные файлы (но проверять их актуальность)
- Быть конструктивным: предлагать решение, а не только указывать проблему
- Severity blocker — только для реальных багов, уязвимостей, потери данных
- Если MR слишком большой (>1000 строк diff) — предупредить и предложить ревью по частям
04 同仓库更多 Skills
zenrpc
Zenrpc — справочник по JSON-RPC 2.0 серверу для Go. Используй при создании и редактировании RPC-сервисов.
youtrack
YouTrack — задачи через REST API и pcurl. Используй для поиска issues, создания, обновления описаний, смены assignee/stage/приоритета, логирования времени и работы с комментариями.
topsrv
topsrv — метрики, алерты, CVE и HTTP-логи серверов проекта через публичный JSON-RPC API app.topsrv.io. Используй, когда нужна загрузка CPU, памяти или диска хоста, метрики PostgreSQL/nginx/angie агента topsrv (`topsrv_*`), какие алерты горят, уязвимые пакеты на серверах или кто (боты, сети, IP) нагружает сайт.
testing
Testing — используй всегда, когда пишешь или правишь Go-тесты (*_test.go), в том числе по сценариям Given/When/Then из spec: фреймворк как в соседних файлах, префикс TestDB, фабрики pkg/db/test, реальная БД без моков. Также при настройке TestMain/test-short и когда тесты падают в gate, но проходят локально.
solve
Solve — полный цикл решения задачи из YouTrack: preflight → анализ → план → реализация → ревью → коммит. Используй при любой YouTrack-задаче (`/solve PLF-819`); флаг `--fast` сокращает HITL для тривиальных багфиксов.
skills-check
Skills Check — smoke-тесты интеграций из project-index.md. Используй для проверки что pcurl-профили и URL всех data-source скиллов ещё живы.