cc-devflow 4.5.8 → 4.5.10

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 (149) hide show
  1. package/.claude/skills/cc-act/CHANGELOG.md +33 -0
  2. package/.claude/skills/cc-act/PLAYBOOK.md +9 -4
  3. package/.claude/skills/cc-act/SKILL.md +73 -12
  4. package/.claude/skills/cc-act/assets/PROJECT_POSTMORTEM_INDEX_TEMPLATE.md +30 -0
  5. package/.claude/skills/cc-act/assets/PROJECT_POSTMORTEM_PRINCIPLES_TEMPLATE.md +29 -0
  6. package/.claude/skills/cc-act/assets/PROJECT_POSTMORTEM_TEMPLATE.md +103 -0
  7. package/.claude/skills/cc-act/assets/PR_BRIEF_TEMPLATE.md +61 -5
  8. package/.claude/skills/cc-act/references/closure-contract.md +4 -1
  9. package/.claude/skills/cc-act/references/git-commit-guidelines.md +342 -37
  10. package/.claude/skills/cc-act/scripts/cc-act-common.sh +29 -1
  11. package/.claude/skills/cc-act/scripts/render-pr-brief.sh +164 -0
  12. package/.claude/skills/cc-act/scripts/sync-act-docs.sh +1 -1
  13. package/.claude/skills/cc-check/CHANGELOG.md +17 -0
  14. package/.claude/skills/cc-check/PLAYBOOK.md +1 -0
  15. package/.claude/skills/cc-check/SKILL.md +9 -5
  16. package/.claude/skills/cc-check/references/review-contract.md +7 -0
  17. package/.claude/skills/cc-check/scripts/render-report-card.js +6 -1
  18. package/.claude/skills/cc-dev/CHANGELOG.md +5 -0
  19. package/.claude/skills/cc-dev/SKILL.md +26 -1
  20. package/.claude/skills/cc-do/CHANGELOG.md +23 -0
  21. package/.claude/skills/cc-do/PLAYBOOK.md +7 -7
  22. package/.claude/skills/cc-do/SKILL.md +49 -45
  23. package/.claude/skills/cc-do/references/execution-recovery.md +18 -13
  24. package/.claude/skills/cc-do/scripts/build-task-context.sh +13 -22
  25. package/.claude/skills/cc-do/scripts/mark-task-complete.sh +0 -6
  26. package/.claude/skills/cc-do/scripts/record-review-decision.sh +4 -5
  27. package/.claude/skills/cc-do/scripts/recover-workflow.sh +9 -11
  28. package/.claude/skills/cc-do/scripts/verify-task-gates.sh +12 -10
  29. package/.claude/skills/cc-do/scripts/write-task-checkpoint.sh +7 -29
  30. package/.claude/skills/cc-investigate/CHANGELOG.md +34 -0
  31. package/.claude/skills/cc-investigate/PLAYBOOK.md +21 -5
  32. package/.claude/skills/cc-investigate/SKILL.md +97 -40
  33. package/.claude/skills/cc-investigate/assets/TASKS_TEMPLATE.md +66 -4
  34. package/.claude/skills/cc-investigate/assets/TASK_MANIFEST_TEMPLATE.json +30 -59
  35. package/.claude/skills/cc-investigate/assets/{ANALYSIS_TEMPLATE.md → legacy/ANALYSIS_TEMPLATE.md} +48 -0
  36. package/.claude/skills/cc-investigate/references/investigation-contract.md +16 -2
  37. package/.claude/skills/cc-investigate/scripts/bootstrap-analysis.sh +1 -1
  38. package/.claude/skills/cc-next/CHANGELOG.md +6 -0
  39. package/.claude/skills/cc-next/PLAYBOOK.md +26 -4
  40. package/.claude/skills/cc-next/SKILL.md +39 -4
  41. package/.claude/skills/cc-plan/CHANGELOG.md +38 -0
  42. package/.claude/skills/cc-plan/PLAYBOOK.md +60 -53
  43. package/.claude/skills/cc-plan/SKILL.md +164 -87
  44. package/.claude/skills/cc-plan/assets/TASKS_TEMPLATE.md +101 -9
  45. package/.claude/skills/cc-plan/assets/TASK_MANIFEST_TEMPLATE.json +58 -229
  46. package/.claude/skills/cc-plan/assets/{DESIGN_TEMPLATE.md → legacy/DESIGN_TEMPLATE.md} +68 -0
  47. package/.claude/skills/cc-plan/assets/{TINY_DESIGN_TEMPLATE.md → legacy/TINY_DESIGN_TEMPLATE.md} +47 -1
  48. package/.claude/skills/cc-plan/references/planning-contract.md +48 -33
  49. package/.claude/skills/cc-review/CHANGELOG.md +6 -0
  50. package/.claude/skills/cc-review/PLAYBOOK.md +9 -11
  51. package/.claude/skills/cc-review/SKILL.md +37 -61
  52. package/.claude/skills/cc-review/references/e2e-and-plugin-verification.md +1 -1
  53. package/.claude/skills/cc-review/references/implementation-review-branch.md +5 -5
  54. package/.claude/skills/cc-review/references/plan-review-branch.md +1 -1
  55. package/.claude/skills/cc-review/references/review-methods.md +4 -4
  56. package/.claude/skills/cc-review/scripts/collect-review-context.sh +14 -7
  57. package/.claude/skills/cc-roadmap/CHANGELOG.md +6 -0
  58. package/.claude/skills/cc-roadmap/PLAYBOOK.md +30 -0
  59. package/.claude/skills/cc-roadmap/SKILL.md +45 -8
  60. package/.claude/skills/cc-roadmap/assets/BACKLOG_TEMPLATE.md +8 -0
  61. package/.claude/skills/cc-roadmap/assets/ROADMAP_TEMPLATE.md +22 -0
  62. package/.claude/skills/cc-roadmap/assets/TRACKING_TEMPLATE.json +32 -1
  63. package/.claude/skills/cc-roadmap/references/roadmap-dialogue.md +14 -14
  64. package/CHANGELOG.md +28 -0
  65. package/CONTRIBUTING.md +40 -4
  66. package/CONTRIBUTING.zh-CN.md +40 -4
  67. package/README.md +57 -43
  68. package/README.zh-CN.md +57 -43
  69. package/bin/cc-devflow-cli.js +293 -36
  70. package/docs/examples/START-HERE.md +5 -4
  71. package/docs/examples/example-bindings.json +10 -10
  72. package/docs/examples/full-design-blocked/BACKLOG.md +1 -1
  73. package/docs/examples/full-design-blocked/README.md +2 -2
  74. package/docs/examples/full-design-blocked/ROADMAP.md +1 -1
  75. package/docs/examples/full-design-blocked/changes/REQ-002-bulk-invite-import/planning/design.md +2 -1
  76. package/docs/examples/full-design-blocked/changes/REQ-002-bulk-invite-import/planning/task-manifest.json +29 -312
  77. package/docs/examples/full-design-blocked/changes/REQ-002-bulk-invite-import/planning/tasks.md +11 -8
  78. package/docs/examples/full-design-blocked/changes/REQ-002-bulk-invite-import/review/report-card.json +4 -4
  79. package/docs/examples/full-design-blocked/roadmap.json +1 -1
  80. package/docs/examples/local-handoff/BACKLOG.md +1 -1
  81. package/docs/examples/local-handoff/README.md +2 -2
  82. package/docs/examples/local-handoff/ROADMAP.md +1 -1
  83. package/docs/examples/local-handoff/changes/REQ-003-audit-log-export/planning/design.md +2 -1
  84. package/docs/examples/local-handoff/changes/REQ-003-audit-log-export/planning/task-manifest.json +27 -210
  85. package/docs/examples/local-handoff/changes/REQ-003-audit-log-export/planning/tasks.md +9 -6
  86. package/docs/examples/local-handoff/changes/REQ-003-audit-log-export/review/report-card.json +1 -1
  87. package/docs/examples/local-handoff/roadmap.json +1 -1
  88. package/docs/examples/pdca-loop/BACKLOG.md +1 -1
  89. package/docs/examples/pdca-loop/README.md +2 -2
  90. package/docs/examples/pdca-loop/ROADMAP.md +1 -1
  91. package/docs/examples/pdca-loop/changes/REQ-001-copy-invite-link/handoff/pr-brief.md +65 -1
  92. package/docs/examples/pdca-loop/changes/REQ-001-copy-invite-link/planning/design.md +2 -1
  93. package/docs/examples/pdca-loop/changes/REQ-001-copy-invite-link/planning/task-manifest.json +26 -228
  94. package/docs/examples/pdca-loop/changes/REQ-001-copy-invite-link/planning/tasks.md +9 -6
  95. package/docs/examples/pdca-loop/changes/REQ-001-copy-invite-link/review/report-card.json +1 -1
  96. package/docs/examples/pdca-loop/roadmap.json +1 -1
  97. package/docs/examples/scripts/check-example-bindings.sh +11 -5
  98. package/docs/get-shit-done-strategy-audit.md +22 -22
  99. package/docs/guides/artifact-contract.md +44 -0
  100. package/docs/guides/getting-started.md +10 -8
  101. package/docs/guides/getting-started.zh-CN.md +10 -8
  102. package/docs/guides/minimize-artifacts.md +123 -0
  103. package/docs/guides/project-postmortem.md +78 -0
  104. package/lib/compiler/__tests__/skills-registry.test.js +2 -2
  105. package/lib/skill-runtime/CLAUDE.md +1 -1
  106. package/lib/skill-runtime/__tests__/autopilot.test.js +42 -6
  107. package/lib/skill-runtime/__tests__/benchmark-artifacts.test.js +165 -0
  108. package/lib/skill-runtime/__tests__/cli-bootstrap.integration.test.js +2 -2
  109. package/lib/skill-runtime/__tests__/dispatch.test.js +8 -38
  110. package/lib/skill-runtime/__tests__/intent.test.js +4 -20
  111. package/lib/skill-runtime/__tests__/lifecycle.test.js +1 -1
  112. package/lib/skill-runtime/__tests__/paths.test.js +7 -1
  113. package/lib/skill-runtime/__tests__/planner.tdd.test.js +63 -2
  114. package/lib/skill-runtime/__tests__/prepare-pr.test.js +3 -16
  115. package/lib/skill-runtime/__tests__/query.test.js +388 -7
  116. package/lib/skill-runtime/__tests__/review-check-integration.test.js +148 -0
  117. package/lib/skill-runtime/__tests__/review-records.test.js +619 -0
  118. package/lib/skill-runtime/__tests__/runtime.integration.test.js +64 -23
  119. package/lib/skill-runtime/__tests__/schemas.test.js +76 -2
  120. package/lib/skill-runtime/__tests__/task-contract-migrate.test.js +137 -0
  121. package/lib/skill-runtime/__tests__/task-contract.test.js +783 -0
  122. package/lib/skill-runtime/__tests__/verify-artifacts.test.js +203 -0
  123. package/lib/skill-runtime/__tests__/worker-run.test.js +4 -11
  124. package/lib/skill-runtime/__tests__/workflow-context-legacy-fallback.test.js +31 -0
  125. package/lib/skill-runtime/__tests__/workflow-context.test.js +98 -0
  126. package/lib/skill-runtime/artifacts.js +0 -5
  127. package/lib/skill-runtime/context-index.js +545 -0
  128. package/lib/skill-runtime/intent.js +9 -33
  129. package/lib/skill-runtime/lifecycle.js +1 -1
  130. package/lib/skill-runtime/operations/CLAUDE.md +2 -2
  131. package/lib/skill-runtime/operations/dispatch.js +4 -42
  132. package/lib/skill-runtime/operations/init.js +2 -6
  133. package/lib/skill-runtime/operations/janitor.js +2 -18
  134. package/lib/skill-runtime/operations/resume.js +21 -38
  135. package/lib/skill-runtime/operations/review-records.js +265 -0
  136. package/lib/skill-runtime/operations/snapshot.js +1 -1
  137. package/lib/skill-runtime/operations/task-contract.js +524 -0
  138. package/lib/skill-runtime/operations/worker-run.js +2 -30
  139. package/lib/skill-runtime/paths.js +4 -4
  140. package/lib/skill-runtime/planner.js +25 -13
  141. package/lib/skill-runtime/query-registry.js +2 -2
  142. package/lib/skill-runtime/query.js +16 -3
  143. package/lib/skill-runtime/review-records.js +123 -0
  144. package/lib/skill-runtime/review.js +246 -11
  145. package/lib/skill-runtime/schemas.js +179 -15
  146. package/lib/skill-runtime/store.js +0 -10
  147. package/lib/skill-runtime/task-contract.js +187 -0
  148. package/lib/skill-runtime/workflow-context.js +748 -0
  149. package/package.json +7 -4
