@devcxl/opencode-cabbage 1.1.0 → 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/.codex-plugin/plugin.json +36 -0
- package/README.md +53 -25
- package/README.zh.md +23 -23
- package/assets/agents/dev-lifecycle.md +208 -68
- package/assets/agents/team/architect.md +22 -7
- package/assets/agents/team/developer.md +13 -6
- package/assets/agents/team/goal-verify.md +4 -1
- package/assets/agents/team/researcher.md +59 -0
- package/assets/agents/team/reviewer.md +34 -18
- package/assets/commands/setup.md +1 -1
- package/assets/prompts/bootstrap.md +10 -9
- package/assets/prompts/stage-contract.md +25 -25
- package/assets/skills/flow-code/SKILL.md +23 -25
- package/assets/skills/flow-design/SKILL.md +94 -26
- package/assets/skills/flow-release/SKILL.md +41 -17
- package/assets/skills/flow-requirements/SKILL.md +19 -13
- package/assets/skills/flow-research/SKILL.md +77 -0
- package/assets/skills/flow-review/SKILL.md +55 -25
- package/assets/skills/flow-setup/SKILL.md +27 -24
- package/assets/skills/flow-tasks/SKILL.md +178 -35
- package/assets/skills/flow-tdd/SKILL.md +68 -40
- package/codex-skills/agent-architect/SKILL.md +79 -0
- package/codex-skills/agent-dev-lifecycle/SKILL.md +309 -0
- package/codex-skills/agent-developer/SKILL.md +51 -0
- package/codex-skills/agent-goal-verify/SKILL.md +45 -0
- package/codex-skills/agent-researcher/SKILL.md +32 -0
- package/codex-skills/agent-reviewer/SKILL.md +109 -0
- package/codex-skills/flow-code/SKILL.md +71 -0
- package/codex-skills/flow-design/SKILL.md +146 -0
- package/codex-skills/flow-release/SKILL.md +90 -0
- package/codex-skills/flow-requirements/SKILL.md +90 -0
- package/codex-skills/flow-research/SKILL.md +77 -0
- package/codex-skills/flow-review/SKILL.md +110 -0
- package/codex-skills/flow-setup/SKILL.md +75 -0
- package/codex-skills/flow-tasks/SKILL.md +220 -0
- package/codex-skills/flow-tdd/SKILL.md +235 -0
- package/dist/hooks/session-start.d.ts +1 -0
- package/dist/hooks/session-start.js +72 -0
- package/dist/hooks/session-start.js.map +1 -0
- package/dist/kernel/session-index.d.ts +8 -25
- package/dist/kernel/session-index.js +5 -55
- package/dist/kernel/session-index.js.map +1 -1
- package/dist/plugin/bootstrap.d.ts +0 -1
- package/dist/plugin/bootstrap.js +0 -3
- package/dist/plugin/bootstrap.js.map +1 -1
- package/dist/plugin/goal-store.d.ts +71 -0
- package/dist/plugin/goal-store.js +54 -0
- package/dist/plugin/goal-store.js.map +1 -0
- package/dist/plugin/goal.d.ts +47 -13
- package/dist/plugin/goal.js +228 -128
- package/dist/plugin/goal.js.map +1 -1
- package/dist/plugin/prompt-lint.js +3 -11
- package/dist/plugin/prompt-lint.js.map +1 -1
- package/dist/plugin/prompts.d.ts +0 -1
- package/dist/plugin/prompts.js +0 -4
- package/dist/plugin/prompts.js.map +1 -1
- package/dist/plugin/server.d.ts +3 -5
- package/dist/plugin/server.js +247 -155
- package/dist/plugin/server.js.map +1 -1
- package/dist/plugin/skills.d.ts +7 -1
- package/dist/plugin/skills.js +75 -12
- package/dist/plugin/skills.js.map +1 -1
- package/dist/plugin.d.ts +0 -1
- package/dist/plugin.js +1 -4
- package/dist/plugin.js.map +1 -1
- package/dist/util/gh.d.ts +0 -11
- package/dist/util/gh.js +0 -14
- package/dist/util/gh.js.map +1 -1
- package/dist/util/paths.d.ts +0 -14
- package/dist/util/paths.js +0 -69
- package/dist/util/paths.js.map +1 -1
- package/hooks/hooks.json +17 -0
- package/package.json +12 -4
- package/assets/prompts/ADR-FORMAT.md +0 -45
- package/assets/prompts/PRD-FORMAT.md +0 -17
- package/assets/templates/gitignore +0 -5
- package/dist/kernel/caller.d.ts +0 -48
- package/dist/kernel/caller.js +0 -88
- package/dist/kernel/caller.js.map +0 -1
- package/dist/kernel/flow.d.ts +0 -175
- package/dist/kernel/flow.js +0 -467
- package/dist/kernel/flow.js.map +0 -1
- package/dist/kernel/legacy.d.ts +0 -19
- package/dist/kernel/legacy.js +0 -34
- package/dist/kernel/legacy.js.map +0 -1
- package/dist/kernel/records.d.ts +0 -103
- package/dist/kernel/records.js +0 -240
- package/dist/kernel/records.js.map +0 -1
- package/dist/kernel/release.d.ts +0 -106
- package/dist/kernel/release.js +0 -241
- package/dist/kernel/release.js.map +0 -1
- package/dist/kernel/review.d.ts +0 -34
- package/dist/kernel/review.js +0 -82
- package/dist/kernel/review.js.map +0 -1
- package/dist/kernel/setup.d.ts +0 -95
- package/dist/kernel/setup.js +0 -401
- package/dist/kernel/setup.js.map +0 -1
- package/dist/kernel/slug.d.ts +0 -23
- package/dist/kernel/slug.js +0 -67
- package/dist/kernel/slug.js.map +0 -1
- package/dist/kernel/task.d.ts +0 -213
- package/dist/kernel/task.js +0 -873
- package/dist/kernel/task.js.map +0 -1
- package/dist/kernel/tdd/adapter.d.ts +0 -49
- package/dist/kernel/tdd/adapter.js +0 -294
- package/dist/kernel/tdd/adapter.js.map +0 -1
- package/dist/kernel/tdd/digest.d.ts +0 -18
- package/dist/kernel/tdd/digest.js +0 -303
- package/dist/kernel/tdd/digest.js.map +0 -1
- package/dist/kernel/tdd/evaluator.d.ts +0 -38
- package/dist/kernel/tdd/evaluator.js +0 -185
- package/dist/kernel/tdd/evaluator.js.map +0 -1
- package/dist/kernel/tdd/evidence.d.ts +0 -42
- package/dist/kernel/tdd/evidence.js +0 -48
- package/dist/kernel/tdd/evidence.js.map +0 -1
- package/dist/kernel/tdd/state.d.ts +0 -79
- package/dist/kernel/tdd/state.js +0 -363
- package/dist/kernel/tdd/state.js.map +0 -1
- package/dist/kernel/types.d.ts +0 -180
- package/dist/kernel/types.js +0 -2
- package/dist/kernel/types.js.map +0 -1
- package/dist/kernel/worktree.d.ts +0 -45
- package/dist/kernel/worktree.js +0 -156
- package/dist/kernel/worktree.js.map +0 -1
- package/dist/plugin/flow-control.d.ts +0 -91
- package/dist/plugin/flow-control.js +0 -287
- package/dist/plugin/flow-control.js.map +0 -1
- package/dist/plugin/release-control.d.ts +0 -39
- package/dist/plugin/release-control.js +0 -343
- package/dist/plugin/release-control.js.map +0 -1
- package/dist/plugin/setup-control.d.ts +0 -59
- package/dist/plugin/setup-control.js +0 -111
- package/dist/plugin/setup-control.js.map +0 -1
- package/dist/plugin/task-control.d.ts +0 -90
- package/dist/plugin/task-control.js +0 -208
- package/dist/plugin/task-control.js.map +0 -1
- package/dist/plugin/tdd-checkpoint.d.ts +0 -128
- package/dist/plugin/tdd-checkpoint.js +0 -664
- package/dist/plugin/tdd-checkpoint.js.map +0 -1
- package/dist/util/shell.d.ts +0 -1
- package/dist/util/shell.js +0 -4
- package/dist/util/shell.js.map +0 -1
|
@@ -1,41 +1,46 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: flow-setup
|
|
3
|
-
description: 初始化 — 探测环境 →
|
|
3
|
+
description: 初始化 — 探测环境 → 确认 Profile
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# flow-setup
|
|
7
7
|
|
|
8
|
-
|
|
9
|
-
|
|
8
|
+
初始化阶段:探测开发环境、确认 AGENTS.md Project Profile。
|
|
9
|
+
纯 Prompt 流程:直接使用 git/gh 命令探测,Profile 由用户确认后写入根 AGENTS.md。
|
|
10
10
|
|
|
11
|
-
##
|
|
11
|
+
## 核心流程
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
1. **探测环境**
|
|
14
|
+
```bash
|
|
15
|
+
gh auth status # gh CLI 认证
|
|
16
|
+
gh repo view --json nameWithOwner,defaultBranchRef # 仓库与默认分支
|
|
17
|
+
ls .github/workflows/ # 现有 CI/release workflow
|
|
18
|
+
```
|
|
14
19
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
20
|
+
2. **确认 Project Profile**:向用户逐项确认以下配置(技术栈无关):
|
|
21
|
+
- test command:测试命令(如 `npm test`)
|
|
22
|
+
- regression command:全量回归命令
|
|
23
|
+
- test file patterns:测试文件匹配(如 `test/**/*.test.ts`)
|
|
24
|
+
- implementation file patterns:实现文件匹配(如 `src/**/*.ts`)
|
|
25
|
+
- version bump rule、version file、tag format、release workflow
|
|
18
26
|
|
|
19
|
-
Profile
|
|
27
|
+
3. **写入根 AGENTS.md**:用户确认后,将 Profile 区块追加/替换到根 `AGENTS.md`:
|
|
20
28
|
|
|
21
29
|
```markdown
|
|
22
30
|
## Project Profile
|
|
23
31
|
|
|
24
|
-
- test command: `npm test
|
|
32
|
+
- test command: `npm test`
|
|
33
|
+
- regression command: `npm test`
|
|
25
34
|
- test file patterns: `test/**/*.test.ts`
|
|
26
35
|
- implementation file patterns: `src/**/*.ts`
|
|
27
|
-
- tdd default mode: `strict`
|
|
28
36
|
- version bump rule: `breaking→major, feature→minor, fix→patch`
|
|
29
37
|
- version file: `package.json`
|
|
30
38
|
- tag format: `v{version}`
|
|
31
39
|
- release workflow: `.github/workflows/release.yml`
|
|
32
40
|
```
|
|
33
41
|
|
|
34
|
-
未确认 Profile 时 `flow_control{op:"create-flow"}` 会阻断并提示先执行 `/setup`。
|
|
35
|
-
|
|
36
42
|
## Output
|
|
37
|
-
- readiness 报告(
|
|
38
|
-
- `.github/workflows/` 草案(缺失时,经 Setup PR 人工合入)
|
|
43
|
+
- readiness 报告(git/gh 可用性、CI/release workflow 存在性)
|
|
39
44
|
- 根 AGENTS.md `## Project Profile` 区块
|
|
40
45
|
|
|
41
46
|
## Contract
|
|
@@ -50,23 +55,21 @@ Profile 区块格式(内核解析白名单,§9.1):
|
|
|
50
55
|
- gh CLI 已认证(宿主 `gh auth`)
|
|
51
56
|
|
|
52
57
|
### Procedure
|
|
53
|
-
1.
|
|
54
|
-
2. 缺失 workflow
|
|
55
|
-
3.
|
|
58
|
+
1. 用 gh/git 命令探测环境,输出 readiness 报告
|
|
59
|
+
2. 缺失 CI/release workflow 时提示用户(可手工创建)
|
|
60
|
+
3. 向用户逐项确认 Profile 配置
|
|
61
|
+
4. 用户确认后写入根 AGENTS.md Profile 区块
|
|
56
62
|
|
|
57
63
|
### Outputs
|
|
58
64
|
- readiness 报告
|
|
59
|
-
- workflow 草案(可选)
|
|
60
65
|
- 根 AGENTS.md Profile 区块
|
|
61
66
|
|
|
62
67
|
### Failure
|
|
63
68
|
- gh auth 失败 → 提示用户执行 `gh auth login` 后重试
|
|
64
|
-
- workflow 生成失败 → 报告错误并停止
|
|
65
69
|
|
|
66
70
|
### Idempotency
|
|
67
|
-
- Profile
|
|
68
|
-
- workflow 已存在 → 跳过生成
|
|
71
|
+
- Profile 已存在 → 覆盖为最新确认值
|
|
69
72
|
|
|
70
73
|
### Prohibited Actions
|
|
71
|
-
-
|
|
72
|
-
-
|
|
74
|
+
- 不写入未获用户确认的 Profile 项
|
|
75
|
+
- 不假设测试命令为 npm(按用户确认的技术栈)
|
|
@@ -1,77 +1,220 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: flow-tasks
|
|
3
|
-
description:
|
|
3
|
+
description: 将技术方案拆解为可独立实现的 tracer-bullet Task Plan 与 DAG
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# flow-tasks
|
|
7
7
|
|
|
8
|
-
将设计方案拆解为
|
|
8
|
+
将设计方案拆解为 Task Plan 与 DAG(有向无环图)。每个 Task 都是一条完整但狭窄的行为切片,可以交给一个 fresh-context developer agent 独立实现和验证。
|
|
9
9
|
|
|
10
|
-
|
|
10
|
+
本 skill 只定义任务拆解与 Task Plan 产出。`@architect` 不创建 GitHub Issue、不操作 GitHub lifecycle;调用方负责检查并发布 Task Plan。
|
|
11
11
|
|
|
12
|
-
|
|
13
|
-
内核负责 slug 派生与校验、标题规范(R3)、关联 Parent Issue——创建动作全部收敛到工具内。
|
|
12
|
+
## Task 拆解规则
|
|
14
13
|
|
|
15
|
-
|
|
14
|
+
每个 Task 必须:
|
|
16
15
|
|
|
17
|
-
|
|
16
|
+
1. 交付一个可以观察或验证的新行为。
|
|
17
|
+
2. 是垂直切片,而不是 Controller / Service / DAO 等技术分层。
|
|
18
|
+
3. 可以交给一个 fresh-context developer agent 独立理解和实现。
|
|
19
|
+
4. 完成以后仓库处于可工作的状态,而不是为下一个 Task 留空壳。
|
|
20
|
+
5. `Blocked By` 只声明“前者未完成时,本 Task 无法开始”的真实阻塞关系。
|
|
18
21
|
|
|
19
|
-
|
|
20
|
-
2. **拆开后能否独立验证?** — 每个任务必须有独立的验收标准
|
|
21
|
-
3. **拆开后耦合是否最低?** — 两个任务共享大量数据结构/模块 → 合并
|
|
22
|
+
每个 Task 应适合一个 fresh-context developer agent:
|
|
22
23
|
|
|
23
|
-
|
|
24
|
+
- 不需要读取整个 Flow 历史才能理解。
|
|
25
|
+
- Task、Design 与 repository context 足够开始工作。
|
|
26
|
+
- 正常情况下不需要再次进行架构设计。
|
|
27
|
+
- 可以在一次独立开发循环中实现、测试、提交。
|
|
28
|
+
|
|
29
|
+
## 何时拆分
|
|
30
|
+
|
|
31
|
+
不要为了制造并行度而拆 Task。
|
|
32
|
+
|
|
33
|
+
如果一个行为高度内聚、修改范围集中、一个 fresh context 可以完成,且没有独立可验证的中间行为,则保持为一个 Task。
|
|
34
|
+
|
|
35
|
+
如果一个 Task 同时包含三个以上相互独立的“用户可以……”行为,应考虑按这些可独立验证的行为拆分。
|
|
36
|
+
|
|
37
|
+
拆分前检查:
|
|
38
|
+
|
|
39
|
+
1. **能否用一个 Task 完成?** — 足够内聚时不强拆。
|
|
40
|
+
2. **拆开后能否独立验证?** — 每个 Task 都必须交付可观察行为。
|
|
41
|
+
3. **是否真的阻塞?** — 只有无法开始的前置关系才进入 DAG。
|
|
42
|
+
4. **拆开后耦合是否更低?** — 大量共享同一数据结构或模块时优先合并。
|
|
43
|
+
|
|
44
|
+
## Behavior-preserving Pre-refactor
|
|
45
|
+
|
|
46
|
+
行为 Task 的唯一例外是必要的 behavior-preserving pre-refactor:当现有结构使后续行为无法在一个可测试、可工作的垂直切片中安全实现时,可以先建立一个重构 Task。
|
|
47
|
+
|
|
48
|
+
Pre-refactor 必须同时满足:
|
|
49
|
+
|
|
50
|
+
- 不改变现有可观察行为,并用回归验证证明行为保持。
|
|
51
|
+
- 自身完成后仓库保持可工作,不留下迁移一半的状态。
|
|
52
|
+
- 只消除阻碍后续行为的具体结构问题,不搭通用框架、不预留未来扩展点。
|
|
53
|
+
- 后续行为确实无法安全开始时,才将 pre-refactor 声明为 blocking edge。
|
|
54
|
+
|
|
55
|
+
仅仅“这样更整洁”或“以后可能复用”不构成 pre-refactor。优先直接交付行为切片。
|
|
56
|
+
|
|
57
|
+
Pre-refactor 的 `Builds` 应说明“保持哪个现有行为不变,并消除哪个阻碍后续行为的具体结构问题”,不能写成文件或类的修改清单。
|
|
58
|
+
|
|
59
|
+
## 反模式
|
|
24
60
|
|
|
25
61
|
| 反模式 | 示例 | 正确做法 |
|
|
26
62
|
|--------|------|----------|
|
|
27
|
-
| 技术分层拆分 |
|
|
28
|
-
|
|
|
29
|
-
|
|
|
63
|
+
| 技术分层拆分 | `create-session-table` → `implement-session-service` → `implement-session-api` | `create-and-restore-session` |
|
|
64
|
+
| 测试单独成 Task | `add-session-tests` | 测试随行为切片一起交付 |
|
|
65
|
+
| 过度拆分 | 一个内聚 CRUD 拆成多个 Task | 保持为一个可独立验证的 Task |
|
|
66
|
+
| 预留式拆分 | 先搭框架,后续 Task 再填内容 | 每个 Task 完成后仓库都可工作 |
|
|
67
|
+
| 虚假依赖 | 因修改相邻文件而声明依赖 | 仅声明不完成前者就无法开始的依赖 |
|
|
68
|
+
|
|
69
|
+
## Task 定义
|
|
70
|
+
|
|
71
|
+
每个 Task 保存为 `docs/dev/tasks/<task-name>.md`,是 developer 使用的 **Agent Implementation Contract**:
|
|
72
|
+
|
|
73
|
+
`task-name` 使用简短的英文 kebab-case 行为短语,并作为后续 `feat/<task-name>` 分支名的基准。
|
|
74
|
+
|
|
75
|
+
```markdown
|
|
76
|
+
---
|
|
77
|
+
issue: null
|
|
78
|
+
test_commands:
|
|
79
|
+
- <targeted test command>
|
|
80
|
+
verify_commands:
|
|
81
|
+
- <verification command>
|
|
82
|
+
---
|
|
83
|
+
|
|
84
|
+
# <task-slug>
|
|
85
|
+
|
|
86
|
+
## Builds
|
|
87
|
+
|
|
88
|
+
<这个 Task 完成后,哪个端到端行为真正可以工作?>
|
|
89
|
+
|
|
90
|
+
## Acceptance Criteria
|
|
91
|
+
|
|
92
|
+
- [ ] <可观察行为>
|
|
93
|
+
- [ ] <边界或异常行为>
|
|
94
|
+
- [ ] <回归要求>
|
|
95
|
+
|
|
96
|
+
## Blocked By
|
|
30
97
|
|
|
31
|
-
|
|
98
|
+
- <blocking-task-slug>
|
|
99
|
+
- 或 None
|
|
32
100
|
|
|
33
|
-
##
|
|
101
|
+
## Implementation Notes
|
|
34
102
|
|
|
35
|
-
|
|
36
|
-
|
|
103
|
+
<只记录真正限制实现方式的重要设计决策;不要复制具体实现步骤。>
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
`Builds` 必须直接说明完成后的可工作行为。`Acceptance Criteria` 是 `flow-tdd` 使用的行为规格;`test_commands` 与 `verify_commands` 只放在 Task 文件中。
|
|
107
|
+
|
|
108
|
+
Task 的行为测试必须沿用 Design `Testing Decisions` 中约定的 Test Seam。Task 不重新设计 Seam;如果既有 Seam 无法验证该行为,应返回 Design Gap,由调用方在当前 stage 完成 amendment。
|
|
109
|
+
|
|
110
|
+
### Design Gap
|
|
111
|
+
|
|
112
|
+
存量 Design 缺少 `Testing Decisions` 时,不回退 lifecycle stage,也不生成半成品 Task Plan。返回给调用方:
|
|
113
|
+
|
|
114
|
+
```markdown
|
|
115
|
+
## Design Gap
|
|
116
|
+
|
|
117
|
+
- Current Stage: tasks
|
|
118
|
+
- Design File: <docs/dev/specs/...>
|
|
119
|
+
- Missing Behaviors:
|
|
120
|
+
- <缺少 Test Seam 或 Observable Result 的行为>
|
|
121
|
+
- Existing Context: <已发现的公共 Interface 与测试惯例;没有则写 None>
|
|
122
|
+
- Required Amendment: 为以上行为补充 Testing Decisions
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
调用方在当前 tasks 阶段完成 Design Amendment 后,重新执行 Task Planning。`@architect` 不在 flow-tasks 内自行修改测试设计。
|
|
126
|
+
|
|
127
|
+
规划阶段尚无 Issue 编号,`Blocked By` 使用 task slug。发布后由调用方将其更新为真实 `#<issue-number>`;无依赖时写 `None`。
|
|
128
|
+
|
|
129
|
+
## DAG
|
|
130
|
+
|
|
131
|
+
DAG 使用 Mermaid 语法,保存为 `docs/dev/tasks/<YYYY-MM-DD-NNN-slug>/DAG.md`。
|
|
132
|
+
|
|
133
|
+
- 节点对应行为 Task,不对应技术层。
|
|
134
|
+
- 边只表示真实 blocking edge。
|
|
135
|
+
- 发布前必须检查环形依赖。
|
|
136
|
+
- 发布后将 Task 节点与依赖更新为真实 Issue 编号。
|
|
137
|
+
|
|
138
|
+
## GitHub 发布边界
|
|
139
|
+
|
|
140
|
+
GitHub Sub Issue 是协作与生命周期记录,正文只提取 Task 中用户可读的内容:
|
|
141
|
+
|
|
142
|
+
```markdown
|
|
143
|
+
## Builds
|
|
144
|
+
|
|
145
|
+
...
|
|
146
|
+
|
|
147
|
+
## Acceptance Criteria
|
|
148
|
+
|
|
149
|
+
- [ ] ...
|
|
150
|
+
|
|
151
|
+
## Blocked By
|
|
152
|
+
|
|
153
|
+
None
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
不得把 `issue`、`test_commands`、`verify_commands` 或内部实现说明复制到 GitHub Issue。
|
|
157
|
+
|
|
158
|
+
发布由调用方执行:
|
|
159
|
+
|
|
160
|
+
- 普通 Flow:`@dev-lifecycle` 检查后自动发布。
|
|
161
|
+
- 高风险 Flow:展示 Task Plan,用户确认后发布。
|
|
162
|
+
- 用户主动 `/tasks`:展示 Task Plan,等待用户确认后发布。
|
|
163
|
+
- `@architect`:产出并返回 Task Plan 后停止,不执行发布。
|
|
37
164
|
|
|
38
165
|
## Output
|
|
39
|
-
|
|
40
|
-
-
|
|
166
|
+
|
|
167
|
+
- `docs/dev/tasks/*.md` — Agent Implementation Contracts
|
|
168
|
+
- `docs/dev/tasks/<YYYY-MM-DD-NNN-slug>/DAG.md` — Task DAG
|
|
169
|
+
- 返回给调用方的 Task Plan 摘要与拓扑顺序
|
|
41
170
|
|
|
42
171
|
## 后续
|
|
43
|
-
|
|
172
|
+
|
|
173
|
+
- `@dev-lifecycle` 检查并发布 GitHub Sub Issues
|
|
174
|
+
- **/code** — 按 Task DAG 进入编码阶段
|
|
44
175
|
|
|
45
176
|
## Contract
|
|
46
177
|
|
|
47
178
|
### Trigger
|
|
48
|
-
由 `/tasks` 命令或 `@dev-lifecycle` Phase 2 触发。
|
|
179
|
+
由 `/tasks` 命令或 `@dev-lifecycle` Phase 2 委派 `@architect` 触发。
|
|
49
180
|
|
|
50
181
|
### Inputs
|
|
51
182
|
- `docs/dev/specs/<title>.md` — 技术方案
|
|
52
|
-
-
|
|
183
|
+
- 相关 PRD 与 ADR
|
|
184
|
+
- Parent Issue 编号
|
|
53
185
|
|
|
54
186
|
### Preconditions
|
|
55
|
-
- `/design`
|
|
187
|
+
- `/design` 已完成,技术方案和 ADR 存在
|
|
56
188
|
|
|
57
189
|
### Procedure
|
|
58
|
-
1.
|
|
59
|
-
2.
|
|
60
|
-
3.
|
|
190
|
+
1. 读取设计基线与必要的 repository context。
|
|
191
|
+
2. 读取 Design `Testing Decisions`,确认关键行为已有公共 Test Seam;缺失时返回 Design Gap 并停止,不生成或更新 Task 文件。
|
|
192
|
+
3. 识别可独立验证的 tracer-bullet 行为切片;仅在必要时增加 behavior-preserving pre-refactor。
|
|
193
|
+
4. 为每个 Task 定义 `Builds`、`Acceptance Criteria`、`Blocked By` 与必要的 `Implementation Notes`。
|
|
194
|
+
5. 生成 Task 文件与 Mermaid DAG。
|
|
195
|
+
6. 检查技术分层式拆分、空壳 Task、虚假依赖、臆测性 pre-refactor 与环形依赖。
|
|
196
|
+
7. 返回 Task Plan、文件路径与拓扑顺序;不创建 GitHub Issue。
|
|
61
197
|
|
|
62
198
|
### Outputs
|
|
63
|
-
-
|
|
64
|
-
-
|
|
199
|
+
- Task 定义文件
|
|
200
|
+
- Task DAG
|
|
201
|
+
- 供调用方检查与发布的 Task Plan
|
|
202
|
+
- 或结构化 Design Gap(存量 Design 缺少 Testing Decisions 时)
|
|
65
203
|
|
|
66
204
|
### Failure
|
|
205
|
+
- 无法从设计中确定可验证行为 → 暂停并指出缺失信息
|
|
206
|
+
- Design Amendment 后仍缺少稳定 Test Seam → 报告未解决的 Design Gap,由调用方暂停当前阶段
|
|
67
207
|
- DAG 存在环形依赖 → 阻止并报告
|
|
68
|
-
-
|
|
208
|
+
- Task 无法由 fresh-context developer 独立理解 → 重新拆分或补足契约
|
|
69
209
|
|
|
70
210
|
### Idempotency
|
|
71
|
-
-
|
|
72
|
-
-
|
|
211
|
+
- Task 文件已存在 → 读取并更新,不创建重复定义
|
|
212
|
+
- 已有 `issue` 编号 → 保留并交给调用方核验,不重复发布
|
|
73
213
|
|
|
74
214
|
### Prohibited Actions
|
|
75
|
-
-
|
|
76
|
-
-
|
|
77
|
-
-
|
|
215
|
+
- 不按技术层拆分 Task
|
|
216
|
+
- 不为制造并行度而拆分 Task
|
|
217
|
+
- 不创建完成后不可工作的空壳 Task
|
|
218
|
+
- 不用 pre-refactor 包装搭框架、清理代码或预留扩展点
|
|
219
|
+
- 不把非阻塞关系写入 `Blocked By`
|
|
220
|
+
- `@architect` 不执行 `gh issue create`、`git push`、PR、merge 或 worktree 操作
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: flow-tdd
|
|
3
|
-
description:
|
|
3
|
+
description: 公共 Test Seam 上的行为 TDD — RED→GREEN 状态机 + self-report 证据
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# flow-tdd
|
|
@@ -8,9 +8,44 @@ description: TDD Prompt 协议 — RED→GREEN 状态机 + tdd_checkpoint Runtim
|
|
|
8
8
|
TDD(Test-Driven Development)Prompt 协议,为所有编码阶段提供统一的 TDD 流程约束。
|
|
9
9
|
本 skill 是 TDD 协议的唯一来源,其他 skills 和 agents 通过引用本协议获得一致的 TDD 行为。
|
|
10
10
|
|
|
11
|
+
## 核心原则
|
|
12
|
+
|
|
13
|
+
测试是行为规格:通过 Design `Testing Decisions` 约定的公共 Test Seam 验证可观察行为,而不是验证内部实现。只要公共行为不变,重构 Module 内部实现不应导致测试失败。
|
|
14
|
+
|
|
15
|
+
每个 TDD cycle 是一个最窄行为切片:
|
|
16
|
+
|
|
17
|
+
```text
|
|
18
|
+
确定 Test Seam 与一个行为
|
|
19
|
+
↓
|
|
20
|
+
写一个行为测试
|
|
21
|
+
↓
|
|
22
|
+
RED
|
|
23
|
+
↓
|
|
24
|
+
最小实现
|
|
25
|
+
↓
|
|
26
|
+
GREEN
|
|
27
|
+
↓
|
|
28
|
+
下一个行为
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
### 好测试
|
|
32
|
+
|
|
33
|
+
- 名称描述调用者或用户可以完成什么,而不是调用了哪个内部方法。
|
|
34
|
+
- 只通过约定的公共 Test Seam 触发并观察行为。
|
|
35
|
+
- 期望值来自 Acceptance Criteria、已知正确示例或其他独立来源。
|
|
36
|
+
- 实现重构但行为不变时仍然通过。
|
|
37
|
+
|
|
38
|
+
### 反模式
|
|
39
|
+
|
|
40
|
+
- **实现耦合** — 测试私有方法、内部协作对象、调用次数或调用顺序。
|
|
41
|
+
- **侧信道验证** — 绕过公共 Seam 读取数据库或内部状态来证明行为。
|
|
42
|
+
- **循环论证** — 用与实现相同的算法重新计算期望值。
|
|
43
|
+
- **水平批量** — 先写完全部测试再实现;应按一个行为测试 → 一个最小实现逐次推进。
|
|
44
|
+
- **为 mock 造抽象** — 仅允许在真实系统边界按既有 Interface 替换外部依赖,不为测试方便新增生产 Seam。
|
|
45
|
+
|
|
11
46
|
## Advisory Procedure
|
|
12
47
|
|
|
13
|
-
Agent 自行遵循 TDD 流程并 self-report
|
|
48
|
+
Agent 自行遵循 TDD 流程并 self-report 状态。测试质量由仓库 CI 把关,内核不强制证据。
|
|
14
49
|
|
|
15
50
|
### Cycle 状态机
|
|
16
51
|
|
|
@@ -26,7 +61,7 @@ Agent 自行遵循 TDD 流程并 self-report 状态。每个 stage 同时通过
|
|
|
26
61
|
│
|
|
27
62
|
▼
|
|
28
63
|
┌─────────────┐
|
|
29
|
-
│ green │ ← 最小实现使测试通过(GREEN
|
|
64
|
+
│ green │ ← 最小实现使测试通过(GREEN),仅做局部行为保持整理
|
|
30
65
|
└──────┬──────┘
|
|
31
66
|
│
|
|
32
67
|
┌──────────┼──────────┐
|
|
@@ -43,19 +78,21 @@ Agent 自行遵循 TDD 流程并 self-report 状态。每个 stage 同时通过
|
|
|
43
78
|
│
|
|
44
79
|
▼
|
|
45
80
|
┌───────────────────┐
|
|
46
|
-
│ final-verification│ ← 对照
|
|
81
|
+
│ final-verification│ ← 对照 Acceptance Criteria 逐条验证
|
|
47
82
|
└───────────────────┘
|
|
48
83
|
```
|
|
49
84
|
|
|
50
85
|
### cycle-start
|
|
51
86
|
|
|
52
|
-
开始一个新的 RED→GREEN 循环。Agent
|
|
87
|
+
开始一个新的 RED→GREEN 循环。Agent 在实现前从 Design `Testing Decisions` 读取 Test Seam,并声明本 cycle 的一个可观察行为。
|
|
53
88
|
|
|
54
89
|
**self-report 格式:**
|
|
55
90
|
```
|
|
56
91
|
## TDD cycle-start
|
|
57
92
|
- cycle: <序号>
|
|
58
|
-
-
|
|
93
|
+
- behavior: <本 cycle 要交付的可观察行为>
|
|
94
|
+
- test_seam: <约定的公共 Test Seam>
|
|
95
|
+
- test: <通过该 Seam 验证行为的测试名称>
|
|
59
96
|
```
|
|
60
97
|
|
|
61
98
|
### red
|
|
@@ -64,6 +101,8 @@ Agent 自行遵循 TDD 流程并 self-report 状态。每个 stage 同时通过
|
|
|
64
101
|
|
|
65
102
|
**约束:**
|
|
66
103
|
- 测试必须有明确的 fail/pass 边界
|
|
104
|
+
- 测试名称描述行为,且只通过 cycle-start 声明的 Test Seam 触发和观察结果
|
|
105
|
+
- RED 必须因目标行为尚未实现而失败,不能把环境、语法或夹具错误当作证据
|
|
67
106
|
- 测试运行命令必须与 Task 的 `test_commands` 中定义的一致
|
|
68
107
|
- 记录测试失败输出作为 RED evidence
|
|
69
108
|
|
|
@@ -77,12 +116,13 @@ Agent 自行遵循 TDD 流程并 self-report 状态。每个 stage 同时通过
|
|
|
77
116
|
|
|
78
117
|
### green
|
|
79
118
|
|
|
80
|
-
编写最小实现使 RED
|
|
119
|
+
编写最小实现使 RED 阶段的行为测试通过。可进行局部、行为保持的整理,但不得改变约定的 Test Seam 或扩展范围。
|
|
81
120
|
|
|
82
121
|
**约束:**
|
|
83
122
|
- 只写使当前测试通过的最少代码
|
|
84
123
|
- 不新增与当前 test 无关的功能
|
|
85
124
|
- 重构仅限于当前 cycle 涉及的代码
|
|
125
|
+
- 不为通过测试而暴露内部状态、增加仅供测试使用的生产接口或改成实现细节断言
|
|
86
126
|
|
|
87
127
|
**self-report 格式:**
|
|
88
128
|
```
|
|
@@ -133,7 +173,7 @@ Agent 自行遵循 TDD 流程并 self-report 状态。每个 stage 同时通过
|
|
|
133
173
|
|
|
134
174
|
### final-verification
|
|
135
175
|
|
|
136
|
-
对照 Task 的 `
|
|
176
|
+
对照 Task 的 `Acceptance Criteria` 逐条验证,确认每项都由公共 Test Seam 上的行为测试或 `verify_commands` 证明。
|
|
137
177
|
|
|
138
178
|
**self-report 格式:**
|
|
139
179
|
```
|
|
@@ -143,54 +183,40 @@ Agent 自行遵循 TDD 流程并 self-report 状态。每个 stage 同时通过
|
|
|
143
183
|
- criteria_pending: <未满足>
|
|
144
184
|
```
|
|
145
185
|
|
|
146
|
-
## Runtime Procedure
|
|
147
|
-
|
|
148
|
-
每个 stage 通过 `tdd_checkpoint` 提交证据到 Task Record 单个受控评论(marker 包裹,唯一证据源)。
|
|
149
|
-
工具亲自执行测试,不接受内联 evidence;RED 有效性校验(失败分类 + 实现文件相对基线未变 + 输入未偷换)。
|
|
150
|
-
|
|
151
|
-
| Stage | tdd_checkpoint op |
|
|
152
|
-
|-------|-------------------|
|
|
153
|
-
| cycle-start | `tdd_checkpoint{op:"cycle-start", task_id, criterion_id, test_paths, test_selector}` |
|
|
154
|
-
| red | `tdd_checkpoint{op:"red", task_id, cycle_id, test_selector}` — 测试失败 + 实现文件未变 |
|
|
155
|
-
| green | `tdd_checkpoint{op:"green", task_id, cycle_id, test_selector}` — 同 selector 通过 |
|
|
156
|
-
| abandon-cycle | `tdd_checkpoint{op:"abandon-cycle", task_id, cycle_id, reason}` |
|
|
157
|
-
| final-regression | `tdd_checkpoint{op:"final-regression", task_id}` — 全量测试通过 |
|
|
158
|
-
| final-verification | `tdd_checkpoint{op:"final-verification", task_id}` — 每条 criterion 有 pass cycle |
|
|
159
|
-
|
|
160
|
-
纯文档变更豁免:`tdd_checkpoint{op:"not-applicable"}`(仅 primary);其他豁免须用户批准(`exempt-request`)。
|
|
161
|
-
|
|
162
186
|
## Contract
|
|
163
187
|
|
|
164
188
|
### Trigger
|
|
165
189
|
由编码阶段(`flow-code`)自动触发。Agent 在开始编码任务时加载 `flow-tdd` skill 获取 TDD 流程约束。
|
|
166
190
|
|
|
167
191
|
### Inputs
|
|
168
|
-
- Task
|
|
169
|
-
- Task
|
|
170
|
-
-
|
|
171
|
-
- Task Record 中的 `tdd` 配置块 — `mode`(`strict`/`advisory`)、`min_cycles`(来源:`flow-tasks` 产出)
|
|
192
|
+
- Task 文件中的 `Builds` 与 `Acceptance Criteria`(来源:`flow-tasks`)
|
|
193
|
+
- Task frontmatter 中的 `test_commands` 与 `verify_commands`
|
|
194
|
+
- Design `Testing Decisions` 中约定的 Test Seam 与 Observable Result
|
|
172
195
|
|
|
173
196
|
### Preconditions
|
|
174
|
-
- Task
|
|
197
|
+
- Task 文件存在,包含 `Builds`、`Acceptance Criteria`、`test_commands`
|
|
198
|
+
- Design 已为目标行为定义公共 Test Seam;存量 Design 缺失时先向 primary 返回 Design Gap,由兼容门在当前 stage 补齐
|
|
175
199
|
- 测试运行环境就绪(worktree 内依赖已安装)
|
|
176
200
|
|
|
177
201
|
### Procedure
|
|
178
|
-
1. 读取 Task 的 `
|
|
179
|
-
2.
|
|
180
|
-
3.
|
|
181
|
-
4. 执行 `red` →
|
|
182
|
-
5. 执行 `green` →
|
|
183
|
-
6.
|
|
184
|
-
7. 执行 `final-regression` →
|
|
185
|
-
8. 执行 `final-verification` →
|
|
202
|
+
1. 读取 Task 的 `Builds`、`Acceptance Criteria`、`test_commands`、`verify_commands`。
|
|
203
|
+
2. 读取 Design `Testing Decisions`,确认目标行为的 Test Seam 与 Observable Result。
|
|
204
|
+
3. 选择一个尚未满足的行为,执行 `cycle-start` 声明 behavior、test_seam 与 test。
|
|
205
|
+
4. 执行 `red` → 只写该行为测试,验证因行为缺失而失败,记录 self-report。
|
|
206
|
+
5. 执行 `green` → 编写最小实现,验证通过,记录 self-report。
|
|
207
|
+
6. 按一个行为切片一个 cycle 重复,直到所有 Acceptance Criteria 被覆盖。
|
|
208
|
+
7. 执行 `final-regression` → 运行全部测试。
|
|
209
|
+
8. 执行 `final-verification` → 通过 Test Seam 或 `verify_commands` 逐条验证 Acceptance Criteria。
|
|
186
210
|
|
|
187
211
|
### Outputs
|
|
188
|
-
- 每个 cycle 的 self-report
|
|
212
|
+
- 每个 cycle 的 self-report
|
|
189
213
|
- `final-regression` 报告(测试通过/失败统计)
|
|
190
214
|
- `final-verification` 报告(criterion 覆盖情况)
|
|
191
215
|
|
|
192
216
|
### Failure
|
|
193
217
|
- RED 阶段测试意外通过 → 检查测试是否有意义,可能需要 abandon-cycle
|
|
218
|
+
- RED 因环境、语法或夹具错误失败 → 修复测试基础设施,不能计为 RED evidence
|
|
219
|
+
- 只能通过内部实现观察目标行为 → 停止编码并向 primary 返回 Design Gap,不自行修改 Design、不回退 lifecycle stage
|
|
194
220
|
- GREEN 阶段测试持续失败 → 检查实现逻辑,记录失败原因
|
|
195
221
|
- final-regression 失败 → 修复回归,不要求新 cycle
|
|
196
222
|
- final-verification 未全部满足 → 返回未完成的 criterion,补充 cycle
|
|
@@ -201,7 +227,9 @@ Agent 自行遵循 TDD 流程并 self-report 状态。每个 stage 同时通过
|
|
|
201
227
|
|
|
202
228
|
### Prohibited Actions
|
|
203
229
|
- 不跳过 RED 阶段直接进入 GREEN
|
|
230
|
+
- 不测试私有方法、内部调用次数、内部调用顺序或未约定的侧信道
|
|
231
|
+
- 不一次批量编写多个行为测试后再统一实现
|
|
232
|
+
- 不为了 mock 或测试方便新增生产抽象
|
|
204
233
|
- 不跳过 final-regression 直接 commit
|
|
205
234
|
- 不在 abandon-cycle 后保留修改
|
|
206
|
-
-
|
|
207
|
-
- 不伪造/内联 tdd_checkpoint evidence(工具亲自执行测试)
|
|
235
|
+
- 不伪造测试结果(实际运行命令后再 self-report)
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: agent-architect
|
|
3
|
+
description: 负责需求分析、架构设计、技术方案和 DAG 任务拆解
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
<system-reminder>
|
|
7
|
+
你是团队中的 @agent-architect,负责架构设计和技术方案。
|
|
8
|
+
|
|
9
|
+
你的输出直接指导 @agent-developer 实现。
|
|
10
|
+
|
|
11
|
+
**技能归属**:本 agent 只加载 `flow-design`(技术设计)、`flow-tasks`(任务拆解)两个 skill;禁止加载其他 skill。
|
|
12
|
+
|
|
13
|
+
## 工程原则(铁律)
|
|
14
|
+
|
|
15
|
+
以下原则贯穿设计和实现的全链路,你设计的每个方案必须满足这些原则。
|
|
16
|
+
|
|
17
|
+
### KISS(Keep It Simple, Stupid)
|
|
18
|
+
选择能工作的最简单方案。如果两个方案都能满足 PRD,选更简单的。
|
|
19
|
+
如果方案让你犹豫"是不是过度设计"——那就是。
|
|
20
|
+
|
|
21
|
+
### YAGNI(You Ain't Gonna Need It)
|
|
22
|
+
只设计当前 PRD 明确要求的功能。不做"将来可能需要"的扩展点、
|
|
23
|
+
不预留"以后会用到"的抽象、不添加"万一需要"的模块。
|
|
24
|
+
|
|
25
|
+
### DRY(Don't Repeat Yourself)
|
|
26
|
+
相同逻辑出现 3 次以上才考虑抽象。2 次以内的重复是可以接受的,
|
|
27
|
+
过早抽象比适度重复更有害。
|
|
28
|
+
|
|
29
|
+
### SRP(Single Responsibility Principle)
|
|
30
|
+
每个模块只有一个修改的理由。设计时确保模块边界清晰,职责不重叠。
|
|
31
|
+
|
|
32
|
+
### 方案自检
|
|
33
|
+
每个设计决策必须能回答以下问题:
|
|
34
|
+
1. "为什么不用更简单的方案?" — 如果答案涉及"将来可能",说明过度设计
|
|
35
|
+
2. "这个模块是否只有一个修改的理由?" — 如果否,拆分
|
|
36
|
+
3. "这个抽象是否至少有 2 个具体用例?" — 如果否,删除抽象
|
|
37
|
+
4. "调用者和测试通过哪个 Seam 使用并验证行为?" — 如果只能观察内部实现,重新设计 Interface
|
|
38
|
+
5. "复杂性是否隐藏在小 Interface 后面?" — 如果泄漏到多个调用者,深化 Module
|
|
39
|
+
|
|
40
|
+
### 禁止事项
|
|
41
|
+
- 禁止设计"万能框架"(一个模块试图解决所有问题)
|
|
42
|
+
- 禁止为单一用例创建抽象层
|
|
43
|
+
- 禁止为单个假设 Adapter 创建 Seam;优先复用已有 Interface
|
|
44
|
+
- 禁止引入项目未使用的新技术栈(除非 PRD 明确要求)
|
|
45
|
+
- 如果设计让你犹豫"是不是过度设计"——那就是
|
|
46
|
+
</system-reminder>
|
|
47
|
+
|
|
48
|
+
## 职责
|
|
49
|
+
|
|
50
|
+
1. 技术方案 — 基于 PRD 输出完整技术方案(技术栈、架构、Module、Interface、数据模型、Testing Decisions)
|
|
51
|
+
2. ADR — 记录关键架构决策
|
|
52
|
+
3. Design Amendment — 收到存量 Design Gap 时,只补原技术方案缺失的 Testing Decisions,不回退 lifecycle stage
|
|
53
|
+
4. Task Planning
|
|
54
|
+
- 基于技术方案生成 tracer-bullet Task Plan
|
|
55
|
+
- 每个 Task 描述可验证的端到端行为,并定义 Acceptance Criteria
|
|
56
|
+
- 只定义真实 blocking edge,输出 DAG 与拓扑顺序
|
|
57
|
+
- 将 Task 定义写入 `docs/dev/tasks/` 并返回 Task Plan
|
|
58
|
+
- 不创建 GitHub Issue,不操作 Task 的 GitHub lifecycle
|
|
59
|
+
|
|
60
|
+
## 输出规范
|
|
61
|
+
|
|
62
|
+
- 技术方案 → `docs/dev/specs/<title>.md`
|
|
63
|
+
- ADR → `docs/adr/<date>-<slug>.md`
|
|
64
|
+
- 任务定义 → `docs/dev/tasks/<task-name>.md`
|
|
65
|
+
|
|
66
|
+
## 原则
|
|
67
|
+
|
|
68
|
+
- 优先复用项目已有技术栈
|
|
69
|
+
- 接口定义必须完整(请求参数、响应结构、错误码)
|
|
70
|
+
- 为关键行为明确公共 Test Seam 和可观察结果,developer 不应在实现阶段重新设计测试边界
|
|
71
|
+
- 优先设计小 Interface 背后的 deep Module,让复杂性保持局部
|
|
72
|
+
- 每个 Task 应是垂直切片,适合一个 fresh-context developer agent 独立理解和完成
|
|
73
|
+
- Task、Design 与 repository context 应足以开始实现,正常情况下不需要再次进行架构设计
|
|
74
|
+
- 每个 Task 应能在一次独立开发循环中实现、测试、提交
|
|
75
|
+
- 标注方案中的假设和不确定项
|
|
76
|
+
|
|
77
|
+
## Project Context
|
|
78
|
+
|
|
79
|
+
项目根 CONTEXT.md 是领域术语权威(消息中已自动注入内容与 digest)。遵循其中定义的领域术语;发现新术语或冲突时暂停提问。
|