agent-skill-eval 0.3.0__tar.gz → 0.4.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.1}/.github/ISSUE_TEMPLATE/bug_report.yml +2 -2
- {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.1}/.github/workflows/ci.yml +1 -1
- agent_skill_eval-0.4.1/.github/workflows/release.yml +48 -0
- {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.1}/AGENTS.md +4 -4
- {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.1}/CHANGELOG.md +75 -10
- {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.1}/CONTRIBUTING.md +2 -2
- agent_skill_eval-0.4.1/Makefile +107 -0
- {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.1}/PKG-INFO +34 -30
- {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.1}/README.md +30 -26
- agent_skill_eval-0.4.1/TODO.md +69 -0
- agent_skill_eval-0.4.1/config/.env.example +30 -0
- agent_skill_eval-0.4.1/config/baseline.env +21 -0
- {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.1}/examples/fix-failing-tests/evals/evals.json +1 -1
- agent_skill_eval-0.4.1/pyproject.toml +93 -0
- {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.1}/schemas/evals.schema.json +1 -1
- agent_skill_eval-0.4.1/src/agent_skill_eval/__init__.py +10 -0
- agent_skill_eval-0.4.1/src/agent_skill_eval/__main__.py +3 -0
- {agent_skill_eval-0.3.0/src/skill_eval → agent_skill_eval-0.4.1/src/agent_skill_eval}/cli.py +44 -24
- {agent_skill_eval-0.3.0/src/skill_eval → agent_skill_eval-0.4.1/src/agent_skill_eval}/git_state.py +1 -1
- {agent_skill_eval-0.3.0/src/skill_eval → agent_skill_eval-0.4.1/src/agent_skill_eval}/graders/__init__.py +132 -50
- {agent_skill_eval-0.3.0/src/skill_eval → agent_skill_eval-0.4.1/src/agent_skill_eval}/harnesses/__init__.py +12 -6
- {agent_skill_eval-0.3.0/src/skill_eval → agent_skill_eval-0.4.1/src/agent_skill_eval}/models.py +6 -0
- {agent_skill_eval-0.3.0/src/skill_eval → agent_skill_eval-0.4.1/src/agent_skill_eval}/runner.py +15 -7
- {agent_skill_eval-0.3.0/src/skill_eval → agent_skill_eval-0.4.1/src/agent_skill_eval}/skills.py +1 -1
- {agent_skill_eval-0.3.0/src/skill_eval → agent_skill_eval-0.4.1/src/agent_skill_eval}/workspace.py +3 -3
- {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.1}/tests/conftest.py +1 -1
- {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.1}/tests/test_cli_smoke.py +1 -1
- agent_skill_eval-0.4.1/tests/test_e2e.py +210 -0
- {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.1}/tests/test_fuzz_grader.py +2 -2
- {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.1}/tests/test_git_state.py +3 -3
- {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.1}/tests/test_graders.py +11 -11
- {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.1}/tests/test_harnesses.py +24 -1
- {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.1}/tests/test_launch_features.py +14 -14
- {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.1}/tests/test_llm_grader.py +1 -1
- {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.1}/tests/test_runner.py +32 -32
- {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.1}/tests/test_skill_validation.py +1 -1
- {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.1}/tests/test_skills.py +2 -2
- {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.1}/tests/test_workspace.py +2 -2
- agent_skill_eval-0.3.0/.github/workflows/publish.yml +0 -50
- agent_skill_eval-0.3.0/TODO.md +0 -105
- agent_skill_eval-0.3.0/pyproject.toml +0 -60
- agent_skill_eval-0.3.0/src/skill_eval/__init__.py +0 -8
- agent_skill_eval-0.3.0/src/skill_eval/__main__.py +0 -3
- {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.1}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.1}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.1}/.github/actions/setup/action.yml +0 -0
- {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.1}/.gitignore +0 -0
- {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.1}/CODE_OF_CONDUCT.md +0 -0
- {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.1}/LICENSE +0 -0
- {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.1}/examples/commit-push-pr/evals/evals.json +0 -0
- {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.1}/examples/commit-push-pr/evals/files/sample_change.py +0 -0
- {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.1}/examples/fix-failing-tests/evals/files/calculator.py +0 -0
- {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.1}/examples/fix-failing-tests/evals/files/conftest.py +0 -0
- {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.1}/examples/fix-failing-tests/evals/files/test_calculator.py +0 -0
- {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.1}/examples/review-diff/evals/evals.json +0 -0
- {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.1}/examples/review-diff/evals/files/changes.diff +0 -0
- {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.1}/examples/review-diff/evals/files/orders.py +0 -0
- {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.1}/examples/validate-config/evals/evals.json +0 -0
- {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.1}/examples/validate-config/evals/files/app_config.json +0 -0
- {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.1}/examples/write-release-notes/evals/evals.json +0 -0
- {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.1}/examples/write-release-notes/evals/files/commits.txt +0 -0
- {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.1}/scripts/record-demo.sh +0 -0
- {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.1}/skills/commit-push-pr/SKILL.md +0 -0
- {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.1}/skills/fix-failing-tests/SKILL.md +0 -0
- {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.1}/skills/review-diff/SKILL.md +0 -0
- {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.1}/skills/validate-config/SKILL.md +0 -0
- {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.1}/skills/validate-config/references/config-rules.md +0 -0
- {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.1}/skills/validate-config/scripts/validate_config.py +0 -0
- {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.1}/skills/write-release-notes/SKILL.md +0 -0
- {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.1}/tests/__init__.py +0 -0
- {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.1}/tests/fixtures/evals/format-json.json +0 -0
- {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.1}/tests/fixtures/skills/format-json/SKILL.md +0 -0
|
@@ -15,7 +15,7 @@ body:
|
|
|
15
15
|
label: Steps to reproduce
|
|
16
16
|
description: Minimal steps to reproduce the behavior
|
|
17
17
|
placeholder: |
|
|
18
|
-
1. skill-eval run --skill ... --evals ... --agent opencode
|
|
18
|
+
1. agent-skill-eval run --skill ... --evals ... --agent opencode
|
|
19
19
|
2. ...
|
|
20
20
|
validations:
|
|
21
21
|
required: true
|
|
@@ -30,7 +30,7 @@ body:
|
|
|
30
30
|
id: version
|
|
31
31
|
attributes:
|
|
32
32
|
label: Version
|
|
33
|
-
description: Output of `skill-eval --version`
|
|
33
|
+
description: Output of `agent-skill-eval --version`
|
|
34
34
|
- type: input
|
|
35
35
|
id: python
|
|
36
36
|
attributes:
|
|
@@ -37,7 +37,7 @@ jobs:
|
|
|
37
37
|
- uses: ./.github/actions/setup
|
|
38
38
|
with:
|
|
39
39
|
python-version: ${{ matrix.python-version }}
|
|
40
|
-
- run: pytest -v --junitxml=results.xml --cov=
|
|
40
|
+
- run: pytest -v --junitxml=results.xml --cov=agent_skill_eval --cov-report=xml:coverage.xml
|
|
41
41
|
- name: Upload test results
|
|
42
42
|
if: always()
|
|
43
43
|
uses: actions/upload-artifact@v4
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
name: Release
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches:
|
|
6
|
+
- main
|
|
7
|
+
|
|
8
|
+
permissions:
|
|
9
|
+
contents: write
|
|
10
|
+
id-token: write
|
|
11
|
+
|
|
12
|
+
jobs:
|
|
13
|
+
release:
|
|
14
|
+
runs-on: ubuntu-latest
|
|
15
|
+
concurrency: release
|
|
16
|
+
environment:
|
|
17
|
+
name: pypi
|
|
18
|
+
url: https://pypi.org/project/agent-skill-eval/
|
|
19
|
+
|
|
20
|
+
steps:
|
|
21
|
+
- uses: actions/checkout@v4
|
|
22
|
+
with:
|
|
23
|
+
fetch-depth: 0
|
|
24
|
+
token: ${{ secrets.GITHUB_TOKEN }}
|
|
25
|
+
|
|
26
|
+
- name: Install uv
|
|
27
|
+
uses: astral-sh/setup-uv@v4
|
|
28
|
+
|
|
29
|
+
- name: Set up Python
|
|
30
|
+
run: uv python install 3.12
|
|
31
|
+
|
|
32
|
+
- name: Configure Git
|
|
33
|
+
run: |
|
|
34
|
+
git config user.name "github-actions[bot]"
|
|
35
|
+
git config user.email "github-actions[bot]@users.noreply.github.com"
|
|
36
|
+
|
|
37
|
+
- name: Semantic Release
|
|
38
|
+
env:
|
|
39
|
+
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
40
|
+
run: |
|
|
41
|
+
uv run --with 'python-semantic-release>=9,<10' semantic-release version
|
|
42
|
+
uv run --with 'python-semantic-release>=9,<10' semantic-release publish
|
|
43
|
+
|
|
44
|
+
- name: Build package
|
|
45
|
+
run: uv build
|
|
46
|
+
|
|
47
|
+
- name: Publish to PyPI
|
|
48
|
+
uses: pypa/gh-action-pypi-publish@release/v1
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
## Project
|
|
4
4
|
|
|
5
|
-
Python CLI framework (`skill-eval`) for evaluating agent skills across OpenCode, Claude Code, and Codex. Uses Typer, Pydantic, OpenAI SDK, and Rich.
|
|
5
|
+
Python CLI framework (`agent-skill-eval`) for evaluating agent skills across OpenCode, Claude Code, and Codex. Uses Typer, Pydantic, OpenAI SDK, and Rich.
|
|
6
6
|
|
|
7
7
|
## Quick commands
|
|
8
8
|
|
|
@@ -24,7 +24,7 @@ uv run --extra dev ruff check src/ tests/ && uv run --extra dev ruff format --ch
|
|
|
24
24
|
## Architecture
|
|
25
25
|
|
|
26
26
|
```
|
|
27
|
-
src/
|
|
27
|
+
src/agent_skill_eval/
|
|
28
28
|
├── cli.py # Typer CLI app (run, report, grade, cleanup, init)
|
|
29
29
|
├── runner.py # EvalRunner orchestrates eval execution
|
|
30
30
|
├── graders/__init__.py # DeterministicGrader + LLMGrader (700+ lines, single file)
|
|
@@ -35,8 +35,8 @@ src/skill_eval/
|
|
|
35
35
|
└── workspace.py # Workspace creation (fresh git init or clone)
|
|
36
36
|
```
|
|
37
37
|
|
|
38
|
-
- Entry point: `
|
|
39
|
-
- Package layout: `src/
|
|
38
|
+
- Entry point: `agent_skill_eval.cli:app` (registered as `agent-skill-eval` console script)
|
|
39
|
+
- Package layout: `src/agent_skill_eval/` (hatchling build, wheel packages `src/agent_skill_eval`)
|
|
40
40
|
- The `fake` harness (used in tests) is a no-op agent that produces deterministic output
|
|
41
41
|
|
|
42
42
|
## Testing
|
|
@@ -1,28 +1,93 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
|
+
Entries above the insertion flag are generated by python-semantic-release
|
|
5
|
+
from conventional commits; entries below it are curated by hand.
|
|
4
6
|
|
|
5
|
-
|
|
7
|
+
<!-- version list -->
|
|
8
|
+
|
|
9
|
+
## v0.4.1 (2026-06-11)
|
|
10
|
+
|
|
11
|
+
### Bug Fixes
|
|
12
|
+
|
|
13
|
+
- Todo batch — grader honesty, cost reporting, curated changelog
|
|
14
|
+
([#11](https://github.com/tardigrde/agent-skill-eval/pull/11),
|
|
15
|
+
[`33ab02c`](https://github.com/tardigrde/agent-skill-eval/commit/33ab02c6c5ac3459d1987ba46ae3cc85038f8685))
|
|
16
|
+
|
|
17
|
+
* fix: grader honesty — skip-with-warning, workspace fallback warning, behavior-based negative
|
|
18
|
+
control
|
|
19
|
+
|
|
20
|
+
- LLMGrader: grading errors and missing per-assertion results are now skipped (not failed) and
|
|
21
|
+
warned about on stderr, so grader failures never masquerade as agent failures. - Workspace
|
|
22
|
+
resolution for file-based checks is shared between the deterministic and LLM graders and warns
|
|
23
|
+
(once per run dir) when it falls back to guessing from the output directory layout. -
|
|
24
|
+
fix-failing-tests negative-control: reword the grader-run-dependent 'output contains the source
|
|
25
|
+
code' assertion to the behavior that matters (file read and displayed/described).
|
|
26
|
+
|
|
27
|
+
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
|
28
|
+
|
|
29
|
+
* feat: cost column in report, validate flags LLM-rubric assertions, curated changelog
|
|
30
|
+
|
|
31
|
+
- benchmark.json: per-config cost_usd mean/stddev and per-agent cost deltas; report gains a Cost
|
|
32
|
+
(USD) column (table and markdown). - validate: classify_assertion() reports which assertions match
|
|
33
|
+
no deterministic pattern and will be graded by the LLM rubric, instead of that happening silently
|
|
34
|
+
at run time. - CHANGELOG.md: restore curated pre-0.4 entries (PSR-style headings);
|
|
35
|
+
semantic-release now runs in insertion-only update mode with vendored templates that render commit
|
|
36
|
+
summary lines only — no more commit bodies or Co-Authored-By trailers leaking into the changelog.
|
|
37
|
+
- Version is single-sourced from pyproject.toml (PSR version_variables removed; __init__ falls
|
|
38
|
+
back to 0.0.0 when not installed). - TODO.md: tick everything done in this batch and items
|
|
39
|
+
verified already done on main.
|
|
40
|
+
|
|
41
|
+
* fix: normalize assertion text when matching LLM grader responses
|
|
42
|
+
|
|
43
|
+
LLMs echo assertions with minor drift (casing, trailing periods, whitespace); exact-match made those
|
|
44
|
+
falsely count as missing results. Addresses Gemini review on PR #11.
|
|
45
|
+
|
|
46
|
+
* chore: remove vendored PSR templates, use defaults
|
|
47
|
+
|
|
48
|
+
---------
|
|
49
|
+
|
|
50
|
+
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
|
|
51
|
+
|
|
52
|
+
### Documentation
|
|
53
|
+
|
|
54
|
+
- Update TODO — v0.4.0 state, subagent evals next, agent working notes
|
|
55
|
+
([`4b5b76f`](https://github.com/tardigrde/agent-skill-eval/commit/4b5b76faed27678bf81a23cb9b2478e90c590c82))
|
|
56
|
+
|
|
57
|
+
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
## v0.4.0 (2026-06-11)
|
|
61
|
+
|
|
62
|
+
### Changed
|
|
63
|
+
- Converged all names on `agent-skill-eval`: GitHub repo (was `skill-evals`), CLI entry point (was `skill-eval`), and Python module (was `skill_eval`) now all match the PyPI package name
|
|
64
|
+
- Added short CLI alias `ase` (same app as `agent-skill-eval`)
|
|
65
|
+
- Env var prefix renamed `SKILL_EVAL_*` -> `ASE_*` (`ASE_AGENT_TIMEOUT`, `ASE_AGENT_RETRIES`, `ASE_LIVE`)
|
|
66
|
+
|
|
67
|
+
### Added
|
|
68
|
+
- Codex harness fixes (`--sandbox workspace-write`, `--skip-git-repo-check`), `cost_usd` in `timing.json`, two-tier e2e tests, Makefile eval/test targets (merged via PR #9, previously unreleased)
|
|
69
|
+
|
|
70
|
+
## v0.3.0 (2026-06-11)
|
|
6
71
|
|
|
7
72
|
### Added
|
|
8
73
|
- `validate-config` example skill + eval suite: exercises bundled resources (agent runs skill's `scripts/` and reads its `references/`); graded via command-ran + file + content checks; fully offline
|
|
9
74
|
- `review-diff` example skill + eval suite: read-only analysis (planted bugs found, documented decoy not flagged, nothing modified); graded via chat-output-only content + LLM rubric; fully offline
|
|
10
75
|
|
|
11
|
-
##
|
|
76
|
+
## v0.2.1 (2026-06-11)
|
|
12
77
|
|
|
13
78
|
### Changed
|
|
14
79
|
- Renamed package from `skill-eval` to `agent-skill-eval` (PyPI name collision)
|
|
15
80
|
|
|
16
|
-
##
|
|
81
|
+
## v0.2.0 (2026-06-10)
|
|
17
82
|
|
|
18
83
|
### Added
|
|
19
84
|
- `write-release-notes` example skill + eval suite: exercises LLM rubric grading (grouping, breaking-change prominence, anti-fabrication) instead of git-state checks
|
|
20
85
|
- `--runs N` repeats every (eval, agent, config); `benchmark.json` now reports `full_pass_rate`, `pass_at_k`, and `k`
|
|
21
86
|
- `--agent-model agent=model` (repeatable) and `--harness-base-url` to pin models and endpoints per agent CLI
|
|
22
87
|
- `--timeout` / `--retries` flags; harnesses retry on timeout or non-zero exit with backoff and record `exit_code`, `timed_out`, `retries` in `timing.json`
|
|
23
|
-
- `skill-eval validate`: schema + fixture-existence + duplicate-id checks for evals.json
|
|
24
|
-
- `skill-eval list`: discover eval suites and skills under a directory
|
|
25
|
-
- `skill-eval compare`: side-by-side pass rates of two iterations
|
|
88
|
+
- `agent-skill-eval validate`: schema + fixture-existence + duplicate-id checks for evals.json
|
|
89
|
+
- `agent-skill-eval list`: discover eval suites and skills under a directory
|
|
90
|
+
- `agent-skill-eval compare`: side-by-side pass rates of two iterations
|
|
26
91
|
- `report --format markdown` and `report --show-evidence` (failed/skipped assertion evidence)
|
|
27
92
|
- JSON Schema for the eval suite format at `schemas/evals.schema.json` (with a sync test)
|
|
28
93
|
- SKILL.md frontmatter validation warning on `run` (missing name/description, name mismatch)
|
|
@@ -39,7 +104,7 @@ All notable changes to this project will be documented in this file.
|
|
|
39
104
|
- Multi-agent runs no longer report a misleading `Delta: 0.0%`: `benchmark.json` now has per-agent `deltas`; the legacy `delta` field is only set for single-agent runs (otherwise `null`)
|
|
40
105
|
- Removed dead `cost_usd` handling in the Claude Code output parser
|
|
41
106
|
|
|
42
|
-
##
|
|
107
|
+
## v0.1.0-alpha.3 (2026-06-07)
|
|
43
108
|
|
|
44
109
|
### Added
|
|
45
110
|
- Shared test fixtures in `conftest.py`
|
|
@@ -57,7 +122,7 @@ All notable changes to this project will be documented in this file.
|
|
|
57
122
|
- EvalCase contradiction validator (`force_skill_invocation` + `should_trigger`)
|
|
58
123
|
- LLMGrader now fails on missing assertions instead of silently dropping them
|
|
59
124
|
|
|
60
|
-
##
|
|
125
|
+
## v0.1.0-alpha.2 (2026-06-02)
|
|
61
126
|
|
|
62
127
|
### Added
|
|
63
128
|
- CI workflow with Python 3.11/3.12/3.13 matrix, caching, coverage, and smoke test
|
|
@@ -71,7 +136,7 @@ All notable changes to this project will be documented in this file.
|
|
|
71
136
|
- `github_repo_slug` function to parse GitHub URLs correctly
|
|
72
137
|
- Handoff review fixes and PR grading tightening
|
|
73
138
|
|
|
74
|
-
##
|
|
139
|
+
## v0.1.0-alpha.1 (2026-05-27)
|
|
75
140
|
|
|
76
141
|
### Added
|
|
77
142
|
- Initial release: skill evaluation framework for OpenCode, Claude Code, and Codex
|
|
@@ -87,7 +152,7 @@ All notable changes to this project will be documented in this file.
|
|
|
87
152
|
- OpenRouter grader support via `OPENROUTER_API_KEY`
|
|
88
153
|
- Workspace isolation with fresh git repos per eval run
|
|
89
154
|
- Token/timing extraction from each agent's native output format
|
|
90
|
-
- `python -m
|
|
155
|
+
- `python -m agent_skill_eval` entry point
|
|
91
156
|
|
|
92
157
|
### Fixed
|
|
93
158
|
- OpenRouter grader model resolution and opencode parser output handling
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
# agent-skill-eval Makefile
|
|
2
|
+
#
|
|
3
|
+
# Usage:
|
|
4
|
+
# make cheap-eval SKILL=examples/fix-failing-tests EVALS=examples/fix-failing-tests/evals/evals.json
|
|
5
|
+
# make fake-eval SKILL=examples/fix-failing-tests EVALS=examples/fix-failing-tests/evals/evals.json
|
|
6
|
+
# make test
|
|
7
|
+
# make lint
|
|
8
|
+
#
|
|
9
|
+
# OpenRouter setup (set in shell or .env):
|
|
10
|
+
# OPENROUTER_API_KEY=sk-or-...
|
|
11
|
+
# ANTHROPIC_BASE_URL=https://openrouter.ai/api # claude-code reads this
|
|
12
|
+
# ANTHROPIC_AUTH_TOKEN=$OPENROUTER_API_KEY # claude-code auth via OpenRouter
|
|
13
|
+
# ANTHROPIC_API_KEY= # must be blank when using OpenRouter
|
|
14
|
+
# OPENAI_BASE_URL=https://openrouter.ai/api/v1 # opencode reads this
|
|
15
|
+
|
|
16
|
+
# ── Defaults ────────────────────────────────────────────────────────────────
|
|
17
|
+
|
|
18
|
+
# Read OPENROUTER_API_KEY from .env if not already in shell
|
|
19
|
+
OPENROUTER_API_KEY ?= $(shell grep -s '^OPENROUTER_API_KEY' .env | cut -d= -f2- | tr -d '"' | tr -d "'")
|
|
20
|
+
|
|
21
|
+
SKILL ?= skills/fix-failing-tests
|
|
22
|
+
EVALS ?= examples/fix-failing-tests/evals/evals.json
|
|
23
|
+
|
|
24
|
+
# Pinned free/cheap models (see config/baseline.env to override).
|
|
25
|
+
# claude-code needs a real Anthropic model ID: the claude CLI validates
|
|
26
|
+
# --model client-side and rejects OpenRouter-only slugs.
|
|
27
|
+
CLAUDE_CODE_MODEL ?= claude-haiku-4-5-20251001
|
|
28
|
+
OPENCODE_MODEL ?= deepseek/deepseek-v4-flash:free
|
|
29
|
+
CODEX_MODEL ?= gpt-5.4-mini
|
|
30
|
+
GRADER_MODEL ?= deepseek/deepseek-v4-flash:free
|
|
31
|
+
|
|
32
|
+
# Agents to run (space-separated). Override: make cheap-eval AGENTS="fake codex"
|
|
33
|
+
AGENTS ?= fake claude-code opencode
|
|
34
|
+
|
|
35
|
+
WORKSPACE ?= eval-workspace
|
|
36
|
+
CONCURRENCY ?= 3
|
|
37
|
+
|
|
38
|
+
-include config/baseline.env
|
|
39
|
+
|
|
40
|
+
AGENT_FLAGS = $(foreach a,$(AGENTS),--agent $(a))
|
|
41
|
+
|
|
42
|
+
# ── Targets ──────────────────────────────────────────────────────────────────
|
|
43
|
+
|
|
44
|
+
.PHONY: cheap-eval full-eval fake-eval test test-e2e test-live lint help
|
|
45
|
+
|
|
46
|
+
## cheap-eval: $(AGENTS) in parallel with cheap/free models
|
|
47
|
+
## claude-code routes via OpenRouter (needs OPENROUTER_API_KEY in .env).
|
|
48
|
+
## opencode routes via its own Zen provider (needs zen auth, no extra env).
|
|
49
|
+
## codex uses ~/.codex auth + config.toml model (run via full-eval or AGENTS=).
|
|
50
|
+
cheap-eval: export ANTHROPIC_BASE_URL = https://openrouter.ai/api
|
|
51
|
+
cheap-eval: export ANTHROPIC_AUTH_TOKEN = $(OPENROUTER_API_KEY)
|
|
52
|
+
cheap-eval: export ANTHROPIC_API_KEY =
|
|
53
|
+
cheap-eval:
|
|
54
|
+
uv run agent-skill-eval run \
|
|
55
|
+
--skill $(SKILL) \
|
|
56
|
+
--evals $(EVALS) \
|
|
57
|
+
$(AGENT_FLAGS) \
|
|
58
|
+
--agent-model "claude-code=$(CLAUDE_CODE_MODEL)" \
|
|
59
|
+
--agent-model "opencode=$(OPENCODE_MODEL)" \
|
|
60
|
+
--agent-model "codex=$(CODEX_MODEL)" \
|
|
61
|
+
--grader-model "$(GRADER_MODEL)" \
|
|
62
|
+
--workspace $(WORKSPACE) \
|
|
63
|
+
--concurrency $(CONCURRENCY) \
|
|
64
|
+
--no-baseline
|
|
65
|
+
|
|
66
|
+
## full-eval: cheap-eval plus codex (needs ~/.codex/auth.json login)
|
|
67
|
+
full-eval: AGENTS = fake claude-code opencode codex
|
|
68
|
+
full-eval: cheap-eval
|
|
69
|
+
|
|
70
|
+
## fake-eval: fake harness only — zero API cost, CI-safe, no env vars needed
|
|
71
|
+
fake-eval:
|
|
72
|
+
uv run agent-skill-eval run \
|
|
73
|
+
--skill $(SKILL) \
|
|
74
|
+
--evals $(EVALS) \
|
|
75
|
+
--agent fake \
|
|
76
|
+
--grader-model "" \
|
|
77
|
+
--workspace $(WORKSPACE) \
|
|
78
|
+
--concurrency 1
|
|
79
|
+
|
|
80
|
+
## test: run unit + smoke tests (includes free e2e pipeline test)
|
|
81
|
+
test:
|
|
82
|
+
uv run pytest -v --cov=agent_skill_eval --cov-report=term-missing tests/
|
|
83
|
+
|
|
84
|
+
## test-e2e: free end-to-end pipeline tests only (fake harness, no API calls)
|
|
85
|
+
test-e2e:
|
|
86
|
+
uv run pytest -v tests/test_e2e.py -m "not live"
|
|
87
|
+
|
|
88
|
+
## test-live: paid e2e tests against real agents + grader (claude-code, opencode, codex)
|
|
89
|
+
test-live: export ASE_LIVE = 1
|
|
90
|
+
test-live: export ANTHROPIC_BASE_URL = https://openrouter.ai/api
|
|
91
|
+
test-live: export ANTHROPIC_AUTH_TOKEN = $(OPENROUTER_API_KEY)
|
|
92
|
+
test-live: export ANTHROPIC_API_KEY =
|
|
93
|
+
test-live: export CLAUDE_CODE_MODEL := $(CLAUDE_CODE_MODEL)
|
|
94
|
+
test-live: export OPENCODE_MODEL := $(OPENCODE_MODEL)
|
|
95
|
+
test-live: export CODEX_MODEL := $(CODEX_MODEL)
|
|
96
|
+
test-live: export GRADER_MODEL := $(GRADER_MODEL)
|
|
97
|
+
test-live:
|
|
98
|
+
uv run pytest -v tests/test_e2e.py -m live
|
|
99
|
+
|
|
100
|
+
## lint: ruff check + format check
|
|
101
|
+
lint:
|
|
102
|
+
uv run ruff check src/ tests/
|
|
103
|
+
uv run ruff format --check src/ tests/
|
|
104
|
+
|
|
105
|
+
## help: list targets
|
|
106
|
+
help:
|
|
107
|
+
@grep -E '^## ' Makefile | sed 's/## / /'
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: agent-skill-eval
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.4.1
|
|
4
4
|
Summary: Framework for evaluating agent skills across OpenCode, Claude Code, and Codex
|
|
5
|
-
Project-URL: Homepage, https://github.com/tardigrde/skill-
|
|
6
|
-
Project-URL: Repository, https://github.com/tardigrde/skill-
|
|
7
|
-
Author: skill-eval contributors
|
|
5
|
+
Project-URL: Homepage, https://github.com/tardigrde/agent-skill-eval
|
|
6
|
+
Project-URL: Repository, https://github.com/tardigrde/agent-skill-eval
|
|
7
|
+
Author: agent-skill-eval contributors
|
|
8
8
|
License-Expression: MIT
|
|
9
9
|
License-File: LICENSE
|
|
10
10
|
Keywords: agent,benchmark,evaluation,llm,skills
|
|
@@ -29,11 +29,11 @@ Requires-Dist: pytest>=8.0; extra == 'dev'
|
|
|
29
29
|
Requires-Dist: ruff>=0.4; extra == 'dev'
|
|
30
30
|
Description-Content-Type: text/markdown
|
|
31
31
|
|
|
32
|
-
# skill-eval
|
|
32
|
+
# agent-skill-eval
|
|
33
33
|
|
|
34
34
|
**Evaluate agent skills through the real coding harnesses you use every day — Claude Code, Codex, and OpenCode — not the raw API.**
|
|
35
35
|
|
|
36
|
-
You wrote a `SKILL.md`. Does it actually make your agent better? skill-eval answers that with data: it installs your skill into a fresh workspace, runs the *actual agent CLI* against your test prompts (with and without the skill), grades the results with deterministic state-diff checks plus an LLM rubric, and reports the measured impact — pass rates, pass@k across repeated runs, token costs, and wall-clock time.
|
|
36
|
+
You wrote a `SKILL.md`. Does it actually make your agent better? agent-skill-eval answers that with data: it installs your skill into a fresh workspace, runs the *actual agent CLI* against your test prompts (with and without the skill), grades the results with deterministic state-diff checks plus an LLM rubric, and reports the measured impact — pass rates, pass@k across repeated runs, token costs, and wall-clock time.
|
|
37
37
|
|
|
38
38
|
Because the eval goes through the full harness — system prompt, skill discovery, permissions, tool use — you get exactly the behavior you'll see in daily use, including the failure mode that matters most: *the agent never triggering your skill at all*.
|
|
39
39
|
|
|
@@ -47,20 +47,24 @@ Because the eval goes through the full harness — system prompt, skill discover
|
|
|
47
47
|
- **Honest grading**: assertions the grader can't check are *skipped*, not failed; a missing API key warns upfront instead of silently zeroing your pass rate
|
|
48
48
|
- **Pinned models**: `--agent-model claude-code=haiku --agent-model codex=gpt-5-mini` makes runs reproducible across machines
|
|
49
49
|
- **Scoped cleanup**: only removes artifacts recorded in `cleanup.json`; never closes unrelated PRs or deletes unrelated branches
|
|
50
|
-
- **Re-grading**: `skill-eval grade` re-grades saved outputs without re-running agents
|
|
51
|
-
- **Markdown reports**: paste `skill-eval report --format markdown` straight into a PR or blog post
|
|
50
|
+
- **Re-grading**: `agent-skill-eval grade` re-grades saved outputs without re-running agents
|
|
51
|
+
- **Markdown reports**: paste `agent-skill-eval report --format markdown` straight into a PR or blog post
|
|
52
52
|
|
|
53
53
|
## Installation
|
|
54
54
|
|
|
55
55
|
```bash
|
|
56
|
-
pip install skill-eval
|
|
56
|
+
pip install agent-skill-eval
|
|
57
57
|
```
|
|
58
58
|
|
|
59
|
+
This installs two identical commands: `agent-skill-eval` and the short alias `ase`.
|
|
60
|
+
|
|
61
|
+
> **Coming soon:** subagent evals — evaluate custom subagent definitions the same way as skills, across the same harnesses.
|
|
62
|
+
|
|
59
63
|
Or from source with `uv`:
|
|
60
64
|
|
|
61
65
|
```bash
|
|
62
|
-
git clone https://github.com/tardigrde/skill-
|
|
63
|
-
cd skill-
|
|
66
|
+
git clone https://github.com/tardigrde/agent-skill-eval
|
|
67
|
+
cd agent-skill-eval
|
|
64
68
|
uv venv && uv pip install -e ".[dev]"
|
|
65
69
|
```
|
|
66
70
|
|
|
@@ -70,13 +74,13 @@ You also need the agent CLIs you want to evaluate (`claude`, `codex`, `opencode`
|
|
|
70
74
|
|
|
71
75
|
```bash
|
|
72
76
|
# 1. See what's available
|
|
73
|
-
skill-eval list
|
|
77
|
+
agent-skill-eval list
|
|
74
78
|
|
|
75
79
|
# 2. Validate an eval suite
|
|
76
|
-
skill-eval validate examples/write-release-notes/evals/evals.json
|
|
80
|
+
agent-skill-eval validate examples/write-release-notes/evals/evals.json
|
|
77
81
|
|
|
78
82
|
# 3. Run it (pin cheap models while iterating)
|
|
79
|
-
skill-eval run \
|
|
83
|
+
agent-skill-eval run \
|
|
80
84
|
--skill ./skills/write-release-notes \
|
|
81
85
|
--evals ./examples/write-release-notes/evals/evals.json \
|
|
82
86
|
--agent claude-code --agent-model claude-code=haiku \
|
|
@@ -84,13 +88,13 @@ skill-eval run \
|
|
|
84
88
|
--runs 3
|
|
85
89
|
|
|
86
90
|
# 4. Read the results
|
|
87
|
-
skill-eval report --workspace ./eval-workspace/write-release-notes-workspace --show-evidence
|
|
91
|
+
agent-skill-eval report --workspace ./eval-workspace/write-release-notes-workspace --show-evidence
|
|
88
92
|
```
|
|
89
93
|
|
|
90
94
|
To start a suite for your own skill:
|
|
91
95
|
|
|
92
96
|
```bash
|
|
93
|
-
skill-eval init my-skill
|
|
97
|
+
agent-skill-eval init my-skill
|
|
94
98
|
```
|
|
95
99
|
|
|
96
100
|
This scaffolds `my-skill/SKILL.md` (frontmatter template), `my-skill/evals/evals.json` (one positive case and one negative control), and `my-skill/evals/files/` for fixtures.
|
|
@@ -129,7 +133,7 @@ This scaffolds `my-skill/SKILL.md` (frontmatter template), `my-skill/evals/evals
|
|
|
129
133
|
}
|
|
130
134
|
```
|
|
131
135
|
|
|
132
|
-
A JSON Schema for this format ships at [`schemas/evals.schema.json`](schemas/evals.schema.json) — point your editor at it for autocompletion, and run `skill-eval validate <file>` in CI.
|
|
136
|
+
A JSON Schema for this format ships at [`schemas/evals.schema.json`](schemas/evals.schema.json) — point your editor at it for autocompletion, and run `agent-skill-eval validate <file>` in CI.
|
|
133
137
|
|
|
134
138
|
### Eval fields
|
|
135
139
|
|
|
@@ -174,7 +178,7 @@ Anything else falls through to the LLM rubric. With `should_trigger: false`, the
|
|
|
174
178
|
### `run`
|
|
175
179
|
|
|
176
180
|
```bash
|
|
177
|
-
skill-eval run \
|
|
181
|
+
agent-skill-eval run \
|
|
178
182
|
--skill <skill-dir> --evals <evals.json> \
|
|
179
183
|
--agent opencode --agent claude-code --agent codex \
|
|
180
184
|
[--agent-model claude-code=haiku] [--agent-model codex=gpt-5-mini] \
|
|
@@ -192,12 +196,12 @@ Key options:
|
|
|
192
196
|
- `--agent-model, -m`: model per agent as `agent=model`; a bare value applies to all agents. Repeatable.
|
|
193
197
|
- `--harness-base-url`: injected as `ANTHROPIC_BASE_URL` (claude-code) / `OPENAI_BASE_URL` (codex, opencode) into the agent process.
|
|
194
198
|
- `--runs, -n`: repeat each (eval, agent, config) N times; enables pass@k stats. Results land in `run-1/`, `run-2/`, ... subdirectories.
|
|
195
|
-
- `--timeout` / `--retries`: per-run agent timeout (default 600s) and retries on timeout or non-zero exit (default 1). Also settable via `
|
|
199
|
+
- `--timeout` / `--retries`: per-run agent timeout (default 600s) and retries on timeout or non-zero exit (default 1). Also settable via `ASE_AGENT_TIMEOUT` / `ASE_AGENT_RETRIES`.
|
|
196
200
|
|
|
197
201
|
### `report`
|
|
198
202
|
|
|
199
203
|
```bash
|
|
200
|
-
skill-eval report --workspace <skill-workspace> [--iteration N] [--format table|markdown] [--show-evidence]
|
|
204
|
+
agent-skill-eval report --workspace <skill-workspace> [--iteration N] [--format table|markdown] [--show-evidence]
|
|
201
205
|
```
|
|
202
206
|
|
|
203
207
|
`--show-evidence` prints the evidence string for every failed or skipped assertion — the state diff for deterministic checks, the judge's reasoning for LLM checks. `--format markdown` emits a paste-ready table.
|
|
@@ -205,7 +209,7 @@ skill-eval report --workspace <skill-workspace> [--iteration N] [--format table|
|
|
|
205
209
|
### `compare`
|
|
206
210
|
|
|
207
211
|
```bash
|
|
208
|
-
skill-eval compare --workspace <skill-workspace> 1 2
|
|
212
|
+
agent-skill-eval compare --workspace <skill-workspace> 1 2
|
|
209
213
|
```
|
|
210
214
|
|
|
211
215
|
Side-by-side pass rates of two iterations, per configuration, with the change — the feedback loop for iterating on a SKILL.md.
|
|
@@ -213,7 +217,7 @@ Side-by-side pass rates of two iterations, per configuration, with the change
|
|
|
213
217
|
### `validate`
|
|
214
218
|
|
|
215
219
|
```bash
|
|
216
|
-
skill-eval validate path/to/evals.json
|
|
220
|
+
agent-skill-eval validate path/to/evals.json
|
|
217
221
|
```
|
|
218
222
|
|
|
219
223
|
Schema check plus referenced-fixture existence and duplicate-id detection. Exit code 1 on any problem (CI-friendly).
|
|
@@ -221,7 +225,7 @@ Schema check plus referenced-fixture existence and duplicate-id detection. Exit
|
|
|
221
225
|
### `list`
|
|
222
226
|
|
|
223
227
|
```bash
|
|
224
|
-
skill-eval list [--root .]
|
|
228
|
+
agent-skill-eval list [--root .]
|
|
225
229
|
```
|
|
226
230
|
|
|
227
231
|
Discovers eval suites (`evals.json`) and skills (`SKILL.md`) under a directory.
|
|
@@ -229,7 +233,7 @@ Discovers eval suites (`evals.json`) and skills (`SKILL.md`) under a directory.
|
|
|
229
233
|
### `grade`
|
|
230
234
|
|
|
231
235
|
```bash
|
|
232
|
-
skill-eval grade --workspace <iteration-dir> [--recompute-benchmark]
|
|
236
|
+
agent-skill-eval grade --workspace <iteration-dir> [--recompute-benchmark]
|
|
233
237
|
```
|
|
234
238
|
|
|
235
239
|
Re-grades existing outputs using saved `evals_meta.json` and state snapshots. Two caveats: LLM-graded assertions are re-evaluated from scratch and may flip verdicts, and because the original agent workspace is deleted after the run, the judge re-grades from the saved artifacts (agent output, logs) rather than the live workspace files.
|
|
@@ -237,7 +241,7 @@ Re-grades existing outputs using saved `evals_meta.json` and state snapshots. Tw
|
|
|
237
241
|
### `cleanup`
|
|
238
242
|
|
|
239
243
|
```bash
|
|
240
|
-
skill-eval cleanup --workspace ./eval-workspace [--yes]
|
|
244
|
+
agent-skill-eval cleanup --workspace ./eval-workspace [--yes]
|
|
241
245
|
```
|
|
242
246
|
|
|
243
247
|
Only closes PRs and deletes remote branches recorded in `cleanup.json`. Never touches unrelated PRs, branches, or workspaces.
|
|
@@ -245,7 +249,7 @@ Only closes PRs and deletes remote branches recorded in `cleanup.json`. Never to
|
|
|
245
249
|
### `init`
|
|
246
250
|
|
|
247
251
|
```bash
|
|
248
|
-
skill-eval init my-skill [--output ./examples]
|
|
252
|
+
agent-skill-eval init my-skill [--output ./examples]
|
|
249
253
|
```
|
|
250
254
|
|
|
251
255
|
## Example skills
|
|
@@ -301,18 +305,18 @@ eval-workspace/
|
|
|
301
305
|
}
|
|
302
306
|
```
|
|
303
307
|
|
|
304
|
-
To debug a failure: find `"passed": false` entries, read `evidence`, compare `pre_state.json`/`post_state.json`, then check `outputs/output.txt` for the agent's full response. Or just run `skill-eval report --show-evidence`.
|
|
308
|
+
To debug a failure: find `"passed": false` entries, read `evidence`, compare `pre_state.json`/`post_state.json`, then check `outputs/output.txt` for the agent's full response. Or just run `agent-skill-eval report --show-evidence`.
|
|
305
309
|
|
|
306
310
|
### Iterating on a skill
|
|
307
311
|
|
|
308
|
-
1. `skill-eval run ...` → 2. `skill-eval report --show-evidence` → 3. edit SKILL.md → 4. `skill-eval run --iteration 2 ...` → 5. `skill-eval compare --workspace ... 1 2`
|
|
312
|
+
1. `agent-skill-eval run ...` → 2. `agent-skill-eval report --show-evidence` → 3. edit SKILL.md → 4. `agent-skill-eval run --iteration 2 ...` → 5. `agent-skill-eval compare --workspace ... 1 2`
|
|
309
313
|
|
|
310
314
|
## Environment variables
|
|
311
315
|
|
|
312
316
|
- `OPENROUTER_API_KEY` / `OPENAI_API_KEY`: API key for LLM rubric grading
|
|
313
317
|
- `OPENAI_BASE_URL`: custom grader endpoint (defaults to OpenRouter)
|
|
314
|
-
- `
|
|
315
|
-
- `
|
|
318
|
+
- `ASE_AGENT_TIMEOUT` / `ASE_AGENT_RETRIES`: harness timeout/retry defaults
|
|
319
|
+
- `ASE_KEEP_WORKSPACE`: keep per-eval workspaces for debugging
|
|
316
320
|
|
|
317
321
|
## Agent-specific details
|
|
318
322
|
|