关于 skill-creator
此 Skill 通过草稿、测试提示和定性及定量评估,协助创建并迭代改进 Claude Skill。该分支包含 Windows 兼容性和评估有效性修复,同时保留上游 Skill 的名称与描述。
主要功能
- 01指导 Skill 起草与改进
- 02生成测试提示并运行评估
- 03支持定性和定量评估
- 04包含 Windows 相关修复
- 05处理评估有效性问题
适用场景
- 01根据想法起草 Claude Skill
- 02评估并修改现有 Skill
- 03在 Windows 上测试 Skill 行为
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ ctrlcarlitos/ skills --skill skill-creator安装后在 Claude Code 中输入/skill-creator确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
LICENSE.txtrequirements.txtagents/analyzer.mdcomparator.mdgrader.mdassets/eval_review.htmleval-viewer/generate_review.pyviewer.htmlreferences/schemas.mdscripts/__init__.pyaggregate_benchmark.pygenerate_report.pyimprove_description.pypackage_skill.pyquick_validate.pyrun_eval.pyrun_loop.pyutils.pytests/__init__.pytest_find_project_root.pytest_harness_adapters.pytest_pump_stdout_to_queue.pytest_run_eval.pytest_run_loop.pytest_spaces_and_unicode_paths.pytest_utf8_file_io.py详细介绍
anthropics/skills
skills/skill-creator的分支版本,修复了 Windows 相关问题(管道读取器、UTF-8 文件 I/O、--project-root、真实技能触发检测)和评估有效性问题(同名已安装技能导致结果受污染、测试框架错误被掩盖为 0% 分数)。上游提交、补丁和审计结果见 CtrlCarlitos/skills 中的vendor/skill-creator/。可直接替换:名称和描述均相同。 上游问题:anthropics/skills#1827。
Skill Creator
用于创建新技能并持续改进它们的技能。
总体来说,创建技能的流程如下:
- 确定你希望技能实现什么功能,以及大致的实现方式
- 编写技能草稿
- 创建几个测试提示词,并使用可访问该技能的 claude 运行它们
- 帮助用户从定性和定量两个方面评估结果
- 运行在后台进行时,如果尚无定量评估,就起草一些;如果已有,则可以直接使用,也可以根据需要修改。然后向用户说明这些评估(如果已有评估,则说明现有评估)
- 使用
eval-viewer/generate_review.py脚本展示结果供用户查看,同时让用户查看定量指标
- 根据用户对结果的评估反馈重写技能(也要考虑定量基准中显现出的明显缺陷)
- 重复以上流程,直到满意为止
- 扩充测试集,并尝试更大规模的测试
使用此技能时,你的任务是判断用户处于流程的哪个阶段,然后介入并帮助他们推进。例如,用户可能会说:“我想为 X 创建一个技能。”你可以帮助他们明确具体需求、编写草稿和测试用例、确定评估方式、运行所有提示词,并反复迭代。
另一方面,用户可能已经有了技能草稿。这种情况下,你可以直接进入评估和迭代环节。
当然,你应该始终保持灵活。如果用户说“我不需要跑一堆评估,随便聊聊就行”,那就按他们的意思来。
技能完成后(不过,顺序可以灵活调整),你还可以运行技能描述优化器来优化技能的触发方式。我们有一个专门的脚本可以完成这件事。
明白?好。
与用户沟通
技能创建器可能会被各种编程术语熟悉程度的人使用。如果你还没听说过(这项趋势确实才刚刚兴起),Claude 的强大能力正促使水管工打开终端,也让父母和祖父母开始搜索“如何安装 npm”。另一方面,大多数用户可能都具备一定的计算机知识。
因此,请留意上下文线索,判断应该如何措辞!通常可以参考以下原则:
- “评估”和“基准测试”有些专业,但可以使用
- 对于“JSON”和“断言”,除非用户有明显迹象表明他们了解这些概念,否则应先解释再使用
如果你不确定,简要解释术语也无妨;如果拿不准用户是否理解,也可以用简短定义加以说明。
创建技能
捕获意图
首先了解用户的意图。当前对话中可能已经包含用户想要捕获的工作流(例如,用户说“把这个转成一个技能”)。如果是这样,请先从对话历史中提取答案——使用了哪些工具、步骤顺序、用户做出的修正,以及观察到的输入/输出格式。用户可能需要补充缺失信息,并且应在进入下一步之前确认。
- 这个技能应该让 Claude 能做什么?
- 这个技能应在什么时候触发?(哪些用户措辞/情境)
- 预期的输出格式是什么?
- 是否应该设置测试用例来验证技能是否有效?具有客观可验证输出的技能(文件转换、数据提取、代码生成、固定工作流步骤)适合使用测试用例。具有主观输出的技能(写作风格、艺术)通常不需要。根据技能类型建议合适的默认选项,但由用户决定。
访谈与研究
主动询问有关边缘情况、输入/输出格式、示例文件、成功标准和依赖项的问题。理清这些内容后,再编写测试提示词。
检查可用的 MCP;如果有适合研究的 MCP(搜索文档、查找类似技能、了解最佳实践),则通过子 Agent 并行研究(如果可用),否则直接研究。提前准备好相关背景信息,减轻用户的负担。
编写 SKILL.md
根据用户访谈,填写以下组成部分:
- name:技能标识符
- description:何时触发、技能的作用。这是主要的触发机制——既要说明技能的作用,也要具体说明适用情境。所有“何时使用”的信息都应放在这里,而不是正文中。注意:Claude 目前倾向于“触发不足”,也就是在技能有用时不使用它。为应对这一点,请让技能描述更具“推动性”。例如,不要只写“如何构建一个简单快速的仪表盘来展示 Anthropic 的内部数据”,而应写“如何构建一个简单快速的仪表盘来展示 Anthropic 的内部数据。只要用户提到仪表盘、数据可视化、内部指标,或想展示任何类型的公司数据,就务必使用此技能,即使他们没有明确要求制作‘仪表盘’。”
- compatibility:所需工具、依赖项(可选,很少需要)
- 其余技能内容 :)
技能编写指南
技能结构
skill-name/
├── SKILL.md (required)
│ ├── YAML frontmatter (name, description required)
│ └── Markdown instructions
└── Bundled Resources (optional)
├── scripts/ - Executable code for deterministic/repetitive tasks
├── references/ - Docs loaded into context as needed
└── assets/ - Files used in output (templates, icons, fonts)
渐进式披露
技能采用三级加载系统:
- 元数据(name + description)——始终处于上下文中(约 100 个词)
- SKILL.md 正文——技能触发时载入上下文(理想情况下少于 500 行)
- 捆绑资源——按需加载(数量不限,脚本可以在不加载的情况下执行)
这些词数仅供参考,如有需要,可以写得更长。
关键模式:
- 将 SKILL.md 控制在 500 行以内;如果接近此限制,应增加一层层级,并明确指出模型使用该技能时接下来应查看的内容。
- 在 SKILL.md 中清楚地引用文件,并说明何时读取这些文件
- 对于较大的参考文件(超过 300 行),请包含目录
领域组织:当技能支持多个领域/框架时,按变体组织:
cloud-deploy/
├── SKILL.md (workflow + selection)
└── references/
├── aws.md
├── gcp.md
└── azure.md
Claude 只会读取相关的参考文件。
避免意外原则
这不言而喻,但技能不得包含恶意软件、漏洞利用代码,或任何可能危及系统安全的内容。如果技能内容已如实描述,其意图就不应让用户感到意外。不要配合创建误导性技能,或旨在协助未经授权的访问、数据外泄或其他恶意活动的请求。不过,“扮演某个角色”之类的内容是可以的。
写作模式
在编写指令时,优先使用祈使句。
定义输出格式——可以这样写:
## Report structure
ALWAYS use this exact template:
# [Title]
## Executive summary
## Key findings
## Recommendations
示例模式——加入示例很有帮助。可以这样写(但如果示例中包含“输入”和“输出”,你可能需要稍作调整):
## Commit message format
**Example 1:**
Input: Added user authentication with JWT tokens
Output: feat(auth): implement JWT-based authentication
写作风格
与其用强硬的“必须”要求,不如向模型解释事情为何重要。运用心理理论,尽量让技能具有普适性,而不是局限于非常狭窄的示例。先写一份草稿,然后以全新的视角审视并改进它。
测试用例
写完技能草稿后,构思 2-3 个真实的测试提示词——也就是现实用户实际会说的话。与用户分享:“这里有几个我想尝试的测试用例。你觉得合适吗,还是想再添加一些?”(不必使用这句原话。)然后运行它们。
将测试用例保存到 evals/evals.json。暂时不要编写断言——等运行进行时,再在下一步起草断言。
{
"skill_name": "example-skill",
"evals": [
{
"id": 1,
"prompt": "User's task prompt",
"expected_output": "Description of expected result",
"files": []
}
]
}
完整架构(包括稍后要添加的 assertions 字段)请参阅 references/schemas.md。
运行和评估测试用例
本节是一个连续流程——不要中途停止。不要使用 /skill-test 或任何其他测试技能。
将结果放在技能目录的同级目录 <skill-name>-workspace/ 中。在工作区内,按迭代组织结果(iteration-1/、iteration-2/ 等),并在每个迭代目录中为每个测试用例创建一个目录(eval-0/、eval-1/ 等)。不要一开始就创建所有目录——随着流程推进逐步创建。
第 1 步:在同一轮中启动所有运行(包含技能和基线)
对于每个测试用例,在同一轮中启动两个子 Agent——一个使用技能,一个不使用。这一点很重要:不要先启动使用技能的运行,之后再回来运行基线。一次性全部启动,让它们差不多同时完成。
使用技能运行:
Execute this task:
- Skill path: <path-to-skill>
- Task: <eval prompt>
- Input files: <eval files if any, or "none">
- Save outputs to: <workspace>/iteration-<N>/eval-<ID>/with_skill/outputs/
- Outputs to save: <what the user cares about — e.g., "the .docx file", "the final CSV">
基线运行(使用相同的提示词,但基线取决于上下文):
- 创建新技能:完全不使用技能。使用相同的提示词,不指定技能路径,并保存到
without_skill/outputs/。 - 改进现有技能:使用旧版本。编辑前,先为技能创建快照(
cp -r <skill-path> <workspace>/skill-snapshot/),然后让基线子 Agent 使用该快照。保存到old_skill/outputs/。
为每个测试用例编写一个 eval_metadata.json(断言暂时可以为空)。为每个评估用例起一个能描述其测试内容的名称——不要只叫“eval-0”。目录也使用这个名称。如果本次迭代使用了新的或修改过的评估提示词,请为每个新的评估目录创建这些文件——不要假设它们会从之前的迭代沿用过来。
{
"eval_id": 0,
"eval_name": "descriptive-name-here",
"prompt": "The user's task prompt",
"assertions": []
}
第 2 步:运行进行时起草断言
不要只是等待运行结束——利用这段时间完成有用的工作。为每个测试用例起草定量断言,并向用户说明。如果 evals/evals.json 中已有断言,请检查并说明它们的检查内容。
好的断言应当客观可验证,并有清晰描述性的名称——即使只是在基准测试查看器中扫一眼,也能立即明白每项断言检查什么。对于写作风格、设计质量等主观技能,更适合进行定性评估——不要强行对需要人工判断的内容设置断言。
起草断言后,使用断言更新 eval_metadata.json 文件和 evals/evals.json。同时向用户说明,他们将在查看器中看到什么——包括定性输出和定量基准测试。
第 3 步:随着运行完成,捕获计时数据
每当子 Agent 任务完成时,你都会收到一条包含 total_tokens 和 duration_ms 的通知。请立即将这些数据保存到运行目录中的 timing.json:
{
"total_tokens": 84852,
"duration_ms": 23332,
"total_duration_seconds": 23.3
}
这是捕获这些数据的唯一机会——数据通过任务通知传递,不会保存在其他地方。请在收到每条通知时立即处理,不要等着批量处理。
第 4 步:评分、汇总并启动查看器
所有运行完成后:
-
为每次运行评分 — 启动评分子 Agent(或直接评分),使其读取
agents/grader.md并根据输出评估每项断言。将结果保存到每个运行目录中的grading.json。grading.json的 expectations 数组必须使用text、passed和evidence字段(不能使用name/met/details或其他变体)——查看器依赖这些确切的字段名称。对于可以通过程序检查的断言,请编写并运行脚本,而不是凭目测判断——脚本速度更快、更可靠,还可以在后续迭代中重复使用。 -
汇总为基准测试 — 从 skill-creator 目录运行汇总脚本:
python -m scripts.aggregate_benchmark <workspace>/iteration-N --skill-name <name>这会生成
benchmark.json和benchmark.md,其中包含每种配置的 pass_rate、时间和 token 数,以及均值 ± 标准差和差值。如果手动生成benchmark.json,请参阅references/schemas.md,了解查看器所需的确切架构。 请将每个 with_skill 版本放在对应基线版本之前。 -
进行分析 — 阅读基准测试数据,指出汇总统计数据可能掩盖的规律。请参阅
agents/analyzer.md中的“分析基准测试结果”部分,了解需要关注的内容,例如无论使用什么技能都总能通过的断言(区分度不足)、方差较高的评估(可能不稳定),以及时间与 token 的权衡。 -
启动查看器,同时提供定性输出和定量数据:
nohup python <skill-creator-path>/eval-viewer/generate_review.py \ <workspace>/iteration-N \ --skill-name "my-skill" \ --benchmark <workspace>/iteration-N/benchmark.json \ > /dev/null 2>&1 & VIEWER_PID=$!从第 2 次迭代开始,还要传入
--previous-workspace <workspace>/iteration-<N-1>。Cowork / 无头环境: 如果
webbrowser.open()不可用,或环境没有显示器,请使用--static <output_path>写入独立 HTML 文件,而不是启动服务器。用户点击“Submit All Reviews”后,反馈会下载为feedback.json文件。下载后,将feedback.json复制到工作区目录,以便下一次迭代读取。
注意:请使用 generate_review.py 创建查看器;无需编写自定义 HTML。
- 告知用户,例如:“我已在浏览器中打开结果。页面有两个标签页——‘Outputs’可让你逐个查看测试用例并留下反馈,‘Benchmark’显示定量比较。完成后,请回到这里告诉我。”
用户在查看器中看到的内容
“Outputs”标签页一次显示一个测试用例:
- Prompt:给出的任务
- Output:技能生成的文件,可能时以内嵌方式呈现
- Previous Output(第 2 次迭代及之后):可折叠区域,显示上一次迭代的输出
- Formal Grades(如果运行了评分):可折叠区域,显示各项断言的通过/失败情况
- Feedback:文本框,输入时会自动保存
- Previous Feedback(第 2 次迭代及之后):显示在文本框下方的上次反馈
“Benchmark”标签页显示统计摘要:每种配置的通过率、计时数据和 token 用量,并提供各项评估的明细及分析观察。
可通过上一个/下一个按钮或方向键进行导航。完成后,点击“Submit All Reviews”,即可将所有反馈保存到 feedback.json。
第 5 步:阅读反馈
用户告知你已完成后,读取 feedback.json:
{
"reviews": [
{"run_id": "eval-0-with_skill", "feedback": "the chart is missing axis labels", "timestamp": "..."},
{"run_id": "eval-1-with_skill", "feedback": "", "timestamp": "..."},
{"run_id": "eval-2-with_skill", "feedback": "perfect, love this", "timestamp": "..."}
],
"status": "complete"
}
空反馈表示用户认为结果没问题。请将改进重点放在用户提出具体意见的测试用例上。
完成后,关闭查看器服务器:
kill $VIEWER_PID 2>/dev/null
改进技能
这是迭代循环的核心。你已经运行了测试用例,用户也已经审阅了结果,现在需要根据他们的反馈改进技能。
如何思考改进方向
-
从反馈中归纳规律。 这里的大方向是,我们要创建能够使用百万次的技能(也许真的会用这么多次,甚至更多,谁知道呢),以应对许多不同的提示词。你和用户在这里反复迭代的只有少数几个示例,因为这样推进得更快。用户对这些示例了如指掌,因此可以快速评估新输出。但如果你和用户共同开发的技能只能处理这些示例,那它就毫无用处。与其添加繁琐、过度拟合的修改,或设置严苛限制的 MUST,不如在问题顽固时尝试换用不同的比喻,或推荐不同的工作模式。尝试成本相对较低,说不定就能找到很好的方案。
-
保持提示词精简。 删除那些没有发挥作用的内容。务必阅读完整对话记录,而不只是最终输出——如果技能似乎让模型浪费大量时间做无用功,可以尝试删掉导致这种情况的部分,看看效果如何。
-
解释原因。 尽量解释清楚要求模型这样做的原因。如今的大模型很聪明,具备良好的心智理论能力;如果提供了合适的引导机制,它们就能超越机械执行指令,真正有效地完成任务。即使用户的反馈简短或带有挫败感,也要努力理解这项任务、用户为什么这样写、他们实际写了什么,然后把这些理解传达给指令。如果发现自己把 ALWAYS 或 NEVER 全大写,或者使用非常僵化的结构,那就是一个警示信号——如果可能,应换种说法解释原因,让模型理解你提出该要求的重要性。这样做更有人情味,也更有力、更有效。
-
留意测试用例间重复的工作。 阅读测试运行的对话记录,观察各个子 Agent 是否都独立编写了类似的辅助脚本,或采用了相同的多步骤方法。如果 3 个测试用例都让子 Agent 编写了
create_docx.py或build_chart.py,这就是一个强烈信号:技能应该包含该脚本。只需编写一次,将它放进scripts/,并告诉技能使用它。这样每次后续调用都不必从头重复造轮子。
这项任务非常重要(我们正努力每年创造数十亿美元的经济价值!),而思考时间并不是瓶颈;请从容思考,认真权衡。我建议先起草修订稿,再重新审视并继续改进。请尽力设身处地理解用户的想法,弄清他们想要什么、需要什么。
迭代循环
改进技能后:
- 将改进应用到技能中
- 将所有测试用例(包括基线运行)重新运行到新的
iteration-<N+1>/目录中。如果你要创建新技能,基线始终是without_skill(不使用技能),后续迭代也保持不变。如果你是在改进现有技能,则自行判断使用哪个基线更合适:用户最初提供的版本,或上一轮迭代。 - 启动评审器,并将
--previous-workspace指向上一轮迭代 - 等待用户审阅并告知你已完成
- 阅读新的反馈,再次改进,然后重复
持续进行,直到:
- 用户表示满意
- 反馈全部为空(各项都没有问题)
- 你已无法取得有意义的进展
进阶:盲比较
当你需要对同一 Skill 的两个版本进行更严格的比较时(例如用户问"新版本是否真的更好?"),可以使用盲比较系统。详细内容请阅读 agents/comparator.md 和 agents/analyzer.md。其基本思路是:在不告知来源的情况下,把两份输出交给一个独立的 Agent,由它判断质量,然后分析胜出方胜出的原因。
这一功能是可选的,需要子 Agent 支持,大多数用户并不需要。通常人工审阅循环已经足够。
描述优化
SKILL.md frontmatter 中的 description 字段是决定 Claude 是否调用该 Skill 的主要机制。在创建或改进 Skill 之后,应主动提出优化 description,以提高触发的准确性。
第一步:生成触发评估查询
创建 20 条评估查询,包括应触发和不应触发两类,并保存为 JSON:
[
{"query": "the user prompt", "should_trigger": true},
{"query": "another prompt", "should_trigger": false}
]
查询必须真实,是 Claude Code 或 Claude.ai 用户实际会输入的内容。不要使用抽象的请求,而应具体、细节充分,例如文件路径、用户工作或处境的个人背景、列名和取值、公司名称、URL 等,并带有一点背景信息。部分查询可以使用小写、缩写、拼写错误或口语化表达。查询长度应有所不同,并聚焦于边界情况,而不是制作界限分明的样例(用户会有机会确认这些查询)。
不好的示例:"Format this data"、"Extract text from PDF"、"Create a chart"
好的示例:"ok so my boss just sent me this xlsx file (its in my downloads, called something like 'Q4 sales final FINAL v2.xlsx') and she wants me to add a column that shows the profit margin as a percentage. The revenue is in column C and costs are in column D i think"
对于应触发的查询(8-10 条),应考虑覆盖面:同一意图的不同表述,有正式的也有随意的。应包括用户没有明确提及 Skill 或文件类型、但确实需要该 Skill 的情况;也应包括一些不常见的使用场景,以及本 Skill 与其他工具存在竞争、但本 Skill 应当胜出的情况。
对于不应触发的查询(8-10 条),最有价值的是"近似误判"查询,即与 Skill 共享关键词或概念,但实际需要其他工具的查询。可以考虑相邻领域、措辞模糊(朴素的关键词匹配会误触发但实际不应触发)的情况,以及查询涉及 Skill 所做的事情、但在某种场景下其他工具更合适的情况。
需要避免的关键问题是:不要让不应触发的查询显而易见地无关。例如,把"写一个斐波那契函数"作为 PDF Skill 的反例,过于简单,无法起到测试作用。反例应当确实具有迷惑性。
第二步:与用户共同审阅
使用 HTML 模板将评估集提交给用户审阅:
- 从
assets/eval_review.html读取模板 - 替换占位符:
__EVAL_DATA_PLACEHOLDER__→ 评估条目的 JSON 数组(不加引号,因为它是 JS 变量赋值)__SKILL_NAME_PLACEHOLDER__→ Skill 的名称__SKILL_DESCRIPTION_PLACEHOLDER__→ Skill 当前的 description
- 写入临时文件(例如
/tmp/eval_review_<skill-name>.html),并打开:open /tmp/eval_review_<skill-name>.html - 用户可以编辑查询、切换应触发状态、增删条目,然后点击"Export Eval Set"
- 文件会下载到
~/Downloads/eval_set.json。如果存在多个版本(例如eval_set (1).json),应检查 Downloads 文件夹中最新的版本
这一步很重要,评估查询质量不佳会导致 description 质量不佳。
第 3 步:运行优化循环
告诉用户:"这需要一些时间。我会在后台运行优化循环,并定期检查进度。"
将评测集保存到工作区,然后在后台运行:
python -m scripts.run_loop \
--eval-set <path-to-trigger-eval.json> \
--skill-path <path-to-skill> \
--model <model-id-powering-this-session> \
--max-iterations 5 \
--verbose
使用系统提示中的模型 ID(即当前会话所使用的模型),以确保触发测试与用户实际体验一致。
运行期间,定期查看输出,向用户汇报当前处于第几次迭代,以及分数情况。
该流程会自动完成整个优化循环。它将评测集按 60% 训练集和 40% 留出测试集进行划分,评估当前描述(每条查询运行 3 次,以获得可靠的触发率),然后调用 Claude,根据失败情况提出改进建议。每个新描述都会在训练集和测试集上重新评估,最多迭代 5 次。完成后,它会在浏览器中打开 HTML 报告,展示每次迭代的结果,并返回包含 best_description 的 JSON。best_description 按测试分数而非训练分数选出,以避免过拟合。
技能触发机制
了解触发机制有助于设计更好的评测查询。技能会以名称和描述的形式出现在 Claude 的 available_skills 列表中,Claude 会根据该描述决定是否调用某个技能。需要注意的是,Claude 只会为自己不容易独立完成的任务调用技能。简单的单步查询(例如"读取这个 PDF")即使描述完全匹配,也可能不会触发技能,因为 Claude 可以直接用基础工具处理。复杂、多步骤或专业性较强的查询,在描述匹配时则能可靠地触发技能。
因此,评测查询应该足够具体,使 Claude 确实能从调用技能中获益。"读取文件 X"这类简单查询并不是好的测试用例,无论描述质量如何,它们都不会触发技能。
第 4 步:应用结果
从 JSON 输出中取出 best_description,更新技能 SKILL.md 的 frontmatter。向用户展示修改前后的对比,并报告分数。
打包与呈现(仅当 present_files 工具可用时)
检查是否可以使用 present_files 工具。如果不能,跳过此步骤。如果可以,则打包技能,并将 .skill 文件呈现给用户:
python -m scripts.package_skill <path/to/skill-folder>
打包完成后,告知用户生成的 .skill 文件路径,以便其安装。
Claude.ai 专属说明
在 Claude.ai 中,核心工作流相同(起草 → 测试 → 审核 → 改进 → 重复),但由于 Claude.ai 没有子 Agent,部分机制会有所不同。请按以下方式调整:
运行测试用例:没有子 Agent,就无法并行执行。对于每个测试用例,请阅读技能的 SKILL.md,然后按照其中的说明自行完成测试提示词。一次完成一个。这不如使用独立子 Agent 严谨(你编写了技能,同时也在运行它,因此掌握了全部上下文),但这是有用的合理性检查,而且人工审核步骤可以弥补这一点。跳过基线运行——只需使用该技能按要求完成任务。
审核结果:如果无法打开浏览器(例如,Claude.ai 的 VM 没有显示界面,或你使用的是远程服务),请完全跳过浏览器审核步骤。改为直接在对话中展示结果。对于每个测试用例,展示提示词和输出。如果输出是用户需要查看的文件(例如 .docx 或 .xlsx),请将其保存到文件系统,并告知用户文件位置,以便他们下载并检查。直接征求反馈:“看起来怎么样?有什么想修改的吗?”
基准测试:跳过定量基准测试——它依赖基线比较,而没有子 Agent 时这些比较没有意义。重点收集用户的定性反馈。
迭代循环:与之前相同——改进技能、重新运行测试用例、征求反馈——只是中间不再使用浏览器审核步骤。如果有文件系统,仍可将结果整理到迭代目录中。
描述优化:本节需要 claude CLI 工具(具体来说是 claude -p),该工具仅在 Claude Code 中可用。如果你使用的是 Claude.ai,请跳过本节。
跨 Agent 评测一致性(CtrlCarlitos/skills#10):run_eval.py/run_loop.py 也支持 --harness codex 和 --harness opencode(默认仍为 claude),分别通过各自的非交互式 CLI(codex exec/opencode run)驱动对应的 harness,并根据各自的事件格式检测技能是否触发——两者的事件格式都与 Claude 的 Skill 工具不同。没有 --harness antigravity:Antigravity 无法像 Codex/OpenCode 那样可靠地发现项目本地的一次性技能(已通过实际测试确认),而可用的适配器每次评测查询都需要写入用户实际的全局技能目录;此分支不会默默这样做。如果你要评测的是面向 Antigravity 的技能,请将其视为未经测试的 harness,并明确说明,而不要声称分数可以迁移。opencode 自带的 CLI 在某些环境中存在已确认的严重可靠性问题(它可能完全没有输出并卡住,与受测技能无关)——如果其运行报告的错误率高于 claude/codex,很可能反映的是这个问题,而不是描述本身。请参阅 vendor/skill-creator/DISPOSITION.md。
盲测比较:需要子 Agent。请跳过。
打包:package_skill.py 脚本可在任何具备 Python 和文件系统的环境中运行。在 Claude.ai 中,你可以运行该脚本,然后让用户下载生成的 .skill 文件。
更新现有技能:用户可能是要你更新现有技能,而不是创建新技能。在这种情况下:
- 保留原始名称。 记下技能的目录名称和
namefrontmatter 字段,并保持不变。例如,如果已安装的技能是research-helper,则输出research-helper.skill(而不是research-helper-v2)。 - 编辑前先复制到可写位置。 已安装的技能路径可能是只读的。请复制到
/tmp/skill-name/,在该目录中编辑,并从副本进行打包。 - 如果手动打包,请先暂存到
/tmp/,然后再复制到输出目录——直接写入可能会因权限问题失败。
Cowork 专用说明
如果你在 Cowork 中,需要了解的主要事项如下:
- 你可以使用子 Agent,因此主要工作流(并行生成测试用例、运行基线、评分等)都可以正常进行。(但如果遇到严重的超时问题,可以改为串行运行测试提示词,而不是并行。)
- 你没有浏览器或显示界面,因此生成评估查看器时,请使用
--static <output_path>生成独立的 HTML 文件,而不是启动服务器。然后提供一个链接,供用户点击并在浏览器中打开该 HTML。 - 由于某些原因,Cowork 环境似乎让 Claude 不太愿意在运行测试后生成评估查看器,因此在此再次强调:无论你是在 Cowork 还是 Claude Code 中,运行测试后都应始终生成评估查看器,让用户先查看示例,然后再自行修改 Skill 并尝试纠正。请使用
generate_review.py(不要自己编写临时 HTML 代码)。抱歉要重复强调,我要用全大写说明:在你自己评估输入之前,先生成评估查看器!你要尽快让用户看到这些内容! - 反馈的工作方式不同:由于没有运行中的服务器,查看器中的“Submit All Reviews”按钮会将
feedback.json下载为文件。之后你可以从该文件读取反馈(可能需要先请求访问权限)。 - 打包可以正常工作,
package_skill.py只需要 Python 和文件系统。 - 描述优化(
run_loop.py/run_eval.py)在 Cowork 中应可正常运行,因为它通过子进程调用claude -p,而不是浏览器。但请先等 Skill 完全制作完成,并且用户认可其质量后再进行此步骤。 - 更新现有 Skill:用户可能要求你更新已有的 Skill,而不是创建新的。请遵循上文 claude.ai 部分中的更新指南。
参考文件
agents/ 目录包含专用子 Agent 的说明。需要生成相应子 Agent 时再阅读这些文件。
agents/grader.md:如何根据输出评估断言agents/comparator.md:如何对两个输出进行盲法 A/B 比较agents/analyzer.md:如何分析一个版本胜过另一个版本的原因
references/ 目录包含其他文档:
references/schemas.md:evals.json、grading.json 等文件的 JSON 结构
再次重复核心循环,以示强调:
- 明确 Skill 的用途
- 起草或编辑 Skill
- 在测试提示词上运行可访问该 Skill 的 Claude
- 与用户一起评估输出:
- 创建 benchmark.json,并运行
eval-viewer/generate_review.py,帮助用户进行审阅 - 运行定量评估
- 创建 benchmark.json,并运行
- 重复上述步骤,直到你和用户都满意
- 打包最终 Skill 并交付给用户。
如果你有待办列表功能,请将这些步骤加入其中,以免遗漏。如果你在 Cowork 中,请务必在待办列表中加入“创建 evals JSON 并运行 eval-viewer/generate_review.py,以便用户审阅测试用例”这一项。
祝你好运!