skill-creator

当学生说"我想做一个自己的技能"、"每次都要重复交代同样的要求"、"能不能把这套流程固定下来"、"帮我改一下我那个技能"时使用。先判断他手上已经有什么(一句想法 / 一段聊过的流程 / 一份写坏的草稿),从当前对话里能抠出来的答案就不要再问,查清运行时可声明的能力后直接写出一版完整可跑的 SKILL.md,只把剩下的关键分歧用一张选择题卡问完,改定后出确认卡存进技能库。

SKILL.md

GitHub

做一个自己的技能 / Skill Creator

把学生反复用到的一套做法,变成一份能真正跑起来的 SKILL.md。

技能不是"给 AI 的一段说明",是一份可执行的规格:它决定 agent 在什么时候被唤起、 能碰哪些数据、按什么步骤走、哪些事不许做。

先定位,别从头走流程

学生来的时候手上已经有东西了,位置不同,起点就不同:

他手上有 从哪一步开始
一句想法("想做个错题整理的技能") 第 1 步,走完整流程
刚才这段对话本身("把你刚才那套做法存下来") 直接进第 2 步写草稿——流程就在上面,别再问一遍
一份自己写的草稿 跳到第 3 步,指出问题并改,不要推倒重写
一个已存在的技能要改 read_skill 读回来,只改他要改的部分,version 照「字段怎么定」升一级

最费时间的错误是不管他在哪一步,都从"你想做个什么技能"开始问。

尤其是第二种:学生说"把刚才那套存下来"时,触发场景、流程、边界基本都在上文里—— 他纠正过你哪几次、你读了什么、他嫌你多做了什么,这些就是这个技能要写的东西。 先把这些抠出来,只补真正空着的格子。

何时使用 / When to use

  • 学生发现自己反复在交代同一套要求("每次都要提醒你先看我的课表")
  • 刚聊完一段他满意的流程,想固定下来
  • 他有一套自己的方法想固定(错题整理的流程、面试准备的清单)
  • 他想改自己之前做的某个技能

不适用于 / Not for:

  • 只是想让 AI 这一次按某种方式回答 —— 直接说就行,不必做成技能
  • 想要的能力运行时根本没有(比如收发邮件)—— 技能只能调用已有能力, 做不出新能力。这种情况如实说,别写一个跑不起来的壳

流程 / Process

1. 查能力 + 抠现成答案

调 list_capabilities,记住有哪些读能力、哪些提案能力、哪些提问能力。 这一步在动笔之前,不能省——能力名是运行时定的,凭印象写会声明出一个不存在的名字, 那个技能装上去就是坏的。没有这个工具时也不要凭印象补,按下文「没有这些工具时(降级)」不声明能力。

同时把上文里已有的答案抠出来:他说过的原话、走过的步骤、纠正过你的地方。

学生说"我想要个类似 X 的"、或者已有技能与他要的重叠时,用 read_skill 读 X 当范本。 读参考技能不会把你切走——本 skill 声明了 read_skill,运行时据此把这类读取当查资料处理: 能力面不变,propose_skill / ask_user / list_capabilities 都还在,读完继续走下面的流程。 不要因为看到了别的 skill 的正文就改按它的流程走。 (学生如果是真想改用那个技能,让他点输入框上那张卡右侧的 ✕ 退出本技能,再重新说一次。)

2. 直接写出完整第一版

按下面的骨架写一份完整的 SKILL.md 贴给他看。拿不准的按最保守的选项定并标出来:

  • 拿不准要不要写库 → 不声明 capabilities(缺省即只读,最安全)
  • 拿不准触发场景 → 用他自己的措辞写 description,标注"这句最关键"
  • 拿不准边界 → 先写三条通用的(不代写、不编造、不替他做决定),标注待确认

不要贴填空模板让他填。贴一份能跑的完整草稿。

3. 同一轮把剩下的分歧一次问完

调 ask_user,最多 4 问,只问上文里没有、而且会改变技能形状的:

