AmigaОбучение ИИ
Модуль 1 · Навыки · урок 3 из 6

Конфигурация и многофайловые навыки

14 мин чтения▶ есть видеоверсия

Первый навык умещался в один файл и обходился двумя полями шапки. Настоящие командные навыки быстрее становятся сложнее: у них есть длинные справочники, скрипты, ограничения на инструменты и особые режимы запуска. В этом уроке — все нужные настройки и принцип «SKILL.md короткий, детали — в соседних файлах».

Поля шапки, которые вам понадобятся

Полный список есть в документации. Ниже — те, что решают реальные задачи.

Поле Что делает
name Отображаемое имя. Для проектных и личных навыков команда всё равно берётся из имени папки.
description Условие срабатывания. Вместе с when_to_use ограничено 1 536 символами в списке навыков.
when_to_use Дополнительные фразы-триггеры и примеры просьб. Дописывается к описанию.
argument-hint Подсказка в автодополнении: [версия], [файл] [формат].
arguments Имена позиционных аргументов: [component, from, to]$component, $from, $to.
disable-model-invocation true — только ручной вызов. Описание не попадает в контекст, Claude сам навык не применит.
user-invocable false — только автоматический вызов. Навык скрыт из меню /.
allowed-tools Инструменты, которые на ход вызова навыка не требуют подтверждения.
disallowed-tools Инструменты, убранные из доступных, пока навык активен.
model, effort Модель и уровень усилий для этого навыка.
context fork — выполнить в отдельном субагенте, без истории разговора.
agent Какой субагент используется при context: fork: Explore, Plan, general-purpose или свой.
background При context: fork — в фоне (true, по умолчанию) или дождаться результата (false).
paths Glob-шаблоны: навык срабатывает автоматически только при работе с подходящими файлами.
hooks Хуки, которые регистрируются при вызове навыка и живут до конца сессии.

Кто вызывает: четыре сочетания

Два булевых поля дают четыре режима.

  • По умолчанию — и вы, и Claude. Описание в контексте, команда в меню. Для большинства рабочих навыков.
  • disable-model-invocation: true — только вы. Для всего, что имеет побочные эффекты: деплой, рассылка, удаление. Claude не должен решать сам, что «пора выкатывать».
  • user-invocable: false — только Claude. Для справочной информации: соглашения по API, описание архитектуры легаси-модуля. Человек такое командой не вызывает, а Claude подтянет, когда работает с этим кодом.
  • Оба — навык выключен, но файл остаётся. Удобно на время отладки.

Инструменты: разрешить заранее или убрать

allowed-tools — это предварительное разрешение, а не ограничение. Инструменты из списка не будут спрашивать подтверждения на том ходу, когда навык вызван. Остальные инструменты никуда не деваются и по-прежнему подчиняются вашим настройкам прав. Грант действует один ход: на следующем вашем сообщении он сбрасывается, хотя текст навыка остаётся в контексте.

yaml
allowed-tools: Bash(git log *) Bash(git describe *) Bash(git diff *)

Так навык релиз-нот выполнит git log, не задавая вопросов, а вот git push спросит, как обычно.

disallowed-tools — наоборот, убирает инструменты из доступных, пока навык активен. Ограничение тоже снимается на следующем сообщении. Для навыка «только анализ» можно убрать Write и Edit.

Важная оговорка про безопасность. allowed-tools проектного навыка применяется всегда, когда навык вызван, — доверие к папке это не ограничивает. Навык из чужого репозитория может выдать себе широкие права. Прежде чем запускать Claude Code в клонированном проекте, посмотрите, что лежит в его .claude/skills/.

context: fork запускает навык не в текущем разговоре, а в субагенте: тело SKILL.md становится заданием, истории разговора субагент не видит. Это нужно, когда навык порождает много вывода — например, полный аудит доступности по сотне компонентов. Результат вернётся отчётом, а сто прочитанных файлов останутся за кадром.

yaml
---
name: a11y-audit
description: Полный аудит доступности директории с компонентами. Используй, когда просят проверить a11y, доступность или WCAG для целого раздела или проекта.
context: fork
agent: Explore
background: false
---

agent: Explore даёт быстрого субагента с правами только на чтение; он не читает CLAUDE.md, поэтому все правила должны быть в самом навыке. background: false заставляет дождаться результата, а не продолжать разговор параллельно. Подробнее о том, как субагенты работают, — в курсе «Субагенты в Claude Code».

Живые данные внутри навыка

