Агенты8 минобновлено Максим Самусь

Скиллы Claude Code своими руками

Вся система, из которой эти статьи, лежит в ClaudeBase - 990 ₽ в месяц. Файлы устанавливаются в проект по инструкции.

Что понадобится

  • Установленный Claude Code. Проверяется командой claude --version - всё ниже я прогнал на версии 2.1.259.
  • Терминал - тот, что уже есть в системе.
  • Любой текстовый редактор. Первый рабочий скилл - это одна папка и один файл.

Если само слово пока не оформилось - короткое объяснение в словаре. Про сам инструмент - что такое Claude Code.

Главное, что надо понять до первой команды

Скилл - это папка, а в ней файл SKILL.md. Больше ничего обязательного нет.

Сам файл состоит из двух частей: шапка между строчками из трёх дефисов и обычный текст под ней.

---
name: otchyot-po-dnyu
description: Собирает отчёт за день из моих заметок. Звать, когда прошу подвести итоги дня.
---

## Что делать

1. Прочитать заметки за сегодня.
2. Собрать три пункта: сделано, застряло, на завтра.
3. Показать списком, без вступления.

А теперь то, из-за чего люди чаще всего мажут. Агент не читает твой скилл целиком. В контекст каждой сессии попадает только строчка description - список в духе «что у меня вообще есть под рукой». Тело файла подгружается в тот момент, когда агент решил, что скилл подходит под задачу, или когда ты позвал его руками.

Это видно цифрами. Команда claude plugin details принимает имя установленного плагина - вот её ответ для плагина, внутри которого лежит один скилл:

claude plugin details frontend-design

Component inventory
  Skills (1)  frontend-design

Projected token cost
  Always-on:   ~78 tok   added to every session

Per-component (rounded)
  component        always-on  on-invoke
  frontend-design        ~80      ~2.7k

Меньше сотни токенов висят всегда, две с лишним тысячи приезжают только при срабатывании. У своего скилла, который лежит просто папкой, эта команда цифр не покажет - она работает по имени плагина, - но устроено там ровно так же. Отсюда весь практический вывод: описание важнее инструкции. Плохо описанный скилл не сработает никогда, каким бы толковым ни было тело.

