// 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.
| 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 |
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:
.claude-plugin/plugin.json${CLAUDE_PLUGIN_ROOT}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:
plugin.json manifest MUST be in .claude-plugin/ directory.claude-plugin/The manifest defines plugin metadata and configuration. Located at .claude-plugin/plugin.json:
{
"name": "plugin-name"
}
Name requirements:
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"]
}
Version format: Follow semantic versioning (MAJOR.MINOR.PATCH) Keywords: Use for plugin discovery and categorization
Specify custom paths for components (supplements default directories):
{
"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:
./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:
---
name: command-name
description: Command description
---
Command implementation instructions...
Usage: Commands integrate as native slash commands in Claude Code
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:
---
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
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:
---
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
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:
{
"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
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:
{
"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
Use ${CLAUDE_PLUGIN_ROOT} environment variable for all intra-plugin path references:
{
"command": "bash ${CLAUDE_PLUGIN_ROOT}/scripts/run.sh"
}
Why it matters: Plugins install in different locations depending on:
Where to use it:
Never use:
/Users/name/plugins/...)./scripts/... in commands)~/plugins/...)In manifest JSON fields (hooks, MCP servers):
"command": "${CLAUDE_PLUGIN_ROOT}/scripts/tool.sh"
In component files (commands, agents, skills):
Reference scripts at: ${CLAUDE_PLUGIN_ROOT}/scripts/helper.py
In executed scripts:
#!/bin/bash
# ${CLAUDE_PLUGIN_ROOT} available as environment variable
source "${CLAUDE_PLUGIN_ROOT}/lib/common.sh"
Commands: Use kebab-case .md files
code-review.md โ /code-reviewrun-tests.md โ /run-testsapi-docs.md โ /api-docsAgents: Use kebab-case .md files describing role
test-generator.mdcode-reviewer.mdperformance-analyzer.mdSkills: Use kebab-case directory names
api-testing/database-migrations/error-handling/Scripts: Use descriptive kebab-case names with appropriate extensions
validate-input.shgenerate-report.pyprocess-data.jsDocumentation: Use kebab-case markdown files
api-reference.mdmigration-guide.mdbest-practices.mdConfiguration: Use standard names
hooks.json.mcp.jsonplugin.jsonClaude Code automatically discovers and loads components:
.claude-plugin/plugin.json when plugin enablescommands/ directory for .md filesagents/ directory for .md filesskills/ for subdirectories containing SKILL.mdhooks/hooks.json or manifest.mcp.json or manifestDiscovery timing:
Override behavior: Custom paths in plugin.json supplement (not replace) default directories
Logical grouping: Group related components together
scripts/ for different purposesMinimal manifest: Keep plugin.json lean
Documentation: Include README files
Consistency: Use consistent naming across components
test-runner, name related agent test-runner-agentClarity: Use descriptive names that indicate purpose
api-integration-testing/, code-quality-checker.mdutils/, misc.md, temp.shLength: Balance brevity with clarity
review-pr, run-ci)code-reviewer, test-generator)error-handling, api-design)Single command with no dependencies:
my-plugin/
โโโ .claude-plugin/
โ โโโ plugin.json # Just name field
โโโ commands/
โโโ hello.md # Single command
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
Plugin providing only skills:
my-plugin/
โโโ .claude-plugin/
โ โโโ plugin.json
โโโ skills/
โโโ skill-one/
โ โโโ SKILL.md
โโโ skill-two/
โโโ SKILL.md
Component not loading:
SKILL.md (not README.md or other name)Path resolution errors:
${CLAUDE_PLUGIN_ROOT}./ in manifestecho $CLAUDE_PLUGIN_ROOT in hook scriptsAuto-discovery not working:
.claude-plugin/)Conflicts between plugins:
For detailed examples and advanced patterns, see files in references/ and examples/ directories.