Учебник Claude Code · Модуль M1 · Концепты
01

Три примитива: Commands, Subagents, Skills

Почти всё, что умеет Claude Code сверх «голого чата», собирается из трёх кирпичей. Команда оркеструет. Субагент изолирует. Скилл переиспользует. Освоишь их стыковку — дальше идёт композиция, а не новые сущности.

~18 минут источник: claude-code-best-practice Claude Code v2.1.179 · июнь 2026 a Agents · c Commands · s Skills
§0 · Зачем именно эти три

Не фичи, а грамматика

Репозиторий, по которому мы идём, помечает свои примеры ровно тремя буквами в кружках: a — agents, c — commands, s — skills. Это не случайный набор: каждый из примитивов отвечает на свой вопрос, и вместе они закрывают почти весь спектр расширения Claude Code.

Важная ремарка от создателя Claude Code, прежде чем нырять: базовый продукт сознательно держат простым. Кастомизация — это усилитель, а не входной билет.

Мой сетап на удивление ванильный. Claude Code отлично работает из коробки, поэтому я почти ничего не настраиваю. Правильного способа нет: мы строим его так, чтобы каждый использовал, кастомизировал и хакал по-своему.
Boris Cherny · создатель Claude Code · «13 Tips», янв 2026

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

§1 · Command

Команда — оркестратор.claude/commands/<name>.md

Команда — это файл-сценарий, который ты вызываешь слэшем (/commit-push-pr) или Claude подхватывает автоматически по описанию. Её роль — точка входа и дирижёр: задать пользователю вопрос, дёрнуть нужного субагента, вызвать скилл, собрать результат. Ключевая ценность — детерминизм: то, что ты делаешь по десять раз в день, перестаёт зависеть от того, как ты сегодня сформулировал промпт.

Используй слэш-команды для каждого «inner loop»-воркфлоу, который повторяешь много раз в день. Это избавляет от повторного промптинга и позволяет самому Claude пользоваться этими воркфлоу.
Boris Cherny · «Use Slash Commands for Inner Loop Workflows»

Frontmatter: 16 полей

YAML-шапка управляет тем, как команда исполняется. Минимум — пустой frontmatter (имя возьмётся из имени файла); всё остальное опционально, но именно эти поля превращают команду из «текстовой заготовки» в управляемый процесс.

Frontmatter команды · Claude Code v2.1.179
ПолеТипReqНазначение
namestringnoИмя и /слэш. По умолчанию — имя директории.
descriptionstringrecЧто делает. Видно в автокомплите и используется Claude для авто-подхвата.
when_to_usestringnoТриггер-фразы и примеры запросов. Дописывается к description, входит в лимит 1536 символов.
argument-hintstringnoПодсказка в автокомплите, напр. [issue-number].
argumentsstr/listnoИменованные позиционные аргументы для подстановки $name.
disable-model-invocationboolnotrue — запретить Claude вызывать команду самому.
user-invocableboolnofalse — спрятать из меню /, оставив фоновым знанием.
pathsstr/listnoGlob-паттерны: активировать только при работе с подходящими файлами.
allowed-toolsstringnoИнструменты без запроса разрешения, пока команда активна.
disallowed-toolsstr/listnoИнструменты, убранные из пула. Сбрасывается со следующим сообщением.
modelstringnoМодель на время выполнения: haiku/sonnet/opus.
effortstringnoУровень усилия: low…max.
contextstringnofork — выполнить в изолированном субагент-контексте.
agentstringnoТип субагента при context: fork (по умолч. general-purpose).
shellstringnoШелл для !`команд`: bash или powershell.
hooksobjectnoLifecycle-хуки, привязанные к этой команде.

Живой пример из репо

Команда /weather-orchestrator ничего не делает руками — она дирижирует. Обрати внимание на allowed-tools (только то, что нужно дирижёру) и на «Execution Contract» в теле: команде запрещено доставать данные самой, она обязана делегировать.

.claude/commands/weather-orchestrator.mdcommand
---
description: Fetch Dubai weather and create an SVG weather card
model: haiku
allowed-tools:
  - AskUserQuestion
  - Agent
  - Skill
---

# Weather Orchestrator Command

## Execution Contract (non-negotiable)
You MUST complete this command by delegating to the weather-agent subagent.
You are forbidden from:
- Fetching weather data yourself via Bash, WebFetch, or any other tool
- Calling weather-svg-creator before the agent returns a temperature

## Workflow
Step 1 — AskUserQuestion: Celsius or Fahrenheit?
Step 2 — Agent tool → weather-agent (returns temp + unit)
Step 3 — Skill tool → weather-svg-creator (writes svg + md)
Команда как контракт: модель дешёвая (haiku), инструменты урезаны до трёх, а тело прямо запрещает «срезать углы». Дисциплина важнее ума, когда задача — координация.
Цифра для контекста

