cc-devflow 4.5.10 → 4.5.12

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 (187) hide show
  1. package/.claude/skills/cc-act/CHANGELOG.md +23 -0
  2. package/.claude/skills/cc-act/PLAYBOOK.md +17 -269
  3. package/.claude/skills/cc-act/SKILL.md +38 -418
  4. package/.claude/skills/cc-act/assets/PROJECT_POSTMORTEM_INDEX_TEMPLATE.md +2 -13
  5. package/.claude/skills/cc-act/assets/PROJECT_POSTMORTEM_TEMPLATE.md +1 -9
  6. package/.claude/skills/cc-act/assets/PR_BRIEF_TEMPLATE.md +21 -177
  7. package/.claude/skills/cc-act/references/closure-contract.md +12 -63
  8. package/.claude/skills/cc-act/references/git-commit-guidelines.md +5 -5
  9. package/.claude/skills/cc-act/scripts/cc-act-common.sh +5 -322
  10. package/.claude/skills/cc-act/scripts/detect-ship-target.sh +11 -2
  11. package/.claude/skills/cc-act/scripts/inspect-git-index.sh +58 -0
  12. package/.claude/skills/cc-act/scripts/render-pr-brief.sh +40 -440
  13. package/.claude/skills/cc-act/scripts/verify-act-gate.sh +10 -50
  14. package/.claude/skills/cc-check/CHANGELOG.md +24 -0
  15. package/.claude/skills/cc-check/PLAYBOOK.md +19 -273
  16. package/.claude/skills/cc-check/SKILL.md +33 -454
  17. package/.claude/skills/cc-check/references/review-contract.md +12 -147
  18. package/.claude/skills/cc-dev/CHANGELOG.md +20 -0
  19. package/.claude/skills/cc-dev/PLAYBOOK.md +1 -1
  20. package/.claude/skills/cc-dev/SKILL.md +52 -130
  21. package/.claude/skills/cc-dev/scripts/resolve-cc-devflow.sh +181 -0
  22. package/.claude/skills/cc-do/CHANGELOG.md +17 -0
  23. package/.claude/skills/cc-do/PLAYBOOK.md +19 -113
  24. package/.claude/skills/cc-do/SKILL.md +39 -236
  25. package/.claude/skills/cc-do/references/execution-recovery.md +15 -109
  26. package/.claude/skills/cc-do/scripts/cc-do-common.sh +5 -57
  27. package/.claude/skills/cc-do/scripts/check-task-status.sh +35 -65
  28. package/.claude/skills/cc-do/scripts/mark-task-complete.sh +9 -46
  29. package/.claude/skills/cc-do/scripts/select-ready-tasks.sh +29 -97
  30. package/.claude/skills/cc-investigate/CHANGELOG.md +23 -0
  31. package/.claude/skills/cc-investigate/PLAYBOOK.md +20 -180
  32. package/.claude/skills/cc-investigate/SKILL.md +65 -513
  33. package/.claude/skills/cc-investigate/assets/TASKS_TEMPLATE.md +48 -95
  34. package/.claude/skills/cc-investigate/references/investigation-contract.md +14 -217
  35. package/.claude/skills/cc-next/CHANGELOG.md +6 -0
  36. package/.claude/skills/cc-next/PLAYBOOK.md +12 -8
  37. package/.claude/skills/cc-next/SKILL.md +34 -140
  38. package/.claude/skills/cc-plan/CHANGELOG.md +29 -0
  39. package/.claude/skills/cc-plan/PLAYBOOK.md +22 -161
  40. package/.claude/skills/cc-plan/SKILL.md +47 -640
  41. package/.claude/skills/cc-plan/assets/TASKS_TEMPLATE.md +30 -225
  42. package/.claude/skills/cc-plan/references/planning-contract.md +24 -160
  43. package/.claude/skills/cc-plan/scripts/next-change-key.sh +8 -44
  44. package/.claude/skills/cc-plan/scripts/parse-task-dependencies.js +2 -2
  45. package/.claude/skills/cc-plan/scripts/validate-scope.sh +1 -1
  46. package/.claude/skills/cc-pr-land/SKILL.md +14 -114
  47. package/.claude/skills/cc-pr-review/CHANGELOG.md +4 -0
  48. package/.claude/skills/cc-pr-review/SKILL.md +20 -103
  49. package/.claude/skills/cc-review/CHANGELOG.md +17 -0
  50. package/.claude/skills/cc-review/PLAYBOOK.md +13 -86
  51. package/.claude/skills/cc-review/SKILL.md +53 -241
  52. package/.claude/skills/cc-review/references/e2e-and-plugin-verification.md +2 -2
  53. package/.claude/skills/cc-review/references/implementation-review-branch.md +7 -147
  54. package/.claude/skills/cc-review/references/plan-review-branch.md +5 -147
  55. package/.claude/skills/cc-review/references/review-methods.md +10 -218
  56. package/.claude/skills/cc-review/scripts/collect-review-context.sh +4 -63
  57. package/.claude/skills/cc-roadmap/PLAYBOOK.md +1 -1
  58. package/.claude/skills/cc-roadmap/SKILL.md +3 -3
  59. package/.claude/skills/cc-simplify/CHANGELOG.md +7 -0
  60. package/.claude/skills/cc-simplify/SKILL.md +26 -21
  61. package/.claude/skills/cc-spec-init/PLAYBOOK.md +12 -48
  62. package/.claude/skills/cc-spec-init/SKILL.md +29 -132
  63. package/.claude/skills/cc-spec-init/references/spec-contract.md +8 -17
  64. package/CHANGELOG.md +27 -0
  65. package/README.md +5 -3
  66. package/README.zh-CN.md +5 -3
  67. package/bin/cc-devflow-cli.js +20 -260
  68. package/bin/cc-devflow.js +44 -7
  69. package/docs/commands/README.md +1 -1
  70. package/docs/commands/README.zh-CN.md +1 -1
  71. package/docs/examples/README.md +1 -1
  72. package/docs/examples/START-HERE.md +14 -14
  73. package/docs/examples/example-bindings.json +11 -11
  74. package/docs/examples/full-design-blocked/README.md +4 -6
  75. package/docs/examples/full-design-blocked/changes/REQ-002-bulk-invite-import/{planning/tasks.md → task.md} +20 -15
  76. package/docs/examples/local-handoff/README.md +8 -11
  77. package/docs/examples/local-handoff/changes/REQ-003-audit-log-export/handoff/pr-brief.md +31 -0
  78. package/docs/examples/local-handoff/changes/REQ-003-audit-log-export/{planning/tasks.md → task.md} +18 -13
  79. package/docs/examples/pdca-loop/README.md +6 -9
  80. package/docs/examples/pdca-loop/changes/REQ-001-copy-invite-link/handoff/pr-brief.md +9 -11
  81. package/docs/examples/pdca-loop/changes/REQ-001-copy-invite-link/{planning/tasks.md → task.md} +18 -13
  82. package/docs/examples/scripts/check-example-bindings.sh +11 -62
  83. package/docs/guides/artifact-contract.md +10 -36
  84. package/docs/guides/getting-started.md +8 -7
  85. package/docs/guides/getting-started.zh-CN.md +8 -7
  86. package/docs/guides/minimize-artifacts.md +16 -116
  87. package/docs/guides/project-postmortem.md +14 -71
  88. package/lib/compiler/__tests__/skills-registry.test.js +9 -8
  89. package/lib/compiler/resource-copier.js +29 -0
  90. package/lib/skill-runtime/__tests__/archive-change.test.js +2 -2
  91. package/lib/skill-runtime/__tests__/benchmark-skills.test.js +109 -0
  92. package/lib/skill-runtime/__tests__/cli-bootstrap.integration.test.js +14 -4
  93. package/lib/skill-runtime/errors.js +3 -3
  94. package/lib/skill-runtime/index.js +5 -23
  95. package/lib/skill-runtime/paths.js +5 -52
  96. package/lib/skill-runtime/query-registry.js +4 -4
  97. package/lib/skill-runtime/query.js +89 -201
  98. package/lib/skill-runtime/store.js +4 -40
  99. package/lib/skill-runtime/trace.js +2 -2
  100. package/package.json +5 -7
  101. package/.claude/skills/cc-act/assets/PROJECT_POSTMORTEM_PRINCIPLES_TEMPLATE.md +0 -29
  102. package/.claude/skills/cc-act/assets/RELEASE_NOTE_TEMPLATE.md +0 -54
  103. package/.claude/skills/cc-act/scripts/generate-status-report.sh +0 -92
  104. package/.claude/skills/cc-act/scripts/sync-act-docs.sh +0 -355
  105. package/.claude/skills/cc-check/assets/REPORT_CARD_TEMPLATE.json +0 -234
  106. package/.claude/skills/cc-check/scripts/render-report-card.js +0 -438
  107. package/.claude/skills/cc-check/scripts/verify-gate.sh +0 -85
  108. package/.claude/skills/cc-do/scripts/build-task-context.sh +0 -175
  109. package/.claude/skills/cc-do/scripts/record-review-decision.sh +0 -88
  110. package/.claude/skills/cc-do/scripts/recover-workflow.sh +0 -82
  111. package/.claude/skills/cc-do/scripts/run-problem-analysis.sh +0 -70
  112. package/.claude/skills/cc-do/scripts/verify-task-gates.sh +0 -109
  113. package/.claude/skills/cc-do/scripts/write-task-checkpoint.sh +0 -92
  114. package/.claude/skills/cc-investigate/assets/TASK_MANIFEST_TEMPLATE.json +0 -225
  115. package/.claude/skills/cc-plan/assets/TASK_MANIFEST_TEMPLATE.json +0 -179
  116. package/.claude/skills/cc-spec-init/assets/CHANGE_META_TEMPLATE.json +0 -28
  117. package/.claude/skills/cc-spec-init/scripts/validate-spec-links.sh +0 -45
  118. package/docs/examples/full-design-blocked/changes/REQ-002-bulk-invite-import/planning/design.md +0 -234
  119. package/docs/examples/full-design-blocked/changes/REQ-002-bulk-invite-import/planning/task-manifest.json +0 -488
  120. package/docs/examples/full-design-blocked/changes/REQ-002-bulk-invite-import/review/report-card.json +0 -189
  121. package/docs/examples/local-handoff/changes/REQ-003-audit-log-export/handoff/resume-index.md +0 -39
  122. package/docs/examples/local-handoff/changes/REQ-003-audit-log-export/handoff/status.md +0 -29
  123. package/docs/examples/local-handoff/changes/REQ-003-audit-log-export/planning/design.md +0 -123
  124. package/docs/examples/local-handoff/changes/REQ-003-audit-log-export/planning/task-manifest.json +0 -292
  125. package/docs/examples/local-handoff/changes/REQ-003-audit-log-export/review/report-card.json +0 -136
  126. package/docs/examples/pdca-loop/changes/REQ-001-copy-invite-link/handoff/status.md +0 -29
  127. package/docs/examples/pdca-loop/changes/REQ-001-copy-invite-link/planning/design.md +0 -124
  128. package/docs/examples/pdca-loop/changes/REQ-001-copy-invite-link/planning/task-manifest.json +0 -292
  129. package/docs/examples/pdca-loop/changes/REQ-001-copy-invite-link/review/report-card.json +0 -136
  130. package/docs/get-shit-done-strategy-audit.md +0 -518
  131. package/docs/skill-runtime-migration.md +0 -46
  132. package/lib/skill-runtime/__tests__/approve.test.js +0 -92
  133. package/lib/skill-runtime/__tests__/autopilot.test.js +0 -253
  134. package/lib/skill-runtime/__tests__/benchmark-artifacts.test.js +0 -165
  135. package/lib/skill-runtime/__tests__/delegation.test.js +0 -97
  136. package/lib/skill-runtime/__tests__/dispatch.test.js +0 -237
  137. package/lib/skill-runtime/__tests__/intent.test.js +0 -203
  138. package/lib/skill-runtime/__tests__/lifecycle.test.js +0 -169
  139. package/lib/skill-runtime/__tests__/planner.tdd.test.js +0 -331
  140. package/lib/skill-runtime/__tests__/prepare-pr.test.js +0 -126
  141. package/lib/skill-runtime/__tests__/query.test.js +0 -860
  142. package/lib/skill-runtime/__tests__/readiness.test.js +0 -53
  143. package/lib/skill-runtime/__tests__/release.test.js +0 -85
  144. package/lib/skill-runtime/__tests__/review-check-integration.test.js +0 -148
  145. package/lib/skill-runtime/__tests__/review-records.test.js +0 -619
  146. package/lib/skill-runtime/__tests__/runtime.integration.test.js +0 -351
  147. package/lib/skill-runtime/__tests__/schemas.test.js +0 -337
  148. package/lib/skill-runtime/__tests__/task-contract-migrate.test.js +0 -137
  149. package/lib/skill-runtime/__tests__/task-contract.test.js +0 -783
  150. package/lib/skill-runtime/__tests__/team-state.test.js +0 -51
  151. package/lib/skill-runtime/__tests__/verify-artifacts.test.js +0 -203
  152. package/lib/skill-runtime/__tests__/worker-run.test.js +0 -275
  153. package/lib/skill-runtime/__tests__/worker.test.js +0 -56
  154. package/lib/skill-runtime/__tests__/workflow-context-legacy-fallback.test.js +0 -31
  155. package/lib/skill-runtime/__tests__/workflow-context.test.js +0 -98
  156. package/lib/skill-runtime/artifacts.js +0 -88
  157. package/lib/skill-runtime/context-index.js +0 -545
  158. package/lib/skill-runtime/delegation.js +0 -533
  159. package/lib/skill-runtime/intent.js +0 -309
  160. package/lib/skill-runtime/lifecycle.js +0 -294
  161. package/lib/skill-runtime/operations/CLAUDE.md +0 -19
  162. package/lib/skill-runtime/operations/approve.js +0 -81
  163. package/lib/skill-runtime/operations/autopilot-core.js +0 -337
  164. package/lib/skill-runtime/operations/autopilot-execution.js +0 -307
  165. package/lib/skill-runtime/operations/autopilot-shared.js +0 -48
  166. package/lib/skill-runtime/operations/autopilot.js +0 -163
  167. package/lib/skill-runtime/operations/dispatch.js +0 -416
  168. package/lib/skill-runtime/operations/init.js +0 -60
  169. package/lib/skill-runtime/operations/janitor.js +0 -61
  170. package/lib/skill-runtime/operations/plan.js +0 -59
  171. package/lib/skill-runtime/operations/prepare-pr.js +0 -25
  172. package/lib/skill-runtime/operations/release.js +0 -99
  173. package/lib/skill-runtime/operations/resume.js +0 -126
  174. package/lib/skill-runtime/operations/review-records.js +0 -265
  175. package/lib/skill-runtime/operations/snapshot.js +0 -45
  176. package/lib/skill-runtime/operations/task-contract.js +0 -524
  177. package/lib/skill-runtime/operations/verify.js +0 -170
  178. package/lib/skill-runtime/operations/worker-run.js +0 -531
  179. package/lib/skill-runtime/operations/worker.js +0 -33
  180. package/lib/skill-runtime/planner.js +0 -539
  181. package/lib/skill-runtime/readiness.js +0 -84
  182. package/lib/skill-runtime/review-records.js +0 -123
  183. package/lib/skill-runtime/review.js +0 -855
  184. package/lib/skill-runtime/schemas.js +0 -746
  185. package/lib/skill-runtime/task-contract.js +0 -187
  186. package/lib/skill-runtime/team-state.js +0 -122
  187. package/lib/skill-runtime/workflow-context.js +0 -748
