team-skills 1.2.3 → 1.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -13,9 +13,9 @@ argument-hint: [target-dir]
13
13
 
14
14
  | 组件 | 目标位置 | 说明 |
15
15
  |------|----------|------|
16
- | Agent Skills | `~/.agents/skills/{name}` | Cursor 自动发现 |
17
- | Skill 斜杠命令 | `~/.claude/commands/{name}.md` | Claude Code `/team-{name}` |
18
- | 共享规则 | `~/.agents/skills/_team-rules/` | 被所有 Skill 引用 |
16
+ | Agent Skills (Cursor) | `~/.agents/skills/{name}` | Cursor 自动发现 |
17
+ | Agent Skills (Claude) | `~/.claude/skills/{name}` | Claude Code 自动发现 |
18
+ | 共享规则 | `~/.agents/skills/_team-rules/` + `~/.claude/skills/_team-rules/` | 被所有 Skill 引用 |
19
19
  | CLI 辅助命令 | 两端均安装 | team-setup/uninstall/pull/push |
20
20
  | Hooks(可选) | `~/.cursor/hooks/` | session-start 自动加载 |
21
21
 
@@ -14,10 +14,11 @@ argument-hint: [target-dir]
14
14
  | 组件 | 位置 |
15
15
  |------|------|
16
16
  | Cursor Skills | `~/.agents/skills/team-*` |
17
- | Claude Code Skill 斜杠命令 | `~/.claude/commands/team-*.md` |
18
- | 共享规则 | `~/.agents/skills/_team-rules/` |
17
+ | Claude Code Skills | `~/.claude/skills/team-*` |
18
+ | 共享规则 | `~/.agents/skills/_team-rules/` + `~/.claude/skills/_team-rules/` |
19
19
  | CLI 辅助命令 | 两端均移除 |
20
20
  | Hooks | `~/.cursor/hooks/`、`~/.claude/hooks/` |
21
+ | 旧路径(向后兼容) | `~/.claude/commands/team-*.md`(如存在) |
21
22
 
22
23
  ## 使用方式
23
24
 
package/README.md CHANGED
@@ -57,9 +57,19 @@ reviewAgent 发现 spec 遗漏 ──→ 自动回退 specAgent
57
57
 
58
58
  - **5 步验证协议**:确定命令 → 新鲜执行 → 完整阅读 → 检查退出码 → 声明通过
59
59
  - **9 条 Constitutional Rules**:不可覆盖的硬约束
60
- - **反规避条款**:预判 6 种常见借口并逐一反驳
60
+ - **反规避条款**:预判 9 种常见借口并逐一反驳
61
61
  - **三视角对抗审查**:攻击者/怀疑者/用户视角反向验证
62
62
 
63
+ ### 📝 规则沉淀,不是"每次从零"
64
+
65
+ - **三层规则体系**:项目级 → 模块级 → 任务级,冲突按优先级覆盖
66
+ - **消费方契约**:每条规则含触发条件 + 可执行指令 + 示例,下游 Agent 可直接执行
67
+
68
+ ### 📊 量化评估,不是"凭感觉"
69
+
70
+ - **7 硬门禁 + 24 评分项**:五维度 100 分制量化打分
71
+ - **反虚构规则**:占位符 >20% 或有效行 <10 → 判定 0 分
72
+
63
73
  ---
64
74
 
65
75
  ## 🚀 安装
@@ -83,7 +93,7 @@ npx team-skills@latest setup
83
93
  npx team-skills@latest setup --with-score
84
94
  ```
85
95
 
86
- 如需频繁使用 CLI,可全局安装:
96
+ 全局安装后可直接在终端调用:
87
97
 
88
98
  ```bash
89
99
  npm i -g team-skills
@@ -112,8 +122,8 @@ npx team-skills@latest update
112
122
 
113
123
  | 内容 | 位置 | 说明 |
114
124
  |------|------|------|
115
- | 11 个 Agent Skills | `~/.agents/skills/` | Cursor 自动发现 |
116
- | 11 个 Skill 斜杠命令 | `~/.claude/commands/` | Claude Code `/team-{name}` |
125
+ | 12 个 Agent Skills | `~/.agents/skills/` | Cursor 自动发现(team-score 需 `--with-score`) |
126
+ | 12 个 Skill 斜杠命令 | `~/.claude/commands/` | Claude Code `/team-{name}` |
117
127
  | 共享规则 | `~/.agents/skills/_team-rules/` | 被所有 Skill 引用 |
118
128
  | CLI 辅助命令 | 两端均安装 | team-setup/uninstall/pull/push |
119
129
  | Hooks(可选) | `~/.cursor/hooks/` | session-start 自动加载 |
@@ -166,10 +176,11 @@ npx team-skills@latest update
166
176
  | 已有规格,开始编码 | `/team-impl` |
167
177
  | 测试覆盖够吗? | `/team-test` |
168
178
  | 代码质量如何? | `/team-review` |
179
+ | Review 反馈来了 | `/team-feedback` |
169
180
  | 这个 bug 怎么回事? | `/team-debug` |
170
181
  | 测试真的过了吗? | `/team-verify` |
