第14部分. 通过 Qwen Code 技能构建自己的工作流程
当你多次重复某个功能规格说明的提示词后,就该将其自动化了。在 Qwen Code 中,代理技能(agent skills)非常适合这一用途。技能是一个包含 SKILL.md 文件的目录,其中描述了代理应在何时以及如何应用特定流程。技能可以是个人技能或项目技能。
个人技能:
~/.qwen/skills/feature-spec/SKILL.md
项目技能:
.qwen/skills/feature-spec/SKILL.md
对于团队来说,项目技能更好:它可以进入 Git,成为工程流程的一部分。
如果你的项目同时使用多个不同的代理,可以用仓库根目录下的 AGENTS.md 文件来补充技能——这是一个跨代理的规则标准,不仅 Qwen Code 可以读取,其他兼容工具也能读取。关于 AGENTS.md 与 QWEN.md 的更多内容,请参阅第15部分。
创建技能
mkdir -p .qwen/skills/feature-spec
SKILL.md:
---
name: feature-spec
description: 从路线图的下一个未完成阶段创建新的 SDD 功能规格说明。在开始下一个功能、编写规格说明或为实施准备新阶段之前使用。
---
# 功能规格说明
## 流程
1. 阅读 specs/roadmap.md。
2. 找到第一个未完成的阶段。
3. 创建名为 phase-N-kebab-name 的分支。
4. 在写入文件之前,向用户提出恰好三组问题:
- 边界;
- 决策;
- 上下文。
5. 阅读 specs/mission.md 和 specs/tech-stack.md。
6. 创建 specs/YYYY-MM-DD-feature-name/ 目录。
7. 写入:
- requirements.md
- plan.md
- validation.md
8. 不要实现代码。
## 文件 requirements.md
包含边界、边界外的事项、决策、上下文和未解决的问题。
## 文件 plan.md
使用编号任务组。每个任务组应可单独验证。
## 文件 validation.md
包含自动检查、手动验证、偏差检查和就绪标准。
## 限制
- 遵守 specs/tech-stack.md。
- 未经明确批准不得添加依赖。
- 保持阶段可独立交付。
- 不编辑无关文件。
验证技能
启动 Qwen Code:
qwen
查看列表:
/skills
明确要求:
使用 feature-spec 技能,从路线图开始下一个功能。
不要实现代码。
如果技能未生效,请检查:
- 文件是否位于
.qwen/skills/feature-spec/SKILL.md; - YAML 头部是否以
---开头和结尾; name是否不含空格;description是否明确说明了何时使用该技能;- 创建技能后是否重新启动了 Qwen Code。
技能与斜杠命令
技能由模型调用或通过 /skills 调用;它描述的是一种能力。斜杠命令由用户显式调用。对于 SDD 中的功能规格说明,技能更方便:当用户说"开始下一个功能"时,代理可以自行判断需要使用该技能。
如果你的团队需要严格的界面,可以额外创建用户命令,但开始时技能就足够了。
辅助文件
当流程增长时,将模板提取出来:
.qwen/skills/feature-spec/
SKILL.md
templates/
requirements.md
plan.md
validation.md
在 SKILL.md 中:
使用 templates/requirements.md 作为初始结构。
不要将模板中的注释复制到最终规格说明中。
变更日志技能
第二个有用的技能:
.qwen/skills/changelog/SKILL.md
示例:
---
name: changelog
description: 根据 Git 历史和当前分支的变更,在功能分支合并前更新 CHANGELOG.md。
---
# 变更日志
1. 查看 git log 和相对于 main 的 git diff。
2. 创建或更新 CHANGELOG.md。
3. 使用带日期的标题。
4. 撰写简洁的要点,让利益相关者易于理解。
5. 不包含嘈杂的内部细节。
升级规则:代理何时必须停止
好代理与坏代理的区别不在于更聪明,而在于知道何时停止并询问。默认情况下,大多数 CLI 代理不惜一切代价完成任务:如果上下文不足,它们就会猜测。这对短任务是有用的特性,但对 SDD 工作来说是有害的。
为了防止代理猜测,可以在 QWEN.md(或技能中)设置明确的升级规则:
在以下情况下停止并询问用户,不要采取行动:
- 如果功能规格说明中的某个要求存在不同解读;
- 如果你要更改当前规格说明边界之外的文件;
- 如果你要添加 tech-stack.md 中未指定的新依赖;
- 如果你要更改 tech-stack.md、mission.md 或 roadmap.md;
- 如果需要执行影响范围非平凡的迁移、drop、delete 或 rm;
- 如果你找不到用户引用的文件;
- 如果结果与 validation.md 中的事实不符,且该事实未标记为"延后";
- 如果用户的请求与 QWEN.md 中先前接受的规则相矛盾。
在每种情况下,输出简短说明,指出具体哪里不明确,
并提供 2-3 个具体选项供选择。不要替用户做决定。
这不是"礼貌"。这是契约:一旦遇到列表中的条件,代理必须将控制权交还给人类。同样的规则还可以通过 Stop 钩子进一步强化(参见第17部分),防止代理在默默做出有争议的决定后完成任务。
上下文卫生与成本
每个长会话都有双重代价:token 和质量。会话越长,代理积累的旧上下文越多,越容易意外将相邻任务的解决方案带入当前任务。在长会话中,研究论文中称之为"上下文退化"(context rot)的现象很明显:聚焦的短输入比大量不相关的输入效果更好。同样的原则也适用于代理的受控内存——更多内容请参阅第19部分。
几条简单的卫生规则:
- 在角色切换之间使用
/clear(访谈 → 实现 → 验证 → 重新规划); - 限制单个会话的时长;如果会话超过一小时,很可能该结束它并开启一个干净的会话;
- 如果可以提供具体文件,就不要给代理整个文件夹;
- 对于长任务,显式使用
@file,而不是"让它自己找"; - 如果怀疑有混淆——使用
/clear,重新阅读QWEN.md和活动规格说明。
如果 Qwen Code 启用了自动上下文压缩选项,它有帮助,但不能替代 /clear。压缩保留历史摘要——这对长连续任务有用,但正是摘要常常成为下一个任务的错误提示来源。/clear 确保在新角色中,代理只使用仓库中记录的内容。
实践
- 创建
.qwen/skills/feature-spec/SKILL.md。 - 重新启动 Qwen Code。
- 调用
/skills。 - 通过技能创建新的功能规格说明。
- 创建变更日志技能。
- 在合并前使用变更日志技能。
检查问题
- 可重复的请求何时应该成为技能?
- 为什么项目技能比个人技能更适合团队流程?
description中应该包含什么,以便代理能正确找到技能?