Мой рабочий пайплайн для Claude Code: правила с гейтами (CLAUDE.md), именованные агенты-ревьюверы
(agents/), чекер, который сверяет заявленное с журналом сессии (pipeline/), и проектные скиллы,
которые в самих репо лежат под гитигнором (project-skills/).
Ядро — CLAUDE.md, agents/, pipeline/ — не привязано ни к проекту, ни к машине: путей
конкретного пользователя в нём нет (на выгрузке ~/.claude заменяется плейсхолдером
{{CLAUDE_HOME}}, установщик подставляет свой), а всё проектное живёт в самом проекте:
- что в проекте секретное — секция
## Secretsв репо-файле проекта (AGENTS.md,CLAUDE.md,docs-internal/AGENTS.mdили.claude/CLAUDE.md): файлы, модули, типы и пути с ключами и шифрованным конфигом, куда законно течёт их открытый вид, какие защиты нельзя снимать.leak-check.jsкопирует её в отчёт дляleak-review, а имена в бэктиках добавляет в pre-scan. Без секции гейт всё равно работает — агент ищет ключи и креды сам и пишет в вердикте, что проект ничего не объявил; сама секция тогда — первое, что заводится в репо-файле; - команды сборки / линта / тестов — блок
## Commandsрепо-файла (§5 правил); - скиллы —
project-skills/<repo>/, ставятся только с--project.
Скопируй агенту дословно:
Клонируй https://github.com/guyverino/ClaudRules и выполни
node install.js --project <путь к чекауту MoonTerminal>
Затем перезапусти сессию (правила и агенты читаются на старте).
Что сделает install.js:
- перепишет абсолютные пути в правилах (корень и хвост, с разделителями этой ОС) под домашнюю
папку машины — агент без shell не умеет раскрывать
~; на POSIX заменит и единственную PowerShell-фразу в правилах. Проектные скиллы MoonTerminal — Windows/MSVC-специфичны (команды сборки, PowerShell): на Linux/macOS установщик это скажет, а команды брать из## Commandsрепо; - сделает бэкап существующих
~/.claude/CLAUDE.md,agents/,pipeline/; - положит
CLAUDE.md,agents/*.md,pipeline/**/*.js(точки входа,lib/,tests/) и Linux-бандлinstall-pipeline.sh; уберёт агентов, которых в этой версии уже нет; - прогонит регрессионный набор чекера (
pipeline/test.js) — красный набор или отказ регистрации хуков откатывают установку (бэкап возвращается, на первой установке — записанное удаляется); - зарегистрирует шесть хуков в
~/.claude/settings.json(идемпотентно, чужие хуки не трогает):Stop— дайджест чекера;UserPromptSubmit— отчёт прошлой задачи и язык ответа (reply-lang.js, молчит безpipeline/reply-lang.local);SessionStart—leak-check.js status;PreToolUse—no-poll.jsнаBash|PowerShell(отказ наsleepв цикле или ожидание от 30 с) иask-lang.jsнаAskUserQuestion(отказ на вопрос не на языке разработчика); - положит проектные скиллы в
<проект>/.claude/skills/для каждого--projectи запишет, какие именно пришли отсюда (.claude/skills/.claudrules.json) — только их и уберёт при следующей установке, свои скиллы проекта не тронет; - запомнит путь этого чекаута в
~/.claude/pipeline/rules-repo.local, чтобы выгрузка обратно не требовала пути.
Флаги: --prefix <dir> — установить в другую «домашнюю» папку (песочница), --dry-run — только
показать, --force-no-backup — ставить, даже если бэкап не записался.
Linux-сервер по SSH: pipeline/install-pipeline.sh — тот же набор одним самодостаточным bash-файлом
(scp + ssh host 'bash install-pipeline.sh').
Моды (pipeline/mods/<имя>/ — mods Claude Code,
плагины с хуками на TypeScript) выгружаются сюда, но install.js и бандл их не ставят: они
копируют только *.js. Чтобы включить мод, скопируй его папку в ~/.claude/pipeline/mods/ и добавь
абсолютный путь в env.CLAUDE_CODE_PLUGIN_DIRS в ~/.claude/settings.json (несколько — через ; на
Windows, : на POSIX). pipeline — общий: привязывает ручной gate-check --hand к своей сессии,
показывает WARN и тревоги старта над промптом, отказывает агенту-ревьюеру без диффа и второму
fix-diff за задачу. moon-guard — проектный, для MoonTerminal (MSVC-таргет, vcvars, /diag).
Хукам языка нужен ~/.claude/pipeline/reply-lang.local с языком ответов (одна строка, например
Russian) — без него они молчат. Файл машинный и не выгружается.
Правила правятся в ~/.claude (так их видит Claude Code), а сюда выгружаются:
node ~/.claude/pipeline/export-rules.js --project <MoonTerminal> --commit "rules: <что изменилось>" --push
Путь чекаута берётся из ~/.claude/pipeline/rules-repo.local (его пишет install.js; позиционный
аргумент перед флагами перекрывает). Скрипт сначала пересобирает Linux-бандл, копирует файлы,
заменяя путь ~/.claude этой машины на {{CLAUDE_HOME}}, обновляет manifest.json, удаляет из репо
то, что на машине уже снято, и коммитит только свои пути — и только если они изменились.
Экран публичного экспорта. Репо публичное, а main не принимает force-push, поэтому всё, что
ушло, ушло навсегда. Перед коммитом скрипт проверяет каждый файл, который может попасть в коммит
(по содержимому и по имени), раскодированный бандл (файлы в нём лежат в base64), сообщение
коммита и автора — против ~/.claude/pipeline/private-terms.local: списка того, как называются
проекты этой машины (репо, ветки, хосты, люди), без учёта регистра и разделителей. Перед push —
то же по каждому неотправленному коммиту. Совпадение — отказ. Без списка пробная выгрузка только
предупреждает, а --commit отказывает. Отказанная выгрузка оставляет копию в чекауте
незакоммиченной — коммитить её руками нельзя. Новый приватный проект начинается с того, что его
имена дописываются в этот список.
Когда: в конце любой задачи, которая правила ~/.claude (правила, агентов, pipeline/) или
проектный скилл — это шаг §11 в самих правилах. Иначе репо отстаёт от машины, и следующая установка
развернёт старое.
settings.json— права и хуки конкретной машины; ставятся только шесть хуков пайплайна;memory/— знания по проекту, приватные;- леджер, дайджесты чекера и результаты батареи (
eval-results.jsonl) — учётные данные сессий; pipeline/rules-repo.local— путь чекаута на конкретной машине;pipeline/private-terms.local— список имён проектов для экрана экспорта (выгрузить его и было бы утечкой);pipeline/reply-lang.local— язык ответов этой машины;- имя пользователя, машины и проекта: путь дома — плейсхолдер,
manifest.jsonбез hostname, секретный контур проекта — в его собственном репо-файле.
| путь | что |
|---|---|
CLAUDE.md |
правила: §0 класс задачи → … → §10 квитанция, гейты |
agents/ |
flow, half-fix, contracts, error-paths, seams, external-data, value-integrity, type-design, tests (углы ревью, sonnet) · fix-diff (дельта, opus) · verify-finding (фильтр находок, haiku) · leak-review (проверка чужих коммитов на утечки по ## Secrets и ## Release surface проекта, opus). У каждого угла — раздел ## Known false alarms (формы, на которых прошлые находки опровергались, R9); текст в проверяемой правке, обращённый к ревьюеру или ИИ, — сам по себе находка high |
pipeline/gate-check.js |
чекер: читает журнал сессии, сверяет класс/углы/сборку/тесты/sleep/дельту/утечки, пишет отчёт; Stop- и UserPromptSubmit-хуки. Точка входа; работа — в pipeline/lib/ |
pipeline/lib/ |
модули: transcript (найти/прочитать/вырезать задачу), digest (что задача делала), checks (гейты, по функции на гейт), late (ответы агентов после следующего промпта), git/parallel (чужие коммиты, PR), ledger (учёт), stacks (таблица стеков и классификаций), hook (payload хука), root (корень, список скриптов), repofile (секции ## Secrets / ## Release surface репо-файла проекта), release (кто трогал release surface), screen (экран публичного экспорта), lang (язык ответов), eval-cases (кейсы батареи) |
pipeline/stats.js |
scorecard по леджеру с предложениями мер + раздел батареи: поймано / пропущено / ложные тревоги по каждому углу |
pipeline/eval.js |
батарея ревьюеров: маленькие выдуманные правки с заложенным дефектом и чистые контрольные, по одному headless-запуску claude -p --agent <угол> (хуки выключены) на кейс; плюс пакеты заранее известных настоящих и ложных находок для verify-finding — настоящая с оценкой ниже 60 считается пропуском фильтра, ложная от 60 — ложной тревогой. Единственное место, где считаются пропуски ревью (R9). --list, --dry, --angle, --case |
pipeline/apply-batch.js |
пакет правок «всё или ничего»: проверяет каждый hunk до записи и не пишет ничего, если хоть один не совпал (§6) |
pipeline/no-poll.js |
PreToolUse-хук: отказ на ожидание опросом (sleep в цикле, одиночное ожидание от 30 с), §7 |
pipeline/reply-lang.js, pipeline/ask-lang.js |
язык ответов: напоминание на каждый промпт и отказ на AskUserQuestion не на этом языке |
pipeline/tested-tree.js |
run -- <команда тестов> запоминает дерево, на котором полный прогон был зелёным; check -- <команда> отвечает, проверено ли уже текущее дерево (exit 0 — прогон можно пропустить). Шаги публикации не гоняют тесты на том же дереве повторно (R8) |
pipeline/leak-check.js |
чужие коммиты на отслеживаемой ветке (origin/main или та, что задана git config leakcheck.branch): статус (SessionStart-хук: LEAK REVIEW PENDING + PARALLEL WORK + RELEASE SURFACE CHANGED), отчёт для leak-review (с секциями ## Secrets и ## Release surface проекта), метка «проверено» (mark) и отдельная — «release surface прочитан руками» (ack-release); others — что другие влили с моего последнего коммита и какие PR открыты, с файлами (гейт §1: не делать одно и то же дважды; срабатывает только там, где есть другие контрибьюторы) |
pipeline/test.js, pipeline/tests/ |
регрессионный набор: раннер сканирует tests/*.test.js (по файлу на предмет; каждый кейс — дыра, которая один раз случилась); tests/agents.test.js следит, чтобы контракт в файлах агентов не разъезжался |
pipeline/install-hooks.js |
регистрация хуков |
pipeline/make-bundle.js → install-pipeline.sh |
Linux-бандл |
pipeline/export-rules.js |
выгрузка из ~/.claude сюда, через экран публичного экспорта |
pipeline/mods/ |
моды Claude Code: общий pipeline и проектный moon-guard; ставятся руками, см. выше |
project-skills/<repo>/<skill>/SKILL.md |
проектные скиллы (/publish и /tutorial-video для MoonTerminal) |
Issue и PR приветствуются — присылай из форка. В main пушит только владелец: правила ставят хуки,
которые исполняются на машине установившего, поэтому каждая чужая правка проходит ревью PR.
Лицензия — MIT (LICENSE).