171
- | Review 反馈来了 | `/team-feedback` |
172
182
  | 代码写完了 | `/team-finish` |
183
+ | 项目做得好不好? | `/team-score` |
173
184
  | 不知道用哪个 | `/using-team-skills` |
174
185
 
175
186
  ---
@@ -229,7 +240,7 @@ flowchart TD
229
240
 
230
241
  ## 🗺️ Skill 使用地图
231
242
 
232
- > 从你的场景出发,找到对应的 Skill。实线是你主动调用,虚线是编排器自动调度。
243
+ > 从你的场景出发,找到对应的 Skill
233
244
 
234
245
  ```mermaid
235
246
  graph TD
@@ -247,8 +258,9 @@ graph TD
247
258
  Q -->|"代码就绪,需要审查"| REVIEW[🔍 team-review<br/>→ 五维审查报告]:::skill
248
259
  Q -->|"收到审查反馈"| FB[💬 team-feedback<br/>→ 修改方案]:::skill
249
260
  Q -->|"遇到 Bug"| DEBUG[🐛 team-debug<br/>→ 根因分析 + 修复]:::skill
250
- Q -->|"实现完成,准备合并"| FINISH[🏁 team-finish<br/>→ 合并/PR/清理]:::skill
251
261
  Q -->|"声称完成"| VERIFY[✅ team-verify<br/>→ 验证证据链]:::skill
262
+ Q -->|"实现完成,准备合并"| FINISH[🏁 team-finish<br/>→ 合并/PR/清理]:::skill
263
+ Q -->|"项目做得好不好"| SCORE[📊 team-score<br/>→ 量化评分报告]:::skill
252
264
  Q -->|"不知道用哪个"| USING[🧭 using-team-skills<br/>→ Skill 推荐]:::skill
253
265
  Q -->|"需要完整交付流水线"| ORCH[⚙️ team-orchestrator<br/>→ 全自动编排]:::orch
254
266
 
@@ -259,15 +271,11 @@ graph TD
259
271
  ORCH -.->|自动调度| FINISH
260
272
  ```
261
273
 
262
- **使用说明:**
263
-
264
- - **实线箭头 →**:你主动调用某个 Skill,适合只做其中一步
265
- - **虚线箭头 ⇢**:编排器自动调度,适合需要完整流水线
266
- - 每个 Skill 下方标注了它的产出物
274
+ > 实线 = 你主动调用;虚线 = 编排器自动调度。每个节点下方标注了产出物。
267
275
 
268
276
  ---
269
277
 
270
- ## 📦 包含 11 个可独立使用的 Skill
278
+ ## 📦 包含 12 个可独立使用的 Skill
271
279
 
272
280
  | Skill | 一句话说明 | 使用场景 |
273
281
  |-------|-----------|----------|
@@ -276,14 +284,15 @@ graph TD
276
284
  | `team-impl` | TDD 红-绿-重构循环实现 | "规格有了,开始写代码" |
277
285
  | `team-test` | 四维测试矩阵 + 补充测试 | "测试覆盖够吗?" |
278
286
  | `team-review` | 五维审查 + 资产沉淀 + 复盘 | "代码质量如何?" |
279
- | `team-orchestrator` | 有向图流程编排 + 分支管理,4 个人类介入点 | "我要完整交付流水线" |
280
- | `team-verify` | 5 步验证门禁,杜绝虚假通过 | "测试真的过了吗?" |
281
- | `team-debug` | 四阶段根因分析 + 修复 | "这个 bug 怎么回事?" |
282
287
  | `team-feedback` | 先验证再实施,非表演性同意 | "Review 反馈来了" |
288
+ | `team-debug` | 四阶段根因分析 + 修复 | "这个 bug 怎么回事?" |
289
+ | `team-verify` | 5 步验证门禁,杜绝虚假通过 | "测试真的过了吗?" |
283
290
  | `team-finish` | 分支完成处理(合并/PR/保留/丢弃) | "代码写完了" |
291
+ | `team-orchestrator` | 有向图流程编排 + 分支管理,4 个人类介入点 | "我要完整交付流水线" |
292
+ | `team-score` | 7 硬门禁 + 24 项五维度评分(100 分制) | "项目做得好不好?" |
284
293
  | `using-team-skills` | Meta-skill,自动引导你选正确的 Skill | "我该用哪个?" |
285
294
 
286
- > 每个 Skill 可独立使用,也可通过 `team-orchestrator` 串联成完整流水线。
295
+ > 每个 Skill 可独立使用,也可通过 `team-orchestrator` 串联成完整流水线。`team-score` 为可选评估工具,安装时需 `--with-score`。
287
296
 
288
297
  ---
289
298
 
@@ -346,15 +355,6 @@ docs/
346
355
 
347
356
  ---
348
357
 
349
- ## 🔧 兼容性
350
-
351
- | 工具 | 调用方式 | 自动发现 |
352
- |------|----------|----------|
353
- | **Claude Code** | `/team-{name}` 斜杠命令 | `~/.claude/commands/` |
354
- | **Cursor** | Skill 自动发现 | `~/.agents/skills/` |
355
-
356
- ---
357
-
358
358
  ## 📚 体系来源
