Структура и заготовка плагина Claude Code
Объясняет, как устроены каталоги плагина, манифест plugin.json, автообнаружение команд, агентов, скиллов, хуков и MCP-серверов.
- Что делает
- Объясняет, как устроены каталоги плагина, манифест plugin.json, автообнаружение команд, агентов, скиллов, хуков и MCP-серверов.
- Когда брать
- Когда нужно создать новый плагин Claude Code, разложить компоненты по папкам или настроить plugin.json и переносимые пути.
- Когда не брать
- Если нужно написать отдельный компонент (агента, команду, хук) — для этого есть профильные скиллы плагина plugin-dev.
- Пример запроса
- Создай заготовку плагина с одной командой, одним скиллом и манифестом.
- Нужно подключить
- Claude Code
Входит в плагин plugin-dev. В Cowork и Claude Code можно поставить плагин целиком.
Как включить
- Скачайте архив и распакуйте его.
- Положите папку
plugin-structureв~/.claude/skills/. - Откройте Claude Code и опишите задачу своими словами: Claude подхватит скилл по описанию.
Текст
---
name: plugin-structure
description: Этот скилл следует использовать, когда пользователь просит «создать плагин», «сделать заготовку плагина», «разобраться в структуре плагина», «организовать компоненты плагина», «настроить plugin.json», «использовать ${CLAUDE_PLUGIN_ROOT}», «добавить команды/агентов/скиллы/хуки», «настроить автообнаружение» или нуждается в рекомендациях по раскладке каталогов плагина, настройке манифеста, организации компонентов, правилам именования файлов и лучшим практикам архитектуры плагинов Claude Code.
version: 0.1.0
---
Структура плагина для Claude Code
Обзор
Плагины Claude Code следуют стандартизованной структуре каталогов с автоматическим обнаружением компонентов. Понимание этой структуры позволяет создавать хорошо организованные, удобные в поддержке плагины, которые без сбоев работают с Claude Code.
Ключевые понятия:
- Общепринятая раскладка каталогов для автоматического обнаружения
- Конфигурация на основе манифеста в
.claude-plugin/plugin.json - Организация по компонентам (команды, агенты, скиллы, хуки)
- Переносимые ссылки на пути через
${CLAUDE_PLUGIN_ROOT} - Явная и автоматически обнаруживаемая загрузка компонентов
Структура каталогов
Каждый плагин Claude Code следует такой схеме организации:
plugin-name/
├── .claude-plugin/
│ └── plugin.json # Обязательно: манифест плагина
├── commands/ # Слэш-команды (файлы .md)
├── agents/ # Определения субагентов (файлы .md)
├── skills/ # Скиллы агента (подкаталоги)
│ └── skill-name/
│ └── SKILL.md # Обязателен для каждого скилла
├── hooks/
│ └── hooks.json # Конфигурация обработчиков событий
├── .mcp.json # Определения MCP-серверов
└── scripts/ # Вспомогательные скрипты и утилиты
Критические правила:
- Расположение манифеста: манифест
plugin.jsonОБЯЗАН находиться в каталоге.claude-plugin/ - Расположение компонентов: все каталоги компонентов (commands, agents, skills, hooks) ОБЯЗАНЫ лежать в корне плагина, а НЕ внутри
.claude-plugin/ - Необязательные компоненты: создавай каталоги только для тех компонентов, которые плагин действительно использует
- Правило именования: используй kebab-case для всех имён каталогов и файлов
Манифест плагина (plugin.json)
Манифест определяет метаданные и конфигурацию плагина. Расположен в .claude-plugin/plugin.json:
Обязательные поля
{
"name": "plugin-name"
}
Требования к имени:
- Используй формат kebab-case (строчные буквы с дефисами)
- Должно быть уникальным среди установленных плагинов
- Без пробелов и специальных символов
- Пример:
code-review-assistant,test-runner,api-docs
Рекомендуемые метаданные
{
"name": "plugin-name",
"version": "1.0.0",
"description": "Brief explanation of plugin purpose",
"author": {
"name": "Author Name",
"email": "author@example.com",
"url": "https://example.com"
},
"homepage": "https://docs.example.com",
"repository": "https://github.com/user/plugin-name",
"license": "MIT",
"keywords": ["testing", "automation", "ci-cd"]
}
Формат версии: следуй семантическому версионированию (MAJOR.MINOR.PATCH) Ключевые слова: используются для поиска и категоризации плагина
Настройка путей к компонентам
Задай собственные пути для компонентов (дополняют каталоги по умолчанию):
{
"name": "plugin-name",
"commands": "./custom-commands",
"agents": ["./agents", "./specialized-agents"],
"hooks": "./config/hooks.json",
"mcpServers": "./.mcp.json"
}
Важно: собственные пути дополняют значения по умолчанию, а не заменяют их. Компоненты и из каталогов по умолчанию, и из собственных путей будут загружены.
Правила для путей:
- Должны быть относительными к корню плагина
- Должны начинаться с
./ - Абсолютные пути использовать нельзя
- Для нескольких расположений поддерживаются массивы
Организация компонентов
Команды
Расположение: каталог commands/ Формат: файлы Markdown с YAML-шапкой Автообнаружение: все файлы .md в commands/ загружаются автоматически
Пример структуры:
commands/
├── review.md # команда /review
├── test.md # команда /test
└── deploy.md # команда /deploy
Формат файла:
---
name: command-name
description: Описание команды
---
Инструкции по выполнению команды...
Использование: команды встраиваются как родные слэш-команды Claude Code
Агенты
Расположение: каталог agents/ Формат: файлы Markdown с YAML-шапкой Автообнаружение: все файлы .md в agents/ загружаются автоматически
Пример структуры:
agents/
├── code-reviewer.md
├── test-generator.md
└── refactorer.md
Формат файла:
---
description: Роль и экспертиза агента
capabilities:
- Конкретная задача 1
- Конкретная задача 2
---
Подробные инструкции и знания агента...
Использование: пользователи могут вызывать агентов вручную, либо Claude Code выбирает их автоматически по контексту задачи
Скиллы
Расположение: каталог skills/ с подкаталогом на каждый скилл Формат: каждый скилл в своём каталоге с файлом SKILL.md Автообнаружение: все файлы SKILL.md в подкаталогах скиллов загружаются автоматически
Пример структуры:
skills/
├── api-testing/
│ ├── SKILL.md
│ ├── scripts/
│ │ └── test-runner.py
│ └── references/
│ └── api-spec.md
└── database-migrations/
├── SKILL.md
└── examples/
└── migration-template.sql
Формат SKILL.md:
---
name: Название скилла
description: Когда использовать этот скилл
version: 1.0.0
---
Инструкции и указания скилла...
Вспомогательные файлы: скиллы могут включать скрипты, справочные материалы, примеры или ресурсы в подкаталогах
Использование: Claude Code самостоятельно включает скиллы, когда контекст задачи подходит под описание
Хуки
Расположение: hooks/hooks.json или прямо в plugin.json Формат: JSON-конфигурация, определяющая обработчики событий Регистрация: хуки регистрируются автоматически при включении плагина
Пример структуры:
hooks/
├── hooks.json # Конфигурация хуков
└── scripts/
├── validate.sh # Скрипт хука
└── check-style.sh # Скрипт хука
Формат конфигурации:
{
"PreToolUse": [{
"matcher": "Write|Edit",
"hooks": [{
"type": "command",
"command": "bash ${CLAUDE_PLUGIN_ROOT}/hooks/scripts/validate.sh",
"timeout": 30
}]
}]
}
Доступные события: PreToolUse, PostToolUse, Stop, SubagentStop, SessionStart, SessionEnd, UserPromptSubmit, PreCompact, Notification
Использование: хуки выполняются автоматически в ответ на события Claude Code
MCP-серверы
Расположение: .mcp.json в корне плагина или прямо в plugin.json Формат: JSON-конфигурация для определений MCP-серверов Автозапуск: серверы запускаются автоматически при включении плагина
Пример формата:
{
"mcpServers": {
"server-name": {
"command": "node",
"args": ["${CLAUDE_PLUGIN_ROOT}/servers/server.js"],
"env": {
"API_KEY": "${API_KEY}"
}
}
}
}
Использование: MCP-серверы без сбоев встраиваются в систему инструментов Claude Code
Переносимые ссылки на пути
${CLAUDE_PLUGIN_ROOT}
Используй переменную окружения ${CLAUDE_PLUGIN_ROOT} для всех ссылок на пути внутри плагина:
{
"command": "bash ${CLAUDE_PLUGIN_ROOT}/scripts/run.sh"
}
Почему это важно: плагины устанавливаются в разные места в зависимости от:
- Способа установки пользователем (маркетплейс, локально, npm)
- Соглашений операционной системы
- Предпочтений пользователя
Где использовать:
- Пути команд хуков
- Аргументы команд MCP-серверов
- Ссылки на запуск скриптов
- Пути к файлам ресурсов
Никогда не используй:
- Жёстко заданные абсолютные пути (
/Users/name/plugins/...) - Относительные пути от рабочего каталога (
./scripts/...в командах) - Сокращения домашнего каталога (
~/plugins/...)
Правила разрешения путей
В JSON-полях манифеста (хуки, MCP-серверы):
"command": "${CLAUDE_PLUGIN_ROOT}/scripts/tool.sh"
В файлах компонентов (команды, агенты, скиллы):
Скрипты лежат здесь: ${CLAUDE_PLUGIN_ROOT}/scripts/helper.py
В выполняемых скриптах:
#!/bin/bash
# ${CLAUDE_PLUGIN_ROOT} available as environment variable
source "${CLAUDE_PLUGIN_ROOT}/lib/common.sh"
Соглашения об именовании файлов
Файлы компонентов
Команды: используй файлы .md в kebab-case
code-review.md→/code-reviewrun-tests.md→/run-testsapi-docs.md→/api-docs
Агенты: используй файлы .md в kebab-case, описывающие роль
test-generator.mdcode-reviewer.mdperformance-analyzer.md
Скиллы: используй имена каталогов в kebab-case
api-testing/database-migrations/error-handling/
Вспомогательные файлы
Скрипты: используй описательные имена в kebab-case с подходящими расширениями
validate-input.shgenerate-report.pyprocess-data.js
Документация: используй markdown-файлы в kebab-case
api-reference.mdmigration-guide.mdbest-practices.md
Конфигурация: используй стандартные имена
hooks.json.mcp.jsonplugin.json
Механизм автообнаружения
Claude Code автоматически обнаруживает и загружает компоненты:
- Манифест плагина: читает
.claude-plugin/plugin.jsonпри включении плагина - Команды: просматривает каталог
commands/на файлы.md - Агенты: просматривает каталог
agents/на файлы.md - Скиллы: просматривает
skills/на подкаталоги сSKILL.md - Хуки: загружает конфигурацию из
hooks/hooks.jsonили манифеста - MCP-серверы: загружает конфигурацию из
.mcp.jsonили манифеста
Когда происходит обнаружение:
- Установка плагина: компоненты регистрируются в Claude Code
- Включение плагина: компоненты становятся доступны для использования
- Перезапуск не нужен: изменения вступают в силу в следующей сессии Claude Code
Поведение переопределения: собственные пути в plugin.json дополняют (а не заменяют) каталоги по умолчанию
Лучшие практики
Организация
- Логическая группировка: объединяй связанные компоненты
- Храни вместе команды, агентов и скиллы, связанные с тестированием
- Создавай в
scripts/подкаталоги для разных целей
- Минимальный манифест: держи
plugin.jsonкомпактным - Указывай собственные пути только при необходимости
- Полагайся на автообнаружение для стандартных раскладок
- Встраиваемую конфигурацию используй только в простых случаях
- Документация: добавляй файлы README
- Корень плагина: общее назначение и использование
- Каталоги компонентов: конкретные указания
- Каталоги скриптов: использование и требования
Именование
- Единообразие: используй единообразные имена у всех компонентов
- Если команда называется
test-runner, связанного агента назовиtest-runner-agent - Имена каталогов скиллов должны соответствовать их назначению
- Ясность: используй описательные имена, указывающие на назначение
- Хорошо:
api-integration-testing/,code-quality-checker.md - Избегай:
utils/,misc.md,temp.sh
- Длина: соблюдай баланс между краткостью и ясностью
- Команды: 2–3 слова (
review-pr,run-ci) - Агенты: чётко описывай роль (
code-reviewer,test-generator) - Скиллы: по теме (
error-handling,api-design)
Переносимость
- Всегда используй ${CLAUDE_PLUGIN_ROOT}: никогда не прописывай пути жёстко
- Проверяй на нескольких системах: проверь на macOS, Linux, Windows
- Документируй зависимости: перечисли необходимые инструменты и версии
- Избегай системно-специфичных возможностей: используй переносимые конструкции bash/Python
Сопровождение
- Версионируй последовательно: обновляй версию в plugin.json при выпусках
- Выводи из обращения аккуратно: заранее чётко помечай старые компоненты перед удалением
- Документируй ломающие изменения: отмечай изменения, затрагивающие существующих пользователей
- Тщательно проверяй: убедись, что после изменений все компоненты работают
Типовые схемы
Минимальный плагин
Одна команда без зависимостей:
my-plugin/
├── .claude-plugin/
│ └── plugin.json # Только поле name
└── commands/
└── hello.md # Единственная команда
Полнофункциональный плагин
Полный плагин со всеми типами компонентов:
my-plugin/
├── .claude-plugin/
│ └── plugin.json
├── commands/ # Команды для пользователя
├── agents/ # Специализированные субагенты
├── skills/ # Автоматически активирующиеся скиллы
├── hooks/ # Обработчики событий
│ ├── hooks.json
│ └── scripts/
├── .mcp.json # Внешние интеграции
└── scripts/ # Общие утилиты
Плагин только со скиллами
Плагин, содержащий только скиллы:
my-plugin/
├── .claude-plugin/
│ └── plugin.json
└── skills/
├── skill-one/
│ └── SKILL.md
└── skill-two/
└── SKILL.md
Устранение неполадок
Компонент не загружается:
- Проверь, что файл лежит в правильном каталоге и имеет правильное расширение
- Проверь синтаксис YAML-шапки (команды, агенты, скиллы)
- Убедись, что у скилла есть
SKILL.md(а неREADME.mdили другое имя) - Убедись, что плагин включён в настройках Claude Code
Ошибки разрешения путей:
- Замени все жёстко заданные пути на
${CLAUDE_PLUGIN_ROOT} - Проверь, что пути в манифесте относительные и начинаются с
./ - Проверь, что указанные файлы существуют по указанным путям
- Проверь через
echo $CLAUDE_PLUGIN_ROOTв скриптах хуков
Автообнаружение не работает:
- Убедись, что каталоги лежат в корне плагина (а не в
.claude-plugin/) - Проверь, что имена файлов соответствуют соглашениям (kebab-case, правильные расширения)
- Проверь, что собственные пути в манифесте верны
- Перезапусти Claude Code, чтобы перезагрузить конфигурацию плагина
Конфликты между плагинами:
- Используй уникальные описательные имена компонентов
- При необходимости добавляй к командам пространство имён с названием плагина
- Задокументируй возможные конфликты в README плагина
- Подумай о префиксах команд для связанной функциональности
Подробные примеры и продвинутые схемы см. в файлах каталогов references/ и examples/.
Перевод: iiuniversitet. Оригинал: https://github.com/anthropics/claude-plugins-official/tree/main/plugins/plugin-dev/skills/plugin-structure, лицензия Apache-2.0. Изменения: перевод на русский язык.
Оригинал на английском
---
name: plugin-structure
description: This skill should be used when the user asks to "create a plugin", "scaffold a plugin", "understand plugin structure", "organize plugin components", "set up plugin.json", "use ${CLAUDE_PLUGIN_ROOT}", "add commands/agents/skills/hooks", "configure auto-discovery", or needs guidance on plugin directory layout, manifest configuration, component organization, file naming conventions, or Claude Code plugin architecture best practices.
version: 0.1.0
---
# Plugin Structure for Claude Code
## Overview
Claude Code plugins follow a standardized directory structure with automatic component discovery. Understanding this structure enables creating well-organized, maintainable plugins that integrate seamlessly with Claude Code.
**Key concepts:**
- Conventional directory layout for automatic discovery
- Manifest-driven configuration in `.claude-plugin/plugin.json`
- Component-based organization (commands, agents, skills, hooks)
- Portable path references using `${CLAUDE_PLUGIN_ROOT}`
- Explicit vs. auto-discovered component loading
## Directory Structure
Every Claude Code plugin follows this organizational pattern:
```
plugin-name/
├── .claude-plugin/
│ └── plugin.json # Required: Plugin manifest
├── commands/ # Slash commands (.md files)
├── agents/ # Subagent definitions (.md files)
├── skills/ # Agent skills (subdirectories)
│ └── skill-name/
│ └── SKILL.md # Required for each skill
├── hooks/
│ └── hooks.json # Event handler configuration
├── .mcp.json # MCP server definitions
└── scripts/ # Helper scripts and utilities
```
**Critical rules:**
1. **Manifest location**: The `plugin.json` manifest MUST be in `.claude-plugin/` directory
2. **Component locations**: All component directories (commands, agents, skills, hooks) MUST be at plugin root level, NOT nested inside `.claude-plugin/`
3. **Optional components**: Only create directories for components the plugin actually uses
4. **Naming convention**: Use kebab-case for all directory and file names
## Plugin Manifest (plugin.json)
The manifest defines plugin metadata and configuration. Located at `.claude-plugin/plugin.json`:
### Required Fields
```json
{
"name": "plugin-name"
}
```
**Name requirements:**
- Use kebab-case format (lowercase with hyphens)
- Must be unique across installed plugins
- No spaces or special characters
- Example: `code-review-assistant`, `test-runner`, `api-docs`
### Recommended Metadata
```json
{
"name": "plugin-name",
"version": "1.0.0",
"description": "Brief explanation of plugin purpose",
"author": {
"name": "Author Name",
"email": "author@example.com",
"url": "https://example.com"
},
"homepage": "https://docs.example.com",
"repository": "https://github.com/user/plugin-name",
"license": "MIT",
"keywords": ["testing", "automation", "ci-cd"]
}
```
**Version format**: Follow semantic versioning (MAJOR.MINOR.PATCH)
**Keywords**: Use for plugin discovery and categorization
### Component Path Configuration
Specify custom paths for components (supplements default directories):
```json
{
"name": "plugin-name",
"commands": "./custom-commands",
"agents": ["./agents", "./specialized-agents"],
"hooks": "./config/hooks.json",
"mcpServers": "./.mcp.json"
}
```
**Important**: Custom paths supplement defaults—they don't replace them. Components in both default directories and custom paths will load.
**Path rules:**
- Must be relative to plugin root
- Must start with `./`
- Cannot use absolute paths
- Support arrays for multiple locations
## Component Organization
### Commands
**Location**: `commands/` directory
**Format**: Markdown files with YAML frontmatter
**Auto-discovery**: All `.md` files in `commands/` load automatically
**Example structure**:
```
commands/
├── review.md # /review command
├── test.md # /test command
└── deploy.md # /deploy command
```
**File format**:
```markdown
---
name: command-name
description: Command description
---
Command implementation instructions...
```
**Usage**: Commands integrate as native slash commands in Claude Code
### Agents
**Location**: `agents/` directory
**Format**: Markdown files with YAML frontmatter
**Auto-discovery**: All `.md` files in `agents/` load automatically
**Example structure**:
```
agents/
├── code-reviewer.md
├── test-generator.md
└── refactorer.md
```
**File format**:
```markdown
---
description: Agent role and expertise
capabilities:
- Specific task 1
- Specific task 2
---
Detailed agent instructions and knowledge...
```
**Usage**: Users can invoke agents manually, or Claude Code selects them automatically based on task context
### Skills
**Location**: `skills/` directory with subdirectories per skill
**Format**: Each skill in its own directory with `SKILL.md` file
**Auto-discovery**: All `SKILL.md` files in skill subdirectories load automatically
**Example structure**:
```
skills/
├── api-testing/
│ ├── SKILL.md
│ ├── scripts/
│ │ └── test-runner.py
│ └── references/
│ └── api-spec.md
└── database-migrations/
├── SKILL.md
└── examples/
└── migration-template.sql
```
**SKILL.md format**:
```markdown
---
name: Skill Name
description: When to use this skill
version: 1.0.0
---
Skill instructions and guidance...
```
**Supporting files**: Skills can include scripts, references, examples, or assets in subdirectories
**Usage**: Claude Code autonomously activates skills based on task context matching the description
### Hooks
**Location**: `hooks/hooks.json` or inline in `plugin.json`
**Format**: JSON configuration defining event handlers
**Registration**: Hooks register automatically when plugin enables
**Example structure**:
```
hooks/
├── hooks.json # Hook configuration
└── scripts/
├── validate.sh # Hook script
└── check-style.sh # Hook script
```
**Configuration format**:
```json
{
"PreToolUse": [{
"matcher": "Write|Edit",
"hooks": [{
"type": "command",
"command": "bash ${CLAUDE_PLUGIN_ROOT}/hooks/scripts/validate.sh",
"timeout": 30
}]
}]
}
```
**Available events**: PreToolUse, PostToolUse, Stop, SubagentStop, SessionStart, SessionEnd, UserPromptSubmit, PreCompact, Notification
**Usage**: Hooks execute automatically in response to Claude Code events
### MCP Servers
**Location**: `.mcp.json` at plugin root or inline in `plugin.json`
**Format**: JSON configuration for MCP server definitions
**Auto-start**: Servers start automatically when plugin enables
**Example format**:
```json
{
"mcpServers": {
"server-name": {
"command": "node",
"args": ["${CLAUDE_PLUGIN_ROOT}/servers/server.js"],
"env": {
"API_KEY": "${API_KEY}"
}
}
}
}
```
**Usage**: MCP servers integrate seamlessly with Claude Code's tool system
## Portable Path References
### ${CLAUDE_PLUGIN_ROOT}
Use `${CLAUDE_PLUGIN_ROOT}` environment variable for all intra-plugin path references:
```json
{
"command": "bash ${CLAUDE_PLUGIN_ROOT}/scripts/run.sh"
}
```
**Why it matters**: Plugins install in different locations depending on:
- User installation method (marketplace, local, npm)
- Operating system conventions
- User preferences
**Where to use it**:
- Hook command paths
- MCP server command arguments
- Script execution references
- Resource file paths
**Never use**:
- Hardcoded absolute paths (`/Users/name/plugins/...`)
- Relative paths from working directory (`./scripts/...` in commands)
- Home directory shortcuts (`~/plugins/...`)
### Path Resolution Rules
**In manifest JSON fields** (hooks, MCP servers):
```json
"command": "${CLAUDE_PLUGIN_ROOT}/scripts/tool.sh"
```
**In component files** (commands, agents, skills):
```markdown
Reference scripts at: ${CLAUDE_PLUGIN_ROOT}/scripts/helper.py
```
**In executed scripts**:
```bash
#!/bin/bash
# ${CLAUDE_PLUGIN_ROOT} available as environment variable
source "${CLAUDE_PLUGIN_ROOT}/lib/common.sh"
```
## File Naming Conventions
### Component Files
**Commands**: Use kebab-case `.md` files
- `code-review.md` → `/code-review`
- `run-tests.md` → `/run-tests`
- `api-docs.md` → `/api-docs`
**Agents**: Use kebab-case `.md` files describing role
- `test-generator.md`
- `code-reviewer.md`
- `performance-analyzer.md`
**Skills**: Use kebab-case directory names
- `api-testing/`
- `database-migrations/`
- `error-handling/`
### Supporting Files
**Scripts**: Use descriptive kebab-case names with appropriate extensions
- `validate-input.sh`
- `generate-report.py`
- `process-data.js`
**Documentation**: Use kebab-case markdown files
- `api-reference.md`
- `migration-guide.md`
- `best-practices.md`
**Configuration**: Use standard names
- `hooks.json`
- `.mcp.json`
- `plugin.json`
## Auto-Discovery Mechanism
Claude Code automatically discovers and loads components:
1. **Plugin manifest**: Reads `.claude-plugin/plugin.json` when plugin enables
2. **Commands**: Scans `commands/` directory for `.md` files
3. **Agents**: Scans `agents/` directory for `.md` files
4. **Skills**: Scans `skills/` for subdirectories containing `SKILL.md`
5. **Hooks**: Loads configuration from `hooks/hooks.json` or manifest
6. **MCP servers**: Loads configuration from `.mcp.json` or manifest
**Discovery timing**:
- Plugin installation: Components register with Claude Code
- Plugin enable: Components become available for use
- No restart required: Changes take effect on next Claude Code session
**Override behavior**: Custom paths in `plugin.json` supplement (not replace) default directories
## Best Practices
### Organization
1. **Logical grouping**: Group related components together
- Put test-related commands, agents, and skills together
- Create subdirectories in `scripts/` for different purposes
2. **Minimal manifest**: Keep `plugin.json` lean
- Only specify custom paths when necessary
- Rely on auto-discovery for standard layouts
- Use inline configuration only for simple cases
3. **Documentation**: Include README files
- Plugin root: Overall purpose and usage
- Component directories: Specific guidance
- Script directories: Usage and requirements
### Naming
1. **Consistency**: Use consistent naming across components
- If command is `test-runner`, name related agent `test-runner-agent`
- Match skill directory names to their purpose
2. **Clarity**: Use descriptive names that indicate purpose
- Good: `api-integration-testing/`, `code-quality-checker.md`
- Avoid: `utils/`, `misc.md`, `temp.sh`
3. **Length**: Balance brevity with clarity
- Commands: 2-3 words (`review-pr`, `run-ci`)
- Agents: Describe role clearly (`code-reviewer`, `test-generator`)
- Skills: Topic-focused (`error-handling`, `api-design`)
### Portability
1. **Always use ${CLAUDE_PLUGIN_ROOT}**: Never hardcode paths
2. **Test on multiple systems**: Verify on macOS, Linux, Windows
3. **Document dependencies**: List required tools and versions
4. **Avoid system-specific features**: Use portable bash/Python constructs
### Maintenance
1. **Version consistently**: Update version in plugin.json for releases
2. **Deprecate gracefully**: Mark old components clearly before removal
3. **Document breaking changes**: Note changes affecting existing users
4. **Test thoroughly**: Verify all components work after changes
## Common Patterns
### Minimal Plugin
Single command with no dependencies:
```
my-plugin/
├── .claude-plugin/
│ └── plugin.json # Just name field
└── commands/
└── hello.md # Single command
```
### Full-Featured Plugin
Complete plugin with all component types:
```
my-plugin/
├── .claude-plugin/
│ └── plugin.json
├── commands/ # User-facing commands
├── agents/ # Specialized subagents
├── skills/ # Auto-activating skills
├── hooks/ # Event handlers
│ ├── hooks.json
│ └── scripts/
├── .mcp.json # External integrations
└── scripts/ # Shared utilities
```
### Skill-Focused Plugin
Plugin providing only skills:
```
my-plugin/
├── .claude-plugin/
│ └── plugin.json
└── skills/
├── skill-one/
│ └── SKILL.md
└── skill-two/
└── SKILL.md
```
## Troubleshooting
**Component not loading**:
- Verify file is in correct directory with correct extension
- Check YAML frontmatter syntax (commands, agents, skills)
- Ensure skill has `SKILL.md` (not `README.md` or other name)
- Confirm plugin is enabled in Claude Code settings
**Path resolution errors**:
- Replace all hardcoded paths with `${CLAUDE_PLUGIN_ROOT}`
- Verify paths are relative and start with `./` in manifest
- Check that referenced files exist at specified paths
- Test with `echo $CLAUDE_PLUGIN_ROOT` in hook scripts
**Auto-discovery not working**:
- Confirm directories are at plugin root (not in `.claude-plugin/`)
- Check file naming follows conventions (kebab-case, correct extensions)
- Verify custom paths in manifest are correct
- Restart Claude Code to reload plugin configuration
**Conflicts between plugins**:
- Use unique, descriptive component names
- Namespace commands with plugin name if needed
- Document potential conflicts in plugin README
- Consider command prefixes for related functionality
---
For detailed examples and advanced patterns, see files in `references/` and `examples/` directories.
Источник: anthropics/claude-plugins-official / plugin-dev / plugin-structure ↗. Ссылка проверена 2026-10-10.