Expert guidance for creating Claude Code slash commands. Use when working with slash commands, creating custom commands, understanding command structure, or learning YAML configuration.
Teaches creating slash commands with proper structure, arguments, and XML/Markdown formatting.
/plugin marketplace add melvynx/aiblueprint/plugin install base@aiblueprintThis skill inherits all available tools. When active, it can use any tool Claude has access to.
references/arguments.mdreferences/patterns.mdreferences/prompt-examples.mdreferences/tool-restrictions.mdCommands can be global (available everywhere in ~/.claude/commands/) or project-specific (shared with team in .claude/commands/). This skill teaches you to structure commands with proper formatting (XML or Markdown), YAML frontmatter, dynamic context loading, and intelligent argument handling.
CRITICAL WORKFLOW: This skill enforces a mandatory research phase where you MUST:
This prevents poorly-structured commands and ensures consistency with established patterns. </objective>
<quick_start>
<workflow> 1. Create `.claude/commands/` directory (project) or use `~/.claude/commands/` (personal) 2. Create `command-name.md` file 3. Add YAML frontmatter (at minimum: `description`) 4. Write command prompt 5. Test with `/command-name [args]` </workflow> <example> **File**: `.claude/commands/optimize.md`---
description: Analyze this code for performance issues and suggest optimizations
---
Analyze the performance of this code and suggest three specific optimizations:
Usage: /optimize
Claude receives the expanded prompt and analyzes the code in context. </example> </quick_start>
<xml_structure> Slash commands can use either XML tags OR Markdown headings in the body (after YAML frontmatter).
Format choice depends on:
See references/prompt-examples.md for real examples of both formats in production.
<required_tags>
<objective> - What the command does and why it matters
<objective>
What needs to happen and why this matters.
Context about who uses this and what it accomplishes.
</objective>
<process> or <steps> - How to execute the command
<process>
Sequential steps to accomplish the objective:
1. First step
2. Second step
3. Final step
</process>
<success_criteria> - How to know the command succeeded
<success_criteria>
Clear, measurable criteria for successful completion.
</success_criteria>
</required_tags>
<conditional_tags>
<context> - When loading dynamic state or files
<context>
Current state: ! `git status`
Relevant files: @ package.json
</context>
(Note: Remove the space after @ in actual usage)
<verification> - When producing artifacts that need checking
<verification>
Before completing, verify:
- Specific test or check to perform
- How to confirm it works
</verification>
<testing> - When running tests is part of the workflow
<testing>
Run tests: ! `npm test`
Check linting: ! `npm run lint`
</testing>
<output> - When creating/modifying specific files
<output>
Files created/modified:
- `./path/to/file.ext` - Description
</output>
</conditional_tags>
<structure_example>
---
name: example-command
description: Does something useful
argument-hint: [input]
---
<objective>
Process #$ARGUMENTS to accomplish [goal].
This helps [who] achieve [outcome].
</objective>
<context>
Current state: ! `relevant command`
Files: @ relevant/files
</context>
<process>
1. Parse #$ARGUMENTS
2. Execute operation
3. Verify results
</process>
<success_criteria>
- Operation completed without errors
- Output matches expected format
</success_criteria>
</structure_example>
<intelligence_rules>
Simple commands (single operation, no artifacts):
<objective>, <process>, <success_criteria>/check-todos, /first-principlesComplex commands (multi-step, produces artifacts):
<objective>, <process>, <success_criteria><context> (if loading state), <verification> (if creating files), <output> (what gets created)/commit, /create-prompt, /run-promptCommands with dynamic arguments:
#$ARGUMENTS in <objective> or <process> tagsargument-hint in frontmatterCommands that produce files:
<output> tag specifying what gets created<verification> tag with checks to performCommands that run tests/builds:
<testing> tag with specific commands<success_criteria>
</intelligence_rules>
</xml_structure><arguments_intelligence> The skill should intelligently determine whether a slash command needs arguments.
<commands_that_need_arguments>
User provides specific input:
/fix-issue [issue-number] - Needs issue number/review-pr [pr-number] - Needs PR number/optimize [file-path] - Needs file to optimize/commit [type] - Needs commit type (optional)Pattern: Task operates on user-specified data
Include argument-hint: [description] in frontmatter and reference #$ARGUMENTS in the body.
</commands_that_need_arguments>
<commands_without_arguments>
Self-contained procedures:
/check-todos - Operates on known file (TO-DOS.md)/first-principles - Operates on current conversation/whats-next - Analyzes current contextPattern: Task operates on implicit context (current conversation, known files, project state)
Omit argument-hint and don't reference #$ARGUMENTS.
</commands_without_arguments>
<incorporating_arguments>
In <objective> tag:
<objective>
Fix issue #$ARGUMENTS following project conventions.
This ensures bugs are resolved systematically with proper testing.
</objective>
In <process> tag:
<process>
1. Understand issue #$ARGUMENTS from issue tracker
2. Locate relevant code
3. Implement fix
4. Add tests
</process>
In <context> tag:
<context>
Issue details: @ issues/#$ARGUMENTS.md
Related files: ! `grep -r "TODO.*#$ARGUMENTS" src/`
</context>
(Note: Remove the space after the exclamation mark in actual usage) </incorporating_arguments>
<positional_arguments>
For structured input, use $1, $2, $3:
---
argument-hint: <pr-number> <priority> <assignee>
---
<objective>
Review PR #$1 with priority $2 and assign to $3.
</objective>
Usage: /review-pr 456 high alice
</positional_arguments>
</arguments_intelligence>
<file_structure>
Project commands: .claude/commands/ (in project root)
(project) in /help listGlobal commands: ~/.claude/commands/ (user home directory)
(user) in /help listFile naming: command-name.md → invoked as /command-name
Choosing between global and project:
<yaml_frontmatter>
<field name="description"> **Required** - Describes what the command doesdescription: Analyze this code for performance issues and suggest optimizations
Shown in the /help command list.
</field>
allowed-tools: Bash(git add:*), Bash(git status:*), Bash(git commit:*)
Formats:
allowed-tools: [Read, Edit, Write]allowed-tools: SequentialThinkingallowed-tools: Bash(git add:*)If omitted: All tools available </field> </yaml_frontmatter>
<arguments> <all_arguments_string>Command file: .claude/commands/fix-issue.md
---
description: Fix issue following coding standards
---
Fix issue #$ARGUMENTS following our coding standards
Usage: /fix-issue 123 high-priority
Claude receives: "Fix issue #123 high-priority following our coding standards" </all_arguments_string>
<positional_arguments_syntax>
Command file: .claude/commands/review-pr.md
---
description: Review PR with priority and assignee
---
Review PR #$1 with priority $2 and assign to $3
Usage: /review-pr 456 high alice
Claude receives: "Review PR #456 with priority high and assign to alice"
See references/arguments.md for advanced patterns. </positional_arguments_syntax> </arguments>
<dynamic_context>
Execute bash commands before the prompt using the exclamation mark prefix directly before backticks (no space between).
Note: Examples below show a space after the exclamation mark to prevent execution during skill loading. In actual slash commands, remove the space.
Example:
---
description: Create a git commit
allowed-tools: Bash(git add:*), Bash(git status:*), Bash(git commit:*)
---
## Context
- Current git status: ! `git status`
- Current git diff: ! `git diff HEAD`
- Current branch: ! `git branch --show-current`
- Recent commits: ! `git log --oneline -10`
## Your task
Based on the above changes, create a single git commit.
The bash commands execute and their output is included in the expanded prompt. </dynamic_context>
<file_references>
Use @ prefix to reference specific files:
---
description: Review implementation
---
Review the implementation in @ src/utils/helpers.js
(Note: Remove the space after @ in actual usage)
Claude can access the referenced file's contents. </file_references>
<best_practices>
1. Always use XML structure
# All slash commands should have XML-structured bodies
After frontmatter, use XML tags:
<objective> - What and why (always)<process> - How to do it (always)<success_criteria> - Definition of done (always)2. Clear descriptions
# Good
description: Analyze this code for performance issues and suggest optimizations
# Bad
description: Optimize stuff
3. Use dynamic context for state-dependent tasks
Current git status: ! `git status`
Files changed: ! `git diff --name-only`
4. Restrict tools when appropriate
# For git commands - prevent running arbitrary bash
allowed-tools: Bash(git add:*), Bash(git status:*), Bash(git commit:*)
# For analysis - thinking only
allowed-tools: SequentialThinking
5. Use #$ARGUMENTS for flexibility
Find and fix issue #$ARGUMENTS
6. Reference relevant files
Review @ package.json for dependencies
Analyze @ src/database/\* for schema
(Note: Remove the space after @ in actual usage) </best_practices>
<common_patterns>
Simple analysis command:
---
description: Review this code for security vulnerabilities
---
<objective>
Review code for security vulnerabilities and suggest fixes.
</objective>
<process>
1. Scan code for common vulnerabilities (XSS, SQL injection, etc.)
2. Identify specific issues with line numbers
3. Suggest remediation for each issue
</process>
<success_criteria>
- All major vulnerability types checked
- Specific issues identified with locations
- Actionable fixes provided
</success_criteria>
Git workflow with context:
---
description: Create a git commit
allowed-tools: Bash(git add:*), Bash(git status:*), Bash(git commit:*)
---
<objective>
Create a git commit for current changes following repository conventions.
</objective>
<context>
- Current status: ! `git status`
- Changes: ! `git diff HEAD`
- Recent commits: ! `git log --oneline -5`
</context>
<process>
1. Review staged and unstaged changes
2. Stage relevant files
3. Write commit message following recent commit style
4. Create commit
</process>
<success_criteria>
- All relevant changes staged
- Commit message follows repository conventions
- Commit created successfully
</success_criteria>
Parameterized command:
---
description: Fix issue following coding standards
argument-hint: [issue-number]
---
<objective>
Fix issue #$ARGUMENTS following project coding standards.
This ensures bugs are resolved systematically with proper testing.
</objective>
<process>
1. Understand the issue described in ticket #$ARGUMENTS
2. Locate the relevant code in codebase
3. Implement a solution that addresses root cause
4. Add appropriate tests
5. Verify fix resolves the issue
</process>
<success_criteria>
- Issue fully understood and addressed
- Solution follows coding standards
- Tests added and passing
- No regressions introduced
</success_criteria>
File-specific command:
---
description: Optimize code performance
argument-hint: [file-path]
---
<objective>
Analyze performance of @ #$ARGUMENTS and suggest specific optimizations.
This helps improve application performance through targeted improvements.
</objective>
<process>
1. Review code in @ #$ARGUMENTS for performance issues
2. Identify bottlenecks and inefficiencies
3. Suggest three specific optimizations with rationale
4. Estimate performance impact of each
</process>
<success_criteria>
- Performance issues clearly identified
- Three concrete optimizations suggested
- Implementation guidance provided
- Performance impact estimated
</success_criteria>
Usage: /optimize src/utils/helpers.js
See references/patterns.md for more examples. </common_patterns>
<reference_guides>
Slash command specific references:
Prompt engineering references from create-prompt skill:
<generation_protocol>
<step_0_mandatory_research> CRITICAL: Complete this research phase BEFORE proceeding to any other steps.
You MUST read and understand these materials before creating any slash command:
1. Read ALL reference files in order:
Use the Read tool to read these files:
references/prompt-examples.md - Real-world patterns and examplesreferences/patterns.md - Verified command patternsreferences/arguments.md - Argument handling examplesreferences/tool-restrictions.md - Tool restriction patterns2. Examine existing slash commands:
Use Bash to find and Read existing commands:
find ~/.claude/commands -name "*.md" -type f | head -10
Then Read 2-3 relevant existing commands to understand:
3. Identify the right pattern:
Based on the user's request, match it to one of these patterns from prompt-examples.md:
4. Check for similar existing commands:
Before creating a new command, check if a similar command already exists:
grep -l "description.*<similar-concept>" ~/.claude/commands/*.md
If a similar command exists, read it to:
VERIFICATION CHECKLIST:
Before proceeding to step 1, confirm you have:
DO NOT PROCEED until all items are checked. This research phase is non-negotiable and prevents creating poorly structured commands.
</step_0_mandatory_research>
<step_1_analyze_request> Analyze the user's request to understand what they want:
Intelligence rule: Only proceed to questions if critical information is missing. If the request is clear, skip directly to format choice. </step_1_analyze_request>
<step_2_ask_questions_if_needed> INTELLIGENCE RULE: Only ask questions if critical information is truly missing.
If the request is clear, skip directly to scope and format questions. Most requests like "create a command to X" contain enough information to proceed.
Ask clarifying questions ONLY if essential information is missing:
Use AskUserQuestion to gather ONLY what's needed:
Command purpose (if completely unclear):
Arguments (if truly ambiguous - rare):
SKIP questions for:
Default assumptions (use unless contradicted):
Bash(git :*)Read, Edit, Write<step_2b_ask_scope> ALWAYS ask about scope unless explicitly specified in the request:
Use AskUserQuestion:
Detection rules:
Important: This determines the save location:
~/.claude/commands/command-name.md.claude/commands/command-name.md (in current working directory)
</step_2b_ask_scope><step_3_choose_format> Determine format based on existing patterns:
Before asking the user, check what format existing commands in the target directory use:
~/.claude/commands/*.md.claude/commands/*.mdRead 2-3 existing commands to see if they use XML or Markdown format.
Then ask for format preference:
Use AskUserQuestion:
Recommendation:
See references/prompt-examples.md for format examples. </step_3_choose_format>
<step_4_create_frontmatter> Create YAML frontmatter based on gathered information:
---
name: command-name
description: Clear description of what it does
argument-hint: [input] # Only if arguments needed
allowed-tools: [...] # Only if tool restrictions needed
---
Frontmatter rules:
description: Always required, clear and conciseargument-hint: Include if command takes user inputallowed-tools: Include if restricting tools for securitymodel: Include only if need specific model (haiku for speed, opus for complexity)
</step_4_create_frontmatter><step_5_create_body> Create command body in chosen format (XML or Markdown):
<xml_body> Always include:
<objective> - What and why<process> - How to do it (numbered steps)<success_criteria> - Definition of doneInclude when relevant:
<context> - Dynamic state (! commands) or file references (@ files)<verification> - Checks to perform if creating artifacts<testing> - Test commands if tests are part of workflow<output> - Files created/modifiedReference: Apply prompt engineering best practices from create-prompt skill:
<markdown_body> Always include:
## Objective - What and why## Process or ## Workflow - How to do it (numbered list)## Success Criteria - Definition of doneInclude when relevant:
## Context - Dynamic state or file references## Verification - Checks to perform if creating artifacts## Testing - Test commands if tests are part of workflow## Output - Files created/modified
</markdown_body>
</step_5_create_body><step_6_integrate_arguments> Integrate #$ARGUMENTS if command takes input:
argument-hint and use #$ARGUMENTS in bodyargument-hint and #$ARGUMENTS$1, $2, $3Examples: See references/arguments.md </step_6_integrate_arguments>
<step_7_apply_intelligence> Apply appropriate complexity level:
Pattern matching: Choose pattern from references/prompt-examples.md:
<step_8_save_file> Save the command file based on chosen scope:
Global scope (user selected "Global (all projects)"):
~/.claude/commands/command-name.mdProject scope (user selected "Project only"):
.claude/commands/command-name.md (in current working directory)Verification:
After saving:
/command-name [args]
</step_8_save_file></generation_protocol>
<success_criteria> A well-structured slash command meets these criteria:
YAML Frontmatter:
description field is clear and conciseargument-hint present if command accepts argumentsallowed-tools specified if tool restrictions neededXML Structure:
<objective>, <process>, <success_criteria>Arguments Handling:
#$ARGUMENTS used when command operates on user-specified data$1, $2, etc.) used when structured input needed#$ARGUMENTS reference for self-contained commandsFunctionality:
Quality:
<process> tag or ## Workflow section<success_criteria> tag or ## Success Criteria section<common_mistakes>
These are common mistakes that result from skipping the mandatory research phase:
Wrong:
User asks to create /quick-search command
→ Immediately ask scope/format questions
→ Create command without reading references or existing commands
→ Use wrong syntax, wrong format, miss best practices
Correct:
User asks to create /quick-search command
→ Read all 4 reference files first
→ Find and examine existing commands (especially /search if it exists)
→ Understand patterns and syntax
→ Then ask questions and create command
Wrong:
---
description: Quick search
---
Answer the question: #args
Correct:
---
description: Quick search
argument-hint: <question>
---
User: #$ARGUMENTS
The correct syntax is #$ARGUMENTS (not #args). This is documented in references/arguments.md.
Wrong:
/quick-search without checking if /search already existsCorrect:
find ~/.claude/commands -name "*.md"Wrong:
Correct:
Wrong:
---
description: Quick search with Haiku model
model: haiku
---
Correct:
---
description: Quick search with Haiku model
model: haiku
allowed-tools: [Grep, Glob, Read]
---
For speed-optimized commands, restrict tools to prevent using slow agents like Task.
Wrong:
Correct:
Wrong:
---
description: Search command
argument-hint: <question>
---
You are a search specialist.
## Workflow
1. Search for the answer
2. Provide results
Correct:
---
description: Search command
argument-hint: <question>
---
You are a search specialist.
## Workflow
1. Search for the answer
2. Provide results
---
User: #$ARGUMENTS
Many commands end with User: #$ARGUMENTS to properly pass the user's input to the command.
Wrong:
<objective>Create comprehensive search system</objective>
<context>Load all git state</context>
<verification>Run extensive checks</verification>
<testing>Test all edge cases</testing>
For a simple search command, this is too much.
Correct:
You are a rapid search specialist.
## Workflow
1. Search
2. Answer
User: #$ARGUMENTS
Match complexity to the task.
Follow the Step 0 checklist religiously:
If you skip Step 0, you WILL make these mistakes.
</common_mistakes>
Creating algorithmic art using p5.js with seeded randomness and interactive parameter exploration. Use this when users request creating art using code, generative art, algorithmic art, flow fields, or particle systems. Create original algorithmic art rather than copying existing artists' work to avoid copyright violations.
Applies Anthropic's official brand colors and typography to any sort of artifact that may benefit from having Anthropic's look-and-feel. Use it when brand colors or style guidelines, visual formatting, or company design standards apply.
Create beautiful visual art in .png and .pdf documents using design philosophy. You should use this skill when the user asks to create a poster, piece of art, design, or other static piece. Create original visual designs, never copying existing artists' work to avoid copyright violations.