359
359
 
360
360
  Team Skills 融合了业界多个 AI 协作框架的精华:
@@ -365,7 +365,7 @@ Team Skills 融合了业界多个 AI 协作框架的精华:
365
365
  | **OpenSpec** (Fission AI) | Delta Spec 增量规格、RFC 2119 + Given/When/Then |
366
366
  | **Karpathy Skills** | 过度抽象防御、死代码清理、困惑管理 |
367
367
  | **Agent-Style** | 5 条 LLM 输出质量约束 |
368
- | **独创** | 有向图回退、质量追溯矩阵、消费方契约、H1-H4 人类介入点 |
368
+ | **独创** | 有向图回退、质量追溯矩阵、消费方契约、H1-H4 人类介入点、100 分制量化评估、Markdown Skill Language |
369
369
 
370
370
  ---
371
371
 
@@ -386,6 +386,10 @@ npm run cli-test # CLI 冒烟测试
386
386
  npm run setup # 安装 Skills 到全局目录
387
387
  ```
388
388
 
389
+ ### Skill 编写规范
390
+
391
+ 编写或修改 Skill 时,请参考 `skills/_team-rules/skill-spec.md`(Markdown Skill Language v1.0 形式语法)。
392
+
389
393
  ### CI 流程
390
394
 
391
395
  提交后 GitHub Actions 自动运行:
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "team-skills",
3
- "version": "1.2.3",
3
+ "version": "1.3.1",
4
4
  "description": "AI Agent Skills framework — Spec-Driven development with directed-graph rollback and quality gates",
5
5
  "type": "module",
6
6
  "bin": {
@@ -0,0 +1,485 @@
1
+ # Markdown Skill Language v1.0
2
+
3
+ > 共享规则文件。所有 SKILL.md 的执行步骤、门禁、状态声明须遵循本规范。
4
+
5
+ ## 设计原则
6
+
7
+ 1. **Markdown 原生** — 仅使用 Markdown 已有语法构造(标题、粗体、反引号、列表、引用块、表格),不引入任何自定义符号或标签
8
+ 2. **零歧义** — 每个 Markdown 构造在 Skill 上下文中有且仅有一个语义解释
9
+ 3. **LLM 可执行** — 控制流、变量、门禁可被 LLM 机械提取并逐步执行,无需"读懂段落"
10
+ 4. **有执行模型** — 顺序流、跳转、循环终止、分支穷尽性有明确定义(§执行模型)
11
+ 5. **有变量模型** — 变量声明、引用、作用域、表达式语法有明确定义(§变量模型)
12
+ 6. **有组合模型** — Skill 间调用、回退、状态持久化有明确协议(§组合模型)
13
+
14
+ ## 12 条语义约定
15
+
16
+ | # | Markdown 构造 | Skill 语义 | 示例 |
17
+ |---|---------------|-----------|------|
18
+ | 1 | `###` 标题 | Step / Phase 作用域边界 | `### Step 1:确定验证命令` |
19
+ | 2 | `**全大写词**` | 语义关键词(指令动词 / 状态) | `**RESOLVE**` `**ASSERT**` `**DONE**` |
20
+ | 3 | `` `反引号` `` | 标识符 / 可求值表达式 | `` `exit_code == 0` `` `` `verify_cmd` `` |
21
+ | 4a | `1. 2. 3.` 有序列表 | 顺序执行(默认语义) | 步骤 1 → 步骤 2 → 步骤 3 |
22
+ | 4b | `**RESOLVE**` + `1. 2. 3.` | 优先级链(首个命中即停) | `**RESOLVE** \`var\``:1. 尝试 A 2. 尝试 B 3. *none* |
23
+ | 5 | `-` 无序列表 + 缩进 | 条件分支(顶层=条件,缩进子项=动作) | 二级缩进 = 二层嵌套 |
24
+ | 6 | `→` | 则(then)— 前面是条件/动作,后面是后续动作 | `失败 → 记录详情 → **GOTO** Step 2` |
25
+ | 7 | `- [ ]` 复选框 | **GATE** 断言条目(必须逐条验证,全部通过才放行) | `- [ ] exit_code == 0` |
26
+ | 8 | `>` 引用块 | WHY / 设计意图(不参与执行,不含关键词指令) | 解释规则存在的工程理由 |
27
+ | 9 | `*斜体*` | 兜底 / 缺省 / 空值 | `*none*` `*not found*` `*default*` |
28
+ | 10 | 表格 | 结构化映射(状态机、类型表、路由表) | 失败模式表、严重级别表 |
29
+ | 11 | `####` 四级标题 | 命名子步骤(用于拆分超过 2 层的嵌套) | `#### 子步骤 4.1:回退路由` |
30
+ | 12 | `[标签]` 方括号 | 条件注解(标记该指令的适用条件) | `[完整模式]` `[精简替代]` |
31
+
32
+ ## 关键词词表
33
+
34
+ 所有关键词以 `**全大写粗体**` 标记,分 5 类。**仅**以下词为关键词——其他粗体词(如概念名称 **YAGNI**、章节强调)不是关键词,LLM 不按指令解析。
35
+
36
+ | 类别 | 关键词 | 语义 |
37
+ |------|--------|------|
38
+ | 数据操作 | `**READ**` `**WRITE**` `**RESOLVE**` `**EXEC**` | 读取文件或输入、写入文件或展示给用户、按优先级链解析变量、执行 shell 命令 |
39
+ | 控制流 | `**IF**` `**ELSE**` `**MATCH**` `**FOR**` `**REPEAT**` `**GOTO**` | 条件、否则、模式匹配分发、遍历集合、有限重试、跳转 |
40
+ | 门禁 | `**ASSERT**` `**GATE**` | 单条件断言(失败则执行 fallback)、多条件检查点(全部通过才放行) |
41
+ | 状态 | `**DONE**` `**BLOCKED**` `**NEEDS_CONTEXT**` `**DONE_WITH_CONCERNS**` | 四态完成状态 |
42
+ | 路由 | `**ROLLBACK**` `**ROUTE**` `**H3**` | 回退到上游 Agent、路由到下游 Skill、触发人类介入 |
43
+
44
+ ### ASSERT 与 GATE 的区分
45
+
46
+ | 维度 | **ASSERT** | **GATE** |
47
+ |------|-----------|----------|
48
+ | 条件数 | 单条件(可用 `&&` 组合) | 多条件(复选框列表) |
49
+ | 失败行为 | 执行 fallback 动作(→ GOTO / ROLLBACK / BLOCKED) | 阻塞——全部通过才放行,不通过则补全后重检 |
50
+ | 典型场景 | 执行步骤中的即时检查 | 阶段转换前的准入门禁、自检清单 |
51
+ | 格式 | `**ASSERT** \`expression\`` + fallback 分支 | `**GATE** 描述` + `- [ ]` 复选框列表 |
52
+
53
+ ### WRITE 的目标区分
54
+
55
+ `**WRITE**` 后面的目标决定动作类型:
56
+
57
+ | 写法 | 含义 | 示例 |
58
+ |------|------|------|
59
+ | `**WRITE** \`filepath\`` | 写入磁盘文件 | `**WRITE** \`06-tdd-log.md\`` |
60
+ | `**WRITE**(对话中)` | 展示给用户,不写文件 | `**WRITE**(对话中)推荐结果` |
61
+ | `**WRITE** checkpoint` | 更新 checkpoint 文件 | `**WRITE** checkpoint:...` |
62
+
63
+ ## 执行模型
64
+
65
+ ### 顺序流
66
+
67
+ `###` Step/Phase 按文档顺序执行。前一个 Step 的最后一条指令完成后,自动进入下一个 Step。
68
+
69
+ 以下关键词中断顺序流:
70
+
71
+ | 关键词 | 效果 |
72
+ |--------|------|
73
+ | `**GOTO** Step N` | 无条件跳转到目标 Step/子步骤 |
74
+ | `**DONE**` / `**DONE_WITH_CONCERNS**` | 终止整个 Skill 执行 |
75
+ | `**BLOCKED**` / `**NEEDS_CONTEXT**` | 终止执行,等待外部输入 |
76
+ | `**ROLLBACK** agent` | 终止执行,回退到上游 |
77
+
78
+ ### `####` 子步骤的返回行为
79
+
80
+ `####` 子步骤执行完后回到父 `###` 的下一条指令——除非子步骤以 GOTO/DONE/BLOCKED/ROLLBACK 结尾。被 GOTO 跳入的 `####` 同理:执行完后不自动返回跳出点。
81
+
82
+ ### GOTO 目标约束
83
+
84
+ 目标必须是当前文件中存在的 `###` 或 `####` 标题名称。跨文件跳转使用 `**ROUTE**`。
85
+
86
+ ### MATCH 穷尽性
87
+
88
+ **MATCH** 的分支必须覆盖所有可能的值:
89
+
90
+ - 提供 `*default*` / `*none*` 兜底分支,或
91
+ - 枚举变量值域的全部值(适用于有限集合如四态状态)
92
+
93
+ 未覆盖的值 = 未定义行为。
94
+
95
+ ### FOR / REPEAT 终止
96
+
97
+ - **FOR**:遍历完集合后回到 FOR 块后的下一条指令
98
+ - **REPEAT** max=N:重试 N 次后触发 `*repeat exhausted*` 兜底(必须提供)
99
+ - FOR/REPEAT 内的 GOTO 立即跳出循环
100
+
101
+ ### 有序列表语义消歧
102
+
103
+ 有序列表(`1. 2. 3.`)在两种上下文中语义不同:
104
+
105
+ | 上下文 | 语义 | 行为 |
106
+ |--------|------|------|
107
+ | 默认 | 顺序执行 | 步骤 1 完成 → 步骤 2 → 步骤 3,全部执行 |
108
+ | `**RESOLVE**` 引导 | 优先级链 | 步骤 1 命中 → 停止;未命中 → 步骤 2;`*none*` = 全未命中 |
109
+
110
+ 判定规则:有序列表前的最近关键词是 `**RESOLVE**` → 优先级链语义。其他情况 → 顺序执行语义。
111
+
112
+ ## 变量模型
113
+
114
+ ### 变量引入
115
+
116
+ 变量通过以下关键词引入:
117
+
118
+ | 引入方式 | 产生的变量 | 作用域 | 示例 |
119
+ |----------|-----------|--------|------|
120
+ | `**RESOLVE** \`var\`` | 命名变量 `var` | Step 作用域 | `**RESOLVE** \`verify_cmd\`` |
121
+ | `**FOR** each \`item\`` | 循环变量 `item` | FOR 块内 | `**FOR** each \`feature_point\`` |
122
+ | `**MATCH** \`var\`` | 匹配目标 `var` | MATCH 块内 | `**MATCH** \`result\`` |
123
+ | `**EXEC** cmd` | 隐式 `exit_code` + `output` | 到下一个 EXEC | `**EXEC** \`git status\`` |
124
+ | `**READ** source` | 隐式读取内容 | 紧随的指令 | `**READ** \`03-sdd.md\`` |
125
+
126
+ ### 作用域规则
127
+
128
+ - **RESOLVE 变量**:从声明点到所属 `###` 末尾。`###` 之前声明的变量可见到文件末尾
129
+ - **FOR 循环变量**:仅在 FOR 块(包括其缩进子项)内可见
130
+ - **EXEC 隐式变量**(`exit_code`、`output`):仅在紧随的条件/断言中有效。下一个 EXEC 覆盖前值
131
+ - **同名覆盖**:后声明覆盖前声明,无警告
132
+
133
+ ### 表达式语法
134
+
135
+ 反引号内可使用以下运算。运算符两侧为标识符或字面值:
136
+
137
+ | 运算 | 写法 | 示例 |
138
+ |------|------|------|
139
+ | 相等 | `==` `!=` | `` `mode == compact` `` |
140
+ | 比较 | `>=` `<=` `>` `<` | `` `failures == 0` `` |
141
+ | 逻辑 | `&&` &#124;&#124; | `` `exit_code == 0` && `failures == 0` `` |
142
+ | 存在性 | `X 存在` `X 不存在` | `` `docs/specs/` 存在 `` |
143
+ | 属性访问 | `.` | `` `READ("file").field` `` |
144
+ | 否定 | `非` `!` | `` `output` 非空 `` |
145
+ | 多值 | &#124;&#124; 在 MATCH 分支 | `` `DONE` \|\| `DONE_WITH_CONCERNS` `` |
146
+
147
+ 逻辑运算 `&&` 的多个反引号子表达式可以分别用独立反引号包裹:`` `exit_code == 0` && `failures == 0` ``。
148
+
149
+ ### 常用变量约定
150
+
151
+ 以下变量名跨 Skill 统一使用(非关键词,是命名约定):
152
+
153
+ | 名称 | 含义 | 典型引入方式 |
154
+ |------|------|-------------|
155
+ | `mode` | `full` / `compact` | RESOLVE |
156
+ | `slug` | 任务标识符 `{NNNN}-{keyword}` | RESOLVE |
157
+ | `exit_code` | 命令退出码 | EXEC 隐式 |
158
+ | `output` | 命令标准输出 | EXEC 隐式 |
159
+ | `verify_cmd` | 项目验证命令 | RESOLVE |
160
+ | `base_branch` | 基准分支名 | RESOLVE |
161
+ | `result` | 完成状态匹配目标 | MATCH |
162
+
163
+ ## 组合模型
164
+
165
+ ### ROUTE 协议
166
+
167
+ `**ROUTE** skill-name` 调用另一个 Skill。调用约定:
168
+
169
+ 1. ROUTE 后跟代码块 = 提示模板,传递给目标 Skill 的执行上下文
170
+ 2. 模板中 `{var}` = 当前作用域变量插值
171
+ 3. ROUTE 后的"完成验证"段落 = 目标 Skill 返回后的后置条件检查
172
+
173
+ ```markdown
174
+ **ROUTE** `team-test`
175
+
176
+ \`\`\`
177
+ 任务 slug:{slug}
178
+ 模式:{mode}
179
+ 输入:docs/tasks/{slug}/ 下的文件
180
+ \`\`\`
181
+
182
+ **完成验证**(产出门禁):
183
+ **FOR** each file in [`09-test-matrix.md`, `10-test-report.md`]:
184
+ - **ASSERT** 文件存在且有效行数 ≥ 5
185
+ ```
186
+
187
+ ### ROLLBACK 协议
188
+
189
+ `**ROLLBACK** agent-name` 回退到上游 Agent。必须携带四要素:
190
+
191
+ | 要素 | 必须 | 示例 |
192
+ |------|------|------|
193
+ | 问题描述 | 是 | "`exit_code != 0`,测试失败 3 个" |
194
+ | 位置 | 是 | "Step 4 产出门禁" |
195
+ | 期望行为 | 是 | "引用 SDD §二.3 条目" |
196
+ | 建议修复 | 是 | "检查边界条件处理" |
197
+
198
+ ROLLBACK 可附带跳转目标:`**ROLLBACK** implAgent(**GOTO** Step 3,附 bug 上下文)`。
199
+
200
+ ### Checkpoint 模型
201
+
202
+ `**WRITE** checkpoint:...` 持久化跨步骤状态,用于断点续传。
203
+
204
+ 标准字段约定:
205
+
206
+ | 字段 | 类型 | 含义 |
207
+ |------|------|------|
208
+ | `current_step` | string | 当前执行到的 Step |
209
+ | `next_step` | string | 下一个待执行 Step |
210
+ | `phase` | string | 当前阶段名 |
211
+ | `completed_steps` | string[] | 已完成的 Step 列表 |
212
+ | `status` | 四态之一 | 任务整体状态 |
213
+ | `rollback_counts` | object | `{source→target: count}` 回退计数 |
214
+
215
+ Checkpoint 在每个 Step 完成后更新,在恢复时通过 `**READ** checkpoint` → `**MATCH** \`checkpoint.status\`` 决定继续点。
216
+
217
+ ## 常见模式
218
+
219
+ ### 模式 1:RESOLVE 优先级链
220
+
221
+ 按优先级依次查找,首个命中即停,末尾 `*none*` 为兜底。
222
+
223
+ ```markdown
224
+ **RESOLVE** `verify_cmd`(首个命中即停):
225
+
226
+ 1. `READ("05-risk.md", "§一验证计划")`
227
+ 2. `READ("CLAUDE.md").test_cmd` / `READ(".cursor/rules/")`
228
+ 3. `READ("package.json").scripts.test` / `READ("Makefile")`
229
+ 4. *none* → **NEEDS_CONTEXT**:请用户提供验证命令
230
+ ```
231
+
232
+ **规则**:每个 RESOLVE 链必须有 `*none*` / `*default*` / `*not found*` 兜底项。
233
+
234
+ ### 模式 2:ASSERT 单条件断言
235
+
236
+ 断言必须为真,否则执行 fallback 动作。
237
+
238
+ ```markdown
239
+ **ASSERT** `exit_code == 0` && `failures == 0`
240
+ - `exit_code != 0` → 记录失败 → **GOTO** Step N
241
+ - warning && `exit_code == 0` → **WRITE** warning 到报告,不阻塞
242
+ ```
243
+
244
+ ### 模式 3:GATE 多条件检查点
245
+
246
+ 多个条件组成的准入门禁,全部通过才放行。
247
+
248
+ ```markdown
249
+ **GATE** 产出前自检(全部通过才放行):
250
+
251
+ - [ ] `06-tdd-log.md` 存在且有效行数 ≥ 5
252
+ - [ ] 每个功能点有 RED → GREEN 序列
253
+ - [ ] `exit_code == 0` && `failures == 0`
254
+ ```
255
+
256
+ ### 模式 4:MATCH 状态分发
257
+
258
+ 根据变量值分发到不同动作。`**MATCH**` 后必须跟反引号变量名。
259
+
260
+ ```markdown
261
+ **MATCH** `result`:
262
+
263
+ - 全部通过 → **DONE**
264
+ - 通过但有 warning → **DONE_WITH_CONCERNS**
265
+ - 验证失败 → 记录失败详情
266
+ - 工具失败 → **BLOCKED**,触发 **H3**
267
+ ```
268
+
269
+ **规则**:`**MATCH**` 后必须跟 `` `变量名` ``(反引号包裹),不用自然语言描述。
270
+
271
+ ### 模式 5:FOR 遍历
272
+
273
+ 遍历集合中的每个元素,对每个执行相同操作。
274
+
275
+ ```markdown
276
+ **FOR** each `feedback_item`:
277
+
278
+ 1. **READ** 实际代码 → 验证技术正确性
279
+ 2. **ASSERT** 验证基于代码证据
280
+ 3. **IF** 技术正确 → 标记待实施
281
+ **ELSE** → 用技术理由推回
282
+ ```
283
+
284
+ ### 模式 6:IF / ELSE 条件
285
+
286
+ #### 条件的两种合法形式
287
+
288
+ | 形式 | 写法 | 适用场景 | 示例 |
289
+ |------|------|---------|------|
290
+ | 反引号 | `**IF** \`expr\`` | 可求值变量/表达式(mode、exit_code、文件是否存在) | `**IF** \`mode == compact\`` |
291
+ | 描述 | `**IF** 描述条件` | 上下文判断、需要人类/LLM 感知的场景 | `**IF** 多组件系统 →` |
292
+
293
+ 描述条件须简短(≤15 字)且可判定。如判定方式不明显,加括号注明:`**IF** 编排模式(任务目录存在)→`
294
+
295
+ #### 守卫 IF vs 分支 IF
296
+
297
+ | 类型 | 形式 | ELSE 要求 | 隐含语义 |
298
+ |------|------|----------|---------|
299
+ | 守卫 IF | `**IF** cond → action`(单行) | 不需要 ELSE | 条件不满足时继续下一步 |
300
+ | 分支 IF | `**IF** cond:` + 缩进子项(多行) | 需要 `**ELSE**` 或 `*default*` | 两条路径都有明确动作 |
301
+
302
+ **守卫 IF**(单行,不需要 ELSE):
303
+
304
+ ```markdown
305
+ **IF** `docs/specs/` 存在 → **WRITE** 合并规格
306
+ ```
307
+
308
+ **分支 IF**(多行,需要 ELSE):
309
+
310
+ ```markdown
311
+ **IF** `mode == compact`:
312
+ - 精简产出,跳过 01-plan 等文件
313
+
314
+ **ELSE**:
315
+ - 完整产出,包含全部 17 个文件
316
+ ```
317
+
318
+ **嵌套形式**(无序列表 + 缩进表达多层条件,最多 2 层):
319
+
320
+ ```markdown
321
+ - `severity == P0` || `severity == P1`
322
+ - `问题在实现层` → **ROUTE** implAgent
323
+ - `问题在规格层` → **ROUTE** specAgent
324
+ - `severity == P2` → 自行修复
325
+ - *default* → 记录但不处理
326
+ ```
327
+
328
+ ### 模式 7:REPEAT 重试
329
+
330
+ 有限次重试,`*repeat exhausted*` 为兜底。
331
+
332
+ ```markdown
333
+ **REPEAT** max=2:
334
+
335
+ 1. 记录失败原因
336
+ 2. 修复 → **EXEC** `verify_cmd`
337
+ - 通过 → **GOTO** Step N
338
+ - 仍失败 → 继续 REPEAT
339
+
340
+ - *repeat exhausted* → **BLOCKED**,触发 **H3**
341
+ ```
342
+
343
+ ### 模式 8:GOTO 跳转
344
+
345
+ 显式跳转到指定 Step/Phase,避免隐式流转。目标必须是当前文件中存在的 `###` 或 `####` 标题名称。
346
+
347
+ ```markdown
348
+ 修复完成 → **GOTO** Step 2(重新执行验证)
349
+ ```
350
+
351
+ ### 模式 9:WRITE 目标区分
352
+
353
+ `**WRITE**` 的目标决定动作类型:
354
+
355
+ | 写法 | 含义 | 示例 |
356
+ |------|------|------|
357
+ | `**WRITE** \`filepath\`` | 写入磁盘文件 | `**WRITE** \`06-tdd-log.md\`` |
358
+ | `**WRITE**(对话中)` | 展示给用户,不写文件 | `**WRITE**(对话中)推荐结果` |
359
+ | `**WRITE** checkpoint` | 更新 checkpoint 状态 | `**WRITE** checkpoint:...` |
360
+
361
+ ### 模式 10:内联守卫
362
+
363
+ 在主指令上附加括号内守卫条件,不影响主指令的后续流:
364
+
365
+ ```markdown
366
+ **EXEC** 创建目录(**IF** 已存在 → 跳过)
367
+ ```
368
+
369
+ 规则:`(**IF** cond → action)` 是附加在主指令上的前置检查。条件不满足时执行 action(通常是"跳过"),然后继续下一条指令。
370
+
371
+ ### 模式 11:条件注解
372
+
373
+ 在 GATE 检查项或指令前标注适用条件,LLM 根据当前上下文选择执行哪段:
374
+
375
+ ```markdown
376
+ - [ ] G1: `[完整模式]` **ASSERT** `01-plan.md` 包含目标澄清
377
+ `[精简替代]` **ASSERT** `03-sdd.md` 包含任务目标
378
+ ```
379
+
380
+ 规则:`[标签]` 方括号注解标记适用条件。同一行的多个注解互斥——根据当前 `mode` 选择匹配的注解段执行。
381
+
382
+ ### 模式 12:多值匹配
383
+
384
+ MATCH 分支条件可用 `||` 合并多个值,匹配任意一个即执行该分支:
385
+
386
+ ```markdown
387
+ **MATCH** `checkpoint.status`:
388
+
389
+ - `DONE` || `DONE_WITH_CONCERNS` → 提示用户任务已完成
390
+ - `BLOCKED` → 触发 **H3**
391
+ - *default* → 恢复执行
392
+ ```
393
+
394
+ ## 形式语法
395
+
396
+ 简化 BNF 参考。不追求 parser-ready,但足够精确地定义每个构造的合法形式。
397
+
398
+ ```bnf
399
+ skill ::= frontmatter section+
400
+ frontmatter ::= '---' NL 'name:' TEXT NL 'description:' TEXT NL '---'
401
+
402
+ section ::= step_heading instruction*
403
+ step_heading ::= '###' step_label ':' title
404
+ step_label ::= 'Step' NUMBER | 'Phase' NUMBER
405
+ substep_heading ::= '####' substep_label ':' title
406
+
407
+ instruction ::= keyword_stmt
408
+ | ordered_list
409
+ | unordered_branch
410
+ | gate_block
411
+ | blockquote
412
+
413
+ (* 关键词语句 *)
414
+ keyword_stmt ::= '**' KEYWORD '**' target action*
415
+ KEYWORD ::= 'READ' | 'WRITE' | 'RESOLVE' | 'EXEC'
416
+ | 'IF' | 'ELSE' | 'MATCH' | 'FOR' | 'REPEAT' | 'GOTO'
417
+ | 'ASSERT' | 'GATE'
418
+ | 'DONE' | 'BLOCKED' | 'NEEDS_CONTEXT' | 'DONE_WITH_CONCERNS'
419
+ | 'ROLLBACK' | 'ROUTE' | 'H3'
420
+ target ::= backtick_expr | write_target | description
421
+ write_target ::= backtick_expr | '(对话中)' | 'checkpoint'
422
+ action ::= '→' keyword_stmt
423
+ | '→' description
424
+
425
+ (* 表达式 *)
426
+ backtick_expr ::= '`' expression '`'
427
+ expression ::= term (logical_op term)*
428
+ term ::= identifier compare_op value
429
+ | identifier existence
430
+ | identifier '.' identifier
431
+ | function_call
432
+ compare_op ::= '==' | '!=' | '>=' | '<=' | '>' | '<'
433
+ logical_op ::= '&&' | '||'
434
+ existence ::= '存在' | '不存在' | '非空'
435
+ function_call ::= identifier '(' string (',' string)* ')'
436
+
437
+ (* 条件 *)
438
+ if_guard ::= '**IF**' condition '→' action (* 单行守卫,无 ELSE *)
439
+ if_branch ::= '**IF**' condition ':' NL body ('**ELSE**' ':' NL body)?
440
+ condition ::= backtick_expr | short_description
441
+ inline_guard ::= '(' '**IF**' condition '→' action ')'
442
+
443
+ (* 分支 *)
444
+ match_block ::= '**MATCH**' backtick_expr ':' NL match_branch+
445
+ match_branch ::= '-' match_pattern '→' action
446
+ match_pattern ::= backtick_expr ('||' backtick_expr)*
447
+ | '*' fallback_label '*'
448
+ fallback_label ::= 'none' | 'default' | 'not found' | 'repeat exhausted'
449
+
450
+ (* 循环 *)
451
+ for_block ::= '**FOR**' 'each' backtick_expr ':' NL body
452
+ repeat_block ::= '**REPEAT**' 'max=' NUMBER ':' NL body NL fallback_branch
453
+
454
+ (* 门禁 *)
455
+ gate_block ::= '**GATE**' description ':' NL checkbox+
456
+ checkbox ::= '- [ ]' (annotation)? assertion
457
+ annotation ::= '[' label ']'
458
+ assertion ::= '**ASSERT**' backtick_expr
459
+
460
+ (* 有序列表 *)
461
+ ordered_list ::= ordered_item+ (* 默认:顺序执行 *)
462
+ resolve_chain ::= '**RESOLVE**' backtick_expr NL ordered_item+ fallback_branch
463
+ (* RESOLVE 引导:优先级链 *)
464
+ fallback_branch ::= '-' '*' fallback_label '*' '→' action
465
+
466
+ (* 非执行 *)
467
+ blockquote ::= '>' TEXT (* WHY / 设计意图,不含关键词 *)
468
+ ```
469
+
470
+ ## 反模式
471
+
472
+ | # | 反模式 | 问题 | 正确做法 |
473
+ |---|--------|------|---------|
474
+ | 1 | 纯段落描述条件逻辑 | LLM 需"读懂段落"才能提取分支 | 用 `**IF**` / `**MATCH**` + 缩进分支 |
475
+ | 2 | 指令动词不加粗大写 | 动词淹没在句子中,无法扫描 | 所有指令动词用 `**全大写粗体**` 标记 |
476
+ | 3 | 优先级链无兜底 | 所有选项都不命中时行为未定义 | 末尾加 `*none*` → 兜底动作 |
477
+ | 4 | ASSERT 无表达式 | "确认测试通过"不可机械验证 | `**ASSERT** \`exit_code == 0\` && \`failures == 0\`` |
478
+ | 5 | 状态声明用自然语言 | "任务完成"歧义——完成还是有保留? | 用四态关键词:`**DONE**` / `**DONE_WITH_CONCERNS**` / ... |
479
+ | 6 | 引用块中含执行指令 | 违反约定 #8(引用块=WHY) | 执行指令移出引用块,引用块仅保留设计意图 |
480
+ | 7 | MATCH 后跟自然语言 | LLM 无法提取待匹配变量 | `**MATCH**` 后必须跟 `` `变量名` `` |
481
+ | 8 | MATCH 分支用 emoji 做标识符 | emoji 与关键词语义重复,LLM 可能匹配 emoji 而非文本 | 分支用文本描述,状态用关键词(`**DONE**` 等) |
482
+ | 9 | 超过 2 层嵌套未提取子步骤 | LLM 丢失层级追踪,解析出错 | 3 层以上嵌套提取为命名子步骤(`####`),用 `**GOTO**` 连接 |
483
+ | 10 | MATCH 缺少兜底且未穷尽枚举 | 未覆盖的值 = 未定义行为 | 提供 `*default*` 兜底或枚举全部值域 |
484
+ | 11 | EXEC 后跳过 exit_code 检查 | "执行了"≠"执行成功" | `**EXEC**` 后必须 `**ASSERT** \`exit_code == 0\`` 或说明无需检查的理由 |
485
+ | 12 | 编排级 ROUTE 无提示模板 | 目标 skill 缺少执行上下文 | 编排器调度子 skill 时,`**ROUTE**` 后跟代码块提示模板。MATCH 内简单路由可省略 |