skill-creation
Skill Creation for OpenCode
Create reusable, discoverable skills that extend OpenCode's capabilities through on-demand loading.
What Skills Are
Skills are modular instruction sets that OpenCode agents can load when needed. Each skill provides:
- Specialized workflows - Multi-step procedures for specific domains
- Domain expertise - Project-specific knowledge, schemas, conventions
- Tool integrations - Instructions for working with specific formats or APIs
- Bundled resources - Scripts, references, and assets for complex tasks
Skills use progressive disclosure: agents see skill names and descriptions initially, then load full content only when triggered by relevant user requests.
Quick Start
Create a skill in three steps:
-
Create directory structure:
mkdir -p .opencode/skills/my-skill cd .opencode/skills/my-skill touch SKILL.md -
Add frontmatter to
SKILL.md:--- name: my-skill description: This skill should be used when the user asks to "do X", "configure Y", or needs Z guidance. --- -
Add markdown content below frontmatter explaining what the skill does and how to use it.
That's it! OpenCode will automatically discover and offer the skill to agents.
File Locations
OpenCode searches for skills in these locations (in order):
Project-local (searches up to git worktree):
.opencode/skills/<name>/SKILL.md.claude/skills/<name>/SKILL.md.agents/skills/<name>/SKILL.md
Global (user-wide):
~/.config/opencode/skills/<name>/SKILL.md~/.claude/skills/<name>/SKILL.md~/.agents/skills/<name>/SKILL.md
Use project-local for repository-specific workflows. Use global for general-purpose skills.
Skill Creation Workflow
Step 1: Understand the Use Case
Before creating a skill, clarify:
- What problem does it solve? - Identify specific user requests or workflows
- What would users say? - Collect concrete trigger phrases
- What context is needed? - Determine required domain knowledge
Example: For a git-release skill, users might say "create a release", "draft changelog", or "tag a new version".
Step 2: Plan the Structure
Decide what resources the skill needs:
SKILL.md only - Simple knowledge, no complex resources
SKILL.md + references/ - Detailed docs, schemas, API specs
SKILL.md + examples/ - Working code samples users can copy
SKILL.md + scripts/ - Utility scripts for validation or automation
Most skills benefit from the standard structure (SKILL.md + references/).
Step 3: Create Directories
Create the skill directory and subdirectories:
# Minimal skill
mkdir -p .opencode/skills/skill-name
# Standard skill (recommended)
mkdir -p .opencode/skills/skill-name/references
# Complete skill
mkdir -p .opencode/skills/skill-name/{references,examples,scripts}
Always start with the minimal or standard structure. Add examples/ and scripts/ only when needed.
Step 4: Write Frontmatter
Every SKILL.md must begin with YAML frontmatter containing at minimum name and description.
Required fields:
---
name: skill-name
description: This skill should be used when the user asks to "trigger phrase 1", "trigger phrase 2", or needs specific guidance.
---
Name requirements:
- 1-64 characters
- Lowercase alphanumeric with single hyphens
- Must match directory name
- Pattern:
^[a-z0-9]+(-[a-z0-9]+)*$
Description requirements:
- 1-1024 characters
- Include specific trigger phrases in quotes
- Be concrete about when to use the skill
- Helps agents decide whether to load the skill
Optional fields:
---
name: skill-name
description: ...
license: MIT
compatibility: opencode
metadata:
author: Your Name
version: 1.0.0
---
For complete frontmatter specification, see references/frontmatter-spec.md.
Step 5: Write Body Content
After frontmatter, write markdown content explaining:
Essential sections:
- Overview - What the skill provides (2-3 sentences)
- Core procedures - Step-by-step workflows
- Key concepts - Domain-specific knowledge agents need
- Quick reference - Tables, commands, or patterns
Keep it focused:
- Target 1,500-2,000 words
- Focus on essential procedures
- Move detailed content to references/
- Use clear headings and examples
Writing style:
- Use imperative form: "Configure the setting" not "You should configure"
- Be direct and actionable
- Include code examples where helpful
- Reference bundled resources clearly
Step 6: Add Bundled Resources
Organize supporting materials by type:
references/ - Documentation loaded as needed:
- Detailed patterns and techniques
- API documentation
- Schema definitions
- Troubleshooting guides
- Each file: 2,000-5,000+ words
examples/ - Working code users can copy:
- Complete, runnable scripts
- Configuration files
- Template files
- Real-world usage examples
scripts/ - Utility scripts:
- Validation tools
- Testing helpers
- Automation scripts
- Must be executable
Reference resources in SKILL.md:
## Additional Resources
### Reference Files
For detailed information, consult:
- **`references/patterns.md`** - Common patterns and best practices
- **`references/api-reference.md`** - Complete API documentation
### Example Files
Working examples in `examples/`:
- **`example-config.json`** - Sample configuration
- **`example-script.sh`** - Usage demonstration
For progressive disclosure strategy, see references/progressive-disclosure.md.
Step 7: Validate and Test
Before using your skill:
Validate structure:
# Run validation script
.opencode/skills/skill-creation/scripts/validate-skill.sh .opencode/skills/your-skill
Check manually:
- SKILL.md exists with valid YAML frontmatter
- Frontmatter has
nameanddescription - Name matches directory name
- Name follows pattern:
^[a-z0-9]+(-[a-z0-9]+)*$ - Description is 1-1024 characters
- Description includes specific trigger phrases
- All referenced files exist
Test with OpenCode:
- Start a new OpenCode session
- Ask a question using trigger phrases from description
- Verify skill appears in available skills
- Confirm skill loads correctly
- Check if content is helpful for the task
Iterate:
- Use the skill on real tasks
- Notice gaps or unclear instructions
- Update SKILL.md or references/
- Re-test and refine
Frontmatter Essentials
Required Fields
name - Skill identifier
- Must match directory name
- 1-64 characters
- Lowercase alphanumeric with single hyphens
- Pattern:
^[a-z0-9]+(-[a-z0-9]+)*$ - Examples:
git-release,api-design,frontend-testing
description - When to use the skill
- 1-1024 characters
- Include specific trigger phrases users would say
- Be concrete about use cases
- Determines when agents load the skill
Good description:
description: This skill should be used when the user asks to "create a database schema", "design SQL tables", "optimize queries", or needs guidance on relational database design.
Bad description:
description: Helps with databases. # Too vague, no trigger phrases
Optional Fields
license - Legal terms (e.g., MIT, Apache-2.0)
compatibility - Target platform (e.g., opencode)
metadata - String-to-string map for custom fields
Unknown frontmatter fields are ignored.
Progressive Disclosure Principle
Skills use three-level loading to manage context efficiently:
Level 1: Metadata (always loaded)
- Skill name and description
- ~50-100 words
- Helps agents decide which skills to load
Level 2: SKILL.md body (loaded when triggered)
- Core concepts and workflows
- 1,500-2,000 words ideal (<5,000 max)
- Essential procedures and quick reference
Level 3: Bundled resources (loaded as needed)
- references/ - Detailed documentation
- examples/ - Working code samples
- scripts/ - Utility tools (can execute without reading)
What goes where:
SKILL.md (always loaded when skill triggers):
- Core concepts and overview
- Essential procedures
- Quick reference tables
- Pointers to references/examples/scripts
references/ (loaded when agents need details):
- Detailed patterns and techniques
- Complete API documentation
- Migration guides
- Troubleshooting and edge cases
examples/ (loaded when agents need samples):
- Complete working scripts
- Configuration files
- Templates
scripts/ (executed or loaded when needed):
- Validation tools
- Testing helpers
- Automation scripts
For detailed strategy, see references/progressive-disclosure.md.
Examples
Study the bundled examples to see skills in action:
Minimal skill (examples/minimal-skill/)
- Single SKILL.md file
- Simple knowledge domain
- No bundled resources
Standard skill (examples/standard-skill/) - Recommended
- SKILL.md with core content
- references/ for detailed documentation
- Best for most use cases
Complete skill (examples/complete-skill/)
- All features demonstrated
- references/, examples/, scripts/
- Shows full progressive disclosure
Validation Script
Use the included validation script to check skill structure:
# Validate a skill
.opencode/skills/skill-creation/scripts/validate-skill.sh path/to/skill
# Example
.opencode/skills/skill-creation/scripts/validate-skill.sh .opencode/skills/my-skill
The script checks:
- SKILL.md exists
- Valid YAML frontmatter
- Required fields present
- Name matches directory
- Name follows regex pattern
- Description length
- Referenced files exist
Permissions
Control which skills agents can access in opencode.json:
{
"permission": {
"skill": {
"*": "allow",
"internal-*": "deny",
"experimental-*": "ask"
}
}
}
Permission levels:
allow- Skill loads immediatelydeny- Skill hidden from agentsask- Prompt user before loading
Patterns support wildcards for flexible control.
Troubleshooting
Skill doesn't appear:
- Verify SKILL.md is all caps
- Check frontmatter has
nameanddescription - Ensure skill name is unique across all locations
- Check permissions in opencode.json
Skill loads but content is wrong:
- Check YAML frontmatter syntax
- Verify markdown starts after
---closing - Review referenced file paths
Name validation fails:
- Must be lowercase only
- Use single hyphens (no consecutive
--) - Cannot start/end with hyphen
- Only alphanumeric and hyphens
Best Practices
Core Principles
Concise is key - Assume the LLM already has knowledge. Only add context the LLM doesn't have. Challenge each piece:
- Does the LLM really need this explanation?
- Can I assume the LLM knows this?
- Does this paragraph justify its token cost?
Write in third person - Descriptions are injected into system prompts:
- ✓ Good: "Processes Excel files and generates reports"
- ✗ Avoid: "I can help you process Excel files" or "You can use this to..."
Set appropriate degrees of freedom:
- High freedom (text-based instructions): Multiple approaches valid, context-dependent decisions
- Medium freedom (pseudocode/templates): Preferred pattern exists, some variation acceptable
- Low freedom (specific scripts): Operations fragile, consistency critical
Use consistent terminology - Choose one term and use throughout:
- ✓ Always "API endpoint", "field", "extract"
- ✗ Mix "API endpoint"/"URL"/"API route", "field"/"box"/"element"
DO
- Include specific trigger phrases in description (3-5 phrases users would actually say)
- Keep SKILL.md focused (1,500-2,000 words, <5,000 max)
- Use progressive disclosure for large skills
- Write in imperative form ("Configure the setting" not "You should configure")
- Write descriptions in third person
- Provide working examples in examples/
- Reference bundled resources clearly in "Additional Resources" section
- Test with real use cases
- Use forward slashes in file paths (not backslashes)
- Keep references one level deep from SKILL.md
- Add table of contents to reference files >100 lines
- Use consistent terminology throughout
DON'T
- Use vague descriptions without trigger phrases
- Put everything in SKILL.md (>3,000 words without references/)
- Write in second person ("you should") or first person ("I can help")
- Leave resources unreferenced
- Skip validation before using
- Create duplicate information across files
- Include time-sensitive information (use "old patterns" sections instead)
- Use Windows-style paths (backslashes)
- Create deeply nested references (keep one level)
- Offer too many options without a clear default
Additional Resources
Reference Files
For complete specifications and strategies:
references/frontmatter-spec.md- Complete YAML frontmatter specificationreferences/progressive-disclosure.md- Deep dive on 3-level loading strategyreferences/common-mistakes.md- Anti-patterns and how to avoid themreferences/best-practices-guide.md- Comprehensive best practices from Claude documentation adapted for OpenCode
Example Skills
Study these working examples:
examples/minimal-skill/- Simplest possible skillexamples/standard-skill/- Recommended structure with referencesexamples/complete-skill/- All features demonstrated
Validation Script
scripts/validate-skill.sh- Automated skill structure checker
Quick Reference
Minimal skill structure:
skill-name/
└── SKILL.md
Standard skill structure (recommended):
skill-name/
├── SKILL.md
└── references/
└── detailed-guide.md
Complete skill structure:
skill-name/
├── SKILL.md
├── references/
│ ├── patterns.md
│ └── advanced.md
├── examples/
│ └── working-example.sh
└── scripts/
└── validate.sh
Frontmatter template:
---
name: skill-name
description: This skill should be used when the user asks to "trigger 1", "trigger 2", or needs specific guidance.
---
Validation command:
.opencode/skills/skill-creation/scripts/validate-skill.sh path/to/skill