Repo evals
Skill zinan92/repo-evals
Runs a claim-first evaluation of any open-source repo, tool, or skill against its own README promises and renders an editorial dossier (HTML one-pager) with a 0-100 score, 4-category verdict (🏭 Production / 🛠 Available / ⚠️ Risky / 🛑 Don't use), and prescriptive next-steps. Use this skill whenever the user says "eval 一下这个 repo", "eval 这个项目", "eval 这个 skill", "evaluate this repo", "评测一下", "试用这个 repo", "这个东西好不好用", or pastes a GitHub URL and asks whether to adopt it. Also use when comparing two repos on the same dimensions, or auditing a repo's claim-vs-reality gap. Do not wait for explicit "please use repo-evals" — trigger on the intent, not the skill name.From its SKILL.md
npx -y skills add zinan92/repo-evalsAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
4 things to look at
- reads credentialsReads from 3 credential sources: `EVAL_RUNNER` and 2 more.
- 1 stars1 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
- runs commandsInstructs the agent to run 8 commands, including `npx skills add zinan92/repo-evals -g` and 7 more.
- fetches URLsInstructs the agent to fetch 1 URL, including https://github.com/zinan92/repo-evals.git.
SKILL.md
10.2 KB, ~2.6k tokens by cl100k_base, as published. Nobody here has run it
repo-evals
Both a skill (so compatible coding agents trigger it on the right user phrases) and the full framework. Install from GitHub:
npx skills add zinan92/repo-evals -g
For local development, clone wherever you keep repos and symlink that checkout:
git clone https://github.com/zinan92/repo-evals.git ~/repo-evals
ln -s ~/repo-evals ~/.claude/skills/repo-evals
git pull updates the local framework and the symlinked skill together.
⚠️ Standing rule — output is a product page, not a test report
Every artifact is a dossier about the evaluated repo — read by a non-technical adopter asking "should I use this?". Engineers are a secondary reader and their view is collapsed.
Three places where this is enforced:
repo.yaml— must fill the full dossier schema (see template). Missing fields = empty sections in the HTML. Bad:one_liner: "Tauri desktop app for managing skills". Good:one_liner: "从一个桌面应用管理 28 个 AI 编程工具的技能库 — 一处修改,所有工具同步更新".- Each
claim—user_icon(emoji),user_title({en, zh}),user_description({en, zh}). Phrase as user outcomes. Technicaltitle/statement/evidence_neededstay for reviewers. - HTML dossier — technical details (claim ledger, run metrics, derivation, raw markdown) are inside
<details>and collapsed. Above-the-fold: score band + decision card + benefits cards.
Write product_view.one_liner FIRST, before claims. Let claims fall out of it. If a claim can't be phrased as a user outcome, demote it below critical/high.
Score model (0-100, additive)
The 4-bucket model is gone. Every dossier shows an explicit 0-100 score:
SCORE_BASE = 40 (project is real, not archived, has license)
+ static claims ±30 (claim pass/fail + priority)
+ maintainer ±15 (release_pipeline + eval_discipline + recently_active)
+ ecosystem ±15 (stars band + multilingual_readme)
+ layer_bonus ±? (atom/molecule/compound — different ceilings)
- license_penalty (no LICENSE — penalty scales with stars)
Display: 4 categories (filter pills + dashboard):
| Score | Category | Emoji | EN / ZH |
|---|---|---|---|
| 80–100 | production | 🏭 | Production-ready / 可用于生产 |
| 50–79 | available | 🛠 | Available / 可使用 |
| 30–49 | risky | ⚠️ | Risky / 有风险 |
| 0–29 | dont_use | 🛑 | Don't use / 不可使用 |
Underneath: 6 tiers for fine-grained sort:
| Score | Tier | Emoji | EN / ZH |
|---|---|---|---|
| ≥90 | recommend | ⭐ | Recommend / 公开推荐 |
| ≥80 | team | 🏭 | Team-ready / 团队就绪 |
| ≥65 | self | 🛠 | Self-use OK / 自用 OK |
| ≥50 | try | 🧪 | Try once / 试一下 |
| ≥30 | risky | ⚠️ | Risky / 慎用 |
| <30 | broken | 🛑 | Don't use / 别用 |
Both the score and category are computed by scripts/verdict_calculator.py — never by judgement. The raw score chooses the tier, then the reader-facing category is capped by the final bucket ceiling. Don't write a category into repo.yaml.current_bucket and expect it to stick; the calculator overwrites it.
Dossier sections + which repo.yaml field drives each
| HTML section | Driven by |
|---|---|
| 决策快照 (Decision Card) | current_bucket + score, derived |
| 它是哪一类? | business_category + use_case_tags |
| 在这条工作流里 | workflow_placements[] |
| 它可用性如何? | score → tier band + 检查过的 vs 还差哪些 |
| 提升评分的下一步 | product_view.next_step (bilingual) |
| 它到底能帮你解决什么 | product_view.{persona, scenario, without_this, with_this, examples[]} |
| 怎么用 | product_view.how + deployment |
| 依赖什么外部服务 | third_party_services[] |
| 类比的同类 repo | similar_repos[] |
| Atom / Molecule / Compound | layer + workflow_diagram.why_layer |
| 维护层 (trust strip) | stars, recently_active, has_license, multilingual_readme, release_pipeline_score, eval_discipline_score |
If a field is absent the section disappears. Check templates/repo/repo.yaml for the full schema — every commented-out line is a section the dossier could render.
Workflow (one screen)
Run from the framework directory.
cd $(dirname $(readlink -f ~/.claude/skills/repo-evals))
export EVAL_RUNNER=cc EVAL_AGENT="Claude Code" EVAL_MODEL=<model-id>
# 1. Scaffold
scripts/new-repo-eval.sh <owner>/<repo> --archetype <archetype>
# 2. Fill repo.yaml dossier fields FIRST (one_liner → next_step → claims fall out)
$EDITOR repos/<slug>/repo.yaml # full dossier — see template comments
# 3. Claims (extractor seeds, you finalize)
scripts/extract_claims.py /path/to/target -o repos/<slug>/claims/claim-map.yaml.draft
$EDITOR repos/<slug>/claims/claim-map.yaml
# 4. Plan — reference each claim by id
$EDITOR repos/<slug>/plans/<date>-eval-plan.md
# 5. Eval harness (when applicable)
scripts/new-eval-harness.sh <slug>
scripts/run_evals.py <slug>
scripts/run_evals.py <slug> --baseline # with/without comparison
# 6. Trigger test (only when target is a skill)
scripts/trigger_test.py /path/to/skill
# 7. Coverage + verdict (calculator computes score from repo.yaml + claims)
scripts/coverage_gap_detector.py repos/<slug>
scripts/verdict_calculator.py repos/<slug>/verdicts/<date>-verdict-input.yaml --md
# (when no sidecar verdict-input exists, render_verdict_html.py derives one
# from repo.yaml + claim-map.yaml — that's the path we usually take)
# 8. Publish dossier (the HTML the user actually reads) + refresh dashboard
scripts/publish_eval.py <slug> --lang zh # accepts owner--repo or owner/repo
Archetype picker
| If target is... | Use |
|---|---|
| CLI tool with deterministic output | pure-cli |
| SKILL.md only, no code | prompt-skill |
| SKILL.md + scripts/templates | hybrid-skill |
| Wraps external platforms behind a unified interface | adapter |
| Coordinates multiple sub-systems | orchestrator |
| HTTP or service endpoint | api-service |
| Wraps an MCP server with workflow guidance | mcp-enhancement |
When unsure, read archetypes/<name>/archetype.yaml for that archetype's evaluation dimensions.
Layer picker (drives layer_bonus + core_layer_tested)
| Target shape | Layer | core_layer_tested without live run? |
|---|---|---|
| Single user-facing capability, deterministic, no orchestration | atom | yes |
| Fixed pipeline of atoms, no LLM-runtime routing | molecule | no — needs live e2e |
| LLM-runtime routing, dynamic agent dispatch, multi-step plan generation | compound | no — needs live e2e |
Atom can score full marks from static eval. Molecule + compound have a ceiling until a live run is logged. Don't claim atom for something that's actually a molecule — the calculator catches it via the deferred-live-run check.
Re-eval policy
If a repos/<slug>/ already has a verdict from a prior date:
- A new eval with the same questions (ran the same claims) → update files in place, bump
last_evaluated. - A new eval with different questions (new angle: marketing-vs-reality, security audit, etc.) → either (a) extend the existing claim map and re-render, or (b) create a separate dated
verdicts/<date>-…set and surface the conflict to the user. Don't silently overwrite. - Always check
last_evaluatedand the existing claim-map BEFORE scaffolding. If a recent eval exists, ask whether to extend or re-eval.
Rules
- Never guess the score / category —
verdict_calculator.py+render_verdict_html.pyare authoritative. - Don't install untrusted apps on the live system to test claims. When the runtime would touch user config (skill dirs, browser profiles, API credentials), skip the claim, record
skip_reasonon the claim, and accept the layer ceiling cap. Source-grep + GitHub API + isolated subprocess are fine substitutes. - Every run must have provenance —
scripts/new-run.shcaptures it fromEVAL_*env vars. - Evidence paths are relative to the run directory. No
/tmp/...in committed summaries. - Prefer primary-source evidence (artifacts with checksums, source greps with line numbers,
gh apiJSON dumps) over screenshots over impressions. repo.yamlis the input to the dossier renderer. Filling onlyproduct_view.{one_liner, best_for, watch_out}produces a stub HTML. Fill the full schema or the dossier is empty.has_licenseis a fact, not a vibe. Verify withgh api repos/<owner>/<repo>(licensefield) ANDgh api .../contents/LICENSE. README badges lie.
Output to user when done
In order:
- Score (0-100) + category emoji + tier (verbatim from calculator)
- Top 3 score deltas (what cost or earned the most points)
- Two-line plain-English verdict
- Path to the rendered HTML — open it (don't just mention it)
- Offer to commit + push the
repos/<slug>/artifacts to the repo-evals fork
Deeper docs (read from disk, not from training)
ROADMAP.md— upcoming changesdocs/FRAMEWORK.md— claim-first philosophydocs/VERDICT-BUCKETS.md— bucket history (still referenced in some old evals)docs/VERDICT-CALCULATOR.md— scoring rules + ceiling logicdocs/LAYERS.md— atom/molecule/compound semanticsdocs/PROVENANCE.md— evidence capturedocs/COVERAGE-GAP-DETECTOR.md— coverage rulesarchetypes/<name>/archetype.yaml— per-archetype dimensionstemplates/repo/repo.yaml— full dossier schema (every field commented)
What ships with it: 946 files
31106.9 KB alongside SKILL.md, 50 of them executable
.claude-plugin/
- marketplace.json946 B
archetypes/
- adapter/archetype.yaml1.8 KB
- adapter/claim-map.yaml5.3 KB
- adapter/eval-plan.md1.5 KB
- adapter/evals.json.template829 B
- api-service/archetype.yaml1.9 KB
- api-service/claim-map.yaml5.2 KB
- api-service/eval-plan.md1.6 KB
- hybrid-skill/archetype.yaml1.9 KB
- hybrid-skill/claim-map.yaml5.1 KB
- hybrid-skill/eval-plan.md1.8 KB
- mcp-enhancement/archetype.yaml2.5 KB
- mcp-enhancement/claim-map.yaml5.6 KB
- mcp-enhancement/eval-plan.md1.8 KB
- orchestrator/archetype.yaml1.9 KB
- orchestrator/claim-map.yaml4.9 KB
- orchestrator/eval-plan.md2.0 KB
- prompt-skill/archetype.yaml1.8 KB
- prompt-skill/claim-map.yaml4.5 KB
- prompt-skill/eval-plan.md1.7 KB
- pure-cli/archetype.yaml1.6 KB
- pure-cli/claim-map.yaml4.4 KB
- pure-cli/eval-plan.md1.3 KB
- README.md2.8 KB
assets/
- readme-all-evals.png222.0 KB
- readme-verdict-top.png318.6 KB
- readme-workflow-diagram.png127.8 KB
- repo-evals-demo.gif57.6 KB
- repo-evals-demo.tape488 B
dashboard/
- all-evals.html164.3 KB
- assets/app.jsruns1008 B
- assets/style.css7.5 KB
- data/index.json75.5 KB
- data/repos/AIDC-AI--Pixelle-Video.json1.2 KB
- data/repos/anthropics--skill-creator.json1.4 KB
- data/repos/autoclaw-cc--xiaohongshu-skills.json1.4 KB
- data/repos/brokermr810--QuantDinger.json1.3 KB
- data/repos/dreammis--social-auto-upload.json1.3 KB
- data/repos/geekjourneyx--md2wechat-skill.json1.4 KB
- data/repos/gooseworks-ai--goose-skills.json1.4 KB
906 more files not listed here. See all 946 in the repository.