@@ -1,197 +1,41 @@
1
1
  # PR Brief
2
2
 
3
- ## Document Meta
4
-
5
- - Output language:
6
-
7
- ## Decision
8
-
9
- - Recommended mode:
10
- - Why now:
11
- - Why not others:
12
-
13
- ## Requirement
14
-
15
- -
16
-
17
- ## Ship Mode
18
-
19
- - `create-pr` / `update-pr` / `local-handoff` / `post-merge-closeout`
20
-
21
- ## Branch Context
22
-
23
- - Current branch:
24
- - Base branch:
25
- - PR / MR:
26
-
27
- ## Ship Preflight
3
+ ## Change
28
4
 
5
+ - Change key:
29
6
  - Branch:
30
- - Base:
31
- - Remote:
32
- - Local / remote HEAD:
33
- - Auth:
34
- - Clean tree:
35
- - Review freshness:
36
- - Ship mode:
37
- - `ShipPreflightError`:
38
- - Rescue action:
39
-
40
- ## PR Branch Hygiene
41
-
42
- - Existing PR / MR:
43
- - Duplicate PR risk:
44
- - Commit split:
45
- - Push idempotency:
46
- - Body source:
47
-
48
- ## Review Range
49
-
50
- - Reviewed base SHA:
51
- - Reviewed head SHA:
52
- - Review packet:
53
- - Finding triage:
54
- - QA / claim evidence:
55
-
56
- ## Readiness Dashboard
57
-
58
- - Review freshness:
59
- - Review quality:
60
- - Specialist review facets:
61
- - QA coverage:
62
- - Browser QA:
63
- - Feedback loop:
64
- - Behavior evidence:
65
- - Failure ownership:
66
- - Documentation release:
67
- - PR body accuracy:
68
-
69
- ## Pull Request Body Contract
70
-
71
- - Language source: `Output language: <value from report-card>`
72
- - PR body language: `中文` / `English`
73
- - Title rule: same language as the PR body after the Conventional Commits `type(scope)` prefix; keep identifiers, paths, commands, and issue keys unchanged.
74
- - Body source: current `pr-brief.md`, current diff, current `review/report-card.json`, doc sync output, and roadmap/backlog writeback.
75
- - Required sections: summary, problem, changes, validation, review/gate evidence, risk/rollback, docs/writeback, follow-ups.
76
- - Completeness gate: no empty headings, no stale inherited PR body, no generic "tests passed" without command or evidence, and no `<placeholder>` text before `gh pr create` or `gh pr edit`.
77
-
78
- ## Pull Request Body Draft
7
+ - Head:
79
8
 
