@michaelxwb/code-flow 0.6.4 → 0.8.1

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 (207) hide show
  1. package/README.md +47 -3
  2. package/docs/USAGE.md +1529 -0
  3. package/docs/acceptance-contract.md +217 -0
  4. package/docs/ci/acceptance-evidence.md +77 -0
  5. package/docs/migrations/runtime-0.7.0.md +41 -0
  6. package/docs/migrations/runtime-0.8.0.md +154 -0
  7. package/docs/migrations/runtime-0.9.0.md +40 -0
  8. package/docs/spec-injection-hardening.md +54 -0
  9. package/docs/spec-injection-performance.json +73 -0
  10. package/docs/spec-optimization.md +12 -0
  11. package/package.json +18 -3
  12. package/src/adapters/claude/CLAUDE.md +1 -1
  13. package/src/adapters/claude/commands/cf-init.md +1 -3
  14. package/src/adapters/claude/commands/cf-spec.md +23 -3
  15. package/src/adapters/claude/commands/cf-stats.md +11 -1
  16. package/src/adapters/claude/commands/cf-sync.md +20 -6
  17. package/src/adapters/claude/commands/cf-task/align.md +25 -3
  18. package/src/adapters/claude/commands/cf-task/archive.md +36 -40
  19. package/src/adapters/claude/commands/cf-task/block.md +15 -2
  20. package/src/adapters/claude/commands/cf-task/graph.md +13 -1
  21. package/src/adapters/claude/commands/cf-task/note.md +13 -1
  22. package/src/adapters/claude/commands/cf-task/plan.md +137 -23
  23. package/src/adapters/claude/commands/cf-task/prd.md +13 -2
  24. package/src/adapters/claude/commands/cf-task/start.md +67 -35
  25. package/src/adapters/claude/commands/cf-task/status.md +12 -0
  26. package/src/adapters/claude/commands/cf-task/verify-e2e.md +72 -34
  27. package/src/adapters/claude/commands/cf-validate.md +30 -5
  28. package/src/adapters/codex/AGENTS.md +1 -1
  29. package/src/adapters/codex/hooks.json +14 -10
  30. package/src/adapters/codex/skills/cf-init/SKILL.md +4 -4
  31. package/src/adapters/codex/skills/cf-spec/SKILL.md +34 -6
  32. package/src/adapters/codex/skills/cf-stats/SKILL.md +11 -1
  33. package/src/adapters/codex/skills/cf-sync/SKILL.md +21 -6
  34. package/src/adapters/codex/skills/cf-task-align/SKILL.md +30 -8
  35. package/src/adapters/codex/skills/cf-task-archive/SKILL.md +36 -40
  36. package/src/adapters/codex/skills/cf-task-block/SKILL.md +15 -2
  37. package/src/adapters/codex/skills/cf-task-graph/SKILL.md +13 -1
  38. package/src/adapters/codex/skills/cf-task-note/SKILL.md +13 -1
  39. package/src/adapters/codex/skills/cf-task-plan/SKILL.md +175 -21
  40. package/src/adapters/codex/skills/cf-task-prd/SKILL.md +13 -2
  41. package/src/adapters/codex/skills/cf-task-start/SKILL.md +67 -35
  42. package/src/adapters/codex/skills/cf-task-status/SKILL.md +12 -0
  43. package/src/adapters/codex/skills/cf-task-verify-e2e/SKILL.md +73 -34
  44. package/src/adapters/codex/skills/cf-validate/SKILL.md +31 -5
  45. package/src/adapters/commands.json +115 -0
  46. package/src/adapters/costrict/CLAUDE.md +1 -1
  47. package/src/adapters/costrict/commands/cf-init.md +1 -3
  48. package/src/adapters/costrict/commands/cf-spec.md +23 -3
  49. package/src/adapters/costrict/commands/cf-stats.md +11 -1
  50. package/src/adapters/costrict/commands/cf-sync.md +20 -6
  51. package/src/adapters/costrict/commands/cf-task/align.md +25 -3
  52. package/src/adapters/costrict/commands/cf-task/archive.md +36 -40
  53. package/src/adapters/costrict/commands/cf-task/block.md +15 -2
  54. package/src/adapters/costrict/commands/cf-task/graph.md +13 -1
  55. package/src/adapters/costrict/commands/cf-task/note.md +13 -1
  56. package/src/adapters/costrict/commands/cf-task/plan.md +137 -23
  57. package/src/adapters/costrict/commands/cf-task/prd.md +13 -2
  58. package/src/adapters/costrict/commands/cf-task/start.md +67 -35
  59. package/src/adapters/costrict/commands/cf-task/status.md +12 -0
  60. package/src/adapters/costrict/commands/cf-task/verify-e2e.md +72 -34
  61. package/src/adapters/costrict/commands/cf-validate.md +30 -5
  62. package/src/adapters/install-plan.json +100 -0
  63. package/src/adapters/opencode/AGENTS.md +1 -1
  64. package/src/adapters/opencode/commands/cf-init.md +7 -7
  65. package/src/adapters/opencode/commands/cf-learn.md +6 -6
  66. package/src/adapters/opencode/commands/cf-spec.md +34 -2
  67. package/src/adapters/opencode/commands/cf-stats.md +17 -7
  68. package/src/adapters/opencode/commands/cf-sync.md +21 -6
  69. package/src/adapters/opencode/commands/cf-task/align.md +25 -8
  70. package/src/adapters/opencode/commands/cf-task/archive.md +36 -40
  71. package/src/adapters/opencode/commands/cf-task/block.md +16 -2
  72. package/src/adapters/opencode/commands/cf-task/graph.md +14 -1
  73. package/src/adapters/opencode/commands/cf-task/note.md +14 -1
  74. package/src/adapters/opencode/commands/cf-task/plan.md +137 -23
  75. package/src/adapters/opencode/commands/cf-task/prd.md +13 -2
  76. package/src/adapters/opencode/commands/cf-task/start.md +68 -41
  77. package/src/adapters/opencode/commands/cf-task/status.md +13 -0
  78. package/src/adapters/opencode/commands/cf-task/verify-e2e.md +72 -34
  79. package/src/adapters/opencode/commands/cf-validate.md +35 -9
  80. package/src/adapters/opencode/plugins/code-flow/index.js +128 -179
  81. package/src/adapters/platform-bindings.json +370 -0
  82. package/src/cli.js +369 -316
  83. package/src/core/code-flow/config.yml +4 -1
  84. package/src/core/code-flow/runtime-commands.json +259 -0
  85. package/src/core/code-flow/scripts/cf_acceptance_manifest.py +5 -289
  86. package/src/core/code-flow/scripts/cf_acceptance_runner.py +5 -187
  87. package/src/core/code-flow/scripts/cf_audit.py +10 -0
  88. package/src/core/code-flow/scripts/cf_codex_hook.py +10 -0
  89. package/src/core/code-flow/scripts/cf_design_lint.py +10 -0
  90. package/src/core/code-flow/scripts/cf_evidence_import.py +10 -0
  91. package/src/core/code-flow/scripts/cf_feedback.py +5 -51
  92. package/src/core/code-flow/scripts/cf_opencode_event.py +10 -0
  93. package/src/core/code-flow/scripts/cf_post_hook.py +6 -191
  94. package/src/core/code-flow/scripts/cf_pre_tool_hook.py +6 -99
  95. package/src/core/code-flow/scripts/cf_scenarios.py +10 -0
  96. package/src/core/code-flow/scripts/cf_spec_context.py +5 -1714
  97. package/src/core/code-flow/scripts/cf_spec_gate.py +5 -257
  98. package/src/core/code-flow/scripts/cf_spec_session.py +5 -114
  99. package/src/core/code-flow/scripts/cf_stats.py +5 -501
  100. package/src/core/code-flow/scripts/cf_stop_hook.py +6 -376
  101. package/src/core/code-flow/scripts/cf_sync.py +5 -135
  102. package/src/core/code-flow/scripts/cf_task_index.py +5 -143
  103. package/src/core/code-flow/scripts/cf_task_parallel.py +5 -380
  104. package/src/core/code-flow/scripts/cf_task_workflow.py +6 -103
  105. package/src/core/code-flow/scripts/cf_user_prompt_hook.py +6 -173
  106. package/src/core/code-flow/scripts/cf_validation.py +6 -77
  107. package/src/core/code-flow/scripts/codeflow/__init__.py +0 -0
  108. package/src/core/code-flow/scripts/codeflow/acceptance/__init__.py +0 -0
  109. package/src/core/code-flow/scripts/codeflow/acceptance/cf_acceptance_evidence.py +347 -0
  110. package/src/core/code-flow/scripts/codeflow/acceptance/cf_acceptance_manifest_core.py +660 -0
  111. package/src/core/code-flow/scripts/codeflow/acceptance/cf_acceptance_plan.py +202 -0
  112. package/src/core/code-flow/scripts/codeflow/acceptance/cf_acceptance_registration.py +60 -0
  113. package/src/core/code-flow/scripts/codeflow/acceptance/cf_acceptance_risk.py +73 -0
  114. package/src/core/code-flow/scripts/codeflow/acceptance/cf_acceptance_schema.py +282 -0
  115. package/src/core/code-flow/scripts/codeflow/acceptance/cf_acceptance_selection.py +266 -0
  116. package/src/core/code-flow/scripts/codeflow/acceptance/cf_check_inputs.py +172 -0
  117. package/src/core/code-flow/scripts/codeflow/acceptance/cf_check_registration.py +326 -0
  118. package/src/core/code-flow/scripts/{cf_checks.py → codeflow/acceptance/cf_checks.py} +8 -11
  119. package/src/core/code-flow/scripts/codeflow/acceptance/cf_plan_quality.py +197 -0
  120. package/src/core/code-flow/scripts/codeflow/acceptance/cf_scenario_quality.py +174 -0
  121. package/src/core/code-flow/scripts/codeflow/acceptance/cf_scenario_source.py +300 -0
  122. package/src/core/code-flow/scripts/codeflow/acceptance/cf_traceability.py +502 -0
  123. package/src/core/code-flow/scripts/codeflow/cli/__init__.py +0 -0
  124. package/src/core/code-flow/scripts/codeflow/cli/cf_acceptance_manifest.py +347 -0
  125. package/src/core/code-flow/scripts/codeflow/cli/cf_acceptance_runner.py +1490 -0
  126. package/src/core/code-flow/scripts/codeflow/cli/cf_audit.py +533 -0
  127. package/src/core/code-flow/scripts/codeflow/cli/cf_design_lint.py +172 -0
  128. package/src/core/code-flow/scripts/codeflow/cli/cf_evidence_import.py +607 -0
  129. package/src/core/code-flow/scripts/codeflow/cli/cf_feedback.py +53 -0
  130. package/src/core/code-flow/scripts/codeflow/cli/cf_scenarios.py +58 -0
  131. package/src/core/code-flow/scripts/codeflow/cli/cf_spec_context.py +1175 -0
  132. package/src/core/code-flow/scripts/codeflow/cli/cf_spec_gate.py +60 -0
  133. package/src/core/code-flow/scripts/codeflow/cli/cf_spec_session.py +46 -0
  134. package/src/core/code-flow/scripts/codeflow/cli/cf_stats.py +540 -0
  135. package/src/core/code-flow/scripts/codeflow/cli/cf_sync.py +144 -0
  136. package/src/core/code-flow/scripts/codeflow/cli/cf_task_index.py +177 -0
  137. package/src/core/code-flow/scripts/codeflow/cli/cf_task_parallel.py +1142 -0
  138. package/src/core/code-flow/scripts/codeflow/cli/cf_task_workflow.py +742 -0
  139. package/src/core/code-flow/scripts/codeflow/cli/cf_validation.py +31 -0
  140. package/src/core/code-flow/scripts/codeflow/core/__init__.py +0 -0
  141. package/src/core/code-flow/scripts/codeflow/core/cf_context_cache.py +67 -0
  142. package/src/core/code-flow/scripts/{cf_core.py → codeflow/core/cf_core.py} +119 -297
  143. package/src/core/code-flow/scripts/codeflow/core/cf_exec_base.py +325 -0
  144. package/src/core/code-flow/scripts/codeflow/core/cf_fs.py +57 -0
  145. package/src/core/code-flow/scripts/codeflow/core/cf_git.py +92 -0
  146. package/src/core/code-flow/scripts/{cf_log.py → codeflow/core/cf_log.py} +13 -7
  147. package/src/core/code-flow/scripts/codeflow/core/cf_markdown.py +77 -0
  148. package/src/core/code-flow/scripts/codeflow/core/cf_native_paths.py +26 -0
  149. package/src/core/code-flow/scripts/codeflow/core/cf_patch.py +33 -0
  150. package/src/core/code-flow/scripts/codeflow/core/cf_runtime_install.py +32 -0
  151. package/src/core/code-flow/scripts/codeflow/core/cf_stop_guard.py +53 -0
  152. package/src/core/code-flow/scripts/codeflow/core/cf_task_state.py +9 -0
  153. package/src/core/code-flow/scripts/codeflow/core/cf_validators.py +408 -0
  154. package/src/core/code-flow/scripts/codeflow/core/cf_worktree_env.py +253 -0
  155. package/src/core/code-flow/scripts/codeflow/evidence/__init__.py +0 -0
  156. package/src/core/code-flow/scripts/codeflow/evidence/cf_evidence_store.py +527 -0
  157. package/src/core/code-flow/scripts/codeflow/hooks/__init__.py +0 -0
  158. package/src/core/code-flow/scripts/codeflow/hooks/cf_codex_hook.py +95 -0
  159. package/src/core/code-flow/scripts/codeflow/hooks/cf_opencode_event.py +98 -0
  160. package/src/core/code-flow/scripts/codeflow/hooks/cf_post_hook.py +30 -0
  161. package/src/core/code-flow/scripts/codeflow/hooks/cf_pre_tool_hook.py +41 -0
  162. package/src/core/code-flow/scripts/codeflow/hooks/cf_stop_hook.py +292 -0
  163. package/src/core/code-flow/scripts/codeflow/hooks/cf_user_prompt_hook.py +161 -0
  164. package/src/core/code-flow/scripts/codeflow/spec/__init__.py +0 -0
  165. package/src/core/code-flow/scripts/codeflow/spec/cf_active_task.py +412 -0
  166. package/src/core/code-flow/scripts/codeflow/spec/cf_context_refresh.py +301 -0
  167. package/src/core/code-flow/scripts/codeflow/spec/cf_edit_service.py +149 -0
  168. package/src/core/code-flow/scripts/codeflow/spec/cf_injection.py +111 -0
  169. package/src/core/code-flow/scripts/codeflow/spec/cf_rule_readiness.py +114 -0
  170. package/src/core/code-flow/scripts/{cf_scan.py → codeflow/spec/cf_scan.py} +93 -21
  171. package/src/core/code-flow/scripts/codeflow/spec/cf_spec_budget.py +55 -0
  172. package/src/core/code-flow/scripts/codeflow/spec/cf_spec_context_model.py +477 -0
  173. package/src/core/code-flow/scripts/codeflow/spec/cf_spec_impact.py +119 -0
  174. package/src/core/code-flow/scripts/{cf_spec_metadata.py → codeflow/spec/cf_spec_metadata.py} +37 -3
  175. package/src/core/code-flow/scripts/{cf_spec_migrate.py → codeflow/spec/cf_spec_migrate.py} +27 -10
  176. package/src/core/code-flow/scripts/codeflow/spec/cf_spec_optimize.py +193 -0
  177. package/src/core/code-flow/scripts/codeflow/spec/cf_spec_optimize_apply.py +187 -0
  178. package/src/core/code-flow/scripts/{cf_spec_resolver.py → codeflow/spec/cf_spec_resolver.py} +39 -17
  179. package/src/core/code-flow/scripts/{cf_spec_router.py → codeflow/spec/cf_spec_router.py} +96 -36
  180. package/src/core/code-flow/scripts/{cf_spec_verify.py → codeflow/spec/cf_spec_verify.py} +252 -26
  181. package/src/core/code-flow/scripts/codeflow/spec/cf_stage_gate.py +330 -0
  182. package/src/core/code-flow/scripts/codeflow/spec/cf_task_projection.py +83 -0
  183. package/src/core/code-flow/scripts/codeflow/spec/cf_workflow_service.py +755 -0
  184. package/src/core/code-flow/scripts/{cf_workflow_transaction.py → codeflow/spec/cf_workflow_transaction.py} +29 -15
  185. package/src/core/code-flow/scripts/codeflow/task/__init__.py +0 -0
  186. package/src/core/code-flow/scripts/codeflow/task/cf_requirement_verification.py +867 -0
  187. package/src/core/code-flow/scripts/codeflow/task/cf_task_doc.py +178 -0
  188. package/src/core/code-flow/scripts/codeflow/task/cf_task_merge.py +635 -0
  189. package/src/core/code-flow/scripts/codeflow/task/cf_task_plan.py +251 -0
  190. package/src/core/code-flow/scripts/codeflow/task/cf_task_runtime.py +570 -0
  191. package/src/core/code-flow/scripts/codeflow/task/cf_validation_service.py +73 -0
  192. package/src/core/code-flow/scripts/runtime-resources.json +29 -0
  193. package/src/core/code-flow/specs/shared/design/design-frontend.md +18 -15
  194. package/src/core/code-flow/specs/shared/design/design-full.md +33 -23
  195. package/src/core/code-flow/specs/shared/design/design-lite.md +23 -13
  196. package/src/core/code-flow/specs/shared/scenarios-template.md +55 -0
  197. package/src/core/code-flow/validation.yml +9 -3
  198. package/src/migrate/runtime.js +213 -0
  199. package/src/migrate/spec-workflow.js +16 -1
  200. package/src/runtime.js +219 -0
  201. package/src/core/code-flow/scripts/cf_acceptance_evidence.py +0 -100
  202. package/src/core/code-flow/scripts/cf_acceptance_schema.py +0 -83
  203. package/src/core/code-flow/scripts/cf_exec_base.py +0 -112
  204. package/src/core/code-flow/scripts/cf_task_runtime.py +0 -299
  205. package/src/core/code-flow/scripts/cf_task_state.py +0 -3
  206. package/src/core/code-flow/scripts/cf_workflow_service.py +0 -366
  207. /package/src/core/code-flow/scripts/{cf_session_state.py → codeflow/core/cf_session_state.py} +0 -0
