Create and manage custom slash commands in Claude Code. Use when: (1) User wants to create a new slash command, (2) User asks about /commands or custom commands, (3) User wants to automate frequently used prompts, (4) User says 'create global command' or 'create local command', (5) User mentions 'command-creator'. Covers: command creation (global and local), command anatomy, frontmatter options, argument handling, bash execution, file references, namespacing, and command vs skill comparison.
Resources
1Install
npx skillscat add takazudo/claude-resources/custom-command-creator Install via the SkillsCat registry.
Custom Command Creator
Guide for creating effective custom slash commands in Claude Code.
What Are Custom Commands?
Custom slash commands are Markdown files that define reusable prompts. They're simpler than skills - single files for quick, frequently-used prompts.
Use commands when:
- Same prompt is used repeatedly
- Prompt fits in one file
- Explicit control over when to run
Use skills instead when:
- Claude should auto-detect the capability
- Multiple files or scripts needed
- Complex workflows with validation steps
Command Locations
| Location | Path | Scope |
|---|---|---|
| Project | .claude/commands/<name>.md |
This project only (shows as "project") |
| Personal | ~/.claude/commands/<name>.md |
All your projects (shows as "user") |
Priority: Project commands override personal commands with same name.
Command Anatomy
Every command is a single Markdown file with optional frontmatter:
---
description: Brief description of what the command does
allowed-tools: Bash(git:*), Read
argument-hint: [filename] [options]
---
# Command Instructions
Your prompt content here with $ARGUMENTS placeholder.See frontmatter.md for all available fields.
Core Features
Arguments
Pass dynamic values to commands using placeholders:
All arguments - $ARGUMENTS:
Fix issue #$ARGUMENTS following our coding standardsUsage: /fix-issue 123 high-priority → $ARGUMENTS = "123 high-priority"
Positional arguments - $1, $2, etc.:
Review PR #$1 with priority $2 and assign to $3Usage: /review-pr 456 high alice → $1="456", $2="high", $3="alice"
Bash Execution
Run shell commands before the prompt is sent using !command`` syntax:
---
allowed-tools: Bash(git:*)
---
## Context
- Git status: !`git status`
- Current branch: !`git branch --show-current`
- Recent commits: !`git log --oneline -5`
## Task
Create a commit based on the above changes.Important: Must include Bash in allowed-tools for this to work.
File References
Include file contents using @ prefix:
Review the implementation in @src/utils/helpers.js
Compare @src/old.js with @src/new.jsExtended Thinking
Include thinking keywords to trigger extended thinking mode:
Think deeply about the architecture of this codebase.Namespacing
Use subdirectories to organize related commands:
.claude/commands/
├── frontend/
│ └── component.md → /component (project:frontend)
├── backend/
│ └── api.md → /api (project:backend)
└── deploy.md → /deploy (project)Same-named commands in different subdirectories are distinguished by their namespace label.
Command Creation Workflow
When the user asks to create a command, follow this workflow.
Step 1: Determine Command Name and Location
If the user provides a name, use it. If they describe what they want, derive an appropriate kebab-case name.
Choose location based on context:
- Global command (
~/.claude/commands/<name>.md): User says "global", or wants it available across all projects - Local/project command (
.claude/commands/<name>.md): User says "local" or "project", or wants it scoped to current repo - If unclear: Ask the user which they prefer
For local commands, find the project root first:
git rev-parse --show-toplevel # Use repo root, or cwd if not a git repoEnsure the target directory exists before writing.
Step 2: Gather Details
Ask the user if needed:
- What should the command do?
- Does it need arguments? If so, what arguments?
- Should it use bash execution (
!command``) for dynamic context? - Should it restrict allowed tools?
Step 3: Write the Command File
Create the command file with proper structure:
Required best practices:
- Always include frontmatter with
descriptionfield - Use
argument-hintif the command accepts arguments (e.g.,[filename],[pr-number]) - Use
$ARGUMENTSfor all args or$1,$2for positional args - If using bash execution, include
allowed-toolsin frontmatter - If manual-only invocation needed, add
disable-model-invocation: true
Template:
---
description: Brief description of what the command does
argument-hint: [expected-args]
allowed-tools: Bash(git:*), Read
---
# Command Title
Clear instructions for what Claude should do.
## Context (if using bash execution)
- Dynamic info: !`shell command here`
## Task
What to accomplish with $ARGUMENTS.Step 4: Format the command file
Format the created command file using the mdx-formatter to ensure consistent markdown formatting:
pnpm dlx @takazudo/mdx-formatter --write <path-to-command-file.md>Step 5: Verify and Report
After creating the file:
- Confirm the file exists at the target path
- Show the user the full content of the created file
- Tell them they can use it with
/<command-name> - For global commands: Remind that project-level commands take priority over global commands with the same name
- For local commands: Suggest committing to git so the team can share it
Key Rules for Creation
- Command filename must be kebab-case (lowercase, hyphens):
my-command.md - Always include
descriptionin frontmatter - commands without it are harder to discover - Keep the command focused on a single task
- Use
$ARGUMENTS/$1/$2for dynamic values, not hardcoded values - Don't overcomplicate - a command is a single Markdown file for a reusable prompt
- Local commands are great for project-specific workflows (deploy, test patterns, review checklists)
Examples
Simple Review Command
---
description: Quick code review
---
Review this code for:
- Security vulnerabilities
- Performance issues
- Code style violationsGit Commit with Context
---
description: Create a git commit with context
allowed-tools: Bash(git:*)
---
## Context
- Status: !`git status`
- Diff: !`git diff HEAD`
- Branch: !`git branch --show-current`
- Recent commits: !`git log --oneline -5`
## Task
Create a single git commit for the staged changes.
Message should be concise and follow conventional commits.PR Review with Arguments
---
description: Review a pull request
argument-hint: [pr-number]
allowed-tools: Bash(gh:*)
---
## PR Context
- PR info: !`gh pr view $1`
- PR diff: !`gh pr diff $1`
- PR comments: !`gh pr view $1 --comments`
## Task
Review PR #$1 for:
1. Code quality and best practices
2. Potential bugs or edge cases
3. Security concerns
4. Test coverageModel-Specific Command
---
description: Complex analysis with specific model
model: claude-sonnet-4-20250514
---
Perform detailed analysis of $ARGUMENTS.Preventing Auto-Invocation
To prevent Claude from invoking a command automatically via the Skill tool:
---
description: Deploy to production (manual only)
disable-model-invocation: true
---
Deploy the application to production.Command-Scoped Hooks
Define hooks that run only during command execution:
---
description: Deploy with validation
hooks:
PreToolUse:
- matcher: "Bash"
hooks:
- type: command
command: "./scripts/validate.sh"
once: true
---
Deploy to staging environment.The once: true option runs the hook only once per session.
Troubleshooting
Command not appearing
- Check file is in correct location (
.claude/commands/or~/.claude/commands/) - Verify
.mdextension - Run
/helpto see available commands
Arguments not working
- Use
$ARGUMENTSfor all args or$1,$2for positional - Check for typos in placeholder names
Bash execution failing
- Ensure
allowed-tools: Bash(...)is in frontmatter - Check command syntax is correct
- Verify the shell command works standalone
Related Resources
- Skills: For complex multi-file capabilities
- Hooks: For automated workflows around tool events
- Permissions: For controlling tool access