@@ -2,15 +2,80 @@
2
2
 
3
3
  ## Purpose
4
4
 
5
- `cc-act` 在执行 `create-pr` / `update-pr` 时,必须让提交历史满足 3 个目标:
5
+ `cc-act` 在执行 `create-pr` / `update-pr` 时,必须让 Git 历史成为可 review、可 bisect、可 revert、可交接的工程记录,而不是一句含糊的摘要。
6
6
 
7
- 1. 提交信息清楚、可追溯
8
- 2. 提交边界干净、不要把不同类型变更揉成一团
9
- 3. 分支历史尽量线性,便于 review 和回滚
7
+ 提交记录要同时满足 5 个目标:
10
8
 
11
- ## Commit Message Format
9
+ 1. `git log --oneline` 能看懂变更类型和范围。
10
+ 2. `git show` 能解释问题、取舍、验证和风险。
11
+ 3. 每个 commit 边界足够小,后续可以独立 review、cherry-pick 或 revert。
12
+ 4. PR body、release note、handoff 和 commit history 讲同一套事实。
13
+ 5. 后续维护者不需要聊天记录,也能知道为什么这么改。
14
+
15
+ ## Research Baseline
16
+
17
+ 本规范吸收当前公开实践,但落成 `cc-devflow` 自己的提交合同:
18
+
19
+ - Git 官方 `git commit` 文档建议首行少于 50 字符,空一行后写更完整描述;Git 会把首个空行前内容当成 title。
20
+ - Git 官方 `SubmittingPatches` 强调提交说明和代码同样重要,要解释 future maintainer 需要知道的 `why`,并使用祈使句。
21
+ - Conventional Commits 1.0.0 给出机器可读标题、body、footer 结构,`feat` / `fix` / `BREAKING CHANGE` 可驱动 changelog 和 semver。
22
+ - Git trailer 规范支持结构化 footer,例如 `Reviewed-by`、`Signed-off-by`、`Refs`。
23
+ - GitHub 支持在 commit message 或 PR 描述里用 closing keywords 关联和关闭 issue。
24
+ - 近期提交信息研究提示:只有 Conventional Commit 标题还不够,很多提交仍然信息量不足;所以本规范要求正文模板,而不是只要求 `type(scope): subject`。
12
25
 