80
- ```markdown
81
- ## Summary / 摘要
82
-
83
- - TBD
84
-
85
- ## Problem / 问题
86
-
87
- - Requirement / 需求:
88
- - User-visible gap / 用户可见缺口:
89
-
90
- ## Changes / 变更
9
+ ## Task Summary
91
10
 
92
- - TBD
11
+ - Done:
93
12
 
94
- ## Validation / 验证
13
+ ## Recent Commits
95
14
 
96
- - `report-card.json` verdict / 结论:
97
- - Commands / 命令:
98
- - Key observations / 关键观察:
15
+ - <task summary>
99
16
 
100
- ## Review / Gate Evidence
17
+ ## Current Diff
101
18
 
102
- - Reviewed base SHA:
103
- - Reviewed head SHA:
104
- - Review packet:
105
- - Finding triage:
106
- - QA / claim evidence:
107
- - Readiness:
19
+ - <diff summary>
108
20
 
109
- ## Risk And Rollback / 风险与回滚
21
+ ## Validation
110
22
 
111
- - Main risk / 主要风险:
112
- - Rollback boundary / 回滚边界:
23
+ - Command:
24
+ - Result:
25
+ - Key observation:
113
26
 
114
- ## Docs And Writeback / 文档与回写
115
-
116
- - `CLAUDE.md`:
117
- - `README.md`:
118
- - Roadmap progress:
119
-
120
- ## Follow-ups / 后续事项
121
-
122
- - TBD
123
- ```
27
+ ## PR Body Draft
124
28
 
