$npx -y skills add agentscope-ai/QwenPaw --skill make-skill-zh用于把当前会话沉淀为可复用的 workspace skill。当用户希望把当前对话、工作流或排错路径写成 SKILL.md 时触发。触发表达包括「把这个变成 skill」「记住我是怎么做 X 的」「保存这个工作流」「make a skill from this」以及任何 /make-skill <focus> 调用。
| 1 | <!-- |
| 2 | 参考 Anthropic 的 `skill-creator` skill(尤其 "creating a skill" 部分), |
| 3 | 为 QwenPaw 改写。 |
| 4 | Credit: https://github.com/anthropics/skills/blob/main/skill-creator/SKILL.md |
| 5 | --> |
| 6 | |
| 7 | # Make Skill |
| 8 | |
| 9 | 把当前会话沉淀为可复用的 workspace skill。 |
| 10 | |
| 11 | 你自己编排两阶段流程: |
| 12 | |
| 13 | * **Phase A.** 提出一份精简的计划,让出 turn 等用户 approve。 |
| 14 | * **Phase B.** 用户 approve 后,基于 THIS 会话撰写完整 SKILL.md 正文, |
| 15 | 通过 `materialize_skill` 持久化。 |
| 16 | |
| 17 | **不要**用 `write_file` 直接创建 SKILL.md 或其附属文件(脚本、JSON |
| 18 | 等)。所有文件的首次创建必须走 `materialize_skill`(通过 `body` 和 |
| 19 | `extra_files` 参数),它会跑安全扫描并原子写入 manifest。创建成功后, |
| 20 | 如需修改可以使用 `edit_file` 编辑已有文件。 |
| 21 | |
| 22 | ## 步骤 0. 确定 focus、派生 skill 名 |
| 23 | |
| 24 | ### 0a. 确定 focus |
| 25 | |
| 26 | 两种触发入口: |
| 27 | |
| 28 | * `/make-skill <focus>`。focus 紧跟在命令后面。 |
| 29 | * 自然语言(「把这个变成 skill」「保存这个工作流」「把刚才的 X 流程 |
| 30 | 变成 skill」「make a skill from this」)。从用户想保存的对话主题里 |
| 31 | 提炼一个简短 focus 短语。如果模糊,先问一句澄清。 |
| 32 | |
| 33 | ### 0b. 派生 skill 名 |
| 34 | |
| 35 | 按**这条规则**从 focus 派生 skill 名: |
| 36 | |
| 37 | ``` |
| 38 | skill_name = "-".join(focus.split()) |
| 39 | ``` |
| 40 | |
| 41 | 内部空白(空格、tab、全角空格、连续空格)折叠成单个 `-`。其他字符 |
| 42 | 原样保留。 |
| 43 | |
| 44 | 例子: |
| 45 | |
| 46 | * `cooking` → `cooking` |
| 47 | * `view image debug` → `view-image-debug` |
| 48 | * `烹饪 食谱` → `烹饪-食谱` |
| 49 | * `Stock Price` → `Stock-Price`(大小写保留) |
| 50 | |
| 51 | 这个 `skill_name` 在以下场合**保持一致使用**:步骤 1 的 `plan.name`、 |
| 52 | 步骤 3 的 `materialize_skill` 的 `name=` 参数。 |
| 53 | |
| 54 | ## 步骤 1. 提出计划,让出 turn 等用户 approve |
| 55 | |
| 56 | 调用 `create_plan`,**四个必填参数**(`name`、`description`、 |
| 57 | `expected_outcome`、`subtasks`)都要给: |
| 58 | |
| 59 | * **`name`**:步骤 0 中标准化的 `skill_name`。 |
| 60 | * **`description`**:精简 preview(这是用户审核的内容),两部分: |
| 61 | * **Part 1:触发预览。** 2 到 4 句话,日常语言。必须覆盖三点: |
| 62 | * **Goal.** 这个 skill 产生什么端到端结果。 |
| 63 | * **Trigger.** 哪些用户表达和场景应该触发它。稍微 push 一些 |
| 64 | 同义词。 |
| 65 | * **I/O.** 期望什么输入,产出什么输出。 |
| 66 | 这里不是 SKILL.md frontmatter 格式,frontmatter 后面再 distill。 |
| 67 | * **Part 2:步骤大纲与 batch 规划。** 两部分内容: |
| 68 | * **步骤大纲。** 编号列表,每行一个简短动词短语。不写细节、不写 |
| 69 | 参数、不写错误处理、不写 sub-bullet、不写 `##` 子标题。只给出 |
| 70 | 形状,让用户能快速判断顺序和范围。步骤名要从 THIS 会话里实际 |
| 71 | 发生的事情里提取。不要编造;会话里没依据的就省略。 |
| 72 | 格式示例(**不要**抄这个内容): |
| 73 | ``` |
| 74 | 1. <verb phrase, ~5-10 words> |
| 75 | 2. <verb phrase, ~5-10 words> |
| 76 | 3. <…> |
| 77 | ``` |
| 78 | * **Batch 规划。** 简要说明如何将上述步骤组织成 `run_tool_batch` |
| 79 | 的 JSON 文件: |
| 80 | * 哪些步骤可以串成一个 batch(或需要拆成多个 batch 文件)。 |
| 81 | * 哪些中间环节原本需要 agent 介入判断,但实际上可以通过编写 |
| 82 | 脚本(正则匹配、关键词筛选、JSON 解析等)来替代,从而减少 |
| 83 | agent 交互次数,让更多步骤纳入自动化 batch。 |
| 84 | * 列出预计需要的文件清单,如: |
| 85 | ``` |
| 86 | scripts/main.json — 主 batch 流程 |
| 87 | scripts/parse.py — 解析 snapshot 提取目标内容 |
| 88 | ``` |
| 89 | 目标是尽可能用脚本替代 agent 的中间判断,让 skill 执行时只需 |
| 90 | 一次 `run_tool_batch` 调用即可完成,避免 agent 与工具之间的 |
| 91 | 多轮交互。这让用户在 approve 前就能看到 batch 的整体结构。 |
| 92 | * **`expected_outcome`**(plan 顶层,**必填**,与 subtask 的 |
| 93 | `expected_outcome` 不是同一个):一句具体描述整个 skill 创建的成功 |
| 94 | 状态。直接用这个字面值(替换 `<skill_name>`)即可: |
| 95 | `"A new workspace skill <skill_name> is created, enabled, and invocable via /<skill_name>."` |
| 96 | * **`subtasks`**:一个长度为 1 的列表,包含唯一一个 subtask: |
| 97 | * `name`:`"Write and materialize skill"` |
| 98 | * `description`:`"Write the SKILL.md body and call materialize_skill."` |
| 99 | * `expected_outcome`:`"Skill created and visible via /skills."` |
| 100 | |
| 101 | `plan.name` 和 `plan.description` 用**与用户最近消息相同的语言**。 |
| 102 | `expected_outcome` 保留英文即可。 |
| 103 | |
| 104 | `create_plan` 返回后,**让出 turn**。用户会回复 approve、refine 或 |
| 105 | cancel。`/plan` 模式的标准机制接管: |
| 106 | |
| 107 | * Refine:调 `revise_current_plan`,把反馈合到 name、description、或步 |
| 108 | 骤大纲里。 |
| 109 | * Cancel:调 `finish_plan` with `state="abandoned"`。 |
| 110 | |
| 111 | 向用户呈现计划时用标准 plan card 格式。**不要**在 chat 里另搞 |
| 112 | `Subtask: …` / `Focus: …` 这种自定义字段,用标准化后的 `plan.name`, |
| 113 | 不要用 raw focus。本步骤只负责提出计划并等待用户确认,**不要**在此步 |
| 114 | 调用 `materialize_skill`。 |
| 115 | |
| 116 | ### 选择执行方式 |
| 117 | |
| 118 | 用户 approve 后,询问执行方式(让出一轮 turn): |
| 119 | |
| 120 | > 计划已 approve。Phase B(撰写与持久化)要**在当前对话继续执行**, |
| 121 | > 还是**交给后台 subagent 执行**? |
| 122 | > |
| 123 | > - **当前对话**:在本轮对话中完成。适合需要反复 refine 的场景。 |
| 124 | > - **后台**:交给 subagent 完成,不阻塞当前对话。subagent 继承本会话 |
| 125 | > 完整上下文和已批准的计划。 |
| 126 | |
| 127 | **让出 turn**,等用户回复后再继续。如果用户没有明确选择,默认使用 |
| 128 | 当前对话模式。 |
| 129 | |
| 130 | * **当前对话**模式:按下方步骤 2–5 正常执行。 |
| 131 | * **后台**模式:见下方「后台执行 Phase B」小节。 |
| 132 | |
| 133 | **如果你当前已经是 subagent**(由主 agent 通过 `spawn_subagent` |
| 134 | 派生),跳过询问,直接执行步骤 2–4(主 agent 已完成 plan 收尾, |
| 135 | subagent 无需调用任何 plan 相关工具)。 |
| 136 | |
| 137 | ### 后台执行 Phase B |
| 138 | |
| 139 | Phase A(步骤 0–1)已在前台完成,用户已经 approve 了计划。现在将 |
| 140 | Phase B 交给 subagent 执行。 |
| 141 | |
| 142 | 这一步你自己**不需要**调用 `materialize_skill` 或执行任何 skill 创建 |
| 143 | 操作——只需组装 task 描述并提交给 subagent,由 subagent 完成全部后续 |
| 144 | 工作。 |
| 145 | |
| 146 | 1. 将以下信息组装成 task 描述传给 subagent: |
| 147 | - 已 approve 的 `plan.name`(`skill_name`)和计划内容 |
| 148 | - 明确指令:「基于当前会话上下文和已 approve 的计划,按 make-skill |
| 149 | 步骤 2–4 完整执行:撰写 SKILL.md 正文、调用 materialize_skill |
| 150 | 持久化、验证 batch 引用、试跑 batch。完成后报告结果。**无需调用 |
| 151 | 任何 plan 相关工具(`create_plan`、`finish_subtask`、 |
| 152 | `finish_plan`),无需等待用户 approve,直接自行完成全部流程。**」 |
| 153 | 2. 调用: |
| 154 | ``` |
| 155 | spawn_subagent( |
| 156 | task="<上述 task 描述>。无需调用任何 plan 相关工具,直接完成全部流程。", |
| 157 | fork=True, |
| 158 | background=True, |
| 159 | ) |
| 160 | ``` |
| 161 | 3. 立即对唯一的 subtask 调 `finish_subtask`,再调 `finish_plan` with |
| 162 | `state="completed"` 收尾。不需要等 subagent 完成。 |
| 163 | 4. 告知用户已提交后台任务,可通过 `check_agent_task(task_id=...)` 查看 |
| 164 | 进度。subagent 完成后会在 workspace 中创建 skill。 |
| 165 | |
| 166 | ### Plan 工具不可用时的 fallback |
| 167 | |
| 168 | 如果 `create_plan` 不在你的 toolkit 里(workspace 未启用 plan mode), |
| 169 | 退回到文本式计划: |
| 170 | |
| 171 | 1. 把同样的精简 pre |