plugin-structure

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 director

By anthropics · 5,749 installs

npx skills add anthropics/claude-plugins-official --skill plugin-structure

Source repository · Upstream listing

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: 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 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 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): 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 : File format : 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 : File format : 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 : SKILL.md format : 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 : Configuration format : 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 : 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: 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): In component files (commands, agents, skills): In executed scripts : 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: Full Featured Plugin Complete plugin with all component types: Skill Focused Plugin Plugin providing only skills: 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.