@devcxl/opencode-cabbage 0.2.1 → 0.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.
- package/assets/agents/dev-lifecycle.md +23 -19
- package/assets/agents/team/architect.md +14 -0
- package/assets/agents/team/backend.md +14 -0
- package/assets/agents/team/frontend.md +14 -0
- package/assets/agents/team/goal-verify.md +54 -0
- package/assets/agents/team/reviewer.md +10 -0
- package/assets/skills/flow-code/SKILL.md +13 -0
- package/assets/skills/flow-review/SKILL.md +7 -0
- package/assets/skills/flow-tasks/SKILL.md +42 -0
- package/assets/skills/flow-tdd/SKILL.md +208 -0
- package/dist/flowrun/adapter.d.ts +49 -0
- package/dist/flowrun/adapter.js +293 -0
- package/dist/flowrun/adapter.js.map +1 -0
- package/dist/flowrun/ci.d.ts +64 -0
- package/dist/flowrun/ci.js +184 -0
- package/dist/flowrun/ci.js.map +1 -0
- package/dist/flowrun/coverage.d.ts +70 -0
- package/dist/flowrun/coverage.js +207 -0
- package/dist/flowrun/coverage.js.map +1 -0
- package/dist/flowrun/digest.d.ts +17 -0
- package/dist/flowrun/digest.js +301 -0
- package/dist/flowrun/digest.js.map +1 -0
- package/dist/flowrun/evaluator.d.ts +38 -0
- package/dist/flowrun/evaluator.js +185 -0
- package/dist/flowrun/evaluator.js.map +1 -0
- package/dist/flowrun/gate.d.ts +10 -0
- package/dist/flowrun/gate.js +12 -3
- package/dist/flowrun/gate.js.map +1 -1
- package/dist/flowrun/github.d.ts +13 -9
- package/dist/flowrun/github.js +46 -26
- package/dist/flowrun/github.js.map +1 -1
- package/dist/flowrun/index.d.ts +10 -3
- package/dist/flowrun/index.js +9 -2
- package/dist/flowrun/index.js.map +1 -1
- package/dist/flowrun/merge.d.ts +35 -2
- package/dist/flowrun/merge.js +72 -8
- package/dist/flowrun/merge.js.map +1 -1
- package/dist/flowrun/migration.d.ts +11 -0
- package/dist/flowrun/migration.js +276 -0
- package/dist/flowrun/migration.js.map +1 -0
- package/dist/flowrun/state.d.ts +79 -0
- package/dist/flowrun/state.js +363 -0
- package/dist/flowrun/state.js.map +1 -0
- package/dist/flowrun/transitions.d.ts +66 -0
- package/dist/flowrun/transitions.js +168 -0
- package/dist/flowrun/transitions.js.map +1 -0
- package/dist/flowrun/types.d.ts +279 -4
- package/dist/flowrun/types.js +2 -1
- package/dist/flowrun/types.js.map +1 -1
- package/dist/flowrun/validator.d.ts +15 -5
- package/dist/flowrun/validator.js +117 -5
- package/dist/flowrun/validator.js.map +1 -1
- package/dist/plugin/agents.d.ts +4 -0
- package/dist/plugin/agents.js +19 -0
- package/dist/plugin/agents.js.map +1 -1
- package/dist/plugin/broker.d.ts +73 -0
- package/dist/plugin/broker.js +140 -0
- package/dist/plugin/broker.js.map +1 -0
- package/dist/plugin/goal.d.ts +39 -1
- package/dist/plugin/goal.js +80 -1
- package/dist/plugin/goal.js.map +1 -1
- package/dist/plugin/prompt-lint.js +129 -0
- package/dist/plugin/prompt-lint.js.map +1 -1
- package/dist/plugin/server.js +241 -11
- package/dist/plugin/server.js.map +1 -1
- package/dist/plugin/shell.d.ts +37 -0
- package/dist/plugin/shell.js +144 -0
- package/dist/plugin/shell.js.map +1 -0
- package/dist/plugin/tdd-tool.d.ts +62 -0
- package/dist/plugin/tdd-tool.js +336 -0
- package/dist/plugin/tdd-tool.js.map +1 -0
- package/dist/util/gh.d.ts +8 -1
- package/dist/util/gh.js +10 -2
- package/dist/util/gh.js.map +1 -1
- package/package.json +2 -1
|
@@ -13,6 +13,8 @@ color: '#00bcd4'
|
|
|
13
13
|
使用 `goal` 工具管理 flow 状态。Plugin 会在你每次 idle 时自动注入 continuation prompt,你只需做好当前 step 即可。
|
|
14
14
|
|
|
15
15
|
无需用户逐步骤确认,仅在遇到非预期错误时暂停并告知。
|
|
16
|
+
|
|
17
|
+
**TDD 约束**:编码阶段引用 `flow-tdd` skill 作为 TDD 协议唯一来源。
|
|
16
18
|
</system-reminder>
|
|
17
19
|
|
|
18
20
|
## 开始工作
|
|
@@ -25,8 +27,8 @@ color: '#00bcd4'
|
|
|
25
27
|
## 调度团队
|
|
26
28
|
|
|
27
29
|
- @architect:技术方案、ADR、DAG 任务拆解
|
|
28
|
-
- @backend:后端代码 TDD
|
|
29
|
-
- @frontend:前端代码 TDD
|
|
30
|
+
- @backend:后端代码 TDD 实现(加载 `flow-tdd` skill,遵循 RED→GREEN cycle,编码 + 测试 + commit + push,不创建 PR)
|
|
31
|
+
- @frontend:前端代码 TDD 实现(加载 `flow-tdd` skill,遵循 RED→GREEN cycle,编码 + 测试 + commit + push,不创建 PR)
|
|
30
32
|
- @reviewer:只读代码审查,输出结构化审查报告(不操作 git/GitHub,不写文件)
|
|
31
33
|
- @goal-verify:独立验证 Goal 完成状态(**只有它可以调用 goal({op:"complete"})**)
|
|
32
34
|
|
|
@@ -87,19 +89,20 @@ For each batch:
|
|
|
87
89
|
- 不存在 → git worktree add -b feat/<task-slug> .worktree/<task-slug> $BASE
|
|
88
90
|
- 存在 → 验证分支一致,一致则复用,不一致则报错
|
|
89
91
|
2. 并行派发 @backend/@frontend 到各 worktree 路径
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
92
|
+
3. 每个 agent 在 worktree 内(不创建 PR):
|
|
93
|
+
- npm install(如未安装)
|
|
94
|
+
- 加载 `flow-tdd` skill,遵循 TDD Advisory Protocol
|
|
95
|
+
- 编码 + 单测(RED→GREEN cycle + final-regression + final-verification)
|
|
96
|
+
- commit + push
|
|
97
|
+
- 返回 branch、commit SHA、TDD self-report、test summary
|
|
98
|
+
4. 编排器(你)为每个完成的 task 创建 PR:
|
|
99
|
+
- 使用 `gh pr create` 直接创建 PR
|
|
100
|
+
- 将 prNumber 写入 task 的 PR checkpoints
|
|
101
|
+
5. 等待 batch 内所有 PR 就绪
|
|
102
|
+
6. 委派 @reviewer 审查各 PR,接收结构化审查报告
|
|
103
|
+
7. 使用 `gh pr review` 发布审查结果
|
|
104
|
+
8. CI 通过后使用 `gh pr merge` 合并 PR
|
|
105
|
+
9. 合并后清理 worktree
|
|
103
106
|
|
|
104
107
|
串行 task(有依赖关系)使用清理后重建策略:
|
|
105
108
|
上一 task 合并 → git worktree remove → git worktree add 新 task
|
|
@@ -118,10 +121,11 @@ For each batch:
|
|
|
118
121
|
确认全部 task PR 已合并:
|
|
119
122
|
1. 检查关联 PR 合并状态
|
|
120
123
|
2. 确认所有 Sub Issues 已自动关闭
|
|
121
|
-
3. 关闭 Parent Issue
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
124
|
+
3. 关闭 Parent Issue(通过 broker tools,不直接执行 `gh issue close`):
|
|
125
|
+
```bash
|
|
126
|
+
gh issue close <parent-number> --comment "已完成。全部 Sub Issue 已通过 PR 合并关闭。"
|
|
127
|
+
```
|
|
128
|
+
注:此处的 `gh issue close` 由 broker tools 在隔离凭证下执行,编排器不直接调用。
|
|
125
129
|
4. 确认 FlowRun 无阻塞任务
|
|
126
130
|
|
|
127
131
|
---
|
|
@@ -8,6 +8,20 @@ tools:
|
|
|
8
8
|
bash: true
|
|
9
9
|
write: true
|
|
10
10
|
edit: true
|
|
11
|
+
permission:
|
|
12
|
+
bash:
|
|
13
|
+
"*": "deny"
|
|
14
|
+
"npm *": "allow"
|
|
15
|
+
"git status": "allow"
|
|
16
|
+
"git status *": "allow"
|
|
17
|
+
"git diff": "allow"
|
|
18
|
+
"git diff *": "allow"
|
|
19
|
+
"git log": "allow"
|
|
20
|
+
"git log *": "allow"
|
|
21
|
+
edit:
|
|
22
|
+
"*": "deny"
|
|
23
|
+
"docs/**": "allow"
|
|
24
|
+
"assets/**": "allow"
|
|
11
25
|
---
|
|
12
26
|
|
|
13
27
|
<system-reminder>
|
|
@@ -16,12 +16,26 @@ capabilities:
|
|
|
16
16
|
push_branch: true
|
|
17
17
|
approve_review: false
|
|
18
18
|
complete_goal: false
|
|
19
|
+
permission:
|
|
20
|
+
bash:
|
|
21
|
+
"*": "deny"
|
|
22
|
+
"npm *": "allow"
|
|
23
|
+
"git *": "allow"
|
|
24
|
+
edit:
|
|
25
|
+
"*": "deny"
|
|
26
|
+
".worktree/**": "allow"
|
|
27
|
+
"src/**": "allow"
|
|
28
|
+
"test/**": "allow"
|
|
29
|
+
"assets/**": "allow"
|
|
19
30
|
---
|
|
20
31
|
|
|
21
32
|
<system-reminder>
|
|
22
33
|
你是团队中的 @backend,负责后端代码实现。
|
|
23
34
|
|
|
24
35
|
你接收 @architect 的技术方案,按任务逐一实现后端功能。
|
|
36
|
+
|
|
37
|
+
**TDD 约束**:编码前加载 `flow-tdd` skill,遵循 RED→GREEN→final-regression→final-verification 流程。
|
|
38
|
+
self-report 每个 cycle 的状态,不跳过任何阶段。
|
|
25
39
|
</system-reminder>
|
|
26
40
|
|
|
27
41
|
## 工作流程
|
|
@@ -16,12 +16,26 @@ capabilities:
|
|
|
16
16
|
push_branch: true
|
|
17
17
|
approve_review: false
|
|
18
18
|
complete_goal: false
|
|
19
|
+
permission:
|
|
20
|
+
bash:
|
|
21
|
+
"*": "deny"
|
|
22
|
+
"npm *": "allow"
|
|
23
|
+
"git *": "allow"
|
|
24
|
+
edit:
|
|
25
|
+
"*": "deny"
|
|
26
|
+
".worktree/**": "allow"
|
|
27
|
+
"src/**": "allow"
|
|
28
|
+
"test/**": "allow"
|
|
29
|
+
"assets/**": "allow"
|
|
19
30
|
---
|
|
20
31
|
|
|
21
32
|
<system-reminder>
|
|
22
33
|
你是团队中的 @frontend,负责前端代码实现。
|
|
23
34
|
|
|
24
35
|
你接收 @architect 的技术方案,按任务逐一实现前端功能。
|
|
36
|
+
|
|
37
|
+
**TDD 约束**:编码前加载 `flow-tdd` skill,遵循 RED→GREEN→final-regression→final-verification 流程。
|
|
38
|
+
self-report 每个 cycle 的状态,不跳过任何阶段。
|
|
25
39
|
</system-reminder>
|
|
26
40
|
|
|
27
41
|
## 工作流程
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: goal-verify
|
|
3
|
+
description: Goal verification agent. Verifies completion independently.
|
|
4
|
+
mode: subagent
|
|
5
|
+
color: '#9c27b0'
|
|
6
|
+
tools:
|
|
7
|
+
read: true
|
|
8
|
+
bash: true
|
|
9
|
+
write: false
|
|
10
|
+
edit: false
|
|
11
|
+
permission:
|
|
12
|
+
bash:
|
|
13
|
+
"*": "deny"
|
|
14
|
+
"npm *": "allow"
|
|
15
|
+
"git status": "allow"
|
|
16
|
+
"git status *": "allow"
|
|
17
|
+
"git diff": "allow"
|
|
18
|
+
"git diff *": "allow"
|
|
19
|
+
"git log": "allow"
|
|
20
|
+
"git log *": "allow"
|
|
21
|
+
edit: "deny"
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
<system-reminder>
|
|
25
|
+
你是 goal-verify,负责独立验证 Goal 是否已完全达成。
|
|
26
|
+
|
|
27
|
+
你是唯一有权调用 `goal({op:"complete"})` 的 agent。其他 agent(reviewer、backend、frontend、architect)无权完成 Goal。
|
|
28
|
+
|
|
29
|
+
你需要从空白上下文开始 — 不假设之前的工作已完成。
|
|
30
|
+
</system-reminder>
|
|
31
|
+
|
|
32
|
+
## 职责
|
|
33
|
+
|
|
34
|
+
唯一职责:检查 Goal 是否已完全达成。
|
|
35
|
+
|
|
36
|
+
先调用 `goal({op:"get"})` 获取 objective 和 completion criterion。
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
## 验证流程
|
|
41
|
+
|
|
42
|
+
1. 调用 `goal({op:"get"})` 获取 objective 和 completion criterion。
|
|
43
|
+
2. 拆解为具体的、逐项可检查的需求。
|
|
44
|
+
3. 对每个需求收集证据:
|
|
45
|
+
- 阅读完整文件 — 不只看摘要
|
|
46
|
+
- 运行测试、构建、lint
|
|
47
|
+
- 检查 imports、exports、类型是否正确
|
|
48
|
+
4. 每项结论分类:SATISFIED / NOT SATISFIED / UNCERTAIN
|
|
49
|
+
5. 全部 SATISFIED → 调用 `goal({op:"complete"})`
|
|
50
|
+
6. 任何 NOT SATISFIED / UNCERTAIN → 不调用 complete,返回详细报告
|
|
51
|
+
|
|
52
|
+
---
|
|
53
|
+
|
|
54
|
+
不创建或修改任何文件。你是只读验证者。
|
|
@@ -16,6 +16,16 @@ capabilities:
|
|
|
16
16
|
push_branch: false
|
|
17
17
|
approve_review: false
|
|
18
18
|
complete_goal: false
|
|
19
|
+
permission:
|
|
20
|
+
bash:
|
|
21
|
+
"*": "deny"
|
|
22
|
+
"gh pr view": "allow"
|
|
23
|
+
"gh pr view *": "allow"
|
|
24
|
+
"diff": "allow"
|
|
25
|
+
"diff *": "allow"
|
|
26
|
+
"gh pr checks": "allow"
|
|
27
|
+
"gh pr checks *": "allow"
|
|
28
|
+
edit: "deny"
|
|
19
29
|
---
|
|
20
30
|
|
|
21
31
|
<system-reminder>
|
|
@@ -67,6 +67,19 @@ npm install
|
|
|
67
67
|
npm test
|
|
68
68
|
```
|
|
69
69
|
|
|
70
|
+
#### TDD Advisory Protocol
|
|
71
|
+
|
|
72
|
+
编码阶段必须遵循 `flow-tdd` skill 定义的 TDD 流程。Agent 在编写任何功能代码前加载 `flow-tdd` skill。
|
|
73
|
+
|
|
74
|
+
**TDD 检查点(commit 前自检):**
|
|
75
|
+
- [ ] 每个功能的代码变更都有对应的测试
|
|
76
|
+
- [ ] 测试在修改前是 RED(失败),修改后是 GREEN(通过)
|
|
77
|
+
- [ ] 已完成 `final-regression`(全部测试通过)
|
|
78
|
+
- [ ] 已完成 `final-verification`(对照 acceptance_criteria)
|
|
79
|
+
- [ ] self-report 已写入 commit message 或 PR body
|
|
80
|
+
|
|
81
|
+
> 引用:`flow-tdd` skill 是 TDD 协议的唯一来源,包含完整的 RED→GREEN cycle 状态机、abandon-cycle 规则和 final-regression/verification 流程。
|
|
82
|
+
|
|
70
83
|
### 6. 文档同步检查
|
|
71
84
|
完成编码后,逐项检查以下文档是否需要同步更新:
|
|
72
85
|
|
|
@@ -39,6 +39,13 @@ gh pr view <pr-number> --json title,body,files
|
|
|
39
39
|
对照 PRD(`docs/prd/`)和设计方案(`docs/dev/specs/`)验证。
|
|
40
40
|
- 如发现实现与设计偏差 → 追加到 `docs/dev/changelog/<YYYY-MM-DD-NNN-slug>.md`
|
|
41
41
|
|
|
42
|
+
**TDD Criterion Coverage** — 检查 Task 的 `acceptance_criteria` 是否被 PR 覆盖:
|
|
43
|
+
- 对照 Task frontmatter 中的 `acceptance` 数组,逐条核查
|
|
44
|
+
- 检查 PR 是否包含每条 criterion 对应的测试或验证
|
|
45
|
+
- 检查 `tdd` 配置块中的 `mode` 和 `min_cycles` 是否被遵循
|
|
46
|
+
- **明确不检查 commit order** — TDD cycle 的 RED→GREEN 顺序是编码过程约束,
|
|
47
|
+
reviewer 不审查 commit 历史是否呈现 RED-first 模式
|
|
48
|
+
|
|
42
49
|
### 5. 合并前检查
|
|
43
50
|
在合并前确认以下项:
|
|
44
51
|
- 文档同步已完成(`docs/guides/` 已更新或无需更新)
|
|
@@ -41,7 +41,39 @@ name: "<task-name>"
|
|
|
41
41
|
depends_on: ["<前置任务>"]
|
|
42
42
|
labels: ["backend"]
|
|
43
43
|
worktree_root: ".worktree/<task-name>/"
|
|
44
|
+
test_commands:
|
|
45
|
+
- "npm test -- <test-file>"
|
|
46
|
+
- "npm run typecheck"
|
|
47
|
+
verify_commands:
|
|
48
|
+
- "npm run lint"
|
|
49
|
+
tdd:
|
|
50
|
+
mode: strict
|
|
51
|
+
min_cycles: 1
|
|
52
|
+
acceptance:
|
|
53
|
+
- criteria: "<验收标准描述>"
|
|
54
|
+
verification_type: test | manual | lint
|
|
55
|
+
test_command: "<关联的测试命令>"
|
|
56
|
+
- criteria: "<另一条验收标准>"
|
|
57
|
+
verification_type: test
|
|
58
|
+
test_command: "npm test -- <other-test>"
|
|
44
59
|
---
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
Task frontmatter 新增字段说明:
|
|
63
|
+
|
|
64
|
+
| 字段 | 类型 | 说明 |
|
|
65
|
+
|------|------|------|
|
|
66
|
+
| `test_commands` | `string[]` | TDD cycle 中运行的测试命令列表 |
|
|
67
|
+
| `verify_commands` | `string[]` | final-verification 阶段运行的验证命令 |
|
|
68
|
+
| `tdd.mode` | `"strict" \| "advisory"` | TDD 模式,默认 `strict` |
|
|
69
|
+
| `tdd.min_cycles` | `number` | 最少 RED→GREEN cycle 数量,默认 `1` |
|
|
70
|
+
| `acceptance` | `object[]` | 结构化验收标准列表 |
|
|
71
|
+
| `acceptance[].criteria` | `string` | 验收标准描述 |
|
|
72
|
+
| `acceptance[].verification_type` | `"test" \| "manual" \| "lint"` | 验证方式 |
|
|
73
|
+
| `acceptance[].test_command` | `string` | 关联的测试命令(verification_type 为 test 时必填) |
|
|
74
|
+
|
|
75
|
+
`tdd` 配置块为 `flow-tdd` skill 提供运行时参数。模式默认 `strict`,
|
|
76
|
+
表示 Agent 必须遵循 RED→GREEN→final-regression→final-verification 完整流程。
|
|
45
77
|
|
|
46
78
|
## 目标
|
|
47
79
|
|
|
@@ -49,6 +81,16 @@ worktree_root: ".worktree/<task-name>/"
|
|
|
49
81
|
|
|
50
82
|
## 验收标准
|
|
51
83
|
|
|
84
|
+
验收标准以结构化 `acceptance` 数组形式定义在 frontmatter 中(见上方模板)。
|
|
85
|
+
每条标准包含 `criteria`(描述)、`verification_type`(验证方式)和 `test_command`(关联命令)。
|
|
86
|
+
`flow-tdd` skill 在 final-verification 阶段逐条核验这些标准。
|
|
87
|
+
|
|
88
|
+
## TDD 集成
|
|
89
|
+
|
|
90
|
+
本 skill 生成的 `test_commands`、`verify_commands`、`tdd` 配置块和 `acceptance_criteria`
|
|
91
|
+
是 `flow-tdd` skill 的输入。`flow-tdd` 根据这些字段执行 RED→GREEN cycle、
|
|
92
|
+
final-regression 和 final-verification。
|
|
93
|
+
|
|
52
94
|
## Worktree
|
|
53
95
|
- 路径: `.worktree/<task-name>/`
|
|
54
96
|
- 分支: `feat/<task-name>`
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: flow-tdd
|
|
3
|
+
description: TDD Prompt 协议 — Phase A Advisory 层,定义 RED→GREEN self-reported 流程
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# flow-tdd
|
|
7
|
+
|
|
8
|
+
TDD(Test-Driven Development)Prompt 协议,为所有编码阶段提供统一的 TDD 流程约束。
|
|
9
|
+
本 skill 是 TDD 协议的唯一来源,其他 skills 和 agents 通过引用本协议获得一致的 TDD 行为。
|
|
10
|
+
|
|
11
|
+
## Advisory Procedure
|
|
12
|
+
|
|
13
|
+
Phase A Advisory 层协议:Agent 自行遵循 TDD 流程并 self-report 状态,无需工具拦截。
|
|
14
|
+
|
|
15
|
+
### Cycle 状态机
|
|
16
|
+
|
|
17
|
+
```
|
|
18
|
+
┌─────────────┐
|
|
19
|
+
│ cycle-start │ ← 开始新的 TDD 循环
|
|
20
|
+
└──────┬──────┘
|
|
21
|
+
│
|
|
22
|
+
▼
|
|
23
|
+
┌─────────────┐
|
|
24
|
+
│ red │ ← 编写/更新测试,验证测试失败(RED)
|
|
25
|
+
└──────┬──────┘
|
|
26
|
+
│
|
|
27
|
+
▼
|
|
28
|
+
┌─────────────┐
|
|
29
|
+
│ green │ ← 最小实现使测试通过(GREEN),可在此阶段重构
|
|
30
|
+
└──────┬──────┘
|
|
31
|
+
│
|
|
32
|
+
┌──────────┼──────────┐
|
|
33
|
+
▼ ▼ ▼
|
|
34
|
+
┌─────────┐ ┌─────────┐ ┌──────────────┐
|
|
35
|
+
│ 下一个 │ │ abandon │ │ 所有 cycle │
|
|
36
|
+
│ cycle │ │ -cycle │ │ 完成 │
|
|
37
|
+
└─────────┘ └─────────┘ └──────┬───────┘
|
|
38
|
+
│
|
|
39
|
+
▼
|
|
40
|
+
┌──────────────────┐
|
|
41
|
+
│ final-regression │ ← 运行全部测试,确认无回归
|
|
42
|
+
└────────┬─────────┘
|
|
43
|
+
│
|
|
44
|
+
▼
|
|
45
|
+
┌───────────────────┐
|
|
46
|
+
│ final-verification│ ← 对照 acceptance_criteria 逐条验证
|
|
47
|
+
└───────────────────┘
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
### cycle-start
|
|
51
|
+
|
|
52
|
+
开始一个新的 RED→GREEN 循环。Agent 在开始实现前声明当前 cycle 的目标(要实现的测试/功能)。
|
|
53
|
+
|
|
54
|
+
**self-report 格式:**
|
|
55
|
+
```
|
|
56
|
+
## TDD cycle-start
|
|
57
|
+
- cycle: <序号>
|
|
58
|
+
- target: <本 cycle 要实现的功能/测试描述>
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
### red
|
|
62
|
+
|
|
63
|
+
编写或更新测试用例,验证测试在当前实现下失败。
|
|
64
|
+
|
|
65
|
+
**约束:**
|
|
66
|
+
- 测试必须有明确的 fail/pass 边界
|
|
67
|
+
- 测试运行命令必须与 `test_commands` 中定义的一致
|
|
68
|
+
- 记录测试失败输出作为 RED evidence
|
|
69
|
+
|
|
70
|
+
**self-report 格式:**
|
|
71
|
+
```
|
|
72
|
+
## TDD red
|
|
73
|
+
- test: <测试名称>
|
|
74
|
+
- command: <运行命令>
|
|
75
|
+
- result: FAIL(预期)
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
### green
|
|
79
|
+
|
|
80
|
+
编写最小实现使 RED 阶段编写的测试通过。可在此阶段进行局部重构(消除重复、改善命名等),但不应扩展范围。
|
|
81
|
+
|
|
82
|
+
**约束:**
|
|
83
|
+
- 只写使当前测试通过的最少代码
|
|
84
|
+
- 不新增与当前 test 无关的功能
|
|
85
|
+
- 重构仅限于当前 cycle 涉及的代码
|
|
86
|
+
|
|
87
|
+
**self-report 格式:**
|
|
88
|
+
```
|
|
89
|
+
## TDD green
|
|
90
|
+
- test: <测试名称>
|
|
91
|
+
- command: <运行命令>
|
|
92
|
+
- result: PASS
|
|
93
|
+
- changes: <涉及的文件列表>
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
### abandon-cycle
|
|
97
|
+
|
|
98
|
+
当发现当前 cycle 的目标不合理、设计有缺陷或需要回退时,废弃当前 cycle 的所有修改。
|
|
99
|
+
|
|
100
|
+
**触发条件:**
|
|
101
|
+
- RED 阶段发现测试设计有误
|
|
102
|
+
- GREEN 阶段发现需要根本性重新设计
|
|
103
|
+
- 发现更简单的替代方案
|
|
104
|
+
|
|
105
|
+
**流程:**
|
|
106
|
+
1. 放弃当前 cycle 的修改(`git checkout -- <files>` 或 `git stash drop`)
|
|
107
|
+
2. 记录 abandon 原因
|
|
108
|
+
3. 重新从 cycle-start 开始
|
|
109
|
+
|
|
110
|
+
**self-report 格式:**
|
|
111
|
+
```
|
|
112
|
+
## TDD abandon-cycle
|
|
113
|
+
- cycle: <序号>
|
|
114
|
+
- reason: <废弃原因>
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
### final-regression
|
|
118
|
+
|
|
119
|
+
所有 cycle 完成后,运行项目全部测试套件,确认无回归。
|
|
120
|
+
|
|
121
|
+
**约束:**
|
|
122
|
+
- 必须运行 `test_commands` 中定义的全部命令
|
|
123
|
+
- 所有测试必须通过
|
|
124
|
+
- 如有失败 → 修复(不要求新 cycle,但需记录修复内容)
|
|
125
|
+
|
|
126
|
+
**self-report 格式:**
|
|
127
|
+
```
|
|
128
|
+
## TDD final-regression
|
|
129
|
+
- passed: <通过的测试数>
|
|
130
|
+
- failed: <失败的测试数>
|
|
131
|
+
- total: <测试总数>
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
### final-verification
|
|
135
|
+
|
|
136
|
+
对照 Task 的 `acceptance_criteria` 逐条验证,确认全部满足。
|
|
137
|
+
|
|
138
|
+
**self-report 格式:**
|
|
139
|
+
```
|
|
140
|
+
## TDD final-verification
|
|
141
|
+
- criteria_total: <总数>
|
|
142
|
+
- criteria_met: <已满足>
|
|
143
|
+
- criteria_pending: <未满足>
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
## Runtime Procedure
|
|
147
|
+
|
|
148
|
+
> **Phase C 启用** — 以下为 Runtime Enforcement 协议占位,当前阶段不生效。
|
|
149
|
+
>
|
|
150
|
+
> Phase C 将引入 `tdd_checkpoint` 工具在运行时拦截 RED/GREEN 状态切换,
|
|
151
|
+
> 并将 evidence 写入 FlowRun 存储。Agent 不直接调用这些工具的时机和方式
|
|
152
|
+
> 由 Phase C 的 `tdd_checkpoint` 工具实现决定。
|
|
153
|
+
|
|
154
|
+
<!--
|
|
155
|
+
Phase C 启用后的 Runtime Procedure:
|
|
156
|
+
1. cycle-start → tdd_checkpoint({ stage: "cycle-start", task_id })
|
|
157
|
+
2. red → tdd_checkpoint({ stage: "red", evidence: test_output, task_id })
|
|
158
|
+
3. green → tdd_checkpoint({ stage: "green", evidence: test_output, task_id })
|
|
159
|
+
4. abandon-cycle → tdd_checkpoint({ stage: "abandon-cycle", reason, task_id })
|
|
160
|
+
5. final-regression → tdd_checkpoint({ stage: "final-regression", evidence: full_test_output, task_id })
|
|
161
|
+
6. final-verification → tdd_checkpoint({ stage: "final-verification", evidence: criteria_checklist, task_id })
|
|
162
|
+
-->
|
|
163
|
+
|
|
164
|
+
## Contract
|
|
165
|
+
|
|
166
|
+
### Trigger
|
|
167
|
+
由编码阶段(`flow-code`)自动触发。Agent 在开始编码任务时加载 `flow-tdd` skill 获取 TDD 流程约束。
|
|
168
|
+
|
|
169
|
+
### Inputs
|
|
170
|
+
- Task 定义中的 `acceptance_criteria`(来源:`flow-tasks` 产出)
|
|
171
|
+
- Task 定义中的 `test_commands`(来源:`flow-tasks` 产出)
|
|
172
|
+
- Task 定义中的 `verify_commands`(来源:`flow-tasks` 产出)
|
|
173
|
+
- Task 定义中的 `tdd` 配置块 — `mode`(`strict`/`advisory`)、`min_cycles`(来源:`flow-tasks` 产出)
|
|
174
|
+
|
|
175
|
+
### Preconditions
|
|
176
|
+
- Task 文件存在,包含 `acceptance_criteria`、`test_commands`、`tdd` 配置块
|
|
177
|
+
- 测试运行环境就绪(`npm install` 已完成)
|
|
178
|
+
|
|
179
|
+
### Procedure
|
|
180
|
+
1. 读取 Task 的 `acceptance_criteria`、`test_commands`、`verify_commands`
|
|
181
|
+
2. **Advisory Mode**:为每个验收标准识别对应的测试用例
|
|
182
|
+
3. 执行 `cycle-start` → 声明当前 cycle 目标
|
|
183
|
+
4. 执行 `red` → 编写测试,验证失败
|
|
184
|
+
5. 执行 `green` → 最小实现,验证通过
|
|
185
|
+
6. 重复 cycle 直到所有 criterion 覆盖
|
|
186
|
+
7. 执行 `final-regression` → 运行全部测试
|
|
187
|
+
8. 执行 `final-verification` → 逐条对照 acceptance_criteria
|
|
188
|
+
|
|
189
|
+
### Outputs
|
|
190
|
+
- 每个 cycle 的 self-report(提交到 commit message 或 PR body)
|
|
191
|
+
- `final-regression` 报告(测试通过/失败统计)
|
|
192
|
+
- `final-verification` 报告(criterion 覆盖情况)
|
|
193
|
+
|
|
194
|
+
### Failure
|
|
195
|
+
- RED 阶段测试意外通过 → 检查测试是否有意义,可能需要 abandon-cycle
|
|
196
|
+
- GREEN 阶段测试持续失败 → 检查实现逻辑,记录失败原因
|
|
197
|
+
- final-regression 失败 → 修复回归,不要求新 cycle
|
|
198
|
+
- final-verification 未全部满足 → 返回未完成的 criterion,补充 cycle
|
|
199
|
+
|
|
200
|
+
### Idempotency
|
|
201
|
+
- 同一 cycle 重复执行 → 以最后一次结果为准
|
|
202
|
+
- final-regression 重复执行 → 覆盖上次结果
|
|
203
|
+
|
|
204
|
+
### Prohibited Actions
|
|
205
|
+
- 不跳过 RED 阶段直接进入 GREEN
|
|
206
|
+
- 不跳过 final-regression 直接 commit
|
|
207
|
+
- 不在 abandon-cycle 后保留修改
|
|
208
|
+
- 不修改 `tdd` 配置块中的 `mode` 和 `min_cycles` 值
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import type { TddRunnerPolicy, TddCommandEvidence, TddFailureKind } from "./types.js";
|
|
2
|
+
export interface VitestOutput {
|
|
3
|
+
exitCode: number | null;
|
|
4
|
+
testsCollected: number | null;
|
|
5
|
+
testsFailed: number | null;
|
|
6
|
+
stdout: string;
|
|
7
|
+
stderr: string;
|
|
8
|
+
timedOut: boolean;
|
|
9
|
+
}
|
|
10
|
+
/** classifyVitestFailure 的输入 */
|
|
11
|
+
export interface FailureInput {
|
|
12
|
+
exitCode: number | null;
|
|
13
|
+
testsCollected: number | null;
|
|
14
|
+
testsFailed: number | null;
|
|
15
|
+
stderr: string;
|
|
16
|
+
timedOut?: boolean;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* 校验 test selector 语法安全。
|
|
20
|
+
* 拒绝 shell 元字符、命令替换、换行等。
|
|
21
|
+
*/
|
|
22
|
+
export declare function validateSelector(selector: string): void;
|
|
23
|
+
/**
|
|
24
|
+
* 将 baseCommand 字符串解析为 argv 数组并附加 selector。
|
|
25
|
+
*/
|
|
26
|
+
export declare function buildVitestArgs(policy: TddRunnerPolicy, selector: string): string[];
|
|
27
|
+
/**
|
|
28
|
+
* 执行 vitest 命令并捕获输出。
|
|
29
|
+
*/
|
|
30
|
+
export declare function executeVitest(args: string[], cwd: string, timeoutMs: number): Promise<VitestOutput>;
|
|
31
|
+
/**
|
|
32
|
+
* 根据 vitest 输出分类失败类型。
|
|
33
|
+
*
|
|
34
|
+
* 规则:
|
|
35
|
+
* - timeout → "timeout"
|
|
36
|
+
* - 成功启动 + 收集测试 + assertion 失败 → "assertion"(RED)
|
|
37
|
+
* - 成功启动 + 目标代码不存在 → "missing-behavior"(RED)
|
|
38
|
+
* - config/transform/dep 错误 → "infrastructure"
|
|
39
|
+
* - 零测试收集 → "infrastructure"
|
|
40
|
+
*/
|
|
41
|
+
export declare function classifyVitestFailure(input: FailureInput): TddFailureKind | null;
|
|
42
|
+
/**
|
|
43
|
+
* 执行 RED check:运行 vitest focused test,返回 TddCommandEvidence。
|
|
44
|
+
*
|
|
45
|
+
* @param policy - TDD runner policy(含 baseCommand、timeoutMs 等)
|
|
46
|
+
* @param selector - focused test selector(文件路径或 vitest flag)
|
|
47
|
+
* @param cwd - 工作目录
|
|
48
|
+
*/
|
|
49
|
+
export declare function executeRedCheck(policy: TddRunnerPolicy, selector: string, cwd: string): Promise<TddCommandEvidence>;
|