team-skills 1.2.3 → 1.3.0
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.
- package/package.json +1 -1
- package/skills/_team-rules/skill-spec.md +485 -0
- package/skills/team-brainstorm/SKILL.md +55 -30
- package/skills/team-debug/SKILL.md +61 -72
- package/skills/team-feedback/SKILL.md +81 -52
- package/skills/team-finish/SKILL.md +65 -70
- package/skills/team-impl/SKILL.md +129 -156
- package/skills/team-orchestrator/SKILL.md +338 -236
- package/skills/team-orchestrator/references/14-team-template.md +2 -2
- package/skills/team-review/SKILL.md +112 -101
- package/skills/team-score/SKILL.md +131 -86
- package/skills/team-spec/SKILL.md +113 -141
- package/skills/team-test/SKILL.md +77 -70
- package/skills/team-test/references/10-test-report-template.md +11 -0
- package/skills/team-verify/SKILL.md +72 -86
- package/skills/using-team-skills/SKILL.md +35 -27
package/package.json
CHANGED
|
@@ -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
|
+
| 逻辑 | `&&` || | `` `exit_code == 0` && `failures == 0` `` |
|
|
142
|
+
| 存在性 | `X 存在` `X 不存在` | `` `docs/specs/` 存在 `` |
|
|
143
|
+
| 属性访问 | `.` | `` `READ("file").field` `` |
|
|
144
|
+
| 否定 | `非` `!` | `` `output` 非空 `` |
|
|
145
|
+
| 多值 | || 在 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 内简单路由可省略 |
|
|
@@ -62,30 +62,43 @@ NO IMPLEMENTATION WITHOUT USER APPROVED DESIGN FIRST
|
|
|
62
62
|
|
|
63
63
|
## 产出目录
|
|
64
64
|
|
|
65
|
-
`docs/tasks/{slug}
|
|
65
|
+
`docs/tasks/{slug}/`(slug 由 Phase 1 RESOLVE)
|
|
66
66
|
|
|
67
67
|
## 执行步骤
|
|
68
68
|
|
|
69
69
|
### Phase 1:探索
|
|
70
70
|
|
|
71
|
-
1.
|
|
72
|
-
2.
|
|
73
|
-
3.
|
|
74
|
-
4.
|
|
75
|
-
|
|
71
|
+
1. **READ** 用户需求,提取核心目标和关键词
|
|
72
|
+
2. **READ** 项目规范:`CLAUDE.md`(或 `.cursor/rules/`)、`README.md`
|
|
73
|
+
3. **READ** 相关源码模块,理解现有实现
|
|
74
|
+
4. **IF** 需求包含多个独立子系统:
|
|
75
|
+
- 先帮助用户分解为独立任务,逐个处理
|
|
76
|
+
5. **RESOLVE** `slug`:
|
|
77
|
+
1. **READ** `docs/tasks/` 已有目录列表
|
|
78
|
+
2. **IF** `docs/tasks/` 不存在 → 创建 `docs/tasks/`
|
|
79
|
+
3. 取最大序号 +1(从 `0001` 起),拼接任务关键词(kebab-case,整体 ≤ 50 字符)
|
|
80
|
+
4. 创建 `docs/tasks/{slug}/` 目录
|
|
76
81
|
|
|
77
82
|
### Phase 2:需求澄清(一次性提问)
|
|
78
83
|
|
|
79
|
-
|
|
84
|
+
> 一次最多 3 个问题,优先用选项形式降低用户认知负担(FP-1)。
|
|
85
|
+
|
|
86
|
+
向用户展示最多 3 个关键问题,等待用户一次回复:
|
|
80
87
|
|
|
81
88
|
- 目标优先级:"以下哪个是最重要的目标?A) ... B) ... C) ..."
|
|
82
89
|
- 边界确认:"以下范围是否正确?是否需要排除某些模块?"
|
|
83
90
|
- 风险偏好:"如果遇到 {具体风险},你倾向于 A) 保守处理 B) 激进优化?"
|
|
84
91
|
|
|
92
|
+
**IF** 用户回复揭示需求不可行:
|
|
93
|
+
|
|
94
|
+
- → **H3**:暂停设计,展示不可行原因,请用户决策(Kill Switch / 调整需求)
|
|
95
|
+
|
|
85
96
|
### Phase 3:方案设计
|
|
86
97
|
|
|
87
98
|
提出 2-3 个不同方案,含优缺点对比和推荐理由:
|
|
88
99
|
|
|
100
|
+
**ASSERT** `方案数 >= 2`(不可只提供单一方案)
|
|
101
|
+
|
|
89
102
|
```
|
|
90
103
|
|
|
91
104
|
## 方案对比
|
|
@@ -99,6 +112,8 @@ NO IMPLEMENTATION WITHOUT USER APPROVED DESIGN FIRST
|
|
|
99
112
|
|
|
100
113
|
### Phase 4:展示设计
|
|
101
114
|
|
|
115
|
+
> 逐段展示而非一次倾倒,降低用户认知负荷(FP-1)。
|
|
116
|
+
|
|
102
117
|
逐段展示设计,每段后等待用户确认:
|
|
103
118
|
|
|
104
119
|
- 架构/组件
|
|
@@ -106,9 +121,14 @@ NO IMPLEMENTATION WITHOUT USER APPROVED DESIGN FIRST
|
|
|
106
121
|
- 关键接口
|
|
107
122
|
- 测试策略
|
|
108
123
|
|
|
124
|
+
**GATE** 用户已确认设计方案 → 继续 Phase 5
|
|
125
|
+
|
|
126
|
+
- 用户要求修改 → **GOTO** Phase 3(仅重新展示修改后的方案,无需重新生成全部选项)
|
|
127
|
+
- 用户决定放弃 → **BLOCKED**,记录原因
|
|
128
|
+
|
|
109
129
|
### Phase 5:产出 00-design-brief.md
|
|
110
130
|
|
|
111
|
-
|
|
131
|
+
**WRITE** `docs/tasks/{slug}/00-design-brief.md`:
|
|
112
132
|
|
|
113
133
|
```markdown
|
|
114
134
|
# 设计概要:{主题}
|
|
@@ -147,12 +167,25 @@ NO IMPLEMENTATION WITHOUT USER APPROVED DESIGN FIRST
|
|
|
147
167
|
|
|
148
168
|
```
|
|
149
169
|
|
|
170
|
+
**ASSERT** `00-design-brief.md` 无占位符残留(`{N}`、`{slug}` 等已替换为实际值)
|
|
171
|
+
|
|
150
172
|
### Phase 6:Handoff
|
|
151
173
|
|
|
152
|
-
|
|
174
|
+
**WRITE**(对话中)slug 目录路径 `docs/tasks/{slug}/`。
|
|
175
|
+
|
|
176
|
+
**MATCH** `user_intent`:
|
|
153
177
|
|
|
154
|
-
-
|
|
155
|
-
-
|
|
178
|
+
- 用户接受默认路径 → **ROUTE** `team-spec {slug}`(在同一 slug 目录中产出完整 SDD)
|
|
179
|
+
- 用户明确要求跳过规格阶段 → **ROUTE** `team-impl`(直接 TDD 实现)
|
|
180
|
+
- 用户未表态 → 推荐 `team-spec {slug}`,等待用户确认
|
|
181
|
+
- *default*(其他意图)→ 询问用户偏好
|
|
182
|
+
|
|
183
|
+
## STOP Signals
|
|
184
|
+
|
|
185
|
+
- **跳过**代码库探索,凭空设计方案
|
|
186
|
+
- **抛出**所有问题而不等用户逐个回复
|
|
187
|
+
- **提供**单一方案,没有备选方案对比
|
|
188
|
+
- **跳过**用户确认就进入实现或产出 `01-plan.md`
|
|
156
189
|
|
|
157
190
|
## Constitutional Rules 遵守
|
|
158
191
|
|
|
@@ -164,29 +197,21 @@ NO IMPLEMENTATION WITHOUT USER APPROVED DESIGN FIRST
|
|
|
164
197
|
|
|
165
198
|
## 自检门禁
|
|
166
199
|
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
- [ ]
|
|
170
|
-
- [ ]
|
|
171
|
-
- [ ]
|
|
172
|
-
- [ ] `
|
|
173
|
-
- [ ] `00-design-brief.md` 无占位符残留
|
|
174
|
-
- [ ] 没有产出 01-plan.md(那是 team-spec 的职责)
|
|
200
|
+
- [ ] 已 **READ** 代码库和现有实现(不是凭空设计)
|
|
201
|
+
- [ ] 已 **ASSERT** 方案数 >= 2(不是只有一个选项)
|
|
202
|
+
- [ ] **GATE** 用户已确认设计方案(不是自行决定)
|
|
203
|
+
- [ ] `00-design-brief.md` 已 **WRITE** 到 `docs/tasks/{slug}/` 目录
|
|
204
|
+
- [ ] **ASSERT** `00-design-brief.md` 无占位符残留
|
|
205
|
+
- [ ] **ASSERT** 未产出 `01-plan.md`(那是 team-spec 的职责)
|
|
175
206
|
|
|
176
207
|
## 完成标志
|
|
177
208
|
|
|
178
|
-
|
|
179
|
-
状态:DONE | DONE_WITH_CONCERNS | NEEDS_CONTEXT | BLOCKED
|
|
180
|
-
产出:docs/tasks/{slug}/00-design-brief.md
|
|
181
|
-
下一步:→ team-spec {slug} / → team-impl
|
|
182
|
-
```
|
|
183
|
-
|
|
184
|
-
## STOP Signals
|
|
209
|
+
**MATCH** `result`:
|
|
185
210
|
|
|
186
|
-
-
|
|
187
|
-
-
|
|
188
|
-
-
|
|
189
|
-
-
|
|
211
|
+
- 用户确认设计 + `00-design-brief.md` 已写入 → **DONE**
|
|
212
|
+
- 设计已完成但用户有保留意见 → **DONE_WITH_CONCERNS**
|
|
213
|
+
- 需求信息不足,无法形成方案 → **NEEDS_CONTEXT**
|
|
214
|
+
- 需求不可行 / 用户决定放弃 → **BLOCKED**
|
|
190
215
|
|
|
191
216
|
## 集成关系
|
|
192
217
|
|