/creating-a-plugin
Use when creating a new Claude Code plugin or setting up plugin structure - provides complete file organization, manifest format, and component definitions for commands, agents, skills, hooks, and MCP servers
$ npx -y skills add ed3dai/ed3d-plugins --skill creating-a-plugin --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
- Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.
- You can call itInvoke it directly when you want it.
- Slash command
/creating-a-plugin
Context preview
The summary Claude sees to decide when to auto-load this skill.
Use when creating a new Claude Code plugin or setting up plugin structure - provides complete file organization, manifest format, and component definitions for commands, agents, skills, hooks, and MCP servers
SKILL.md
creating-a-plugin.SKILL.mdname: creating-a-plugin
description: Use when creating a new Claude Code plugin or setting up plugin structure - provides complete file organization, manifest format, and component definitions for commands, agents, skills, hooks, and MCP servers
user-invocable: false
Creating a Plugin
Overview
A **Claude Code plugin** packages reusable components (commands, agents, skills, hooks, MCP servers) for distribution. Create a plugin when you have components that work across multiple projects.
**Don't create a plugin for:**
- Project-specific configurations (use `.claude/` in project root)
- One-off scripts or commands
- Experimental features still in development
**Plugin storage locations:**
- Development: Anywhere during development, installed via `file:///` path
- User-level: `~/.claude/plugins/` (after installation)
- Project-level: `.claude/plugins/` (project-specific installations)
Quick Start Checklist
Minimal viable plugin:
1. Create directory: `my-plugin/` 2. Create `.claude-plugin/plugin.json` with at minimum:
{
"name": "my-plugin"
}3. Add components (commands, agents, skills, hooks, or MCP servers) 4. Test locally: `/plugin install file:///absolute/path/to/my-plugin` 5. Reload: `/plugin reload`
Directory Structure
my-plugin/
.claude-plugin/
plugin.json # Required: plugin manifest
commands/ # Optional: slash commands
my-command.md
agents/ # Optional: specialized subagents
my-agent.md
skills/ # Optional: reusable techniques
my-skill/
SKILL.md
hooks/ # Optional: event handlers
hooks.json
.mcp.json # Optional: MCP server configs
README.md # Recommended: documentation**Critical:** The `.claude-plugin/` directory with `plugin.json` inside must exist at plugin root.
Component Reference
| Component | Location | File Format | When to Use | |-----------|----------|-------------|-------------| | Commands | `commands/*.md` | Markdown + YAML frontmatter | Custom slash commands for repetitive tasks | | Agents | `agents/*.md` | Markdown + YAML frontmatter | Specialized subagents for complex workflows | | Skills | `skills/*/SKILL.md` | Markdown + YAML frontmatter | Reusable techniques and patterns | | Hooks | `hooks/hooks.json` | JSON | Event handlers (format code, validate, etc.) | | MCP Servers | `.mcp.json` | JSON | External tool integrations |
plugin.json Format
**Minimal valid manifest:**
{
"name": "my-plugin"
}**Complete annotated manifest:**
{
"name": "my-plugin", // Required: kebab-case identifier
"version": "1.0.0", // Recommended: semantic versioning
"description": "What this plugin does", // Recommended: brief description
"author": { // Optional but recommended
"name": "Your Name",
"email": "you@example.com",
"url": "https://github.com/yourname"
},
"homepage": "https://github.com/yourname/my-plugin",
"repository": "https://github.com/yourname/my-plugin",
"license": "MIT",
"keywords": ["productivity", "automation"],
"commands": [ // Optional: explicit command paths
"./commands/cmd1.md",
"./commands/cmd2.md"
],
"agents": [ // Optional: explicit agent paths
"./agents/agent1.md"
],
"hooks": [ // Optional: inline hooks
{
"event": "PostToolUse",
"matcher": "Edit|Write",
"command": "npx prettier --write \"$CLAUDE_FILE_PATHS\""
}
],
"mcpServers": { // Optional: inline MCP configs
"my-server": {
"command": "${CLAUDE_PLUGIN_ROOT}/servers/my-server",
"args": ["--port", "8080"],
"env": {
"API_KEY": "${API_KEY}"
}
}
}
}**Key points:**
- `name` is required, everything else is optional
- Use `${CLAUDE_PLUGIN_ROOT}` to reference plugin directory
- Commands/agents auto-discovered from `commands/` and `agents/` directories if not listed explicitly
- Skills auto-discovered from `skills/*/SKILL.md` pattern
Creating Commands
**File location:** `commands/my-command.md` creates `/my-command` slash command
**Nested commands:** `commands/feature/sub-command.md` creates `/plugin-name:feature:sub-command`
**Template:**
---
description: Brief description of what this command does
allowed-tools: Read, Grep, Glob, Bash
model: sonnet
argument-hint: "[file-path]"
---
# Command Name
Your command prompt goes here.
You can use:
- $1, $2, etc. for positional arguments
- $ARGUMENTS for all arguments as single string
- @filename to include file contents
- !bash command to execute shell commands
Example implementation instructions...
**Frontmatter fields:**
- `description` - Brief description shown in `/help`
- `allowed-tools` - Comma-separated list: `Read, Grep, Glob, Bash, Edit, Write, TodoWrite, Task`
- `model` - Optional: `haiku`, `sonnet`, or `opus` (defaults to user's setting)
- `argument-hint` - Optional: shown in help text
- `disable-model-invocation` - Optional: `true` to prevent auto-run
**Complete example** (`commands/review-pr.md`):
---
description: Review pull request for security and best practices
allowed-tools: Read, Grep, Glob, Bash
model: opus
argument-hint: "[pr-number]"
---
# Pull Request Review
Review pull request #$1 for:
1. Security vulnerabilities
2. Performance issues
3. Best practices compliance
4. Error handling
Steps:
1. Use Bash to run: gh pr diff $1
2. Use Read to examine changed files
3. Use Grep to search for common anti-patterns
4. Provide structured feedback with file:line references
Focus on critical issues first.
Creating Agents
**File location:** `agents/code-reviewer.md` creates agent named "code-reviewer"
**Template:**
Read more
name: creating-a-plugin description: Use when creating a new Claude Code plugin or setting up plugin structure - provides complete file organization, manifest format, and component definitions for commands, agents, skills, hooks, and MCP servers user-invocable: false
Creating a Plugin
Overview
A **Claude Code plugin** packages reusable components (commands, agents, skills, hooks, MCP servers) for distribution. Create a plugin when you have components that work across multiple projects.
**Don't create a plugin for:**
- Project-specific configurations (use `.claude/` in project root)
- One-off scripts or commands
- Experimental features still in development
**Plugin storage locations:**
- Development: Anywhere during development, installed via `file:///` path
- User-level: `~/.claude/plugins/` (after installation)
- Project-level: `.claude/plugins/` (project-specific installations)
Quick Start Checklist
Minimal viable plugin:
1. Create directory: `my-plugin/` 2. Create `.claude-plugin/plugin.json` with at minimum:
{
"name": "my-plugin"
}3. Add components (commands, agents, skills, hooks, or MCP servers) 4. Test locally: `/plugin install file:///absolute/path/to/my-plugin` 5. Reload: `/plugin reload`
Directory Structure
my-plugin/
.claude-plugin/
plugin.json # Required: plugin manifest
commands/ # Optional: slash commands
my-command.md
agents/ # Optional: specialized subagents
my-agent.md
skills/ # Optional: reusable techniques
my-skill/
SKILL.md
hooks/ # Optional: event handlers
hooks.json
.mcp.json # Optional: MCP server configs
README.md # Recommended: documentation**Critical:** The `.claude-plugin/` directory with `plugin.json` inside must exist at plugin root.
Component Reference
| Component | Location | File Format | When to Use | |-----------|----------|-------------|-------------| | Commands | `commands/*.md` | Markdown + YAML frontmatter | Custom slash commands for repetitive tasks | | Agents | `agents/*.md` | Markdown + YAML frontmatter | Specialized subagents for complex workflows | | Skills | `skills/*/SKILL.md` | Markdown + YAML frontmatter | Reusable techniques and patterns | | Hooks | `hooks/hooks.json` | JSON | Event handlers (format code, validate, etc.) | | MCP Servers | `.mcp.json` | JSON | External tool integrations |
plugin.json Format
**Minimal valid manifest:**
{
"name": "my-plugin"
}**Complete annotated manifest:**
{
"name": "my-plugin", // Required: kebab-case identifier
"version": "1.0.0", // Recommended: semantic versioning
"description": "What this plugin does", // Recommended: brief description
"author": { // Optional but recommended
"name": "Your Name",
"email": "you@example.com",
"url": "https://github.com/yourname"
},
"homepage": "https://github.com/yourname/my-plugin",
"repository": "https://github.com/yourname/my-plugin",
"license": "MIT",
"keywords": ["productivity", "automation"],
"commands": [ // Optional: explicit command paths
"./commands/cmd1.md",
"./commands/cmd2.md"
],
"agents": [ // Optional: explicit agent paths
"./agents/agent1.md"
],
"hooks": [ // Optional: inline hooks
{
"event": "PostToolUse",
"matcher": "Edit|Write",
"command": "npx prettier --write \"$CLAUDE_FILE_PATHS\""
}
],
"mcpServers": { // Optional: inline MCP configs
"my-server": {
"command": "${CLAUDE_PLUGIN_ROOT}/servers/my-server",
"args": ["--port", "8080"],
"env": {
"API_KEY": "${API_KEY}"
}
}
}
}**Key points:**
- `name` is required, everything else is optional
- Use `${CLAUDE_PLUGIN_ROOT}` to reference plugin directory
- Commands/agents auto-discovered from `commands/` and `agents/` directories if not listed explicitly
- Skills auto-discovered from `skills/*/SKILL.md` pattern
Creating Commands
**File location:** `commands/my-command.md` creates `/my-command` slash command
**Nested commands:** `commands/feature/sub-command.md` creates `/plugin-name:feature:sub-command`
**Template:**
--- description: Brief description of what this command does allowed-tools: Read, Grep, Glob, Bash model: sonnet argument-hint: "[file-path]" --- # Command Name Your command prompt goes here. You can use: - $1, $2, etc. for positional arguments - $ARGUMENTS for all arguments as single string - @filename to include file contents - !bash command to execute shell commands Example implementation instructions...
**Frontmatter fields:**
- `description` - Brief description shown in `/help`
- `allowed-tools` - Comma-separated list: `Read, Grep, Glob, Bash, Edit, Write, TodoWrite, Task`
- `model` - Optional: `haiku`, `sonnet`, or `opus` (defaults to user's setting)
- `argument-hint` - Optional: shown in help text
- `disable-model-invocation` - Optional: `true` to prevent auto-run
**Complete example** (`commands/review-pr.md`):
--- description: Review pull request for security and best practices allowed-tools: Read, Grep, Glob, Bash model: opus argument-hint: "[pr-number]" --- # Pull Request Review Review pull request #$1 for: 1. Security vulnerabilities 2. Performance issues 3. Best practices compliance 4. Error handling Steps: 1. Use Bash to run: gh pr diff $1 2. Use Read to examine changed files 3. Use Grep to search for common anti-patterns 4. Provide structured feedback with file:line references Focus on critical issues first.
Creating Agents
**File location:** `agents/code-reviewer.md` creates agent named "code-reviewer"
**Template:**
Showing the first part of this file.
This is my collection of plugins that I use on a day-to-day basis for getting stuff done with Claude Code. Most of these are development-oriented in some way or another, but also often end up being useful for other things.
Repo: ed3dai/ed3d-plugins
Other skills on ed3d-plugins.
- /doing-a-simple-two-stage-fanout
Use when analyzing a large corpus of text, code, or data that exceeds a single agent's effective context - orchestrates parallel Worker subagents, Critic review subagents, and a final Summarizer subagent with task tracking and failure recovery
Open skill - /using-generic-agents
Use to decide what kind of generic agent you should use
Open skill - /creating-an-agent
Use when creating specialized subagents for Claude Code plugins or the Task tool - covers description writing for auto-delegation, tool selection, prompt structure, and testing agents
Open skill - /maintaining-a-marketplace
Use when creating, releasing, or maintaining a Claude Code Plugin Marketplace - covers marketplace.json schema, version management, release checklists, changelog conventions, and validation to prevent sync drift between plugin.json and marketplace.json
Open skill - /maintaining-project-context
Use when completing development phases or branches to identify and update CLAUDE.md or AGENTS.md files that may have become stale - analyzes what changed, determines affected contracts and documentation, and coordinates updates
Open skill - /prompt-security-hardening
Use when writing skills, CLAUDE.md files, agent prompts, or any directives that involve shell commands, environment variables, API credentials, file creation, or git operations - prevents secrets leakage into LLM context, unsafe shell patterns, and credential exposure
Open skill