问什么 为什么值得占一问 选项举例
什么时候该自动派上用场 description 是 agent 判断触发的唯一依据,写空了这技能永远不会被想起来 我说要用才用 / 每周固定时候 / 遇到某类情况自动
要不要能改你的数据 决定 capabilities 的形状,也决定用户看到多大的授权面 只看不改 / 可以帮我加事项 / 可以帮我存文档
绝对不许做什么 好技能与坏技能的差别多半在边界上,而作者一开始想不到写边界 不替我做决定 / 不编造我没说过的 / 不代写文书 / 都要

上文里已经有答案的就别问。三问全有答案就直接跳到第 4 步。 不要问"这样可以吗""要不要我写出来"——草稿已经在他眼前了。

4. 改定并出卡

按答案调整,然后调 propose_skill。卡片会显示解析结果与授权范围, 解析不过会列出错误——照着错误改,再提一次。 不要在出卡前再问一句"确认要保存吗",卡片本身就是那次确认。

怎么写 description —— 这一段决定技能有没有用

description 是 agent 唯一的触发依据。写不好,技能存进去也永远不会被想起来。

已知的失败方向是"不触发",不是"乱触发"。 所以要写得主动一点: 不只写它做什么,还要写学生会说的哪些话应该唤起它,把原话直接塞进去。

弱:整理错题
强:当学生说"这次考试错了好几道"、"帮我看看错题"、"这题我又错了"时使用。
    把错题按知识点归类,标出重复错的那几个点,产出一份可存档的错题整理。
    只整理他给出的题,不编题也不代解。

写完自查一遍:说三句他真会说的话,对着 description 看会不会命中。 命不中就把那三句的措辞加进去。

正文怎么写

  • 用祈使句:"先读事项" 而不是 "应该先读一下事项"
  • 解释为什么,别堆全大写的 MUST。模型有判断力,告诉它这条规则在防什么, 它能处理你没写到的情况;只给一条硬命令,它在边界上就只会照字面办。 写着写着出现"绝对必须""严禁"时停一下,多半可以换成一句"因为……"
  • 边界要具体:"不代写文书" 比 "保持诚信" 有用一百倍
  • 先写完再回头看。写完通读一遍,删掉那些不出力的句子—— 正文越长模型越容易抓错重点

SKILL.md 骨架 / Skeleton

---
name: <kebab-case,和技能同名>
description: <当学生说"…"、"…"时使用。做什么、不做什么。写满信息,这是 agent 的判断依据>
category: <大类,如 study-planning>
version: 0.1.0
status: draft
priority: P0
compatible_agents:
  - claude-code
  - nestudy
  - generic-llm-agent
display_name: <中文名,界面上显示的>
capabilities:          # 不写 = 只读。要写库才列,且只列真正用到的
  - <来自 list_capabilities>
outputs:
  - <chat / document / canvas / event>
max_rounds: <1-100>
suggest_hint: <一句话,运行时主动建议时说的>
---

# <中文名 / English name>

<一两句话说清楚它做什么。>

## 何时使用
- <具体场景>

**不适用于**:
- <边界外的场景,指向别的技能>

## 流程
1. <步骤,写清楚每步读什么、产出什么。默认先做出东西再问>

## 输出格式
<给个模板>

## 边界
- **不…**:<理由>

字段怎么定 / Fields

  • 只读的流程别声明 capabilities——不写就是只读,这是最安全的默认值
  • 要写库才声明,且只声明真正用到的。多声明不会更强,只会让用户看到不必要的授权
  • outputs 要和 capabilities 对上:document 要有 propose_artifact, canvas 要 propose_canvas,event 要 propose_events
  • max_rounds 给够但别虚高:一次问完再产出的流程 20 上下够用, 一问一答的访谈类要到 50 以上。给 100 不会更强,只会让它有机会绕远路
  • 这个技能自己要不要问用户?要就声明 ask_user,并在正文里写清楚"先做出东西再问"
  • 改已有技能要升 version:不升的话,覆盖前后两版的版本号一样,出了问题分不清是哪一版。 新增步骤、能力或输出段升 minor(0.1.0 → 0.2.0,末位归零);只改措辞、例子或边界升 patch(0.1.0 → 0.1.1)。 原技能末尾有变更记录表的,在表格最上方加一行写明这次改了什么;没有就不必新建

输出格式 / Output

第一版草稿(与问题卡同一轮发出):

先按你说的写了一版,你看着改:

```markdown
<完整的 SKILL.md 原文>
```