13
- 默认使用 Conventional Commits:
26
+ ## Commit Record Contract
27
+
28
+ 默认使用 Conventional Commits 标题,但非平凡提交必须带正文。
29
+
30
+ `type(scope)` 保持 ASCII 和机器可读;`subject`、正文标题、正文内容默认使用项目 `Output language`。中文项目输出中文 commit 文本,不能照抄英文模板。
31
+
32
+ ```text
33
+ <type>(<scope>): <中文 subject>
34
+
35
+ 问题:
36
+ - <哪里坏了、缺了、风险在哪里、读者为什么要关心>
37
+
38
+ 变更:
39
+ - <持久实现、模板、脚本、产物或契约变化>
40
+ - <关键边界、数据形状、工作流决策>
41
+
42
+ 原因:
43
+ - <为什么当前方案是正确取舍>
44
+ - <为什么没有选择更窄、更宽或其它替代方案>
45
+
46
+ 验证:
47
+ - <命令、产物、review gate,或明确 not-run 原因>
48
+
49
+ 风险:
50
+ - <影响范围、迁移问题、回滚路径,或“低:仅文档/模板”>
51
+
52
+ 关联:
53
+ - <REQ/FIX/RM/issue/PR/spec/review artifact,适用时填写>
54
+
55
+ <footer trailers when applicable>
56
+ ```
57
+
58
+ 正文不是复述 diff。正文解释 diff 看不出来的上下文:为什么改、边界在哪里、怎么证明、哪里可能坏。
59
+
60
+ ## When Body Is Required
61
+
62
+ 只允许非常小的机械变更使用单行 commit。满足任一条件时必须写 body:
63
+
64
+ 1. 修改超过 1 个文件。
65
+ 2. 改变用户可见行为、公共 API、CLI、schema、prompt、skill contract、验证脚本或发布流程。
66
+ 3. 修 bug、回归、flaky、性能、安全、权限、数据一致性或 trust boundary。
67
+ 4. 引入或改变测试策略、mock 边界、fixture、golden artifact。
68
+ 5. 触碰 roadmap / planning / task manifest / report-card / handoff 等 durable artifact。
69
+ 6. 有兼容性、迁移、回滚、release note 或 follow-up 风险。
70
+
71
+ 单行 commit 仅适合:
72
+
73
+ - typo / spelling
74
+ - 纯格式化且无行为变化
75
+ - 单文件注释澄清
76
+ - 生成物版本号同步,且 changelog 或 PR body 已解释原因
77
+
78
+ ## Commit Message Format
14
79
 
