@chenguangyao/devflow-kit 0.1.43

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.
Files changed (198) hide show
  1. package/CHANGELOG.md +232 -0
  2. package/LICENSE +21 -0
  3. package/README.md +539 -0
  4. package/bin/devflow.js +9 -0
  5. package/docs/RFC-001-devflow-kit.md +617 -0
  6. package/docs/RFC-002-workflow-kernel.md +134 -0
  7. package/docs/enterprise-integration-supplement.md +274 -0
  8. package/docs/internal-gitlab-setup.md +426 -0
  9. package/docs/marketplace-skills.md +231 -0
  10. package/docs/migration-from-arb.md +232 -0
  11. package/docs/tooling-overview.md +774 -0
  12. package/docs/workflow-orchestration.md +695 -0
  13. package/docs/workflow-ui-prototype.html +271 -0
  14. package/package.json +52 -0
  15. package/schemas/config.schema.json +51 -0
  16. package/schemas/delta.schema.json +22 -0
  17. package/schemas/state.schema.json +130 -0
  18. package/schemas/status-surface.schema.json +197 -0
  19. package/schemas/workflow-confirmation-surface.schema.json +70 -0
  20. package/schemas/workflow-picker.schema.json +94 -0
  21. package/scripts/postinstall.js +101 -0
  22. package/scripts/render-workflow-ui-prototype.js +271 -0
  23. package/skills/apply/SKILL.md +313 -0
  24. package/skills/apply/references/discipline-checklist.md +145 -0
  25. package/skills/apply/references/subagent-implementer-prompt.md +113 -0
  26. package/skills/apply/references/subagent-orchestration.md +150 -0
  27. package/skills/apply/references/subagent-reviewer-prompt.md +180 -0
  28. package/skills/apply/references/tdd-loop.md +287 -0
  29. package/skills/apply/references/when-plan-is-wrong.md +279 -0
  30. package/skills/apply/references/worktree-swarm.md +292 -0
  31. package/skills/archive/SKILL.md +229 -0
  32. package/skills/archive/references/conflict-resolution.md +336 -0
  33. package/skills/archive/references/knowledge-deposit.md +381 -0
  34. package/skills/archive/references/spec-merge.md +365 -0
  35. package/skills/brainstorm/SKILL.md +123 -0
  36. package/skills/brainstorm/references/proposal-template.md +244 -0
  37. package/skills/brainstorm/references/question-catalog.md +168 -0
  38. package/skills/brainstorm/references/session-template.md +184 -0
  39. package/skills/ci-fix/SKILL.md +63 -0
  40. package/skills/ci-fix/references/loop.md +25 -0
  41. package/skills/code-review/SKILL.md +279 -0
  42. package/skills/code-review/references/escalation-playbook.md +192 -0
  43. package/skills/code-review/references/language-cheatsheets/go.md +175 -0
  44. package/skills/code-review/references/language-cheatsheets/java-spring-mybatis.md +246 -0
  45. package/skills/code-review/references/language-cheatsheets/python.md +170 -0
  46. package/skills/code-review/references/language-cheatsheets/vue.md +199 -0
  47. package/skills/code-review/references/output-template.md +275 -0
  48. package/skills/code-review/references/review-checklist.md +251 -0
  49. package/skills/complexity-grading/SKILL.md +259 -0
  50. package/skills/deliver/SKILL.md +271 -0
  51. package/skills/deliver/references/delivery-modes.md +299 -0
  52. package/skills/deliver/references/notify.md +359 -0
  53. package/skills/deliver/references/pr-description.md +319 -0
  54. package/skills/dependency-upgrade/SKILL.md +57 -0
  55. package/skills/dependency-upgrade/references/risk-matrix.md +38 -0
  56. package/skills/df-orchestrator/SKILL.md +407 -0
  57. package/skills/df-orchestrator/references/complexity-grading.md +177 -0
  58. package/skills/df-orchestrator/references/escalation-matrix.md +191 -0
  59. package/skills/df-orchestrator/references/routing-rules.md +290 -0
  60. package/skills/df-orchestrator/references/workflow-state-machine.md +208 -0
  61. package/skills/frontend-quality/SKILL.md +61 -0
  62. package/skills/frontend-quality/references/checklist.md +35 -0
  63. package/skills/handoff-resume/SKILL.md +59 -0
  64. package/skills/handoff-resume/references/handoff-template.md +54 -0
  65. package/skills/plan/SKILL.md +166 -0
  66. package/skills/plan/references/task-breakdown.md +207 -0
  67. package/skills/plan/references/task-sequencing.md +143 -0
  68. package/skills/plan/references/task-template.md +248 -0
  69. package/skills/requirement-analysis/SKILL.md +499 -0
  70. package/skills/requirement-analysis/references/acceptance-criteria.md +183 -0
  71. package/skills/requirement-analysis/references/code-recon.md +151 -0
  72. package/skills/requirement-analysis/references/edge-case-catalog.md +164 -0
  73. package/skills/requirement-analysis/references/requirement-template.md +339 -0
  74. package/skills/requirement-analysis/references/scope-negotiation.md +162 -0
  75. package/skills/security-hardening/SKILL.md +60 -0
  76. package/skills/security-hardening/references/checklist.md +42 -0
  77. package/skills/tech-spec/SKILL.md +388 -0
  78. package/skills/tech-spec/references/api-contract-design.md +172 -0
  79. package/skills/tech-spec/references/decision-records.md +110 -0
  80. package/skills/tech-spec/references/design-template.md +301 -0
  81. package/skills/tech-spec/references/rollout-and-rollback.md +203 -0
  82. package/skills/tech-spec/references/spec-delta-conventions.md +250 -0
  83. package/skills/tech-spec/references/transaction-patterns.md +212 -0
  84. package/skills/test-spec/SKILL.md +219 -0
  85. package/skills/test-spec/references/coverage-strategy.md +218 -0
  86. package/skills/test-spec/references/edge-case-to-test.md +143 -0
  87. package/skills/test-spec/references/test-case-template.md +276 -0
  88. package/skills/verify/SKILL.md +232 -0
  89. package/skills/verify/references/nfr-verification.md +292 -0
  90. package/skills/verify/references/report-templates.md +510 -0
  91. package/skills/verify/references/self-test-guide.md +240 -0
  92. package/skills/verify/references/verify-rollback-map.md +247 -0
  93. package/src/cli/commands/_helpers.js +108 -0
  94. package/src/cli/commands/_submit.js +718 -0
  95. package/src/cli/commands/apply.js +198 -0
  96. package/src/cli/commands/archive.js +180 -0
  97. package/src/cli/commands/checkpoint.js +113 -0
  98. package/src/cli/commands/deliver.js +377 -0
  99. package/src/cli/commands/deploy.js +504 -0
  100. package/src/cli/commands/design.js +158 -0
  101. package/src/cli/commands/disable.js +21 -0
  102. package/src/cli/commands/doctor.js +178 -0
  103. package/src/cli/commands/enable.js +21 -0
  104. package/src/cli/commands/flow.js +645 -0
  105. package/src/cli/commands/help.js +93 -0
  106. package/src/cli/commands/ingest.js +602 -0
  107. package/src/cli/commands/init.js +341 -0
  108. package/src/cli/commands/knowledge.js +523 -0
  109. package/src/cli/commands/logs.js +43 -0
  110. package/src/cli/commands/new.js +202 -0
  111. package/src/cli/commands/plan.js +49 -0
  112. package/src/cli/commands/propose.js +27 -0
  113. package/src/cli/commands/provider.js +698 -0
  114. package/src/cli/commands/report.js +143 -0
  115. package/src/cli/commands/requirement.js +227 -0
  116. package/src/cli/commands/review.js +301 -0
  117. package/src/cli/commands/skills.js +457 -0
  118. package/src/cli/commands/status.js +925 -0
  119. package/src/cli/commands/switch.js +27 -0
  120. package/src/cli/commands/sync.js +47 -0
  121. package/src/cli/commands/test.js +366 -0
  122. package/src/cli/commands/uninstall.js +32 -0
  123. package/src/cli/commands/update.js +74 -0
  124. package/src/cli/commands/verify.js +354 -0
  125. package/src/cli/commands/worktree.js +78 -0
  126. package/src/cli/index.js +72 -0
  127. package/src/cli/parse-args.js +102 -0
  128. package/src/core/autodetect.js +271 -0
  129. package/src/core/change.js +208 -0
  130. package/src/core/checkpoint.js +217 -0
  131. package/src/core/config.js +60 -0
  132. package/src/core/delta.js +290 -0
  133. package/src/core/markers.js +59 -0
  134. package/src/core/paths.js +173 -0
  135. package/src/core/plan-tasks.js +36 -0
  136. package/src/core/project-routing.js +285 -0
  137. package/src/core/projects.js +200 -0
  138. package/src/core/state.js +200 -0
  139. package/src/core/workflow-check.js +177 -0
  140. package/src/core/workflow-init.js +34 -0
  141. package/src/core/workflow-picker.js +154 -0
  142. package/src/core/workflow-policy.js +119 -0
  143. package/src/core/workflow-suggest.js +181 -0
  144. package/src/core/workflow-verify.js +88 -0
  145. package/src/core/workflow.js +433 -0
  146. package/src/core/worktree.js +241 -0
  147. package/src/knowledge/categories.js +107 -0
  148. package/src/knowledge/classify.js +125 -0
  149. package/src/knowledge/deposit.js +414 -0
  150. package/src/knowledge/migrate.js +149 -0
  151. package/src/knowledge/mr.js +219 -0
  152. package/src/knowledge/query.js +131 -0
  153. package/src/knowledge/registry.js +151 -0
  154. package/src/knowledge/sync.js +179 -0
  155. package/src/providers/base.js +74 -0
  156. package/src/providers/drivers/api-yapi.js +78 -0
  157. package/src/providers/drivers/ci-jenkins.js +109 -0
  158. package/src/providers/drivers/intake-confluence.js +544 -0
  159. package/src/providers/drivers/kb-git.js +549 -0
  160. package/src/providers/drivers/kb-weknora.js +472 -0
  161. package/src/providers/drivers/notify-smtp.js +515 -0
  162. package/src/providers/drivers/observability-oss.js +43 -0
  163. package/src/providers/drivers/observability-sls.js +50 -0
  164. package/src/providers/lifecycle.js +135 -0
  165. package/src/providers/loader.js +132 -0
  166. package/src/providers/local.js +190 -0
  167. package/src/providers/userconfig.js +283 -0
  168. package/src/reports/aggregate.js +185 -0
  169. package/src/reports/coverage.js +163 -0
  170. package/src/reports/detect.js +143 -0
  171. package/src/reports/parse.js +236 -0
  172. package/src/templates/files/ci/github.yml +38 -0
  173. package/src/templates/files/ci/gitlab.yml +27 -0
  174. package/src/templates/files/design.md +63 -0
  175. package/src/templates/files/ide/devflow-workflow.md +58 -0
  176. package/src/templates/files/ide/project-overview-reference.md +1 -0
  177. package/src/templates/files/ide/project-overview.md +27 -0
  178. package/src/templates/files/knowledge-index.json +17 -0
  179. package/src/templates/files/knowledge.md +28 -0
  180. package/src/templates/files/meta.json +8 -0
  181. package/src/templates/files/plan.md +38 -0
  182. package/src/templates/files/proposal.md +33 -0
  183. package/src/templates/files/reports/contract-test.md +40 -0
  184. package/src/templates/files/reports/e2e-test.md +30 -0
  185. package/src/templates/files/reports/integration-test.md +36 -0
  186. package/src/templates/files/reports/joint-test.md +58 -0
  187. package/src/templates/files/reports/perf.md +24 -0
  188. package/src/templates/files/reports/regression.md +20 -0
  189. package/src/templates/files/reports/remote-test.md +55 -0
  190. package/src/templates/files/reports/self-test.md +43 -0
  191. package/src/templates/files/reports/smoke-test.md +22 -0
  192. package/src/templates/files/reports/unit-test.md +36 -0
  193. package/src/templates/files/requirement.md +51 -0
  194. package/src/templates/files/review.md +38 -0
  195. package/src/templates/files/tests.md +36 -0
  196. package/src/templates/files/verify.md +32 -0
  197. package/src/templates/index.js +21 -0
  198. package/src/utils/log.js +37 -0
