关于 skill-creator
skill-creator 引导 AI Agent 从梳理需求、编写草稿到测试评估和迭代修改技能,也可用于改进已有草稿。
主要功能
- 01引导从需求到技能草稿
- 02创建提示词并评估结果
- 03依据反馈和基准迭代
- 04支持 Claude Code 与 Cursor 格式
- 05改进技能描述以优化触发
适用场景
- 01根据用户工作流编写技能
- 02测试并完善现有技能
- 03为新技能准备评估
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ cognitedata/ builder-skills --skill skill-creator安装后在 Claude Code 中输入/skill-creator确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
agents/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.py详细介绍
技能创建器
用于创建新技能并进行迭代改进的技能。
从总体上看,创建技能的流程如下:
- 确定你希望技能实现什么,以及大致该如何实现
- 编写技能草稿
- 创建几个测试提示词,并让可使用该技能的 Agent 运行这些提示词
- 帮助用户从定性和定量两方面评估结果
- 在后台运行测试时,如果还没有定量评估,就先起草一些;如果已有评估,可以直接使用,也可以在认为需要调整时进行修改。然后向用户说明这些评估(如果已有评估,则说明现有评估)
- 使用
eval-viewer/generate_review.py脚本向用户展示结果供其查看,同时让用户查看定量指标
- 根据用户对结果的评估反馈重写技能(如果定量基准测试暴露出明显缺陷,也要据此改进)
- 重复以上步骤,直到满意为止
- 扩充测试集,并再次进行更大规模的测试
使用此技能时,你的任务是判断用户目前处于流程的哪个阶段,并帮助他们推进后续步骤。例如,用户可能会说“我想为 X 创建一个技能”。你可以帮他们明确需求、编写草稿、编写测试用例、确定评估方式、运行所有提示词,并反复迭代。
另一方面,用户可能已经有了技能草稿。这时,你可以直接进入评估和迭代环节。
当然,你应该始终保持灵活。如果用户说“我不需要进行一大堆评估,随便和我聊聊就行”,那就照做。
技能完成后(不过顺序可以灵活调整),你还可以运行技能描述优化器,优化技能的触发方式;我们有一个单独的脚本可以完成这件事。
明白了吗?明白了。
与用户沟通
技能创建器可能会被编程术语熟悉程度各不相同的人使用。如果你还没听说过这种趋势(这也是最近才兴起的),Claude 的强大能力正激励着水管工打开终端,也让父母和祖父母开始搜索“如何安装 npm”。另一方面,大多数用户的计算机知识可能都比较丰富。
因此,请留意上下文线索,判断该如何措辞!一般来说,可以参考以下建议:
- “评估”和“基准测试”这两个词比较专业,但可以使用
- 对于“JSON”和“断言”,除非用户有明显迹象表明他们了解这些概念,否则使用时应加以解释
如果拿不准,简单解释一下术语也没问题;如果不确定用户是否理解,可以用简短的定义说明术语。
创建技能
明确意图
首先要了解用户的意图。当前对话中可能已经包含了用户希望固化为技能的工作流(例如,他们说“把这个变成一个技能”)。如果是这样,先从对话历史中提取相关信息——使用了哪些工具、步骤顺序、用户做过哪些更正、观察到哪些输入/输出格式。用户可能需要补充缺失信息,并应在进入下一步前确认。
- 这个技能应让 AI Agent 能够做什么?
- 什么时候应触发这个技能?(哪些用户表达或上下文)
- 预期的输出格式是什么?
- 是否应设置测试用例来验证技能是否有效?对于输出可客观验证的技能(文件转换、数据提取、代码生成、固定工作流步骤),测试用例很有帮助。对于输出较为主观的技能(写作风格、艺术创作),通常不需要测试用例。根据技能类型建议合适的默认方案,但由用户决定。
- 这个技能面向哪种工具?(Claude Code、Cursor,还是两者都支持?)
目标平台
Claude Code 和 Cursor 的 SKILL.md 格式完全相同,包括相同的 YAML frontmatter 和目录结构。主要区别:
- Claude Code 从
.claude/skills/发现技能 - Cursor 从
.cursor/skills/、.agents/skills/、~/.cursor/skills/和.claude/skills/(旧版)发现技能 - 跨平台:将技能放在
.agents/skills/中,即可让这两个工具都发现它们 - 仅限 Cursor 的字段:在 frontmatter 中设置
disable-model-invocation: true,可使技能只能通过/skill-name调用(不会自动触发)
为两个平台创建技能时,避免在技能正文中引用特定工具的功能(例如 Claude 的 Skill 工具与 Cursor 的 /skill-name 调用方式)。
访谈和调研
主动询问边界情况、输入/输出格式、示例文件、成功标准和依赖项。理清这些内容后,再编写测试提示词。
检查可用的 MCP;如果有适合调研的 MCP(用于搜索文档、查找类似技能、了解最佳实践),且可使用子 Agent,则并行调研;否则直接进行调研。提前准备好相关背景信息,减轻用户负担。
编写 SKILL.md
根据用户访谈,填写以下部分:
- name:技能标识符
- description:何时触发以及技能的作用。这是主要的触发机制——同时说明技能的作用和具体适用场景。所有“何时使用”的信息都应放在这里,而不是正文中。注意:目前 AI Agent(Claude 和 Cursor)都倾向于“触发不足”——在技能有用时也不使用。为解决这个问题,请让技能描述更具主动性。例如,与其写“如何构建一个简单、快速的仪表板来展示 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
示例模式——加入示例很有帮助。可以按以下格式编写(不过,如果示例中使用了“Input”和“Output”,也可以稍作调整):
## 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:在同一轮中启动所有运行(使用技能和基准运行)
对每个测试用例,启动两次运行——一次使用技能,一次不使用技能。
在 Claude Code 中(使用子代理):在同一轮中启动所有运行,让它们大致同时完成。不要先启动使用技能的运行,之后再启动基准运行。
在 Cursor 中(没有子代理):按顺序运行测试用例——先阅读技能,再针对每个测试提示词遵循其说明。这种方式不够严谨,但人工审查环节可以弥补这一点。
使用技能的运行:
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/),然后让基准子代理使用该快照。将结果保存到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:运行完成后,记录计时数据
每当子代理任务完成时,你会收到包含 total_tokens 和 duration_ms 的通知。立即将这些数据保存到运行目录中的 timing.json:
{
"total_tokens": 84852,
"duration_ms": 23332,
"total_duration_seconds": 23.3
}
这是记录这些数据的唯一机会——数据通过任务通知传递,不会保存在其他地方。通知到达时应逐条处理,不要等到最后批量处理。
第 4 步:评分 — 使用 agents/grader.md,而不是自定义脚本
程序化检查(文件是否存在、行数、字符串匹配)很有用,可以作为补充,但它们只能检查结构是否符合要求。评分 Agent 能发现脚本无法发现的问题:内容质量、主张核实,以及会造成虚假信心的薄弱断言。技能可以在正确的位置生成所有文件,但内容仍可能非常糟糕——评分 Agent 就是用来发现这一点的。每次运行的 grading.json 文件都生成之前,切勿生成查看器或基准测试。
所有运行完成后:
-
为每次运行评分 — 启动评分子 Agent(或直接评分),让它读取
agents/grader.md并根据输出评估每项断言。将结果保存到每个运行目录中的grading.json。grading.json中的 expectations 数组必须使用text、passed和evidence字段(不能使用name/met/details等其他字段)——查看器依赖这些确切的字段名。可以将程序化检查作为评分 Agent 的补充(脚本更快,也便于重复执行文件是否存在或行数等检查),但它们不能取代评分 Agent——始终先运行评分 Agent,进行定性评估。 -
汇总为基准测试 — 在 skill-creator 目录中运行汇总脚本:
python -m scripts.aggregate_benchmark <workspace>/iteration-N --skill-name <name>该脚本会生成
benchmark.json和benchmark.md,其中包含每种配置的 pass_rate、time 和 tokens,以及均值 ± 标准差和差值。如果手动生成 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>。**无头环境:**如果
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
改进技能
这是整个循环的核心。你已经运行了测试用例,用户也已查看结果,现在你需要根据他们的反馈改进技能。
如何思考改进
-
从反馈中总结规律。 这里正在发生的事情,从大局来看,就是要创建一种可反复使用数百万次(也许真的会有那么多,甚至更多)的技能,用于许多不同的提示词。你和用户在这里反复迭代少数几个示例,只是为了加快进度。用户对这些示例了如指掌,也能快速评估新的输出。但如果你和用户共同开发的技能只适用于这些示例,那它就毫无用处。与其做琐碎、过度拟合的改动,或加上令人窒息的严格要求,如果某个问题一直难以解决,不妨尝试换一种比喻,或推荐不同的工作模式。尝试的成本相对较低,说不定就能找到绝佳方案。
-
让提示词保持精简。 删除没有实际作用的内容。确保阅读完整对话记录,而不只是最终输出——如果技能似乎让模型浪费大量时间做无用功,可以尝试删掉导致这种情况的部分,看看效果如何。
-
解释原因。 尽力说明要求模型做每件事背后的原因。如今的大模型很聪明。它们有很强的心智理论能力,只要配备合适的引导机制,就能超越机械执行指令,真正把事情做好。即使用户的反馈简短或带有不满,也要努力理解任务本身、用户为什么这样写,以及他们实际写了什么,然后把这种理解融入指令中。如果你发现自己在用全大写的 ALWAYS 或 NEVER,或采用非常僵化的结构,这就是一个警示信号——如果可能,换一种表述方式,解释理由,让模型理解你提出该要求的重要性。这种做法更人性化、更有力,也更有效。
-
留意测试用例之间重复的工作。 阅读测试运行的对话记录,看看子 Agent 是否都独立编写了类似的辅助脚本,或采取了相同的多步骤方法。如果 3 个测试用例都导致子 Agent 编写了
create_docx.py或build_chart.py,这就是一个强烈信号,说明技能应该将该脚本打包进去。只需编写一次,将其放入scripts/,并告诉技能使用它。这样一来,今后的每次调用都不必重新造轮子。
这项任务相当重要(我们正努力每年创造数十亿美元的经济价值!),而思考时间并不是瓶颈;请花些时间认真推敲。我建议先写一份修订草稿,再重新审视并加以改进。请尽最大努力设身处地理解用户的想法,弄清楚他们想要和需要什么。
迭代循环
改进技能后:
- 将改进应用到技能中
- 在新的
iteration-<N+1>/目录中重新运行所有测试用例,包括基线运行。如果你在创建新技能,基线始终为without_skill(不使用技能),并且在后续迭代中保持不变。如果你在改进现有技能,请自行判断适合使用哪种基线:用户最初提供的版本,或上一轮迭代的版本。 - 启动评审器,并通过
--previous-workspace指定上一轮迭代 - 等待用户审阅并告知你审阅已完成
- 阅读新的反馈,再次改进,然后重复
持续进行,直到:
- 用户表示满意
- 所有反馈均为空(结果看起来都不错)
- 你已无法取得实质性进展
高级:盲测比较
如果你想更严谨地比较技能的两个版本(例如,用户询问“新版本真的更好吗?”),可以使用盲测比较系统。详情请阅读 agents/comparator.md 和 agents/analyzer.md。基本思路是:将两个输出交给一个独立 Agent,但不告知它们分别对应哪个版本,让它判断质量。然后分析胜出版本的原因。
这是可选流程,需要使用子 Agent,大多数用户都用不到。人工评审循环通常就足够了。
描述优化
SKILL.md frontmatter 中的 description 字段是决定 Claude 是否调用某项技能的主要机制。创建或改进技能后,可以提出优化 description,以提高触发准确率。
第 1 步:生成触发评估查询
创建 20 条评估查询,混合应触发和不应触发的查询。保存为 JSON:
[
{"query": "the user prompt", "should_trigger": true},
{"query": "another prompt", "should_trigger": false}
]
查询必须真实可信,是 Claude Code 或 Cursor 用户确实会输入的内容。不要写抽象请求,而要写具体、明确且细节充分的请求。例如,包含文件路径、用户工作的个人背景、列名和值、公司名称、URL 等信息。加上一点背景介绍。有些查询可以使用小写、缩写、拼写错误或口语化表达。查询长度应有所变化,并重点关注边缘情况,而不是只写一眼就能判断的情形(用户之后有机会确认这些查询)。
不佳:"格式化这些数据"、"从 PDF 中提取文本"、"创建图表"
较佳:"嗯,我老板刚发给我一个 xlsx 文件(在下载文件夹里,文件名好像是“Q4 sales final FINAL v2.xlsx”),她想让我加一列,用百分比显示利润率。收入应该在 C 列,成本在 D 列吧"
对于应触发的查询(8–10 条),要考虑覆盖范围。对同一意图使用不同的表达方式,有些正式,有些口语化。加入用户没有明确提及技能名称或文件类型,但显然需要该技能的情形。也加入一些少见的用例,以及该技能与其他技能存在竞争、但本技能应胜出的情形。
对于不应触发的查询(8–10 条),最有价值的是那些差一点就会触发的查询:它们与该技能共享关键词或概念,但实际需要的是其他东西。考虑相邻领域、措辞含糊且容易被简单关键词匹配误触发的情形,以及查询涉及该技能能处理的内容、但更适合使用其他工具的情形。
关键是避免:不要让不应触发的查询明显无关。把“写一个斐波那契函数”作为 PDF 技能的负面测试太容易了——这样的测试毫无检验价值。负面测试应当真正具有迷惑性。
步骤 2:与用户一起审阅
使用 HTML 模板向用户展示评估集以供审阅:
- 从
assets/eval_review.html读取模板 - 替换占位符:
__EVAL_DATA_PLACEHOLDER__→ 评估项目的 JSON 数组(不要加引号——这是一个 JS 变量赋值)__SKILL_NAME_PLACEHOLDER__→ 技能的名称__SKILL_DESCRIPTION_PLACEHOLDER__→ 技能当前的描述
- 写入临时文件(例如
/tmp/eval_review_<skill-name>.html)并打开:open /tmp/eval_review_<skill-name>.html - 用户可以编辑查询、切换 should-trigger、添加/删除条目,然后点击“Export Eval Set”
- 文件会下载到
~/Downloads/eval_set.json——如果有多个版本(例如eval_set (1).json),请检查 Downloads 文件夹并找到最新版本
这一步很重要——糟糕的评估查询会导致糟糕的描述。
步骤 3:运行优化循环
API 密钥前置条件: 运行前确保凭据已加载。按照上文 API Credentials 部分的步骤操作——检查环境变量、加载 .env,或在缺少文件时请用户创建一个。
告诉用户:“这会花一些时间——我会在后台运行优化循环,并定期查看进度。”
将评估集保存到工作区,然后在后台运行:
source .env && python -m scripts.run_loop \
--eval-set <path-to-trigger-eval.json> \
--skill-path <path-to-skill> \
--model ${SKILL_MODEL} \
--platform <claude|cursor> \
--max-iterations 5 \
--verbose
使用 .env 中的 $SKILL_MODEL。如果未设置,则回退到系统提示词中的模型 ID(即当前会话所用的模型),这样触发测试才能匹配用户实际体验。对于 Cursor 技能,设置 --platform cursor(使用 LLM 模拟,而不是 claude -p CLI)。
运行期间,定期查看输出末尾,向用户更新当前迭代次数和分数情况。
此操作会自动处理完整的优化循环。它会将评估集拆分为 60% 训练集和 40% 留出测试集,评估当前描述(每个查询运行 3 次,以获得可靠的触发率),然后调用 Claude 并启用扩展思考,根据失败情况提出改进方案。它会在训练集和测试集上重新评估每个新描述,最多迭代 5 次。完成后,它会在浏览器中打开一份 HTML 报告,展示各轮迭代的结果,并返回包含 best_description 的 JSON——根据测试集分数而非训练集分数进行选择,以避免过拟合。
技能触发机制
了解触发机制有助于设计更好的评估查询。技能会以名称和描述的形式出现在 Agent 的 available_skills 列表中,Agent 会根据描述决定是否查阅某项技能。需要注意的是,AI Agent 只会在无法轻松自行处理任务时查阅技能——像“读取此 PDF”这样简单、只需一步的查询,即使描述完全匹配,也可能不会触发技能,因为 Agent 可以直接使用基础工具处理。描述匹配时,复杂、多步骤或专业化的查询则能可靠地触发技能。
这意味着评估查询应该足够实质,让 Claude 确实能从查阅技能中受益。像“读取文件 X”这样的简单查询不是好的测试用例——无论描述质量如何,它们都不会触发技能。
步骤 4:应用结果
从 JSON 输出中取出 best_description,并更新技能 SKILL.md 的 frontmatter。向用户展示修改前后的内容,并报告分数。
打包并展示(仅当 present_files 工具可用时)
检查你是否可以使用 present_files 工具。如果不能,请跳过此步骤。如果可以,请打包技能并向用户展示 .skill 文件:
python -m scripts.package_skill <path/to/skill-folder>
打包完成后,告知用户生成的 .skill 文件路径,以便他们安装。
Cursor 专用说明
在 Cursor 中运行时:
- 核心工作流相同:起草、测试、审查、改进、重复。
- Cursor 没有子 Agent。请按顺序运行测试用例——先阅读技能的 SKILL.md,然后按照其中的说明,逐个自行完成测试提示词。
- 所有 Python 脚本(
run_eval、run_loop、improve_description、package_skill)都使用--platform cursor。 - 描述优化使用 LLM 模拟,而非 CLI 测试。模拟会询问模型:“根据此查询,你会调用这项技能吗?”——这种方式可用于比较不同描述的相对效果,但无法完美代表 Cursor 的实际运行行为。
- Cursor 支持
disable-model-invocation: truefrontmatter 字段——对于只能通过/skill-name调用、绝不应由 Agent 自动触发的技能,请设置此字段。 - 盲测比较需要子 Agent——在 Cursor 中跳过。
- 打包方式完全相同。将生成的技能文件夹放入
.cursor/skills/(跨平台使用.agents/skills/)。 - 生成 eval 查看器时,如果你的 Cursor 环境中无法使用
webbrowser.open(),请使用--static <output_path>。
参考文件
agents/ 目录包含专用子 Agent 的说明。需要启动相关子 Agent 时,请阅读这些说明。
agents/grader.md— 如何根据输出评估断言agents/comparator.md— 如何对两个输出进行盲测 A/B 比较agents/analyzer.md— 如何分析某个版本胜出的原因
references/ 目录包含其他文档:
references/schemas.md— evals.json、grading.json 等文件的 JSON 结构
再强调一次核心循环:
- 弄清技能的用途
- 起草或编辑技能
- 让能够访问该技能的 Agent 根据测试提示词运行
- 与用户一起评估输出:
- 创建 benchmark.json 并运行
eval-viewer/generate_review.py,帮助用户审查输出 - 运行量化评估
- 创建 benchmark.json 并运行
- 重复上述过程,直到你和用户都满意
- 打包最终技能并交付给用户。
如果你有 TodoList,请添加这些步骤,确保不会忘记。
祝你好运!