# Claude Code: чем отличаются hooks, skills и слэш-команды

> Для повторяемой процедуры используйте навык и вызывайте его через /имя. Для реакции перед или после действия нужен hook. Встроенные команды управления сеансом составляют отдельную группу.

- URL: https://blog.laozhang.ai/ru/posts/claude-code-hooks-slash-commands-skills
- Published: 2026-06-01
- Updated: 2026-10-05
- Author: LaoZhang AI Team (https://blog.laozhang.ai/ru/about)
- Topic: Claude Code
- Tags: Claude Code, Хуки, Слэш-команды, Навыки, Автоматизация разработки

---
В Claude Code навык, слэш-команда и hook не образуют три взаимоисключающих способа автоматизации. **Навык (skill) хранит инструкции и вспомогательные файлы; слэш-команда позволяет вызвать его через `/имя`; hook запускает обработчик в определённой точке жизненного цикла.** Если вы каждый раз объясняете одинаковую процедуру проверки, начните с навыка. Если проверка должна срабатывать перед конкретным инструментом, нужен hook. Для смены модели или управления контекстом сначала посмотрите встроенные команды.

Есть важная поправка к старым руководствам: по [документации Claude Code, проверенной 4 октября 2026 года](https://code.claude.com/docs/en/skills), пользовательские команды уже объединены с навыками. Старый файл `.claude/commands/review-note.md` и новый `.claude/skills/review-note/SKILL.md` создают вызов `/review-note`. Существующие команды продолжают работать; переносить их все ради нового названия не требуется.

## Что выбрать для вашей задачи

Выбирайте по необходимому результату, а затем определяйте, кто и когда запускает работу.

| Задача | С чего начать | Что будет происходить | Что важно проверить |
| --- | --- | --- | --- |
| Сменить модель, посмотреть справку, сократить контекст | Встроенная команда, например `/model`, `/help`, `/compact` | CLI выполняет предусмотренное действие | Доступность команды в вашей версии и среде |
| Получать разбор файла по одинаковым критериям | Свой навык с вызовом `/review-note файл` | Claude получает инструкции и выполняет процедуру | Полноту входных данных и качество ответа |
| Подключать справочные знания по смыслу запроса | Навык с подходящим `description` | Claude может выбрать его автоматически | Не слишком ли широко описана область применения |
| Проверять аргумент инструмента до его выполнения | `PreToolUse` hook | Событие запускает обработчик с данными вызова | Фильтр, формат входа и значение результата для этого события |
| Запускать обработку после успешного действия | `PostToolUse` hook | Обработчик получает событие после выполнения инструмента | Ошибки обработчика и его собственные побочные эффекты |

Встроенные команды и навыки, поставляемые вместе с Claude Code, тоже различаются. Большинство встроенных команд выполняют фиксированную логику CLI. Поставляемые навыки, например `/claude-api`, передают Claude инструкции для работы. Одинаковый начальный символ `/` не означает одинаковую реализацию и не обещает выполнение без модели или расхода токенов. В [справочнике команд](https://code.claude.com/docs/en/commands) такие навыки помечены как `Skill`.

![Ручной и модельный вызов навыка и отдельный обработчик события hook](https://blog.laozhang.ai/posts/ru/claude-code-hooks-slash-commands-skills/img/surface-map.webp)

## Навык можно вызывать вручную или по контексту

По умолчанию навык доступен обоим: вы можете написать `/имя-навыка`, а Claude — загрузить его, если описание соответствует задаче. Поэтому разделение «команды всегда ручные, навыки всегда автоматические» неверно.

В начале `SKILL.md` можно задать два разных ограничения:

| Параметр | Что ограничивает | Когда полезен |
| --- | --- | --- |
| `disable-model-invocation: true` | Запрещает автоматический вызов моделью; описание убирается из списка, видимого модели | Вы сами выбираете момент запуска проверки, публикации или другой процедуры |
| `user-invocable: false` | Запрещает прямой пользовательский вызов `/имя` и скрывает навык из меню | Справочные знания, которые Claude должен подбирать по задаче |

Это параметры для разных участников, а не два способа спрятать пункт меню. При `user-invocable: false` вручную набранный вызов тоже не запускает навык. Для ручной процедуры оставьте этот параметр по умолчанию и задайте `disable-model-invocation: true`. Точное поведение описано в [управлении вызовом навыков](https://code.claude.com/docs/en/skills#control-who-invokes-a-skill).

Ручной запуск особенно полезен, когда важны выбранная ветка, готовность данных или согласованный момент действия. Сам по себе он не подтверждает разрешение на каждую дальнейшую операцию: инструкции навыка и настройки разрешений остаются отдельными частями системы.

### Пример: короткий разбор одного файла

Ниже — небольшой навык, который готовит замечания к коду. Он не устанавливает пакеты, не запускает тесты и не предлагает автоматически исправлять всё найденное. Для использования нужен работающий Claude Code и доступный для чтения файл в открытом проекте.

Создайте в своём проекте `.claude/skills/review-note/SKILL.md` с таким содержимым. Имя `SKILL.md` должно быть именно таким; открывающая строка `---` должна быть первой строкой файла.

```markdown
---
name: review-note
description: Готовит короткий разбор одного файла с конкретными замечаниями к коду.
argument-hint: путь-к-файлу
disable-model-invocation: true
---

Разбери файл $ARGUMENTS.

1. Если путь не указан, попроси указать один файл и остановись.
2. Прочитай файл. Если он недоступен, сообщи об этом и не выдумывай содержимое.
3. Найди ошибки логики, обработки входных данных и ошибок выполнения.
4. Для каждого замечания укажи строку, последствие и предлагаемое исправление.
5. Если конкретных замечаний нет, напиши «Замечаний в рамках этого разбора нет».

Не редактируй файлы, не запускай команды и не обращайся к внешним сервисам.
Не утверждай, что тесты проходили: здесь выполняется чтение и разбор кода.
```

После сохранения проверьте наличие навыка через `/skills` и вызовите его, например:

```text
/review-note src/example.ts
```

Замените `src/example.ts` реальным путём. Текст после имени попадёт в `$ARGUMENTS`. Успешный результат — ответ о выбранном файле с конкретными замечаниями и строками либо явное сообщение, что замечаний не найдено. Если файл не существует, ожидается сообщение об отсутствии файла. Это проверяет понятность процедуры, но не доказывает, что модель найдёт все ошибки.

Запреты в теле примера являются инструкциями Claude. Они не создают техническую изоляцию инструментов. Для первого знакомства мы не добавляем автоматических разрешений: действуют обычные настройки вашей среды.

Когда процедура вырастет, рядом с `SKILL.md` можно положить `examples.md`, справочный файл или каталог `scripts/`. В основном файле укажите, когда читать каждый материал. Это позволяет загружать детали по необходимости, а не превращать одну инструкцию в большой справочник. [Официальная документация](https://code.claude.com/docs/en/skills#add-supporting-files) описывает такую структуру как часть пакета навыка. Соседний [обзор направлений применения навыков](https://blog.laozhang.ai/ru/posts/claude-code-best-skills) поможет различить работу с документами, проверку веб-приложений и собственные процедуры команды; приведённые там перечни относятся к дате того обзора.

### `allowed-tools` не означает «только эти инструменты»

Если в метаданных указано `allowed-tools: Read`, Claude получает предварительное разрешение на `Read` в ходе вызова навыка. Остальные инструменты при этом не исчезают: для них продолжают действовать обычные разрешения. Поэтому такой параметр нельзя описывать как гарантию режима только для чтения.

Для удаления инструментов из доступного набора предназначен `disallowed-tools`. И разрешение `allowed-tools`, и ограничение `disallowed-tools` заканчиваются при следующем сообщении пользователя. Текст вызванного навыка при этом остаётся в разговоре на последующих ходах, хотя при сокращении контекста действуют ограничения его сохранения. Это разные сроки действия. См. [разрешения навыков](https://code.claude.com/docs/en/skills#pre-approve-tools-for-a-skill) и [жизненный цикл их содержимого](https://code.claude.com/docs/en/skills#skill-content-lifecycle).

В организациях есть дополнительное условие: при `allowManagedPermissionRulesOnly` Claude Code версии 2.1.282 и новее игнорирует `allowed-tools` из затронутых этой политикой источников, в том числе пользовательских и проектных навыков. Такие инструменты проходят через управляемые правила организации и обычный запрос разрешения. [Описание управляемой политики](https://code.claude.com/docs/en/skills#when-only-managed-permission-rules-apply) важнее примера из чужого репозитория.

## Hook привязывает обработчик к событию

У настройки hook три части: **событие**, **фильтр (`matcher`)** и **обработчик**. Событие определяет момент, например `PreToolUse` перед вызовом инструмента. Фильтр выбирает подходящие вызовы, например `Edit` и `Write`. Обработчик выполняет работу и возвращает результат.

В текущей документации описаны пять типов обработчиков:

| `type` | Что выполняется | Для какой задачи подходит |
| --- | --- | --- |
| `command` | Локальная команда или скрипт; JSON события поступает в стандартный ввод | Небольшая проверка аргументов, запуск существующего скрипта |
| `http` | POST-запрос с данными события | Обработка на собственном сервере или в службе аудита |
| `mcp_tool` | Вызов инструмента настроенного MCP-сервера | Проверка через уже подключённую интеграцию |
| `prompt` | Один вызов модели для принятия решения | Оценка, для которой достаточно данных события |
| `agent` | Проверка моделью с несколькими ходами и доступом к инструментам | Проверка состояния файлов или проекта; тип экспериментальный |

Не каждый тип поддерживается каждым событием. Перед настройкой проверьте сочетание в [справочнике hooks](https://code.claude.com/docs/en/hooks); примеры для одного события нельзя переносить на другое только заменой имени.

Фиксирован именно момент запуска обработчика при подходящем событии, а не правильность его ответа. Скрипт может выдавать воспроизводимое решение по строго заданному правилу. `prompt` и `agent` принимают решение с участием модели: они добавляют задержку и расход на её работу, а результат зависит от формулировки и доступных данных. Hooks допускают такие оценки; запрещать любые сложные суждения в них неправильно. Однако оценка «изменение достаточно качественное» не становится гарантией качества только потому, что выполняется автоматически. [Руководство](https://code.claude.com/docs/en/hooks-guide#prompt-based-hooks) отдельно объясняет модельные обработчики.

## Пример hook: не давать Edit и Write менять учебный файл

Для первого опыта удобнее выбрать правило, результат которого легко проверить. Наш обработчик запрещает инструментам `Edit` и `Write` менять файл с именем `demo-locked.txt`. Он ничего не записывает и не выполняет строку из входного JSON.

Нужен Node.js, доступный через команду `node`. В корне своего учебного проекта создайте каталог `scripts`, если его ещё нет, и сохраните следующий скрипт как `scripts/check-demo-lock.mjs`:

```javascript
import fs from 'node:fs';
import path from 'node:path';

function block(message) {
  console.error(message);
  process.exit(2);
}

let event;
try {
  event = JSON.parse(fs.readFileSync(0, 'utf8'));
} catch {
  block('Некорректный JSON события.');
}

if (event?.hook_event_name !== 'PreToolUse') {
  block('Этот обработчик предназначен только для PreToolUse.');
}

if (!['Edit', 'Write'].includes(event.tool_name)) {
  process.exit(0);
}

const filePath = event.tool_input?.file_path;
if (typeof filePath !== 'string' || filePath.length === 0) {
  block('Во входе Edit/Write отсутствует file_path.');
}

const basename = path.win32.basename(path.posix.basename(filePath));
if (basename === 'demo-locked.txt') {
  block('Учебный файл demo-locked.txt менять запрещено.');
}

process.exit(0);
```

Проверьте скрипт отдельно от Claude Code. В терминале из корня учебного проекта передайте ему два небольших входа:

```bash
printf '%s\n' '{"hook_event_name":"PreToolUse","tool_name":"Write","tool_input":{"file_path":"notes/demo-locked.txt"}}' | node scripts/check-demo-lock.mjs
echo "$?"

printf '%s\n' '{"hook_event_name":"PreToolUse","tool_name":"Edit","tool_input":{"file_path":"notes/draft.txt"}}' | node scripts/check-demo-lock.mjs
echo "$?"
```

В первом случае ожидаются сообщение о запрете в стандартном потоке ошибок и код `2`. Во втором — пустой вывод и код `0`. Такие проверки можно выполнить без установленного hook: они проверяют скрипт и его входные данные.

Для привязки к Claude Code добавьте эту запись в объект `hooks` проектного файла `.claude/settings.local.json`. Если файл уже содержит настройки, объедините записи: не заменяйте весь файл и не удаляйте другие обработчики.

```json
{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "^(Edit|Write)$",
        "hooks": [
          {
            "type": "command",
            "command": "node \"$CLAUDE_PROJECT_DIR/scripts/check-demo-lock.mjs\""
          }
        ]
      }
    ]
  }
}
```

`$CLAUDE_PROJECT_DIR` указывает на корень проекта, поэтому имя скрипта совпадает с местом его сохранения. Показанная командная строка рассчитана на среду, где используемая оболочка раскрывает переменные в таком виде. Проверяйте это в своём окружении, особенно при переносе между операционными системами.

Затем откройте `/hooks`: запись должна появиться у `PreToolUse`. В учебной сессии проверьте попытку записи именно через `Edit` или `Write`. Ожидаемый результат при обращении к `demo-locked.txt` — отказ перед выполнением этого вызова. Если настройки не появились, сначала проверьте JSON, расположение файла и наличие скрипта. Наблюдатель за файлами обычно подхватывает изменения автоматически; если этого не произошло, перезапустите сеанс. Эти шаги соответствуют [официальному руководству по настройке](https://code.claude.com/docs/en/hooks-guide).

Мы проверили синтаксис приведённых JSON/YAML и работу скрипта на искусственных входах: запрет учебного имени, разрешённое имя, пропущенный путь и повреждённый JSON. Настоящий вызов инструментов Claude Code и оценку моделью в рамках этой проверки не запускали.

**Это учебная проверка имени, а не защита файловой системы.** Она не охватывает `Bash`, другие инструменты записи, внешние процессы или обходные пути к тому же файлу. Используйте её, чтобы разобраться в связи события, фильтра и результата; для реального ограничения доступа нужны подходящие разрешения и более полная проверка угроз.

## Что означают коды выхода и когда поздно блокировать

Для нашего `command`-обработчика на `PreToolUse` код `0` без JSON означает «возражений от обработчика нет». Он не выдаёт разрешение на инструмент: дальше действует обычная процедура проверки прав. Код `2` блокирует этот вызов, а сообщение из стандартного потока ошибок объясняет причину Claude. Это точный смысл выбранного примера, а не универсальное правило для всех событий.

| Событие | Когда запускается | Что означает `exit 2` для командного обработчика |
| --- | --- | --- |
| `PreToolUse` | До выполнения инструмента | Блокирует вызов инструмента |
| `PostToolUse` | После успешного выполнения | Не отменяет сделанное; передаёт сообщение Claude |
| `Stop` | Когда Claude собирается закончить ответ | Может продолжить работу вместо завершения |
| `SessionStart` | При запуске сеанса | Не предотвращает запуск сеанса |
| `PermissionRequest` | При запросе разрешения | Этот код не задаёт отказ; решение передают в предусмотренном JSON-объекте |

См. [таблицу действий для кода 2](https://code.claude.com/docs/en/hooks#exit-code-2-behavior-per-event). Для большинства событий другой ненулевой код с пустым выводом означает неблокирующую ошибку обработчика, но у событий есть исключения. Валидный структурированный JSON также может определять результат по своим правилам. Поэтому в одном небольшом обработчике удобнее выбрать один протокол: в нашем примере это только код выхода и сообщение об ошибке, без JSON на выходе. [Полное описание протокола](https://code.claude.com/docs/en/hooks#exit-code-output) потребуется для более сложных решений.

У модельного `prompt`-обработчика другой формат ответа: `ok` и `reason`. Например, при `Stop` отрицательное решение может заставить Claude продолжать работу. Если условие завершения сформулировано слишком широко, получатся повторные оценки и лишние продолжения. Задавайте достижимый критерий и предусмотрите случай, когда продолжать бессмысленно; не используйте бесконечную проверку «сделай идеально».

## Когда объединять навык и hook

Комбинация полезна, когда у частей разные задачи. Например, `/release-note` запускает по вашему выбору навык подготовки описания релиза. Навык задаёт порядок: прочитать изменения, отметить несовместимости, перечислить проверки. Отдельный hook проверяет конкретный аргумент инструмента перед записью. Один обеспечивает процедуру работы, другой — своевременный запуск узкой проверки.

![Навык подготовки релиза и узкая проверка аргумента инструмента через PreToolUse](https://blog.laozhang.ai/posts/ru/claude-code-hooks-slash-commands-skills/img/composition-pattern.webp)

Не добавляйте hook только потому, что рядом уже есть навык. Если вам нужен один разбор файла, достаточно примера `/review-note`. Если проверка должна повторяться при каждом подходящем вызове инструмента, настройте событие. Для доступа к внешним данным сначала должен существовать соответствующий инструмент или подключение: текст навыка сам по себе такого доступа не создаёт.

При сочетании частей учитывайте их сроки действия. Hooks из настроек зависят от области файла: `~/.claude/settings.json` относится к личным проектам на машине, `.claude/settings.json` — к общим настройкам проекта, `.claude/settings.local.json` — к локальным настройкам этого проекта. Hook можно описать и в метаданных навыка. После вызова навыка такой обработчик сейчас остаётся зарегистрированным до конца сеанса; `once: true` снимает его после первого успешного выполнения. Hooks субагента действуют лишь пока работает этот субагент. Это не тот же срок, что у `allowed-tools`. См. [расположение hooks](https://code.claude.com/docs/en/hooks#hook-locations) и [hooks в навыках и агентах](https://code.claude.com/docs/en/hooks#hooks-in-skills-and-agents).

Если одному событию соответствуют несколько hooks, они выполняются параллельно, а результаты объединяются после завершения. Отказ одного не предотвращает побочный эффект другого. Для решений `PreToolUse` приоритет идёт от наиболее строгого: `deny`, затем `defer`, `ask`, `allow`. Асинхронный обработчик также не может задним числом предотвратить уже выполненное действие. Эти ограничения важны, например, когда рядом с проверкой стоит отправка данных или изменение файла. [Правила объединения результатов](https://code.claude.com/docs/en/hooks-guide#combine-results-from-multiple-hooks) объясняют, почему наличие запрета ещё не означает, что остальные обработчики ничего не сделали.

## Частые вопросы

### Нужно ли переносить старые пользовательские команды в skills?

Нет, существующие `.claude/commands/*.md` продолжают работать. Перенос имеет смысл, если нужны вспомогательные файлы и более удобная структура пакета. Новую процедуру обычно удобнее оформить как навык, но старый файл не становится ошибкой только из-за своего каталога. Это прямо указано в [документации навыков](https://code.claude.com/docs/en/skills).

### Какой командой вызвать навык для работы с Claude API?

Используйте `/claude-api`; например, `/claude-api migrate` запускает предусмотренную процедуру миграции. Это навык, поставляемый с Claude Code, а не команда установки SDK. Он может включаться и автоматически, когда код импортирует `anthropic` или `@anthropic-ai/sdk`. Доступность конкретных подкоманд зависит от версии: сверяйтесь с [разделом о проектах Claude API](https://code.claude.com/docs/en/skills#work-on-claude-api-projects), а текущий список своей среды смотрите через `/help` и `/skills`.

### Почему навык виден, но ограничение из его метаданных не работает?

Проверьте регистр `SKILL.md`, первую строку `---`, корректность YAML и точное написание параметра. Неизвестное поле может быть проигнорировано, а при повреждённом YAML навык может загрузиться без заданных полей. Поэтому присутствие в списке не доказывает, что `disable-model-invocation` или инструментальные ограничения применились. Правила разбора описаны в [справочнике метаданных](https://code.claude.com/docs/en/skills#frontmatter-reference).

### Hook надёжнее навыка?

Для запуска проверки в заданный момент hook подходит лучше: его вызывает событие, а не решение Claude вспомнить инструкцию. Но надёжность самой проверки зависит от обработчика и охвата. `prompt` и `agent` по-прежнему используют модель, а узкий скрипт проверяет только запрограммированные случаи. Навык удобнее для объяснения процедуры, примеров и критериев разбора; hook — для привязки выбранной работы к событию.

Начните с одной задачи и одного проверяемого результата. Для ручного разбора файла достаточно навыка и `/review-note путь`; для проверки перед `Edit` или `Write` — небольшого `PreToolUse`-обработчика. Добавляйте следующую часть, когда можете назвать конкретное действие, которое первая часть не обеспечивает.

## Источники

Внешние страницы, на которые ссылается это руководство, в порядке упоминания. Последнее обновление: 2026-10-05.

- [документации Claude Code, проверенной 4 октября 2026 года](https://code.claude.com/docs/en/skills) (code.claude.com)
- [справочнике команд](https://code.claude.com/docs/en/commands) (code.claude.com)
- [справочнике hooks](https://code.claude.com/docs/en/hooks) (code.claude.com)
- [Руководство](https://code.claude.com/docs/en/hooks-guide) (code.claude.com)
