From plugin-expert
Complete guide to Claude Code plugin development, architecture, directory layout, components, and marketplace publishing. PROACTIVELY activate for: (1) creating a plugin from scratch, (2) building or scaffolding a plugin, (3) writing plugin.json, (4) adding commands/agents/skills/hooks/MCP servers, (5) packaging code as a plugin, (6) publishing to a marketplace, (7) validating plugin structure, (8) marketplace.json registration, (9) cross-platform compatibility, (10) version and metadata sync. Provides: plugin schema, layouts, workflows, and publishing steps.
How this skill is triggered — by the user, by Claude, or both
Slash command
/plugin-expert:plugin-masterThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
| Component | Location | Required |
| Component | Location | Required |
|---|---|---|
| Plugin manifest | .claude-plugin/plugin.json | Yes |
| Commands | commands/*.md | No (auto-discovered) |
| Agents | agents/*.md | No (auto-discovered) |
| Skills | skills/*/SKILL.md | No (auto-discovered) |
| Hooks | hooks/hooks.json | No |
| MCP Servers | .mcp.json | No |
| Task | Action |
|---|---|
| Create plugin | Ask: "Create a plugin for X" |
| Validate plugin | Run: /validate-plugin |
| Install from marketplace | /plugin marketplace add user/repo then /plugin install name@user |
plugin-name/
├── .claude-plugin/
│ └── plugin.json # MUST be inside .claude-plugin/
├── agents/
│ └── domain-expert.md
├── commands/
├── skills/
│ └── skill-name/
│ ├── SKILL.md
│ ├── references/
│ └── examples/
└── README.md
{
"name": "plugin-name",
"version": "1.0.0",
"description": "Complete [domain] expertise. PROACTIVELY activate for: (1) ...",
"author": {
"name": "Author Name",
"email": "[email protected]"
},
"license": "MIT",
"keywords": ["keyword1", "keyword2"]
}
Validation Rules:
author MUST be an object { "name": "..." } - NOT a stringversion MUST be a string "1.0.0" - NOT a numberkeywords MUST be an array ["word1", "word2"] - NOT a stringagents, skills, slashCommands - these are auto-discoveredALL markdown files in agents/, commands/, skills/ MUST begin with frontmatter:
---
description: Brief description of what this component does
---
# Content...
Without frontmatter, components will NOT load.
{domain}-expertNaming Standard:
docker-master → agent named docker-expertterraform-master → agent named terraform-expertSkills use three-tier loading:
This enables unbounded capacity without context bloat.
Before creating files, check:
# Check if in marketplace repo
if [[ -f .claude-plugin/marketplace.json ]]; then
PLUGIN_DIR="plugins/PLUGIN_NAME"
else
PLUGIN_DIR="PLUGIN_NAME"
fi
# Get author from git config
AUTHOR_NAME=$(git config user.name)
AUTHOR_EMAIL=$(git config user.email)
mkdir -p $PLUGIN_DIR/.claude-plugin
mkdir -p $PLUGIN_DIR/agents
mkdir -p $PLUGIN_DIR/skills/domain-knowledge
If the plugin ships any vendored, derived, or licensed third-party content, create NOTICES.md at the plugin root before registering in the marketplace. Treat it as a first-class shipping artifact alongside plugin.json and README.md, not as doc polish. See references/publishing-guide.md ("Licensed / Vendored / Derived Content" checklist) for the structural integrity, license-text-preservation, and cross-reference requirements.
If the plugin contains no third-party content, skip this step.
CRITICAL: If .claude-plugin/marketplace.json exists at repo root, you MUST add the plugin:
{
"plugins": [
{
"name": "plugin-name",
"source": "./plugins/plugin-name",
"description": "Same as plugin.json description",
"version": "1.0.0",
"author": { "name": "Author" },
"keywords": ["same", "as", "plugin.json"]
}
]
}
User-initiated slash commands in commands/*.md:
---
description: What this command does
---
# Command Name
Instructions for Claude to execute...
Autonomous subagents in agents/*.md:
---
name: agent-name
description: |
Brief role summary. PROACTIVELY activate for: (1) trigger, (2) trigger, ..., (N) trigger. Provides: capability list.
# Optional. Include 3-5 <example> blocks ONLY when the agent body
# exceeds 2,500 words. Lean orchestrators omit them by design.
# See agent-development "Example-block requirement by agent body size".
model: inherit
color: blue
---
System prompt for agent...
Dynamic knowledge in skills/skill-name/SKILL.md:
---
name: skill-name
description: When to use this skill...
---
# Skill content with progressive disclosure...
Event automation in hooks/hooks.json:
{
"PostToolUse": [{
"matcher": "Write|Edit",
"hooks": [{
"type": "command",
"command": "${CLAUDE_PLUGIN_ROOT}/scripts/lint.sh"
}]
}]
}
Events: PreToolUse, PostToolUse, SessionStart, SessionEnd, UserPromptSubmit, PreCompact, Notification, Stop, SubagentStop
kebab-case (e.g., code-review-helper)review-pr, run-tests)code-reviewer, test-generator)api-design, error-handling)Use ${CLAUDE_PLUGIN_ROOT} for all internal paths:
"command": "${CLAUDE_PLUGIN_ROOT}/scripts/run.sh"
Never use hardcoded absolute paths.
$MSYSTEM, use GitHub method| Issue | Solution |
|---|---|
| Plugin not loading | Check plugin.json is in .claude-plugin/ |
| Commands missing | Verify frontmatter has description field |
| Agent not triggering | Check description has PROACTIVELY activate for: enumeration. Add 3-5 <example> blocks only if agent body > 2,500 words — see agent-development SKILL.md "Example-block requirement by agent body size". Lean orchestrators are exempt. |
| Marketplace not found | Ensure repo is public, check path in marketplace.json |
For detailed information, see:
references/manifest-reference.md - Complete plugin.json fieldsreferences/component-patterns.md - Advanced component patternsreferences/publishing-guide.md - Marketplace publishing detailsexamples/minimal-plugin.md - Simplest working pluginexamples/full-plugin.md - Complete plugin with all featuresGuides creation, editing, and verification of skills for AI coding agents using test-driven development with subagent scenarios. Use when authoring or debugging skills.
npx claudepluginhub thimslugga/thimslugga-cc-plugins --plugin plugin-expert