AIDive

Пакет к видео

Привычки Claude Code как команды: хук, /goal, ревьюер и файлы чек-листа

5 мин чтения

Коротко и вердикт

Правило, записанное в CLAUDE.md, это совет, который Claude взвешивает. Правило, превращённое в команду, выполняется независимо от того, прочитал ли его Claude. Мы взяли API для выставления счетов (Node 20, TypeScript, vitest) на нашей машине, с Claude Code 2.1.294, и прогнали пять привычек как пять команд.

  • Готово: с /goal ответ вывел полный вывод vitest, "Tests 44 passed (44)", и цель была отмечена выполненной за 1 ход. Без неё Claude лишь написал "pnpm test passes (37/37)", а вывод остался свёрнутым в вызове инструмента.
  • Правило, которое должно выполняться: хук PreToolUse заблокировал 2 правки защищённого файла миграций, а остальное Claude изменил.
  • Одна задача, один контекст: /clear сократил диалог с 26.4k токенов до 130 токенов.
  • Загружайте то, чем пользуетесь: /skill-doctor нашёл 52 навыка, загруженных и ни разу не вызванных (13 + 14 + 25).
  • Свежее ревью: ревьюер только для чтения нашёл тот же баг порядка при равенстве, что и сессия-автор, плюс отсутствующий тест, и заявил о чистой проверке типов, которую не мог запустить.

Вердикт: сначала настройте хук, на правиле, которое в вашем репозитории уже нарушали. /clear и /skill-doctor ничего не стоят. /goal оставьте для длинных прогонов, а ревьюера для слияния. Пакет даёт вам нужные файлы.

Синтез по источникам

Строка в CLAUDE.md не принудительна. Рекомендации Anthropic говорят, что строка вроде Always typecheck before you finish срабатывает в большинстве случаев, но не всегда s1. Документация по памяти добавляет ориентир: меньше 200 строк на CLAUDE.md, потому что более длинные файлы расходуют больше контекста и снижают точность следования s6. В нашем тестовом файле было четыре правила, одно из них капсом: "NEVER edit src/store/migrations.ts".

/goal оценивает то, что видно на экране. Оценщик не запускает команды и не читает файлы, поэтому условие должно быть тем, что может показать собственный вывод Claude s2. Поэтому наше условие требует вывести полный вывод тестов в диалог. В полевом отчёте команды примерно с 600 PR худший баг прошёл tsc, lint и собственные тесты агента s8. Проверка готовности, которую нельзя выполнить, крутится в цикле до предельного числа блокировок s9.

Хук с кодом 2 блокирует вызов. В руководстве по хукам код 2 означает блокировку действия s3. В нашем прогоне, когда правило убрали из CLAUDE.md, Claude дважды полез в файл миграций, и обе правки вернулись заблокированными с нашим сообщением. При строке капсом Claude отказался сам, а в 2 последующих прогонах сначала прочитал скрипт хука и не пытался трогать файл. Самую острую критику высказывает тред на Hacker News: блокировка детерминирована, а то, что модель сделает дальше, нет s10.

/clear бесплатен и очищает нужное. Рекомендации говорят, что /clear между несвязанными задачами ничего не стоит s1. После нашей фичи /context показал 57.5k из 1m токенов, из них сообщения 26.4k. После /clear он показал 31.1k, сообщения 130 токенов. Инструкции, инструменты и навыки остались.

/skill-doctor называет то, чем вы не пользуетесь. Он отмечает навыки в списке, которые ни разу не вызывались, и подсказывает, где их отключить s7. На нашей машине он показал 13 загруженных, но ни разу не вызванных навыков, 14 синхронизированных из claude.ai и 25 навыков плагинов: всего 52, плюс 4 плагина, которыми давно не пользовались. Место в списке ограничено: в одном разборе 267 лишних символов в одном описании превратили 7 других навыков в голые имена s12. Выигрыш это меньше шума, а не вдвое меньший контекст.

Свежий ревьюер полезен, потому что не видел ваших рассуждений. Рекомендации говорят об этом прямо и добавляют, что передача той же задачи субагенту не улучшает ответ s1. Каждый субагент стартует со свежим изолированным окном контекста s5. У этого есть цена: один пользователь измерил около 51k токенов на старте каждого субагента s14, поэтому вызывайте его раз на фичу. Наш ревьюер работал 28 с в фоне.

Код

  • goal-conditions.md

# /goal conditions

The /goal judge reads only the conversation. It does not run commands or read files, so write the condition as something Claude's own output can demonstrate. Name one end state and the proof you want printed on screen.

## 1. The one we used (overdue invoices endpoint)

```
/goal GET /invoices/overdue returns the overdue invoices with page and pageSize query params, new tests cover it, and the full pnpm test output showing every test passing is printed in this conversation
```

Result on our run: the reply printed the full vitest output, then the goal was marked achieved.

## 2. Template: a bug fix

```
/goal <the failing behaviour> no longer happens, a new test reproduces it and passes, and the full <your test command> output showing every test passing is printed in this conversation
```

## 3. Template: a refactor

```
/goal <the old name or pattern> no longer appears in the code, the output of <your search command> showing no matches is printed in this conversation, and the full <your test command> output showing every test passing is printed too
```

## Rules for all three

- One end state, not a list of wishes.
- The proof is output Claude prints (test results, a search result), never "it works".
- Do not write a condition Claude cannot meet; an unsatisfiable goal loops.
- Check it with `/goal` alone; remove it with `/goal clear`.

goal-conditions.md on GitHub