Строка вида !`команда` в теле навыка выполняется до того, как Claude увидит текст, и её вывод подставляется на место. Так навык получает актуальные данные без лишнего хода:

markdown
## Коммиты с последнего тега
!`git log $(git describe --tags --abbrev=0)..HEAD --oneline`

Сгруппируй изменения выше по разделам шаблона.

Если команда завершилась с ошибкой, вызов навыка прерывается целиком и Claude тела не увидит. Для команд поиска вроде grep и git diff код возврата 1 («ничего не найдено») считается нормальным, а 2 и выше — ошибкой.

Многофайловый навык

Главное правило: SKILL.md не длиннее 500 строк, и в нём — только то, что нужно в каждом вызове. Всё остальное — в соседние файлы, на которые SKILL.md ссылается. Claude читает их, когда доходит до соответствующего шага, а не при каждом срабатывании. Так длинный справочник почти ничего не стоит, пока не понадобится.

Структура навыка проверки доступности:

text
.claude/skills/a11y-check/
├── SKILL.md            # порядок проверки и формат отчёта
├── checklist.md        # 20+ критериев WCAG с пояснениями
├── report-template.md  # шаблон отчёта для клиента
└── scripts/
    └── contrast.py     # считает контраст двух цветов

SKILL.md:

markdown
---
name: a11y-check
description: Проверяет доступность вёрстки по WCAG 2.1 AA. Используй, когда просят проверить a11y, доступность, контраст, подписи у полей или клавиатурную навигацию в компонентах или на странице.
allowed-tools: Bash(python3 ${CLAUDE_SKILL_DIR}/scripts/contrast.py *)
---

Проверь доступность файлов, которые указал пользователь: $ARGUMENTS.

1. Прочитай критерии в [checklist.md](checklist.md) и пройди по ним
   каждый файл.
2. Для каждой пары «цвет текста — цвет фона», которую найдёшь
   в стилях, посчитай контраст скриптом:
   `python3 ${CLAUDE_SKILL_DIR}/scripts/contrast.py "#333333" "#ffffff"`
   Не оценивай контраст на глаз.
3. Оформи результат по [report-template.md](report-template.md):
   для каждой проблемы — файл, строка, критерий, что сделать.
4. Ничего не исправляй. Если что-то не удалось проверить —
   напиши об этом отдельным разделом.

Ссылки на соседние файлы — обычные markdown-ссылки с относительным путём. Рядом с каждой стоит написать, зачем файл нужен, чтобы Claude понимал, когда его открывать.

${CLAUDE_SKILL_DIR} — путь к папке навыка. Он подставляется и в теле, и в allowed-tools, поэтому скрипт запускается без вопросов, где бы навык ни лежал. Есть ещё ${CLAUDE_PROJECT_DIR} — корень проекта.

Скрипт scripts/contrast.py — настоящий, считает отношение контраста по формуле WCAG:

