| name | use-skilo |
| description | Creates skills from templates, validates against specification, and formats SKILL.md files. Use when developing, linting, or formatting Agent Skills. |
| license | MIT OR Apache-2.0 |
Use Skilo
Skilo is a CLI tool for developing Agent Skills.
Installation
cargo install skilo
cargo install --path .
Commands
| Command | Description |
|---|
skilo new | Create a new skill from template |
skilo lint | Validate skills against spec |
skilo fmt | Format SKILL.md files |
skilo check | Run lint + format check |
skilo validate | Alias for lint --strict |
skilo read-properties | Output skill metadata as JSON |
skilo to-prompt | Generate XML for agent prompts |
Creating Skills
skilo new my-skill
skilo new my-skill \
--description "What the skill does" \
--lang python \
--license MIT \
--template hello-world
skilo new my-skill -o ./skills/
Templates: hello-world (default), minimal, full, script-based
Languages: python, bash, javascript, typescript
Validating Skills
skilo lint path/to/skill
skilo lint .
skilo lint --strict .
skilo lint --format json .
skilo lint --format sarif . > results.sarif
Formatting Skills
skilo fmt .
skilo fmt --check .
skilo fmt --diff .
Reading Skill Properties
Extract skill metadata as JSON:
skilo read-properties path/to/skill
skilo read-properties path/to/skills/
skilo read-properties skill-a skill-b
Output fields: name, description, license, compatibility, metadata, allowed_tools, path.
Generating Agent Prompts
Generate <available_skills> XML for agent system prompts:
skilo to-prompt path/to/skill
skilo to-prompt path/to/skills/
Output:
<available_skills>
<skill>
<name>my-skill</name>
<description>What the skill does</description>
<location>path/to/my-skill/SKILL.md</location>
</skill>
</available_skills>
CI Integration
GitHub Actions
name: Validate Skills
on:
push:
paths: ['.claude/skills/**']
pull_request:
paths: ['.claude/skills/**']
jobs:
validate:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install Rust
uses: dtolnay/rust-toolchain@stable
- name: Cache cargo
uses: Swatinem/rust-cache@v2
- name: Install skilo
run: cargo install skilo@0.4.0
- name: Lint skills
run: skilo lint .claude/skills/
- name: Check formatting
run: skilo fmt --check .claude/skills/
SARIF Integration
Upload results to GitHub Code Scanning:
- name: Run skilo lint
run: skilo lint --format sarif . > results.sarif
continue-on-error: true
- name: Upload SARIF
uses: github/codeql-action/upload-sarif@v3
with:
sarif_file: results.sarif
Quick CI Check
Use skilo check to run both lint and format check in one command:
- name: Validate skills
run: skilo check --strict .claude/skills/
Configuration
Create .skilorc.toml in your project:
[lint]
strict = false
[lint.rules]
name_format = true
name_length = 64
name_directory = true
description_required = true
description_length = 1024
compatibility_length = 500
references_exist = true
body_length = 500
script_executable = true
script_shebang = true
[fmt]
sort_frontmatter = true
indent_size = 2
format_tables = true
[new]
default_license = "MIT"
default_template = "hello-world"
default_lang = "bash"
Disabling Rules
[lint.rules]
name_directory = false
body_length = false
description_length = 2048
Skill Structure
my-skill/
├── SKILL.md # Required: manifest with YAML frontmatter
├── scripts/ # Optional: executable scripts
├── references/ # Optional: additional docs
└── assets/ # Optional: static resources
SKILL.md Format
---
name: my-skill
description: What the skill does
license: MIT
---
# My Skill
Documentation goes here.
Best Practices
Description
Describe what the skill does AND when to use it. Include keywords that help agents match user requests.
Good:
description: Extracts text and tables from PDF files, fills PDF forms, and merges multiple PDFs. Use when working with PDF documents or when the user mentions PDFs, forms, or document extraction.
Bad:
description: Helps with PDFs.
Body Content
- Keep concise, move detailed content to
references/
- Include step-by-step instructions, examples, and edge cases
Progressive Disclosure
- Metadata -
name and description loaded at startup for all skills
- Instructions - Full body loaded when skill activates
- Resources -
scripts/, references/, assets/ loaded only when needed
Scripts
- Be self-contained or document dependencies
- Include helpful error messages
- Handle edge cases gracefully
References
- Keep files focused (one file = one concept)
- Use relative paths from skill root
- Avoid deeply nested reference chains
Optional Fields
Only include if truly needed:
license - Keep short, reference LICENSE file for details
compatibility - Specify environment requirements (e.g., Requires git, docker)
metadata - Key-value pairs with unique keys
allowed-tools - Space-delimited list of pre-approved tools
Exit Codes
| Code | Meaning |
|---|
| 0 | Success |
| 1 | Validation errors found |
| 2 | Invalid arguments/config |
| 3 | I/O error |