15
80
  ```text
16
81
  <type>(<scope>): <subject>
@@ -20,64 +85,304 @@
20
85
  <footer>
21
86
  ```
22
87
 
23
- 如果当前仓库已有更严格的提交规范,以仓库规范为准;否则沿用这里的格式。
88
+ 规则:
89
+
90
+ 1. `type` 必须表达变更性质。
91
+ 2. `scope` 必须是 repo 里真实模块、skill、capability、script、doc area 或 package 名;不要写 `misc` / `stuff`。
92
+ 3. `subject` 使用项目输出语言;中文项目写中文短句,`type(scope)` 仍保持 Conventional Commits ASCII 前缀。
93
+ 4. `subject` 目标 50 字符以内;超过时先缩 scope 或拆 commit。
94
+ 5. `body` 使用上面的中文结构化标题;非平凡提交不要只写一段泛泛说明。
95
+ 6. `footer` 使用 Git trailer 风格:`Token: value`,每个 trailer 独立一行。
96
+ 7. 如果当前仓库已有更严格规范,以仓库规范为准;但不能低于本文件的信息量要求。
24
97
 
25
98
  ## Allowed Types
26
99
 
27
- - `feat`: 新功能
28
- - `fix`: 修复缺陷
29
- - `docs`: 文档更新
100
+ - `feat`: 新功能或新增可观察能力
101
+ - `fix`: 修复缺陷、回归或错误行为
102
+ - `docs`: 文档、指南、示例文字
30
103
  - `style`: 纯格式调整,不改行为
31
104
  - `refactor`: 重构,不改外部行为
32
105
  - `perf`: 性能优化
33
- - `test`: 测试变更
34
- - `chore`: 构建、脚本、依赖、工具链
106
+ - `test`: 测试、fixture、golden artifact、验证 seam
107
+ - `build`: 构建系统、打包、发布配置
108
+ - `ci`: CI / workflow / automation
109
+ - `chore`: 依赖、脚本、仓库维护、生成物同步
110
+ - `revert`: 回滚既有 commit
111
+
112
+ ## Body Templates By Type
113
+
114
+ ### `feat`
115
+
116
+ ```text
117
+ 问题:
118
+ - <谁以前无法完成什么>
119
+
120
+ 变更:
121
+ - <新增能力>
122
+ - <公共接口、产物、命令或用户可见流程>
123
+
124
+ 原因:
125
+ - <为什么这个范围是当前正确切片>
126
+ - <哪些内容明确不在本次范围内>
127
+
128
+ 验证:
129
+ - <命令或人工证明>
130
+
131
+ 风险:
132
+ - <兼容性、发布、迁移、回滚>
133
+
134
+ 关联:
135
+ - <REQ/RM/spec/issue>
136
+ ```
137
+
138
+ ### `fix`
139
+
140
+ ```text
141
+ 问题:
142
+ - <报告的现象和影响>
143
+
144
+ 根因:
145
+ - <first bad state 或被破坏的契约>
146
+
147
+ 变更:
148
+ - <最小修复>
149
+ - <为什么这不是只补症状>
150
+
151
+ 验证:
152
+ - <可用时写 failing-before / passing-after 证据>
153
+ - <回归命令>
154
+
155
+ 风险:
156
+ - <影响范围和回滚路径>
157
+
158
+ 关联:
159
+ - <FIX/issue/analysis/report-card>
160
+ ```
161
+
162
+ ### `refactor`
163
+
164
+ ```text
165
+ 问题:
166
+ - <坏味道、耦合、重复或维护风险>
167
+
168
+ 不变量:
169
+ - <必须保持不变的行为>
170
+
171
+ 变更:
172
+ - <移动、重命名、抽取或收敛的结构>
173
+
174
+ 原因:
175
+ - <为什么这会简化系统>
176
+ - <为什么兼容性被保留或为何要改变>
177
+
178
+ 验证:
179
+ - <测试、类型检查、diff check>
180
+
181
+ 风险:
182
+ - <触碰的调用方和回滚路径>
183
+ ```
184
+
185
+ ### `test`
35
186
 
