Skip to main content

Evaluation-driven Claude Code skill development

Project description

skillet

CI License Python

Evaluation-driven Claude Code skill development.

Install

pip install pyskillet

Why

Anthropic recommends building evaluations before writing skills:

Create evaluations BEFORE writing extensive documentation. This ensures your Skill solves real problems rather than documenting imagined ones.

But they don't provide tooling:

We do not currently provide a built-in way to run these evaluations.

skillet fills that gap.

Workflow

1. Capture evals with /skillet:add

When Claude does something wrong, capture it:

> Write a code review comment for this SQL query...

Claude: This code has a SQL injection vulnerability...

> /skillet:add

Claude: What did you expect instead?

> Should start with **issue** (blocking): using conventional comments format

Claude: Eval saved to ~/.skillet/evals/conventional-comments/001.yaml

2. Run baseline eval

skillet eval conventional-comments
Eval Results (baseline, no skill)
==================================
Evals: 5
Samples: 3 per eval
Total runs: 15

Pass rate: 0% (0/15)

3. Create the skill

skillet create conventional-comments
Found 5 evals for 'conventional-comments', drafting SKILL.md...

Created ~/.claude/skills/conventional-comments/
└── SKILL.md (draft from 5 evals)

4. Eval with skill

skillet eval conventional-comments ~/.claude/skills/conventional-comments
Eval Results (with skill)
=========================
Skill: ~/.claude/skills/conventional-comments
Evals: 5
Samples: 3 per eval
Total runs: 15

Pass rate: 80% (12/15)

5. Tune the skill

skillet tune conventional-comments ~/.claude/skills/conventional-comments
Round 1/5: Pass rate 80% (12/15)
  Improving skill...
Round 2/5: Pass rate 93% (14/15)
  Improving skill...
Round 3/5: Pass rate 100% (15/15)
  Target reached!

Best skill saved to ~/.claude/skills/conventional-comments/SKILL.md

Commands

skillet eval <name> [skill]         # run evals (baseline or with skill)
skillet create <name>               # create skill from evals
skillet tune <name> <skill>         # iteratively improve skill
skillet compare <name> <skill>      # compare baseline vs skill from cache
skillet show <name>                 # inspect cached eval results
skillet lint <path>                 # lint a SKILL.md for common issues
skillet generate-evals <skill>      # generate candidate evals from a skill

Evals

Evals are stored in ~/.skillet/evals/<name>/:

# ~/.skillet/evals/conventional-comments/001.yaml
timestamp: 2025-01-15T10:30:00Z
name: conventional-comments
prompt: "Write a code review comment for..."
expected: "Should start with **issue** (blocking):"

Python API

import asyncio
from pathlib import Path
from skillet import evaluate

async def main():
    # Baseline (no skill)
    baseline = await evaluate("conventional-comments")
    print(f"Baseline: {baseline['pass_rate']}%")

    # With skill
    result = await evaluate(
        "conventional-comments",
        skill_path=Path("~/.claude/skills/conventional-comments").expanduser(),
    )
    print(f"With skill: {result['pass_rate']}%")

asyncio.run(main())

Tune a skill programmatically:

from skillet import tune
from skillet.tune import TuneConfig

result = await tune(
    "conventional-comments",
    Path("~/.claude/skills/conventional-comments").expanduser(),
    config=TuneConfig(max_rounds=10, target_pass_rate=90.0),
)
print(f"Final pass rate: {result.result.final_pass_rate}%")

See the Python API reference for all functions and options.

Documentation

Full documentation available at the docs site:

Roadmap

See ROADMAP.md for future ideas and planned features.

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pyskillet-0.2.23.tar.gz (477.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

pyskillet-0.2.23-py3-none-any.whl (181.6 kB view details)

Uploaded Python 3

File details

Details for the file pyskillet-0.2.23.tar.gz.

File metadata

  • Download URL: pyskillet-0.2.23.tar.gz
  • Upload date:
  • Size: 477.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.10.3 {"installer":{"name":"uv","version":"0.10.3","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for pyskillet-0.2.23.tar.gz
Algorithm Hash digest
SHA256 6a1bc23eaeb2b07800b81895af4052e573a14e23c700583202c6117c5d3f1738
MD5 5bb9548cf0559dedec0284d6ad5aa130
BLAKE2b-256 d0f1d02192af3c583745f8d2c356ce50d72ff817c59229b23d8912df37f43c40

See more details on using hashes here.

File details

Details for the file pyskillet-0.2.23-py3-none-any.whl.

File metadata

  • Download URL: pyskillet-0.2.23-py3-none-any.whl
  • Upload date:
  • Size: 181.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.10.3 {"installer":{"name":"uv","version":"0.10.3","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for pyskillet-0.2.23-py3-none-any.whl
Algorithm Hash digest
SHA256 ac3d19cd54e8ae3b4ab6504ac816a4268412556da4458229a670f6d12a593e4c
MD5 0b33b1184e10d5179496ab6158640a6e
BLAKE2b-256 c12ee5a1edcd71918b3d931a2464a99d7d86325aa9864ff65d0e18162df0a5ec

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page