Claude Code Skills
Context
This workshop explores how to create custom Claude Code skills (slash commands) to automate repetitive workflows and encode team knowledge. Skills are markdown files that extend Claude’s capabilities without requiring code changes.
Prerequisites: Claude Code installed, basic CLI familiarity
Part 1: Introduction to Claude Skills
What is a Claude Skill?
A skill is a custom extension that teaches Claude new capabilities. Skills are defined in markdown files and can be invoked:
- Automatically by Claude when the task matches the skill’s description
- Manually by you using
/skill-nameslash commands
Why Use Skills?
| Problem | How Skills Help |
|---|---|
| Repeating the same instructions | Write once, invoke with /skill-name |
| Inconsistent output formats | Define templates in the skill |
| Team knowledge in people’s heads | Document workflows as reusable skills |
| Context window bloat | Skills load only when needed |
| Onboarding new team members | Skills encode best practices |
Where Are Skills Stored?
| Location | Path | Scope |
|---|---|---|
| Personal | ~/.claude/skills/<skill-name>/SKILL.md |
All your projects |
| Project | .claude/skills/<skill-name>/SKILL.md |
Current project only (check into git) |
Best practice: Start with personal skills, move to project skills when the team should share them.
Part 2: Anatomy of a Skill
File Structure
~/.claude/skills/
└── my-skill/
└── SKILL.md # Main instructions (REQUIRED)
SKILL.md Format
---
name: my-skill
description: What this skill does and when to use it
argument-hint: [optional-arg]
disable-model-invocation: true
---
# My Skill Title
## Instructions
1. Step one
2. Step two
3. Step threeKey Frontmatter Options
| Option | Purpose | Default |
|---|---|---|
name |
Skill identifier (used with /name) |
Directory name |
description |
When Claude should use this skill | Required |
argument-hint |
Placeholder shown in / menu |
None |
disable-model-invocation |
Prevent Claude from auto-invoking | false |
When to Use disable-model-invocation: true
Use this for skills with side effects:
- Creating issues or PRs
- Deploying code
- Modifying production systems
- Sending notifications
Part 3: Deep Dive - The issue-message Skill
Location: ~/.claude/skills/issue-message/SKILL.md
Skill Structure Analysis
# Issue Message Generator
Generate a well-formatted issue description for the repository's
issue tracker based on user-provided text, a plan file, or a
description of a problem.
## Instructions
1. **Gather input**: The user may provide:
- A description of a bug or feature request
- A path to a plan file (e.g., `PLAN_*.md`)
- A description of work to be done
2. **Check for an issue template**: Look for issue templates...
3. **Generate the issue content**: Based on the user's input...
4. **Issue Title**: Generate a concise, descriptive title...
5. **Format rules**: ...
6. **Present the issue content**: Display in code blocks...
7. **Write to file**: Write to `.git/ISSUE-EDITMSG`...
8. **Inform the user**: Provide the `gh issue create` command...Key Design Patterns
- Multi-step workflow - Numbered steps guide Claude through the process
- Conditional logic - “If a template exists… If no template exists…”
- Format specification - Examples of expected output format
- Integration with tools - Uses
ghCLI for GitHub operations - Output location - Writes to
.git/ISSUE-EDITMSG(git-ignored temp file) - User control - Presents command but doesn’t auto-execute
Why This Skill Works Well
- Clear instructions: Each step is explicit
- Handles variations: Works with or without issue templates
- Consistent output: Always produces same format
- Safe: Writes to file, user decides when to create issue
- Reusable: Works across any GitHub repository
Part 4: Creating Your First Skill
Step 1: Create the Directory
mkdir -p ~/.claude/skills/my-first-skillStep 2: Create SKILL.md
cat > ~/.claude/skills/my-first-skill/SKILL.md << 'EOF'
---
name: my-first-skill
description: A simple skill that greets the user
---
# My First Skill
When invoked, say hello to the user and tell them something
interesting about the current directory.
1. Greet the user warmly
2. Run `ls -la` to see what's in the current directory
3. Count the files and report the total
4. Mention the most recently modified file
EOFStep 3: Test the Skill
# In Claude Code, type:
/my-first-skillStep 4: Iterate
- Edit
SKILL.mdto refine behavior - Add more steps or change the output format
- Skills update immediately - no restart needed
Part 5: Skill Ideas
Easy Skills (Good for Workshop Exercise)
| Skill Name | Purpose | Complexity |
|---|---|---|
test-summary |
Summarize pytest results from a log file | Easy |
bug-report |
Generate bug report from error description | Easy |
env-check |
Check if test environment is ready | Easy |
flaky-finder |
Analyze test history for flaky tests | Medium |
coverage-report |
Generate coverage summary for PR | Medium |
Skill 1: test-summary
---
name: test-summary
description: Summarize pytest test results from a log file
argument-hint: [log-file-path]
---
# Test Summary Generator
Analyze pytest output and create a summary.
## Instructions
1. Read the log file provided as an argument (or find the most recent
pytest log in the current directory)
2. Extract:
- Total tests run
- Passed count
- Failed count
- Skipped count
- Error count
- Duration
3. For any failures, list:
- Test name
- Brief error message (first line of traceback)
4. Present in this format:
## Test Results
| Metric | Count |
|--------|-------|
| Total | X |
| Passed | X |
| Failed | X |
| Skipped| X |
### Failures
1. `test_name_here` - Error message
2. ...Skill 2: bug-report
---
name: bug-report
description: Generate a structured bug report from an error description
argument-hint: [error-description]
disable-model-invocation: true
---
# Bug Report Generator
Create a structured bug report.
## Instructions
1. Ask the user for:
- What they were trying to do
- What happened instead
- Any error messages
2. Generate a bug report with:
- **Title**: Brief summary (under 60 chars)
- **Environment**: OS, browser, version (ask if not provided)
- **Steps to Reproduce**: Numbered list
- **Expected Behavior**: What should happen
- **Actual Behavior**: What happened
- **Error Messages**: Any logs or stack traces
- **Severity**: Critical/High/Medium/Low (suggest based on impact)
3. Write to `.git/BUG-REPORT.md`
4. Provide: `gh issue create --title "..." --body-file .git/BUG-REPORT.md`Skill 3: env-check
---
name: env-check
description: Check if test environment is ready for testing
---
# Environment Checker
Verify the test environment is properly configured.
## Instructions
Check the following and report status:
1. **Docker**: Is Docker running? (`docker ps`)
2. **Selenium Grid**: Is grid accessible? (`curl http://localhost:4444/status`)
3. **Environment Variables**: Are these set?
- `ENVIRONMENT_MAP`
- `RSP_VERSION`
- `BOX`
4. **Test Target**: Can we reach the test server?
5. **Dependencies**: Is `pytest` installed? Required browsers?
Present results as:
## Environment Check
| Component | Status | Details |
|-----------|--------|---------|
| Docker | ✅/❌ | ... |
| Grid | ✅/❌ | ... |
| Env Vars | ✅/❌ | ... |
| Target | ✅/❌ | ... |
**Ready to test:** Yes/NoPart 6: Hands-On Exercise
Exercise: Build Your Own issue-message Skill
Goal: Create a skill similar to issue-message but customized for your workflow.
Steps:
Create the skill directory:
mkdir -p ~/.claude/skills/my-issue-creatorStart with a basic template:
touch ~/.claude/skills/my-issue-creator/SKILL.mdDefine the workflow:
- What input does the user provide?
- What should Claude look for (templates, context)?
- What format should the output be?
- Where should it write the result?
- What command should it suggest?
Write the SKILL.md following the pattern from Part 3
Test with real scenarios:
- Create an issue from scratch
- Create an issue from a plan file
- Create an issue when a template exists
Iterate based on results
Bonus Challenges
- Add support for different issue types (bug vs feature)
- Include automatic label suggestions
- Add a “severity” field based on keywords
- Support multiple issue trackers (GitHub, Jira, Linear)
Part 7: Best Practices & Tips
Writing Effective Skills
- Be explicit - Don’t assume Claude knows your workflow
- Use numbered steps - Makes the process clear and debuggable
- Provide examples - Show expected output format
- Handle edge cases - “If X, do Y. If no X, do Z.”
- Keep it focused - One skill = one job
Common Mistakes
| Mistake | Better Approach |
|---|---|
| Vague instructions | Specific, numbered steps |
| No output format | Include example output |
| Auto-executing dangerous commands | Write to file, user executes |
| Too many responsibilities | Split into multiple skills |
| Hardcoded values | Use arguments or ask user |
Debugging Skills
- Check
/menu to see if skill appears - Look at the description - is it clear?
- Try invoking manually with
/skill-name - Add “verbose” output steps to trace execution