@@ -0,0 +1,299 @@
1
+ # deliver / delivery-modes
2
+
3
+ 4 种 delivery mode 的详细决策树、组织规范建议、边界 case。
4
+
5
+ ---
6
+
7
+ ## 决策矩阵
8
+
9
+ | 维度 | pr | merge | keep | discard |
10
+ | --- | --- | --- | --- | --- |
11
+ | 有他人 review 需求 | ✅ | ❌ | — | — |
12
+ | 有 CI gate | ✅ | 部分 | — | — |
13
+ | 需要留 PR 讨论 | ✅ | ❌ | — | — |
14
+ | 个人项目 | 可用 | ✅ | — | — |
15
+ | 紧急 hotfix | ✅(加急 review) | ✅(事后补 review) | — | — |
16
+ | 实验 / spike(不上线) | ❌ | ❌ | ✅(临时) | ✅(终态) |
17
+ | 等上游依赖 | — | — | ✅ | — |
18
+ | 需求已取消 | — | — | — | ✅ |
19
+
20
+ ---
21
+
22
+ ## Mode: `pr`(默认,推荐 95% 场景)
23
+
24
+ ### 何时**必须**用 pr
25
+
26
+ - 团队项目且有 main 分支保护
27
+ - 组织流程要求代码 review
28
+ - 有 CI/CD 门禁(lint / test / security scan)
29
+ - 合规要求保留 discussion 记录
30
+ - L2/L3 change
31
+
32
+ ### pr 的隐含契约
33
+
34
+ - reviewer 可能要求改 → deliver 不是终点,可能回到 apply
35
+ - CI 必须绿(red CI 的 PR = 没准备好)
36
+ - 提 PR 后保持 **responsive**(24h 内回复评论),不然 PR 越拖越乱
37
+
38
+ ### 什么时候用 Draft PR
39
+
40
+ - 想让 CI / security scan 跑起来,但还不到 review 阶段
41
+ - 想让团队知道"有这件事在做",但不占 review 时间
42
+ - 多人协作的长 PR
43
+
44
+ 转 Ready for Review:`devflow deliver --mode=pr --mark-ready`(或手动按钮)。
45
+
46
+ ### target 分支的选择
47
+
48
+ | 策略 | 合到 | 适用 |
49
+ | --- | --- | --- |
50
+ | trunk-based | main | 小团队、CI 强、持续发布 |
51
+ | gitflow | develop | 版本化发布、有 QA 阶段 |
52
+ | release branch | release/x.y | 长周期 release、hotfix 回带 |
53
+ | feature branch 集成 | `feat/xxx-integration` | 超大 feature 由多 change 组成 |
54
+
55
+ deliver 默认读 `config.delivery.defaultTarget`,项目自己配。
56
+
57
+ ---
58
+
59
+ ## Mode: `merge`
60
+
61
+ ### 何时可用
62
+
63
+ - **个人项目**:自己 review 自己 commit,无意义走 PR
64
+ - **小团队 trust-based 项目**:如小组内工具仓,已有协议"L1 直接 merge"
65
+ - **hotfix 战时**:产线出事 < 5 分钟决策;事后补 review + 合规记录
66
+
67
+ ### 何时**不要**用
68
+
69
+ - 团队项目的 feature(即使自己写的)
70
+ - 涉及其他人 code owner 的文件
71
+ - 涉及公共 API / 契约(要让消费方知晓)
72
+
73
+ ### merge 模式的审计
74
+
75
+ 即便 merge 也要记:
76
+
77
+ ```json
78
+ {
79
+ "delivery": {
80
+ "mode": "merge",
81
+ "mergeSha": "abc1234",
82
+ "mergeAt": "2026-04-24T20:00:00Z",
83
+ "mergedBy": "@eng-a",
84
+ "justification": "hotfix: 支付回调重试过多导致 DB 压力上升",
85
+ "postMergeReview": "PENDING" | "COMPLETED|url"
86
+ }
87
+ }
88
+ ```
89
+
90
+ `postMergeReview` 是战时 merge 后补 review 的要求,记成 concern,archive 前要完成。
91
+
92
+ ### hotfix 战时流程建议
93
+
94
+ 1. `devflow new <slug> --level=L1 --hotfix`(简化流程)
95
+ 2. 快速 apply + verify(smoke + 核心 regression)
96
+ 3. `devflow deliver --mode=merge --justification="..."`
97
+ 4. 上线验证
98
+ 5. 24 小时内补:code review(发给团队 diff)+ retro 记录
99
+
100
+ ---
101
+
102
+ ## Mode: `keep`
103
+
104
+ ### 何时用
105
+
106
+ - **等上游 PR 合并**:依赖别人的 change,等合了再跟
107
+ - **等 PM 最终确认**:需求还在谈,先把 design 和初步代码准备好
108
+ - **等测试环境资源**:压测排期未到
109
+ - **长假前收尾**:deliver 前发现小问题,但不想急着改
110
+
111
+ ### keep 的超时
112
+
113
+ 默认 14 天:
114
+
115
+ - 7 天发 notify("该 slug 搁置已 7 天")
116
+ - 14 天提示 "继续 / discard"
117
+ - > 30 天:orchestrator 强提示清理
118
+
119
+ ### keep → pr 恢复
120
+
121
+ ```bash
122
+ devflow deliver --mode=pr # 接着走 pr,不重跑 verify(除非变了)
123
+ ```
124
+
125
+ 如果在 keep 期间代码有变(合并了 main → feature),**重跑 verify 再 deliver**:
126
+
127
+ ```bash
128
+ devflow verify # 重跑
129
+ devflow deliver --mode=pr
130
+ ```
131
+
132
+ state 会自动检测:`state.verify.ts` 早于最后一次 commit → 提示重跑。
133
+
134
+ ### keep 期间的行为
135
+
136
+ - 不接受新代码改动(应回 apply 开新 iteration)
137
+ - 可以接受 doc 微调(design 里加个注释、plan 里修 typo)
138
+ - 不能 archive(要 deliver 完才能)
139
+
140
+ ---
141
+
142
+ ## Mode: `discard`
143
+
144
+ ### 何时用
145
+
146
+ - 需求被明确取消
147
+ - 方案错误,另起炉灶更好(开新 slug,不改旧 slug)
148
+ - spike 完成,结论是"不做"(保留 knowledge 即可)
149
+ - 长期 keep 但上游条件不会到位
150
+
151
+ ### 不要用的场景
152
+
153
+ - 只是"暂时不做"(用 keep)
154
+ - 想删本地调整重来(用 git reset,不是 discard)
155
+ - 想保留 design 学习(用 `--keep-archive`,默认就是)
156
+
157
+ ### discard 的实际动作
158
+
159
+ 默认(推荐):
160
+
161
+ ```
162
+ devflow/changes/<slug>/ → devflow/archive/discarded/<slug>-<date>/
163
+ + DISCARD.md:
164
+ - reason
165
+ - discarded by
166
+ - timestamp
167
+ - final state summary
168
+ 本地分支 devflow/<slug>/* → 保留(默认)
169
+ worktree → 清
170
+ ```
171
+
172
+ `--purge`(危险):
173
+
174
+ ```
175
+ devflow/changes/<slug>/ → rm -rf
176
+ 本地分支 → git branch -D
177
+ worktree → 清
178
+ ```
179
+
180
+ ### discard 的审批
181
+
182
+ discard 是**破坏性**动作,`devflow deliver --mode=discard` 强制:
183
+
184
+ 1. 二次确认(输入 slug)
185
+ 2. 若是 L2/L3,要求 `--justification` 至少 50 字
186
+ 3. 若关联了 external issue(JIRA / GitLab issue),提示同步关闭或留 comment
187
+ 4. 若有 PR 开着,提示先 close PR
188
+
189
+ ---
190
+
191
+ ## 边界 case
192
+
193
+ ### "已经 deliver 了 pr,但 reviewer 要求大改"
194
+
195
+ - reviewer 说"大改 → 重做":`devflow deliver --mode=keep` 并回 apply / tech-spec
196
+ - reviewer 说"小改":直接 apply 小改 → push 到 feature 分支 → PR 自动更新
197
+ - 根本性改变(比如换方案):建议关掉当前 PR,开新 slug
198
+
199
+ ### "已经 merge 了 pr,但生产出问题"
200
+
201
+ 不是 deliver 的问题,是 rollout 问题。按 design.md 的 rollback 方案走。
202
+
203
+ deliver 的职责到 "push 到集成轨道" 为止;rollout(灰度 / 金丝雀 / 全量)由 CI/CD 和 ops 负责,devflow-kit 通过 `delivery` 的 post-merge hook 监控并记录。
204
+
205
+ ### "deliver 了 keep,但后面想转 merge"
206
+
207
+ ```bash
208
+ devflow deliver --mode=merge
209
+ # state.delivery.mode 从 keep 变 merge
210
+ ```
211
+
212
+ ### "多 slug 并行 deliver,冲突"
213
+
214
+ orchestrator 层的问题:
215
+
216
+ - 建议串行 deliver(一个 merge 后再下一个)
217
+ - 或用 feature flag 保护(deliver 不影响实际可见行为)
218
+ - 或用 integration branch(多个 change 合到 integration 再合 main)
219
+
220
+ ### "deliver 完了,发现 spec delta 写错"
221
+
222
+ 不是 deliver 的问题,是 archive 前的问题。deliver 完后,archive 前可以修 delta,archive 会 merge。
223
+
224
+ ---
225
+
226
+ ## 项目规范建议
227
+
228
+ ### 推荐的团队约定(放 `devflow/config/delivery.md`)
229
+
230
+ ```markdown
231
+ # 交付规范
232
+
233
+ ## 默认 mode
234
+
235
+ - `pr`(任何 change 默认走 PR)
236
+ - 例外:个人 blog repo、文档 typo 修正 → merge
237
+
238
+ ## PR 要求
239
+
240
+ - 最少 1 个 reviewer(L2)/ 2 个(L3)
241
+ - CI 必须绿
242
+ - self-test 必须完整
243
+ - rollback 方案必写
244
+
245
+ ## 紧急 hotfix
246
+
247
+ - L1 紧急修复:允许 merge,但 24h 内补 post-merge review
248
+ - 记录到当前需求知识目录的 `knowledge/事故复盘/`
249
+
250
+ ## keep 超时
251
+
252
+ - 14 天提示
253
+ - 30 天强提示清理
254
+ ```
255
+
256
+ ---
257
+
258
+ ## 自动化建议
259
+
260
+ ### 针对大项目的自动化
261
+
262
+ - PR 模板:`.github/pull_request_template.md` / `.gitlab/merge_request_templates/default.md` 放 deliver 生成的骨架,防止开发偷懒
263
+ - CI 关卡:PR 触发 `devflow verify --check` 和 `devflow doctor` 确认 devflow 文档齐
264
+ - merge hook:merge 后自动跑 `devflow archive`(若无需 rollout 观察期)
265
+ - 定期报告:`devflow metrics` 跑每周报告(L1/L2/L3 分布、平均 delivery 时长、discard 率)
266
+
267
+ ### 针对小项目 / 个人
268
+
269
+ - 不强制 PR,merge / keep 频用
270
+ - 但 archive 流程保留(sp ec 沉淀价值很大)
271
+
272
+ ---
273
+
274
+ ## mode 和 phase 的关系
275
+
276
+ ```
277
+ verify.status=completed
278
+
279
+ deliver (phase=deliver)
280
+
281
+ ├─ mode=pr → phase=delivering (wait for merge)
282
+ │ → merged → phase=archive_ready → devflow archive
283
+ │ → closed without merge → phase=deliver (decide: keep/discard/retry)
284
+
285
+ ├─ mode=merge → phase=archive_ready → devflow archive
286
+
287
+ ├─ mode=keep → phase=deliver (搁置,可恢复)
288
+
289
+ └─ mode=discard → phase=archived (但 archive 类型是 discard)
290
+ ```
291
+
292
+ ---
293
+
294
+ ## 常见误用
295
+
296
+ - **每次都 pr**,明明是个人项目 → 白绕一圈 → 合理用 merge
297
+ - **每次都 merge**,团队项目没人 review → 合规风险,团队信任崩塌 → 必须走 pr
298
+ - **keep 忘了还在 keep**:1 个月后看到 `devflow status` 里有 5 个 keep 的 change → orchestrator 应定期提醒
299
+ - **discard 时 --purge 丢了有价值的 design 思考**:默认不 purge,除非真的没价值
@@ -0,0 +1,359 @@
1
+ # deliver / notify
2
+
3
+ SMTP / IM 通知模板、抄送策略、订阅机制。
4
+
5
+ ---
6
+
7
+ ## 通知的目的
8
+
9
+ **让相关方知道"事情发生了"**,不能期望他们自动发现。
10
+
11
+ 典型场景:
12
+
13
+ - PR 提出 → 通知 reviewer(code owners / 上游 PM / QA)
14
+ - PR merge → 通知 QA 进入集成测试
15
+ - PR discard → 通知 PM / stakeholder(需求状态变化)
16
+ - hotfix merge → 通知 ops / on-call
17
+
18
+ ---
19
+
20
+ ## 配置 notify provider
21
+
22
+ ### SMTP(邮件)
23
+
24
+ ```jsonc
25
+ {
26
+ "notify": {
27
+ "smtp": {
28
+ "driver": "notify-smtp",
29
+ "config": {
30
+ "host": "smtp.exmail.qq.com",
31
+ "port": 465,
32
+ "secure": true,
33
+ "auth": {
34
+ "user": "noreply@example.com",
35
+ "pass": "<from-vault-or-env>"
36
+ },
37
+ "from": "\"DevFlow Bot\" <noreply@example.com>"
38
+ }
39
+ }
40
+ }
41
+ }
42
+ ```
43
+
44
+ - 密码/凭据用 env var(`$SMTP_PASS`)或 secret manager,**不硬编码**
45
+ - `devflow doctor --scope cred` 会扫这个 config 有无明文敏感字段
46
+
47
+ ### IM(飞书 / 钉钉 / 企微)
48
+
49
+ driver 自己实现,config 里给 webhook URL。
50
+
51
+ ```jsonc
52
+ {
53
+ "notify": {
54
+ "im": {
55
+ "driver": "notify-lark",
56
+ "config": {
57
+ "webhook": "$LARK_WEBHOOK",
58
+ "atMobiles": ["13800138000"]
59
+ }
60
+ }
61
+ }
62
+ }
63
+ ```
64
+
65
+ ---
66
+
67
+ ## 触发方式
68
+
69
+ ### deliver 时
70
+
71
+ ```bash
72
+ devflow deliver --mode=pr --notify
73
+ # 默认使用 notify provider 中配置的 config.defaults.to / config.defaults.cc
74
+ # 邮件正文来自 reports/submit.md;含变更概要、库表变更、测试重点、自测汇总
75
+ # 默认只附一份汇总测试报告 reports/test-report.md
76
+ # 输出 accepted by SMTP server 只代表 SMTP 接受;localhost/sendmail/postfix 只算本机入队
77
+ ```
78
+
79
+ ```bash
80
+ devflow deliver --mode=pr --notify --to=team-a@example.com,team-b@example.com --cc=lead@example.com
81
+ # 显式指定
82
+ ```
83
+
84
+ ```bash
85
+ devflow deliver --mode=pr --notify --attach-docs --attach-reports
86
+ # 只有确实需要原始 requirement/design/plan 或各类原始测试报告时才加
87
+ ```
88
+
89
+ ```bash
90
+ devflow deliver --mode=pr --notify=test-report
91
+ # 极简模式(L0)专用:发测试结果邮件(内含 test-report.md#unit + code-review 摘要)
92
+ # state.mode=micro 时,deliver 自动追加此 flag
93
+ ```
94
+
95
+ ### hook(自动)
96
+
97
+ 配 `hooks.on_deliver`:
98
+
99
+ ```jsonc
100
+ {
101
+ "hooks": {
102
+ "on_deliver": [
103
+ { "mode": "pr", "notify": "smtp", "to": ["team@example.com"] },
104
+ { "mode": "merge", "notify": "im", "when": "level=L3" },
105
+ { "mode": "pr", "notify": "test-report", "when": "level=L0", "to": ["team@example.com"] }
106
+ ]
107
+ }
108
+ }
109
+ ```
110
+
111
+ deliver 完成后自动触发对应 notify。
112
+
113
+ ---
114
+
115
+ ## 邮件模板
116
+
117
+ ### PR created
118
+
119
+ ```text
120
+ Subject: [DevFlow] [coupon-batch-grant] 批量发放优惠券 API - PR #123 待审查
121
+
122
+ Hi <reviewer>,
123
+
124
+ PR 刚提交,辛苦帮忙 review。
125
+
126
+ 标题: [coupon-batch-grant] 批量发放优惠券 API
127
+ 级别: L2
128
+ PR 链接: https://gitlab.example.com/group/repo/-/merge_requests/123
129
+
130
+ 变更概要:
131
+ 新增批量发放 API,单批 ≤ 10000 条,支持 CSV 上传。
132
+
133
+ 范围:
134
+ - F-01 批量发放 API
135
+ - F-02 批量发放查询 API
136
+ - F-03 后台 UI 接入
137
+
138
+ 自测结果: 243/243 单测通过,self-test 12/12 AC 满足,P99 180ms (NFR 200ms)
139
+
140
+ 特别想听 feedback:
141
+ - 事务边界设计(见 ADR-003)
142
+ - batchId 使用 ULID 而非 UUID
143
+
144
+ 非常感谢!
145
+ <author>
146
+
147
+ ---
148
+ This email is automatically generated by DevFlow Kit.
149
+ ```
150
+
151
+ ### PR merged
152
+
153
+ ```text
154
+ Subject: [DevFlow] [coupon-batch-grant] 已合并 → 请 QA 跟进集成
155
+
156
+ Hi QA/on-call,
157
+
158
+ [coupon-batch-grant] 已 merge 到 main(commit abc1234),准备进入集成测试 / rollout。
159
+
160
+ Rollout 计划: design.md#rollout (feature flag 5% → 50% → 100%)
161
+ 回滚方案: design.md#rollback
162
+
163
+ PR 链接: ...
164
+ 测试报告: verify.md
165
+
166
+ 请跟进。
167
+ ---
168
+ Auto-generated
169
+ ```
170
+
171
+ ### 极简模式(L0):测试结果报告
172
+
173
+ `--notify=test-report` 触发,邮件正文从 `reports/submit.md` 汇总信息提取;其中 `库表变更` 会从 `design.md` 的 DDL / 数据层章节和根目录 `ddl.sql` 提取,列出新建表、新增字段、修改字段、删除字段。默认只附 `reports/test-report.md`。正文不要放本地 markdown 链接,也不要把 unit / integration / e2e / joint / remote / smoke / self-test 拆成多附件;测试同学需要技术方案和任务拆解时显式加 `--attach-design-plan` 只附 `design.md` / `plan.md`;需要全部原始材料时才显式加 `--attach-docs`、`--attach-reports` 或 `--attach=<path>`。
174
+
175
+ ```text
176
+ Subject: [DevFlow][L0] [fix-null-pointer] 测试报告 — 单测全通过 ✅
177
+
178
+ Hi Team,
179
+
180
+ 极简模式 change [fix-null-pointer] 已完成,测试结果如下。
181
+
182
+ ── 测试摘要 ──
183
+ 单测:243 通过 / 0 失败 / 0 跳过
184
+ 远程 API:4 通过 / 0 失败
185
+ 联调测试:2 通过 / 0 失败
186
+ 覆盖率:(如覆盖率工具可用:82%)
187
+ Code Review:通过(1 轮,0 个 MUST 问题,2 个 SHOULD 已说明)
188
+
189
+ ── 改动说明 ──
190
+ fix-null-pointer:修复 OrderService.findById 在 orderId 为 null 时抛 NPE 的问题。
191
+ 文件:src/service/OrderService.java(+3 -1 行)
192
+
193
+ ── PR/MR ──
194
+ https://gitlab.example.com/group/repo/-/merge_requests/456
195
+
196
+ 如有疑问请查看 PR 或联系作者。
197
+ ---
198
+ This email is automatically generated by DevFlow Kit (L0 micro mode).
199
+ ```
200
+
201
+ > **发送时机**:`devflow deliver --notify=test-report` 在 deliver 完成后、但在 archive 之前(L0 无 archive)触发。
202
+ > **收件人来源**:同标准策略(`--to` > `config.delivery.notify.defaultTo` > CODEOWNERS)。
203
+ > **无 provider 时**:打 WARNING,不阻塞 deliver 主流程。
204
+
205
+ ---
206
+
207
+ ### PR discarded
208
+
209
+ ```text
210
+ Subject: [DevFlow] [coupon-batch-grant] 已取消
211
+
212
+ Hi <stakeholder>,
213
+
214
+ change [coupon-batch-grant] 已 discard。
215
+
216
+ 原因: 需求已被 PM 取消(邮件 ABC123),优先级调整到 Q3。
217
+
218
+ 相关资产归档至: devflow/archive/discarded/coupon-batch-grant-20260424/
219
+
220
+ 如需重启,请新开 slug(不要复用旧目录,因为 spec 基线可能已漂移)。
221
+ ---
222
+ Auto-generated
223
+ ```
224
+
225
+ ---
226
+
227
+ ## IM 模板(简短)
228
+
229
+ 飞书 / 钉钉消息一般短、图文。模板:
230
+
231
+ ```text
232
+ 🔔 [DevFlow] coupon-batch-grant - PR 待审查
233
+
234
+ @reviewer_a @reviewer_b 辛苦 review
235
+
236
+ 📝 批量发放优惠券 API (L2)
237
+ 🔗 https://gitlab.example.com/.../merge_requests/123
238
+ ✅ 自测 12/12 pass | P99 180ms
239
+ 📊 单测 243/243 | 覆盖 86%
240
+
241
+ focus 点: 事务拆三段的设计(ADR-003)
242
+ ```
243
+
244
+ Markdown 支持的 IM(飞书富文本 / 钉钉 markdown):
245
+
246
+ ```markdown
247
+ **[coupon-batch-grant] 批量发放优惠券 - PR #123**
248
+
249
+ - 级别: L2
250
+ - 自测: ✅ 12/12 AC
251
+ - P99: 180ms (NFR 200ms)
252
+ - [PR 链接](...)
253
+
254
+ 请 @reviewer_a @reviewer_b 审查。
255
+ ```
256
+
257
+ ---
258
+
259
+ ## 抄送 / 收件人策略
260
+
261
+ ### 收件人来源优先级
262
+
263
+ 1. `--to=<emails>`(命令行显式)
264
+ 2. `--notify-to=<emails>`(命令行显式)
265
+ 3. `notify.smtp` provider 的 `config.defaults.to`
266
+ 4. `notify.smtp` provider 的历史兼容字段 `config.defaultTo`
267
+
268
+ 抄送同理:`--cc` / `--notify-cc` 优先,未传时读取 `config.defaults.cc` / `config.defaultCc`。
269
+
270
+ `devflow provider setup` 配置 `notify.smtp` 时会询问 `defaults.to` 和 `defaults.cc`,多个邮箱用逗号分隔。发送前必须展示 To / Cc 预览并让用户确认。
271
+
272
+ ### 抄送策略
273
+
274
+ | 场景 | to | cc |
275
+ | --- | --- | --- |
276
+ | PR 待审查 | reviewer | code owner + PM |
277
+ | PR merged | QA + on-call | 全团队 mailing list |
278
+ | PR discard | stakeholder | 团队 lead |
279
+ | hotfix merge | ops + on-call + 团队 lead | 管理层(若 P0) |
280
+
281
+ ### 订阅机制
282
+
283
+ 团队成员可以个性化订阅:
284
+
285
+ ```jsonc
286
+ {
287
+ "notify": {
288
+ "subscriptions": {
289
+ "@alice": {
290
+ "events": ["pr-created", "pr-merged"],
291
+ "slugs": ["coupon-*", "order-*"],
292
+ "channel": "smtp"
293
+ },
294
+ "@bob": {
295
+ "events": ["pr-discard"],
296
+ "slugs": ["*"],
297
+ "channel": "im"
298
+ }
299
+ }
300
+ }
301
+ }
302
+ ```
303
+
304
+ `devflow deliver --notify` 会 merge 手动 to + 订阅匹配结果。
305
+
306
+ ---
307
+
308
+ ## 防骚扰
309
+
310
+ - **单 change 去重**:同一 slug 同一事件(如 pr-created)在 24h 内只发一次,重复 deliver(比如 keep 后重新开)不重发
311
+ - **静音时段**:非工作时间只发 P0 / hotfix,普通 change 次日早发
312
+ - **订阅太宽的警告**:`devflow doctor` 会提示"有用户订阅了 100% 的 event,可能造成骚扰"
313
+ - **一键退订**:邮件 footer 加退订链接(或指引到 `devflow notify unsubscribe <event>`)
314
+
315
+ ---
316
+
317
+ ## 敏感信息保护
318
+
319
+ notify 内容会被外发,必须过滤:
320
+
321
+ 1. 不含 token / secret
322
+ 2. 不含 PII(用户手机 / 邮箱等不露全;露一部分替代)
323
+ 3. 不含内部 URL(除非收件人是团队内部)
324
+
325
+ `devflow deliver --notify` 发送前扫描内容,命中敏感模式:
326
+
327
+ - **token 模式**:拒绝发送
328
+ - **URL 模式**:如果内含 `.internal` / `.local` 域名,确认收件人 domain 匹配
329
+ - **PII 模式**:警告(可继续)
330
+
331
+ ---
332
+
333
+ ## 错误处理
334
+
335
+ notify 发送失败:
336
+
337
+ - 不阻塞 deliver 主流程(PR 已经提了)
338
+ - state.delivery.notify 记 `status: failed`,`error: ...`
339
+ - 可 `devflow deliver --notify --retry` 重发
340
+ - 超过 3 次失败,`devflow doctor` 报 concern,可能是 provider 配置 / 凭据问题
341
+
342
+ ---
343
+
344
+ ## 不要用 notify 做的事
345
+
346
+ - **当 chat**:notify 是单向广播,不要指望回复(reply 到 noreply@ 会 bounce)
347
+ - **当进度条**:每 5 分钟发一次"还在 build 中" → 退订高发
348
+ - **当 code review**:review 是 PR 里的 thread,不是邮件来回
349
+ - **发 PR diff 全文**:IM 容量有限,邮件也不友好;用 PR 链接
350
+
351
+ ---
352
+
353
+ ## 本地测试
354
+
355
+ ```bash
356
+ devflow provider test notify.smtp --to=me@example.com --subject="test" --body="test body"
357
+ ```
358
+
359
+ 发一封测试邮件,验证 SMTP 配置对。IM 同理。