**我拿不准、替你定了的:**
- <标注 1,下面问你>
- <标注 2>

没有这些工具时(降级) / Without these tools (degraded mode)

上面的流程按 nestudy 的工具写。在 Claude Code 或其他没有这些工具的环境里,流程和边界不变,只把工具换成下表的做法, 并在草稿上方写明「降级:没有 nestudy 工具,能力名没有核对,这份 SKILL.md 没有经过运行时校验」。

工具 没有时怎么做
list_capabilities 查不到能力清单,就不声明 capabilities 和 optional_capabilities(缺省只读),outputs 只写 chat;原本要写库的步骤改成"输出一张 Markdown 卡片请使用者自己保存"。学生贴出了他那个运行时的能力清单,才可以从清单里挑名字
read_skill 请学生把要改的那份 SKILL.md 原文贴进来;拿不到原文就不动手,不凭记忆重写
ask_user 在对话里直接问:同样最多 4 问、每问给选项,一次问完,然后停下等他回答
propose_skill 把定稿的完整 SKILL.md 放进一个代码块交给学生,请他自己保存或导入他用的运行时,并写明这个技能能不能改他的数据;不说"已保存"

交出之前,把 propose_skill 平时替你查的几项自己核一遍:frontmatter 用 --- 包住,每行是「键: 值」或「- 列表项」; name 是小写 kebab-case;description 只占一行;version 是三段数字;category、status(新建写 draft)、 priority、compatible_agents 都在;正文不为空;outputs 与 capabilities 对得上(见「字段怎么定」)。

边界 / Boundaries

  • 不编造能力名:capabilities 里的每一个都必须来自 list_capabilities 的返回。 拿不准就再查一次。写错了那个技能装上去就是坏的。
  • 不替学生想需求:草稿是让他改的靶子,不是替他决定。 每一处你自己拿的主意都要标出来,别混在正文里假装是他的意思。
  • 不重问上文已经答过的:他刚说过的话再问一遍,比不问更让人烦。
  • 不省略边界那一问:没有边界的技能等于没有约束的 agent。
  • 不夸大:技能只能调用已有能力。学生要的做不到就直说,不要写一份看起来能跑、 实际调不到工具的规格。
  • 不代替确认:写完必须走 propose_skill 出卡(没有这个工具就交 Markdown 卡片,由他自己保存),由学生自己看过授权范围再存。
  • 写自己的边界也要老实:生成的技能会写库时,在草稿里明确告诉他"这个技能能改你的数据"。
  • 不写会伤人的技能:诱导学生造假申请材料、伪装成他本人对外发言、绕过学校规定的, 一律拒绝并说明理由。"扮演某个角色陪我练面试"这类没问题。

Token 控制 / Token discipline

  • list_capabilities 一次调完,不要每写一个字段查一次
  • 草稿只贴完整的这一次;改定后只贴改动的那几行 + 最后 propose_skill 那一份
  • 问题一次问完。运行时对连续追问有硬上限,一次一问会在写完之前就把额度用光

变更记录 / Changelog

版本 日期 变更 类型
0.3.2 2026-09-26 用例 Case 4 要求改技能时升版本、正文没教:「字段怎么定」补按 minor / patch 升 version 并在原有变更记录表最上方加行;声明兼容 claude-code 却没有降级路径,补「没有这些工具时(降级)」:无 list_capabilities 不声明能力,无 propose_skill 交 Markdown 卡片由学生自己保存 patch
0.3.1 2026-08-05 写明「读参考技能不会把你切走」:运行时已按声明把这类读取当查资料,能力面不变——实测模型读了一份范本之后以为自己改按那份流程走了 patch
0.3.0 2026-08-05 参考 Claude 官方 skill-creator 收敛轮数:新增「先定位学生在哪一步」(尤其"把刚才那套存下来"应直接从上文抠答案而不是重问一遍)、description 主动写法与三句自查、正文写作规范(祈使句 / 解释 why 而非全大写 MUST / 写完删冗句);max_rounds 60 → 20 minor
0.2.0 2026-08-04 转向先产出:查完能力直接写出完整草稿贴给学生改,关键分歧用 ask_user 一次问完;取消"一次只问一件事"的访谈式流程 minor
0.1.0 2026-08-04 初始草稿 minor