@chenmk/superflow 0.1.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/INSTALL.en.md +106 -0
- package/INSTALL.md +664 -0
- package/LICENSE +21 -0
- package/README.md +142 -0
- package/README.zh-CN.md +117 -0
- package/assets/context-templates/business-rules.md +98 -0
- package/assets/context-templates/decisions.md +153 -0
- package/assets/context-templates/external-systems.md +166 -0
- package/assets/context-templates/incidents.md +89 -0
- package/assets/manifest.json +53 -0
- package/assets/prompts/superflow-archive.md +9 -0
- package/assets/prompts/superflow-clarify.md +10 -0
- package/assets/prompts/superflow-design.md +10 -0
- package/assets/prompts/superflow-docs.md +10 -0
- package/assets/prompts/superflow-implement.md +10 -0
- package/assets/prompts/superflow-pipeline.md +13 -0
- package/assets/prompts/superflow-verify.md +10 -0
- package/assets/rules/superflow-phase-guard.md +50 -0
- package/assets/scripts/claude-auto-backup-hook.sh +313 -0
- package/assets/scripts/codex-auto-backup-hook.sh +361 -0
- package/assets/scripts/install-sql-pre-commit.sh +44 -0
- package/assets/scripts/superflow-contract-hooks.sh +744 -0
- package/assets/scripts/superflow-delivery-check.sh +315 -0
- package/assets/scripts/superflow-dependency-update-hook.sh +161 -0
- package/assets/scripts/superflow-enforce-hook.sh +70 -0
- package/assets/scripts/superflow-hook-guard.sh +132 -0
- package/assets/scripts/superflow-integration-evidence-hook.sh +80 -0
- package/assets/scripts/superflow-sql-sync-hook.py +950 -0
- package/assets/scripts/superflow-test-report-lint.py +433 -0
- package/assets/scripts/superflow-verify-integration.sh +90 -0
- package/assets/scripts/sync-settings-json.py +52 -0
- package/assets/skills/api-doc-changelog/SKILL.md +193 -0
- package/assets/skills/openspec-apply-change/SKILL.md +156 -0
- package/assets/skills/openspec-archive-change/SKILL.md +114 -0
- package/assets/skills/openspec-explore/SKILL.md +288 -0
- package/assets/skills/openspec-propose/SKILL.md +110 -0
- package/assets/skills/superflow-archive/SKILL.md +61 -0
- package/assets/skills/superflow-clarify/SKILL.md +146 -0
- package/assets/skills/superflow-clarify/agents/openai.yaml +4 -0
- package/assets/skills/superflow-design/SKILL.md +83 -0
- package/assets/skills/superflow-design/agents/openai.yaml +4 -0
- package/assets/skills/superflow-docs/SKILL.md +316 -0
- package/assets/skills/superflow-docs/agents/openai.yaml +4 -0
- package/assets/skills/superflow-hotfix/SKILL.md +48 -0
- package/assets/skills/superflow-implement/SKILL.md +461 -0
- package/assets/skills/superflow-implement/agents/openai.yaml +4 -0
- package/assets/skills/superflow-pipeline/SKILL.md +844 -0
- package/assets/skills/superflow-pipeline/agents/openai.yaml +4 -0
- package/assets/skills/superflow-pipeline/references/api-design-template.md +431 -0
- package/assets/skills/superflow-pipeline/references/architecture-design-template.md +119 -0
- package/assets/skills/superflow-pipeline/references/batch-prompt-template.md +536 -0
- package/assets/skills/superflow-pipeline/references/batch-split-guide.md +140 -0
- package/assets/skills/superflow-pipeline/references/decision-point.md +30 -0
- package/assets/skills/superflow-pipeline/references/dirty-worktree.md +35 -0
- package/assets/skills/superflow-pipeline/references/document-templates.md +123 -0
- package/assets/skills/superflow-pipeline/references/feature-gated-workflow.md +124 -0
- package/assets/skills/superflow-pipeline/references/implementation-prompt-template.md +1056 -0
- package/assets/skills/superflow-pipeline/references/mock-strategy-guide.md +86 -0
- package/assets/skills/superflow-pipeline/references/openspec-format.md +57 -0
- package/assets/skills/superflow-pipeline/references/orchestration.md +639 -0
- package/assets/skills/superflow-pipeline/references/p0-baseline-template.md +174 -0
- package/assets/skills/superflow-pipeline/references/project-config.md +40 -0
- package/assets/skills/superflow-pipeline/references/prompt-usage-template.md +152 -0
- package/assets/skills/superflow-pipeline/references/quality-gate.md +299 -0
- package/assets/skills/superflow-pipeline/references/quality-standards.md +190 -0
- package/assets/skills/superflow-pipeline/references/reviewer-checklist.md +154 -0
- package/assets/skills/superflow-pipeline/references/sql-risk-review-checklist.md +323 -0
- package/assets/skills/superflow-pipeline/references/subagent-progress.md +90 -0
- package/assets/skills/superflow-pipeline/references/superpower-technical-design-template.md +125 -0
- package/assets/skills/superflow-pipeline/references/test-execution-template.md +220 -0
- package/assets/skills/superflow-pipeline/references/test-guide.md +30 -0
- package/assets/skills/superflow-pipeline/references/traceability-matrix.md +106 -0
- package/assets/skills/superflow-pipeline/references/validation-integrity.md +134 -0
- package/assets/skills/superflow-pipeline/scripts/superflow-archive.sh +178 -0
- package/assets/skills/superflow-pipeline/scripts/superflow-env.sh +118 -0
- package/assets/skills/superflow-pipeline/scripts/superflow-guard.sh +428 -0
- package/assets/skills/superflow-pipeline/scripts/superflow-handoff.sh +296 -0
- package/assets/skills/superflow-pipeline/scripts/superflow-state.sh +574 -0
- package/assets/skills/superflow-pipeline/scripts/superflow-status.sh +172 -0
- package/assets/skills/superflow-pipeline/scripts/superflow-yaml-validate.sh +138 -0
- package/assets/skills/superflow-table-impact-analysis/SKILL.md +77 -0
- package/assets/skills/superflow-tweak/SKILL.md +46 -0
- package/assets/skills/superflow-verify/SKILL.md +112 -0
- package/assets/skills-en/api-doc-changelog/SKILL.md +193 -0
- package/assets/skills-en/openspec-apply-change/SKILL.md +156 -0
- package/assets/skills-en/openspec-archive-change/SKILL.md +114 -0
- package/assets/skills-en/openspec-explore/SKILL.md +288 -0
- package/assets/skills-en/openspec-propose/SKILL.md +110 -0
- package/assets/skills-en/superflow-archive/SKILL.md +61 -0
- package/assets/skills-en/superflow-clarify/SKILL.md +146 -0
- package/assets/skills-en/superflow-clarify/agents/openai.yaml +4 -0
- package/assets/skills-en/superflow-design/SKILL.md +83 -0
- package/assets/skills-en/superflow-design/agents/openai.yaml +4 -0
- package/assets/skills-en/superflow-docs/SKILL.md +316 -0
- package/assets/skills-en/superflow-docs/agents/openai.yaml +4 -0
- package/assets/skills-en/superflow-hotfix/SKILL.md +48 -0
- package/assets/skills-en/superflow-implement/SKILL.md +461 -0
- package/assets/skills-en/superflow-implement/agents/openai.yaml +4 -0
- package/assets/skills-en/superflow-pipeline/SKILL.md +844 -0
- package/assets/skills-en/superflow-pipeline/agents/openai.yaml +4 -0
- package/assets/skills-en/superflow-pipeline/references/api-design-template.md +431 -0
- package/assets/skills-en/superflow-pipeline/references/architecture-design-template.md +119 -0
- package/assets/skills-en/superflow-pipeline/references/batch-prompt-template.md +536 -0
- package/assets/skills-en/superflow-pipeline/references/batch-split-guide.md +140 -0
- package/assets/skills-en/superflow-pipeline/references/decision-point.md +30 -0
- package/assets/skills-en/superflow-pipeline/references/dirty-worktree.md +35 -0
- package/assets/skills-en/superflow-pipeline/references/document-templates.md +123 -0
- package/assets/skills-en/superflow-pipeline/references/feature-gated-workflow.md +124 -0
- package/assets/skills-en/superflow-pipeline/references/implementation-prompt-template.md +1056 -0
- package/assets/skills-en/superflow-pipeline/references/mock-strategy-guide.md +86 -0
- package/assets/skills-en/superflow-pipeline/references/openspec-format.md +57 -0
- package/assets/skills-en/superflow-pipeline/references/orchestration.md +639 -0
- package/assets/skills-en/superflow-pipeline/references/p0-baseline-template.md +174 -0
- package/assets/skills-en/superflow-pipeline/references/project-config.md +40 -0
- package/assets/skills-en/superflow-pipeline/references/prompt-usage-template.md +152 -0
- package/assets/skills-en/superflow-pipeline/references/quality-gate.md +299 -0
- package/assets/skills-en/superflow-pipeline/references/quality-standards.md +190 -0
- package/assets/skills-en/superflow-pipeline/references/reviewer-checklist.md +154 -0
- package/assets/skills-en/superflow-pipeline/references/sql-risk-review-checklist.md +323 -0
- package/assets/skills-en/superflow-pipeline/references/subagent-progress.md +90 -0
- package/assets/skills-en/superflow-pipeline/references/superpower-technical-design-template.md +125 -0
- package/assets/skills-en/superflow-pipeline/references/test-execution-template.md +220 -0
- package/assets/skills-en/superflow-pipeline/references/test-guide.md +30 -0
- package/assets/skills-en/superflow-pipeline/references/traceability-matrix.md +106 -0
- package/assets/skills-en/superflow-pipeline/references/validation-integrity.md +134 -0
- package/assets/skills-en/superflow-pipeline/scripts/superflow-archive.sh +178 -0
- package/assets/skills-en/superflow-pipeline/scripts/superflow-env.sh +118 -0
- package/assets/skills-en/superflow-pipeline/scripts/superflow-guard.sh +428 -0
- package/assets/skills-en/superflow-pipeline/scripts/superflow-handoff.sh +296 -0
- package/assets/skills-en/superflow-pipeline/scripts/superflow-state.sh +574 -0
- package/assets/skills-en/superflow-pipeline/scripts/superflow-status.sh +172 -0
- package/assets/skills-en/superflow-pipeline/scripts/superflow-yaml-validate.sh +138 -0
- package/assets/skills-en/superflow-table-impact-analysis/SKILL.md +77 -0
- package/assets/skills-en/superflow-tweak/SKILL.md +46 -0
- package/assets/skills-en/superflow-verify/SKILL.md +112 -0
- package/dist/cli/index.js +186 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/commands/archive.js +6 -0
- package/dist/commands/archive.js.map +1 -0
- package/dist/commands/clarify.js +6 -0
- package/dist/commands/clarify.js.map +1 -0
- package/dist/commands/design.js +6 -0
- package/dist/commands/design.js.map +1 -0
- package/dist/commands/docs.js +6 -0
- package/dist/commands/docs.js.map +1 -0
- package/dist/commands/doctor.js +473 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/implement.js +6 -0
- package/dist/commands/implement.js.map +1 -0
- package/dist/commands/init.js +471 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/pipeline.js +6 -0
- package/dist/commands/pipeline.js.map +1 -0
- package/dist/commands/scan.js +59 -0
- package/dist/commands/scan.js.map +1 -0
- package/dist/commands/status.js +173 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/uninstall.js +213 -0
- package/dist/commands/uninstall.js.map +1 -0
- package/dist/commands/update.js +187 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/commands/verify.js +6 -0
- package/dist/commands/verify.js.map +1 -0
- package/dist/core/assets.js +27 -0
- package/dist/core/assets.js.map +1 -0
- package/dist/core/context.js +100 -0
- package/dist/core/context.js.map +1 -0
- package/dist/core/dependencies.js +146 -0
- package/dist/core/dependencies.js.map +1 -0
- package/dist/core/detect.js +71 -0
- package/dist/core/detect.js.map +1 -0
- package/dist/core/i18n.js +103 -0
- package/dist/core/i18n.js.map +1 -0
- package/dist/core/integrity.js +46 -0
- package/dist/core/integrity.js.map +1 -0
- package/dist/core/manifest.js +18 -0
- package/dist/core/manifest.js.map +1 -0
- package/dist/core/prompts.js +20 -0
- package/dist/core/prompts.js.map +1 -0
- package/dist/core/registry.js +134 -0
- package/dist/core/registry.js.map +1 -0
- package/dist/core/rules.js +17 -0
- package/dist/core/rules.js.map +1 -0
- package/dist/core/scripts.js +40 -0
- package/dist/core/scripts.js.map +1 -0
- package/dist/core/skill-check.js +31 -0
- package/dist/core/skill-check.js.map +1 -0
- package/dist/core/skills.js +56 -0
- package/dist/core/skills.js.map +1 -0
- package/dist/core/state.js +43 -0
- package/dist/core/state.js.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/path.js +11 -0
- package/dist/utils/path.js.map +1 -0
- package/dist/utils/shell.js +29 -0
- package/dist/utils/shell.js.map +1 -0
- package/package.json +60 -0
|
@@ -0,0 +1,1056 @@
|
|
|
1
|
+
# Implementation Prompt 模板
|
|
2
|
+
|
|
3
|
+
此模板可直接 copy-paste 给新 Agent 使用。根据实际项目替换 `{占位符}`。
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Copy-Paste 版本
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
使用superpower技能,开启合适的团队,最少包含一名开发和一名测试交叉验证进行需求开发,测试验证闭环交付,更新测试文档和api.md:
|
|
11
|
+
|
|
12
|
+
你是本次开发任务的 Leader Agent,负责指挥一个 Agent Team 完成编码实现。
|
|
13
|
+
|
|
14
|
+
## 核心原则(强制执行)
|
|
15
|
+
|
|
16
|
+
完成代码修改 ≠ 完成任务
|
|
17
|
+
编译成功 ≠ 完成任务
|
|
18
|
+
Worker 自测通过 ≠ 完成任务
|
|
19
|
+
测试后补通过 ≠ 完成任务
|
|
20
|
+
独立 Tester 验证通过 = 完成任务
|
|
21
|
+
|
|
22
|
+
一个任务只有满足以下 ALL 条件,才能标记为"完成":
|
|
23
|
+
1. 代码已修改(git diff 确认)
|
|
24
|
+
2. 代码自审通过(无 CRITICAL/HIGH 问题,检查空指针/异常/事务/日志)
|
|
25
|
+
3. 编译通过(clean compile 无 ERROR)
|
|
26
|
+
4. 应用已重新启动(进程验证通过,是新进程)
|
|
27
|
+
5. **RED-GREEN 证据完整**(编码前同一用例失败,编码后同一用例通过)
|
|
28
|
+
6. **独立 Tester 测试通过**(Tester 独立执行全部用例,客观报告)
|
|
29
|
+
7. 数据库状态验证通过(mysql 查询确认)
|
|
30
|
+
8. 日志检查通过(无 ERROR,关键日志出现)
|
|
31
|
+
9. Leader 已独立验证(不信任 Worker/Tester 报告)
|
|
32
|
+
10. 涉及数据库的任务已完成版本总 SQL 收口对账(源码/Mapper、开发库、测试库现状+总 SQL)
|
|
33
|
+
11. 涉及跨仓共享表/复制实体/外部集成链路时,已完成全部消费仓的实体/Mapper/SQL 与真实库字段对账
|
|
34
|
+
12. 涉及第三方/设备/支付/客户端/外部集成时,已区分 mock、测试端点和真实入口证据;mock-only 不得标记真实链路完成
|
|
35
|
+
13. 五项硬门禁全部通过:字段语义合同、写入闭环、真实入口调用链、禁止 fallback 与猜测实现、Agent 执行前自检
|
|
36
|
+
14. Superpowers 技术详设接管源码级 HOW,但不得覆盖 OpenSpec/SDD 的需求、API、DB、字段语义、tests 或验收门禁
|
|
37
|
+
15. SDD handoff hash 已继承并核对,不能凭压缩后的聊天记忆继续开发
|
|
38
|
+
|
|
39
|
+
## Superpower 技术详设继承(强制)
|
|
40
|
+
|
|
41
|
+
读取 [Superpowers 技术详设](../docs/superpowers/specs/YYYY-MM-DD-{change-id}-technical-design.md),继承其中与本批次相关的源码级 HOW 和执行约束。
|
|
42
|
+
本章节只允许描述实现路径、团队组织、拆分、TDD/RED、独立测试、Review 和验证闭环,不允许新增或替换需求/API/DB/tests 合同。
|
|
43
|
+
|
|
44
|
+
| 执行模式 | 团队角色 | 拆分建议 | TDD/RED切入点 | 独立Tester验证点 | 高风险猜测点 | 禁止自由发挥项 | handoff_hash | 进入prompt的强制要求 |
|
|
45
|
+
|----------|----------|----------|----------------|------------------|--------------|----------------|--------------|----------------------|
|
|
46
|
+
| ____ | Worker / Tester / Reviewer / Leader | ____ | ____ | ____ | ____ | ____ | ____ | ____ |
|
|
47
|
+
|
|
48
|
+
规则:
|
|
49
|
+
- OpenSpec/SDD 的 [design.md](../design.md)、[api.md](../api.md)、[tests.md](../tests.md) 是 WHAT/API/DB/tests 事实源。
|
|
50
|
+
- Superpowers 技术详设负责源码级 HOW:实现路径、团队、worktree、TDD、测试交叉验证、Reviewer 和 Leader 收口。
|
|
51
|
+
- 如果 Superpowers 技术详设缺失或与 OpenSpec/SDD 文档冲突,停止并回到 `$superflow-docs`,不得自行改合同。
|
|
52
|
+
|
|
53
|
+
## 上下文防漂移与状态继承(强制)
|
|
54
|
+
|
|
55
|
+
编码前必须读取并核对 SDD handoff:
|
|
56
|
+
|
|
57
|
+
- Handoff: [.sdd/handoff/sdd-context.md](../.sdd/handoff/sdd-context.md)
|
|
58
|
+
- Handoff JSON: [.sdd/handoff/sdd-context.json](../.sdd/handoff/sdd-context.json)
|
|
59
|
+
- Handoff hash: `{handoff_hash}`
|
|
60
|
+
- State file: [.sdd/state.yaml](../.sdd/state.yaml)
|
|
61
|
+
|
|
62
|
+
执行规则:
|
|
63
|
+
1. Worker、Tester、Reviewer 都必须先读 handoff,再回读原始 [api.md](../api.md)、
|
|
64
|
+
[design.md](../design.md)、[tests.md](../tests.md) 和 Superpowers 技术详设。
|
|
65
|
+
2. 如果任何 SDD 文档发生修改,先执行:
|
|
66
|
+
`~/.codex/skills/superflow-pipeline/scripts/superflow-handoff.sh {change-dir} --refresh`
|
|
67
|
+
并比较新的 `.sdd/handoff/sdd-context.sha256`。
|
|
68
|
+
3. prompt、test-report、design.md 中记录的 hash 必须一致;不一致时停止并返回
|
|
69
|
+
`$superflow-docs`,不得继续编码。
|
|
70
|
+
4. 进入验证前执行:
|
|
71
|
+
`~/.codex/skills/superflow-pipeline/scripts/superflow-guard.sh {change-dir} implement`
|
|
72
|
+
失败则补文档或 prompt,不得把失败项写成通过。
|
|
73
|
+
5. 会话压缩、换 agent、切 worktree 或开新终端后,不得只凭聊天记忆继续;
|
|
74
|
+
必须重新读 handoff 和原始文档。
|
|
75
|
+
|
|
76
|
+
## 状态机执行决策(强制)
|
|
77
|
+
|
|
78
|
+
本批次进入开发前,必须把执行决策写入 `.sdd/state.yaml`,不能只写在聊天里:
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
~/.codex/skills/superflow-pipeline/scripts/superflow-state.sh status {change-dir}
|
|
82
|
+
~/.codex/skills/superflow-pipeline/scripts/superflow-state.sh set {change-dir} build_mode team-prompt
|
|
83
|
+
~/.codex/skills/superflow-pipeline/scripts/superflow-state.sh set {change-dir} isolation worktree
|
|
84
|
+
~/.codex/skills/superflow-pipeline/scripts/superflow-state.sh set {change-dir} tdd_mode tdd
|
|
85
|
+
~/.codex/skills/superflow-pipeline/scripts/superflow-state.sh set {change-dir} review_mode standard
|
|
86
|
+
~/.codex/skills/superflow-pipeline/scripts/superflow-state.sh set {change-dir} implementation_prompt prompt/{batch-prompt}.md
|
|
87
|
+
~/.codex/skills/superflow-pipeline/scripts/superflow-state.sh set {change-dir} worktree_ports "{derived-port}"
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
`review_mode` 必须在 `off|standard|thorough` 中选择。full workflow 默认
|
|
91
|
+
`standard`;高风险跨仓/接口/DB/第三方任务使用 `thorough`;只有纯文本或明确低风险
|
|
92
|
+
任务才允许 `off`,并必须在 test-report 记录原因。
|
|
93
|
+
|
|
94
|
+
若实际使用后台 subagent,则改为:
|
|
95
|
+
|
|
96
|
+
```bash
|
|
97
|
+
~/.codex/skills/superflow-pipeline/scripts/superflow-state.sh set {change-dir} build_mode subagent-driven-development
|
|
98
|
+
~/.codex/skills/superflow-pipeline/scripts/superflow-state.sh set {change-dir} subagent_dispatch confirmed
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
进入验证前必须执行:
|
|
102
|
+
|
|
103
|
+
```bash
|
|
104
|
+
~/.codex/skills/superflow-pipeline/scripts/superflow-state.sh scale {change-dir}
|
|
105
|
+
~/.codex/skills/superflow-pipeline/scripts/superflow-guard.sh {change-dir} implement --apply
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
如果 `superflow-state.sh recover {change-dir}` 输出当前 phase、handoff、prompt、报告状态不一致,
|
|
109
|
+
停止并回到对应阶段补齐,不得继续编码。
|
|
110
|
+
|
|
111
|
+
## 测试先行与红绿验证(强制,在生产代码前完成)
|
|
112
|
+
|
|
113
|
+
1. 读取 [tests.md](../tests.md),列出本批次全部用例 ID。
|
|
114
|
+
2. 先创建或启用自动化测试,不得先改生产代码。
|
|
115
|
+
3. 执行目标测试命令并确认 RED:
|
|
116
|
+
- 测试必须失败在预期业务断言上,不能是编译错误、环境错误、token 缺失或测试写错。
|
|
117
|
+
- 将命令、失败摘要、失败断言回填到 test-report 的 `RED 失败证据`。
|
|
118
|
+
4. RED 正确后,才允许写最小生产代码。
|
|
119
|
+
5. 写完代码后执行同一命令确认 GREEN,并回填 `GREEN 通过证据`。
|
|
120
|
+
6. 如果 RED 因真实设备、第三方、token、测试数据或环境不可用无法执行,停止并报告
|
|
121
|
+
`Blocked` 或 `Partially verified`,不得先编码再补测试。
|
|
122
|
+
7. 禁止为了让测试通过而削弱断言、改写 tests.md 语义、删除失败用例或把 mock-only
|
|
123
|
+
结果写成真实通过。
|
|
124
|
+
|
|
125
|
+
## 五项硬门禁(强制,在生产代码前完成)
|
|
126
|
+
|
|
127
|
+
### 1. 字段语义合同
|
|
128
|
+
|
|
129
|
+
从 [design.md](../design.md) 复制本批涉及字段的语义合同,并在当前源码、Mapper/XML
|
|
130
|
+
和数据库样例中复核。必须填写:
|
|
131
|
+
|
|
132
|
+
| 字段 | 来源表/DTO/事件 | 真实语义 | 目标字段 | 目标语义 | 是否可等价 | 证据锚点 | 禁止用法 | 不确定项/owner |
|
|
133
|
+
|------|-----------------|----------|----------|----------|------------|----------|----------|----------------|
|
|
134
|
+
| ____ | ____ | ____ | ____ | ____ | 是/否 | 文件/SQL/样例 | ____ | ____ |
|
|
135
|
+
|
|
136
|
+
字段语义未确认时,停止并报告 `Blocked`。禁止凭字段名相似、类型相同或值非空继续实现。
|
|
137
|
+
|
|
138
|
+
### 2. 写入闭环
|
|
139
|
+
|
|
140
|
+
凡本批涉及回填、落库、绑定、持久化、快照、同步、状态推进,必须填写:
|
|
141
|
+
|
|
142
|
+
| 业务动作 | Java setter/赋值点 | Converter/DTO 映射 | Mapper insert/update | DB column | 后续读取方 | 消费入口 | 验证 SQL | 测试用例 |
|
|
143
|
+
|----------|--------------------|--------------------|----------------------|-----------|------------|----------|----------|----------|
|
|
144
|
+
| ____ | ____ | ____ | ____ | ____ | ____ | ____ | SELECT ... | TC-___ |
|
|
145
|
+
|
|
146
|
+
只看到 Java setter 不算落库证明;必须核对 Mapper/XML、注解 SQL、BaseMapper、
|
|
147
|
+
resultMap、条件更新和后续读取方。成组字段必须整组验证。
|
|
148
|
+
|
|
149
|
+
### 3. 真实入口调用链
|
|
150
|
+
|
|
151
|
+
必须按真实用户或真实系统入口填写:
|
|
152
|
+
|
|
153
|
+
| 用户/外部动作 | 上游服务/接口 | 本仓入口 | MQ/异步回调 | 关键字段变化 | DB 状态 | 结算/通知/展示消费点 | 真实验证方式 |
|
|
154
|
+
|---------------|---------------|----------|-------------|--------------|---------|----------------------|--------------|
|
|
155
|
+
| ____ | ____ | ____ | ____ | ____ | ____ | ____ | curl/日志/DB |
|
|
156
|
+
|
|
157
|
+
测试 Controller、mock endpoint、绕过鉴权端点只能作为局部证据,不能替代真实入口。
|
|
158
|
+
|
|
159
|
+
### 4. 禁止 fallback 与猜测实现
|
|
160
|
+
|
|
161
|
+
默认禁止以下行为:
|
|
162
|
+
- 默认值、兜底反查、替代字段、保留旧值、空值转可用、静默跳过。
|
|
163
|
+
- 在下游结算/展示/通知层补偿上游本该写入的业务快照。
|
|
164
|
+
- 只为让测试通过而改断言、改入参、改口径。
|
|
165
|
+
|
|
166
|
+
若确实需要兼容历史脏数据或外部不可控输入,必须先记录并获得 owner 确认:
|
|
167
|
+
|
|
168
|
+
| 兜底触发条件 | 业务依据 | 会掩盖的异常 | 暴露/告警方式 | 移除条件 | owner确认 |
|
|
169
|
+
|--------------|----------|--------------|---------------|----------|-----------|
|
|
170
|
+
| ____ | ____ | ____ | ____ | ____ | ____ |
|
|
171
|
+
|
|
172
|
+
### 5. Agent 执行前自检
|
|
173
|
+
|
|
174
|
+
编码前必须填写,任一项为否或不确定则停止:
|
|
175
|
+
|
|
176
|
+
| 真实入口已定位 | 字段语义合同已核对 | 写入闭环已核对 | 禁止兜底边界已确认 | RED 测试已执行 | 允许修改文件 | 禁止修改文件 | 阻塞项 |
|
|
177
|
+
|----------------|--------------------|----------------|----------------------|----------------|--------------|--------------|--------|
|
|
178
|
+
| 是/否 | 是/否 | 是/否 | 是/否 | 是/否 | ____ | ____ | ____ |
|
|
179
|
+
|
|
180
|
+
## 项目信息
|
|
181
|
+
|
|
182
|
+
- 变更目录: doc/openspec/changes/{change-id}/
|
|
183
|
+
- 项目路径: {project-path}
|
|
184
|
+
- 构建工具: {maven-or-gradle}
|
|
185
|
+
- Spring Profile: {profile-name}
|
|
186
|
+
- Server Port: {port}(= {base-port} + {batch-id},如 9250 + 15 = 9265)
|
|
187
|
+
- Context Path: {context-path}
|
|
188
|
+
- 数据库: mysql://{host}:{port}/{database}, user={user}, pass={pass}
|
|
189
|
+
- 日志路径: {log-path}
|
|
190
|
+
|
|
191
|
+
## SDD 门禁激活(第一步,在所有工作之前执行)
|
|
192
|
+
|
|
193
|
+
本机已配置 Codex Hooks,会在 Edit/Write 时自动拦截检查。你需要按以下顺序激活门禁标记:
|
|
194
|
+
|
|
195
|
+
```bash
|
|
196
|
+
# 步骤 1:在主仓库根目录创建门禁标记(激活 hook 拦截)
|
|
197
|
+
cd {project-path}
|
|
198
|
+
touch .sdd-enforced
|
|
199
|
+
echo ".sdd-enforced" >> .gitignore
|
|
200
|
+
echo ".db-verified" >> .gitignore
|
|
201
|
+
|
|
202
|
+
# 步骤 2:创建 worktree 并进入(见下一节)
|
|
203
|
+
|
|
204
|
+
# 步骤 3:进入 worktree 后,创建门禁标记
|
|
205
|
+
cd ../{project}-{batch-id}-worktree
|
|
206
|
+
touch .sdd-enforced
|
|
207
|
+
# 此时 hook 已激活,如果直接编辑代码会被拦截
|
|
208
|
+
|
|
209
|
+
# 步骤 4:完成数据库前置门禁后,创建核查通过标记
|
|
210
|
+
touch .db-verified
|
|
211
|
+
# 此后才能正常编辑代码
|
|
212
|
+
|
|
213
|
+
# 任务完成后清理标记:
|
|
214
|
+
rm -f .sdd-enforced .db-verified
|
|
215
|
+
cd {project-path}
|
|
216
|
+
rm -f .sdd-enforced
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
**如果你跳过以上步骤直接编辑代码,Hook 会自动拦截并阻止操作。**
|
|
220
|
+
|
|
221
|
+
## Worktree 分支要求(强制)
|
|
222
|
+
|
|
223
|
+
所有批次必须使用独立 git worktree 开分支开发,避免多个 agent 在同一工作树并行修改互相覆盖。不要在主工作树直接开发。
|
|
224
|
+
|
|
225
|
+
```bash
|
|
226
|
+
git status --short
|
|
227
|
+
git worktree add -b feature/{change-id}-{batch-id}-{short-name} ../{project}-{batch-id}-worktree HEAD
|
|
228
|
+
cd ../{project}-{batch-id}-worktree
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
如果分支已存在,改用:
|
|
232
|
+
|
|
233
|
+
```bash
|
|
234
|
+
git worktree add ../{project}-{batch-id}-worktree feature/{change-id}-{batch-id}-{short-name}
|
|
235
|
+
cd ../{project}-{batch-id}-worktree
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
### Worktree 进入后强制验证(必须执行,不可跳过)
|
|
239
|
+
|
|
240
|
+
进入 worktree 后,**必须立即执行以下验证**,确认自己在正确的 worktree 内:
|
|
241
|
+
|
|
242
|
+
```bash
|
|
243
|
+
# 步骤 1:确认当前目录是 worktree 而非主工作树
|
|
244
|
+
pwd
|
|
245
|
+
# 预期输出应包含 {batch-id}-worktree,例如:/Users/xxx/{project}-p16-worktree
|
|
246
|
+
# 如果当前目录仍是主工作树,不得开始任何代码编辑
|
|
247
|
+
|
|
248
|
+
# 步骤 2:确认当前分支正确
|
|
249
|
+
git branch --show-current
|
|
250
|
+
# 预期输出应为:feature/{change-id}-{batch-id}-{short-name}
|
|
251
|
+
|
|
252
|
+
# 步骤 3:确认 git status 无异常
|
|
253
|
+
git status --short
|
|
254
|
+
# 如有未预期的修改,先确认来源,必要时重新创建 worktree
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
### Worktree 编码红线
|
|
258
|
+
|
|
259
|
+
- **所有代码编辑(包括 Read/Edit/Write 工具调用)必须在 worktree 目录内完成**
|
|
260
|
+
- **禁止在主工作树(原项目目录)直接修改任何文件**
|
|
261
|
+
- **禁止在其他 agent 的 worktree 内修改文件**
|
|
262
|
+
- **每次使用工具修改文件前,先确认当前工作目录:`pwd`**
|
|
263
|
+
- 完成报告必须写明 worktree 路径、分支名和提交号
|
|
264
|
+
|
|
265
|
+
## Token 获取规范(强制)
|
|
266
|
+
|
|
267
|
+
接口测试必须先获取有效 token。**必须严格按以下步骤执行,不得省略或自行假设:**
|
|
268
|
+
|
|
269
|
+
```bash
|
|
270
|
+
# 步骤 1:获取验证码图片(必须带 -c 保持 Cookie)
|
|
271
|
+
curl -s -c /tmp/cookies.txt -b /tmp/cookies.txt \
|
|
272
|
+
"http://localhost:{port}{context-path}/captcha/image" -o /dev/null
|
|
273
|
+
|
|
274
|
+
# 步骤 2:登录(Content-Type 必须是 application/x-www-form-urlencoded)
|
|
275
|
+
curl -s -c /tmp/cookies.txt -b /tmp/cookies.txt \
|
|
276
|
+
-X POST "http://localhost:{port}{context-path}/login" \
|
|
277
|
+
-H "Content-Type: application/x-www-form-urlencoded" \
|
|
278
|
+
-d "userName=admin&password=Ake123!@%23%24%25%5E&captchaCode=9999"
|
|
279
|
+
|
|
280
|
+
# 步骤 3:提取 token(从响应 JSON 的 data.token 字段)
|
|
281
|
+
TOKEN=$(curl -s -c /tmp/cookies.txt -b /tmp/cookies.txt \
|
|
282
|
+
-X POST "http://localhost:{port}{context-path}/login" \
|
|
283
|
+
-H "Content-Type: application/x-www-form-urlencoded" \
|
|
284
|
+
-d "userName=admin&password=Ake123!@%23%24%25%5E&captchaCode=9999" | \
|
|
285
|
+
grep -o '"token":"[^"]*"' | sed 's/"token":"//;s/"$//')
|
|
286
|
+
|
|
287
|
+
# 步骤 4:验证 token 非空
|
|
288
|
+
if [ -z "$TOKEN" ] || [ "$TOKEN" = "null" ]; then
|
|
289
|
+
echo "ERROR: 获取 token 失败,请检查登录响应"
|
|
290
|
+
exit 1
|
|
291
|
+
fi
|
|
292
|
+
echo "Token 获取成功: ${TOKEN:0:20}..."
|
|
293
|
+
|
|
294
|
+
# 步骤 5:后续所有接口请求必须带 token Header
|
|
295
|
+
curl -s -H "token: $TOKEN" ...
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
### Token 获取红线
|
|
299
|
+
|
|
300
|
+
- **禁止省略 `/captcha/image` 步骤直接调 `/login`**
|
|
301
|
+
- **禁止自行构造 token 或假设固定 token 值**
|
|
302
|
+
- **禁止在登录失败时不查看完整响应就终止**
|
|
303
|
+
- 登录失败时必须输出完整响应内容,分析 `code`/`message` 字段
|
|
304
|
+
- 同一 worktree 内的测试应复用同一 token,减少重复登录
|
|
305
|
+
|
|
306
|
+
## 构建工具命令(必须严格区分 Maven/Gradle)
|
|
307
|
+
|
|
308
|
+
本项目使用 {BUILD_TOOL},命令如下:
|
|
309
|
+
|
|
310
|
+
| 操作 | 命令 |
|
|
311
|
+
|------|------|
|
|
312
|
+
| 编译 | {compile-cmd} |
|
|
313
|
+
| 启动 | {run-cmd} |
|
|
314
|
+
| 测试 | {test-cmd} |
|
|
315
|
+
|
|
316
|
+
⚠️ 关键警告:
|
|
317
|
+
- Gradle 启动 Spring Profile 必须用 --args='--spring.profiles.active=xxx'
|
|
318
|
+
- 绝对不能用 -Dspring-boot.run.profiles=xxx(这是 Maven 的语法,Gradle 会忽略)
|
|
319
|
+
- 每次修改后必须先 clean 再编译,不能依赖增量编译
|
|
320
|
+
|
|
321
|
+
## 端口管理规范(强制)
|
|
322
|
+
|
|
323
|
+
启动应用前**必须检查端口占用情况**,禁止关闭其他 agent 的应用进程。
|
|
324
|
+
|
|
325
|
+
```bash
|
|
326
|
+
# 步骤 1:检查目标端口是否已被占用
|
|
327
|
+
PORT={port}
|
|
328
|
+
lsof -i :$PORT 2>/dev/null || netstat -tlnp 2>/dev/null | grep ":$PORT " || ss -tlnp | grep ":$PORT "
|
|
329
|
+
|
|
330
|
+
# 如果有输出,说明端口被占用
|
|
331
|
+
# 步骤 2:判断占用进程是否是自己的旧进程
|
|
332
|
+
# - 如果是自己 worktree 之前启动的旧进程 → 先停止它,再启动新的
|
|
333
|
+
# - 如果是其他 agent/worktree 的进程 → 不得关闭,自己换一个端口
|
|
334
|
+
#
|
|
335
|
+
# 步骤 3(端口冲突时):查找可用端口
|
|
336
|
+
# 从 {port} 开始向后递增查找,如 9251、9252,直到找到可用端口
|
|
337
|
+
for p in $(seq $PORT 9350); do
|
|
338
|
+
if ! lsof -i :$p >/dev/null 2>&1; then
|
|
339
|
+
echo "可用端口: $p"
|
|
340
|
+
export PORT=$p
|
|
341
|
+
break
|
|
342
|
+
fi
|
|
343
|
+
done
|
|
344
|
+
|
|
345
|
+
# 步骤 4:如果更换了端口,所有接口测试的 Base URL 必须同步更换
|
|
346
|
+
# 原 URL: http://localhost:{port}{context-path}
|
|
347
|
+
# 新 URL: http://localhost:$PORT{context-path}
|
|
348
|
+
```
|
|
349
|
+
|
|
350
|
+
### 端口管理红线
|
|
351
|
+
|
|
352
|
+
- **禁止在不确认进程归属的情况下直接 `pkill` 或 `kill` 占用端口的进程**
|
|
353
|
+
- **禁止关闭其他 agent/worktree 的应用进程**
|
|
354
|
+
- **禁止假设端口一定空闲而不做检查**
|
|
355
|
+
- 若端口被其他 agent 占用,**自己更换端口启动**,不得强制抢占
|
|
356
|
+
- 更换端口后,所有接口测试 URL、token 获取 URL 必须同步更新
|
|
357
|
+
- 完成报告中必须注明实际使用的端口号
|
|
358
|
+
|
|
359
|
+
## 数据库前置门禁(在 Phase 1 之前必须完成)
|
|
360
|
+
|
|
361
|
+
在修改任何业务代码前,必须先完成数据库结构核查,确保开发环境数据库与设计文档一致。历史上多次出现研发 agent 忘记执行增量 SQL,导致字段缺失、默认值缺失、初始化数据缺失,最终用业务代码绕过数据库问题,产生隐蔽 bug。
|
|
362
|
+
|
|
363
|
+
**强制执行步骤:**
|
|
364
|
+
|
|
365
|
+
1. 阅读本需求汇总 SQL 文件:`../sql/{汇总SQL文件名}`。
|
|
366
|
+
2. 对照 [design.md](../design.md) / [api.md](../api.md) / [spec.md](../spec.md) / [tasks.md](../tasks.md),列出本批次所有任务依赖的表、字段、索引、默认值、初始化数据。
|
|
367
|
+
3. 连接开发环境数据库,对每个依赖的表执行 `SHOW CREATE TABLE` / `SHOW COLUMNS` / `SELECT` 等命令确认实际结构。
|
|
368
|
+
4. 如果发现缺失(字段不存在、默认值不对、索引缺失、初始化数据未插入),必须从汇总 SQL 文件中取对应脚本,连接开发环境数据库执行。
|
|
369
|
+
|
|
370
|
+
### 跨仓数据合同门禁(按需触发,阻塞级)
|
|
371
|
+
|
|
372
|
+
如果本批次满足以下任一条件,必须先完成本节,再允许编码:
|
|
373
|
+
|
|
374
|
+
- 多仓共享同一张表、字典、初始化数据或视图
|
|
375
|
+
- 当前仓库复制了其他仓库 PO/Entity/Mapper/DTO
|
|
376
|
+
- 使用 MyBatis-Plus `@TableName` + `BaseMapper`
|
|
377
|
+
- 删除字段、迁移字段、状态字段从持久化改为派生、单站点字段改多站点字段
|
|
378
|
+
- 真实入口在外部集成/第三方/客户端,业务校验在 sibling service
|
|
379
|
+
|
|
380
|
+
强制步骤:
|
|
381
|
+
|
|
382
|
+
1. 明确表结构真源:版本总 SQL、database-contract、真实库 `SHOW CREATE TABLE`。
|
|
383
|
+
2. 搜索全部消费仓:当前仓库、sibling service、外部集成、回调、定时任务、导入导出、测试端点。
|
|
384
|
+
3. 对每个消费仓列出 `@TableName` 实体字段、BaseMapper 默认 SELECT、Mapper XML/resultMap、手写 SQL 和查询条件。
|
|
385
|
+
4. 用 `SHOW CREATE TABLE` 或 `information_schema.columns` 对照真实字段。
|
|
386
|
+
5. 发现实体映射不存在列时,必须删除该映射或标注 `@TableField(exist = false)`;不得给测试库补废弃字段绕过。
|
|
387
|
+
6. 字段迁移后必须同步查询逻辑,例如旧 `status` 持久化字段改为派生状态、旧 `plot_id` 改为多站点快照字段。
|
|
388
|
+
7. 在 test-report 填写:
|
|
389
|
+
|
|
390
|
+
| 表 | 真源结构 | 消费仓 | 实体/Mapper/SQL 字段 | 实际库字段 | 处理结论 | 验证证据 |
|
|
391
|
+
|----|----------|--------|----------------------|------------|----------|----------|
|
|
392
|
+
| ____ | ____ | ____ | ____ | ____ | 通过/阻塞/已修复 | ____ |
|
|
393
|
+
|
|
394
|
+
任一消费仓存在不存在列或旧查询条件时,本批次不得标记完成。
|
|
395
|
+
|
|
396
|
+
### 真实入口验收门禁(按需触发,阻塞级)
|
|
397
|
+
|
|
398
|
+
涉及第三方、设备、支付、退款、回调、客户端、外部集成或跨系统链路时:
|
|
399
|
+
|
|
400
|
+
1. test-report 必须分开记录 `Mock 验证`、`测试端点验证`、`真实入口验证`。
|
|
401
|
+
2. 测试 Controller、mock endpoint、绕过鉴权端点只能证明局部代码路径,不得写 `真实链路通过`。
|
|
402
|
+
3. 真实入口必须记录 payload、响应摘要、traceId 或业务单号、关键日志、DB 证据。
|
|
403
|
+
4. 外部平台返回泛化失败时,必须结合本服务日志和 DB 证据归因:外部阻塞、合同漂移、代码异常,不能直接写通过。
|
|
404
|
+
5. 执行成功后再次查询确认结构/数据已生效。
|
|
405
|
+
6. 只有数据库结构完全满足设计要求后,才能继续后续 Phase 1 ~ Phase 5 的业务代码开发。
|
|
406
|
+
7. 最终交付报告中必须贴出:核查命令摘要、执行的 SQL 文件路径和具体脚本、执行结果、复查结果。
|
|
407
|
+
8. 任务完成前必须回查版本总 SQL:本批新增/修改的表、字段、索引、默认值、初始化数据必须已合并进需求级汇总 SQL 文件,不能只存在于开发库、临时脚本或 agent 回复中。
|
|
408
|
+
|
|
409
|
+
**禁止事项:**
|
|
410
|
+
- 禁止为绕过数据库缺字段、缺默认值、缺初始化数据而修改业务逻辑(如加 if-null 判断兼容缺失字段、用硬编码代替数据库默认值)。
|
|
411
|
+
- 禁止自行创建独立 SQL 文件。所有 SQL 脚本必须追加到需求级汇总 SQL 文件。
|
|
412
|
+
- 禁止把 SQL 写在临时说明里但不追加到需求汇总 SQL 文件。
|
|
413
|
+
- 禁止用 mock、单测通过或 BUILD SUCCESS 代替真实数据库结构核查。
|
|
414
|
+
- SQL 脚本执行失败时,必须停下来报告真实错误,不允许改业务代码绕过。
|
|
415
|
+
- 禁止因为开发库已经存在字段就跳过总 SQL 收口;发布以版本总 SQL 为准。
|
|
416
|
+
|
|
417
|
+
**任务完成前必须输出 SQL 收口对账表:**
|
|
418
|
+
```
|
|
419
|
+
版本总 SQL 收口对账:
|
|
420
|
+
| P编号 | 表 | 字段/索引/数据 | 源码引用 | 总SQL位置 | 开发库状态 | 测试库状态 | 处理结论 |
|
|
421
|
+
|---|---|---|---|---|---|---|---|
|
|
422
|
+
| Pxx | table_name | column_name | 类/Mapper/方法 | sql/...:行号或注释块 | 已存在/缺失/差异 | 已存在/缺失/差异 | 补总SQL/MODIFY/不采纳说明 |
|
|
423
|
+
```
|
|
424
|
+
|
|
425
|
+
**任务交付报告中必须包含的数据库核查章节:**
|
|
426
|
+
```
|
|
427
|
+
数据库结构核查:
|
|
428
|
+
- 检查的表/字段/索引/初始化数据:{列出具体检查项}
|
|
429
|
+
- 汇总 SQL 文件路径:{如 openspec/changes/xxx/sql/{version}.sql}
|
|
430
|
+
- 执行的脚本:{具体 ALTER TABLE / INSERT 语句或脚本行号范围}
|
|
431
|
+
- 执行结果:{成功/失败,如失败写明错误信息}
|
|
432
|
+
- 复查确认:{再次 SHOW CREATE TABLE / SELECT 确认结果}
|
|
433
|
+
- 版本总 SQL 收口:{贴出对账表;说明源码/Mapper、开发库、测试库现状+总 SQL 是否一致}
|
|
434
|
+
```
|
|
435
|
+
|
|
436
|
+
## 强制执行顺序(数据库迁移类任务硬门禁)
|
|
437
|
+
|
|
438
|
+
**自动检测规则**:生成本 prompt 时,如本批次涉及以下任一条件,则**必须**包含本章节,不可跳过、不可绕行:
|
|
439
|
+
- 新增表
|
|
440
|
+
- 删除字段
|
|
441
|
+
- 物理删除旧字段
|
|
442
|
+
- 表结构重构
|
|
443
|
+
- 旧数据迁移
|
|
444
|
+
- 状态字段从持久化改为动态计算
|
|
445
|
+
- 分页筛选依赖新表或新状态逻辑
|
|
446
|
+
- 总版 SQL 和开发库迁移 SQL 分离
|
|
447
|
+
- 需要迁移当前开发库/测试库已有数据
|
|
448
|
+
|
|
449
|
+
**以上条件任一满足时,必须先完成以下步骤,才允许开始 Java 编码:**
|
|
450
|
+
|
|
451
|
+
**强制执行步骤:**
|
|
452
|
+
|
|
453
|
+
1. **当前数据库结构核对**
|
|
454
|
+
- 连接开发环境数据库,对涉及表执行 `SHOW CREATE TABLE {表名}`
|
|
455
|
+
- 对关键表执行 `DESC {表名}`
|
|
456
|
+
- 确认新表/新字段是否已存在
|
|
457
|
+
- 确认旧字段当前状态(是否存在、是否已废弃、是否有数据)
|
|
458
|
+
- 记录核对结果到 test-report
|
|
459
|
+
|
|
460
|
+
2. **表结构改造**
|
|
461
|
+
- 新库基线 SQL 按最终结构整理
|
|
462
|
+
- 已有开发库/测试库使用单独迁移 SQL(与总版基线 SQL 分离)
|
|
463
|
+
- 本地迁移 SQL 如要求不提交 Git,必须放入 Git ignored 路径
|
|
464
|
+
- 执行后再次 `SHOW CREATE TABLE` 确认结构生效
|
|
465
|
+
|
|
466
|
+
3. **旧数据迁移**
|
|
467
|
+
- 明确旧数据如何迁移到新表/新字段
|
|
468
|
+
- 明确迁移数量核对 SQL(迁移前 COUNT、迁移后 COUNT)
|
|
469
|
+
- 明确迁移失败处理策略:迁移失败必须停止,不得写代码绕过
|
|
470
|
+
- 执行迁移脚本后执行核对 SQL 确认数量一致
|
|
471
|
+
|
|
472
|
+
4. **test-report 证据回填**
|
|
473
|
+
- SQL 文件路径(基线 SQL + 迁移 SQL)
|
|
474
|
+
- 执行数据库连接来源(host/port/database)
|
|
475
|
+
- 执行时间
|
|
476
|
+
- 执行结果(成功/失败)
|
|
477
|
+
- `SHOW CREATE TABLE` 结果摘要
|
|
478
|
+
- 迁移前后数量对比
|
|
479
|
+
- 关键联查结果
|
|
480
|
+
|
|
481
|
+
5. **编码许可判定**
|
|
482
|
+
- 上述 1~4 全部完成后,才允许进入 Java 编码
|
|
483
|
+
- 如果表结构改造或数据迁移失败,必须停止并报告,禁止继续编码
|
|
484
|
+
- 禁止先写业务代码绕过数据库状态不一致
|
|
485
|
+
- 禁止只靠 `BUILD SUCCESS` 或编译通过宣称完成
|
|
486
|
+
|
|
487
|
+
**禁止事项:**
|
|
488
|
+
- 禁止为绕过数据库缺字段、缺默认值、缺初始化数据、历史数据未迁移而修改业务逻辑
|
|
489
|
+
- 禁止自行创建独立 SQL 文件。所有 SQL 脚本必须追加到需求级汇总 SQL 文件
|
|
490
|
+
- 禁止把 SQL 写在临时说明里但不追加到需求汇总 SQL 文件
|
|
491
|
+
- 禁止用 mock、单测通过或 BUILD SUCCESS 代替真实数据库结构核查和数据迁移验证
|
|
492
|
+
- SQL 脚本执行失败时,必须停下来报告真实错误,不允许改业务代码绕过
|
|
493
|
+
- 禁止将本地迁移 SQL 提交到 Git(如项目约定不提交)
|
|
494
|
+
- 禁止独立 P 任务只改开发库或局部 SQL 而不合并版本总 SQL;每个 P/CR 完成前必须做总 SQL 收口。
|
|
495
|
+
|
|
496
|
+
## Phase 1: 读取文档(你执行)
|
|
497
|
+
|
|
498
|
+
1. 读取 [spec.md](../spec.md) → 理解需求边界和范围
|
|
499
|
+
2. 读取 [design.md](../design.md) → 理解源码修改点
|
|
500
|
+
3. 读取 [tasks.md](../tasks.md) → 提取所有任务和依赖
|
|
501
|
+
4. 读取 [api.md](../api.md) → 对齐接口字段、命名和错误语义
|
|
502
|
+
5. 读取 [tests.md](../tests.md) → 提取验证方法、curl 命令、数据库查询
|
|
503
|
+
6. 确认已有 [prompt/implementation.md](implementation.md) 与对应批次 prompt,不允许脱离既有详设自行再出一份设计
|
|
504
|
+
7. 确定构建工具(检查 pom.xml 或 build.gradle)
|
|
505
|
+
8. 确定基础 URL: http://localhost:{port}{context-path}
|
|
506
|
+
9. **读取本需求汇总 SQL 文件**,确认其中包含本批次需要的所有数据库变更脚本
|
|
507
|
+
10. **执行版本总 SQL 收口对账**:源码/Mapper 读写字段、开发库结构、测试库现状 + 总 SQL 最终结构必须一致;发现总 SQL 漏字段/漏索引/漏初始化数据时先补总 SQL
|
|
508
|
+
11. **提取前端真实动作矩阵**:从 api.md 中提取每个按钮/入口对应的 Method、URL、参数位置、响应形态、成功判定字段
|
|
509
|
+
12. **提取文件接口契约**:列出所有导出/下载/模板接口,确认其响应形态(文件流 or JSON)
|
|
510
|
+
13. **提取 Excel 导入契约**:列出所有导入接口,确认 failureCount 与 code 的映射规则
|
|
511
|
+
14. **提取数据权限决策**:列出所有访问业务数据的接口,确认每个接口是否有数据权限判断(需要/不需要/不确定)
|
|
512
|
+
15. **提取外部依赖契约**:列出所有 SDK/第三方调用,确认参数来源
|
|
513
|
+
|
|
514
|
+
## Phase 1.5: 接口契约对账(强制,在 Phase 2 之前完成)
|
|
515
|
+
|
|
516
|
+
从 api.md 提取接口矩阵后,必须执行以下对账检查:
|
|
517
|
+
|
|
518
|
+
### 检查 1:动作-接口映射对账
|
|
519
|
+
- 每个前端按钮是否在 api.md 有对应接口定义?
|
|
520
|
+
- 每个 api.md 接口是否在 Controller 有对应 mapping?
|
|
521
|
+
- api.md 中的固定路径(如 `/export`、`/template`)是否可能与 `{id}` 路径变量冲突?
|
|
522
|
+
|
|
523
|
+
### 检查 2:文件流接口对账
|
|
524
|
+
- 导出/下载接口在 api.md 是否标注为文件流?
|
|
525
|
+
- 对应 Controller 方法是否直接操作 HttpServletResponse 而非返回 Response<T>?
|
|
526
|
+
- 是否设置了 Content-Type 和 Content-Disposition?
|
|
527
|
+
|
|
528
|
+
### 检查 3:导入接口对账
|
|
529
|
+
- failureCount > 0 时,业务 code 是否为非 0?
|
|
530
|
+
- Excel 模板下载 DTO 和导入解析 DTO 的列头是否一致?
|
|
531
|
+
- 日期字段是否兼容 yyyy-MM-dd 和 yyyy-MM-dd HH:mm:ss?
|
|
532
|
+
|
|
533
|
+
### 检查 4:数据权限决策对账
|
|
534
|
+
- 每个访问业务数据的接口是否都有数据权限判断(需要/不需要/不确定)?
|
|
535
|
+
- 如果判断为"需要",是否已调查当前仓库已有权限模型并写明复用方案?
|
|
536
|
+
- 如果判断为"不需要",是否写明了原因?
|
|
537
|
+
- 如果判断为"不确定",是否已列入待确认问题?未确认的接口不得进入实现。
|
|
538
|
+
- 列表和导出是否使用同一数据权限口径?
|
|
539
|
+
- 详情/编辑/删除是否做了越权保护?
|
|
540
|
+
|
|
541
|
+
### 检查 5:外部依赖对账
|
|
542
|
+
- SDK 调用参数是否有来源说明?
|
|
543
|
+
- 是否已记录真实请求/响应或标记阻塞?
|
|
544
|
+
|
|
545
|
+
## Phase 2: 创建 Agent Team
|
|
546
|
+
|
|
547
|
+
创建 Team,成员如下:
|
|
548
|
+
- **Leader**: 你(协调、集成验证、亲自执行回归测试)
|
|
549
|
+
- **Worker-1(至少保留)**: Group A - {task-list-1}
|
|
550
|
+
- **Worker-2(可选)**: Group B - {task-list-2}
|
|
551
|
+
- **Worker-3(可选)**: Group C - {task-list-3}
|
|
552
|
+
- **Reviewer(强制参与)**: 代码评审(Worker 先自审,Reviewer 在测试前完成评审)
|
|
553
|
+
- **Tester(强制独立,至少保留)**: 独立测试验证(与 Worker 分离,不参考 Worker 自测报告)
|
|
554
|
+
|
|
555
|
+
## Phase 3: 给每个 Worker 的 Prompt 模板
|
|
556
|
+
|
|
557
|
+
```
|
|
558
|
+
你是 Worker Agent,负责执行分配给你的开发任务。
|
|
559
|
+
|
|
560
|
+
### 核心原则
|
|
561
|
+
- 编译成功 ≠ 完成任务
|
|
562
|
+
- **Worker 只做开发和启动,不自测自报"完成"**
|
|
563
|
+
- 必须通过独立 Tester 验证才能算完成
|
|
564
|
+
|
|
565
|
+
### 你的任务
|
|
566
|
+
{tasks}
|
|
567
|
+
|
|
568
|
+
### 参考文档
|
|
569
|
+
- design.md: {project-path}/doc/openspec/changes/{change-id}/design.md
|
|
570
|
+
|
|
571
|
+
### 执行流程(每个任务必须完整执行)
|
|
572
|
+
|
|
573
|
+
步骤 0: 验证 Worktree 目录(进入 worktree 后立即执行,不可跳过)
|
|
574
|
+
```bash
|
|
575
|
+
pwd
|
|
576
|
+
git branch --show-current
|
|
577
|
+
git status --short
|
|
578
|
+
```
|
|
579
|
+
- 确认当前目录包含本批次 worktree 名称
|
|
580
|
+
- 确认当前分支是本批次分支
|
|
581
|
+
- 如有异常,停止工作,向 Leader 报告
|
|
582
|
+
|
|
583
|
+
步骤 0.5: 数据库前置门禁与强制执行顺序(写代码前必须执行,不可跳过)
|
|
584
|
+
|
|
585
|
+
**一般任务(仅字段/索引变更,无历史数据迁移):**
|
|
586
|
+
- 对照 design.md / tasks.md 列出本 Worker 任务依赖的表、字段、索引、默认值
|
|
587
|
+
- 连接开发环境数据库,执行 SHOW CREATE TABLE / SHOW COLUMNS / SELECT 确认结构
|
|
588
|
+
- 如果发现缺失,从需求汇总 SQL 文件中找到对应脚本执行到开发环境数据库
|
|
589
|
+
- 执行成功后再次查询确认已生效
|
|
590
|
+
- 只有数据库满足设计后,才能进入步骤 1 开始改代码
|
|
591
|
+
- 完成业务代码后,再次执行版本总 SQL 收口对账,确认本批代码新增/修改的 DB 依赖都已进入总 SQL。
|
|
592
|
+
|
|
593
|
+
**数据库迁移类任务(涉及新增表、删除字段、表结构重构、旧数据迁移、状态字段从持久化改为动态计算、分页筛选依赖新表/新状态逻辑)——必须严格执行以下顺序:**
|
|
594
|
+
|
|
595
|
+
1. 当前数据库结构核对
|
|
596
|
+
- 对涉及表执行 SHOW CREATE TABLE / DESC
|
|
597
|
+
- 确认新表/新字段是否存在、旧字段当前状态
|
|
598
|
+
- 记录核对结果
|
|
599
|
+
|
|
600
|
+
2. 表结构改造
|
|
601
|
+
- 执行基线 SQL(新库最终结构)
|
|
602
|
+
- 执行迁移 SQL(开发库/测试库单独迁移脚本,不提交 Git 的放入 ignored 路径)
|
|
603
|
+
- 执行后 SHOW CREATE TABLE 复查确认
|
|
604
|
+
|
|
605
|
+
3. 旧数据迁移
|
|
606
|
+
- 明确旧数据如何迁移到新表/新字段
|
|
607
|
+
- 执行迁移前 COUNT、迁移后 COUNT 核对
|
|
608
|
+
- 迁移失败必须停止,不得写代码绕过
|
|
609
|
+
|
|
610
|
+
4. test-report 证据回填
|
|
611
|
+
- SQL 文件路径、数据库连接来源、执行时间、执行结果
|
|
612
|
+
- SHOW CREATE TABLE 结果摘要
|
|
613
|
+
- 迁移前后数量对比、关键联查结果
|
|
614
|
+
|
|
615
|
+
5. 编码许可判定
|
|
616
|
+
- 上述 1~4 全部完成后,才允许进入步骤 1 开始改代码
|
|
617
|
+
- 任一失败必须停止并报告,禁止先写业务代码绕过数据库状态不一致
|
|
618
|
+
- 禁止只靠 BUILD SUCCESS 或编译通过宣称完成
|
|
619
|
+
|
|
620
|
+
**通用禁止:**
|
|
621
|
+
- 禁止因为字段缺失而在业务代码里写绕过逻辑
|
|
622
|
+
- 禁止自行创建独立 SQL 文件,所有 SQL 统一追加到需求级汇总 SQL 文件
|
|
623
|
+
- 禁止用 mock/单测/BUILD SUCCESS 代替真实数据库结构核查和数据迁移验证
|
|
624
|
+
- 禁止报告"开发库已有"来替代"总 SQL 已同步";测试/发布部署只认版本总 SQL。
|
|
625
|
+
|
|
626
|
+
步骤 1: 读取 design.md 对应章节,理解设计
|
|
627
|
+
步骤 2: 修改代码(所有编辑操作必须在 worktree 目录内完成)
|
|
628
|
+
步骤 3: 代码自审(必须先做,不能跳过)
|
|
629
|
+
- 重新读取修改后的文件,逐行检查
|
|
630
|
+
- 对照 design.md 检查是否按设计实现
|
|
631
|
+
- 重点检查:空指针风险、异常处理、事务边界、日志规范
|
|
632
|
+
- **文件流接口检查**:导出/下载方法是否直接操作 HttpServletResponse?是否设置了 Content-Type 和 Content-Disposition?是否避免了被统一 JSON 包装?
|
|
633
|
+
- **导入接口检查**:failureCount > 0 时业务 code 是否非 0?Excel 列头是否与模板一致?日期格式是否兼容 yyyy-MM-dd?
|
|
634
|
+
- **路由检查**:新增的固定路径是否可能被现有 `{id}` 路径变量抢占?
|
|
635
|
+
- **数据权限检查**:访问业务数据的接口是否按 api.md 的数据权限决策实现了?是否复用了当前仓库已有权限模式?是否避免了凭字段名猜测?
|
|
636
|
+
- **外部 SDK 检查**:SDK 参数是否有来源说明?是否凭字段名猜测?
|
|
637
|
+
- 使用 `code-review-java` skill 进行评审
|
|
638
|
+
- 发现问题立即修复,修复后重新自审
|
|
639
|
+
- 自审未通过不得进入编译环节
|
|
640
|
+
步骤 4: 停止旧进程
|
|
641
|
+
pkill -f "spring-boot:run" 2>/dev/null || true
|
|
642
|
+
pkill -f "GradleDaemon" 2>/dev/null || true
|
|
643
|
+
sleep 2
|
|
644
|
+
步骤 5: 确认端口已释放
|
|
645
|
+
netstat -tlnp | grep {port} # 应该无输出
|
|
646
|
+
步骤 6: 检查端口占用(必须先做,再编译)
|
|
647
|
+
```bash
|
|
648
|
+
PORT={port}
|
|
649
|
+
# 检查端口占用
|
|
650
|
+
if lsof -i :$PORT > /dev/null 2>&1 || netstat -tlnp 2>/dev/null | grep -q ":$PORT "; then
|
|
651
|
+
echo "端口 $PORT 被占用,查找可用端口..."
|
|
652
|
+
for p in $(seq $PORT 9350); do
|
|
653
|
+
if ! lsof -i :$p > /dev/null 2>&1; then
|
|
654
|
+
export PORT=$p
|
|
655
|
+
echo "使用端口: $PORT"
|
|
656
|
+
break
|
|
657
|
+
fi
|
|
658
|
+
done
|
|
659
|
+
fi
|
|
660
|
+
```
|
|
661
|
+
- 如果更换了端口,后续所有 URL 必须同步使用新端口
|
|
662
|
+
|
|
663
|
+
步骤 7: 重新编译(必须先 clean)
|
|
664
|
+
```bash
|
|
665
|
+
{compile-cmd}
|
|
666
|
+
```
|
|
667
|
+
|
|
668
|
+
### 编译依赖问题处理(强制)
|
|
669
|
+
|
|
670
|
+
如果编译失败,**禁止直接终止任务**。必须按以下流程处理:
|
|
671
|
+
|
|
672
|
+
```
|
|
673
|
+
编译失败 → 输出完整错误日志 → 分析错误类型
|
|
674
|
+
↓
|
|
675
|
+
类型 A: 依赖下载失败(Cannot find artifact / Connection refused)
|
|
676
|
+
→ 重试编译 1-2 次
|
|
677
|
+
→ 若仍失败,检查 Maven settings.xml 或网络代理配置
|
|
678
|
+
→ 参考其他已成功编译的 worktree 的 Maven/Gradle 配置
|
|
679
|
+
|
|
680
|
+
类型 B: 类找不到(cannot find symbol / package does not exist)
|
|
681
|
+
→ 检查 import 路径是否正确
|
|
682
|
+
→ 检查依赖是否在 pom.xml/build.gradle 中声明
|
|
683
|
+
→ 参考 design.md 中的源码锚点确认类名
|
|
684
|
+
|
|
685
|
+
类型 C: 方法签名不匹配(incompatible types / no suitable method)
|
|
686
|
+
→ 对照 design.md 检查方法名、参数类型、返回值
|
|
687
|
+
→ 检查是否引用了错误的重载方法
|
|
688
|
+
|
|
689
|
+
类型 D: 其他编译错误
|
|
690
|
+
→ 逐行分析错误信息
|
|
691
|
+
→ 对照 design.md 确认实现方案
|
|
692
|
+
→ 15 分钟内无法解决 → 上报 Leader
|
|
693
|
+
```
|
|
694
|
+
|
|
695
|
+
**关键原则**:
|
|
696
|
+
- 其他 agent 能正常编译启动,说明环境和配置是对的
|
|
697
|
+
- 遇到问题时,先检查自己的代码修改,而非假设环境有问题
|
|
698
|
+
- 必须尝试修复,不能一遇到错误就放弃
|
|
699
|
+
- 修复后必须重新 clean compile,确认 BUILD SUCCESS
|
|
700
|
+
|
|
701
|
+
步骤 8: 启动应用(记录 PID)
|
|
702
|
+
```bash
|
|
703
|
+
# 先停止自己的旧进程(只停自己的,不碰别人的)
|
|
704
|
+
pkill -f "spring-boot:run" 2>/dev/null || true
|
|
705
|
+
sleep 2
|
|
706
|
+
|
|
707
|
+
# 使用确定的端口启动(可能是原端口或新端口)
|
|
708
|
+
nohup {run-cmd} > app.log 2>&1 &
|
|
709
|
+
echo $! > /tmp/app.pid
|
|
710
|
+
sleep 15
|
|
711
|
+
```
|
|
712
|
+
- 如果使用了新端口,run-cmd 中必须传入新端口(如 --server.port=$PORT)
|
|
713
|
+
步骤 9: 进程验证(必须执行)
|
|
714
|
+
- 检查 PID: ps -o pid,lstart,cmd -p $(cat /tmp/app.pid)
|
|
715
|
+
- 检查端口: netstat -tlnp | grep $PORT 或 lsof -i :$PORT
|
|
716
|
+
- 检查日志: tail -30 app.log | grep "Started Application\|JVM running"
|
|
717
|
+
- 确认启动时间是本次启动
|
|
718
|
+
- 如果用了新端口,确认新端口确实被本进程监听
|
|
719
|
+
步骤 10: 健康检查
|
|
720
|
+
curl -s http://localhost:$PORT{context-path}/actuator/health | grep UP
|
|
721
|
+
步骤 11: 获取测试 Token(严格按 Token 获取规范执行)
|
|
722
|
+
- 调用 /captcha/image 获取验证码(带 Cookie)
|
|
723
|
+
- 调用 /login 表单提交获取 token
|
|
724
|
+
- 验证 token 非空且不为 null
|
|
725
|
+
步骤 12: 执行 RED 验证(必须在生产代码修改前完成)
|
|
726
|
+
- 从 tests.md 提取本批次用例 ID 和自动化命令
|
|
727
|
+
- 运行目标单测/接口自动化命令,确认失败原因是预期业务断言
|
|
728
|
+
- 记录命令、失败摘要、失败断言到 test-report 的 RED 失败证据
|
|
729
|
+
- RED 未正确失败时不得继续编码
|
|
730
|
+
步骤 13: 执行接口验证 Checklist(逐项执行,来自 tests.md L3 用例)
|
|
731
|
+
- 按照 Phase 4.5 的 checklist 逐项执行 curl 命令
|
|
732
|
+
- 记录每个用例的请求、响应和断言结果
|
|
733
|
+
- 未全部勾选不得报告完成
|
|
734
|
+
步骤 14: 数据库验证
|
|
735
|
+
- 执行 SHOW CREATE TABLE 确认结构
|
|
736
|
+
- 执行 SELECT 查询确认数据状态
|
|
737
|
+
步骤 15: 日志检查
|
|
738
|
+
- grep ERROR app.log
|
|
739
|
+
- 确认无 ERROR
|
|
740
|
+
步骤 16: 回填 test-report.md
|
|
741
|
+
- 记录 RED、GREEN、curl、响应、DB 查询、日志检查结果
|
|
742
|
+
步骤 17: 执行 SDD 集成验收脚本(必须执行)
|
|
743
|
+
~/.codex/hooks/superflow-verify-integration.sh \
|
|
744
|
+
{project-path}/doc/openspec/changes/{change-id}/embedded-changes/pXX-xxx/test-report.md
|
|
745
|
+
- 脚本失败时不得提交、不得交付、不得写"后续补测"
|
|
746
|
+
- 必须补齐真实启动、curl、DB、日志证据后重跑
|
|
747
|
+
步骤 18: 报告开发完成,等待 Tester 独立测试
|
|
748
|
+
|
|
749
|
+
### 报告格式
|
|
750
|
+
开发完成报告:
|
|
751
|
+
- 任务 ID: {task-id}
|
|
752
|
+
- 状态: 开发完成,等待独立测试
|
|
753
|
+
- 修改文件: {file}
|
|
754
|
+
- 代码自审结果: 通过(无 CRITICAL/HIGH)
|
|
755
|
+
- 空指针检查: ✓ 异常处理: ✓ 事务边界: ✓ 日志规范: ✓
|
|
756
|
+
- 数据库前置门禁:
|
|
757
|
+
- 检查的表/字段/索引: {列出}
|
|
758
|
+
- 汇总 SQL 文件路径: {路径}
|
|
759
|
+
- 执行的脚本: {具体脚本或行号范围}
|
|
760
|
+
- 执行结果: {成功/失败}
|
|
761
|
+
- 复查确认: {SHOW CREATE TABLE / SELECT 结果摘要}
|
|
762
|
+
- 版本总 SQL 收口对账: {源码/Mapper vs 开发库 vs 测试库现状+总SQL,贴表或摘要}
|
|
763
|
+
- RED-GREEN 证据:
|
|
764
|
+
- RED 命令: {test/curl 命令}
|
|
765
|
+
- RED 失败摘要: {预期业务断言失败}
|
|
766
|
+
- GREEN 命令: {同一命令}
|
|
767
|
+
- GREEN 通过摘要: {通过输出}
|
|
768
|
+
- 编译状态: 通过({compile-cmd})
|
|
769
|
+
- 进程验证:
|
|
770
|
+
- PID: {pid}
|
|
771
|
+
- 启动时间: {timestamp}
|
|
772
|
+
- 健康检查: UP ✓
|
|
773
|
+
- 接口验证 Checklist(逐项执行结果):
|
|
774
|
+
- [ ] L3-用例-1: {curl} → {结果}
|
|
775
|
+
- [ ] L3-用例-2: {curl} → {结果}
|
|
776
|
+
- ...(全部 L3 用例)
|
|
777
|
+
- 数据库验证:
|
|
778
|
+
- SHOW CREATE TABLE {表名}: {结果摘要}
|
|
779
|
+
- SELECT {查询}: {结果摘要}
|
|
780
|
+
- 日志检查:
|
|
781
|
+
- grep ERROR: {无 ERROR / ERROR 列表}
|
|
782
|
+
- 关键日志: {出现 / 未出现}
|
|
783
|
+
- test-report 已回填: {是 / 否}
|
|
784
|
+
- SDD 集成验收脚本: {通过 / 失败,失败时贴出原因}
|
|
785
|
+
- 说明: 应用已启动,接口已验证,等待独立 Tester 测试验证
|
|
786
|
+
```
|
|
787
|
+
|
|
788
|
+
## Phase 3b: 给 Tester 的 Prompt 模板
|
|
789
|
+
|
|
790
|
+
```
|
|
791
|
+
你是独立测试 Agent(Tester),负责验证 Worker 的开发成果。
|
|
792
|
+
|
|
793
|
+
### 核心原则
|
|
794
|
+
- **与 Worker 完全分离**:不参考 Worker 的自测报告,独立从头执行测试
|
|
795
|
+
- **客观报告**:如实报告失败,不替 Worker 找理由
|
|
796
|
+
- **覆盖全部用例**:执行 tests.md 中所有标注 [自动化] 的用例
|
|
797
|
+
|
|
798
|
+
### 你的任务
|
|
799
|
+
测试 Worker 完成的任务:{task-id}
|
|
800
|
+
|
|
801
|
+
### 参考文档
|
|
802
|
+
- tests.md: {project-path}/doc/openspec/changes/{change-id}/tests.md
|
|
803
|
+
|
|
804
|
+
### 执行流程
|
|
805
|
+
步骤 1: 读取 tests.md 对应章节的全部用例
|
|
806
|
+
步骤 2: 独立执行接口测试(curl)
|
|
807
|
+
步骤 3: 独立执行数据库验证(mysql 查询)
|
|
808
|
+
步骤 4: 独立执行日志检查(grep ERROR / 关键日志)
|
|
809
|
+
步骤 5: 向 Leader 报告客观结果
|
|
810
|
+
|
|
811
|
+
### 报告格式
|
|
812
|
+
独立测试报告:
|
|
813
|
+
- 任务 ID: {task-id}
|
|
814
|
+
- 测试人: Tester(独立)
|
|
815
|
+
- 测试用例: 共 X 个,执行 X 个,通过 X 个,失败 X 个
|
|
816
|
+
- 测试详情:
|
|
817
|
+
- 用例 1 [通过]: ...
|
|
818
|
+
- 用例 2 [失败]: 预期... 实际...
|
|
819
|
+
- 数据库验证: ...
|
|
820
|
+
- 日志检查: ...
|
|
821
|
+
- 结论: 通过 / 不通过
|
|
822
|
+
```
|
|
823
|
+
|
|
824
|
+
## Phase 4: 集成验证(你亲自执行)
|
|
825
|
+
|
|
826
|
+
所有 Worker 完成后:
|
|
827
|
+
1. 亲自执行全量编译: {compile-cmd}
|
|
828
|
+
2. 亲自执行进程验证(按上述步骤 3-8)
|
|
829
|
+
3. 亲自执行回归测试: 按 tests.md 完整执行所有 curl
|
|
830
|
+
4. 亲自查询数据库验证数据状态
|
|
831
|
+
5. 亲自检查日志无 ERROR
|
|
832
|
+
6. 亲自执行验收脚本:
|
|
833
|
+
`~/.codex/hooks/superflow-verify-integration.sh <test-report.md>`
|
|
834
|
+
|
|
835
|
+
## Phase 4.5: 接口验证 Checklist(每个任务必须逐项执行并记录证据)
|
|
836
|
+
|
|
837
|
+
Worker 完成编码和启动后,必须按以下 checklist 逐项执行接口验证,每完成一项勾选一项,未勾选完不得报告"完成"。
|
|
838
|
+
|
|
839
|
+
### RED-GREEN 验证(必须执行)
|
|
840
|
+
- [ ] 已从 tests.md 提取本批次用例 ID、自动化命令和断言
|
|
841
|
+
- [ ] 已在生产代码修改前执行 RED 命令
|
|
842
|
+
- [ ] RED 失败原因是预期业务断言,不是环境/编译/token/测试代码错误
|
|
843
|
+
- [ ] 已在 test-report 记录 RED 命令、失败摘要和失败断言
|
|
844
|
+
- [ ] 已在实现后执行同一命令并记录 GREEN 通过输出
|
|
845
|
+
- [ ] 未修改 tests.md 语义来迎合实现;如测试合同需变更,已回到 SDD 文档阶段
|
|
846
|
+
|
|
847
|
+
### 启动验证(必须执行)
|
|
848
|
+
- [ ] 旧进程已停止(`pkill` + `sleep 2` + 端口确认无占用)
|
|
849
|
+
- [ ] 重新编译通过(`mvn clean compile -DskipTests` BUILD SUCCESS)
|
|
850
|
+
- [ ] 应用已启动(`mvn spring-boot:run` 或 `./gradlew bootRun`)
|
|
851
|
+
- [ ] 进程已验证(PID 存在、启动时间接近当前、端口绑定正确)
|
|
852
|
+
- [ ] 健康检查通过(`curl /actuator/health` 返回 UP)
|
|
853
|
+
- [ ] 日志确认是本次启动(时间戳匹配、无异常退出)
|
|
854
|
+
|
|
855
|
+
### Token 获取(必须执行)
|
|
856
|
+
- [ ] 已调用 `/captcha/image`(带 `-c` Cookie)
|
|
857
|
+
- [ ] 已调用 `/login`(Content-Type 为 `application/x-www-form-urlencoded`,字段为 `userName`)
|
|
858
|
+
- [ ] 已提取 token(从响应 JSON 的 `data.token` 字段)
|
|
859
|
+
- [ ] token 非空且不为 null
|
|
860
|
+
|
|
861
|
+
### 接口调用(逐项执行,来自 tests.md L3 用例)
|
|
862
|
+
- [ ] {L3-用例-1}: {curl/自动化命令} → 请求数据来源 {来源} → 响应断言 {断言} → 实际 {记录}
|
|
863
|
+
- [ ] {L3-用例-2}: {curl/自动化命令} → 请求数据来源 {来源} → 响应断言 {断言} → 实际 {记录}
|
|
864
|
+
...(从 tests.md 提取本批次所有 L3 用例)
|
|
865
|
+
|
|
866
|
+
### 数据库验证(必须执行)
|
|
867
|
+
- [ ] 已执行 `SHOW CREATE TABLE {表名}` 确认结构
|
|
868
|
+
- [ ] 已按每个用例 ID 执行 `SELECT` 查询确认数据状态与预期一致
|
|
869
|
+
- [ ] 已记录查询结果摘要
|
|
870
|
+
|
|
871
|
+
### 日志检查(必须执行)
|
|
872
|
+
- [ ] 已执行 `grep ERROR app.log` 或等效命令
|
|
873
|
+
- [ ] 无 ERROR(除已知无关错误外)
|
|
874
|
+
- [ ] 每个用例 ID 对应的关键日志已出现(如设计要求的特定日志标记)
|
|
875
|
+
|
|
876
|
+
### test-report 回填(必须执行)
|
|
877
|
+
- [ ] 已更新 `embedded-changes/pXX-xxx/test-report.md`
|
|
878
|
+
- [ ] 包含:RED/GREEN 命令和输出、curl 命令、响应摘要、数据库查询结果、日志检查结果
|
|
879
|
+
- [ ] 包含:`Tests run:` 真实输出(单元测试)
|
|
880
|
+
- [ ] 包含:进程验证证据(PID、启动时间)
|
|
881
|
+
|
|
882
|
+
### SDD 集成验收脚本(必须执行)
|
|
883
|
+
- [ ] 已执行 `~/.codex/hooks/superflow-verify-integration.sh <test-report.md>`
|
|
884
|
+
- [ ] 脚本检查通过
|
|
885
|
+
- [ ] 如脚本失败,已补齐证据并重跑通过
|
|
886
|
+
|
|
887
|
+
---
|
|
888
|
+
|
|
889
|
+
## Phase 5: 强制质量门禁(全部必须满足)
|
|
890
|
+
|
|
891
|
+
| # | 门禁 | 通过标准 | 验证人 |
|
|
892
|
+
|---|------|---------|--------|
|
|
893
|
+
| 1 | 编译 | `mvn clean compile -DskipTests` BUILD SUCCESS | Worker + Leader |
|
|
894
|
+
| 2 | 启动 | 新进程 + 健康检查 UP + 日志时间戳匹配 | Worker + Leader |
|
|
895
|
+
| 3 | **接口测试** | **Worker 逐项执行 L3 checklist 全部勾选** | **Worker** |
|
|
896
|
+
| 4 | **独立测试** | **Tester 独立执行全部用例通过** | **Tester** |
|
|
897
|
+
| 5 | 数据库 | `SHOW CREATE TABLE` / `SELECT` 验证数据状态符合预期 | Tester + Leader |
|
|
898
|
+
| 6 | 日志 | `grep ERROR` 无 ERROR + 关键日志出现 | Tester + Leader |
|
|
899
|
+
| 7 | SDD 集成验收脚本 | `superflow-verify-integration.sh <test-report.md>` 通过 | Worker + Leader |
|
|
900
|
+
| 8 | 代码评审 | 无 HIGH+ 问题 | Reviewer |
|
|
901
|
+
| 9 | 全链路回归 | 真实应用 API 集成测试通过;跨系统任务需真实入口证据或明确阻塞 | Leader 亲自 |
|
|
902
|
+
|
|
903
|
+
⚠️ **任一门禁未通过,不得交付。Worker 门禁未通过不得报告完成。Leader 抽查未通过标记任务未完成。**
|
|
904
|
+
|
|
905
|
+
**特别强调:**
|
|
906
|
+
- 门禁 3(接口测试)不是"可选优化",是**必须**。Worker 必须亲自逐项执行 checklist 中的 curl 命令,并记录响应。不能跳过这步直接等 Tester。
|
|
907
|
+
- 门禁 2(启动)不是"端口监听就行",必须验证是新进程(PID、启动时间、日志时间戳)。复用旧进程测试 = 测试无效。
|
|
908
|
+
- 门禁 5(数据库)不是"接口返回对就行",必须真实查询数据库确认数据落库正确。
|
|
909
|
+
- 门禁 7(验收脚本)不是形式检查,可失败即说明证据缺口;失败时只能补证据或标记阻塞,不能绕过。
|
|
910
|
+
|
|
911
|
+
## 禁止事项(红线)
|
|
912
|
+
|
|
913
|
+
1. ❌ **不在 worktree 内编码**
|
|
914
|
+
- 错误:在主工作树或其他 agent 的 worktree 内修改文件
|
|
915
|
+
- 正确:进入 worktree 后先 `pwd` + `git branch --show-current` 验证,所有编辑在正确 worktree 内完成
|
|
916
|
+
|
|
917
|
+
2. ❌ **编译成功就交付(必须通过全部门禁)**
|
|
918
|
+
- ❌ 错误:"代码已修改,编译通过,任务完成"
|
|
919
|
+
- ✅ 正确:"代码已修改,编译通过,应用已启动,接口已真实调用,数据库已验证,test-report 已回填,任务完成"
|
|
920
|
+
|
|
921
|
+
3. ❌ **不启动应用就宣称完成**
|
|
922
|
+
- ❌ 错误:"单元测试通过,openspec 验证通过,任务完成"(从未启动应用、从未调接口)
|
|
923
|
+
- ✅ 正确:必须启动应用 → 进程验证 → 健康检查 UP → 逐项执行 L3 checklist → 数据库验证 → 日志检查 → 全部完成后才能报告
|
|
924
|
+
|
|
925
|
+
4. ❌ **Worker 自测自报"完成"(Worker 只报告"开发完成", Tester 独立验证后才能算完成)**
|
|
926
|
+
|
|
927
|
+
4. ❌ **Tester 参考 Worker 的自测结果(Tester 必须独立从头执行全部用例)**
|
|
928
|
+
|
|
929
|
+
5. ❌ **复用旧进程测试新代码(必须停止旧进程重新启动)**
|
|
930
|
+
|
|
931
|
+
6. ❌ **仅 grep 代码不实际调接口(必须真实 curl)**
|
|
932
|
+
|
|
933
|
+
7. ❌ **信任 Worker/Tester 报告不自己验证(Leader 必须亲自验证)**
|
|
934
|
+
|
|
935
|
+
8. ❌ **跳过 clean 直接编译(必须先 clean)**
|
|
936
|
+
|
|
937
|
+
9. ❌ **混淆 Maven/Gradle 命令(Gradle 用 --args,不是 -D)**
|
|
938
|
+
|
|
939
|
+
10. ❌ **忽略 ERROR 日志(测试通过 + 日志无 ERROR 才算通过)**
|
|
940
|
+
|
|
941
|
+
11. ❌ **跳过代码评审直接编译/测试(必须先自审,检查空指针/异常/事务/日志)**
|
|
942
|
+
|
|
943
|
+
12. ❌ **遇到编译依赖问题不尝试修复就终止**
|
|
944
|
+
- 错误:编译报"找不到符号"或"依赖下载失败"就直接说"环境有问题,任务无法继续"
|
|
945
|
+
- 正确:分析错误类型 → 对照 design.md 检查 → 尝试修复 → 15 分钟无法解决才上报 Leader
|
|
946
|
+
- 关键:其他 agent 能正常编译启动,说明环境是对的,问题出在自己的代码上
|
|
947
|
+
|
|
948
|
+
13. ❌ **关闭其他 agent 的应用进程**
|
|
949
|
+
- 错误:端口被占用 → 直接 `pkill -f spring-boot` 或 `kill` 所有 Java 进程
|
|
950
|
+
- 正确:先确认进程归属 → 是其他 agent 的 → 自己换一个端口启动 → 不得关闭别人的进程
|
|
951
|
+
|
|
952
|
+
14. ❌ **使用 mock-only 或占位参数代替真实测试**
|
|
953
|
+
- 错误:没获取真实 token、没调真实接口、用假数据断言"通过"
|
|
954
|
+
- 正确:严格按 Token 获取规范获取真实 token → 真实 curl 调用接口 → 真实查询数据库 → 真实检查日志
|
|
955
|
+
|
|
956
|
+
15. ❌ **交付前不核对 prompt 要求**
|
|
957
|
+
- 错误:代码改了、编译过了、随便测了两个接口就交付
|
|
958
|
+
- 正确:交付前逐条核对本 prompt 的"必须完成"和"验收标准",确保每一条都有对应证据
|
|
959
|
+
|
|
960
|
+
16. ❌ **跳过数据库前置门禁直接写代码**
|
|
961
|
+
- 错误:不管数据库表结构是否满足设计,直接改业务代码;发现字段缺失时在代码里加兼容逻辑
|
|
962
|
+
- 正确:先连接开发环境数据库 SHOW CREATE TABLE 确认结构 → 发现缺失时执行汇总 SQL → 确认生效后再写代码
|
|
963
|
+
|
|
964
|
+
17. ❌ **自行创建独立 SQL 文件**
|
|
965
|
+
- 错误:每个任务各建一个 SQL 文件,或者把 SQL 写在临时说明里不追加到汇总文件
|
|
966
|
+
- 正确:所有 SQL 统一追加到需求级汇总 SQL 文件(如 openspec/changes/xxx/sql/{version}.sql)
|
|
967
|
+
|
|
968
|
+
18. ❌ **用代码绕过数据库结构缺失**
|
|
969
|
+
- 错误:发现字段不存在时加 if-null 判断、发现默认值缺失时在代码里硬编码、发现初始化数据缺失时在代码里插数据
|
|
970
|
+
- 正确:停止编码 → 检查汇总 SQL 是否有对应脚本 → 执行到开发环境数据库 → 确认生效后继续
|
|
971
|
+
|
|
972
|
+
19. ❌ **用 mock/单测/BUILD SUCCESS 代替真实数据库核查**
|
|
973
|
+
- 错误:单元测试通过就认为数据库结构没问题
|
|
974
|
+
- 正确:必须连接开发环境真实数据库执行 SHOW CREATE TABLE / SELECT 确认
|
|
975
|
+
|
|
976
|
+
20. ❌ **文件流接口被统一 JSON 包装**
|
|
977
|
+
- 错误:导出/下载方法返回 `Response<T>`,导致前端收到 JSON 而不是文件流
|
|
978
|
+
- 正确:导出/下载方法直接操作 HttpServletResponse,设置 Content-Type 和 Content-Disposition
|
|
979
|
+
|
|
980
|
+
21. ❌ **导入部分失败时返回 code=0**
|
|
981
|
+
- 错误:`failureCount > 0` 但使用 `Response.ok(result)` 返回 code=0,前端误判成功
|
|
982
|
+
- 正确:failureCount > 0 时返回非 0 业务 code,前端通过 code 判断失败
|
|
983
|
+
|
|
984
|
+
22. ❌ **Excel 日期格式不兼容**
|
|
985
|
+
- 错误:后端只支持 `yyyy-MM-dd HH:mm:ss`,但 Excel 实际只有 `yyyy-MM-dd`
|
|
986
|
+
- 正确:日期解析至少覆盖 `yyyy-MM-dd` 和 `yyyy-MM-dd HH:mm:ss` 两种格式
|
|
987
|
+
|
|
988
|
+
23. ❌ **SDK 参数凭字段名猜测**
|
|
989
|
+
- 错误:看到 SDK 方法有个 `appId` 参数就猜含义直接传值
|
|
990
|
+
- 正确:api.md 中必须有参数来源说明,未确认前不得传值
|
|
991
|
+
|
|
992
|
+
24. ❌ **跳过接口契约对账直接开发**
|
|
993
|
+
- 错误:没从 api.md 提取接口矩阵就开始写 Controller
|
|
994
|
+
- 正确:先完成 Phase 1.5 接口契约对账,确认每个按钮都有对应接口
|
|
995
|
+
|
|
996
|
+
25. ❌ **测试不验证响应头和文件体**
|
|
997
|
+
- 错误:文件流接口只验证 HTTP 200,不验证 Content-Type / Content-Disposition / 文件体
|
|
998
|
+
- 正确:文件流接口测试必须验证响应头和文件体非空
|
|
999
|
+
|
|
1000
|
+
26. ❌ **访问业务数据的接口不做数据权限判断**
|
|
1001
|
+
- 错误:列表/详情/导出/编辑/删除接口未判断是否需要数据权限,或凭字段名猜测权限边界
|
|
1002
|
+
- 正确:按 api.md 数据权限决策实现,复用当前仓库已有权限模式;如果决策为"不确定",停止实现向用户确认
|
|
1003
|
+
|
|
1004
|
+
27. ❌ **凭字段名猜测数据权限**
|
|
1005
|
+
- 错误:看到 operatorId/tenantId/orgId 等字段就假设是权限边界字段
|
|
1006
|
+
- 正确:先调查当前仓库已有权限模型,复用成熟实现,不临时发明过滤逻辑
|
|
1007
|
+
|
|
1008
|
+
28. ❌ **数据权限不确定时自行决定**
|
|
1009
|
+
- 错误:需求未说明不同角色数据范围,agent 自行按"超管看全量"处理
|
|
1010
|
+
- 正确:标记为"不确定",列入待确认问题,向用户询问后确认
|
|
1011
|
+
|
|
1012
|
+
## 数据权限调查步骤(写代码前必须完成)
|
|
1013
|
+
|
|
1014
|
+
1. 搜索当前仓库已有数据权限实现:
|
|
1015
|
+
- SuperAdmin/Admin/Role/DataScope/Tenant/Org/Dept/Operator/Merchant/Agency 等关键词
|
|
1016
|
+
- BaseController/BaseService/LoginUser/CurrentUser/UserContext/SecurityContext 等上下文工具
|
|
1017
|
+
- 同模块已有列表、详情、导出、编辑、删除接口
|
|
1018
|
+
2. 选择最接近的已有接口作为参考样例。
|
|
1019
|
+
3. 在设计说明中写明复用哪个类、方法、注解、AOP、SQL 模式或代码模式。
|
|
1020
|
+
4. 不允许凭字段名猜测数据权限。
|
|
1021
|
+
5. 不允许为当前接口临时发明一套和仓库其他接口不一致的数据过滤。
|
|
1022
|
+
6. 列表和导出必须使用同一数据权限口径,除非需求明确不同。
|
|
1023
|
+
7. 详情/编辑/删除/退款/审批等操作必须防止越权访问,不能只靠前端隐藏按钮。
|
|
1024
|
+
8. 如果无法判断是否需要数据权限,停止实现,在需求/SDD 阶段向用户确认。
|
|
1025
|
+
|
|
1026
|
+
## 故障处理
|
|
1027
|
+
|
|
1028
|
+
- 应用启动失败: 检查命令是否正确、profile 是否生效、端口是否被占
|
|
1029
|
+
- 进程混淆: 日志时间戳不对 → 停止重来 → 重新执行完整进程验证
|
|
1030
|
+
- 测试失败: 记录现象 → 对照 design.md 分析 → 修复 → 从 clean compile 重新开始
|
|
1031
|
+
- Worker 无响应: 10 分钟超时 → 重新分配任务
|
|
1032
|
+
```
|
|
1033
|
+
|
|
1034
|
+
---
|
|
1035
|
+
|
|
1036
|
+
## 使用说明
|
|
1037
|
+
|
|
1038
|
+
1. 复制上方 `Copy-Paste 版本` 中的全部内容
|
|
1039
|
+
2. 替换所有 `{占位符}` 为实际值
|
|
1040
|
+
3. 粘贴给新 Agent 执行
|
|
1041
|
+
4. 关键占位符对照表:
|
|
1042
|
+
|
|
1043
|
+
| 占位符 | 说明 | 示例 |
|
|
1044
|
+
|--------|------|------|
|
|
1045
|
+
| `{change-id}` | 变更目录名 | `3.24.0.2-fix-debug-status-and-light-on-bind` |
|
|
1046
|
+
| `{project-path}` | 项目绝对路径 | `/home/ake-yanfa/IdeaProjects/MPGS/park-mpgs` |
|
|
1047
|
+
| `{maven-or-gradle}` | 构建工具 | `Gradle` |
|
|
1048
|
+
| `{profile-name}` | Spring Profile | `cmk` |
|
|
1049
|
+
| `{base-port}` | 应用基础端口号(配置文件中) | `9250` |
|
|
1050
|
+
| `{batch-id}` | 批次序号 | `15` |
|
|
1051
|
+
| `{port}` | 计算端口 = base-port + batch-id | `9265` |
|
|
1052
|
+
| `{context-path}` | 上下文路径 | `/mpgs` |
|
|
1053
|
+
| `{compile-cmd}` | 编译命令 | `./gradlew clean compileJava -x test` |
|
|
1054
|
+
| `{run-cmd}` | 启动命令 | `./gradlew bootRun --args='--spring.profiles.active=cmk'` |
|
|
1055
|
+
| `{task-list-N}` | 分配给 Worker 的任务 | `Task 5.1, Task 7.1, Task 9.1` |
|
|
1056
|
+
| `{curl-examples}` | curl 命令示例 | 从 tests.md 提取 |
|