Claude Certified Architect · Модуль 3 · Урок 3.2

Кастомные slash-команды и навыки (skills)

Суть

Slash-команды — Markdown-шаблоны; область проектная (.claude/commands/) или личная (~/.claude/commands/). Навыки (skills) мощнее: их YAML-фронтматтер управляет изоляцией, доступом к инструментам и запросом аргументов.

Ключи фронтматтера

context: fork изолирует исполнение навыка в субагенте — многословный вывод не копится в основном диалоге, возвращается лишь сводка (это про накопление контекста, не про права на инструменты). allowed-tools ограничивает доступные инструменты (Read, Write, Edit, Bash). argument-hint подсказывает недостающий аргумент при вызове.

SKILL.md: YAML-фронтматтер навыка
---
name: architecture-review
description: Анализирует архитектуру и возвращает сжатую сводку
context: fork
allowed-tools:
  - Read
  - Grep
argument-hint: "path/to/module"
---

Anti-patterns

ЛовушкаПочему не работаетВерный паттерн
Навык без context: fork для многословного исследованияВесь вывод копится в основном диалоге, исчерпывает контекстcontext: fork — разведка в изоляции, возвращается лишь сводка
Личную экспериментальную команду класть в .claude/commands/Всё в .claude/commands/ шарится с командой через VCSЛичное — в ~/.claude/commands/; командное — в .claude/commands/
Пропустить allowed-tools у навыка-«писателя»Навык может вызвать любой инструмент, включая разрушительный BashУказать allowed-tools: [Write, Edit] — только безопасные операции

Exam traps

ЛовушкаПочему не работаетВерный паттерн
Путать область навыков с областью командОни разные по умолчаниюПомнить область для каждого артефакта
Считать, что context: fork ограничивает инструментыОн ограничивает накопление контекста, не праваДля прав — allowed-tools
Забыть argument-hint у навыка с параметрамиПользователь не знает, что передатьУказать argument-hint

Практическое задание (T2)

  • Создать проектную команду .claude/commands/pr-review.md и проверить доступ команды через git.
  • Создать навык с context: fork для анализа базы; убедиться, что многословный вывод НЕ попадает в основную историю.
  • Создать навык с allowed-tools: [Write, Edit]; попытаться вызвать Bash и подтвердить блокировку.
  • Создать навык с argument-hint: "path/to/target"; вызвать без аргументов и увидеть подсказку.
  • Создать личный вариант командного навыка в ~/.claude/skills/ под другим именем; подтвердить, что коллеги его не видят.

Проверка знаний

Продуктивность разработчика с Claude

Навык codebase-audit читает все исходники, генерирует детальный промежуточный анализ по каждому и финальную сводку. После запуска весь пофайловый анализ осел в основном диалоге, ответы стали медленнее. Какое одно изменение фронтматтера это починит?

  • A Добавить allowed-tools: [Read], ограничив доступ к файлам
  • B Добавить context: fork — навык исполняется в изолированном субагенте, многословный вывод не идёт в основной диалог
  • C Перенести навык в ~/.claude/skills/, чтобы он работал в личной области
  • D Добавить argument-hint: "compact", чтобы вывод был короче

Продуктивность разработчика с Claude

Нужен навык generate-migration, который пишет SQL-файлы миграций, но никогда не исполняет их через Bash. Как настроить фронтматтер?

  • A В тело навыка: «Не запускай Bash-команды. Только пиши файлы.»
  • B Добавить allowed-tools: [Write, Edit] во фронтматтер — ограничить только записью файлов
  • C Добавить context: fork, чтобы Bash-команды шли в изоляции
  • D Положить навык в ~/.claude/skills/, чтобы он работал с пониженными правами

Продуктивность разработчика с Claude

Навык /deploy читает инфраконфиг, строит план развёртывания и исполняет его через Bash. Джуниор случайно задеплоил в прод. Нужен структурный предохранитель против исполнения без явного ревью плана. Самый надёжный подход?

  • A В тело навыка: «Всегда подтверждай целевое окружение перед исполнением»
  • B Разделить на два навыка: /deploy-plan (allowed-tools: [Read, Glob] — строит и показывает план, без исполнения) и /deploy-execute (allowed-tools: [Bash] — выполняет одобренный план). Между шагами — ревью
  • C Добавить context: fork, чтобы команды развёртывания шли в изолированном субагенте
  • D Добавить argument-hint: "environment", чтобы требовать указать окружение