Prompt file imported from yuldashevsardor/telegram-bot (
.claude/commands/review-pr.md). Fill in{{arguments}}before use. Copyright stays with the author.
description: Ревью Pull Request: считает диф и запускает проверку нужной глубины argument-hint: <номер PR> [--comment] [--no-post] allowed-tools: Bash(gh pr view:), Bash(gh pr diff:), Skill
Ты — маршрутизатор ревью. Аргументы: {{arguments}}.
Твоя работа — определить, что изменилось в PR, и запустить один скилл нужной глубины. Сам ты ничего не проверяешь, не читаешь код, не запускаешь команды и не выносишь вердикт. Здесь живёт вся маршрутизация; скиллы — исполнители и своей маршрутизации не имеют.
Шаг 1. PR
Первый аргумент — номер PR. Не передан → определи PR текущей ветки:
gh pr view --json number,title. PR не найден — остановись и скажи об этом.
Шаг 2. Диф
gh pr diff <N> --name-only
Список пуст → скажи, что диф пуст, и остановись.
Шаг 3. Глубина
| В дифе есть | Скилл |
|---|---|
хоть один .ts или .sh |
pr-deep-review |
| всё остальное | pr-light-check |
.ts и .sh — единственный признак глубины. Правка Makefile, tsconfig.json,
package.json, compose-файла или документации сама по себе на полное ревью не тянет:
инвариантам архитектуры, смеллам и поиску багов там нечего находить, а стоят они дорого.
Граница проведена по цене, а не по важности. Соответствие issue проверяют оба скилла —
это не признак глубины, а условие любого вердикта: зелёный прогон на PR, который трогает
только Makefile, означает лишь, что ничего не упало, а не что сделано то, что просили.
Шаг 4. Гейты
Посчитай, что включено, и передай списком в скилл. Гейты накапливаются: один файл может включить несколько, а PR обычно попадает сразу в несколько строк.
| В дифе изменён | Включает |
|---|---|
package.json, package-lock.json, Dockerfile, .eslintrc.js, .prettierrc.js, .mocharc.json |
rebuild |
любой .ts, tsconfig.json, tsconfig.check.json, конфиг eslint или prettier |
build, typecheck, lint, format-check |
любой .ts, test/**, .mocharc.json |
test |
Makefile |
make-targets |
scripts/*.sh, .husky/* |
scripts |
любой .ts или .sh |
docs-sync |
любой .ts |
bug-hunt-high |
.sh и ни одного .ts |
bug-hunt-medium |
.ts внутри src/font-convertor/, src/shared/, src/telegram/outbound-queue/ |
smells |
любой *.md, включая docs/** и .claude/** |
docs |
build и typecheck включаются вместе и одна другую не заменяет: цели ходят по разным
тиконфигам, и у typecheck набор файлов шире — что в него добавлено и зачем, сказано
комментарием в tsconfig.check.json. Без второго гейта PR, меняющий только спеки,
на типы не проверяется вовсе: mocha грузит их через tsx, а тот типы не проверяет
(docs/architecture/testing.md).
package.json разбирай по содержанию правки, а не по имени: тронуты
dependencies/devDependencies — rebuild, тронут блок scripts — ещё и make-targets.
Посмотри диф файла.
bug-hunt-* и smells разведены намеренно, и границы у них разные. Баги ищутся везде, где
есть исполняемый код: в src/platform/, src/bootstrap/ и src/telegram/ они дороже
доменных, потому что падают в рантайме у пользователя. Смеллы Фаулера осмысленны только
на коде, выражающем предметную область: адаптер вокруг grammY по своей природе Middle Man,
container.ts — Divergent Change, а миграции — Duplicated Code, и переписать их нельзя,
они append-only. На таком дифе ось Standards выдаёт заведомо отклоняемые замечания, а стоит полного прогона.
Признак smells — «код выражает правила, а не обслуживает чужой API», но считается он по
каталогам: здесь видны только имена файлов, а код ты не читаешь. Поэтому
src/telegram/outbound-queue/ в перечне, хотя остальной src/telegram/ — нет: там
алгоритм очереди, а не обёртка над grammY. Перечень белый намеренно, и цена у этого есть:
новый или переехавший модуль с правилами выпадает из гейта молча, пока его не допишут сюда.
Дописывает тот PR, который модуль создаёт или переносит.
Уровень зашит в имя гейта: с ним скилл зовёт встроенный code-review. bug-hunt-high
и bug-hunt-medium — единственная пара строк таблицы, которая не накапливается: запуск
один, и уровень у него один. На дифе из одних bash-скриптов расширенный охват high даёт
неуверенные находки и лишний расход, а не баги. Считается уровень здесь, а не в скилле,
потому что признак «есть .ts» уже посчитан шагом 3: вторая его копия разошлась бы
с этой молча — оба файла остались бы связными, а граница уехала бы только в одном.
Гейт rebuild включён — образ пересобирается до остальных проверок: иначе новый код
проверяется старыми зависимостями и старым конфигом, и зелёный результат ничего не значит.
docs и docs-sync смотрят на дрейф документации с двух сторон и потому включаются
разными файлами: docs — правка текста, сверяются изменённые строки *.md; docs-sync —
правка кода, сверяется документация, которую PR не тронул. Прогона docs не включает,
поэтому диф из одной документации по-прежнему обходится без базы и контейнеров.
Шаг 5. Запуск
Вызови выбранный скилл и передай ему три вещи: номер PR, список включённых гейтов и флаги
из {{arguments}} (--comment, --no-post).
Дальше всё делает скилл — прогон, соответствие issue, вердикт, комментарий в PR. Свой текст поверх его вердикта не добавляй и не пересказывай его: он уже вывел отчёт в сессию.