Шаг 1. Найти папку скиллов {#shag-1}

Мест три, и разница между ними только в том, кто скилл увидит:

Куда положил Путь Кто видит
себе ~/.claude/skills/имя/SKILL.md все твои проекты
в проект .claude/skills/имя/SKILL.md только этот проект
в плагин плагин/skills/имя/SKILL.md там, где плагин включён

Начинай с первого, он общий:

mkdir -p ~/.claude/skills/otchyot-po-dnyu

Имя папки пиши латиницей через дефис. Это не косметика: имя папки становится командой. Папка otchyot-po-dnyu даст команду /otchyot-po-dnyu. Поле name в шапке на это не влияет - я специально прописал в файле одно имя, а папку назвал другим, и агент показал имя папки.

Ещё две вещи про расположение, которые экономят вечер:

  • Проектные скиллы подхватываются не только из папки, где ты запустил агента, но и из всех папок выше - до корня репозитория. Запустился в подпапке - скиллы из корня всё равно приедут.
  • При совпадении имён личный скилл перекрывает проектный. Скиллы из плагинов не конфликтуют ни с чем: они живут с приставкой, плагин:скилл.

Шаг 2. Написать SKILL.md {#shag-2}

Открой в папке файл SKILL.md и положи туда шапку с описанием и текст инструкции.

Обязательных полей в шапке нет вообще. Рекомендуется одно - description. Всё остальное по желанию:

Поле Зачем
description когда звать скилл. Единственное, что агент видит всегда
when_to_use добавка к описанию: фразы-триггеры, примеры просьб
allowed-tools какие инструменты доступны агенту, пока работает скилл
disable-model-invocation true - агент не зовёт скилл сам, только ты слешем
user-invocable false - наоборот, скрыть из меню, звать может только агент

Про описание есть жёсткая рамка: description вместе с when_to_use обрезаются на 1536 символах в общем списке скиллов. То есть простыня в описании не просто бесполезна - её хвост физически не доедет.

Как писать описание, чтобы работало: не «что внутри», а «в какой ситуации меня звать», причём теми словами, которыми ты сам ставишь задачу. Сравни.

Плохо: description: Инструкция по сборке отчёта.

Хорошо: description: Собирает отчёт за день из заметок. Звать, когда прошу подвести итоги дня, спрашиваю «что я сегодня сделал» или прошу отчёт за вчера.

Тело - обычный текст. Пиши шагами, как объяснял бы человеку, который делает это первый раз. Рядом в папке можно держать что угодно: примеры, шаблоны, скрипты - агент дочитает их, когда понадобится.

Шаг 3. Проверить формат командой {#shag-3}

Не на глаз. У Claude Code для этого есть проверялка - ей скармливают папку, внутри которой лежит skills:

claude plugin validate ~/.claude

Так выглядит здоровый ответ:

Validating components in: /Users/имя/.claude

✔ Validation passed

А так - когда в файле забыли описание:

⚠ Found 1 warning:

  ❯ description: No description in frontmatter. A description helps
    users and Claude understand when to use this skill.

✔ Validation passed with warnings

Последняя строка важна: это предупреждение, а не ошибка, проверка всё равно проходит. Хочешь, чтобы предупреждения считались ошибками (например, в проверке перед коммитом) - добавь --strict.

Шаг 4. Убедиться, что агент его видит {#shag-4}

Проверка формата - это ещё не «агент подключил». Смотри с двух сторон.

Изнутри сессии набери:

/skills

Твоё имя должно быть в списке.

Снаружи, не открывая сессию:

claude -p "Есть ли у тебя скилл otchyot-po-dnyu? Ответь одним словом: ДА или НЕТ."

Я так и проверял проектный скилл: положил папку в .claude/skills/, запустил эту команду в корне проекта и получил ДА. Способ хорош тем, что честный: отвечает не файловая система, а сам агент.

Шаг 5. Позвать и посмотреть, как срабатывает {#shag-5}

Два режима, проверять надо оба.

Руками - слеш и имя папки:

/otchyot-po-dnyu

Агент должен сделать ровно то, что написано в теле. У меня в проверочном скилле было написано «ответь словом РАБОТАЕТ» - агент ответил РАБОТАЕТ.

Сам - сформулируй задачу словами из описания и ничего про скилл не говори. Подключился молча - описание попало в цель. Не подключился - переписывай описание, а не инструкцию.

Правки в SKILL.md подхватываются на лету, перезапускать сессию не надо. Исключение одно: если самой папки skills не было в момент старта сессии и ты создал её только что - сессию перезапусти, иначе агент за ней не следит.

Куда смотреть, если что-то не так

Что видишь Что это значит
No frontmatter block found перед первой чертой из трёх дефисов есть пустая строка или пробел - шапка не читается вообще
No description in frontmatter нет строки description, агент не поймёт, когда звать
скилла нет в списке /skills папка не там, где ищет агент, либо папку skills ты создал уже после старта сессии
скилл в списке есть, но не срабатывает сам описание не про повод позвать; допиши в него свои формулировки задачи
позвал слешем - «команда не найдена» смотри на имя папки, а не на поле name: команда собирается из папки

Отдельно про первую строку - на ней спотыкаются чаще всего. Шапка читается, только если три дефиса стоят самой первой строкой файла. Один перевод строки выше - и весь файл считается телом, а описания у скилла как бы нет. Проверялка это ловит, глаз - нет.

Пять ошибок, на которых теряют вечер

  1. Писать описание про содержание, а не про повод. «Инструкция по отчётам» агенту ничего не говорит. «Звать, когда прошу подвести итоги дня» - говорит.
  2. Пустая строка перед шапкой. Файл выглядит правильным, а описания у скилла нет. Лечится claude plugin validate.
  3. Называть папку по-русски или с пробелом. Имя папки становится командой - держи латиницу и дефисы.
  4. Ждать, что агент прочитает тело заранее. Он не прочитает. Всё, что должно влиять на решение звать или не звать, живёт в описании.
  5. Складывать в один скилл три задачи. Описание становится размытым, и агент не зовёт его нигде. Один скилл - одна работа.

Что дальше

Дальше это обычно растёт само: один скилл на отчёты, второй на письма, третий на разбор выгрузки. Через месяц половина рабочих задач начинается с того, что агент молча подключает нужный. Всё, что я собрал для своих проектов, лежит в ClaudeBase - файлы кладутся в проект по инструкции, и агент читает их в работе.

Спрашивают

Пять вопросов по теме

Куда класть скилл - себе или в проект?

Себе, в ~/.claude/skills/, если он нужен во всех проектах: письма, посты, отчёты. В проект, в .claude/skills/, если он про этот код и должен уехать в репозиторий вместе с ним. При совпадении имён личный перекрывает проектный.

Надо ли перезапускать Claude Code после того, как добавил скилл?

Правки в SKILL.md и новые папки скиллов подхватываются на лету, в текущей сессии. Перезапуск нужен в одном случае: если самой папки skills не было в момент старта сессии и ты создал её только что.

Скилл лежит на месте, но агент его не зовёт - в чём дело?

Почти всегда дело в описании. Агент видит только строку description и сравнивает её с задачей. Опиши не что внутри, а в какой ситуации звать, и добавь фразы, которыми ты сам эту задачу формулируешь.

Скиллы едят контекст? Сколько их можно держать сразу?

Постоянно висит только описание каждого скилла, тело подгружается при срабатывании. Порядок цифр посмотри у любого установленного плагина: claude plugin details и его имя - команда печатает always-on и on-invoke отдельно. Когда скиллов набирается очень много, список упирается в лимит и часть описаний обрезается до одних имён. Поэтому длинные описания вредны, а длинные инструкции - нет.

Как убрать скилл или запретить агенту звать его самому?

Убрать - удалить папку скилла. Оставить, но выключить самозапуск - дописать в шапку disable-model-invocation: true, тогда скилл срабатывает только когда ты позвал его слешем.

Источники

Максим Самусь · проверено на своих проектах