python
#!/usr/bin/env python3
"""Контраст двух цветов по WCAG 2.1. Использование: contrast.py "#rrggbb2#rrggbb34
import sys


def channel(c: int) -> float:
    c = c / 255
    return c / 12.92 if c <= 0.03928 else ((c + 0.055) / 1.055) ** 2.4


def luminance(hex_color: str) -> float:
    h = hex_color.lstrip("#")
    if len(h) == 3:
        h = "".join(ch * 2 for ch in h)
    r, g, b = (int(h[i:i + 2], 16) for i in (0, 2, 4))
    return 0.2126 * channel(r) + 0.7152 * channel(g) + 0.0722 * channel(b)


def contrast(a: str, b: str) -> float:
    la, lb = sorted((luminance(a), luminance(b)), reverse=True)
    return (la + 0.05) / (lb + 0.05)


if __name__ == "__main__":
    if len(sys.argv) != 3:
        sys.exit("usage: contrast.py '#rrggbb' '#rrggbb'")
    ratio = contrast(sys.argv[1], sys.argv[2])
    verdict = "AA" if ratio >= 4.5 else "AA (крупный текст)" if ratio >= 3 else "не проходит"
    print(f"{ratio:.2f}:1 — {verdict}")

Смысл скрипта не в том, что модель не умеет считать, а в том, что она считает ненадёжно. Красный #E0342B на белом даёт 4.47 — формально ниже порога 4.5, и «на глаз» это не видно. Скрипт даёт ответ, который можно вставить в отчёт клиенту.

Поле paths ограничивает автоматическое срабатывание файлами по шаблону:

yaml
paths: "src/components/**/*.tsx"

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

Попробуйте сами

10–15 мин на рабочем месте
  1. Разложите навык a11y-check из урока в своём проекте: создайте четыре файла, в checklist.md перечислите хотя бы восемь критериев. Запустите python3 .claude/skills/a11y-check/scripts/contrast.py "#E0342B" "#ffffff" и убедитесь, что получили 4.47.
  2. Добавьте в навык релиз-нот из прошлого урока строку !`git log …` и allowed-tools для git-команд. Проверьте, что вызов перестал спрашивать подтверждение на git log.
  3. Сделайте копию a11y-check с context: fork и agent: Explore. Запустите оба варианта на одной директории и сравните, сколько занимает основной контекст после каждого (/context).

Коротко

  • Четыре режима вызова: по умолчанию оба, disable-model-invocation — только вы, user-invocable: false — только Claude.
  • allowed-tools — предварительное разрешение на один ход, не ограничение; disallowed-tools — убирает инструменты.
  • context: fork с agent запускает навык в субагенте; вывод не засоряет основной разговор.
  • !`команда` подставляет живые данные до того, как Claude прочтёт навык.
  • SKILL.md — до 500 строк; справочники, шаблоны и скрипты — в соседних файлах со ссылками.
  • ${CLAUDE_SKILL_DIR} — путь к папке навыка; скрипты дают проверяемые ответы там, где модель считает ненадёжно.

Видеоверсия

Сценарий озвучки · 519 слов, ≈ 4 мин

Первый навык умещался в один файл и обходился двумя полями. Настоящие командные навыки быстро становятся сложнее: у них длинные справочники, скрипты, ограничения на инструменты. Сегодня — о настройках шапки и о принципе «главный файл короткий, детали в соседних».

Начнём с того, кто вызывает навык. Два поля дают четыре режима. По умолчанию — и вы, и Claude. Поле «отключить вызов моделью» оставляет только ручной вызов — это для всего, что имеет побочные эффекты: деплой, рассылка, удаление. Claude не должен сам решать, что пора выкатывать. Поле «не вызывается пользователем» оставляет только автоматический — для справочной информации вроде соглашений по API, которую человек командой не вызывает, а Claude подтянет, когда работает с этим кодом. Оба вместе — навык выключен, но файл на месте.

Теперь инструменты. Здесь частая путаница. Поле «разрешённые инструменты» — это не ограничение, а предварительное разрешение: перечисленные инструменты не будут спрашивать подтверждения на том ходу, когда навык вызван. Остальные никуда не деваются. Грант действует один ход и сбрасывается на вашем следующем сообщении. А поле «запрещённые инструменты» — наоборот, убирает их из доступных, пока навык активен. Так навыку «только анализ» можно убрать запись и редактирование.

И оговорка про безопасность. Разрешения проектного навыка применяются всегда, когда он вызван, независимо от доверия к папке. Навык из чужого репозитория может выдать себе широкие права. Прежде чем запускать Claude Code в склонированном проекте, посмотрите, что лежит в папке навыков.

Дальше — навык в отдельном контексте. Поле «контекст: форк» запускает навык не в текущем разговоре, а в субагенте: текст навыка становится заданием, историю разговора субагент не видит. Это нужно, когда навык порождает много вывода — например, полный аудит доступности по сотне компонентов. Результат вернётся отчётом, а сто прочитанных файлов останутся за кадром. Полем «агент» выбираете, какой субагент: быстрый Explore только для чтения или универсальный.

Ещё одна возможность — живые данные. Строка с восклицательным знаком и командой в обратных кавычках выполняется до того, как Claude увидит текст, и вывод подставляется на место. Так навык релиз-нот получает список коммитов сразу, без лишнего хода. Если команда упала, вызов навыка прерывается целиком.

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

Пример — навык проверки доступности. В папке четыре файла. Главный — порядок проверки и формат отчёта. Чек-лист — двадцать критериев с пояснениями. Шаблон отчёта для клиента. И скрипт на Python, который считает контраст двух цветов по формуле. Главный файл говорит: прочитай критерии в чек-листе, для каждой пары цветов посчитай контраст скриптом, не оценивай на глаз, оформи по шаблону, ничего не исправляй.

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

И последнее — поле «пути». Оно ограничивает автоматическое срабатывание файлами по шаблону: навык проверки доступности не будет предлагаться, когда вы работаете с миграциями базы. Ручной вызов работает всегда.

Отметка хранится только в вашем браузере