|
Download plugins/plugin-dev/skills/plugin-structure/SKILL.md from SaylorTwift/claude-code: direct link, hf CLI and curl.
- Browser
- Download file 13.8 kB
-
https://huggingface.co/SaylorTwift/claude-code/resolve/main/plugins/plugin-dev/skills/plugin-structure/SKILL.md
- Command line
-
hf download hf://SaylorTwift/claude-code/plugins/plugin-dev/skills/plugin-structure/SKILL.md
-
curl -L -o SKILL.md https://huggingface.co/SaylorTwift/claude-code/resolve/main/plugins/plugin-dev/skills/plugin-structure/SKILL.md
13.8 kB
| 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. | |