@@ -1,8 +1,3 @@
1
- ---
2
- description: 激活子任务并开始编码
3
- ---
4
-
5
-
6
1
  # cf-task:start
7
2
 
8
3
  激活子任务并开始编码。支持单任务模式和整文件模式。
@@ -34,7 +29,7 @@ description: 激活子任务并开始编码
34
29
 
35
30
  **#NOTES 检查**:扫描该子任务段落全文(Description、Checklist 等)
36
31
  - 如果存在 `#NOTES` 标记,说明用户 review 时留下了未讨论的问题,拒绝启动
37
- - 输出:`前置检查失败:以下 #NOTES 未解决\n- 密码加密存储 #NOTES 用 bcrypt 还是 argon2?\n- ...\n请先运行 /project:cf-task:note <file> TASK-xxx 讨论并解决`
32
+ - 输出:`前置检查失败:以下 #NOTES 未解决\n- 密码加密存储 #NOTES 用 bcrypt 还是 argon2?\n- ...\n请先运行 /cf-task:note <file> TASK-xxx 讨论并解决`
38
33
 
39
34
  **依赖检查**:读取 `Depends` 字段
40
35
  - 对每个依赖的 TASK-ID,在同文件中查找其 Status
@@ -46,6 +41,9 @@ description: 激活子任务并开始编码
46
41
  - `Acceptance-Refs` 中每个 S-/E-/B- 都必须出现在全局覆盖表和当前契约中,测试层级与关键真实边界必须和 design 一致
