--- name: "extension-authoring" description: "Comprehensive guide for authoring Claude Code extensions including skills (SKILL.md), hooks, slash commands, and subagents. Use when: creating skills, writing hooks, making slash commands, building subagents, learning Claude Code extensions." --- This skill is the definitive guide for authoring Claude Code extensions. It covers four extension types: 1. **Skills** - Modular capabilities in SKILL.md files that provide domain expertise 2. **Hooks** - Event-driven automation that executes on tool use and session events 3. **Slash Commands** - Reusable prompts triggered with `/command-name` syntax 4. **Subagents** - Specialized Claude instances for delegated tasks All four extension types share core principles: pure XML structure, YAML frontmatter, and clear success criteria. This skill teaches you to create effective extensions following best practices. What would you like to create or learn about? 1. **Skill** - SKILL.md file for domain expertise 2. **Hook** - Event-driven automation (PreToolUse, PostToolUse, Stop, etc.) 3. **Slash Command** - Reusable prompt with `/command-name` 4. **Subagent** - Specialized agent for delegated tasks 5. **Guidance** - Help deciding which extension type to use **Respond with a number or describe what you want to build.** | Response | Action | |----------|--------| | 1, "skill", "SKILL.md" | Read [reference/skills.md](reference/skills.md) | | 2, "hook", "hooks" | Read [reference/hooks.md](reference/hooks.md) | | 3, "command", "slash" | Read [reference/commands.md](reference/commands.md) | | 4, "subagent", "agent" | Read [reference/subagents.md](reference/subagents.md) | | 5, "guidance", "help" | Use decision tree below | **After reading the reference, follow its workflow exactly.** **Which extension type should I use?** ``` Is it triggered by specific Claude Code events? (tool use, session start/end, user prompt submit) YES --> Hook Is it a reusable prompt the user invokes with /command-name? YES --> Slash Command Is it an isolated task that runs autonomously without user interaction? YES --> Subagent Is it domain knowledge or workflow guidance Claude loads on demand? YES --> Skill ``` **Quick decision matrix:** | Need | Extension Type | |------|---------------| | Validate commands before execution | Hook (PreToolUse) | | Auto-format code after edits | Hook (PostToolUse) | | Desktop notification when input needed | Hook (Notification) | | Reusable git commit workflow | Slash Command | | Code review checklist | Slash Command | | Delegated research task | Subagent | | Autonomous test writing | Subagent | | API integration knowledge | Skill | | Multi-step workflow guidance | Skill | These principles apply to ALL Claude Code extension types: **Use pure XML structure. Remove ALL markdown headings from body content.** ```xml What it does How to do it How to know it worked ``` Keep markdown formatting WITHIN content (bold, lists, code blocks). **Why XML?** - Semantic meaning for Claude (not just visual formatting) - Unambiguous section boundaries - Token efficient (~15 tokens vs ~20 for markdown headings) - Reliable parsing and progressive disclosure All extensions require YAML frontmatter: ```yaml --- name: extension-name # lowercase-with-hyphens description: What it does and when to use it (third person) --- ``` **Name conventions:** `create-*`, `manage-*`, `setup-*`, `generate-*` **Description rules:** - Third person (never "I" or "you") - Include WHAT it does AND WHEN to use it - Maximum 1024 characters Context window is shared. Only add what Claude doesn't already know. - Assume Claude is smart - Challenge every piece of content: "Does this justify its token cost?" - Provide default approach with escape hatch, not a list of options - Keep main files under 500 lines, split to reference files Every extension should define clear completion criteria: ```xml - Specific measurable outcome 1 - Specific measurable outcome 2 - How to verify it worked ``` **File locations:** | Extension | Project Location | User Location | |-----------|-----------------|---------------| | Skill | `.claude/skills/` | `~/.claude/skills/` | | Hook | `.claude/hooks.json` | `~/.claude/hooks.json` | | Slash Command | `.claude/commands/` | `~/.claude/commands/` | | Subagent | `.claude/agents/` | `~/.claude/agents/` | **Minimal examples:** ```markdown --- name: process-pdfs description: Extract text from PDF files. Use when working with PDFs. --- Extract text from PDF files using pdfplumber. ```python import pdfplumber with pdfplumber.open("file.pdf") as pdf: text = pdf.pages[0].extract_text() ``` Text extracted without errors. ``` ```json { "hooks": { "Notification": [ { "hooks": [ { "type": "command", "command": "osascript -e 'display notification \"Claude needs input\" with title \"Claude Code\"'" } ] } ] } } ``` ```markdown --- description: Create a git commit allowed-tools: Bash(git add:*), Bash(git status:*), Bash(git commit:*) --- Create a git commit for current changes. Current status: ! `git status` Changes: ! `git diff HEAD` 1. Review changes 2. Stage relevant files 3. Create commit following repository conventions Commit created successfully. ``` ```markdown --- name: code-reviewer description: Reviews code for quality and security. Use after code changes. tools: Read, Grep, Glob, Bash model: sonnet --- You are a senior code reviewer focused on quality and security. 1. Read modified files 2. Identify issues 3. Provide specific feedback with file:line references - NEVER modify code, only review - ALWAYS provide actionable feedback ``` **Detailed guides:** | Reference | Content | |-----------|---------| | [reference/skills.md](reference/skills.md) | SKILL.md structure, router pattern, progressive disclosure | | [reference/hooks.md](reference/hooks.md) | Hook types, matchers, input/output schemas, examples | | [reference/commands.md](reference/commands.md) | Slash command YAML, arguments, dynamic context | | [reference/subagents.md](reference/subagents.md) | Agent configuration, execution model, orchestration | **Common mistakes across all extension types:** ```markdown ## Bad - Using markdown headings ``` ```xml Using XML tags instead ``` ```yaml description: Helps with stuff # Bad description: Extract text from PDF files. Use when processing documents. # Good ``` ```yaml description: I help you process files # Bad - first person description: Processes files for analysis # Good - third person ``` Provide ONE default approach with escape hatch, not a menu of alternatives. A well-authored Claude Code extension has: - Valid YAML frontmatter with descriptive name and description - Pure XML structure (no markdown headings in body) - Clear objective/purpose statement - Defined success criteria or completion verification - Appropriate level of detail (not over-engineered) - Real-world testing and iteration - Documentation in third person