В Claude Code 85 встроенных слэш-команд (от /login и /compact до /goal, /ultraplan, /workflows). Твои кастомные команды живут рядом, в .claude/commands/, и коммитятся в git — то есть шарятся на всю команду.

§2 · Subagent

Субагент — изолированный исполнитель.claude/agents/<name>.md

Субагент — это отдельный «работник» с собственным окном контекста, своей моделью, своим allowlist'ом инструментов и (опционально) своей памятью. Главная выгода — изоляция: грязная работа (долгий поиск, шумный вывод, рискованные инструменты) не засоряет твой основной контекст, а результат возвращается сжатым. Борис ставит субагенты в один ряд с командами.

Думай о субагентах как об автоматизации самых частых воркфлоу — так же, как о слэш-командах. code-simplifier чистит код после Claude, verify-app прогоняет end-to-end тесты, и так далее.
Boris Cherny · «Use Subagents to Automate Common Workflows»

Frontmatter: 16 полей

Frontmatter субагента · Claude Code v2.1.179
ПолеТипReqНазначение
namestringyesУникальный id (lowercase + дефисы).
descriptionstringyesКогда вызывать. PROACTIVELY — для авто-вызова.
toolsstr/listnoAllowlist инструментов. Без поля — наследует все. Поддерживает Agent(type).
disallowedToolsstr/listnoЧто убрать из наследованного/заданного списка.
modelstringnosonnet/opus/haiku/полный id/inherit (умолч.).
permissionModestringnodefault/acceptEdits/auto/dontAsk/bypassPermissions/plan.
maxTurnsintnoПотолок агентных ходов до остановки.
skillslistnoСкиллы, предзагружаемые в контекст на старте (полный текст инжектится).
mcpServerslistnoMCP-серверы для этого субагента (имена или инлайн-конфиги).
hooksobjectnoLifecycle-хуки субагента (чаще всего PreToolUse/PostToolUse/Stop).
memorystringnoПостоянная память: user/project/local.
backgroundboolnotrue — всегда запускать фоновой задачей.
effortstringnolow…max; xhigh только для Opus 4.6.
isolationstringno"worktree" — выполнить во временном git-worktree (авто-очистка).
initialPromptstringnoАвто-первый ход, когда агент — главный (через --agent).
colorstringnoЦвет в списке задач и транскрипте.
Свежие поля, мимо которых легко пройти

isolation: "worktree" — субагент работает в собственном git-worktree, изменения не пересекаются с твоими. memory: project — у агента появляется персистентная память между запусками. effort и model на уровне агента — дорогой Opus только там, где он реально нужен, остальное на haiku. Эти поля и есть разница между «агент ради галочки» и управляемым исполнителем.

Живой пример: tool-allowlist как защита

Самый поучительный приём в weather-agent — он намеренно лишён сетевых инструментов. Не потому что не доверяют, а чтобы единственным способом достать данные был вызов скилла. Allowlist здесь — не безопасность, а архитектурное принуждение.

.claude/agents/weather-agent.mdsubagent
---
name: weather-agent
description: Use this agent PROACTIVELY to fetch weather for Dubai…
allowedTools: ["Read", "Skill"]   # нет WebFetch — by design
model: sonnet
color: green
maxTurns: 5
permissionMode: acceptEdits
memory: project           # помнит прошлые замеры
skills:
  - weather-fetcher        # предзагружен в контекст
hooks:
  PreToolUse:                # голосовое уведомление на каждый инструмент
    - matcher: ".*"
      hooks: [{ type: command, command: python3 …/hooks.py, async: true }]
---

# Weather Agent
Your tool allowlist intentionally excludes network tools — if you find
yourself needing one, that is a signal you are bypassing the skill.
Stop and use Skill(weather-fetcher) instead.
Один файл показывает шесть полей сразу: урезанный allowedTools, своя модель, memory: project, предзагруженный скилл и скоупленные хуки. Тело усиливает контракт словами.

Пять официальных типов агентов

Их не нужно объявлять — они встроены и доступны как subagent_type. Знать их полезно: дешёвый Explore на haiku закрывает 80% задач «найди по коду».

Встроенные типы субагентов
ТипМодельИнструментыДля чего
general-purposeinheritвсеСложные многошаговые задачи, ресёрч, автономная работа — дефолт.
Explorehaikuread-onlyБыстрый поиск по коду; находит файлы и отвечает на вопросы о кодбазе.
Planinheritread-onlyРесёрч в plan mode: изучить код и спроектировать подход до написания.
statusline-setupsonnetRead, EditНастройка статус-строки.
claude-code-guidehaikuGlob,Grep,Read,Web*Ответы про фичи Claude Code, Agent SDK и Claude API.
Экран Claude Code: интерактивное создание субагента через /agents — выбор имени, описания, инструментов и модели.
Плашка 2.1 · Интерактивное создание субагента (/agents): тот же frontmatter, только через визард. Скриншот из презентационных материалов репозитория.
§3 · Skill