36
- ## Message Rules
187
+ ```text
188
+ 问题:
189
+ - <以前没有覆盖的行为或回归>
190
+
191
+ 变更:
192
+ - <新增的测试 seam、fixture 或断言>
193
+
194
+ 原因:
195
+ - <为什么这个 seam 能触达真实触发链>
196
+ - <为什么更浅的覆盖会制造假安全>
197
+
198
+ 验证:
199
+ - <测试命令和预期信号>
200
+
201
+ 风险:
202
+ - <flaky 风险、fixture 维护成本、运行耗时>
203
+ ```
204
+
205
+ ### `docs`
206
+
207
+ ```text
208
+ 问题:
209
+ - <读者困惑、契约过期、缺 runbook 或文档漂移>
210
+
211
+ 变更:
212
+ - <更新的章节或示例>
213
+
214
+ 原因:
215
+ - <使用的真相源>
216
+ - <未来读者不再需要追问什么>
217
+
218
+ 验证:
219
+ - <链接检查、示例检查、渲染检查,或 not-run 原因>
220
+
221
+ 风险:
222
+ - <低,或文档继续漂移的风险>
223
+ ```
224
+
225
+ ### `build` / `ci` / `chore`
226
+
227
+ ```text
228
+ 问题:
229
+ - <工具链、依赖、发布或自动化缺口>
230
+
231
+ 变更:
232
+ - <配置、脚本、package、lockfile、生成物>
233
+
234
+ 原因:
235
+ - <为什么现在需要这个工具链变更>
236
+
237
+ 验证:
238
+ - <真实工具入口或最接近的 smoke>
239
+
240
+ 风险:
241
+ - <环境、版本、发布、回滚>
242
+ ```
243
+
244
+ ### `revert`
245
+
246
+ ```text
247
+ 问题:
248
+ - <为什么被回滚的 commit 不安全或错误>
249
+
250
+ 变更:
251
+ - 回滚 <sha> (<subject>)。
252
+
253
+ 原因:
254
+ - <为什么现在回滚优于向前修复>
37
255
 
38
- 1. `subject` 保持简短,优先控制在 50 个字符内。
39
- 2. `subject` 使用祈使句,首字母小写,末尾不加句号。
40
- 3. `body` 只解释 `why` 和关键 `how`,不要把 diff 逐行复述。
41
- 4. `footer` 只在需要时使用,例如 `BREAKING CHANGE:` 或 `Closes #123`。
42
- 5. PR 标题应与最终交付的核心 commit 语义一致,不要标题和提交说两套话。
256
+ 验证:
257
+ - <回滚后的命令或证据>
258
+
259
+ 风险:
260
+ - <丢失的行为、follow-up、回滚本次回滚的路径>
261
+ ```
43
262
 
44
263
  ## Commit Boundary Rules
45
264
 
46
- `cc-act` 生成 commit 时,优先消除“一个 commit 混很多事”这种坏味道。
265
+ `cc-act` 生成 commit 前必须先写 commit plan。不要先 `git add .` 再想 message。
266
+
267
+ Commit plan 模板:
268
+
269
+ ```text
270
+ Commit 1:
271
+ - 类型/scope:
272
+ - 文件:
273
+ - 分组原因:
274
+ - 验证:
275
+ - Commit 文本草稿:
276
+
277
+ Commit 2:
278
+ - 类型/scope:
279
+ - 文件:
280
+ - 分组原因:
281
+ - 验证:
282
+ - Commit 文本草稿:
283
+ ```
284
+
285
+ 拆分规则:
47
286
 
48
287
  1. 功能、测试、文档、配置属于不同类型时,拆成多个 commit。
49
288
  2. 多个模块彼此独立时,按模块拆分 commit。
50
- 3. bug 与补防御性代码不是同一件事,能拆就拆。
51
- 4. 只有当改动天然不可分割时,才允许合并到同一个 commit。
52
- 5. 禁止为了省事直接 `git add .` 把无关变更一起提交。
289
+ 3. 数据模型、服务层、API、UI 横跨多层时,优先按层拆分,除非某层单独无法通过验证。
290
+ 4. bug 与补防御性 guard / follow-up 不是同一件事,能拆就拆。
291
+ 5. 生成物和源文件一起提交,必须在 body 里说明生成关系和验证命令。
292
+ 6. 一个 commit 如果预期触碰超过 8 个文件,先问自己是否混了多个语义;不能拆时在 body 的 `Risk` 里说明原因。
293
+ 7. 每个 commit 尽量独立可验证。不能独立跑全量测试时,至少给出最贴近该 commit 的验证。
53
294
 
54
295
  推荐拆分顺序:
55
296
 
56
- - 核心实现
57
- - 测试
58
- - 文档
59
- - 配置或工具链
297
+ 1. 数据 / schema / contract
298
+ 2. 核心实现
299
+ 3. 测试
300
+ 4. 文档 / examples
301
+ 5. 构建 / 发布 / 生成物
60
302
 
61
303
  ## History Rules
62
304
 
63
- 1. 推送前优先同步 base branch,并尽量使用 `git pull --rebase` 保持线性历史。
64
- 2. 已有打开的 PR 时,更新现有 PR,不重复创建第二个。
305
+ 1. 推送前优先同步 base branch,并尽量用 `git pull --rebase` 或 `git rebase <base>` 保持线性历史。
306
+ 2. 已有打开 PR / MR 时,更新现有 PR / MR,不重复创建第二个。
65
307
  3. rebase 之后如果必须强推,只允许 `git push --force-with-lease`,不要裸 `--force`。
308
+ 4. 不改写公共分支历史。
309
+ 5. 不把 WIP、AI 过程笔记、debug probe、临时日志留在最终历史里;必要时 squash/fixup 到语义 commit。
310
+ 6. 使用 `fixup!` / `squash!` 时,最终 ship 前要 autosquash 成干净历史,除非团队明确接受。
311
+
312
+ ## Footer Trailers
313
+
314
+ Footer 用于机器和长期审计,不用于塞正文。
315
+
316
+ 常用 trailers:
66
317
 
67
- ## Examples
318
+ - `BREAKING CHANGE: <what breaks and migration path>`
319
+ - `Closes: #123`
320
+ - `Refs: #123`
321
+ - `Reviewed-by: <name>`
322
+ - `Co-authored-by: <name> <email>`
323
+ - `Signed-off-by: <name> <email>`,仅在项目要求 DCO / signoff 时使用
324
+ - `Change-Id: <id>`,仅在 Gerrit 或项目要求时使用
325
+
326
+ GitHub 自动关闭 issue 时,每个 issue 都要带 closing keyword,例如:
68
327
 
