
Skill Upper
- 150 installs
- 378 repo stars
- Updated August 4, 2026
- alibaba/skill-up
skill-upper is a Claude skill that helps authors set up, run, and interpret Agent Skill evaluations using the skill-up CLI.
About
skill-upper helps authors set up, run, and interpret evaluations for Agent Skills using the skill-up CLI. It installs a Skill into a real agent engine, runs prompts per test case, then grades results via rules, LLM judges, or custom scripts and produces a report. A developer uses it to add evals or regression cases, write eval.yaml and case.yaml, and verify a Skill before shipping.
- Runs skill-up CLI evals for Agent Skills across engines like Claude Code and Codex
- Scaffolds eval.yaml/case.yaml, authors judges, and produces reports
- Migrates from Anthropic evals.json to the skill-up format
Skill Upper by the numbers
- 150 all-time installs (skills.sh)
- Ranked #889 of 2,153 Testing & QA skills by installs in the Skillselion catalog
- Data as of Aug 5, 2026 (Skillselion catalog sync)
skill-upper capabilities & compatibility
- Capabilities
- testing · code review
- Use cases
- testing
- Platforms
- macOS · Linux
- Pricing
- Free
What skill-upper says it does
`skill-up` is an evaluation CLI for Agent Skill authors.
spins up an execution environment for each case, runs the prompt, then grades the result via declared rules / LLM judges / custom scripts, and finally produces a report.
`skill-up` currently supports **macOS / Linux** only; Windows is not supported.
npx skills add https://github.com/alibaba/skill-up --skill skill-upperAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 150 |
|---|---|
| repo stars | ★ 378 |
| Last updated | August 4, 2026 |
| Repository | alibaba/skill-up ↗ |
What it does
Set up and run evaluations for an Agent Skill to verify or regress it before release.
Who is it for?
Skill authors who want repeatable evals, regression cases, and graded reports for their Agent Skills
Skip if: Windows users, since skill-up currently supports macOS and Linux only
When should I use this skill?
The user asks to evaluate, test, regress, or verify a Skill, add eval cases, or run skill-up run/validate/list-cases/report/import/init
What you get
A graded evaluation report showing whether the Skill passed its declared cases
- eval.yaml and case.yaml files
- graded evaluation report
By the numbers
- Three grading modes: declared rules, LLM judges, and custom scripts
Files
code-review-helper
一个代码审查辅助 Skill,帮助开发者快速发现代码中的常见问题。
功能
- 识别空指针风险、未处理异常、资源泄漏等常见问题
- 检查代码风格与命名规范
- 给出具有可操作性的修改建议
触发场景
- 用户要求 "帮我 review 这段代码"
- 用户提交了代码 diff 并想获得反馈
- 用户想检查代码质量
使用方式
直接将代码片段或 diff 发给 Agent,Skill 会自动分析并输出审查报告。
输出格式
审查报告包含: 1. 问题列表(严重程度 + 位置 + 描述) 2. 修改建议 3. 总结评价
id: basic # Must match the filename
title: Brief description of what this case validates
description: |
More detailed background (optional).
input:
prompt: |
Write the actual prompt to send to the Agent here.
Use a tone close to real users; avoid being too mechanical.
# For multi-turn conversations, use turns instead of prompt:
# input:
# turns:
# - role: user
# content: "First request"
# post_condition:
# must_contain_any: ["keywordA", "keywordB"]
# on_fail: skip_remaining # or fail
# - role: user
# content: "Second request"
# context: # Optional: initialize workspace
# repo_fixture: fixtures/repos/sample-project
# git:
# init: true
# checkout: main
# apply_diff: fixtures/diffs/my.patch
# files:
# "src/main.py": |
# def hello(): ...
# constraints:
# timeout_seconds: 180
# max_turns: 8
expect: # Zero-cost gate checks; judge is skipped if these fail
must_contain:
- "Required keyword"
must_not_contain:
- "Keyword that should not appear"
# exit_code: 0
# files_exist:
# - "output.json"
judge:
type: rule_based # rule_based | agent_judge | script
success:
- output_contains:
all: ["keyword1", "keyword2"]
# failure:
# - output_contains:
# any: ["LGTM", "No changes needed"]
# Example for agent_judge (use when LLM semantic evaluation is needed):
# judge:
# type: agent_judge
# model: anthropic/claude-sonnet-4-6
# criteria:
# - "Output correctly identifies user intent"
# - "Does not fabricate non-existent fields"
# pass_threshold: 0.7
schema_version: v1alpha1
environment:
type: none # none | opensandbox
# kwargs: # For opensandbox: base_url, extensions, etc. See references/eval-yaml.md
# base_url: https://agent-sandbox.example.com
# image: registry.example.com/your-org/sandbox-base:latest
# workspace_mount: /workspace
# env:
# TZ: UTC
# setup_steps:
# - run: git config --global user.name "eval"
skills:
- source: local_path
path: . # Directory of the Skill under test
# - source: local_path
# path: ../dependency_skill # Path to other SKILL.md directory
engine:
name: claude_code # claude_code | codex | qodercli (also compatible with qoder-cli)
# model is optional; omit to use engine's default model
# model:
# provider: anthropic
# name: claude-sonnet-4-6
# base_url: ""
# kwargs: # agent-specific switches; see references/eval-yaml.md
# bypass_sandbox: "true" # codex: skip its own process sandbox (host kernel lacks Landlock)
# mcp:
# servers:
# - name: github
# mode: real
# transport: http
# config_ref: evals/fixtures/mcp/github.json
cases:
files:
- evals/cases/basic.yaml
defaults:
timeout_seconds: 120
max_turns: 5
# parallelism: 4 # Stateless cases can run in parallel; or use skill-up run --parallelism N to override
# benchmark:
# enabled: true
report:
formats: [json]
id: add-case-to-existing
title: 向已有 evals 的 Skill 添加新评测用例
description: |
验证 skill-upper 能否在 Skill 已有 evals 基础上,
正确新增一个测试用例并更新 eval.yaml 的 cases.files 引用。
context:
repo_fixture: evals/fixtures/skills/sample-with-evals
git:
init: true
input:
prompt: |
当前目录的 todo-manager Skill 已经有一个评测用例 add-todo。
请帮我再添加一个用例,测试"列出所有待办事项"的功能。
用例 ID 叫 list-todos,judge 类型用 rule_based。
expect:
files_exist:
- "evals/cases/list-todos.yaml"
- "evals/eval.yaml"
judge:
type: agent_judge
model: anthropic/claude-sonnet-4-6
criteria:
- "在 evals/cases/ 下新建了 list-todos.yaml 文件"
- "list-todos.yaml 的 id 字段为 list-todos,且 judge.type 为 rule_based"
- "list-todos.yaml 的 prompt 与列出待办事项功能相关"
- "eval.yaml 的 cases.files 列表中新增了 evals/cases/list-todos.yaml 的引用,同时保留了原有的 add-todo.yaml"
pass_threshold: 0.75
id: english-context-generates-english-only-cases
title: Respond in English and generate English-only case files in English context
description: |
Verifies that skill-upper follows an English user prompt by replying in
English and by generating eval case YAML files that do not contain Chinese
or CJK characters.
context:
repo_fixture: evals/fixtures/skills/sample-no-evals
input:
prompt: |
Please set up evaluations for the code-review-helper Skill in the current directory.
This Skill does not have any evals yet, so create evals/eval.yaml and at least one
case YAML file under evals/cases/.
Use environment type none and engine claude_code.
expect:
files_exist:
- "evals/eval.yaml"
judge:
type: script
script_path: evals/fixtures/scripts/assert-english-only-generated-cases.sh
timeout_seconds: 30
id: scaffold-new-evals
title: 为没有 evals 的 Skill 从零搭建评测脚手架
description: |
验证 skill-upper 能否正确为一个全新的 Skill(无 evals/ 目录)
生成完整的评测脚手架,包括 eval.yaml 和至少一个 case yaml。
context:
repo_fixture: evals/fixtures/skills/sample-no-evals
git:
init: true
input:
prompt: |
请为当前目录下的 code-review-helper Skill 搭建评测。
这个 Skill 还没有任何 evals,请帮我从零创建 eval.yaml 和测试用例。
环境类型用 none,引擎用 claude_code。
expect:
files_exist:
- "evals/eval.yaml"
must_contain:
- "eval.yaml"
judge:
type: agent_judge
model: anthropic/claude-sonnet-4-6
criteria:
- "生成了 evals/eval.yaml 文件,且包含 schema_version、environment、engine、cases 等必要字段"
- "在 evals/cases/ 下生成了至少一个 case yaml 文件,且包含 id、title、input.prompt、judge 字段"
- "case 的 prompt 与 code-review-helper Skill 的功能相关(代码审查),而非无意义的占位符"
- "eval.yaml 中 cases.files 列表正确引用了生成的 case 文件路径"
pass_threshold: 0.75
id: scaffold-with-qodercli-engine
title: 使用 qodercli 引擎为 Skill 搭建评测
description: |
验证 skill-upper 在用户指定非默认 engine(如 qodercli)时,
能否正确生成配置,engine.name 应为 qodercli 而非默认的 claude_code。
注意 qodercli 无需配置 model,Skill 应知晓这一点。
context:
repo_fixture: evals/fixtures/skills/sample-no-evals
git:
init: true
input:
prompt: |
请为当前目录下的 code-review-helper Skill 搭建评测。
这个 Skill 还没有 evals,请帮我创建。
注意:我想用 qodercli 作为 engine,环境类型用 none。
expect:
files_exist:
- "evals/eval.yaml"
must_contain:
- "eval.yaml"
judge:
type: agent_judge
model: anthropic/claude-sonnet-4-6
criteria:
- "生成了 evals/eval.yaml 文件,且 engine.name 为 qodercli(而非 claude_code 或 codex)"
- "eval.yaml 中没有配置 engine.model 字段(因为 qodercli 目前无法切换模型),或者明确说明了 qodercli 无需配置模型"
- "在 evals/cases/ 下生成了至少一个 case yaml 文件,包含与代码审查相关的 prompt"
- "eval.yaml 中 cases.files 正确引用了生成的 case 文件"
pass_threshold: 0.75
id: scaffold-with-script-judge
title: 生成使用 script judge 的评测用例
description: |
验证 skill-upper 在用户要求使用 script 类型 judge 时,
能否正确生成 case yaml(judge.type 为 script 且包含 script_path),
并同时生成对应的判分脚本文件。
context:
repo_fixture: evals/fixtures/skills/sample-no-evals
git:
init: true
input:
prompt: |
请为当前目录下的 code-review-helper Skill 搭建评测。
我希望用 script 类型的 judge 来做评估,因为我需要用自定义脚本
解析 Agent 的输出 JSON 并检查结构化字段。
请帮我生成 eval.yaml、case yaml,以及对应的判分脚本。
环境类型用 none,引擎用 claude_code。
expect:
files_exist:
- "evals/eval.yaml"
judge:
type: agent_judge
model: anthropic/claude-sonnet-4-6
criteria:
- "生成了 evals/eval.yaml 和至少一个 case yaml 文件"
- "case yaml 中 judge.type 为 script,且包含 script_path 字段指向一个脚本文件路径"
- "生成了 script_path 指向的判分脚本文件(如 .sh 或 .py),脚本中包含退出码逻辑(exit 0 表示 PASS,非 0 表示 FAIL)"
- "eval.yaml 的 environment.type 为 none"
pass_threshold: 1
schema_version: v1alpha1
environment:
type: none
skills:
- source: local_path
path: .
engine:
name: claude_code
cases:
files:
- evals/cases/scaffold-new-evals.yaml
- evals/cases/add-case-to-existing.yaml
- evals/cases/scaffold-with-qodercli-engine.yaml
- evals/cases/scaffold-with-script-judge.yaml
- evals/cases/english-context-generates-english-only-cases.yaml
defaults:
timeout_seconds: 300
max_turns: 15
report:
formats: [json, html]
#!/usr/bin/env bash
set -euo pipefail
python3 - <<'PY'
import os
import pathlib
import re
import sys
cjk_pattern = re.compile(r"[\u3400-\u4dbf\u4e00-\u9fff\uf900-\ufaff\u3000-\u303f\uff00-\uffef]")
ascii_word_pattern = re.compile(r"[A-Za-z]{3,}")
failures = []
final_message = os.environ.get("EVAL_FINAL_MESSAGE", "")
if not final_message.strip():
failures.append("Final response is empty.")
elif cjk_pattern.search(final_message):
failures.append("Final response contains Chinese/CJK characters.")
elif len(ascii_word_pattern.findall(final_message)) < 5:
failures.append("Final response does not contain enough English words.")
case_dir = pathlib.Path("evals/cases")
case_files = sorted(case_dir.glob("*.yaml")) if case_dir.exists() else []
if not case_files:
failures.append("No generated eval case YAML files were found under evals/cases/.")
for path in case_files:
text = path.read_text(encoding="utf-8")
match = cjk_pattern.search(text)
if match:
line_no = text[: match.start()].count("\n") + 1
failures.append(f"{path}:{line_no} contains Chinese/CJK characters.")
if failures:
print("English-only language check failed:")
for failure in failures:
print(f"- {failure}")
sys.exit(1)
print("PASS: final response is English-like, and generated eval case YAML files contain no Chinese/CJK characters.")
PY
id: add-todo
title: 验证能否正确添加待办事项
input:
prompt: |
帮我添加一个待办事项:明天下午3点开会
expect:
must_contain:
- "待办"
judge:
type: rule_based
success:
- output_contains:
all: ["待办", "添加"]
schema_version: v1alpha1
environment:
type: none
skills:
- source: local_path
path: .
engine:
name: claude_code
cases:
files:
- evals/cases/add-todo.yaml
defaults:
timeout_seconds: 120
max_turns: 5
report:
formats: [json]
skill-upper
An Agent Skill that helps you set up, run, and interpret evaluations (evals) for other Agent Skills using the skill-up CLI.
What it does
skill-upper guides you through the full evaluation lifecycle:
- Locate the target Skill and understand its capabilities
- Scaffold
evals/eval.yamlandevals/cases/*.yamlwith proper judge types - Validate configuration before running
- Run evaluations against real Agent Engines (Claude Code, Codex, qodercli, etc.)
- Interpret results — pass rates, failing assertions, benchmark deltas, and HTML reports
When to use
- You want to evaluate, test, or regress a Skill
- You need to write
eval.yaml/case.yamlor choose a judge type - You're running
skill-up run/validate/list-cases/report/import/init - You're migrating from Anthropic
evals.json
skill-upper
一个帮助你使用 skill-up CLI 为 Agent Skill 搭建、运行和解读评测(evals)的 Agent Skill。
功能概述
skill-upper 引导你完成评测的完整生命周期:
- 定位 目标 Skill,理解其能力边界
- 搭建
evals/eval.yaml和evals/cases/*.yaml脚手架,选择合适的 judge 类型 - 校验 配置,在运行前发现 schema 错误
- 运行 评测,调用真实 Agent Engine(Claude Code、Codex、qodercli 等)
- 解读 结果——通过率、失败断言、基线对比和 HTML 报告
使用场景
- 需要对某个 Skill 进行评测、测试或回归验证
- 需要编写
eval.yaml/case.yaml或选择 judge 类型 - 运行
skill-up run/validate/list-cases/report/import/init - 从 Anthropic
evals.json迁移到 skill-up 格式
case.yaml 字段参考(skill-up)
每个 evals/cases/*.yaml 是一个评测用例。用例 ID = 文件名(去掉 .yaml)。语义与 skill-up 内置 schema 一致。
单轮用例骨架
id: find-null-bug
title: 应该识别出空指针 bug
description: 验证 Skill 能在代码审查中发现 null 解引用问题
input:
prompt: |
Review the current diff and report findings.
context:
repo_fixture: fixtures/repos/null-check-bug
git:
init: true
checkout: main
apply_diff: fixtures/diffs/null-check.patch
constraints:
timeout_seconds: 180
max_turns: 8
expect:
must_contain: ["null", "bug"]
must_not_contain: ["LGTM"]
exit_code: 0
judge:
type: rule_based
success:
- output_contains:
all: ["null", "bug"]
- exit_code: 0多轮对话
input:
turns:
- role: user
content: "sdd_bootstrap: task=实现用户登录功能"
post_condition:
must_contain_any: ["Research", "分析"]
on_fail: skip_remaining # 或 fail
- role: user
content: "跳过 Research,直接帮我写代码"post_condition:每轮结束后检查输出。on_fail: skip_remaining 标为 SKIP,fail 直接 FAIL 整个用例。
context — 初始化工作区
context:
repo_fixture: fixtures/repos/my-project
git:
init: true
checkout: feature-branch
apply_diff: fixtures/diffs/my.patch
remotes:
- name: origin
url: https://github.com/user/repo
files:
"src/main.py": |
def hello():
print("Hello World")
"config.json": '{"debug": true}'expect — 零成本门槛检查
expect:
must_contain:
- "review"
- "bug"
must_not_contain:
- "LGTM"
- "error"
exit_code: 0
files_exist:
- "review.md"
- "output.json"
files_not_exist:
- "temp.log"expect 不通过时,judge 会被跳过。用它来快速过滤明显不合格的输出,节省 token。
常见写法
- 纯文本路由 Skill:
expect.must_contain+judge.rule_based.output_contains - MCP 工具校验:
judge.rule_based.success[tool_called] - 语义质量评估:
judge.agent_judge.criteria - 复杂结构化断言:
judge.script,在脚本里读$EVAL_TRANSCRIPT_PATH等自由判断
skill-up CLI 命令参考
skill-up 提供以下命令,覆盖评测的完整生命周期:校验、运行、查看用例、生成报告和格式迁移。另含用户配置初始化与调试子命令。
---
skill-up run
运行评测用例,生成评估报告。
skill-up run [path] [flags]参数
| 参数 | 说明 |
|---|---|
path | eval.yaml 的路径。省略时默认在当前目录下查找 evals/eval.yaml |
Flags
| Flag | 默认 | 说明 |
|---|---|---|
--auto | false | 自动检测 evals/ 目录,支持直接消费 Anthropic evals.json |
--include-case-name | — | 只运行匹配的用例(glob,可多次) |
--exclude-case-name | — | 排除匹配的用例(glob,可多次) |
--format | — | 附加报告格式:junit / html(可多次)。result.json 始终写入;--format junit 生成 report.xml;--format html 生成 report.html;--format json 对 result.json 为冗余 |
--output-dir | eval.yaml 同级目录 | 报告和产物的输出目录 |
--iteration | 0(auto) | 总运行次数。0 = 自动:在最后一个已有 iteration-N/ 之后追加一轮;正整数 = 显式运行 N 轮,产物写入 iteration-1/ … iteration-N/ |
--engine | 配置中的值 | 覆盖 Engine 名称 |
--runtime | 配置中的值 | 覆盖 environment.type(none、opensandbox、docker) |
--model | 配置中的值 | 覆盖模型(格式:provider/name) |
--parallelism | 配置中的值 | 覆盖 cases.parallelism,临时调整用例并行数,取值 1–256 |
--api-key | — | 传入 API Key(优先级高于环境变量) |
-v, --verbose | 0 | 日志详细程度:info 默认;-v 为 debug;-vv / --verbose=2 为 trace |
退出码
0— 所有用例通过1— 有用例失败或执行出错
可作为 CI 门禁。
典型用法
skill-up run ./evals/eval.yaml
skill-up run ./evals/eval.yaml --include-case-name "basic-*"
skill-up run ./evals/eval.yaml --exclude-case-name "*-old"
skill-up run ./evals/eval.yaml --engine codex --model openai/gpt-4
skill-up run ./evals/eval.yaml --parallelism 4
skill-up run ./evals/eval.yaml --format html --format junit
skill-up run ./evals/eval.yaml --iteration 3
skill-up run ./evals/eval.yaml
skill-up run --auto
skill-up run ./my-skill/ --auto --engine codexOTLP Trace(可选)
设置标准 OpenTelemetry 环境变量后,skill-up run 可经 OTLP 上报 trace;verbose 日志可带 trace_id / span_id。也可用 skill-up init 生成的用户配置填充默认 OTEL 相关环境变量。详见上游文档「User config」与「CLI 命令参考」中的 OTLP 小节。
---
skill-up validate
校验 eval.yaml 及引用的 case 文件。
skill-up validate [path to eval.yaml]成功示例:
✓ eval.yaml is valid (loaded 3 case(s))---
skill-up list-cases
列出配置中的全部用例。
skill-up list-cases [path to eval.yaml]---
skill-up report
从已有 result.json 重新生成报告,不重跑评测。
skill-up report <path to result.json> [flags]| Flag | 默认 | 说明 |
|---|---|---|
--format | json | json / junit / html(可多次) |
--output-dir | result.json 同级 | 输出目录 |
skill-up report result.json --format html
skill-up report result.json --format json --format junit --format html --output-dir ./reports---
skill-up import
将 Anthropic evals.json 转为 skill-up 原生 YAML。
skill-up import <evals.json> [flags]| Flag | 默认 | 说明 |
|---|---|---|
--output | evals.json 同级 | 输出目录 |
import 与 run --auto 的区别:import 是一次性格式转换;run --auto 运行时直接读 evals.json,不落 YAML。
---
skill-up init
将用户配置模板写到磁盘(Telemetry、默认 runtime_kwargs 等),与评测 eval.yaml 不同。
skill-up init [flags]| Flag | 说明 |
|---|---|
--local | 写入 $PWD/.skill-up.yaml(与 --config 互斥) |
--print | 打印模板到 stdout,不写文件 |
--force | 覆盖已存在文件 |
--config <path> | 显式目标路径(需与 --local 二选一) |
默认路径:$XDG_CONFIG_HOME/skill-up/config.yaml 或 ~/.config/skill-up/config.yaml。发现链中还支持环境变量 SKILL_UP_CONFIG 指向用户配置文件。
---
skill-up debug
调试内部模块(仅开发 / 排错常用):
skill-up debug judge <input.json>
skill-up debug report <input.json>---
产物目录结构
<skill-name>-workspace/
iteration-1/
result.json
benchmark.json
report.html # 若生成
<case-id>/
with_skill/
outputs/
grading.json
without_skill/ # 仅 benchmark.enabled=true 时可能有
outputs/
grading.jsongrading.json(Anthropic 兼容子集)
工作区内的 grading.json 通常只含 expectations 与 summary。完整状态见 result.json 的 case_results[].grading(status、turns_executed、assertion_results 等)。
benchmark.json
启用基线对比后会有 without_skill 与 delta 等字段。
eval.yaml 字段参考(skill-up)
eval.yaml 是评测入口,声明「在什么环境、用什么 Engine、跑哪些用例、如何出报告」。内容对齐 skill-up 用户手册 - 编写评测。
完整字段骨架
schema_version: v1alpha1
environment:
type: none # none | opensandbox | docker
mcp:
servers:
- name: github
mode: real # real;mocked 预留
transport: http # http | stdio;可按 endpoint/command 推断
config_ref: evals/fixtures/mcp/github.yaml
skills:
- source: local_path
path: .
engine:
name: claude_code # claude_code | codex | qodercli(也兼容 qoder-cli)
model:
provider: anthropic
name: claude-sonnet-4-6
base_url: ""
cases:
files:
- evals/cases/a.yaml
defaults:
timeout_seconds: 300
max_turns: 12
collect_artifacts: # 可选:用 glob 采集 workspace 产物文件
- "**/*.json"
- "report/**"
parallelism: 2
retry_policy:
max_retries: 1
retry_on: [timeout, error]
benchmark:
enabled: false
report:
formats: [json, html]
artifacts: [transcript]cases.parallelism 可被 skill-up run --parallelism N(1–256)临时覆盖。
collect_artifacts(cases.defaults 级,或单个 case.yaml 内追加)用 doublestar glob(* 单层、** 跨目录)声明要采集的 workspace 文件。无论 Agent 成功/失败/超时,命中文件都会保留相对路径下载到 <output-dir>/<case>/<config>/outputs/workspace/。两层按并集去重合并。它与 report.artifacts(产物类型)、agent_judge 的 git diff(字符串)正交。
运行环境
| type | 适用场景 | 说明 |
|---|---|---|
none | 纯文本 I/O、不强依赖沙箱 | 冷启动最快 |
opensandbox | 需要远程沙箱(文件、命令执行等) | 需 OPENSANDBOX_API_KEY;服务地址等可放在 environment.kwargs 或 OPENSANDBOX_BASE_URL |
docker | 本地容器隔离,无需远程服务 | 需本地 docker CLI 和 Docker daemon;镜像需提前拉取 |
OpenSandbox 示例
environment:
type: opensandbox
image: registry.example.com/your-org/sandbox-base:latest
workspace_mount: /workspace
ready_timeout_seconds: 300
kwargs:
base_url: https://agent-sandbox.example.com
extensions: '{"profile":"ci"}'
request_timeout_seconds: "900"
file_transfer_parallelism: "8"常用 kwargs:base_url、extensions(JSON 字符串)、request_timeout_seconds、file_transfer_parallelism 等。鉴权密钥来自环境变量 OPENSANDBOX_API_KEY。
Docker 示例
environment:
type: docker
image: node:22 # 必填,需提前 docker pull
workspace_mount: /workspace # 默认 /workspace
env:
NPM_CONFIG_REGISTRY: https://registry.npmmirror.com
setup_steps:
- run: npm install -g typescript
entrypoint: ["sleep", "infinity"] # 默认 sleep infinity前置条件:本地 docker CLI 和 Docker daemon。network_policy: deny_all 以 --network=none 创建容器;allow_declared 暂不支持。
MCP
mode: real会把真实 MCP Server 装进 Agent。- HTTP MCP 可 inline 或
config_ref指向evals/fixtures/mcp/*.yaml。 - stdio MCP 可配置
command/args。 - 环境变量引用:
${VAR}或整值$VAR;required_env会注入 Agent 环境。
Engine 与模型
engine.model可选;省略时由引擎本地默认模型接管。provider/name组合在 CLI 中形如anthropic/claude-sonnet-4-6、openai/gpt-4等。qodercli通常无需配置model。
engine.kwargs —— agent 私有开关
engine.kwargs 是字符串键值对,每个 agent 只读取自己关心的 key,未知 key 被忽略。无人认识的 key(拼写错误,如 bypas_sandbox)会在 verbose 日志里打 DEBUG,-v 可见。CLI 等价开关:--engine-kwarg key=value(别名 --ek),可重复。优先级 --engine-kwarg > engine.kwargs > 缺省。
engine:
name: codex
kwargs:
bypass_sandbox: "true"| key | agent | true 时行为 | 缺省 / false |
|---|---|---|---|
bypass_sandbox | codex | 命令行强制 --dangerously-bypass-approvals-and-sandbox,覆盖根据 runtime 自动决定的 sandbox flag。用于宿主内核不支持 Landlock 的场景(典型:部分 CI 容器) | 维持现状:none runtime 用 --sandbox workspace-write,其它 runtime 已是 bypass |
bypass_sandbox | claude_code | no-op(claude 现有命令已固定 --permission-mode=bypassPermissions) | no-op |
bypass_sandbox | qodercli | no-op(qoder CLI 无对应 flag) | no-op |
常见错误
opensandbox但未配置鉴权或base_url→ 运行时失败engine.model与网关不匹配 → 连接报错cases.files路径不存在 → validate 失败- 所有相对路径相对于 Skill 根目录(
SKILL.md所在目录)
安装 / 升级 / 排错
skill-up 以预编译单二进制发布在 GitHub Releases,无运行时依赖(不需要 Go、Python、Node 等即可使用官方安装脚本)。
平台:仅支持 macOS / Linux,暂不支持 Windows。
官方安装脚本(macOS / Linux)
curl -fsSL https://raw.githubusercontent.com/alibaba/skill-up/main/install.sh | bash脚本行为概要:
- 识别 OS(darwin / linux)与架构(amd64 / arm64)
- 从 GitHub Releases 下载对应压缩包与校验文件
- 默认安装到
~/.local/bin/skill-up - 可用
sha256sum/shasum校验(若本机有相应工具)
版本与安装目录
# 固定版本(可为 vX.Y.Z 或 X.Y.Z,脚本会规范化为带 v 的 tag)
export SKILL_UP_VERSION=v0.1.0
curl -fsSL https://raw.githubusercontent.com/alibaba/skill-up/main/install.sh | bash
# 自定义目录
export INSTALL_DIR="$HOME/bin"
curl -fsSL https://raw.githubusercontent.com/alibaba/skill-up/main/install.sh | bash验证安装
skill-up --version
skill-up --help升级
再次执行安装脚本即可覆盖旧二进制(可先设 SKILL_UP_VERSION 锁定版本)。
排错
command not found: skill-up
通常是 ~/.local/bin 不在 PATH。
macOS(zsh):
echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.zshrc
source ~/.zshrcLinux(bash):
echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc下载失败 / 网络受限
- 配置代理:
export HTTPS_PROXY=http://your-proxy:port - 或从 Releases 手动下载对应
skill-up_*_*.tar.gz与checksums.txt,解压后将二进制放到 PATH 内并chmod +x
macOS "无法验证开发者"
xattr -d com.apple.quarantine "$(which skill-up)"或在「系统设置 → 隐私与安全性」中允许。
从源码构建
已与仓库 schema 一致,适合开发:
make buildJudge 类型选型与写法(skill-up)
skill-up 的评估分两层:expect(零成本门槛) + judge(质量评估)。expect 不过 judge 就跳过,所以能用 expect 先过滤的尽量用 expect。
每个用例只能选一种 judge 类型。
选型决策树
1. 有明确关键词 / 文件 / 退出码 / 工具调用可判定?→ rule_based 2. 有结构化输出,想写自定义脚本检查?→ script 3. 以上都不行,要 LLM 做语义判断?→ agent_judge(最贵,慎用)
rule_based — 确定性规则
judge:
type: rule_based
success:
- output_contains:
all: ["bug", "null"]
any: ["建议修复", "推荐更改"]
not: ["LGTM"]
- exit_code: 0
- tool_called:
name: "github::create_pull_request"
args:
title: "Fix null check"
failure:
- output_contains:
any: ["无需修改", "代码正确"]评估逻辑:failure 优先,任一条命中立即 FAIL;否则所有 success 必须满足才 PASS。
支持的匹配器:
output_containsexit_codetool_calledfiles_exist/files_not_exist
agent_judge — LLM 评审
judge:
type: agent_judge
model: anthropic/claude-sonnet-4-6
criteria:
- "输出中识别了真实存在的 bug,并给出了准确位置"
- "没有将正确代码误报为 bug"
- "建议具有可操作性,不是泛泛而谈"
pass_threshold: 0.7注意事项:
- 会额外消耗 token,慢且贵
- criteria 尽量具体、可验证
- 能拆出确定性条件时先用
rule_based/expect挡一道
script — 自定义脚本
judge:
type: script
script_path: evals/fixtures/scripts/check-quality.sh
timeout_seconds: 30脚本约定:
- 退出码
0= PASS,非0= FAIL - 工作目录是用例工作区根目录
- 环境变量:
$EVAL_FINAL_MESSAGE、$EVAL_EXIT_CODE、$EVAL_TRANSCRIPT_PATH(若可用)
成本提醒
| judge | 相对成本 | 何时选 |
|---|---|---|
| expect | 0 | 任何时候先挡一道 |
| rule_based | 极低 | 默认首选 |
| script | 低(取决于脚本) | 灵活自定义 |
| agent_judge | 高 | 真的需要语义理解 |
从 Anthropic evals.json 迁移(skill-up)
若使用 Anthropic skill-creator 生成过 Skill,目录下可能有 evals/evals.json。skill-up 可以直接消费它,也可一次性转成原生 YAML。
方式一:--auto 直接跑(零配置)
cd my-skill/
skill-up run --auto
skill-up run ./my-skill/ --auto
skill-up run --auto --engine codex适用:快速 CI 回归、多 Engine 验证、与 Anthropic evals 源文件保持同步。
限制:
- 不支持多轮对话
expectations往往映射为agent_judge.criteria,消耗评审 token- 不便在
--auto路径上叠加复杂opensandbox/ MCP / 强expect门槛(需转 YAML 后编辑)
方式二:import 转原生 yaml(深度定制)
skill-up import ./evals/evals.json
skill-up import ./evals/evals.json --output ./evals-v2生成 eval.yaml + cases/*.yaml 后,你可以:
- 添加
expect确定性门槛 - 使用
rule_based/script替代或补充 LLM 评判 - 配置多轮
turns - 配置
environment.type: opensandbox、MCP 等
对比
--auto | import | |
|---|---|---|
| 操作 | 运行时读取 | 一次性落盘 YAML |
| 同步 | evals.json 更新即生效 | 之后独立维护 YAML |
| 定制 | 受限于 JSON | 完全可控 |
可先用--auto跑通,再对重试用例import手改。
evals.json 映射(摘要)
| evals.json | skill-up YAML |
|---|---|
prompt | input.prompt |
expectations | 默认 judge.agent_judge.criteria |
expected_output | 常为 description |
files | context.files 等 |
推荐路径
1. skill-up run --auto 验证可走通 2. skill-up import ./evals/evals.json --output ./evals-native 3. 编辑 YAML:补 expect、rule_based、opensandbox / MCP 4. skill-up run ./evals-native/eval.yaml
Ideal:Anthropic 迭代 Skill → skill-up --auto 进 CI → 深度场景转 YAML 长期维护。
Related skills
FAQ
What does skill-up do?
It installs a Skill into a real agent engine, runs each case's prompt, grades the result via rules, LLM judges, or scripts, then produces a report.
Does skill-up run on Windows?
No. The docs state skill-up currently supports macOS and Linux only; Windows is not supported.