29
+ ```markdown
125
30
  ## Summary
126
31
 
127
- - TBD
32
+ - <summary>
128
33
 
129
- ## What Changed
34
+ ## Validation
130
35
 
131
- - TBD
36
+ - <validation evidence>
132
37
 
133
- ## Verification Evidence
38
+ ## Risk / Rollback
134
39
 
135
- - `review/report-card.json` verdict:
136
- - Fresh evidence:
137
- - Merged-result verification:
138
-
139
- ## Rollback Guard
140
-
141
- - Safe state:
142
- - Rollback command / manual steps:
143
- - Side effects:
144
- - Owner:
145
-
146
- ## QA Behavior Evidence
147
-
148
- - Feedback loop:
149
- - Expected behavior:
150
- - Actual behavior:
151
- - Reproduction steps:
152
- - Consistency:
153
-
154
- ## Documentation Sync
155
-
156
- - `CLAUDE.md`:
157
- - `README.md`:
158
- - `release-note.md`:
159
- - `resume-index.md`:
160
-
161
- ## Roadmap Progress Sync
162
-
163
- - Source RM:
164
- - Roadmap files: `devflow/roadmap.json`, `devflow/ROADMAP.md`, optional `devflow/BACKLOG.md`
165
- - Sync command:
166
- - Status after sync:
167
- - Progress after sync:
168
- - Follow-up writeback:
169
- - No-op reason:
170
-
171
- ## Consolidated Memory
172
-
173
- - `handoff path`:
174
- - latest task-state / review summary:
175
- - handoff entry for the next maintainer:
176
-
177
- ## Minimum Landing Pack
178
-
179
- - Required for this mode:
180
- - Intentionally omitted:
181
-
182
- ## How To Verify
183
-
184
- - TBD
185
-
186
- ## Follow-Ups
187
-
188
- - Current behavior:
189
- - Desired behavior:
190
- - Key interfaces:
191
- - Acceptance criteria:
192
- - Out of scope:
193
- - Learning extraction target:
194
-
195
- ## Risks
196
-
197
- - TBD
40
+ - <risk and rollback>
41
+ ```
@@ -1,70 +1,19 @@
1
1
  # Closure Contract
2
2
 