: точное условие `/goal`, которое мы использовали, плюс 2 шаблона на том же принципе. Вставьте одно после `/goal` перед тем, как просить фичу. -

protect-migrations.sh

#!/bin/sh
# Block edits to the append-only migrations file
path=$(jq -r '.tool_input.file_path // empty')
case "$path" in
  *src/store/migrations.ts)
    echo "migrations.ts is append-only: add a new migration file instead" >&2
    exit 2 ;;
esac
exit 0

protect-migrations.sh on GitHub

: скрипт хука. Он читает путь к файлу и завершается с кодом 2 и причиной, когда путь оканчивается на `src/store/migrations.ts`. Сохраните его как `.claude/hooks/protect-migrations.sh` и выполните для него `chmod +x`. Нужен `jq`. Замените путь на файл, который вы защищаете. -

settings.json

{
  "hooks": {
    "PreToolUse": [
      { "matcher": "Edit|Write",
        "hooks": [ { "type": "command", "command": ".claude/hooks/protect-migrations.sh" } ] }
    ]
  }
}

settings.json on GitHub

: регистрирует скрипт как хук PreToolUse на `Edit|Write`. Вольейте его в `.claude/settings.json`. -

reviewer.md

---
name: reviewer
description: Read-only code reviewer. Use it to review the current git diff before a merge, against the conventions in README.md.
tools: Read, Grep, Glob, Bash(git diff:*), Bash(git status:*)
---

You review a diff you did not write. You never edit files.

1. Run `git diff` and read every changed file in full.
2. Read README.md and check the diff against each of its conventions.
3. Look for bugs: wrong edge cases, missing validation, untested branches, behaviour that breaks existing routes.

Report each finding with the file, the line, what is wrong and why it matters. Say plainly when you find nothing real. No style nits.

reviewer.md on GitHub

: субагент-ревьюер только для чтения с инструментами Read, Grep, Glob, `Bash(git diff:*)` и `Bash(git status:*)`. Сохраните его как `.claude/agents/reviewer.md`. -

checklist.md

# Clear and skill-doctor checklist

After every finished task
1. Run `/context` and read what the session carries.
2. Run `/clear` before the next unrelated task.
3. Run `/context` again; the conversation should be near empty while instructions, tools and skills stay.
4. In the middle of a task, do not clear: use `/compact` with a focus instead.

Once a month
1. Run `/skill-doctor` (needs a recent Claude Code release).
2. Skills loaded but never invoked: turn them off in `/skills` (space bar cycles).
3. Skills synced from claude.ai: switch them off on the web side, deleting them locally brings them back.
4. Plugin skills: disable the plugin in the Installed tab.
5. Keep what you use rarely but still need.

checklist.md on GitHub

: рутина `/context`, `/clear` и `/skill-doctor` на одной странице.

Сделайте в понедельник

  • Откройте свой CLAUDE.md и отметьте каждую строку, которая должна выполняться каждый раз, а не в большинстве случаев.
  • Скопируйте protect-migrations.sh и settings.json в .claude/, укажите путь к защищаемому файлу, затем попросите Claude его изменить и посмотрите на блокировку.
  • Перед следующей фичей введите /goal с условием, которое требует вывести полный вывод тестов.
  • Когда задача будет готова, выполните /context, затем /clear, затем снова /context.
  • Выполните /skill-doctor и отключите то, что ни разу не вызывали. Для синхронизированных навыков делайте это на стороне веба.
  • Скопируйте reviewer.md в .claude/agents/ и попросите проверить diff перед следующим слиянием.
  • После ревью сами запустите проверку типов. Наш ревьюер заявил о проверке, которую не мог запустить.

Что почитать дальше

Мы это не включили.

  • Аудит промпта. /doctor prompt-audit и довод "чем громче правило, тем длиннее файл". Минимальную версию смотрите в справочнике команд s4.
  • Навыки, которые не срабатывают. Это про описания, а не про то, что загружается. Начать стоит с разбора primeline s12.
  • Сокращение MCP. Одна статья измерила 12 MCP-серверов: 5.8k токенов с tool search и 63k без него, так что это важно меньше, чем раньше s13.
  • Более крупные файлы CLAUDE.md. Один пост сократил 455,530 символов до 88,584 в девяти файлах и отмечает, что импорты @path загружаются сразу, а обычные ссылки лениво s11.
  • /batch. Для крупных рефакторингов справочник команд называет от 5 до 30 единиц, по одному worktree на каждую s4. Мы его не запускали.
  • Ручные пороги /compact. Мы не нашли источника для фиксированного процента, поэтому не называем его.

FAQ

/goal заменяет самостоятельный запуск тестов? Нет. Судья читает только диалог. Он проверяет, что вывод был показан, а не что он правдив.

Хук мешает Claude пытаться править файл? Нет. Он останавливает правку, когда Claude уже пытается. В нашем прогоне без правила в CLAUDE.md Claude дважды полез в файл, и обе правки были заблокированы.

Стоит ли удалять правила из CLAUDE.md, когда есть хук? Нет. Со строкой капсом Claude сам отказался от правки, что экономит заблокированный вызов. Оставьте её для того, что Claude не может вывести из вашего кода.

Почему не использовать ревьюера на каждую правку? Каждый субагент стартует с собственным полным контекстом, поэтому это стоит реальных токенов. Используйте его раз на фичу, перед слиянием.

Будет ли /skill-doctor работать на моей версии? Он закрыт флагом функции и свежим релизом в справочнике команд s4. На 2.1.294 он работал на нашей машине, но если у вас нет, сначала обновите Claude Code.

Файлы