69
328
  ```text
70
- feat(user): add wechat login flow
71
- fix(auth): handle expired token refresh
72
- test(payment): cover callback retry path
73
- docs(readme): document local development setup
74
- refactor(api): simplify request error mapping
329
+ Closes: #10
330
+ Resolves: #123
331
+ Fixes: owner/repo#100
332
+ ```
333
+
334
+ 只想关联不想关闭时,用 `Refs:`,不要用 closing keyword。
335
+
336
+ ## Bad Messages
337
+
338
+ 禁止这些标题:
339
+
340
+ - `fix bug`
341
+ - `update files`
342
+ - `misc changes`
343
+ - `wip`
344
+ - `improve stuff`
345
+ - `final changes`
346
+ - `address feedback`
347
+ - `cleanup`
348
+ - `changes from review`
349
+
350
+ 可以改成:
351
+
352
+ ```text
353
+ fix(auth): 拒绝过期 refresh token
354
+
355
+ 问题:
356
+ - 后台续期流程会接受已经过期的 refresh token。
357
+
358
+ 根因:
359
+ - 续期路径信任缓存的过期标记,而不是 token payload 里的真实过期时间。
360
+
361
+ 变更:
362
+ - 发放替换 token 前先解析 payload 过期时间。
363
+ - 缓存只保留为优化手段,不再作为信任边界。
364
+
365
+ 验证:
366
+ - npm test -- auth-token-refresh.test.ts
367
+
368
+ 风险:
369
+ - 低:只影响 auth 续期路径;回滚会恢复旧缓存检查。
370
+
371
+ 关联:
372
+ - FIX-042
75
373
  ```
76
374
 
77
375
  ## CC-Act Enforcement
78
376
 
79
377
  `cc-act` 在 `create-pr` / `update-pr` 模式下至少要检查:
80
378
 
81
- 1. commit message 是否符合本规范或仓库已有规范
82
- 2. 是否把明显不同类型的变更拆成了独立 commit
83
- 3. push PR 描述是否与最终提交历史表达同一套事实
379
+ 1. 是否先列出 commit plan,再 staging。
380
+ 2. staged files 是否只属于当前 commit bucket。
381
+ 3. commit title 是否符合 Conventional Commits 或仓库更严格规范。
382
+ 4. 非平凡 commit 是否有 `问题`、`变更`、`原因`、`验证`、`风险`。
383
+ 5. `fix` commit 是否写了 `根因`,且不是只描述 symptom。
384
+ 6. `验证` 是否是实际命令 / artifact / explicit skip reason,而不是 “tested locally”。
385
+ 7. footer 是否使用 trailer 风格,issue closing keyword 是否符合目标平台语义。
386
+ 8. push、PR body、release note、handoff 是否与最终 commit history 表达同一套事实。
387
+
388
+ 如果无法满足这些条件,停在 `local-handoff` 或 reroute,不要制造粗糙历史。
@@ -34,6 +34,10 @@ req_act_manifest_path() {
34
34
  printf '%s/task-manifest.json\n' "$(req_act_planning_dir "$1")"
35
35
  }
36
36
 
37
+ req_act_change_meta_path() {
38
+ printf '%s/change-meta.json\n' "$(req_act_change_dir "$1")"
39
+ }
40
+
37
41
  req_act_tasks_path() {
38
42
  printf '%s/tasks.md\n' "$(req_act_planning_dir "$1")"
39
43
  }