Скилл — переиспользуемое ноу-хау.claude/skills/<name>/SKILL.md

Скилл легко принять за «просто markdown с инструкцией». Это недооценка. Скилл — это папка: внутри могут лежать скрипты, ассеты, данные, справочники, которые агент открывает по мере надобности. Отсюда главная идея — прогрессивное раскрытие: лёгкое описание всегда в контексте, тяжёлые детали подгружаются только когда нужны.

Распространённое заблуждение, что скиллы — «просто markdown-файлы». Самое интересное в том, что это папки: со скриптами, ассетами, данными — тем, что агент может находить, исследовать и менять.
Thariq · Anthropic · «How We Use Skills», март 2026

Frontmatter: 16 полей

Почти зеркало команды — и это не совпадение (к конвергенции вернёмся в §5). Два поля стоит выделить особо: user-invocable: false превращает скилл в чистое «фоновое знание» для предзагрузки в агента, а description — это не аннотация для человека, а триггер для модели.

Frontmatter скилла · Claude Code v2.1.179
ПолеТипReqНазначение
namestringnoИмя и /слэш. По умолчанию — имя директории.
descriptionstringrecКогда вызывать (триггер для модели), не «что это».
when_to_usestringnoТриггер-фразы/примеры. Часть листинга, лимит 1536 символов.
argument-hintstringnoПодсказка автокомплита.
argumentsstr/listnoИменованные аргументы для $name.
disable-model-invocationboolnoЗапретить авто-вызов моделью.
user-invocableboolnofalse — скрыть из /, оставить для предзагрузки в агента.
allowed-toolsstringnoИнструменты без запроса, пока скилл активен.
disallowed-toolsstr/listnoУбрать инструменты (напр. заблокировать AskUserQuestion в фоновом цикле).
modelstringnoМодель на время работы скилла.
effortstringnoУровень усилия low…max.
contextstringnofork — изолированный субагент-контекст.
agentstringnoТип субагента при context: fork.
hooksobjectnoХуки, живущие только пока скилл активен (on-demand).
pathsstr/listnoGlob: авто-активация только на подходящих файлах.
shellstringnoШелл для !`команд`.

Живой пример: скилл как чистое знание

weather-fetcher — это «agent skill»: user-invocable: false, поэтому он не светится в меню, а предзагружается в weather-agent. Внутри — только инструкция и два URL. Никакой логики записи файлов: одна ответственность.

.claude/skills/weather-fetcher/SKILL.mdskill
---
name: weather-fetcher
description: Instructions for fetching current temperature for Dubai from Open-Meteo
user-invocable: false      # фоновое знание, не слэш-команда
allowed-tools: ["WebFetch(*)"]
---

# Weather Fetcher Skill
1. WebFetch → Open-Meteo:
   C°: …/forecast?latitude=25.2048&longitude=55.2708&current=temperature_2m
2. Extract current.temperature_2m + current_units.temperature_2m
3. Return value + unit. # не трансформируй, не пиши файлы
Скилл знает одну вещь и делает её хорошо. Сетевой инструмент тут разрешён (WebFetch) ровно потому, что у агента-носителя его нет: разделение полномочий между слоями.

Девять видов скиллов (карта Anthropic)

Команда Thariq разложила сотни своих скиллов и увидела девять повторяющихся категорий. Лучшие скиллы ложатся ровно в одну; путаные — растягиваются на несколько. Полезно как чек-лист «а какой скилл я вообще пишу».

Сетка из девяти категорий скиллов от команды Anthropic: Library/API Reference, Product Verification, Data Fetching, Business Process, Code Scaffolding, Code Quality, CI/CD, Runbooks, Infrastructure Ops.
Плашка 3.1 · Девять категорий скиллов по Thariq. Источник: тред «How We Use Skills», репозиторий tips/.
9 категорий · примеры
#КатегорияПримеры
1Library & API Referencebilling-lib, internal-cli, frontend-design
2Product Verificationsignup-flow-driver, checkout-verifier, tmux-cli-driver
3Data Fetching & Analysisfunnel-query, cohort-compare, grafana
4Business Process / Team Automationstandup-post, create-ticket, weekly-recap
5Code Scaffolding & Templatesnew-migration, create-app, new-workflow
6Code Quality & Reviewadversarial-review, code-style, testing-practices
7CI/CD & Deploymentbabysit-pr, deploy-service, cherry-pick-prod
8Runbooksservice-debugging, oncall-runner, log-correlator
9Infrastructure Operationsresource-orphans, dependency-mgmt, cost-investigation