47
42
  - 旧 task 没有覆盖表但来源 design 含结构化验收场景时,先从 design 回填覆盖表与契约;回填完成前不得修改生产代码
48
43
  - 非行为类任务可显式写 `Acceptance-Refs: N/A`;不得用 N/A 跳过已有设计场景
44
+ - E2E 必须已通过 plan 精度门禁:P0/P1、`why_e2e`、`boundary`、非 smoke 的 `trigger_paths` 缺一不可;`start` 会在 `e2e_plan.quality.ok=false` 时阻断,不要手工改 manifest 绕过
45
+ - 有 canonical 场景源时,start 同时复核浏览器边界、expected_refs 和延后责任信息。沿用 plan 已登记的可收集测试骨架;按当前 TASK 补齐断言并执行 functional RED/GREEN;关键 E2E 可在相关批次完成后验证,剩余缺口由需求终验核对。
46
+ - 显式 `exec: deferred` 保留在 owned/smoke 提示中,但不进入 scheduled,也不在 Start 收集。旧锁文件缺少 `quality_schema: 2` 时保留原门禁并提示 `legacy_quality_schema`;按提示补字段、重锁和验证计划,不宣称新质量检查已通过。Done 阶段的显式延期场景允许 e2e_deferred,verified 仍须完整验收。
49
47
 
50
48
  ### 2. 加载详设上下文
51
49
 
@@ -66,12 +64,12 @@ description: 激活子任务并开始编码
66
64
 
67
65
  在改状态或生产代码前,顺序固定且不得跳步:
68
66
 