@@ -243,11 +247,22 @@ req_act_collect_touched_files() {
243
247
  req_act_collect_spec_files() {
244
248
  local manifest="$1"
245
249
  local out_file="$2"
250
+ local change_dir=""
251
+ local change_meta=""
246
252
 
247
253
  : > "$out_file"
248
254
 
249
255
  if [[ -f "$manifest" ]]; then
250
- jq -r '(.spec.specFiles // [])[]?' "$manifest" 2>/dev/null | sed '/^$/d' > "$out_file" || true
256
+ change_dir="$(req_act_change_dir "$(dirname "$manifest")")"
257
+ change_meta="$(req_act_change_meta_path "$change_dir")"
258
+ fi
259
+
260
+ if [[ -n "$change_meta" && -f "$change_meta" ]]; then
261
+ jq -r '(.spec.specFiles // [])[]?' "$change_meta" 2>/dev/null | sed '/^$/d' > "$out_file" || true
262
+ fi
263
+
264
+ if [[ -f "$manifest" ]]; then
265
+ jq -r '(.spec.specFiles // [])[]?' "$manifest" 2>/dev/null | sed '/^$/d' >> "$out_file" || true
251
266
  fi
252
267
 
253
268
  req_act_dedup_file "$out_file"
@@ -262,8 +277,21 @@ req_act_roadmap_sync_summary() {
262
277
  local no_op_reason=""
263
278
  local updated_files=""
264
279
  local existing_files=""
280
+ local change_dir=""
281
+ local change_meta=""
265
282
 
266
283
  if [[ -f "$manifest" ]]; then
284
+ change_dir="$(req_act_change_dir "$(dirname "$manifest")")"
285
+ change_meta="$(req_act_change_meta_path "$change_dir")"
286
+ fi
287
+
288
+ if [[ -n "$change_meta" && -f "$change_meta" ]]; then
289
+ item_id="$(jq -r '.sourceRoadmap.itemId // empty' "$change_meta" 2>/dev/null || true)"
290
+ sync_status="$(jq -r '.roadmapSync.status // .sourceRoadmap.syncStatus // "not recorded"' "$change_meta" 2>/dev/null || true)"
291
+ sync_command="$(jq -r '.roadmapSync.command // .sourceRoadmap.syncCommand // empty' "$change_meta" 2>/dev/null || true)"
292
+ no_op_reason="$(jq -r '.roadmapSync.noOpReason // .sourceRoadmap.noOpReason // empty' "$change_meta" 2>/dev/null || true)"
293
+ updated_files="$(jq -r '(.roadmapSync.updatedFiles // .sourceRoadmap.updatedFiles // []) | join(", ")' "$change_meta" 2>/dev/null || true)"
294
+ elif [[ -f "$manifest" ]]; then
267
295
  item_id="$(jq -r '.sourceRoadmap.itemId // empty' "$manifest" 2>/dev/null || true)"
268
296
  sync_status="$(jq -r '.sourceRoadmap.syncStatus // .roadmapSync.status // "not recorded"' "$manifest" 2>/dev/null || true)"
269
297
  sync_command="$(jq -r '.sourceRoadmap.syncCommand // .roadmapSync.command // empty' "$manifest" 2>/dev/null || true)"
@@ -66,6 +66,17 @@ requirement_id="$(req_act_requirement_id "$manifest" "$CHANGE_DIR")"
66
66
  report_summary="$(req_act_report_summary "$report_card")"
67
67
  report_verdict="$(req_act_report_verdict "$report_card")"
68
68
  output_language="$(req_act_output_language "$report_card")"
69
+ normalized_output_language="$(printf '%s' "$output_language" | tr '[:upper:]' '[:lower:]')"
70
+ case "$normalized_output_language" in
71
+ *zh*|*chinese*|*中文*)
72
+ pr_body_locale="zh"
73
+ pr_language_label="中文"
74
+ ;;
75
+ *)
76
+ pr_body_locale="en"
77
+ pr_language_label="English"
78
+ ;;
79
+ esac
69
80
  design_goal="$(req_act_design_goal "$design_file")"
70
81
  main_risk="$(req_act_main_risk "$design_file")"
71
82
  review_base_sha="$(jq -r '[.review.taskReviews.reviewPacket.baseSha?, .review.diffReview.reviewPacket.baseSha?] | map(select(. != null and . != "")) | first // "not recorded"' "$report_card")"
@@ -241,6 +252,159 @@ roadmap_sync_summary="$(req_act_roadmap_sync_summary "$manifest" "$REPO_ROOT")"
241
252
  echo "- Roadmap progress: $roadmap_sync_summary"
242
253
  echo "- PR body accuracy: $pr_body_accuracy_summary"
243
254
  echo
255
+ echo "## Pull Request Body Contract"
256
+ echo
257
+ echo "- Language source: \`Output language: $output_language\`"
258
+ echo "- PR body language: $pr_language_label"
259
+ echo "- Title rule: use the same language as the PR body after the Conventional Commits \`type(scope)\` prefix; keep identifiers, paths, commands, and issue keys unchanged."
260
+ echo "- Body source: rebuild from this \`pr-brief.md\`, current diff, current \`review/report-card.json\`, doc sync output, and roadmap/backlog writeback; do not reuse a stale PR body."
261
+ echo "- Required sections: summary, problem, changes, validation, review/gate evidence, risk/rollback, docs/writeback, and follow-ups."
262
+ echo "- Completeness gate: no empty headings, no generic \"tests passed\" claim without commands or evidence, and no \`<placeholder>\` text may remain before \`gh pr create\` or \`gh pr edit\`."
263
+ echo
264
+ echo "## Pull Request Body Draft"
265
+ echo
266
+ echo '```markdown'
267
+ if [[ "$pr_body_locale" == "zh" ]]; then
268
+ echo "## 摘要"
269
+ if [[ -n "$report_summary" ]]; then
270
+ echo "- $report_summary"
271
+ fi
272
+ if [[ -n "$design_goal" && "$design_goal" != "$report_summary" ]]; then
273
+ echo "- $design_goal"
274
+ fi
275
+ if [[ -z "$report_summary" && -z "$design_goal" ]]; then
276
+ echo "- 未记录顶层摘要;创建或更新 PR 前必须补齐。"
277
+ fi
278
+ echo
279
+ echo "## 问题"
280
+ echo "- 需求:$requirement_id"
281
+ echo "- 用户可见缺口:${design_goal:-需要从 planning 产物补齐}"
282
+ echo
283
+ echo "## 变更"
284
+ if [[ -s "$tmp_changed" ]]; then
285
+ while IFS= read -r line; do
286
+ echo "- $line"
287
+ done < "$tmp_changed"
288
+ else
289
+ echo "- 未捕获完成任务列表;创建或更新 PR 前必须补齐。"
290
+ fi
291
+ echo
292
+ echo "## 验证"
293
+ echo "- \`report-card.json\` 结论:$report_verdict"
294
+ if [[ -s "$tmp_evidence" ]]; then
295
+ while IFS= read -r line; do
296
+ echo "- $line"
297
+ done < "$tmp_evidence"
298
+ else
299
+ echo "- 未记录证据行;必须补充命令、退出码或关键观察。"
300
+ fi
301
+ if [[ -s "$tmp_verify" ]]; then
302
+ while IFS= read -r cmd; do
303
+ echo "- \`$cmd\`"
304
+ done < "$tmp_verify"
305
+ fi
306
+ echo
307
+ echo "## Review / Gate 证据"
308
+ echo "- Reviewed base SHA: $review_base_sha"
309
+ echo "- Reviewed head SHA: $review_head_sha"
310
+ echo "- Review packet: $review_packet_summary"
311
+ echo "- Finding triage: $finding_triage_summary"
312
+ echo "- QA / claim evidence: $qa_claim_summary"
313
+ echo "- Readiness: review freshness=[$review_freshness_summary]; qa coverage=[$qa_coverage_summary]; browser QA=[$browser_qa_summary]"
314
+ echo
315
+ echo "## 风险与回滚"
316
+ if [[ -n "$main_risk" ]]; then
317
+ echo "- 主要风险:$main_risk"
318
+ else
319
+ echo "- 主要风险:planning/design.md 未记录新增风险。"
320
+ fi
321
+ echo "- 回滚边界:按 \`Rollback Guard\` 的 safe state、side effects 和 owner 执行;如未补齐,不得合并。"
322
+ echo
323
+ echo "## 文档与回写"
324
+ echo "- \`CLAUDE.md\`: $claude_status"
325
+ echo "- \`README.md\`: $readme_status"
326
+ echo "- Roadmap progress: $roadmap_sync_summary"
327
+ echo
328
+ echo "## 后续事项"
329
+ if [[ -s "$tmp_followups" ]]; then
330
+ while IFS= read -r line; do
331
+ echo "- $line"
332
+ done < "$tmp_followups"
333
+ else
334
+ echo "- 无已记录后续事项。"
335
+ fi
336
+ else
337
+ echo "## Summary"
338
+ if [[ -n "$report_summary" ]]; then
339
+ echo "- $report_summary"
340
+ fi
341
+ if [[ -n "$design_goal" && "$design_goal" != "$report_summary" ]]; then
342
+ echo "- $design_goal"
343
+ fi
344
+ if [[ -z "$report_summary" && -z "$design_goal" ]]; then
345
+ echo "- No top-line summary recorded; fill this before creating or updating the PR."
346
+ fi
347
+ echo
348
+ echo "## Problem"
349
+ echo "- Requirement: $requirement_id"
350
+ echo "- User-visible gap: ${design_goal:-fill from planning artifacts before PR update}"
351
+ echo
352
+ echo "## Changes"
353
+ if [[ -s "$tmp_changed" ]]; then
354
+ while IFS= read -r line; do
355
+ echo "- $line"
356
+ done < "$tmp_changed"
357
+ else
358
+ echo "- No completed task list captured; fill this before creating or updating the PR."
359
+ fi
360
+ echo
361
+ echo "## Validation"
362
+ echo "- \`report-card.json\` verdict: $report_verdict"
363
+ if [[ -s "$tmp_evidence" ]]; then
364
+ while IFS= read -r line; do
365
+ echo "- $line"
366
+ done < "$tmp_evidence"
367
+ else
368
+ echo "- No evidence lines recorded; add command, exit status, or key observation evidence."
369
+ fi
370
+ if [[ -s "$tmp_verify" ]]; then
371
+ while IFS= read -r cmd; do
372
+ echo "- \`$cmd\`"
373
+ done < "$tmp_verify"
374
+ fi
375
+ echo
376
+ echo "## Review / Gate Evidence"
377
+ echo "- Reviewed base SHA: $review_base_sha"
378
+ echo "- Reviewed head SHA: $review_head_sha"
379
+ echo "- Review packet: $review_packet_summary"
380
+ echo "- Finding triage: $finding_triage_summary"
381
+ echo "- QA / claim evidence: $qa_claim_summary"
382
+ echo "- Readiness: review freshness=[$review_freshness_summary]; qa coverage=[$qa_coverage_summary]; browser QA=[$browser_qa_summary]"
383
+ echo
384
+ echo "## Risk And Rollback"
385
+ if [[ -n "$main_risk" ]]; then
386
+ echo "- Main risk: $main_risk"
387
+ else
388
+ echo "- Main risk: no additional risk captured in planning/design.md."
389
+ fi
390
+ echo "- Rollback boundary: follow the \`Rollback Guard\` safe state, side effects, and owner; do not merge if this is incomplete."
391
+ echo
392
+ echo "## Docs And Writeback"
393
+ echo "- \`CLAUDE.md\`: $claude_status"
394
+ echo "- \`README.md\`: $readme_status"
395
+ echo "- Roadmap progress: $roadmap_sync_summary"
396
+ echo
397
+ echo "## Follow-ups"
398
+ if [[ -s "$tmp_followups" ]]; then
399
+ while IFS= read -r line; do
400
+ echo "- $line"
401
+ done < "$tmp_followups"
402
+ else
403
+ echo "- None recorded."
404
+ fi
405
+ fi
406
+ echo '```'
407
+ echo
244
408
  echo "## Summary"
245
409
  echo
246
410
  if [[ -n "$report_summary" ]]; then
@@ -209,7 +209,7 @@ case "$ship_mode" in
209
209
  create-pr) next_action="Push current branch and create PR / MR from pr-brief.md." ;;
