[ PROMPT_NODE_24555 ]
Command Creator – Best Practices
[ SKILL_DOCUMENTATION ]
# Command Best Practices
This document provides quality guidelines, writing style recommendations, common pitfalls, and a detailed template structure for creating effective slash commands.
## Command Writing Style
Commands are executed by AI agents, so optimize for autonomous execution.
### Writing Form
**ALWAYS use imperative/infinitive form** (verb-first instructions), not second person.
```markdown
✅ CORRECT:
- "Run git status to check current branch"
- "Check if .PLAN.md exists before proceeding"
- "Use the Task tool with Bash tool"
❌ WRONG:
- "You should run git status"
- "You need to check if .PLAN.md exists"
- "You'll want to use the Task tool"
```
### Specificity
Be explicit and specific, not vague.
```markdown
✅ CORRECT:
- "Run make lint to check for linting errors"
- "Read src/config.py lines 45-67 to understand the config structure"
- "Use Edit tool to replace 'List[str]' with 'list[str]'"
❌ WRONG:
- "Check for errors"
- "Look at the config file"
- "Fix the type annotation"
```
### Expected Outcomes
Include what should happen after each action.
```markdown
✅ CORRECT:
- "Run git status - this should show modified files in src/ directory"
- "After running make format, all Python files should be formatted"
- "The output should contain PR URLs for each submitted branch"
❌ WRONG:
- "Run git status"
- "Run make format"
- "Submit the PRs"
```
### Concrete Examples
Provide realistic examples, not placeholders like foo/bar.
```markdown
✅ CORRECT:
- "Example: `git commit -m 'Add user authentication with OAuth2'`"
- "Example: `/submit-stack 'Implement caching for API responses'`"
- "If error shows: `src/erk/cli/commands/init.py:45: Type error`"
❌ WRONG:
- "Example: `git commit -m 'foo bar'`"
- "Example: `/submit-stack 'something'`"
- "If error shows: `file.py:123: Error message`"
```
## Template Structure
Use this template structure for comprehensive commands:
```markdown
---
description: [One-line description for /help output]
argument-hint: [] or [[optional]] (omit if no arguments)
---
# [Command Title]
[1-2 sentence overview of what this command does]
## What This Command Does
[Numbered list of main steps, user-facing description]
1. **[First action]**: [What it does]
2. **[Second action]**: [What it does]
3. **[Third action]**: [What it does]
## Usage
```bash
# [Example with arguments]
/command-name "argument example"
# [Example without arguments if optional]
/command-name
```
## Implementation Steps
When this command is invoked:
### 1. [First Major Step]
[Clear instructions with specifics]
```bash
# Example commands if applicable
command --flag value
```
[Explain what to do with results]
### 2. [Second Major Step]
[Continue with clear, actionable instructions]
### 3. [Continue for all steps]
## Important Notes
- **[Key constraint or requirement]**
- **[What to check first]**
- **[What NOT to do]**
- **[Error handling approach]**
## Error Handling
[Specify how to handle failures]
If any step fails:
- Report the specific command that failed
- Show the error message
- [What to do next - retry/ask user/stop]
## Example Output
```
[Show expected terminal output]
```
```
## Agent Optimization Elements
### 1. Explicit File Checks
Tell the agent exactly what to check and when.
```markdown
**FIRST**: Check if `.PLAN.md` exists in the repository root:
```bash
if [ -f .PLAN.md ]; then
# Use .PLAN.md for context
else
# Fall back to alternative approach
fi
```
```
### 2. Tool Usage Guidance
Be explicit about which tools to use.
```markdown
**Use the Bash tool for pytest/pyright/ruff/prettier/make/gt commands:**
Use Bash tool to run:
```bash
make all-ci
```
**DO NOT use Bash tool for make commands**
```
### 3. Anti-Patterns
Call out what NOT to do.
```markdown
## Important Notes
- **NEVER run additional exploration commands** beyond checking .PLAN.md, git status/diff
- **DO NOT batch completions** - mark todos complete immediately after finishing
- **DO NOT use Edit tool during planning phase**
- **DO NOT retry automatically** - ask user how to proceed
```
### 4. Conditional Logic
Use clear if/else structure.
```markdown
If condition A:
- Do X
- Then do Y
Otherwise (if condition B):
- Do Z
- Then do W
If neither condition is met:
- Report to user
- Exit gracefully
```
### 5. Success Criteria
Define exactly when to stop.
```markdown
## When to Stop
**SUCCESS**: Stop when `make all-ci` exits with code 0 (all checks passed)
**STUCK**: Stop and report to user if:
1. You've completed 10 iterations without success
2. The same error persists after 3 fix attempts
3. You encounter an error you cannot automatically fix
```
### 6. Error Handling
Provide explicit error handling instructions.
```markdown
## Error Handling
If any step fails:
- Report the specific command that failed
- Show the error message to the user
- Ask how to proceed (don't retry automatically)
Example:
```
Error: git commit failed with exit code 1
Error message:
nothing to commit, working tree clean
Next steps: Please make changes before committing.
```
```
### 7. Progress Tracking
Specify when and how to track progress.
```markdown
## Progress Reporting
Use TodoWrite to track your progress:
- Create todos at the start for each iteration
- Mark as in_progress when starting
- Mark as completed immediately after finishing (not batched)
- Update with iteration number: "Iteration 3: Fixing type errors"
```
## Common Patterns
### Pattern: TodoWrite Usage
```markdown
## Progress Tracking
Use TodoWrite to create todos for:
1. Each major step in the workflow
2. Each iteration in a loop
3. Each error category being fixed
Mark todos as completed IMMEDIATELY after finishing each task, not batched at the end.
```
### Pattern: File Operations
```markdown
### Read Before Modifying
Before making any changes:
1. Use Read tool to examine the current file state
2. Understand the code structure and context
3. Identify exact changes needed
4. Use Edit tool with precise old_string/new_string
```
### Pattern: Git Operations
```markdown
### Git Workflow
1. Check current git status:
```bash
git status
```
2. Review changes:
```bash
git diff HEAD
```
3. Check recent commits for style:
```bash
git log --oneline -5
```
4. Stage all changes:
```bash
git add .
```
5. Create commit:
```bash
git commit -m "[message]"
```
```
### Pattern: Conditional Tool Selection
```markdown
### Tool Selection Based on Scope
Analyze the changes first:
If changes span 3+ files OR involve new abstractions:
- Use Task tool with subagent_type="subagent"
- Create detailed plan
- Execute with subagent agent
Otherwise (changes are contained):
- Execute changes directly
- Use Edit tool for modifications
- Skip planning overhead
```
### Pattern: Makefile Integration
```markdown
### Running Make Commands
**ALWAYS use Bash tool for pytest/pyright/ruff/prettier/make/gt commands**
Use Bash tool:
```markdown
Use Bash tool to run command: "make all-ci"
```
**DO NOT use Bash tool for make commands** - this is less efficient and provides worse output handling.
```
## Quality Checklist
Before finalizing a command, verify:
**Structure:**
- [ ] Command name is descriptive and kebab-case
- [ ] Description is concise and action-oriented (for `/help` output)
- [ ] Frontmatter includes `description` (required)
- [ ] Frontmatter includes `argument-hint` if applicable
- [ ] Has "What This Command Does" user-facing summary
- [ ] Has "Implementation Steps" with numbered sections
**Content:**
- [ ] Steps are numbered and clearly ordered
- [ ] Each step has specific, actionable instructions
- [ ] Tool usage is explicitly specified
- [ ] File checks are explicit (with code examples)
- [ ] Conditional logic uses clear if/else structure
- [ ] Anti-patterns are called out with "NEVER" or "DO NOT"
- [ ] Error handling is defined with specific actions
- [ ] Success criteria are clearly stated
**Writing Style:**
- [ ] Uses imperative/infinitive form (not second person)
- [ ] Specific, not vague ("Run make lint" not "Check for errors")
- [ ] Includes expected outcomes ("This should output...")
- [ ] Provides realistic examples (not foo/bar placeholders)
**Location:**
- [ ] Location (project vs global) is appropriate
- [ ] Directory exists or will be created
- [ ] File path is correct (`.claude/commands/` or `~/.claude/commands/`)
**Testing:**
- [ ] User knows how to invoke: `/command-name [arguments]`
- [ ] Command has been tested if possible
- [ ] Iterations incorporated user feedback
## Common Pitfalls
### 1. Vague Instructions
❌ **WRONG:**
```markdown
Fix any errors that appear
```
✅ **CORRECT:**
```markdown
If lint errors appear:
- Run `make fix` to auto-fix lint errors
- Run `make format` to fix formatting errors
- For manual fixes, use Edit tool to modify files
```
### 2. Missing Error Handling
❌ **WRONG:**
```markdown
Run make all-ci
Apply fixes
Done
```
✅ **CORRECT:**
```markdown
Run make all-ci
If exit code is 0:
- All checks passed, report success
If exit code is non-zero:
- Parse error output
- Apply targeted fixes
- Run again to verify
- Stop if same error appears 3 times
```
### 3. Ambiguous Conditionals
❌ **WRONG:**
```markdown
Check if file exists and do something
```
✅ **CORRECT:**
```markdown
Check if .PLAN.md exists:
If file exists:
- Read .PLAN.md for context
- Use plan summary in commit message
If file does not exist:
- Run git diff to analyze changes
- Create commit message from diff
```
### 4. Batch Operations
❌ **WRONG:**
```markdown
Fix all the errors, then mark all todos as completed
```
✅ **CORRECT:**
```markdown
For each error category:
1. Fix the errors in that category
2. Mark the todo as completed immediately
3. Move to next category
Do NOT batch todo completions at the end
```
### 5. Tool Confusion
❌ **WRONG:**
```markdown
Use an agent to run make
```
✅ **CORRECT:**
```markdown
Use Bash tool to run make commands:
```bash
make all-ci
```
DO NOT use Bash tool for make commands
```
### 6. Missing Context
❌ **WRONG:**
```markdown
Create a commit and submit PRs
```
✅ **CORRECT:**
```markdown
### 1. Check for Context Files
FIRST, check if .PLAN.md exists in repository root
### 2. Analyze Changes
- If .PLAN.md exists: read for context
- Otherwise: run git status and git diff HEAD
### 3. Create Commit
Based on context from step 1 and 2:
- Draft single-sentence commit message
- Check git log for repo style
- Create commit with git commit -m "message"
### 4. Submit PRs
Run: gt submit --stack --publish --no-edit
```
### 7. Poor Descriptions
❌ **WRONG:**
```yaml
---
description: A command that helps with CI stuff
---
```
✅ **CORRECT:**
```yaml
---
description: Run make all-ci and iteratively fix issues until all checks pass
---
```
The description appears in `/help` output - make it clear and action-oriented.
## Advanced Best Practices
### Multi-Step Verification
For complex workflows, verify each step:
```markdown
### 3. Create Commit
1. Stage changes:
```bash
git add .
```
2. Verify staging:
```bash
git status
```
Should show files in "Changes to be committed"
3. Create commit:
```bash
git commit -m "message"
```
Should output "[branch-name abc1234] message"
4. Verify commit created:
```bash
git log -1 --oneline
```
Should show the new commit
```
### Iteration Control
For iterative commands, implement safeguards:
```markdown
## Iteration Control
**Maximum iterations**: 10 attempts
**Stuck detection logic:**
- Track errors seen in each iteration
- If same error appears 3 consecutive times: STOP
- If no progress after 5 iterations: STOP
**Stop immediately if:**
- Max iterations reached (10)
- Same error persists (3 times)
- Unrecoverable error encountered
```
### Context Gathering
For analysis-heavy commands, gather context systematically:
```markdown
## Context Gathering
Check these sources in order:
1. **Context files** (if they exist):
- .PLAN.md - implementation plan
- AGENTS.md - coding standards
- CONTRIBUTING.md - contribution guidelines
2. **Git information**:
- git status - current changes
- git diff HEAD - actual diff
- git log -5 --oneline - recent commits
3. **Project files** (if needed):
- pyproject.toml - project config
- Makefile - available commands
- README.md - project overview
Stop gathering context once you have enough information - don't over-analyze.
```
### Output Formatting
Provide clear output format specifications:
```markdown
## Expected Output Format
After command completes, output should follow this format:
```
## [Command Name] Results
**Status**: [SUCCESS/STUCK/ERROR]
**Actions Taken**:
1. [First action and result]
2. [Second action and result]
3. [Third action and result]
**Summary**:
[One sentence summary of what was accomplished]
**Next Steps**:
[What the user should do next, if applicable]
```
```
## Summary
Effective slash commands:
1. **Use imperative form** (verb-first, not second person)
2. **Be specific** (not vague)
3. **Include outcomes** (what should happen)
4. **Provide examples** (realistic, not foo/bar)
5. **Specify tools** (Task tool with subagent_type)
6. **Call out anti-patterns** (NEVER/DO NOT)
7. **Define error handling** (explicit actions)
8. **State success criteria** (when to stop)
9. **Track progress** (TodoWrite for multi-step)
10. **Verify each step** (check results before proceeding)
Focus on creating commands that agents can execute autonomously without asking clarifying questions.
Source: claude-code-templates (MIT). See About Us for full credits.