Write skill
Overview
This skill provides guidance for creating effective skills.
Skills are modular, self-contained packages that extend Claude's capabilities by providing specialized knowledge, workflows, and tools. Think of them as "onboarding guides" for specific domains or tasks—they transform Claude from a general-purpose agent into a specialized agent equipped with procedural knowledge that no model can fully possess.
Official guidance: For Anthropic's official skill authoring best practices, see references/anthropic-best-practices.md.
Skills provide:
- Specialized workflows - Multi-step procedures for specific domains
- Tool integrations - Instructions for working with specific file formats or APIs
- Domain expertise - Company-specific knowledge, schemas, business logic
- Bundled resources - Scripts, references, and assets for complex and repetitive tasks
Anatomy of a Skill
Every skill consists of a required SKILL.md file and optional bundled resources:
skill-name/
├── SKILL.md (required)
│ ├── YAML frontmatter metadata (required)
│ │ ├── name: (required)
│ │ └── description: (required)
│ └── Markdown instructions (required)
└── Bundled Resources (optional)
├── scripts/ - Executable code (Python/Bash/etc.)
├── references/ - Documentation intended to be loaded into context as needed
└── assets/ - Files used in output (templates, icons, fonts, etc.)
Flat namespace: All skills in one searchable namespace.
SKILL.md (required)
The name and description in YAML frontmatter determine when Claude will use the skill. Be specific, describe ONLY when to use the skill, NOT what it does. Use the third-person (e.g. "This skill should be used when..." instead of "Use this skill when...").
---
name: skill-name-with-hyphens
description: Use when [specific triggering conditions and symptoms]
---
# Skill Name
## Overview
What is this? Core principle in 1-2 sentences.
## When to Use
[Small inline flowchart IF decision non-obvious]
Bullet list with SYMPTOMS and use cases
When NOT to use
## Core Pattern (for techniques/patterns)
Before/after code comparison
## Quick Reference
Table or bullets for scanning common operations
## Implementation
Inline code for simple patterns
Link to file for heavy reference or reusable tools
## Common Mistakes
What goes wrong + fixes
Bundled Resources (optional)
Scripts (scripts/)
Executable code (Python/Bash/etc.) for tasks that require deterministic reliability or are repeatedly rewritten.
- When to include: When the same code is being rewritten repeatedly or deterministic reliability is needed
- Example:
scripts/rotate_pdf.pyfor PDF rotation tasks - Benefits: Token efficient, deterministic, may be executed without loading into context
- Note: Scripts may still need to be read by Claude for patching or environment-specific adjustments
References (references/)
Documentation and reference material intended to be loaded as needed into context to inform Claude's process and thinking.
- When to include: For documentation that Claude should reference while working
- Examples:
references/finance.mdfor financial schemas,references/mnda.mdfor company NDA template,references/policies.mdfor company policies,references/api_docs.mdfor API specifications - Use cases: Database schemas, API documentation, domain knowledge, company policies, detailed workflow guides
- Benefits: Keeps SKILL.md lean, loaded only when Claude determines it's needed
- Best practice: If files are large (>10k words), include grep search patterns in SKILL.md
- Avoid duplication: Information should live in either SKILL.md or references files, not both. Prefer references files for detailed information unless it's truly core to the skill—this keeps SKILL.md lean while making information discoverable without hogging the context window. Keep only essential procedural instructions and workflow guidance in SKILL.md; move detailed reference material, schemas, and examples to references files.
Assets (assets/)
Files not intended to be loaded into context, but rather used within the output Claude produces.
- When to include: When the skill needs files that will be used in the final output
- Examples:
assets/logo.pngfor brand assets,assets/slides.pptxfor PowerPoint templates,assets/frontend-template/for HTML/React boilerplate,assets/font.ttffor typography - Use cases: Templates, images, icons, boilerplate code, fonts, sample documents that get copied or modified
- Benefits: Separates output resources from documentation, enables Claude to use files without loading them into context
Progressive Disclosure Design Principle
Skills use a three-level loading system to manage context efficiently:
- Metadata (name + description) - Always in context (~100 words)
- SKILL.md body - When skill triggers (<5k words)
- Bundled resources - As needed by Claude (Unlimited*)
*Unlimited because scripts can be executed without reading into context window.
Skill Creation Process
To create a skill, follow the "Skill Creation Process" in order, skipping steps only if there is a clear reason why they are not applicable.
Step 1: Understanding the Skill with Concrete Examples
Skip this step only when the skill's usage patterns are already clearly understood. It remains valuable even when working with an existing skill.
To create an effective skill, clearly understand concrete examples of how the skill will be used. This understanding can come from either direct user examples or generated examples that are validated with user feedback.
For example, when building an image-editor skill, relevant questions include:
- "What functionality should the image-editor skill support? Editing, rotating, anything else?"
- "Can you give some examples of how this skill would be used?"
- "I can imagine users asking for things like 'Remove the red-eye from this image' or 'Rotate this image'. Are there other ways you imagine this skill being used?"
- "What would a user say that should trigger this skill?"
To avoid overwhelming users, avoid asking too many questions in a single message. Start with the most important questions and follow up as needed for better effectiveness.
Conclude this step when there is a clear sense of the functionality the skill should support.
Step 2: Planning the Reusable Skill Contents
To turn concrete examples into an effective skill, analyze each example by:
- Considering how to execute on the example from scratch
- Identifying what scripts, references, and assets would be helpful when executing these workflows repeatedly
Example: When building a pdf-editor skill to handle queries like "Help me rotate this PDF," the analysis shows:
- Rotating a PDF requires re-writing the same code each time
- A
scripts/rotate_pdf.pyscript would be helpful to store in the skill
Example: When designing a frontend-webapp-builder skill for queries like "Build me a todo app" or "Build me a dashboard to track my steps," the analysis shows:
- Writing a frontend webapp requires the same boilerplate HTML/React each time
- An
assets/hello-world/template containing the boilerplate HTML/React project files would be helpful to store in the skill
Example: When building a big-query skill to handle queries like "How many users have logged in today?" the analysis shows:
- Querying BigQuery requires re-discovering the table schemas and relationships each time
- A
references/schema.mdfile documenting the table schemas would be helpful to store in the skill
To establish the skill's contents, analyze each concrete example to create a list of the reusable resources to include: scripts, references, and assets.
Step 3: Initializing the Skill
At this point, it is time to actually create the skill.
Skip this step only if the skill being developed already exists, and iteration or packaging is needed. In this case, continue to the next step.
When creating a new skill from scratch, always run the init_skill.sh script. The script conveniently generates a new template skill directory that automatically includes everything a skill requires, making the skill creation process much more efficient and reliable.
Usage:
scripts/init_skill.sh <skill-name> --path <output-directory>
The script:
- Creates the skill directory at the specified path
- Generates a SKILL.md template with proper frontmatter and TODO placeholders
- Creates example resource directories:
scripts/,references/, andassets/ - Adds example files in each directory that can be customized or deleted
After initialization, customize or remove the generated SKILL.md and example files as needed.
Step 4: Edit the Skill
When editing the (newly-generated or existing) skill, remember that the skill is being created for another instance of Claude to use. Focus on including information that would be beneficial and non-obvious to Claude. Consider what procedural knowledge, domain-specific details, or reusable assets would help another Claude instance execute these tasks more effectively.
Start with Reusable Skill Contents
To begin implementation, start with the reusable resources identified above: scripts/, references/, and assets/ files. Note that this step may require user input. For example, when implementing a brand-guidelines skill, the user may need to provide brand assets or templates to store in assets/, or documentation to store in references/.
Also, delete any example files and directories not needed for the skill. The initialization script creates example files in scripts/, references/, and assets/ to demonstrate structure, but most skills won't need all of them.
Update SKILL.md
Writing Style: Write the entire skill using imperative/infinitive form (verb-first instructions), not second person. Use objective, instructional language (e.g., "To accomplish X, do Y" rather than "You should do X" or "If you need to do X"). This maintains consistency and clarity for AI consumption.
To complete SKILL.md, answer the following questions:
- What is the purpose of the skill, in a few sentences?
- When should the skill be used?
- In practice, how should Claude use the skill? All reusable skill contents developed above should be referenced so that Claude knows how to use them.
Step 5: Test the Skill
CRITICAL: Always test skills after creation or major updates. Skills often contain commands that don't execute correctly, incorrect tool usage patterns, or process flows that don't work as intended.
Testing Methodology
1. Validate Command Syntax
Test all command examples in the skill to ensure they execute correctly:
- Extract commands: Find all bash command examples in SKILL.md
- Test each command: Execute commands with test data or dry-run flags
- Verify output: Ensure commands produce expected results
- Check error handling: Test commands with invalid inputs to verify error messages
Common command issues:
- Incorrect CLI flags or options
- Missing required parameters
- Incorrect quoting or escaping
- Commands that don't exist or require installation
Example testing:
# If skill includes: gh pr view <number> --json number,title
# Test with: gh pr view --help # Verify flag syntax
# Test with: gh pr view 1 --json number,title # Test actual execution
2. Verify Tool Integration
For skills that integrate with external tools (CLI tools, APIs, etc.):
- Check tool availability: Verify the tool is installed or document installation
- Test authentication: Ensure auth patterns work (API keys, OAuth, etc.)
- Validate API calls: Test actual API requests with the documented syntax
- Check response parsing: Verify response formats match expectations
Example checks:
# For gh CLI integration
which gh # Verify installation
gh --version # Check version
gh auth status # Verify authentication
# For acli integration
which acli # Verify installation
acli --version # Check version
acli jira config list # Verify configuration
3. Test Process Flows
Walk through the step-by-step process documented in the skill:
- Follow each step: Execute the workflow from start to finish
- Test branching logic: Verify conditional paths work correctly
- Check error paths: Test what happens when things go wrong
- Validate integrations: Ensure steps connect properly (e.g., output from step 1 feeds into step 2)
Process flow testing checklist:
- Can complete the workflow start to finish
- Each step produces the expected output
- Error conditions are handled gracefully
- Alternative paths (if/else logic) work correctly
- Dependencies between steps are clear and correct
4. Validate References and Resources
If the skill includes bundled resources:
- Scripts: Run scripts to ensure they execute without errors
- References: Verify reference files exist and contain accurate information
- Assets: Check that asset files are accessible and in correct formats
5. Test Agent Dispatch Patterns
For skills that dispatch to sub-agents:
- Verify agent names: Ensure agent types exist and are spelled correctly
- Test prompt structure: Verify the prompt format is correct
- Check context passing: Ensure all necessary context is included
- Validate tool access: Confirm the agent has access to required tools
6. Identify and Fix Issues
Document all issues found during testing:
Issue categories:
- Critical: Commands fail, process cannot complete
- Important: Incorrect behavior, misleading instructions
- Minor: Typos, formatting issues, unclear wording
For each issue:
- Document the problem
- Identify the root cause
- Fix in SKILL.md or bundled resources
- Re-test to verify fix
- Check for similar issues elsewhere in the skill
7. Test with Realistic Examples
Create test scenarios based on the concrete examples from Step 1:
- Use real data: Test with actual files, URLs, or identifiers
- Simulate user requests: Execute the skill as a user would invoke it
- Verify end-to-end: Check that the complete workflow produces expected results
8. Document Test Results
Keep track of testing progress:
## Test Results for [skill-name]
### Commands Tested
- [x] gh pr view --json number,title,body ✓ Works
- [x] gh pr diff 123 ✓ Works
- [ ] acli jira workitem search ✗ Requires --limit flag
### Process Flows Tested
- [x] Review PR with JIRA integration ✓ Works
- [x] Review PR without JIRA ✓ Works
- [ ] Handle missing PR ✗ Error message unclear
### Issues Found
1. Missing --limit flag in acli command (Critical) - FIXED
2. Incorrect JSON field name in gh command (Important) - FIXED
3. Typo in example command (Minor) - FIXED
### Fixes Applied
- Added --limit 50 to all acli search commands
- Changed --json fields to match gh CLI output
- Corrected example command spelling
When to Re-test
Re-test the skill after:
- Any changes to command syntax
- Updates to process flows
- Changes to tool integration patterns
- Adding new features or workflows
- User reports issues or confusion
Testing Best Practices
- Test early and often: Don't wait until the skill is "complete"
- Use real tools: Test with actual CLI tools and APIs, not simulations
- Document assumptions: Note any prerequisites (installed tools, auth, etc.)
- Test error cases: Don't just test the happy path
- Get user feedback: Have someone unfamiliar with the skill try to use it
Step 6: Iterate
After testing the skill and gathering user feedback, iterate to improve it. Users may request improvements after using the skill, often with fresh context of how it performed.
Iteration workflow:
- Use the skill on real tasks (or have users test it)
- Notice struggles or inefficiencies
- Identify how SKILL.md or bundled resources should be updated
- Implement changes and re-test (return to Step 5)
- Document what was changed and why