Skill - это способ оформить повторяемую процедуру как продукт: каталог с файлом SKILL.md и опциональными вспомогательными файлами. Он появляется как slash-команда и может автоматически подбираться Claude по своему description. Старые команды в .claude/commands/*.md остаются совместимыми, но каталог-skill удобнее - в него кладут не только инструкцию, но и скрипты, примеры и references. Ключевое различие с командой: skill авто-триггерится по релевантности задачи, а команда - это явный вызов человеком.
Skills живут в нескольких местах с понятной семантикой имени. Project-skill - в .claude/skills/<command>/SKILL.md, user-skill - в ~/.claude/skills/, plugin-skill - в skills/ плагина, legacy-команды - в .claude/commands. В project- и user-skill имя команды берётся из имени каталога, а поле name во frontmatter меняет отображаемый ярлык; в plugin-skill команда пространственно именована как /plugin-name:skill-name. Это позволяет держать одноимённые навыки из разных источников без конфликтов.
Хороший skill начинается с честного frontmatter и проверяемого тела. Полезно один раз увидеть цельный пример - навык review-change: с description для автоподбора, disable-model-invocation, argument-hint, объявленными аргументами и узким allowed-tools, а в теле - пронумерованная процедура ревью. Named-аргументы объявляют во frontmatter, и это безопаснее shell-подобных догадок: в теле доступны $ARGUMENTS, индексные $0, именованные $base и служебные переменные вроде ${CLAUDE_SKILL_DIR}.
У аргументов есть тонкость подстановки, которую надо знать. Отсутствующий индексный аргумент остаётся в тексте буквально, а отсутствующий именованный становится пустой строкой - поэтому в теле явно задают fallback-инструкцию на случай пустого значения. Иначе навык, вызванный без аргумента, подставит пустоту и поведёт себя не так, как задумано. Проверяемость навыка начинается ровно здесь: с ясного поведения при отсутствующем и при заданном аргументе.
Frontmatter - это карта решений, и каждое поле оправдывается ролью навыка, а не открывается для полноты. description и when_to_use нужны для автоподбора; disable-model-invocation - когда запускать должен только человек; allowed-tools и disallowed-tools - для точечного контроля инструментов; model и effort - когда качество и стоимость измерены; context: fork - когда шумную работу выносят в отдельный контекст. Полную карту ключевых полей удобно держать перед глазами таблицей.
Полезно один раз свести ключевые поля frontmatter в таблицу, чтобы выбирать осознанно. Ниже такая карта. Важные оговорки: allowed-tools действует только на turn вызова и не должен быть широким; context: fork изолирует контекст, но результат всё равно влияет на основную сессию; disable-model-invocation заодно предотвращает автоматический preload в субагент и запуск по расписанию. Поле открывают не для полноты, а под конкретную потребность навыка.
| Поле frontmatter | Использовать когда |
|---|---|
| description / when_to_use | Нужен надёжный автоподбор |
| disable-model-invocation | Запускать должен только человек |
| user-invocable: false | Это фоновое знание, не команда меню |
| allowed-tools / disallowed-tools | Точечный контроль инструментов на turn |
| model / effort | Качество и стоимость измерены |
| context: fork / agent | Шумную работу - в отдельный контекст |
Progressive disclosure держит контекст дешёвым. В списке навыков видны только name и description, а полный body загружается при активации и остаётся в контексте последующих turns. Поэтому SKILL.md держат коротким: большую спецификацию выносят в references/, скрипты - в scripts/, а ссылаются на них через ${CLAUDE_SKILL_DIR}, а не через текущий рабочий каталог. Так навык подгружает тяжёлое только когда действительно нужен, а не занимает контекст всегда.
Качество навыка проверяют как продукта, а не на глаз. Собирают 5-10 реальных промптов - позитивных, негативных и пограничных; проверяют автоматический триггер и отсутствие ложных срабатываний; проверяют выданные инструменты и отрицательный security-случай; сравнивают результат с ручным чек-листом; версионируют изменения. Skills и agents перечитываются на лету после правки. Оформляйте повторяемое как продукт - и проверяйте его так же.
---
name: Review change
description: Review the current change for correctness, security, regressions,
and missing tests. Use after implementation and before commit.
disable-model-invocation: true
argument-hint: "[base-ref]"
arguments: [base]
allowed-tools: Read, Grep, Glob, Bash(git diff:*)
---
If `$base` is non-empty, review the diff against that Git reference.
Otherwise review the working tree and staged diff.
1. Read the complete diff and relevant callers.
2. Rank findings by severity, include file paths.
3. If there are no findings, state residual risks and verification performed.