421 lines
11 KiB
Markdown
421 lines
11 KiB
Markdown
---
|
|
name: claude-plugins
|
|
description: This skill should be used when creating plugins, publishing to marketplaces, or when "plugin.json", "marketplace", "create plugin", or "distribute plugin" are mentioned.
|
|
metadata:
|
|
version: "1.0.0"
|
|
related-skills:
|
|
- claude-plugin-audit
|
|
- claude-agents
|
|
- claude-commands
|
|
- claude-hooks
|
|
- skills-dev
|
|
- claude-rules
|
|
- claude-config
|
|
---
|
|
|
|
# Claude Plugin Development
|
|
|
|
Complete lifecycle for developing, validating, and distributing Claude Code plugins.
|
|
|
|
## Steps
|
|
|
|
1. Define plugin scope and components needed
|
|
2. Initialize plugin structure with `plugin.json`
|
|
3. If adding commands, load the `outfitter:claude-commands` skill
|
|
4. If adding agents, load the `outfitter:claude-agents` skill
|
|
5. If adding hooks, load the `outfitter:claude-hooks` skill
|
|
6. If adding skills, load the `outfitter:skills-dev` skill
|
|
7. Delegate by loading the `outfitter:claude-plugin-audit` skill for validation
|
|
8. Fix issues and distribute
|
|
|
|
## Quick Start
|
|
|
|
```bash
|
|
# 1. Scaffold plugin
|
|
./scripts/scaffold-plugin.sh my-plugin --with-commands
|
|
|
|
# 2. Add components (commands, agents, hooks, skills)
|
|
# 3. Test locally
|
|
/plugin marketplace add ./my-plugin
|
|
/plugin install my-plugin@my-plugin
|
|
|
|
# 4. Distribute
|
|
git push origin main --tags
|
|
```
|
|
|
|
## Lifecycle Overview
|
|
|
|
```
|
|
Discovery -> Init -> Components -> Validate -> Distribute -> Marketplace
|
|
| | | | | |
|
|
v v v v v v
|
|
Purpose Scaffold Commands Structure Package Catalog
|
|
Scope plugin.json Agents Testing Version Publish
|
|
Type README Hooks Quality Release Share
|
|
```
|
|
|
|
## Stage 1: Discovery
|
|
|
|
Before creating a plugin, clarify:
|
|
|
|
| Question | Impact |
|
|
|----------|--------|
|
|
| What problem does this solve? | Plugin scope and features |
|
|
| Who will use it? | Distribution method |
|
|
| What components are needed? | Commands, agents, hooks, MCP servers |
|
|
| Where will it live? | Personal, project, or marketplace |
|
|
|
|
## Stage 2: Initialization
|
|
|
|
### Standalone Plugin
|
|
|
|
Standalone plugins need their own `.claude-plugin/plugin.json`:
|
|
|
|
```
|
|
my-plugin/
|
|
├── .claude-plugin/
|
|
│ └── plugin.json # Required for standalone
|
|
├── README.md # Required for distribution
|
|
├── commands/ # Optional components
|
|
├── agents/
|
|
├── skills/
|
|
└── hooks/
|
|
```
|
|
|
|
### plugin.json (Standalone)
|
|
|
|
```json
|
|
{
|
|
"name": "my-plugin",
|
|
"version": "1.0.0",
|
|
"description": "Brief description of what this plugin does",
|
|
"author": {
|
|
"name": "Your Name",
|
|
"email": "you@example.com"
|
|
},
|
|
"license": "MIT"
|
|
}
|
|
```
|
|
|
|
### Marketplace with Local Plugins (Consolidated)
|
|
|
|
For marketplaces where all plugins live in the same repo, use `strict: false` to consolidate metadata. Plugins don't need their own manifests:
|
|
|
|
```
|
|
my-marketplace/
|
|
├── .claude-plugin/
|
|
│ └── marketplace.json # All metadata here (strict: false)
|
|
├── plugin-a/
|
|
│ └── commands/
|
|
├── plugin-b/
|
|
│ └── skills/
|
|
└── README.md
|
|
```
|
|
|
|
### marketplace.json (Consolidated)
|
|
|
|
```json
|
|
{
|
|
"name": "my-marketplace",
|
|
"owner": {
|
|
"name": "Team Name",
|
|
"email": "team@example.com"
|
|
},
|
|
"strict": false,
|
|
"plugins": [
|
|
{"name": "plugin-a", "source": "./plugin-a", "version": "1.0.0", "description": "Plugin A", "license": "MIT"},
|
|
{"name": "plugin-b", "source": "./plugin-b", "version": "1.0.0", "description": "Plugin B", "license": "MIT"}
|
|
]
|
|
}
|
|
```
|
|
|
|
**Benefits:** Single source of truth, no version drift between marketplace and plugin manifests.
|
|
|
|
For external plugins (GitHub repos), use minimal entries and let the external repo own its manifest.
|
|
|
|
See [structure.md](references/structure.md) for complete plugin.json schema.
|
|
|
|
## Stage 3: Components
|
|
|
|
Add components based on plugin needs. See Steps section for which skills to load.
|
|
|
|
### Slash Commands
|
|
|
|
Create custom commands in `commands/` directory:
|
|
|
|
```markdown
|
|
---
|
|
description: "Review code for quality issues"
|
|
---
|
|
|
|
Review the following code: {{0}}
|
|
|
|
Check for: code style, bugs, performance, security
|
|
```
|
|
|
|
For complex commands, load the `outfitter:claude-commands` skill.
|
|
|
|
### Custom Agents
|
|
|
|
Define specialized agents in `agents/` directory:
|
|
|
|
```markdown
|
|
---
|
|
name: security-reviewer
|
|
description: "Security-focused code reviewer"
|
|
---
|
|
|
|
You are a security expert. When reviewing code:
|
|
1. Check for vulnerabilities
|
|
2. Verify input validation
|
|
3. Report issues with severity levels
|
|
```
|
|
|
|
For agent design patterns, load the `outfitter:claude-agents` skill.
|
|
|
|
### Event Hooks
|
|
|
|
Two ways to define hooks:
|
|
|
|
**File-based** (auto-discovered from `hooks/hooks.json`):
|
|
|
|
```json
|
|
{
|
|
"hooks": {
|
|
"PreToolUse": [
|
|
{
|
|
"matcher": "Write|Edit",
|
|
"hooks": [{"type": "command", "command": "${CLAUDE_PLUGIN_ROOT}/scripts/validate.sh"}]
|
|
}
|
|
]
|
|
}
|
|
}
|
|
```
|
|
|
|
**Inline in plugin.json** - same structure, add `"hooks"` key directly.
|
|
|
|
Hook types: PreToolUse, PostToolUse, UserPromptSubmit, Stop, SessionStart, SessionEnd
|
|
|
|
For hook implementation, load the `outfitter:claude-hooks` skill. See [structure.md](references/structure.md) for hook JSON format and script interface.
|
|
|
|
### Skills
|
|
|
|
Add reusable methodology patterns in `skills/` directory. For skill authoring, load the `outfitter:skills-dev` skill.
|
|
|
|
### MCP Servers
|
|
|
|
```json
|
|
{
|
|
"mcpServers": {
|
|
"my-server": {
|
|
"command": "${CLAUDE_PLUGIN_ROOT}/servers/my-server",
|
|
"args": ["--config", "${CLAUDE_PLUGIN_ROOT}/config.json"],
|
|
"env": {"API_KEY": "${MY_API_KEY}"}
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
Path variables: `${CLAUDE_PLUGIN_ROOT}` (plugin directory), `${VAR_NAME}` (env var)
|
|
|
|
## Plugin Caching
|
|
|
|
When plugins are installed, Claude Code copies them to a cache directory. This has implications:
|
|
|
|
- **Path traversal breaks**: `../../shared/file.md` will not work after install
|
|
- **Keep resources inside plugin**: Shared scripts, rules, and assets must be within plugin directory
|
|
- **Cross-plugin dependencies**: Use skill invocation (`plugin:skill-name`) instead of file references
|
|
|
|
See [caching.md](references/caching.md) for workarounds and best practices.
|
|
|
|
## Stage 4: Validation
|
|
|
|
Before distribution, validate the plugin.
|
|
|
|
### Checklist
|
|
|
|
**Structure:**
|
|
- [ ] Standalone: plugin.json exists and is valid JSON
|
|
- [ ] Marketplace (consolidated): metadata in marketplace.json with `strict: false`
|
|
- [ ] Required fields present (name, version, description)
|
|
- [ ] Plugin name matches directory name (kebab-case)
|
|
|
|
**Components:**
|
|
- [ ] Commands have YAML frontmatter with description
|
|
- [ ] Agents have YAML frontmatter with name and description
|
|
- [ ] Hook scripts are executable (`chmod +x`)
|
|
- [ ] Hook matchers are valid regex
|
|
|
|
**Documentation:**
|
|
- [ ] README.md with installation instructions
|
|
- [ ] LICENSE file included
|
|
|
|
### Local Testing
|
|
|
|
```bash
|
|
# Add as local marketplace
|
|
/plugin marketplace add ./my-plugin
|
|
|
|
# Install and test
|
|
/plugin install my-plugin@my-plugin
|
|
|
|
# Test commands
|
|
/my-command arg1 arg2
|
|
```
|
|
|
|
See [structure.md](references/structure.md) for validation commands and detailed component schemas.
|
|
|
|
## Stage 5: Distribution
|
|
|
|
### Semantic Versioning
|
|
|
|
Follow semver (MAJOR.MINOR.PATCH):
|
|
- **MAJOR**: Breaking changes
|
|
- **MINOR**: New features (backward compatible)
|
|
- **PATCH**: Bug fixes
|
|
|
|
### Release Workflow
|
|
|
|
```bash
|
|
# 1. Update version in plugin.json
|
|
# 2. Update CHANGELOG.md
|
|
# 3. Commit and tag
|
|
git add plugin.json CHANGELOG.md
|
|
git commit -m "chore: release v1.0.0"
|
|
git tag v1.0.0
|
|
git push origin main --tags
|
|
|
|
# 4. Create GitHub release
|
|
gh release create v1.0.0 --title "v1.0.0" --notes "Initial release"
|
|
```
|
|
|
|
### Distribution Methods
|
|
|
|
| Method | Best For | Setup |
|
|
|--------|----------|-------|
|
|
| GitHub repo | Public/team plugins | Push to GitHub |
|
|
| Git URL | GitLab, Bitbucket | Full URL in source |
|
|
| Local path | Development/testing | Relative path |
|
|
|
|
See [distribution.md](references/distribution.md) for packaging, CI/CD, and release automation.
|
|
|
|
## Stage 6: Marketplace
|
|
|
|
A marketplace catalogs plugins for discovery and installation.
|
|
|
|
### Creating a Marketplace
|
|
|
|
Create `.claude-plugin/marketplace.json`:
|
|
|
|
```json
|
|
{
|
|
"name": "my-marketplace",
|
|
"owner": {"name": "Team Name", "email": "team@example.com"},
|
|
"plugins": [
|
|
{"name": "my-plugin", "source": "./plugins/my-plugin"}
|
|
]
|
|
}
|
|
```
|
|
|
|
### Plugin Sources
|
|
|
|
```json
|
|
// Relative path
|
|
{"source": "./plugins/my-plugin"}
|
|
|
|
// GitHub
|
|
{"source": {"source": "github", "repo": "owner/plugin-repo", "ref": "v1.0.0"}}
|
|
|
|
// Git URL
|
|
{"source": {"source": "url", "url": "https://gitlab.com/team/plugin.git"}}
|
|
```
|
|
|
|
### Commands
|
|
|
|
```bash
|
|
/plugin marketplace add owner/repo # Add marketplace
|
|
/plugin marketplace list # List available
|
|
/plugin install plugin-name@marketplace # Install from marketplace
|
|
/plugin marketplace update marketplace # Update
|
|
```
|
|
|
|
See [marketplace.md](references/marketplace.md) for full schema, team configuration, and hosting strategies.
|
|
|
|
## Best Practices
|
|
|
|
### Naming Conventions
|
|
|
|
- **Plugin name**: kebab-case (e.g., `dev-tools`)
|
|
- **Commands**: kebab-case (e.g., `review-pr`)
|
|
- **Agents**: kebab-case (e.g., `security-reviewer`)
|
|
|
|
### Security
|
|
|
|
- Never hardcode secrets in plugin files
|
|
- Use environment variables for sensitive data
|
|
- Validate all user inputs in hooks
|
|
- Document security requirements
|
|
|
|
### Documentation
|
|
|
|
- **README.md**: Overview, installation, usage examples
|
|
- **CHANGELOG.md**: Version history with semver
|
|
- **LICENSE**: Appropriate license file
|
|
|
|
## Troubleshooting
|
|
|
|
**Plugin not loading:**
|
|
- Standalone: verify plugin.json syntax: `jq empty .claude-plugin/plugin.json`
|
|
- Marketplace: verify marketplace.json syntax and `strict: false` if no plugin.json
|
|
- Check plugin name matches directory
|
|
- Ensure required fields present (name, version, description)
|
|
|
|
**Commands not appearing:**
|
|
- Verify YAML frontmatter exists
|
|
- Check files in `commands/` directory
|
|
|
|
**Hooks not executing:**
|
|
- Check scripts executable: `chmod +x`
|
|
- Verify matcher regex correct
|
|
- Test hook script independently
|
|
|
|
**MCP servers failing:**
|
|
- Verify server binary exists
|
|
- Check environment variables set
|
|
- Review logs: `~/Library/Logs/Claude/`
|
|
|
|
<references>
|
|
|
|
- [structure.md](references/structure.md) - Directory layout, plugin.json schema, component formats
|
|
- [distribution.md](references/distribution.md) - Packaging, versioning, CI/CD, release automation
|
|
- [marketplace.md](references/marketplace.md) - Marketplace schema, hosting, team configuration
|
|
- [caching.md](references/caching.md) - Plugin caching behavior and cross-plugin dependencies
|
|
|
|
</references>
|
|
|
|
<rules>
|
|
|
|
ALWAYS:
|
|
- Standalone plugins: create `.claude-plugin/plugin.json`
|
|
- Marketplace local plugins: use `strict: false` and consolidate metadata in marketplace.json
|
|
- External plugins: let the external repo own its manifest
|
|
- Keep plugin resources within plugin directory (caching limitation)
|
|
- Use kebab-case for all names
|
|
- Include README.md and LICENSE for distribution
|
|
- Follow semantic versioning
|
|
|
|
NEVER:
|
|
- Hardcode secrets in plugin files
|
|
- Use path traversal (`../`) for cross-plugin resources
|
|
- Skip validation before distribution
|
|
- Omit description (in plugin.json or marketplace entry)
|
|
|
|
</rules>
|
|
|
|
## Related Skills
|
|
|
|
- **claude-commands** - Slash command development
|
|
- **claude-agents** - Custom agent design
|
|
- **claude-hooks** - Event hook implementation
|
|
- **skills-dev** - Skill creation patterns
|