3
- ## Before Closing
4
-
5
- 1. `report-card.json` 必须是 `pass`
6
- 2. `reroute` 必须是 `none`
7
- 3. `evidence` 必须非空
8
- 4. `planning/tasks.md` 不能还有未完成项
9
- 5. 交付材料必须只总结现实,不补编故事
10
- 6. 如果文件结构变了,就同步对应目录的 `CLAUDE.md`
11
- 7. PR / handoff 必须记录 `cc-check` 审过的 base/head SHA、review packet、finding triage 摘要
12
- 8. readiness dashboard 必须说明 review freshness、QA coverage、browser evidence、failure ownership、documentation release、PR body accuracy
13
- 9. behavior handoff 必须带上 QA feedback loop、expected / actual / reproduction steps,以及 durable follow-up brief
14
- 10. source RM 必须已从 `devflow/roadmap.json` 定位,且 roadmap progress 与 verified reality 一致;没有 source RM 时记录 no-op reason
15
- 11. `post-merge-closeout` 必须预先冻结 archive target;最终只能是已归档,或带 `ArchiveSkip` blocker 的未完成 closeout
16
-
17
- ## Ship Decision Contract
18
-
19
- 收尾动作必须归入且只归入下列模式之一:
20
-
21
- 1. `create-pr`
22
- 2. `update-pr`
23
- 3. `local-handoff`
24
- 4. `post-merge-closeout`
25
-
26
- 如果当前状态不属于这 4 类之一,说明事实还没搞清,不准继续 ship。
27
-
28
- detached HEAD 是分支事实,不是第 5 种 ship 模式。若远端可用且用户目标是
29
- 继续 / 提交远程 PR,必须先运行 `scripts/ensure-ship-branch.sh --dir <requirement-dir>`
30
- 在当前 HEAD 创建命名分支,再回到 `create-pr` 流程。
31
-
32
- ## During Act
33
-
34
- 1. 如果 Act 阶段修改了代码、测试、验证口径,必须回 `cc-check`
35
- 2. 已存在 PR / MR 时优先更新,不重复创建
36
- 3. 文档不同构时,ship 不算完成
37
- 4. follow-up 只允许回写到系统真相源,不允许停留在聊天记录里
38
- 5. VERSION / package / changelog 漂移必须先分类处理,不能重复 bump 或覆盖发布历史
39
- 6. PR / MR body 必须从当前事实重建,不能沿用旧验证输出
40
- 7. push / PR 创建必须具备幂等检查:已同步则跳过,已存在 PR 则更新
41
- 8. 本地合并或 post-merge closeout 后必须在 merged result 上重跑必要 gate
42
- 9. 删除 branch、worktree、未合并提交、归档 requirement 前必须列出对象;丢弃未合并工作需要显式确认
43
- 10. verification 每次进入 `cc-act` 都必须重新跑;只有 push、PR 更新、文档生成等动作可以因为幂等状态跳过
44
- 11. PR body accuracy 必须对照当前 report-card、当前 diff、当前 commits;旧 body 不能作为证据源
45
- 12. follow-up 回写必须用行为契约表达,包含 current behavior、desired behavior、key interfaces、acceptance criteria、out of scope;不能只写文件路径或聊天 TODO
46
- 13. roadmap 回写只更新 `devflow/roadmap.json`,并通过 `sync-roadmap-progress.sh` 重新生成 `devflow/ROADMAP.md` / `devflow/BACKLOG.md`
47
- 14. `post-merge-closeout` 的归档必须真实执行:`cc-devflow archive-change <change-key>`,不能只把“可归档”写进 next action
48
-
49
- ## Memory Consolidation
50
-
51
- 进入 ship 动作前,先把分散事实压缩进:
3
+ ## Allowed Durable Outputs
52
4
 
53
5
  - `handoff/pr-brief.md`
54
- - `handoff/resume-index.md`(需要 handoff 时)
55
- - `handoff/release-note.md`(需要发布时)
6
+ - `devflow/postmortems/INDEX.md`
7
+ - `devflow/postmortems/incidents/<date>-<change-key>.md`
8
+
9
+ ## Hard Rules
56
10
 
57
- 如果下一位接手者还得去翻零散过程笔记才知道从哪接,说明 act 还没收口。
11
+ 1. Git commits are the process record.
12
+ 2. PR text is rebuilt from current commits, diff, `task.md`, and fresh validation.
13
+ 3. Incident postmortems are factual and evidence-backed.
14
+ 4. No process file beyond the allowed durable outputs.
15
+ 5. If verification changes during Act, return to `cc-check`.
58
16
 
59
- ## After Closing
17
+ ## Exit
60
18
 
61
- - reviewer 能接手
62
- - maintainer 知道怎么验证
63
- - PR / handoff / release 材料反映同一套事实
64
- - readiness dashboard 没有 blocker,PR body accuracy 已检查或明确阻塞
65
- - QA behavior evidence 和 feedback loop 已进入 PR / handoff / release 材料
66
- - post-merge closeout 反映 merged result 的验证事实,而不是只反映合并前事实
67
- - source RM 的 status、REQ/FIX 绑定、progress 和 follow-up 已经落入 roadmap truth
68
- - closed change 已经移动到 `devflow/changes/archive/YYYY-MM/<change-key>`;如果没有,必须有 `ArchiveSkip` blocker、原因、受影响路径和 retry command
69
- - 下一轮计划入口更清楚
70
- - 文档入口可发现,changelog 不丢历史,TODO / backlog 只记录有证据的事项
19
+ Close with commit hashes, validation commands, PR/handoff state, and any incident postmortem path.
@@ -9,7 +9,7 @@
9
9
  1. `git log --oneline` 能看懂变更类型和范围。