69
- 1. 调用 `cf_spec_context.py start --task-dir ... --root ... --task ... --task-file ... --json`,由单个进程按 refresh → active start → session 顺序执行 Start Gate;stdin JSON 传入逐路径确认的 `owned_paths`。stale/conflict、依赖未闭合、已有/损坏 marker、未归属 diff 或 hash 不一致立即阻断。禁止先 start 再 refresh,避免 active marker 在编码前自行漂移。前置硬门禁(blocked / #NOTES / 依赖)由 workflow service 在改状态前强制执行。用户已确认内容时,Design/Plan 的 pending 不单独阻止激活;不新增阶段状态门禁。
67
+ 1. 调用 `code-flow task start --task-dir ... --root ... --task ... --task-file ... --json`,由单个进程按 refresh → active start → session 顺序执行 Start Gate;stdin JSON 的 `owned_paths` 只填启动前已存在的未提交改动(逐路径确认归属),不是计划要改的文件;干净工作区传空数组(提交后的改动由基线并集自动纳入)。stale/conflict、依赖未闭合、已有/损坏 marker、未归属 diff 或 hash 不一致立即阻断。禁止先 start 再 refresh,避免 active marker 在编码前自行漂移。前置硬门禁(blocked / #NOTES / 依赖)由 workflow service 在改状态前强制执行。用户已确认内容时,Design/Plan 的 pending 不单独阻止激活;不新增阶段状态门禁。
70
68
  2. 从命令返回值读取 refresh 后的 Context hash、active 状态和 session 输出路径;该命令只根据当前 TASK 的 `Spec-Refs`、Source 与 Acceptance Contract 覆盖写入 `.code-flow/specs/_session/task-<name>.md`,禁止重新 catalog 或猜测规则。
71
69
  3. Start 返回成功时,workflow service 已通过可恢复事务同步 Status、started log 和 active marker;不要再手动改状态。失败保留原状态,按返回原因恢复。
72
- 4. 在修改任何生产代码前,为每个 Acceptance-Ref 填写测试文件、包含场景 ID 的测试用例名和可单独执行的命令(E2E 只登记,不在本阶段执行)
73
- 5. 先编写验收测试(E2E 只编写并登记)。E2E 测试必须经过契约声明的真实边界,不得用 mock 绕过 Store、Resolver、Builder、Renderer、Browser 等指定组件
74
- 6. 新功能或缺陷修复先执行一次测试并记录 RED:失败命令、失败用例和与预期缺陷对应的失败原因。纯重构或已有行为补测无法 RED 时,记录原因,不得伪造失败。E2E 场景不执行 RED,登记为 e2e_deferred 留给 verify-e2e
70
+ 4. 在修改任何生产代码前,为每个 Acceptance-Ref 填写测试文件、包含场景 ID 的测试用例名和可单独执行的命令(E2E 先登记真实边界与执行方式)
71
+ 5. 先编写验收测试(E2E 编写并登记真实边界)。从 `start` 返回的 `e2e_plan` 读取范围:只编写 `owned` 中的 E2E;`smoke` 由相关批次或需求级 verify 运行,不在本 TASK 重写;`deferred` 中的 E2E 不得顺手补。E2E 必须经过契约声明的真实边界,不得用 mock 绕过 Store、Resolver、Builder、Renderer、Browser 等指定组件
72
+ 6. E2E 只断言用户可观察结果和真实链路;禁止断言源码字符串、CSS、组件宽度、字段顺序、文案顺序。UI 布局/交互细节应下沉到 component 测试。关键 E2E 可随相关批次运行;未运行者登记为 e2e_deferred,终验检查剩余证据。新功能或缺陷修复先执行一次测试并记录 RED:失败命令、失败用例和与预期缺陷对应的失败原因;纯重构或已有行为补测无法 RED 时,记录原因,不得伪造失败
75
73
 
76
74
  RED 证据写入 `Acceptance Evidence`:
77
75
 
@@ -89,7 +87,7 @@ RED 证据写入 `Acceptance Evidence`:
89
87
 
90
88
  ### 3.2 GREEN 与验收证据
91
89
 
92
- 1. 执行 functional 验收和受影响范围的回归测试;E2E 只登记场景、断言、真实边界和命令,RED/GREEN 都不在编码阶段执行,统一留给 verify-e2e。
90
+ 1. 执行 functional 验收和受影响范围的回归测试;登记 E2E 场景、断言、真实边界和命令;按已就绪的相关批次运行关键 smoke,其余留作终验证据缺口;manual 场景只登记 `manual_pending`(原因、边界、验收方式),人工确认统一留给 verify-e2e。
93
91
  2. 对每个预期结果记录断言位置与 fixture/构造路径;环境未就绪的错误不得冒充有效 RED,明确记录尚未验证。
94
92
  3. 由 runner 写入最新状态和运行历史;不要覆盖原契约、RED 证据或历史失败。functional 必须 verified,已登记的 E2E 在实现阶段允许 e2e_deferred。
95
93
  4. 测试未收集、命令未实际执行或缺少关键断言,都不算验证完成。失败重跑必须使旧 verified 失效。
@@ -110,20 +108,25 @@ RED 证据写入 `Acceptance Evidence`:
110
108
 
111
109
  只有同时满足以下条件才能自动完成:
112
110
  - 所有 checklist 项均为 `[x]`
113
- - functional/manual 在契约、证据和覆盖表中均为 `verified`;仅 E2E 可为 `e2e_deferred`,仍不得遗留未登记的 `planned` / `pending` / `TBD`
111
+ - functional 在契约、证据和覆盖表中均为 `verified`;E2E 可为 `e2e_deferred`,`manual` 场景与 review 层 manual 规则延后到需求级终验由用户确认,仍不得遗留未登记的 `planned` / `pending` / `TBD`
114
112
  - 测试层级未低于 design,关键真实边界没有被 mock 绕过
115
- - 每个预期结果都有具体断言位置,functional 验收命令和回归测试均已实际通过;E2E 留到终验执行
116
- - `manual` 场景已有用户确认和可复核记录
113
+ - E2E 按 `e2e_plan.owned` 登记,没有把 `deferred` 场景补成本任务测试;新增 E2E 必须回到 plan 重新过质量门禁
114
+ - 每个预期结果都有具体断言位置,functional 验收命令和回归测试均已实际通过;相关批次关键 E2E 可先验证,终验补足证据缺口
115
+ - 显式 `stage: code` 的 manual 规则已有用户确认和可复核记录;默认 review 层的 manual 规则与 manual 场景在 verify-e2e 一次性确认
116
+
117
+ 普通 task 完成后,相关批次可执行 `code-flow task verify --task-dir "<需求目录>" --tasks TASK-001 --layers validators,e2e --profile smoke --root "$PWD" --json`。只选择依赖已就绪的关联 smoke;`not_ready` 或失败保留真实状态,不阻断无关任务。不要将全域浏览器或容量检查作为每个普通 task 的默认工作。
117
118
 
118
119
  满足后,执行唯一收尾入口:
119
120
 
120
121
  ```bash
121
- python3 .code-flow/scripts/cf_task_workflow.py finish --root "$PWD" --task-dir "<需求目录>" --task TASK-001 --json
122
+ code-flow task finish --root "$PWD" --task-dir "<需求目录>" --task TASK-001 --json
122
123
  ```
123
124
 
124
- 该命令先校验完整任务身份与锁定 manifest,再执行 Done Gate(acceptance 场景 + spec verifiers + 全量 validation.yml,含 heavy);通过后以可恢复事务更新 done、Log、Updated 并清理 marker。只有 `decision=pass` 才输出完成并启动下一 TASK。禁止手动设置 done 或传入自报的 gate_passed 绕过验证。
125
+ 该命令先校验完整任务身份与锁定 manifest,再执行 Done Gate:本任务范围(`Spec-Refs` ∪ 改动路径命中)的 code verifier + 本任务 acceptance 场景 + 轻量 validation.yml(不含 heavy);范围外且明确归属需求级 review 的 verifier 标记 `deferred_to_review`,`heavy: true` validator 标记 `deferred_heavy`,统一在需求级 verify-e2e / 归档全量补跑;本任务 required code 检查因预算、环境或其他原因未执行时进入 `provisional`,保留 active marker,补齐检查后重新执行 finish,不能标记 done;通过后以可恢复事务更新 done、Log、Updated 并清理 marker。只有 `decision=pass` 才输出完成并启动下一 TASK。禁止手动设置 done 或传入自报的 gate_passed 绕过验证。
125
126
 
126
- 任一验收条件不满足时保持 `in-progress`,明确列出缺口,不能标记为 `done`。
127
+ Done Gate 只执行 code 层验证;review 层 manual 规则与 manual 场景不逐任务确认,延后到需求级 verify-e2e(返回 `manual_confirmation_required` 时按该命令的「人工验收确认」流程一次性确认)。
128
+
129
+ 验收断言失败时保持 `in-progress`;required code 检查未执行时由运行时转为 `provisional`。明确列出缺口,不能标记为 `done`。
127
130
 
128
131
  ### 5. 文档同步检查
129
132
 
@@ -197,7 +200,7 @@ Spec 同步提示:
197
200
  #### 4.1 并行预检与 worktree 准备
198
201
 
199
202
  ```bash
200
- python3 .code-flow/scripts/cf_task_parallel.py prepare --root "$PWD" \
203
+ code-flow task parallel prepare --root "$PWD" \
201
204
  --task-file "<任务文件相对路径>" --tasks TASK-001,TASK-003 --json
202
205
  ```
203
206
 
@@ -209,52 +212,61 @@ python3 .code-flow/scripts/cf_task_parallel.py prepare --root "$PWD" \
209
212
  若当前平台提供子 agent/Task 派发能力,为本批次每个 TASK 各派发一个子 agent(同一批并发不超过 3,超出时按 TASK 顺序拆成多轮)。子 agent prompt 必须包含 worktree 绝对路径、TASK-ID、任务文件相对路径,并声明以下硬性要求:
210
213
 
211
214
  1. 进入 worktree:所有命令 `cd <worktree>` 执行,文件读写使用该 worktree 内路径。
212
- 2. 按本命令"单任务模式"步骤 1-4 完成该 TASK:`cf_spec_context.py start` → functional RED → 实现 → functional GREEN(E2E 只登记)→ `cf_task_workflow.py finish --root "<worktree>"`。
213
- 3. 平台 hook 注入绑定主工作区;子 agent 必须显式读取 Spec Session(`.code-flow/specs/_session/task-*.md`)与详设章节,不得依赖自动注入。
215
+ 2. 按本命令"单任务模式"步骤 1-4 完成该 TASK:`code-flow task start` → functional RED → 实现 → functional GREEN(E2E 按计划登记并在相关批次验证)→ `code-flow task finish --root "<worktree>"`。
216
+ 3. 平台 hook 注入绑定主工作区;子 agent 必须显式读取 Spec Session(路径取 start 返回的 `session_output`,默认 `.code-flow/specs/_session/task-<任务文件stem>.md`)与详设章节,不得依赖自动注入。
214
217
  4. 完成时在 worktree 内提交全部改动(含任务文件 Checklist/Evidence/Status 更新),提交信息 `cf-task(<TASK-ID>): <标题>`。
215
- 5. 返回摘要:TASK-ID、Status、验收命令及结果、提交 SHA、遗留问题。
218
+ 5. `finish` 返回 `decision: block` 时不得提交:保留现场,原样回报阻断原因(如 scope expansion 新增 required Spec、验收失败)与 `code-flow spec status --json` 输出,由主 agent 决定局部 Plan/Align、修复后重派或接管;不得自行 resume 绕过门禁。
219
+ 6. 返回摘要:TASK-ID、Status、验收命令及结果、提交 SHA、遗留问题。
220
+
221
+ 标准 worker prompt 模板(替换占位符后派发):
222
+
223
+ ```
224
+ 你在隔离 worktree 中执行 <TASK-ID>:<worktree 绝对路径>。
225
+ 1) cd 到 worktree;先读 Spec Session(start 返回的 session_output,默认 .code-flow/specs/_session/task-<任务文件stem>.md)、任务文件的当前 TASK 段落与 design 来源章节;
226
+ 2) code-flow task start → 写验收测试记录 RED → 实现 → GREEN;
227
+ 3) 运行 code-flow task finish --root "$PWD" --task <TASK-ID> --json;decision=pass 后【再】提交全部改动(含 finish 回写的 Evidence/状态):git add -A && git commit -m "cf-task(<TASK-ID>): <标题>";
228
+ 4) 返回摘要:TASK-ID、Status、验收命令与结果、commit SHA、遗留问题。
229
+ ```
230
+
231
+ > 提交必须在 finish 之后:finish 通过后会回写 Evidence/状态;collect 默认会自动提交这些回写,但显式提交更清晰。
232
+
233
+ 子 agent 中断(取消/超时)时不要重新 prepare:检查该 worktree 的 `git status`、`git log <base>..HEAD` 与 marker——
234
+ - 无改动且无 marker:直接接管,按单任务模式继续;
235
+ - 有未提交改动或已有提交但未 done:在 worktree 内接管收尾(补实现/测试并 finish),再走 4.3 collect;
236
+ - 已 done 且 marker 已清理:直接进入 4.3。
216
237
 
217
238
  平台不支持子 agent 时,不建 worktree,直接走 4.6 串行回退。
218
239
 
219
240
  #### 4.3 收集与校验
220
241
 
221
242
  ```bash
222
- python3 .code-flow/scripts/cf_task_parallel.py collect --root "$PWD" --run-id <run_id> --json
243
+ code-flow task parallel collect --root "$PWD" --run-id <run_id> --json
223
244
  ```
224
245
 
225
246
  - 每个任务必须 `ok: true`(改动已提交、Status 为 done/verified、marker 已清理、有提交)。
247
+ - `collect` 在任务 done/verified 且 marker 已清理后,会自动提交 finish 回写的 Evidence/状态(`--no-commit` 关闭并回到严格模式);finish 之外的未提交改动仍应人工确认。
226
248
  - 任一任务失败:停止本批次,不合并;保留 worktree 并列出失败原因。修复后重跑 collect;确认放弃时执行 4.5 cleanup。
227
249
 
228
250
  #### 4.4 回并主分支
229
251
 
230
- 按 TASK-ID 先后顺序逐个回并;先 rebase 再合并,让冲突只在任务自己的 worktree 内解决。
231
-
232
- 1. 取主工作区当前分支名(主工作区执行 `git rev-parse --abbrev-ref HEAD`,记为 <主分支>),在任务 worktree 内对齐:
252
+ 按 TASK-ID 先后顺序回并。统一入口自动完成:worktree 内 rebase → 状态文件冲突按确定性并集规则解决 → 主工作区 `--no-ff` 合并 → `code-flow spec refresh` 收敛 hash:
233
253
 
234
254
  ```bash
235
- cd <worktree> && git rebase <主分支>
255
+ code-flow task parallel merge --root "$PWD" --run-id <run_id> --json
236
256
  ```
237
257
 
238
- - rebase 冲突:读取冲突现场 + 本任务详设章节与 Acceptance Contract,合并双方意图(不是二选一);无法调和(设计要求互斥)→ `git rebase --abort`,保留现场与分支,列出矛盾点叫停交用户决策,不得擅自删除一方实现。
239
- - rebase 成功后重跑该任务的 functional 验收命令(E2E 留给 verify-e2e);失败则在 worktree 内修复并提交,再执行 4.3 collect 复核。
258
+ - 返回 `ok: true` 才继续;`already_merged` 表示该任务已并入(幂等,可重跑);任一任务失败即停止,修复后重跑 merge 续跑。
259
+ - `code_conflict`:代码文件冲突无法程序化合并(返回冲突文件列表,rebase 已中止、主工作区未受影响)。人工读取冲突现场 + 本任务详设章节与 Acceptance Contract,合并双方意图(不是二选一);无法调和(设计要求互斥)→ 保留现场与分支,列出矛盾点叫停交用户决策,不得擅自删除一方实现。解决后重跑 merge。
260
+ - 状态文件冲突(任务 md 覆盖状态列 / `spec-context.yml` / `.acceptance-manifest.json`)由 merge 自动按确定性并集规则处理,无需手工编辑:覆盖状态列两边各自 verified 的行均保留;`spec-context.yml` 取证据并集、verified 优先;manifest 按 verified/revision 合并。
261
+ - merge 成功后自动执行 `refresh` 并在结果中返回 `pass` / `block: ...`;随后重跑合并双方的 functional 验收与 `cf_spec_gate --stage code --json`,失败则记录合并前 HEAD 并 `git reset --hard <合并前HEAD>`(分支与 worktree 原样保留),回到 4.2 让对应子 agent 修复后重新 collect / merge。
262
+ - merge 运行关联批次 smoke;其他 E2E 由需求终验按证据缺口补验。
240
263
 
241
- 2. 回到主工作区合并(此时应无冲突):
242
-
243
- ```bash
244
- git merge --no-ff -m "merge cf-task <TASK-ID>" <branch>
245
- ```
246
-
247
- - 仍出现冲突(主区期间有新合并):按双方意图解决并重跑双方 functional 验收;通过后提交 merge。
248
- - 合并后验收失败:记录合并前 HEAD 并 `git reset --hard <合并前HEAD>`(分支与 worktree 原样保留),回到 4.2 让对应子 agent 修复后重新 collect / rebase / 合并。
249
-
250
- 3. 全部任务合并完成后进入 4.5 清理。
251
-
252
- - E2E 验收留给 verify-e2e,不在本步骤执行。
264
+ 全部任务合并完成后进入 4.5 清理。
253
265
 
254
266
  #### 4.5 清理
255
267
 
256
268
  ```bash
257
- python3 .code-flow/scripts/cf_task_parallel.py cleanup --root "$PWD" --run-id <run_id> --json
269
+ code-flow task parallel cleanup --root "$PWD" --run-id <run_id> --json
258
270
  ```
259
271
 
260
272
  清理 worktree;已合入的分支自动删除,未合入的保留供排查。worktree 存在未提交改动时 cleanup 会拒绝,先人工确认再决定处理方式。全部批次完成后进入步骤 5。
@@ -288,3 +300,18 @@ Spec 同步提示:
288
300
  ```
289
301
 
290
302
  3. 若需求目录已无 `draft` / `in-progress` / `blocked` 子任务,提示:运行 `/cf-task:verify-e2e <需求目录>` 执行延迟的 E2E 终验。
303
+
304
+ <!-- code-flow:runtime-commands start -->
305
+
306
+ 运行时命令示例(由命令契约生成;实际参数见各命令 --help):
307
+
308
+ ```bash
309
+ code-flow spec status --task-dir "<需求目录>" --root "$PWD" --json
310
+ code-flow spec refresh --task-dir "<需求目录>" --root "$PWD" --json
311
+ code-flow task start --task-dir "<需求目录>" --task-file "<任务文件>" --task TASK-001 --root "$PWD" --json
312
+ code-flow task finish --task-dir "<需求目录>" --task TASK-001 --root "$PWD" --json
313
+ code-flow task verify --task-dir "<需求目录>" --tasks TASK-001,TASK-002 --layers validators,e2e --profile smoke --root "$PWD" --json
314
+ code-flow task parallel --help
315
+ ```
316
+
317
+ <!-- code-flow:runtime-commands end -->
@@ -4,6 +4,19 @@ description: 显示任务状态总览
4
4
 
5
5
  # cf-task:status
6
6
 
7
+
8
+ ## 命令面(0.8)
9
+
10
+ `cf-task-status` 收敛了原先三个独立命令;旧命令保留一个 minor(0.9.0 移除):
11
+
12
+ | 子动作 | 等价旧命令 | 用途 |
13
+ |--------|-----------|------|
14
+ | `--notes` | `cf-task-note` | 讨论并收敛 `#NOTES` |
15
+ | `--block` | `cf-task-block` | 标记阻塞并记录原因 |
16
+ | `--graph` | `cf-task-graph` | 依赖 DAG 与并行批次 |
17
+
18
+ 带上述参数时,按对应旧命令章节的步骤执行;不带参数时行为不变。
19
+
7
20
  显示任务状态总览。
8
21
 
9
22
  ## 输入
@@ -1,15 +1,32 @@
1
1
  ---
2
- description: Execute deferred E2E scenarios after all functional tests pass
2
+ description: Run layered verification or full requirement verification, including deferred E2E
3
3
  globs: []
4
4
  ---
5
5
 
6
6
  # cf-task:verify-e2e
7
7
 
8
+
9
+ ## 验证子动作(0.8)
10
+
11
+ - `code-flow task verify --checks` — 等价于 `--layers validators`,是 `cf-validate` 的 0.8 入口。
12
+ - `code-flow task verify-e2e --checks` 同样只跑 validators;需要包含 heavy validator 时显式指定 `--profile full`。仅 validators 可在任务进行中运行,使用 active TASK 基线以来的变更,不推进任务状态。
13
+ - `cf-validate` 保留为兼容别名,0.9.0 移除。
14
+
8
15
  执行需求目录下被延迟的 E2E 验收场景。
9
16
 
10
17
  ## 使用场景
11
18
 
12
- E2E 测试依赖外部环境(数据库、API、浏览器等),在编码阶段默认跳过(状态 `e2e_deferred`)。当所有子任务的 functional 测试通过后,使用此命令统一执行 E2E 验收。
19
+ 本命令是**需求级终验**入口,在所有子任务的 functional 测试通过后统一执行:
20
+
21
+ 1. **全量 verifier**:需求目录全部 task context 绑定的 required rules(code 层被任务延后的 `deferred_to_review` + `stage: review` 重型验证),按 spec/rule 去重全量执行一次,证据写回全部相关 context;输出 `executed` / `reused` / `failed` 计数。
22
+ 2. **E2E 验收场景**:依赖外部环境(数据库、API、浏览器等)、编码阶段标记 `e2e_deferred` 的场景;已通过且工作树内容指纹未变的场景跨运行复用(不重复执行 E2E),内容变化/失败自动重跑,`code-flow acceptance run --no-cache` 可强制全量。
23
+ 3. **全量 validation**:执行 `validation.yml` 全部 validator(含 `heavy: true` 全量套件/构建/E2E);结果按工作树内容指纹缓存,归档复验命中即复用、不重复执行,`code-flow validate --no-cache` 强制重跑。
24
+
25
+ 失败不写 verified、不反转已 done 的任务状态;归档前必须 `decision=pass`。未声明 review verifier 且无 E2E 场景时为空操作(`reason=nothing_to_verify`)。
26
+
27
+ > 0.8 分层入口:`code-flow task verify --layers validators,review,e2e --profile smoke|changed|full`。每层独立返回 `decision/executed/reused/failed/env_blocked/incomplete`,`profile` 默认 `changed`,`full` 必须显式;`task verify-e2e` 保留为兼容别名(全层 + full)。
28
+ >
29
+ > E2E 也按范围执行:`profile=changed` 只跑 `trigger_paths` 命中当前 diff 的 E2E,没有 `trigger_paths` 的 smoke E2E 不会在 changed 中顺跑;`profile=smoke` 只跑标记 `smoke` / `profile=smoke` 的 E2E(旧计划没有 smoke 标记时才回退全量 E2E)。不要把全量 E2E 当成每个小改动的默认门禁。
13
30
 
14
31
  ## 调用方式
15
32
 
@@ -27,58 +44,69 @@ E2E 测试依赖外部环境(数据库、API、浏览器等),在编码阶
27
44
  rg "^- \*\*Status\*\*:" <需求目录>/*.md
28
45
  ```
29
46
 
30
- 如有 `in-progress` 或 `blocked` 任务,提示用户先完成。
47
+ 本步骤只适用于包含 review/e2e 的需求验证。如有 `in-progress` 或 `blocked` 任务,先完成任务;仅 `--checks` / `--layers validators` 不要求任务 done,但仍校验 active Context 与需求身份。
31
48
 
32
49
  ### 2. 检查环境依赖
33
50
 
34
- 读取 `.acceptance-manifest.json` 中的 E2E 场景,提取所需的外部依赖(从 `boundary` 字段推断):
51
+ 读取所选 checks 的 `env`、`env_scope`、`preflight` 声明。运行时在实际执行 check 前自动运行 preflight;已有有效证据时允许复用。不要从 `boundary` 猜测端口、数据库或驱动,也不要固定询问环境是否就绪。
35
52
 
36
- - `HTTP API` → 提示确认 API 服务运行中
37
- - `Browser` → 提示确认浏览器驱动已安装
38
- - `Database` → 提示确认测试数据库可访问
53
+ 收到 `env_blocked` 时,展示 `env_blocked_details` 中的 check ID、owner、失败的 preflight 命令、退出码和输出。根据真实失败修复可处理的本地问题;只有缺少外部配置、需要用户启动外部环境或涉及权限时请求用户输入。未声明 preflight 的检查仍按真实执行结果判断,不能自报环境已通过。
39
54
 
40
- 显示清单并询问:
55
+ ### 3. 执行 E2E 场景
41
56
 
42
- ```
43
- E2E 场景需要以下环境:
44
- - 本地 API 服务 (http://localhost:3000)
45
- - PostgreSQL 测试数据库
46
- - Chrome WebDriver
57
+ 用户请求需求级终验时,执行:
47
58
 
48
- 环境已就绪?(y/N)
59
+ ```bash
60
+ code-flow task verify \
61
+ --task-dir "<需求目录>" --root "$PWD" \
62
+ --layers validators,review,e2e --profile full --json
49
63
  ```
50
64
 
51
- ### 3. 执行 E2E 场景
65
+ 相关批次使用 `code-flow task verify --tasks TASK-001,TASK-002 --layers validators,e2e --profile smoke`;部分通过仅表示所选范围通过,不提升整个需求。日常增量验证使用 `--profile changed`,明确只跑 smoke 时使用 `--profile smoke`;不要把增量请求升级成全量。`code-flow task verify-e2e` 保留为默认全层 full 的兼容入口。仅检查代码时使用 `code-flow task verify --checks --task-dir "<需求目录>" --root "$PWD" --json`。
66
+
67
+ 全量终验重新检查所有 TASK、锁定 manifest 与 functional/manual 最新证据,执行全量 validation(含 heavy)和 code+review verifier(含 deferred 项)。runner 按范围执行 acceptance:仅 E2E 的路径使用 `--only-e2e`,full 或 functional 证据过期时同时复验所需 functional。只有全层 full 通过才将任务提升为 verified;单层、changed、smoke 通过均不推进状态。不得手动改状态。
52
68
 
53
- 用户确认后,执行:
69
+ ### 4. 人工验收确认(manual_confirmation_required)
70
+
71
+ 需求中的 manual 验收默认落 review 层,编码阶段不逐任务打断,统一在这里确认。`verify-e2e` 返回 `reason=manual_confirmation_required` 时:
72
+
73
+ 1. 向用户完整展示 `manual_rules`(spec 规则、checklist、owner)与 `manual_scenarios`(场景 ID、真实边界),一次性请求确认;用户只确认部分时记录未确认的 ref/id。
74
+ 2. 用户明确回复后执行(`--confirmed-by` 必须是用户身份,Agent 不得代确认;`--source` 填写用户回复原文):
54
75
 
55
76
  ```bash
56
- python3 .code-flow/scripts/cf_task_workflow.py verify-e2e \
57
- --task-dir "<需求目录>" --root "$PWD" --json
77
+ code-flow task confirm-manual \
78
+ --task-dir "<需求目录>" --root "$PWD" \
79
+ --confirmed-by "user:<用户>" --source "<用户回复原文>" --json
58
80
  ```
59
81
 
60
- 该入口重新检查所有 TASK、锁定 manifest 和 functional/manual 最新证据,内部以 `--only-e2e` 调用 runner;只有全通过才把任务提升为 verified。不得手动改状态。
82
+ 部分确认时追加 `--refs <spec#RULE,...>` 与/或 `--scenarios <S-01,...>`。
83
+ 3. 重跑 `verify-e2e`;全部通过后任务才提升为 `verified`。
84
+
85
+ > 显式声明 `stage: code` 的 manual 规则仍在任务 Done Gate 逐个确认,属于有意保留的强门禁。
61
86
 
62
- ### 4. 报告结果
87
+ ### 5. 报告结果
63
88
 
64
89
  解析执行结果:
65
90
 
66
91
  ```json
67
92
  {
68
93
  "decision": "block",
69
- "results": [
70
- {"id": "E-01", "kind": "e2e", "status": "passed"},
71
- {"id": "E-02", "kind": "e2e", "status": "failed", "exit_code": 1}
72
- ]
94
+ "layers": {
95
+ "e2e": {
96
+ "decision": "block",
97
+ "checks": [{"id": "CHK-B", "status": "failed", "scenarios": ["E-02"]}]
98
+ }
99
+ }
73
100
  }
74
101
  ```
75
102
 
76
- - `decision=pass`:所有 E2E 场景通过,提示"E2E 验收完成"
77
- - `decision=block`:有失败场景,列出失败的场景 ID 和错误信息
103
+ - `decision=pass`:报告实际 `selected_layers`、`profile`、执行与复用计数,不将部分范围通过报告为全量终验完成
104
+ - `decision=block`:列出失败层、场景 ID 与 check ID,从 `check_results` 或 `env_blocked_details` 展示对应命令、退出码和错误输出
105
+ - `reason=manual_confirmation_required`:先按「人工验收确认」章节取得用户确认并执行 `confirm-manual`,再重跑本命令
78
106
 
79
- ### 5. 更新任务状态
107
+ ### 6. 更新任务状态
80
108
 
81
- 确认命令已将需求目录下所有任务 Status 更新为 `verified`,并保留原契约与运行历史。无需再次编辑状态。
109
+ 全层 full 通过后确认运行时已将任务 Status 更新为 `verified`,并保留原契约与运行历史。其他验证范围保留原状态。无需再次编辑状态。
82
110
 
83
111
  ## 失败处理
84
112
 
@@ -86,7 +114,7 @@ E2E 失败时:
86
114
 
87
115
  1. 显示失败场景的完整命令和退出码
88
116
  2. 提示查看 `.acceptance-manifest.json` 中的 `evidence` 字段
89
- 3. 不自动修改任务状态,等待用户修复后重新执行
117
+ 3. 修复可处理的问题后重跑所选范围;缺少用户输入时报告具体阻塞,不自动修改任务状态
90
118
 
91
119
  ## 示例
92
120
 
@@ -95,11 +123,7 @@ E2E 失败时:
95
123
 
96
124
  > 检查子任务状态... 所有任务已完成
97
125
  >
98
- > E2E 场景需要以下环境:
99
- > - 本地 API 服务 (http://localhost:3000)
100
- > - PostgreSQL 测试数据库 (postgresql://localhost:5432/test)
101
- >
102
- > 环境已就绪?(y/N) y
126
+ > 按 checks 声明执行 preflight... 通过
103
127
  >
104
128
  > 执行 E2E 场景...
105
129
  > ✓ E-01: 用户登录流程 (1.2s)
@@ -108,3 +132,17 @@ E2E 失败时:
108
132
  > E2E 验收完成!2/2 场景通过
109
133
  > 已更新任务状态为 verified
110
134
  ```
135
+
136
+ <!-- code-flow:runtime-commands start -->
137
+
138
+ 运行时命令示例(由命令契约生成;实际参数见各命令 --help):
139
+
140
+ ```bash
141
+ code-flow task verify --task-dir "<需求目录>" --tasks TASK-001,TASK-002 --layers validators,e2e --profile smoke --root "$PWD" --json
142
+ code-flow task verify-e2e --task-dir "<需求目录>" --root "$PWD" --json
143
+ code-flow task confirm-manual --help
144
+ code-flow acceptance run --manifest "<需求目录>/.acceptance-manifest.json" --root "$PWD" --write-evidence
145
+ code-flow validate --root "$PWD" --json
146
+ ```
147
+
148
+ <!-- code-flow:runtime-commands end -->
@@ -2,15 +2,18 @@
2
2
  description: 根据变更文件自动匹配并执行验证规则
3
3
  ---
4
4
 
5
+
5
6
  # cf-validate
6
7
 
8
+ > **命令面状态(0.8)**:alias — 等价于 `cf-task-verify-e2e --checks`(运行时 `code-flow task verify --checks`);保留一个 minor,0.9.0 移除。
9
+
7
10
  根据变更文件自动匹配并执行验证规则(测试、类型检查、lint),失败时自动尝试修复。
8
11
 
9
12
  ## 输入
10
13
 
11
- - `/project:cf-validate` — 自动获取任务基线或 Git 全部变更文件
12
- - `/project:cf-validate src/Foo.tsx` — 验证指定文件
13
- - `/project:cf-validate --files=src/a.ts,src/b.ts` — 验证多个文件
14
+ - `/cf-validate` — 自动获取任务基线或 Git 全部变更文件
15
+ - `/cf-validate src/Foo.tsx` — 验证指定文件
16
+ - `/cf-validate --files=src/a.ts,src/b.ts` — 验证多个文件
14
17
 
15
18
  ## 执行步骤
16
19
 
@@ -19,7 +22,7 @@ description: 根据变更文件自动匹配并执行验证规则
19
22
  用 Bash 执行:
20
23
 
21
24
  ```bash
22
- python3 .code-flow/scripts/cf_validation.py --root "$PWD" --scope-only --json
25
+ code-flow validate --root "$PWD" --scope-only --json
23
26
  ```
24
27
 
25
28
  有 active TASK 时使用冻结基线以来的全部任务变更(含已提交文件);无 active TASK 时包含暂存、未暂存和未跟踪文件。用户指定路径时用 `--files "src/a.py" "src/b.py"` 原样传递;若结果确实为空才输出“无变更需要验证”。
@@ -36,21 +39,33 @@ validators:
36
39
  trigger: "**/*.{ts,tsx}"
37
40
  command: "npx tsc --noEmit"
38
41
  timeout: 30000
39
- heavy: false # true = Stop 每轮跳过,finish 与 /cf-validate 执行
42
+ heavy: false # true = Stop 与 finish 跳过,需求终验与 /cf-validate 执行
40
43
  on_fail: "修复建议"
41
44
  ```
42
45
 
43
- 全量测试 / e2e 等慢命令标 `heavy: true`:Stop 每轮跳过,**任务 finish 自动执行一次**,也可显式运行 `/cf-validate`(或 CI),避免拖慢每个任务。
46
+ 全量测试 / e2e 等慢命令标 `heavy: true`:Stop 与任务 finish 跳过,由需求终验 / 归档执行,也可显式运行 `/cf-validate`(或 CI),避免拖慢每个任务。
44
47
 
45
48
  ### 3. 匹配并执行验证
46
49
 
47
50
  执行统一验证入口:
48
51
 
52
+ 文末是通用入口示例;本技能的实际调用使用以下 validators 范围,不额外执行 review/e2e。
53
+
54
+ - 有 active TASK 时走任务验证入口(`--checks` 等价于 `--layers validators`):
55
+
56
+ ```bash
57
+ code-flow task verify --checks --profile full --task-dir "<需求目录>" --root "$PWD" --json
58
+ ```
59
+
60
+ - 无 active TASK 或用户显式指定文件时走变更验证入口:
61
+
49
62
  ```bash
50
- python3 .code-flow/scripts/cf_validation.py --root "$PWD" --json
63
+ code-flow validate --root "$PWD" --json
51
64
  ```
52
65
 
53
- 显式范围追加 `--files "src/a.py" "src/b.py"`。程序匹配 trigger、解析 argv 并展开 `{files}`,不拼接 shell 命令;同一运行内相同 argv/cwd/timeout 去重,跨运行不复用。删除文件仍触发全局测试,但不传给文件级编译器。每条 timeout 仍按配置的毫秒值生效,总预算耗尽返回 incomplete/block。
66
+ 仅 validators 支持任务进行中运行,不要求所有 TASK 完成,也不推进任务状态;active Context 损坏或身份不匹配仍阻断。`--profile full` 包含 heavy validator;只做轻量检查时明确使用 `--profile changed`。
67
+
68
+ 显式范围在 `code-flow validate` 后追加 `--files "src/a.py" "src/b.py"`。程序匹配 trigger、解析 argv 并展开 `{files}`,不拼接 shell 命令;通过结果按工作树内容指纹跨运行复用(失败永不缓存,需要强制重跑时使用 `code-flow validate --no-cache`),同一运行内相同 argv/cwd/timeout 去重。删除文件仍触发全局测试,但不传给文件级编译器。每条 timeout 仍按配置的毫秒值生效,总预算耗尽返回 incomplete/block。
54
69
 
55
70
  ### 4. 汇总结果
56
71
 
@@ -63,7 +78,7 @@ python3 .code-flow/scripts/cf_validation.py --root "$PWD" --json
63
78
 
64
79
  ### 5. 自动修复
65
80
 
66
- 对于失败的验证项,根据错误输出分析问题根因,自动尝试修复代码。修复后提示用户再次运行 `/project:cf-validate` 确认。
81
+ 对于失败的验证项,根据错误输出分析问题根因,自动尝试修复代码。修复后提示用户再次运行 `/cf-validate` 确认。
67
82
 
68
83
  ## 安全设计
69
84
 
@@ -77,3 +92,14 @@ python3 .code-flow/scripts/cf_validation.py --root "$PWD" --json
77
92
  - 命令执行超时 → 输出超时提示,建议增大 timeout 或缩小验证范围
78
93
  - 命令不存在或配置无效 → 返回 block 并提示所缺依赖,不当作验证通过
79
94
  - 无变更文件 → 输出"无变更需要验证"
95
+
96
+ <!-- code-flow:runtime-commands start -->
97
+
98
+ 运行时命令示例(由命令契约生成;实际参数见各命令 --help):
99
+
100
+ ```bash
101
+ code-flow task verify --task-dir "<需求目录>" --tasks TASK-001,TASK-002 --layers validators,e2e --profile smoke --root "$PWD" --json
102
+ code-flow validate --root "$PWD" --json
103
+ ```
104
+
105
+ <!-- code-flow:runtime-commands end -->