Adds the plugin-dev plugin to public marketplace. A comprehensive toolkit for
developing Claude Code plugins with 7 expert skills, 3 AI-assisted agents, and
extensive documentation covering the complete plugin development lifecycle.
Key features:
- 7 skills: hook-development, mcp-integration, plugin-structure, plugin-settings,
command-development, agent-development, skill-development
- 3 agents: agent-creator (AI-assisted generation), plugin-validator (structure
validation), skill-reviewer (quality review)
- 1 command: /plugin-dev:create-plugin (guided 8-phase workflow)
- 10 utility scripts for validation and testing
- 21 reference docs with deep-dive guidance (~11k words)
- 9 working examples demonstrating best practices
Changes for public release:
- Replaced all references to internal repositories with "Claude Code"
- Updated MCP examples: internal.company.com → api.example.com
- Updated token variables: ${INTERNAL_TOKEN} → ${API_TOKEN}
- Reframed agent-creation-system-prompt as "proven in production"
- Preserved all ${CLAUDE_PLUGIN_ROOT} references (186 total)
- Preserved valuable test blocks in core modules
Validation:
- All 3 agents validated successfully with validate-agent.sh
- All JSON files validated with jq
- Zero internal references remaining
- 59 files migrated, 21,971 lines added
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
12 KiB
Plugin Manifest Reference
Complete reference for plugin.json configuration.
File Location
Required path: .claude-plugin/plugin.json
The manifest MUST be in the .claude-plugin/ directory at the plugin root. Claude Code will not recognize plugins without this file in the correct location.
Complete Field Reference
Core Fields
name (required)
Type: String
Format: kebab-case
Example: "test-automation-suite"
The unique identifier for the plugin. Used for:
- Plugin identification in Claude Code
- Conflict detection with other plugins
- Command namespacing (optional)
Requirements:
- Must be unique across all installed plugins
- Use only lowercase letters, numbers, and hyphens
- No spaces or special characters
- Start with a letter
- End with a letter or number
Validation:
/^[a-z][a-z0-9]*(-[a-z0-9]+)*$/
Examples:
- ✅ Good:
api-tester,code-review,git-workflow-automation - ❌ Bad:
API Tester,code_review,-git-workflow,test-
version
Type: String
Format: Semantic versioning (MAJOR.MINOR.PATCH)
Example: "2.1.0"
Default: "0.1.0" if not specified
Semantic versioning guidelines:
- MAJOR: Incompatible API changes, breaking changes
- MINOR: New functionality, backward-compatible
- PATCH: Bug fixes, backward-compatible
Pre-release versions:
"1.0.0-alpha.1"- Alpha release"1.0.0-beta.2"- Beta release"1.0.0-rc.1"- Release candidate
Examples:
"0.1.0"- Initial development"1.0.0"- First stable release"1.2.3"- Patch update to 1.2"2.0.0"- Major version with breaking changes
description
Type: String
Length: 50-200 characters recommended
Example: "Automates code review workflows with style checks and automated feedback"
Brief explanation of plugin purpose and functionality.
Best practices:
- Focus on what the plugin does, not how
- Use active voice
- Mention key features or benefits
- Keep under 200 characters for marketplace display
Examples:
- ✅ "Generates comprehensive test suites from code analysis and coverage reports"
- ✅ "Integrates with Jira for automatic issue tracking and sprint management"
- ❌ "A plugin that helps you do testing stuff"
- ❌ "This is a very long description that goes on and on about every single feature..."
Metadata Fields
author
Type: Object Fields: name (required), email (optional), url (optional)
{
"author": {
"name": "Jane Developer",
"email": "jane@example.com",
"url": "https://janedeveloper.com"
}
}
Alternative format (string only):
{
"author": "Jane Developer <jane@example.com> (https://janedeveloper.com)"
}
Use cases:
- Credit and attribution
- Contact for support or questions
- Marketplace display
- Community recognition
homepage
Type: String (URL)
Example: "https://docs.example.com/plugins/my-plugin"
Link to plugin documentation or landing page.
Should point to:
- Plugin documentation site
- Project homepage
- Detailed usage guide
- Installation instructions
Not for:
- Source code (use
repositoryfield) - Issue tracker (include in documentation)
- Personal websites (use
author.url)
repository
Type: String (URL) or Object
Example: "https://github.com/user/plugin-name"
Source code repository location.
String format:
{
"repository": "https://github.com/user/plugin-name"
}
Object format (detailed):
{
"repository": {
"type": "git",
"url": "https://github.com/user/plugin-name.git",
"directory": "packages/plugin-name"
}
}
Use cases:
- Source code access
- Issue reporting
- Community contributions
- Transparency and trust
license
Type: String
Format: SPDX identifier
Example: "MIT"
Software license identifier.
Common licenses:
"MIT"- Permissive, popular choice"Apache-2.0"- Permissive with patent grant"GPL-3.0"- Copyleft"BSD-3-Clause"- Permissive"ISC"- Permissive, similar to MIT"UNLICENSED"- Proprietary, not open source
Full list: https://spdx.org/licenses/
Multiple licenses:
{
"license": "(MIT OR Apache-2.0)"
}
keywords
Type: Array of strings
Example: ["testing", "automation", "ci-cd", "quality-assurance"]
Tags for plugin discovery and categorization.
Best practices:
- Use 5-10 keywords
- Include functionality categories
- Add technology names
- Use common search terms
- Avoid duplicating plugin name
Categories to consider:
- Functionality:
testing,debugging,documentation,deployment - Technologies:
typescript,python,docker,aws - Workflows:
ci-cd,code-review,git-workflow - Domains:
web-development,data-science,devops
Component Path Fields
commands
Type: String or Array of strings
Default: ["./commands"]
Example: "./cli-commands"
Additional directories or files containing command definitions.
Single path:
{
"commands": "./custom-commands"
}
Multiple paths:
{
"commands": [
"./commands",
"./admin-commands",
"./experimental-commands"
]
}
Behavior: Supplements default commands/ directory (does not replace)
Use cases:
- Organizing commands by category
- Separating stable from experimental commands
- Loading commands from shared locations
agents
Type: String or Array of strings
Default: ["./agents"]
Example: "./specialized-agents"
Additional directories or files containing agent definitions.
Format: Same as commands field
Use cases:
- Grouping agents by specialization
- Separating general-purpose from task-specific agents
- Loading agents from plugin dependencies
hooks
Type: String (path to JSON file) or Object (inline configuration)
Default: "./hooks/hooks.json"
Hook configuration location or inline definition.
File path:
{
"hooks": "./config/hooks.json"
}
Inline configuration:
{
"hooks": {
"PreToolUse": [
{
"matcher": "Write",
"hooks": [
{
"type": "command",
"command": "bash ${CLAUDE_PLUGIN_ROOT}/scripts/validate.sh",
"timeout": 30
}
]
}
]
}
}
Use cases:
- Simple plugins: Inline configuration (< 50 lines)
- Complex plugins: External JSON file
- Multiple hook sets: Separate files for different contexts
mcpServers
Type: String (path to JSON file) or Object (inline configuration)
Default: ./.mcp.json
MCP server configuration location or inline definition.
File path:
{
"mcpServers": "./.mcp.json"
}
Inline configuration:
{
"mcpServers": {
"github": {
"command": "node",
"args": ["${CLAUDE_PLUGIN_ROOT}/servers/github-mcp.js"],
"env": {
"GITHUB_TOKEN": "${GITHUB_TOKEN}"
}
}
}
}
Use cases:
- Simple plugins: Single inline server (< 20 lines)
- Complex plugins: External
.mcp.jsonfile - Multiple servers: Always use external file
Path Resolution
Relative Path Rules
All paths in component fields must follow these rules:
- Must be relative: No absolute paths
- Must start with
./: Indicates relative to plugin root - Cannot use
../: No parent directory navigation - Forward slashes only: Even on Windows
Examples:
- ✅
"./commands" - ✅
"./src/commands" - ✅
"./configs/hooks.json" - ❌
"/Users/name/plugin/commands" - ❌
"commands"(missing./) - ❌
"../shared/commands" - ❌
".\\commands"(backslash)
Resolution Order
When Claude Code loads components:
-
Default directories: Scans standard locations first
./commands/./agents/./skills/./hooks/hooks.json./.mcp.json
-
Custom paths: Scans paths specified in manifest
- Paths from
commandsfield - Paths from
agentsfield - Files from
hooksandmcpServersfields
- Paths from
-
Merge behavior: Components from all locations load
- No overwriting
- All discovered components register
- Name conflicts cause errors
Validation
Manifest Validation
Claude Code validates the manifest on plugin load:
Syntax validation:
- Valid JSON format
- No syntax errors
- Correct field types
Field validation:
namefield present and valid formatversionfollows semantic versioning (if present)- Paths are relative with
./prefix - URLs are valid (if present)
Component validation:
- Referenced paths exist
- Hook and MCP configurations are valid
- No circular dependencies
Common Validation Errors
Invalid name format:
{
"name": "My Plugin" // ❌ Contains spaces
}
Fix: Use kebab-case
{
"name": "my-plugin" // ✅
}
Absolute path:
{
"commands": "/Users/name/commands" // ❌ Absolute path
}
Fix: Use relative path
{
"commands": "./commands" // ✅
}
Missing ./ prefix:
{
"hooks": "hooks/hooks.json" // ❌ No ./
}
Fix: Add ./ prefix
{
"hooks": "./hooks/hooks.json" // ✅
}
Invalid version:
{
"version": "1.0" // ❌ Not semantic versioning
}
Fix: Use MAJOR.MINOR.PATCH
{
"version": "1.0.0" // ✅
}
Minimal vs. Complete Examples
Minimal Plugin
Bare minimum for a working plugin:
{
"name": "hello-world"
}
Relies entirely on default directory discovery.
Recommended Plugin
Good metadata for distribution:
{
"name": "code-review-assistant",
"version": "1.0.0",
"description": "Automates code review with style checks and suggestions",
"author": {
"name": "Jane Developer",
"email": "jane@example.com"
},
"homepage": "https://docs.example.com/code-review",
"repository": "https://github.com/janedev/code-review-assistant",
"license": "MIT",
"keywords": ["code-review", "automation", "quality", "ci-cd"]
}
Complete Plugin
Full configuration with all features:
{
"name": "enterprise-devops",
"version": "2.3.1",
"description": "Comprehensive DevOps automation for enterprise CI/CD pipelines",
"author": {
"name": "DevOps Team",
"email": "devops@company.com",
"url": "https://company.com/devops"
},
"homepage": "https://docs.company.com/plugins/devops",
"repository": {
"type": "git",
"url": "https://github.com/company/devops-plugin.git"
},
"license": "Apache-2.0",
"keywords": [
"devops",
"ci-cd",
"automation",
"kubernetes",
"docker",
"deployment"
],
"commands": [
"./commands",
"./admin-commands"
],
"agents": "./specialized-agents",
"hooks": "./config/hooks.json",
"mcpServers": "./.mcp.json"
}
Best Practices
Metadata
- Always include version: Track changes and updates
- Write clear descriptions: Help users understand plugin purpose
- Provide contact information: Enable user support
- Link to documentation: Reduce support burden
- Choose appropriate license: Match project goals
Paths
- Use defaults when possible: Minimize configuration
- Organize logically: Group related components
- Document custom paths: Explain why non-standard layout used
- Test path resolution: Verify on multiple systems
Maintenance
- Bump version on changes: Follow semantic versioning
- Update keywords: Reflect new functionality
- Keep description current: Match actual capabilities
- Maintain changelog: Track version history
- Update repository links: Keep URLs current
Distribution
- Complete metadata before publishing: All fields filled
- Test on clean install: Verify plugin works without dev environment
- Validate manifest: Use validation tools
- Include README: Document installation and usage
- Specify license file: Include LICENSE file in plugin root