10
10
  2. `git show` 能解释问题、取舍、验证和风险。
11
11
  3. 每个 commit 边界足够小,后续可以独立 review、cherry-pick 或 revert。
12
- 4. PR body、release note、handoff 和 commit history 讲同一套事实。
12
+ 4. PR body、handoff 和 commit history 讲同一套事实。
13
13
  5. 后续维护者不需要聊天记录,也能知道为什么这么改。
14
14
 
15
15
  ## Research Baseline
@@ -65,8 +65,8 @@
65
65
  2. 改变用户可见行为、公共 API、CLI、schema、prompt、skill contract、验证脚本或发布流程。
66
66
  3. 修 bug、回归、flaky、性能、安全、权限、数据一致性或 trust boundary。
67
67
  4. 引入或改变测试策略、mock 边界、fixture、golden artifact。
68
- 5. 触碰 roadmap / planning / task manifest / report-card / handoff 等 durable artifact。
69
- 6. 有兼容性、迁移、回滚、release note 或 follow-up 风险。
68
+ 5. 触碰 roadmap / task.md / PR brief / handoff 等 durable artifact。
69
+ 6. 有兼容性、迁移、回滚或 follow-up 风险。
70
70
 
71
71
  单行 commit 仅适合:
72
72
 
@@ -156,7 +156,7 @@
156
156
  - <影响范围和回滚路径>
157
157
 
158
158
  关联:
159
- - <FIX/issue/analysis/report-card>
159
+ - <FIX/issue/root-cause/verification evidence>
160
160
  ```
161
161
 
162
162
  ### `refactor`
@@ -383,6 +383,6 @@ fix(auth): 拒绝过期 refresh token
383
383
  5. `fix` commit 是否写了 `根因`,且不是只描述 symptom。
384
384
  6. `验证` 是否是实际命令 / artifact / explicit skip reason,而不是 “tested locally”。
385
385
  7. footer 是否使用 trailer 风格,issue closing keyword 是否符合目标平台语义。
386
- 8. push、PR body、release note、handoff 是否与最终 commit history 表达同一套事实。
386
+ 8. push、PR body、handoff 是否与最终 commit history 表达同一套事实。
387
387
 
388
388
  如果无法满足这些条件,停在 `local-handoff` 或 reroute,不要制造粗糙历史。
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env bash
2
2
 
3
3
  # ------------------------------------------------------------
4
- # cc-act: 共享提取与归一化逻辑
4
+ # cc-act: task.md + pr-brief path helpers
5
5
  # ------------------------------------------------------------
6
6
 
7
7
  req_act_change_dir() {
@@ -9,7 +9,7 @@ req_act_change_dir() {
9
9
  local normalized="${input%/}"
10
10
 
11
11
  case "$(basename "$normalized")" in
12
- planning|execution|review|handoff|meta)
12
+ handoff)
13
13
  dirname "$normalized"
14
14
  ;;
15
15
  *)
@@ -18,335 +18,18 @@ req_act_change_dir() {
18
18
  esac
19
19
  }
20
20
 
21
- req_act_planning_dir() {
22
- printf '%s/planning\n' "$(req_act_change_dir "$1")"
23
- }
24
-
25
- req_act_review_dir() {
26
- printf '%s/review\n' "$(req_act_change_dir "$1")"
27
- }
28
-
29
21
  req_act_handoff_dir() {
30
22
  printf '%s/handoff\n' "$(req_act_change_dir "$1")"
31
23
  }
32
24
 
33
- req_act_manifest_path() {
34
- printf '%s/task-manifest.json\n' "$(req_act_planning_dir "$1")"
35
- }
36
-
37
- req_act_change_meta_path() {
38
- printf '%s/change-meta.json\n' "$(req_act_change_dir "$1")"
39
- }
40
-
41
25
  req_act_tasks_path() {
42
- printf '%s/tasks.md\n' "$(req_act_planning_dir "$1")"
26
+ printf '%s/task.md\n' "$(req_act_change_dir "$1")"
43
27
  }
44
28
 
45
- req_act_contract_path() {
46
- local planning_dir
47
- local design_file
48
- local analysis_file
49
-
50
- planning_dir="$(req_act_planning_dir "$1")"
51
- design_file="$planning_dir/design.md"
52
- analysis_file="$planning_dir/analysis.md"
53
-
54
- if [[ -f "$analysis_file" && ! -f "$design_file" ]]; then
55
- printf '%s\n' "$analysis_file"
56
- return 0
57
- fi
58
-
59
- printf '%s\n' "$design_file"
60
- }
61
-
62
- req_act_report_path() {
63
- printf '%s/report-card.json\n' "$(req_act_review_dir "$1")"
64
- }
65
-
66
- req_act_release_note_path() {
67
- printf '%s/release-note.md\n' "$(req_act_handoff_dir "$1")"
68
- }
69
-
70
- req_act_resume_index_path() {
71
- printf '%s/resume-index.md\n' "$(req_act_handoff_dir "$1")"
72
- }
73
-
74
- req_act_doc_sync_report_path() {
75
- printf '%s/doc-sync-report.md\n' "$(req_act_handoff_dir "$1")"
29
+ req_act_pr_brief_path() {
30
+ printf '%s/pr-brief.md\n' "$(req_act_handoff_dir "$1")"
76
31
  }
77
32
 
78
33
  req_act_repo_root() {
79
34
  git rev-parse --show-toplevel 2>/dev/null || pwd
80
35
  }
81
-
82
- req_act_requirement_id() {
83
- local manifest="$1"
84
- local req_dir="$2"
85
- local requirement_id=""
86
-
87
- requirement_id="$(jq -r '.requirementId // .changeId // empty' "$manifest" 2>/dev/null || true)"
88
- if [[ -z "$requirement_id" ]]; then
89
- requirement_id="$(basename "$req_dir")"
90
- fi
91
-
92
- printf '%s\n' "$requirement_id"
93
- }
94
-
95
- req_act_report_summary() {
96
- local report_card="$1"
97
- jq -r '.summary // ""' "$report_card" 2>/dev/null || true
98
- }
99
-
100
- req_act_report_verdict() {
101
- local report_card="$1"
102
- jq -r '.verdict // "unknown"' "$report_card" 2>/dev/null || echo unknown
103
- }
104
-
105
- req_act_spec_sync_ready() {
106
- local report_card="$1"
107
- jq -r '.specSyncReady // false' "$report_card" 2>/dev/null || echo false
108
- }
109
-
110
- req_act_output_language() {
111
- local report_card="$1"
112
- jq -r '.outputPolicy.documentLanguage // "en"' "$report_card" 2>/dev/null || echo en
113
- }
114
-
115
- req_act_design_goal() {
116
- local design_file="$1"
117
- awk -F': ' '/^- Deliver:/{print $2; exit} /^- Change:/{print $2; exit}' "$design_file" 2>/dev/null || true
118
- }
119
-
120
- req_act_main_risk() {
121
- local design_file="$1"
122
- local risk=""
123
-
124
- risk="$(awk -F': ' '/^- Main risk:/{print $2; exit}' "$design_file" 2>/dev/null || true)"
125
- if [[ -n "$risk" ]]; then
126
- printf '%s\n' "$risk"
127
- return 0
128
- fi
129
-
130
- awk -F'|' '
131
- /^\|/ {
132
- risk=$2
133
- gsub(/^[[:space:]]+|[[:space:]]+$/, "", risk)
134
- if (risk != "" && risk != "Risk" && risk !~ /^-+$/) {
135
- print risk
136
- exit
137
- }
138
- }
139
- ' "$design_file" 2>/dev/null || true
140
- }
141
-
142
- req_act_dedup_file() {
143
- local file="$1"
144
- awk 'NF && !seen[$0]++' "$file" > "${file}.dedup"
145
- mv "${file}.dedup" "$file"
146
- }
147
-
148
- req_act_collect_completed_titles() {
149
- local manifest="$1"
150
- local tasks_file="$2"
151
- local out_file="$3"
152
-
153
- : > "$out_file"
154
-
155
- if [[ -f "$manifest" ]]; then
156
- jq -r '
157
- (.tasks // [])
158
- | map(select((.status // "") | test("done|completed"; "i")))
159
- | .[]
160
- | .title // empty
161
- ' "$manifest" 2>/dev/null | sed '/^$/d' > "$out_file" || true
162
- fi
163
-
164
- if [[ ! -s "$out_file" && -f "$tasks_file" ]]; then
165
- awk '/^- \[[xX]\] /{sub(/^- \[[xX]\] /, "", $0); print}' "$tasks_file" > "$out_file" || true
166
- fi
167
- }
168
-
169
- req_act_collect_verification_commands() {
170
- local manifest="$1"
171
- local out_file="$2"
172
-
173
- : > "$out_file"
174
-
175
- if [[ -f "$manifest" ]]; then
176
- jq -r '
177
- (.tasks // [])
178
- | map(.verification // [])
179
- | add
180
- | .[]?
181
- ' "$manifest" 2>/dev/null | sed '/^$/d' > "$out_file" || true
182
- fi
183
-
184
- req_act_dedup_file "$out_file"
185
- }
186
-
187
- req_act_collect_followups() {
188
- local report_card="$1"
189
- local manifest="$2"
190
- local out_file="$3"
191
-
192
- : > "$out_file"
193
-
194
- if [[ -f "$report_card" ]]; then
195
- jq -r '(.gaps // [])[]?' "$report_card" 2>/dev/null | sed '/^$/d' > "$out_file" || true
196
- jq -r '
197
- (.followupBriefs // .review.followupBriefs // [])[]?
198
- | [
199
- ("summary: " + (.summary // .title // "follow-up")),
200
- ("current: " + (.currentBehavior // "not recorded")),
201
- ("desired: " + (.desiredBehavior // "not recorded")),
202
- ("interfaces: " + ((.keyInterfaces // []) | join(", "))),
203
- ("acceptance: " + ((.acceptanceCriteria // []) | join("; "))),
204
- ("out-of-scope: " + ((.outOfScope // []) | join(", ")))
205
- ]
206
- | join(" | ")
207
- ' "$report_card" 2>/dev/null | sed '/^$/d' >> "$out_file" || true
208
- jq -r '
209
- (.qa.architectureFollowUps // [])[]?
210
- | [
211
- ("summary: " + (.summary // .title // "architecture follow-up")),
212
- ("current: " + (.currentBehavior // "not recorded")),
213
- ("desired: " + (.desiredBehavior // "not recorded")),
214
- ("interfaces: " + ((.keyInterfaces // []) | join(", "))),
215
- ("acceptance: " + ((.acceptanceCriteria // []) | join("; "))),
216
- ("out-of-scope: " + ((.outOfScope // []) | join(", ")))
217
- ]
218
- | join(" | ")
219
- ' "$report_card" 2>/dev/null | sed '/^$/d' >> "$out_file" || true
220
- fi
221
-
222
- if [[ -f "$manifest" ]]; then
223
- jq -r '(.openQuestions // [])[]?, (.deferredQuestions // [])[]?' "$manifest" 2>/dev/null | sed '/^$/d' >> "$out_file" || true
224
- fi
225
-
226
- req_act_dedup_file "$out_file"
227
- }
228
-
229
- req_act_collect_touched_files() {
230
- local manifest="$1"
231
- local out_file="$2"
232
-
233
- : > "$out_file"
234
-
235
- if [[ -f "$manifest" ]]; then
236
- jq -r '
237
- (.tasks // [])
238
- | map((.files // []) + (.touches // []))
239
- | add
240
- | .[]?
241
- ' "$manifest" 2>/dev/null | sed '/^$/d' > "$out_file" || true
242
- fi
243
-
244
- req_act_dedup_file "$out_file"
245
- }
246
-
247
- req_act_collect_spec_files() {
248
- local manifest="$1"
249
- local out_file="$2"
250
- local change_dir=""
251
- local change_meta=""
252
-
253
- : > "$out_file"
254
-
255
- if [[ -f "$manifest" ]]; then
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
266
- fi
267
-
268
- req_act_dedup_file "$out_file"
269
- }
270
-
271
- req_act_roadmap_sync_summary() {
272
- local manifest="$1"
273
- local repo_root="${2:-$(req_act_repo_root)}"
274
- local item_id=""
275
- local sync_status=""
276
- local sync_command=""
277
- local no_op_reason=""
278
- local updated_files=""
279
- local existing_files=""
280
- local change_dir=""
281
- local change_meta=""
282
-
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
295
- item_id="$(jq -r '.sourceRoadmap.itemId // empty' "$manifest" 2>/dev/null || true)"
296
- sync_status="$(jq -r '.sourceRoadmap.syncStatus // .roadmapSync.status // "not recorded"' "$manifest" 2>/dev/null || true)"
297
- sync_command="$(jq -r '.sourceRoadmap.syncCommand // .roadmapSync.command // empty' "$manifest" 2>/dev/null || true)"
298
- no_op_reason="$(jq -r '.sourceRoadmap.noOpReason // .roadmapSync.noOpReason // empty' "$manifest" 2>/dev/null || true)"
299
- updated_files="$(jq -r '(.sourceRoadmap.updatedFiles // .roadmapSync.updatedFiles // []) | join(", ")' "$manifest" 2>/dev/null || true)"
300
- fi
301
-
302
- for candidate in devflow/roadmap.json devflow/ROADMAP.md devflow/BACKLOG.md devflow/roadmap-tracking.json; do
303
- if [[ -f "$repo_root/$candidate" ]]; then
304
- if [[ -n "$existing_files" ]]; then
305
- existing_files+=", "
306
- fi
307
- existing_files+="$candidate"
308
- fi
309
- done
310
-
311
- [[ -n "$existing_files" ]] || existing_files="no roadmap files found"
312
- [[ -n "$updated_files" ]] || updated_files="not recorded"
313
- [[ -n "$sync_command" ]] || sync_command="not recorded"
314
- [[ -n "$sync_status" ]] || sync_status="not recorded"
315
-
316
- if [[ -z "$item_id" ]]; then
317
- [[ -n "$no_op_reason" ]] || no_op_reason="no-source-rm"
318
- printf 'source=none; status=no-op; files=%s; no-op=%s\n' "$existing_files" "$no_op_reason"
319
- return 0
320
- fi
321
-
322
- printf 'source=%s; status=%s; files=%s; updated=%s; command=%s' \
323
- "$item_id" "$sync_status" "$existing_files" "$updated_files" "$sync_command"
324
-
325
- if [[ -n "$no_op_reason" ]]; then
326
- printf '; no-op=%s' "$no_op_reason"
327
- fi
328
-
329
- printf '\n'
330
- }
331
-
332
- req_act_collect_evidence() {
333
- local report_card="$1"
334
- local out_file="$2"
335
-
336
- : > "$out_file"
337
- jq -r '
338
- (.evidence // [])[]?,
339
- ((.claimEvidence // [])[]? | "- " + (.claim // "claim") + ": " + (.status // "unknown") + " via " + (.commandOrArtifact // "artifact") + " - " + (.keyObservation // "")),
340
- (if .qa.coverageAudit then "- qa.coverage: " + (.qa.coverageAudit.status // "unknown") + ", gaps=" + (((.qa.coverageAudit.gaps // []) | length) | tostring) else empty end),
341
- (if .qa.browserEvidence then "- qa.browser: " + (.qa.browserEvidence.status // "unknown") + ", mode=" + (.qa.browserEvidence.mode // "unknown") else empty end),
342
- (if .qa.feedbackLoop then "- qa.feedbackLoop: " + (.qa.feedbackLoop.status // "unknown") + ", mode=" + (.qa.feedbackLoop.mode // "unknown") + ", signal=" + (.qa.feedbackLoop.signalSharpness // "not recorded") else empty end),
343
- (if .qa.behaviorEvidence then "- qa.behavior: " + (.qa.behaviorEvidence.status // "unknown") + ", expected=" + (.qa.behaviorEvidence.expectedBehavior // "not recorded") + ", actual=" + (.qa.behaviorEvidence.actualBehavior // "not recorded") else empty end)
344
- ' "$report_card" 2>/dev/null | sed '/^$/d' > "$out_file" || true
345
- req_act_dedup_file "$out_file"
346
- }
347
-
348
- req_act_ship_field() {
349
- local ship_context="$1"
350
- local key="$2"
351
- printf '%s\n' "$ship_context" | awk -F= -v key="$key" '$1 == key {print substr($0, index($0, "=") + 1)}'
352
- }