Create a new Claude Code plugin with proper directory structure and manifest. Use when the user wants to create a new plugin from scratch. Sets up plugin.json, directory structure, and optional components.
84
81%
Does it follow best practices?
Impact
Pending
No eval scenarios have been run
Passed
No known issues
Create new Claude Code plugins with proper structure and configuration.
plugin-name/
├── .claude-plugin/ # Required: Metadata directory
│ └── plugin.json # Required: Plugin manifest
├── commands/ # Optional: Command definitions
│ ├── command1.md
│ └── command2.md
├── agents/ # Optional: Agent definitions
│ ├── agent1.md
│ └── agent2.md
├── skills/ # Optional: Agent Skills
│ ├── skill-name/
│ │ └── SKILL.md
│ └── another-skill/
│ ├── SKILL.md
│ └── scripts/
├── hooks/ # Optional: Hook configurations
│ ├── hooks.json # Main hook config
│ └── additional-hooks.json
├── .mcp.json # Optional: MCP server definitions
├── scripts/ # Optional: Hook and utility scripts
│ ├── script1.sh
│ └── script2.py
├── LICENSE # Optional: License file
├── CHANGELOG.md # Optional: Version history
└── README.md # Optional: Documentation| Field | Type | Description |
|---|---|---|
name | string | Plugin identifier (kebab-case recommended) |
version | string | Semantic version (e.g., "1.2.0") |
description | string | Brief description of the plugin |
| Field | Type | Description |
|---|---|---|
author | object | Author information |
author.name | string | Author's name (required if author present) |
author.email | string | Author's email |
author.url | string | Author's website or GitHub profile |
homepage | string | Plugin documentation URL |
repository | string | Git repository URL |
license | string | License identifier (e.g., "MIT", "Apache-2.0") |
keywords | array | Searchable keywords |
commands | string or array | Custom command locations (directory or file paths) |
agents | array | Array of agent file paths (must end with .md) |
hooks | string | Custom hook configuration file location |
mcpServers | string | Custom MCP server configuration file location |
Commands MUST be a string (directory path) or array of strings (file paths):
CORRECT - Directory path:
{
"commands": "./commands/"
}CORRECT - Array of file paths:
{
"commands": ["./commands/lint.md", "./commands/format.md"]
}CORRECT - Single custom path:
{
"commands": "./custom/commands/special.md"
}WRONG - Object format (INVALID):
{
"commands": {
"my-command": {
"description": "...",
"source": "..."
}
}
}Agents MUST be an array of file paths ending with .md:
CORRECT:
{
"agents": [
"./agents/my-agent.md",
"./agents/another-agent.md"
]
}CORRECT - Single agent:
{
"agents": ["./agents/expert.md"]
}WRONG - Directory path (INVALID):
{
"agents": "./agents/"
}WRONG - Object format (INVALID):
{
"agents": {
"agent-name": {
"description": "...",
"file": "..."
}
}
}Skills are automatically discovered from the skills/ directory. No manifest entry needed.
Each skill must be in its own folder with a SKILL.md file:
skills/
├── skill-name/
│ └── SKILL.md
└── another-skill/
└── SKILL.md{
"name": "my-plugin",
"version": "1.0.0",
"description": "A simple plugin for Claude Code"
}{
"name": "code-quality",
"version": "1.0.0",
"description": "Code quality tools including linting and review",
"author": {
"name": "Developer",
"email": "dev@example.com"
},
"commands": "./commands/",
"agents": [
"./agents/code-reviewer.md"
]
}{
"name": "enterprise-plugin",
"version": "1.2.0",
"description": "Enterprise-grade development plugin",
"author": {
"name": "Jane Developer",
"email": "jane@example.com",
"url": "https://github.com/janedev"
},
"homepage": "https://docs.example.com/plugin",
"repository": "https://github.com/janedev/enterprise-plugin",
"license": "MIT",
"keywords": ["enterprise", "security", "compliance"],
"commands": ["./custom/commands/special.md"],
"agents": ["./custom/agents/security-expert.md"],
"hooks": "./config/hooks.json",
"mcpServers": "./mcp-config.json"
}Plan the plugin
Create directory structure
mkdir -p plugin-name/.claude-plugin
mkdir -p plugin-name/agents
mkdir -p plugin-name/commands
mkdir -p plugin-name/skillsCreate plugin.json
{
"name": "plugin-name",
"version": "1.0.0",
"description": "Plugin description",
"author": {
"name": "Author Name"
},
"commands": "./commands/",
"agents": ["./agents/my-agent.md"]
}Add components
agents/ with proper frontmattercommands/ with proper frontmatterskills/skill-name/SKILL.mdIMPORTANT: Register in marketplace.json
Every new plugin MUST be added to .claude-plugin/marketplace.json
Validate the plugin
./scripts/validate-all-plugins.sh plugin-nameCommit the changes Include both the plugin directory AND marketplace.json
Every new plugin must be registered in .claude-plugin/marketplace.json.
Add a new entry to the plugins array:
{
"plugins": [
// ... existing plugins ...
{
"name": "plugin-name",
"description": "Brief plugin description",
"source": "./plugins/plugin-name",
"category": "development"
}
]
}| Field | Required | Description |
|---|---|---|
name | Yes | Must match plugin.json name |
description | Yes | Brief description for marketplace listing |
source | Yes | Relative path to plugin directory |
category | Yes | One of: productivity, development, security |
productivity - Workflow, project management, documentation toolsdevelopment - Code quality, testing, language-specific toolssecurity - Security, compliance, privacy tools/plugin marketplace add ./path-to-marketplace/plugin install plugin-name@marketplace-name/help to see commands| Error | Cause | Fix |
|---|---|---|
Missing required file: .claude-plugin/plugin.json | No manifest | Create .claude-plugin/plugin.json |
plugin.json missing required fields | Missing name, version, or description | Add all required fields |
'author' must be an object | Author is a string | Use object format with name field |
Invalid JSON syntax | Trailing commas, missing quotes | Fix JSON syntax |
agents: Invalid input: must end with ".md" | Using directory path for agents | Use array of file paths: ["./agents/name.md"] |
version fieldIf you have an existing plugin without plugin.json:
cd plugins/your-plugin
mkdir -p .claude-plugin
cat > .claude-plugin/plugin.json << 'EOF'
{
"name": "your-plugin",
"version": "1.0.0",
"description": "Your plugin description",
"author": {
"name": "Your Name"
}
}
EOF0ebe7ae
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.