A curated collection of reusable AI agent skills/prompts plus skillsctl — a
production-quality, safe-by-default CLI for scanning, auditing, planning, fixing,
and migrating skill files across multiple repositories.
- What are Skills?
- Repository Layout
- Skill Schema
- How to Add a Skill
- skillsctl – CLI Reference
- Embeddings & Semantic Search
- Scanning Repos and Creating PRs – Workflow
- Configuration
- Development
A skill is a reusable, versioned prompt or instruction set for an AI agent. Skills are stored as Markdown files with YAML frontmatter so they are both human-readable and machine-parseable.
Skills encapsulate:
- What the agent should do (body / prompt text)
- Metadata for routing, discovery, and tooling constraints (frontmatter)
- Verification guidance to confirm the skill works correctly
agent-skills/
├── skills/ # Managed skill files
│ └── <domain>/
│ └── <skill-id>.md
├── skillsctl/ # The CLI tool (Python package)
│ ├── cli.py # Click entrypoint
│ ├── scan.py # Repo scanning
│ ├── audit.py # Rule-based audit
│ ├── plan.py # Improvement planning
│ ├── fix.py # Auto-fix engine
│ ├── migrate.py # Cross-repo migration
│ ├── rules.py # Rule fetching & management
│ ├── schema.py # JSON Schema + validation helpers
│ └── embed.py # Embeddings / BM25 search (optional)
├── tests/ # Unit tests + fixtures
├── pyproject.toml
└── README.md # This file
Every skill file must have a YAML frontmatter block between --- delimiters.
The following fields are required:
| Field | Type | Description |
|---|---|---|
id |
string |
Stable kebab-case identifier |
name |
string |
Human-readable display name |
description |
string (>=10 chars) |
One-sentence description |
version |
string |
Semantic version (MAJOR.MINOR.PATCH) |
tags |
string[] (>=1) |
Taxonomy tags for discovery/routing |
Optional fields:
| Field | Type | Description |
|---|---|---|
inputs |
object[] |
Declared input variables |
outputs |
object[] |
Declared output variables |
tooling |
object |
Model/tool constraints |
verification |
string |
How to verify the skill produces correct output |
source |
string |
Original repo URL (populated by migrate) |
migrated_at |
string |
ISO-8601 migration timestamp |
The full JSON Schema is defined in skillsctl/schema.py.
- Choose a domain (e.g.,
code-review,testing,documentation). - Create
skills/<domain>/<your-skill-id>.md. - Add the required frontmatter (see Skill Schema above).
- Write the skill body — include a heading, instructions, and at least one usage example.
- Validate locally:
skillsctl audit --file skills/<domain>/<your-skill-id>.md
- Open a pull request.
# From the repo root
pip install -e .
# With embeddings support
pip install -e ".[embeddings]"
# Development (includes ruff, pytest, etc.)
pip install -e ".[dev]"All commands default to dry-run / read-only mode.
- Pass
--applyto write changes to disk. - Pass
--apply --allow-deleteto enable deletion of source files. --dry-runis the default; pass--no-dry-runtogether with--applyto mutate files.
Clone/fetch repos and detect candidate skill/prompt files by heuristics.
skillsctl scan --repo droxey/dotfiles --repo droxey/clincher
skillsctl scan --local ./my-repo
skillsctl scan --repo droxey/ai --output my-manifest.jsonOutputs a scan manifest (JSON) listing every candidate file with its content hash and parsed frontmatter.
Audit candidate files against a ruleset derived from mgechev/skills-best-practices.
skillsctl audit --manifest scan-manifest.json
skillsctl audit --file skills/general/hello-world.md
skillsctl audit --offline # use built-in baseline rules onlyOutputs audit-report.json and audit-report.md.
The rule source metadata (URL + commit SHA + timestamp) is recorded in every report for reproducibility.
Built-in rules:
| ID | Severity | Description |
|---|---|---|
| FM001 | error | Missing frontmatter |
| FM002 | error | Invalid frontmatter schema |
| FM003 | error | Missing required field |
| FM004 | warning | Non-kebab-case id |
| FM005 | warning | Invalid semver version |
| CT001 | warning | No descriptive body text |
| CT002 | info | No usage example |
| CT003 | info | Missing verification field |
| CT004 | warning | No taxonomy tags |
| ST001 | info | No Markdown heading |
Produce a prioritised improvement plan from audit findings.
skillsctl plan --audit-report audit-report.jsonOutputs improvement-plan.json and improvement-plan.md, ranked by severity -> effort -> fixability.
Apply safe, deterministic fixes in-place (requires --apply).
# Dry-run (default)
skillsctl fix --plan-file improvement-plan.json
# Apply fixes
skillsctl fix --plan-file improvement-plan.json --apply --no-dry-runAuto-fixable rules: FM001, FM004, FM005, ST001. After fixing, a re-audit runs automatically to show improvements.
Move skill files from source repos into this repo under skills/<domain>/.
# Dry-run
skillsctl migrate --manifest scan-manifest.json
# Apply (writes migrated files, leaves pointer in source)
skillsctl migrate --manifest scan-manifest.json --apply --no-dry-run
# Apply + delete source files
skillsctl migrate --manifest scan-manifest.json --apply --no-dry-run --allow-deleteskillsctl includes an optional embeddings module (skillsctl/embed.py).
| Condition | Behaviour |
|---|---|
OPENAI_API_KEY set + openai package installed |
Dense embeddings (text-embedding-3-small) |
| API key missing or package absent | Automatic BM25 lexical search fallback |
Embeddings are cached at ~/.cache/skillsctl/embeddings.json (keyed by content SHA-256).
Override with SKILLSCTL_CACHE_DIR.
Embeddings are never required to run the CLI or tests.
# 1. Scan source repos
skillsctl scan \
--repo droxey/dotfiles \
--repo droxey/clincher \
--repo droxey/ai \
--output scan-manifest.json
# 2. Audit the candidates
skillsctl audit --manifest scan-manifest.json
# 3. Plan improvements
skillsctl plan --audit-report audit-report.json
# 4. Apply safe fixes (optional)
skillsctl fix --plan-file improvement-plan.json --apply --no-dry-run
# 5. Migrate skills into this repo
skillsctl migrate --manifest scan-manifest.json --apply --no-dry-runPolicy: one PR per source repository is created when migration is applied, containing pointer stubs for each migrated skill.
| Environment Variable | Default | Description |
|---|---|---|
OPENAI_API_KEY |
– | Enables dense-vector embeddings |
EMBEDDINGS_API_KEY |
– | Alternative key (any OpenAI-compat API) |
EMBEDDINGS_API_BASE |
– | Custom base URL for embeddings API |
SKILLSCTL_CACHE_DIR |
~/.cache/skillsctl |
Embeddings cache directory |
pip install -e ".[dev]"
# Lint
ruff check skillsctl/ tests/
ruff format --check skillsctl/ tests/
# Test
pytest tests/ -v
pytest tests/ --cov=skillsctl --cov-report=term-missingCI runs on every push/PR via .github/workflows/ci.yml.