Plugin Building and Packaging
Package your skills, agents, commands, and hooks as distributable plugins.
Plugin Structure
CRITICAL RULE: Only plugin.json goes inside .claude-plugin/. All components go at the plugin ROOT:
my-plugin/ <- Plugin name = neutral noun ├── .claude-plugin/ │ └── plugin.json # ONLY this file here! ├── commands/ # Slash commands (*.md) - imperative verbs ├── agents/ # Agent definitions (*.md) - role nouns ├── skills/ # Skills (*/SKILL.md) - ending in -ing ├── hooks/ # Event handlers (hooks.json) ├── .mcp.json # MCP servers (optional) ├── .lsp.json # LSP servers (optional) └── README.md
# ❌ WRONG - components inside .claude-plugin/ .claude-plugin/ ├── plugin.json ├── commands/ ← NO! └── skills/ ← NO! # ✅ CORRECT - components at plugin root .claude-plugin/ └── plugin.json commands/ ← YES! skills/ ← YES!
plugin.json Manifest
Required fields:
{
"name": "my-plugin",
"version": "1.0.0",
"description": "What this plugin does"
}
With recommended metadata:
{
"name": "my-plugin",
"version": "1.0.0",
"description": "What this plugin does",
"author": {
"name": "Your Name",
"email": "you@example.com"
},
"license": "MIT",
"keywords": ["keyword1", "keyword2"],
"repository": "https://github.com/user/repo",
"homepage": "https://github.com/user/repo#readme"
}
See references/plugin-json-schema.md for the complete field reference.
Naming Conventions
See /metaskill-naming for the full naming convention.
Quick reference:
| Component | Form | Example |
|---|---|---|
| Plugin name | Neutral noun | metaskill, codeforge, datakit |
| Skills | -ing (gerund) | metaskill-authoring, metaskill-triggering |
| Agents | Role noun | metaskill-trigger-tester, metaskill-analyzer |
| Commands | Imperative verb | /metaskill-create, /quick-start |
Plugin name = Common prefix of all atoms
# ✅ GOOD - neutral noun prefix, correct suffixes
metaskill/
├── skills/
│ ├── metaskill-authoring/ # -ing
│ └── metaskill-triggering/ # -ing
├── agents/
│ └── metaskill-trigger-tester.md # role noun
└── commands/
└── quick-start.md # imperative
# ❌ BAD - verb-form prefix
skill-authoring/
├── skills/
│ └── skill-authoring-trigger/ # prefix already -ing!
No type postfixes:
# ❌ BAD - redundant type postfix skills/code-review-skill/ agents/tester-agent.md commands/lint-command.md # ✅ GOOD - no type postfix skills/code-reviewing/ agents/tester.md commands/lint.md
Dogfooding Approaches
Quick Iteration (Active Development)
claude --plugin-dir ./my-plugin
- •Loads plugin immediately
- •Restart Claude Code to pick up changes
- •Best for rapid iteration
Marketplace Testing (Pre-Release)
# Add your repo as a local marketplace (once) /plugin marketplace add /path/to/your/repo # Install the plugin /plugin install your-repo@my-plugin # After changes, reinstall to test /plugin uninstall your-repo@my-plugin /plugin install your-repo@my-plugin
- •Tests the full installation flow
- •Verifies the user experience
- •Use before releasing
Plugin Placement in Repos
Single Plugin at Repo Root
For a repo that IS the plugin:
my-plugin-repo/ ├── .claude-plugin/ │ └── plugin.json ├── skills/ │ └── my-plugin-authoring/ ├── agents/ └── README.md
Plugin Inside a Project (Dogfooding)
For internal tooling within a larger project:
my-project/
├── src/
├── tests/
├── .claude/ # Project's Claude config
│ └── settings.json
└── plugins/
└── my-internal-plugin/
├── .claude-plugin/
│ └── plugin.json
└── skills/
Load with: claude --plugin-dir ./plugins/my-internal-plugin
Multiple Plugins in One Repo
Use marketplace.json to reference multiple plugins:
my-repo/ ├── .claude-plugin/ │ └── marketplace.json # References plugins below ├── plugins/ │ ├── plugin-a/ │ │ ├── .claude-plugin/ │ │ │ └── plugin.json │ │ └── skills/ │ └── plugin-b/ │ ├── .claude-plugin/ │ │ └── plugin.json │ └── agents/ └── README.md
marketplace.json (required fields):
{
"name": "my-marketplace",
"owner": {
"name": "Your Name"
},
"plugins": [
{ "name": "plugin-a", "source": "./plugins/plugin-a" },
{ "name": "plugin-b", "source": "./plugins/plugin-b" }
]
}
With full metadata:
{
"name": "my-marketplace",
"owner": {
"name": "Your Name",
"email": "you@example.com"
},
"metadata": {
"description": "Description of your marketplace",
"version": "1.0.0"
},
"plugins": [
{
"name": "plugin-a",
"source": "./plugins/plugin-a",
"description": "What plugin-a does",
"version": "1.0.0",
"author": { "name": "Your Name", "email": "you@example.com" },
"license": "MIT",
"keywords": ["keyword1", "keyword2"],
"category": "development"
}
]
}
See references/marketplace-json-schema.md for the complete field reference.
Users can then:
/plugin marketplace add /path/to/my-repo /plugin install my-marketplace@plugin-a
Internal vs External Plugins
Internal (Dogfooding within Repo)
Place in a plugins/ or tools/ directory:
my-project/ ├── plugins/ │ └── internal-tooling/ # For this project only │ ├── .claude-plugin/ │ │ └── plugin.json │ └── skills/
- •Not meant for distribution
- •Project-specific utilities
- •Load with
--plugin-dir
External (Open Source / Distribution)
Option A: Dedicated plugin repo
my-plugin/ # Repo IS the plugin ├── .claude-plugin/ │ └── plugin.json └── skills/
Option B: Plugin marketplace repo
my-plugins/ # Repo contains multiple plugins
├── .claude-plugin/
│ └── marketplace.json
└── plugins/
├── plugin-a/
└── plugin-b/
Plugin Components Reference
| Directory | Contents | Naming Pattern |
|---|---|---|
.claude-plugin/ | plugin.json only | N/A |
skills/ | */SKILL.md | prefix-action-ing |
agents/ | *.md | prefix-role-noun |
commands/ | *.md | imperative-verb |
hooks/ | hooks.json | N/A |
.mcp.json | MCP servers | N/A |
.lsp.json | LSP servers | N/A |
Common Mistakes
Components in Wrong Location
# ❌ WRONG .claude-plugin/ ├── plugin.json └── skills/ # NO! Skills outside .claude-plugin/ # ✅ CORRECT .claude-plugin/ └── plugin.json skills/ # YES! At plugin root
Missing plugin.json
# ❌ WRONG - no manifest my-plugin/ └── skills/ # ✅ CORRECT - has manifest my-plugin/ ├── .claude-plugin/ │ └── plugin.json └── skills/
Verb-Form Prefix
# ❌ WRONG - prefix is already -ing skill-authoring/ ├── skills/ │ └── skill-authoring-triggering/ # Double verb! # ✅ CORRECT - neutral noun prefix metaskill/ ├── skills/ │ └── metaskill-triggering/ # Noun + -ing
Related Skills
- •For naming conventions, see
/metaskill-naming - •For skill structure and writing, see
/metaskill-authoring - •For skill group patterns, see
/metaskill-grouping - •For trigger optimization, see
/metaskill-triggering - •To test if triggers work, use the
metaskill-trigger-testeragent