210
210
  update-pr) next_action="Refresh the open PR / MR body and resolve outstanding review feedback." ;;
211
211
  local-handoff) next_action="Hand off with pr-brief.md and this resume index." ;;
212
- post-merge-closeout) next_action="Finish release note, backlog writeback, and archive the requirement." ;;
212
+ post-merge-closeout) next_action="Run release note/backlog writeback, then run cc-devflow archive-change $requirement_id and verify the archive path." ;;
213
213
  esac
214
214
  if [[ "$branch_rescue" == "create-branch-before-pr" ]]; then
215
215
  next_action="Run ensure-ship-branch.sh, rerun final verification, then push the named branch and create PR / MR from pr-brief.md."
@@ -1,5 +1,22 @@
1
1
  # CC-Check Skill Changelog
2
2
 
3
+ ## v1.11.1 - 2026-05-13
4
+
5
+ - treat `passed`, `done`, `completed`, and `verified` task statuses as complete when rendering the `requirements-met` claim evidence
6
+ - keep report-card task-gap detection aligned with `mark-task-complete.sh` and shared lifecycle status semantics
7
+
8
+ ## v1.11.0 - 2026-05-13
9
+
10
+ - read requirement-level review truth from `review-findings.json` first, then `review-ledger.jsonl`, then legacy `cc-review-report.md`
11
+ - block with `review-missing` when no machine review record or legacy report exists
12
+ - document that legacy Markdown fallback has unknown freshness and cannot silently support a high-confidence pass
13
+
14
+ ## v1.10.2 - 2026-05-12
15
+
16
+ - add a `workflow-context` context-index reset before verification so `cc-check` starts from current next-action truth instead of full artifact reload
17
+ - make deep verification reads conditional on the workflow context `openWhen.conditions` triggers
18
+ - preserve fresh-evidence requirements while reducing default context needed to choose `cc-check` vs reroute
19
+
3
20
  ## v1.10.1 - 2026-04-29
4
21
 
5
22
  - add named runtime failure fields with artifact references, owners, and rescue actions