Как писать скиллы: дистиллят правил Thariq

Из девяти его советов четыре стоит запомнить дословно — они экономят недели.

Сетка из девяти советов по созданию скиллов от Thariq: не говори очевидное, секция gotchas, прогрессивное раскрытие, не загоняй в рельсы, продумай setup, description = триггер, память, скрипты, on-demand хуки.
Плашка 3.2 · Девять правил написания скиллов. tips/claude-thariq-tips-17-mar-26.md
10 встроенных bundled-скиллов

Часть скиллов уже в коробке: code-review, debug, simplify, loop, verify, run, batch, claude-api, fewer-permission-prompts, run-skill-generator. С v2.1.154 simplify больше не ищет баги (только чистка) — для багов используют code-review.

§4 · Композиция

Как три кирпича складываются в поток

Сигнатурный паттерн репозитория — Command → Agent → Skill. Команда дирижирует и говорит с пользователем; агент достаёт данные своим предзагруженным скиллом; отдельный скилл рендерит результат. Каждый слой — одна ответственность. Вот тот же weather-пример целиком, на одной схеме.

Схема перерисована под тему главы; канонический оригинал — orchestration-workflow/orchestration-workflow.svg.

Два паттерна скиллов в одном потоке

Главная тонкость примера: скиллы участвуют двумя разными способами, и их легко перепутать.

Паттерн A · Agent Skill (предзагрузка)

weather-fetcher

Указан в поле skills: агента. Полный текст инжектится в контекст агента на старте как доменное знание. Отдельно не «вызывается» — это справочник, которому агент следует.

Паттерн B · Skill (прямой вызов)

weather-svg-creator

Вызывается командой через Skill(...). Исполняется в контексте команды, не внутри агента, и берёт данные (температуру), уже лежащие в разговоре.

Принцип, который переносится на любой воркфлоу

Fail-closed контракты. На каждом стыке стоит «execution contract»: команда не достаёт данные сама, агент не ходит в сеть в обход скилла, и если предыдущий слой не вернул валидный результат — следующий не запускается. Дисциплина по слоям важнее, чем сообразительность модели: именно она делает поток предсказуемым на проде.

§5 · Когда что брать

Решение за пятнадцать секунд

Все три примитива умеют model, effort, hooks, context: fork — frontmatter сознательно сходится. Поэтому выбор идёт не по «возможностям», а по намерению.

Если тебе нужно… → бери
НамерениеПримитивПочему
Запускать один и тот же воркфлоу по N раз в день одной строкойCommandДетерминированный вход, коммитится в git, доступен и тебе, и Claude.
Унести шумную/долгую/рискованную работу из основного контекстаSubagentСвой контекст, своя модель, урезанные инструменты, опц. worktree-изоляция.
Переиспользовать знание «как сделать X правильно»SkillПапка с прогрессивным раскрытием; триггерится по description.
Дать агенту доменное знание навсегдаSkill → в agent.skillsПаттерн A: предзагрузка в контекст агента на старте.
Скоординировать несколько агентов и скиллов в один результатCommandОркестратор поверх остальных двух — сигнатурный Command→Agent→Skill.

Эвристика на каждый день: начни с команды. Если внутри неё появляется грязная или параллелизуемая работа — выдели субагента. Если в агенте/команде всплывает знание, которое хочется переиспользовать в других местах — вынеси его в скилл. Сущности добавляются по нужде, а не заранее.

Шпаргалка главы

Семь тезисов на вынос

  1. Три примитива = грамматика. Command (что/координация) · Subagent (кто/изоляция) · Skill (что знать/переиспользование). Остальное — композиция.
  2. Команда — дирижёр, не исполнитель. Урезай ей инструменты, ставь дешёвую модель, прописывай execution contract. .claude/commands/, 85 встроенных рядом.
  3. Субагент — ради изоляции. Свой контекст и модель; allowlist инструментов работает как архитектурное принуждение, а не только безопасность. Свежее: isolation: worktree, memory, per-agent effort.
  4. Скилл — это папка, не файл. Прогрессивное раскрытие; description пишется для модели как триггер; секция Gotchas — самое ценное.
  5. Два паттерна скиллов. Предзагрузка в агента (agent skill) против прямого вызова через Skill(...). Не путать.
  6. Command → Agent → Skill. Сигнатурный поток: одна ответственность на слой, fail-closed на каждом стыке.
  7. Frontmatter сходится (model/effort/hooks/context:fork у всех трёх). Выбирай по намерению, а не по списку возможностей.