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.
Files changed (72) hide show
  1. {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.1}/.github/ISSUE_TEMPLATE/bug_report.yml +2 -2
  2. {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.1}/.github/workflows/ci.yml +1 -1
  3. agent_skill_eval-0.4.1/.github/workflows/release.yml +48 -0
  4. {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.1}/AGENTS.md +4 -4
  5. {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.1}/CHANGELOG.md +75 -10
  6. {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.1}/CONTRIBUTING.md +2 -2
  7. agent_skill_eval-0.4.1/Makefile +107 -0
  8. {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.1}/PKG-INFO +34 -30
  9. {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.1}/README.md +30 -26
  10. agent_skill_eval-0.4.1/TODO.md +69 -0
  11. agent_skill_eval-0.4.1/config/.env.example +30 -0
  12. agent_skill_eval-0.4.1/config/baseline.env +21 -0
  13. {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.1}/examples/fix-failing-tests/evals/evals.json +1 -1
  14. agent_skill_eval-0.4.1/pyproject.toml +93 -0
  15. {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.1}/schemas/evals.schema.json +1 -1
  16. agent_skill_eval-0.4.1/src/agent_skill_eval/__init__.py +10 -0
  17. agent_skill_eval-0.4.1/src/agent_skill_eval/__main__.py +3 -0
  18. {agent_skill_eval-0.3.0/src/skill_eval → agent_skill_eval-0.4.1/src/agent_skill_eval}/cli.py +44 -24
  19. {agent_skill_eval-0.3.0/src/skill_eval → agent_skill_eval-0.4.1/src/agent_skill_eval}/git_state.py +1 -1
  20. {agent_skill_eval-0.3.0/src/skill_eval → agent_skill_eval-0.4.1/src/agent_skill_eval}/graders/__init__.py +132 -50
  21. {agent_skill_eval-0.3.0/src/skill_eval → agent_skill_eval-0.4.1/src/agent_skill_eval}/harnesses/__init__.py +12 -6
  22. {agent_skill_eval-0.3.0/src/skill_eval → agent_skill_eval-0.4.1/src/agent_skill_eval}/models.py +6 -0
  23. {agent_skill_eval-0.3.0/src/skill_eval → agent_skill_eval-0.4.1/src/agent_skill_eval}/runner.py +15 -7
  24. {agent_skill_eval-0.3.0/src/skill_eval → agent_skill_eval-0.4.1/src/agent_skill_eval}/skills.py +1 -1
  25. {agent_skill_eval-0.3.0/src/skill_eval → agent_skill_eval-0.4.1/src/agent_skill_eval}/workspace.py +3 -3
  26. {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.1}/tests/conftest.py +1 -1
  27. {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.1}/tests/test_cli_smoke.py +1 -1
  28. agent_skill_eval-0.4.1/tests/test_e2e.py +210 -0
  29. {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.1}/tests/test_fuzz_grader.py +2 -2
  30. {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.1}/tests/test_git_state.py +3 -3
  31. {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.1}/tests/test_graders.py +11 -11
  32. {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.1}/tests/test_harnesses.py +24 -1
  33. {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.1}/tests/test_launch_features.py +14 -14
  34. {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.1}/tests/test_llm_grader.py +1 -1
  35. {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.1}/tests/test_runner.py +32 -32
  36. {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.1}/tests/test_skill_validation.py +1 -1
  37. {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.1}/tests/test_skills.py +2 -2
  38. {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.1}/tests/test_workspace.py +2 -2
  39. agent_skill_eval-0.3.0/.github/workflows/publish.yml +0 -50
  40. agent_skill_eval-0.3.0/TODO.md +0 -105
  41. agent_skill_eval-0.3.0/pyproject.toml +0 -60
  42. agent_skill_eval-0.3.0/src/skill_eval/__init__.py +0 -8
  43. agent_skill_eval-0.3.0/src/skill_eval/__main__.py +0 -3
  44. {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.1}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  45. {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.1}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  46. {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.1}/.github/actions/setup/action.yml +0 -0
  47. {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.1}/.gitignore +0 -0
  48. {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.1}/CODE_OF_CONDUCT.md +0 -0
  49. {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.1}/LICENSE +0 -0
  50. {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.1}/examples/commit-push-pr/evals/evals.json +0 -0
  51. {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.1}/examples/commit-push-pr/evals/files/sample_change.py +0 -0
  52. {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.1}/examples/fix-failing-tests/evals/files/calculator.py +0 -0
  53. {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.1}/examples/fix-failing-tests/evals/files/conftest.py +0 -0
  54. {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.1}/examples/fix-failing-tests/evals/files/test_calculator.py +0 -0
  55. {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.1}/examples/review-diff/evals/evals.json +0 -0
  56. {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.1}/examples/review-diff/evals/files/changes.diff +0 -0
  57. {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.1}/examples/review-diff/evals/files/orders.py +0 -0
  58. {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.1}/examples/validate-config/evals/evals.json +0 -0
  59. {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.1}/examples/validate-config/evals/files/app_config.json +0 -0
  60. {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.1}/examples/write-release-notes/evals/evals.json +0 -0
  61. {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.1}/examples/write-release-notes/evals/files/commits.txt +0 -0
  62. {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.1}/scripts/record-demo.sh +0 -0
  63. {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.1}/skills/commit-push-pr/SKILL.md +0 -0
  64. {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.1}/skills/fix-failing-tests/SKILL.md +0 -0
  65. {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.1}/skills/review-diff/SKILL.md +0 -0
  66. {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.1}/skills/validate-config/SKILL.md +0 -0
  67. {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.1}/skills/validate-config/references/config-rules.md +0 -0
  68. {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.1}/skills/validate-config/scripts/validate_config.py +0 -0
  69. {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.1}/skills/write-release-notes/SKILL.md +0 -0
  70. {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.1}/tests/__init__.py +0 -0
  71. {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.1}/tests/fixtures/evals/format-json.json +0 -0
  72. {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=skill_eval --cov-report=xml:coverage.xml
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/skill_eval/
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: `skill_eval.cli:app` (registered as `skill-eval` console script)
39
- - Package layout: `src/skill_eval/` (hatchling build, wheel packages `src/skill_eval`)
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
- ## [0.3.0] - 2026-06-11
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
- ## [0.2.1] - 2026-06-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
- ## [0.2.0] - 2026-06-10
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
- ## [0.1.0-alpha.3] - 2026-06-07
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
- ## [0.1.0-alpha.2] - 2026-06-02
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
- ## [0.1.0-alpha.1] - 2026-05-27
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 skill_eval` entry point
155
+ - `python -m agent_skill_eval` entry point
91
156
 
92
157
  ### Fixed
93
158
  - OpenRouter grader model resolution and opencode parser output handling
@@ -3,8 +3,8 @@
3
3
  ## Setup
4
4
 
5
5
  ```bash
6
- git clone https://github.com/tardigrde/skill-evals.git
7
- cd skill-evals
6
+ git clone https://github.com/tardigrde/agent-skill-eval.git
7
+ cd agent-skill-eval
8
8
  uv venv
9
9
  uv pip install -e ".[dev]"
10
10
  ```
@@ -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.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-evals
6
- Project-URL: Repository, https://github.com/tardigrde/skill-evals
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-evals
63
- cd skill-evals
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 `SKILL_EVAL_AGENT_TIMEOUT` / `SKILL_EVAL_AGENT_RETRIES`.
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
- - `SKILL_EVAL_AGENT_TIMEOUT` / `SKILL_EVAL_AGENT_RETRIES`: harness timeout/retry defaults
315
- - `SKILL_EVAL_KEEP_WORKSPACE`: keep per-eval workspaces for debugging
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