@michaelxwb/code-flow 0.6.5 → 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 -42
  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 +52 -39
  25. package/src/adapters/claude/commands/cf-task/status.md +12 -0
  26. package/src/adapters/claude/commands/cf-task/verify-e2e.md +68 -35
  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 -42
  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 +52 -39
  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 +69 -35
  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 -42
  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 +52 -39
  59. package/src/adapters/costrict/commands/cf-task/status.md +12 -0
  60. package/src/adapters/costrict/commands/cf-task/verify-e2e.md +68 -35
  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 -42
  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 +53 -45
  77. package/src/adapters/opencode/commands/cf-task/status.md +13 -0
  78. package/src/adapters/opencode/commands/cf-task/verify-e2e.md +68 -35
  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 -1741
  97. package/src/core/code-flow/scripts/cf_spec_gate.py +5 -259
  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 -389
  104. package/src/core/code-flow/scripts/cf_task_workflow.py +6 -201
  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} +5 -2
  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} +163 -35
  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 -304
  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
@@ -42,6 +42,9 @@ description: Activate a subtask and begin coding. Runs pre-checks (status, #NOTE
42
42
  - `Acceptance-Refs` 中每个 S-/E-/B- 都必须出现在全局覆盖表和当前契约中,测试层级与关键真实边界必须和 design 一致
43
43
  - 旧 task 没有覆盖表但来源 design 含结构化验收场景时,先从 design 回填覆盖表与契约;回填完成前不得修改生产代码
44
44
  - 非行为类任务可显式写 `Acceptance-Refs: N/A`;不得用 N/A 跳过已有设计场景
45
+ - E2E 必须已通过 plan 精度门禁:P0/P1、`why_e2e`、`boundary`、非 smoke 的 `trigger_paths` 缺一不可;`start` 会在 `e2e_plan.quality.ok=false` 时阻断,不要手工改 manifest 绕过
46
+ - 有 canonical 场景源时,start 同时复核浏览器边界、expected_refs 和延后责任信息。沿用 plan 已登记的可收集测试骨架;按当前 TASK 补齐断言并执行 functional RED/GREEN;关键 E2E 可在相关批次完成后验证,剩余缺口由需求终验核对。
47
+ - 显式 `exec: deferred` 保留在 owned/smoke 提示中,但不进入 scheduled,也不在 Start 收集。旧锁文件缺少 `quality_schema: 2` 时保留原门禁并提示 `legacy_quality_schema`;按提示补字段、重锁和验证计划,不宣称新质量检查已通过。Done 阶段的显式延期场景允许 e2e_deferred,verified 仍须完整验收。
45
48
 
46
49
  ### 2. 加载详设上下文
47
50
 
@@ -62,12 +65,12 @@ description: Activate a subtask and begin coding. Runs pre-checks (status, #NOTE
62
65
 
63
66
  在改状态或生产代码前,顺序固定且不得跳步:
64
67
 
65
- 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 不单独阻止激活;不新增阶段状态门禁。
68
+ 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 不单独阻止激活;不新增阶段状态门禁。
66
69
  2. 从命令返回值读取 refresh 后的 Context hash、active 状态和 session 输出路径;该命令只根据当前 TASK 的 `Spec-Refs`、Source 与 Acceptance Contract 覆盖写入 `.code-flow/specs/_session/task-<name>.md`,禁止重新 catalog 或猜测规则。
67
70
  3. Start 返回成功时,workflow service 已通过可恢复事务同步 Status、started log 和 active marker;不要再手动改状态。失败保留原状态,按返回原因恢复。
68
- 4. 在修改任何生产代码前,为每个 Acceptance-Ref 填写测试文件、包含场景 ID 的测试用例名和可单独执行的命令(E2E 只登记,不在本阶段执行)
69
- 5. 先编写验收测试(E2E 只编写并登记)。E2E 测试必须经过契约声明的真实边界,不得用 mock 绕过 Store、Resolver、Builder、Renderer、Browser 等指定组件
70
- 6. 新功能或缺陷修复先执行一次测试并记录 RED:失败命令、失败用例和与预期缺陷对应的失败原因。纯重构或已有行为补测无法 RED 时,记录原因,不得伪造失败。E2E 场景不执行 RED,登记为 e2e_deferred 留给 verify-e2e
71
+ 4. 在修改任何生产代码前,为每个 Acceptance-Ref 填写测试文件、包含场景 ID 的测试用例名和可单独执行的命令(E2E 先登记真实边界与执行方式)
72
+ 5. 先编写验收测试(E2E 编写并登记真实边界)。从 `start` 返回的 `e2e_plan` 读取范围:只编写 `owned` 中的 E2E;`smoke` 由相关批次或需求级 verify 运行,不在本 TASK 重写;`deferred` 中的 E2E 不得顺手补。E2E 必须经过契约声明的真实边界,不得用 mock 绕过 Store、Resolver、Builder、Renderer、Browser 等指定组件
73
+ 6. E2E 只断言用户可观察结果和真实链路;禁止断言源码字符串、CSS、组件宽度、字段顺序、文案顺序。UI 布局/交互细节应下沉到 component 测试。关键 E2E 可随相关批次运行;未运行者登记为 e2e_deferred,终验检查剩余证据。新功能或缺陷修复先执行一次测试并记录 RED:失败命令、失败用例和与预期缺陷对应的失败原因;纯重构或已有行为补测无法 RED 时,记录原因,不得伪造失败
71
74
 
72
75
  RED 证据写入 `Acceptance Evidence`:
73
76
 
@@ -85,7 +88,7 @@ RED 证据写入 `Acceptance Evidence`:
85
88
 
86
89
  ### 3.2 GREEN 与验收证据
87
90
 
88
- 1. 执行 functional 验收和受影响范围的回归测试;E2E 只登记场景、断言、真实边界和命令,RED/GREEN 都不在编码阶段执行,统一留给 verify-e2e。
91
+ 1. 执行 functional 验收和受影响范围的回归测试;登记 E2E 场景、断言、真实边界和命令;按已就绪的相关批次运行关键 smoke,其余留作终验证据缺口;manual 场景只登记 `manual_pending`(原因、边界、验收方式),人工确认统一留给 verify-e2e。
89
92
  2. 对每个预期结果记录断言位置与 fixture/构造路径;环境未就绪的错误不得冒充有效 RED,明确记录尚未验证。
90
93
  3. 由 runner 写入最新状态和运行历史;不要覆盖原契约、RED 证据或历史失败。functional 必须 verified,已登记的 E2E 在实现阶段允许 e2e_deferred。
91
94
  4. 测试未收集、命令未实际执行或缺少关键断言,都不算验证完成。失败重跑必须使旧 verified 失效。
@@ -106,20 +109,25 @@ RED 证据写入 `Acceptance Evidence`:
106
109
 
107
110
  只有同时满足以下条件才能自动完成:
108
111
  - 所有 checklist 项均为 `[x]`
109
- - functional/manual 在契约、证据和覆盖表中均为 `verified`;仅 E2E 可为 `e2e_deferred`,仍不得遗留未登记的 `planned` / `pending` / `TBD`
112
+ - functional 在契约、证据和覆盖表中均为 `verified`;E2E 可为 `e2e_deferred`,`manual` 场景与 review 层 manual 规则延后到需求级终验由用户确认,仍不得遗留未登记的 `planned` / `pending` / `TBD`
110
113
  - 测试层级未低于 design,关键真实边界没有被 mock 绕过
111
- - 每个预期结果都有具体断言位置,functional 验收命令和回归测试均已实际通过;E2E 留到终验执行
112
- - `manual` 场景已有用户确认和可复核记录
114
+ - E2E 按 `e2e_plan.owned` 登记,没有把 `deferred` 场景补成本任务测试;新增 E2E 必须回到 plan 重新过质量门禁
115
+ - 每个预期结果都有具体断言位置,functional 验收命令和回归测试均已实际通过;相关批次关键 E2E 可先验证,终验补足证据缺口
116
+ - 显式 `stage: code` 的 manual 规则已有用户确认和可复核记录;默认 review 层的 manual 规则与 manual 场景在 verify-e2e 一次性确认
117
+
118
+ 普通 task 完成后,相关批次可执行 `code-flow task verify --task-dir "<需求目录>" --tasks TASK-001 --layers validators,e2e --profile smoke --root "$PWD" --json`。只选择依赖已就绪的关联 smoke;`not_ready` 或失败保留真实状态,不阻断无关任务。不要将全域浏览器或容量检查作为每个普通 task 的默认工作。
113
119
 
114
120
  满足后,执行唯一收尾入口:
115
121
 
116
122
  ```bash
117
- python3 .code-flow/scripts/cf_task_workflow.py finish --root "$PWD" --task-dir "<需求目录>" --task TASK-001 --json
123
+ code-flow task finish --root "$PWD" --task-dir "<需求目录>" --task TASK-001 --json
118
124
  ```
119
125
 
120
- 该命令先校验完整任务身份与锁定 manifest,再执行 Done Gate(acceptance 场景 + spec verifiers + 全量 validation.yml,含 heavy);通过后以可恢复事务更新 done、Log、Updated 并清理 marker。只有 `decision=pass` 才输出完成并启动下一 TASK。禁止手动设置 done 或传入自报的 gate_passed 绕过验证。
126
+ 该命令先校验完整任务身份与锁定 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 绕过验证。
127
+
128
+ Done Gate 只执行 code 层验证;review 层 manual 规则与 manual 场景不逐任务确认,延后到需求级 verify-e2e(返回 `manual_confirmation_required` 时按该命令的「人工验收确认」流程一次性确认)。
121
129
 
122
- 任一验收条件不满足时保持 `in-progress`,明确列出缺口,不能标记为 `done`。
130
+ 验收断言失败时保持 `in-progress`;required code 检查未执行时由运行时转为 `provisional`。明确列出缺口,不能标记为 `done`。
123
131
 
124
132
  ### 5. 文档同步检查
125
133
 
@@ -193,7 +201,7 @@ Spec 同步提示:
193
201
  #### 4.1 并行预检与 worktree 准备
194
202
 
195
203
  ```bash
196
- python3 .code-flow/scripts/cf_task_parallel.py prepare --root "$PWD" \
204
+ code-flow task parallel prepare --root "$PWD" \
197
205
  --task-file "<任务文件相对路径>" --tasks TASK-001,TASK-003 --json
198
206
  ```
199
207
 
@@ -205,18 +213,19 @@ python3 .code-flow/scripts/cf_task_parallel.py prepare --root "$PWD" \
205
213
  若当前平台提供子 agent/Task 派发能力,为本批次每个 TASK 各派发一个子 agent(同一批并发不超过 3,超出时按 TASK 顺序拆成多轮)。子 agent prompt 必须包含 worktree 绝对路径、TASK-ID、任务文件相对路径,并声明以下硬性要求:
206
214
 
207
215
  1. 进入 worktree:所有命令 `cd <worktree>` 执行,文件读写使用该 worktree 内路径。
208
- 2. 按上文"单任务模式"步骤 1-4 完成该 TASK:`cf_spec_context.py start` → functional RED → 实现 → functional GREEN(E2E 只登记)→ `cf_task_workflow.py finish --root "<worktree>"`。
209
- 3. 平台 hook 注入绑定主工作区;子 agent 必须显式读取 Spec Session(`.code-flow/specs/_session/task-*.md`)与详设章节,不得依赖自动注入。
216
+ 2. 按本命令"单任务模式"步骤 1-4 完成该 TASK:`code-flow task start` → functional RED → 实现 → functional GREEN(E2E 按计划登记并在相关批次验证)→ `code-flow task finish --root "<worktree>"`。
217
+ 3. 平台 hook 注入绑定主工作区;子 agent 必须显式读取 Spec Session(路径取 start 返回的 `session_output`,默认 `.code-flow/specs/_session/task-<任务文件stem>.md`)与详设章节,不得依赖自动注入。
210
218
  4. 完成时在 worktree 内提交全部改动(含任务文件 Checklist/Evidence/Status 更新),提交信息 `cf-task(<TASK-ID>): <标题>`。
211
- 5. 返回摘要:TASK-ID、Status、验收命令及结果、提交 SHA、遗留问题。
219
+ 5. `finish` 返回 `decision: block` 时不得提交:保留现场,原样回报阻断原因(如 scope expansion 新增 required Spec、验收失败)与 `code-flow spec status --json` 输出,由主 agent 决定局部 Plan/Align、修复后重派或接管;不得自行 resume 绕过门禁。
220
+ 6. 返回摘要:TASK-ID、Status、验收命令及结果、提交 SHA、遗留问题。
212
221
 
213
222
  标准 worker prompt 模板(替换占位符后派发):
214
223
 
215
224
  ```
216
225
  你在隔离 worktree 中执行 <TASK-ID>:<worktree 绝对路径>。
217
- 1) cd 到 worktree;先读 Spec Session(.code-flow/specs/_session/task-<name>.md)、任务文件的当前 TASK 段落与 design 来源章节;
218
- 2) cf_spec_context.py start → 写验收测试记录 RED → 实现 → GREEN;
219
- 3) 运行 cf_task_workflow.py finish --root "$PWD" --task <TASK-ID> --json;decision=pass 后【再】提交全部改动(含 finish 回写的 Evidence/状态):git add -A && git commit -m "cf-task(<TASK-ID>): <标题>";
226
+ 1) cd 到 worktree;先读 Spec Session(start 返回的 session_output,默认 .code-flow/specs/_session/task-<任务文件stem>.md)、任务文件的当前 TASK 段落与 design 来源章节;
227
+ 2) code-flow task start → 写验收测试记录 RED → 实现 → GREEN;
228
+ 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>): <标题>";
220
229
  4) 返回摘要:TASK-ID、Status、验收命令与结果、commit SHA、遗留问题。
221
230
  ```
222
231
 
@@ -232,7 +241,7 @@ python3 .code-flow/scripts/cf_task_parallel.py prepare --root "$PWD" \
232
241
  #### 4.3 收集与校验
233
242
 
234
243
  ```bash
235
- python3 .code-flow/scripts/cf_task_parallel.py collect --root "$PWD" --run-id <run_id> --json
244
+ code-flow task parallel collect --root "$PWD" --run-id <run_id> --json
236
245
  ```
237
246
 
238
247
  - 每个任务必须 `ok: true`(改动已提交、Status 为 done/verified、marker 已清理、有提交)。
@@ -241,35 +250,24 @@ python3 .code-flow/scripts/cf_task_parallel.py collect --root "$PWD" --run-id <r
241
250
 
242
251
  #### 4.4 回并主分支
243
252
 
244
- 按 TASK-ID 先后顺序逐个回并;先 rebase 再合并,让冲突只在任务自己的 worktree 内解决。
245
-
246
- 1. 取主工作区当前分支名(主工作区执行 `git rev-parse --abbrev-ref HEAD`,记为 <主分支>),在任务 worktree 内对齐:
247
-
248
- ```bash
249
- cd <worktree> && git rebase <主分支>
250
- ```
251
-
252
- - rebase 冲突:读取冲突现场 + 本任务详设章节与 Acceptance Contract,合并双方意图(不是二选一);无法调和(设计要求互斥)→ `git rebase --abort`,保留现场与分支,列出矛盾点叫停交用户决策,不得擅自删除一方实现。
253
- - rebase 成功后重跑该任务的 functional 验收命令(E2E 留给 verify-e2e);失败则在 worktree 内修复并提交,再执行 4.3 collect 复核。
254
-
255
- 2. 回到主工作区合并(此时应无冲突):
253
+ 按 TASK-ID 先后顺序回并。统一入口自动完成:worktree 内 rebase → 状态文件冲突按确定性并集规则解决 → 主工作区 `--no-ff` 合并 → `code-flow spec refresh` 收敛 hash:
256
254
 
257
255
  ```bash
258
- git merge --no-ff -m "merge cf-task <TASK-ID>" <branch>
256
+ code-flow task parallel merge --root "$PWD" --run-id <run_id> --json
259
257
  ```
260
258
 
261
- - 仍出现冲突(主区期间有新合并):按双方意图解决并重跑双方 functional 验收;通过后提交 merge。
262
- - 状态文件冲突(`spec-context.yml` / 任务 md 的覆盖状态列 / `.acceptance-manifest.json`)按确定性优先级解决:覆盖状态列取并集(两边各自 verified 的行保留 verified);`spec-context.yml` 取已包含全量规则证据的一侧;manifest 多数情况按行自动合并,冲突时以任务文件为准重建后重跑 functional 场景。解决后必须 `cf_spec_context.py refresh` 收敛 hash,并重跑合并双方的 functional 验收与 `cf_spec_gate --stage code --json`,通过后提交 merge。
263
- - 合并后验收失败:记录合并前 HEAD 并 `git reset --hard <合并前HEAD>`(分支与 worktree 原样保留),回到 4.2 让对应子 agent 修复后重新 collect / rebase / 合并。
259
+ - 返回 `ok: true` 才继续;`already_merged` 表示该任务已并入(幂等,可重跑);任一任务失败即停止,修复后重跑 merge 续跑。
260
+ - `code_conflict`:代码文件冲突无法程序化合并(返回冲突文件列表,rebase 已中止、主工作区未受影响)。人工读取冲突现场 + 本任务详设章节与 Acceptance Contract,合并双方意图(不是二选一);无法调和(设计要求互斥)→ 保留现场与分支,列出矛盾点叫停交用户决策,不得擅自删除一方实现。解决后重跑 merge。
261
+ - 状态文件冲突(任务 md 覆盖状态列 / `spec-context.yml` / `.acceptance-manifest.json`)由 merge 自动按确定性并集规则处理,无需手工编辑:覆盖状态列两边各自 verified 的行均保留;`spec-context.yml` 取证据并集、verified 优先;manifest 按 verified/revision 合并。
262
+ - merge 成功后自动执行 `refresh` 并在结果中返回 `pass` / `block: ...`;随后重跑合并双方的 functional 验收与 `cf_spec_gate --stage code --json`,失败则记录合并前 HEAD 并 `git reset --hard <合并前HEAD>`(分支与 worktree 原样保留),回到 4.2 让对应子 agent 修复后重新 collect / merge。
263
+ - merge 运行关联批次 smoke;其他 E2E 由需求终验按证据缺口补验。
264
264
 
265
- 3. 全部任务合并完成后进入 4.5 清理。
266
-
267
- - E2E 验收留给 verify-e2e,不在本步骤执行。
265
+ 全部任务合并完成后进入 4.5 清理。
268
266
 
269
267
  #### 4.5 清理
270
268
 
271
269
  ```bash
272
- python3 .code-flow/scripts/cf_task_parallel.py cleanup --root "$PWD" --run-id <run_id> --json
270
+ code-flow task parallel cleanup --root "$PWD" --run-id <run_id> --json
273
271
  ```
274
272
 
275
273
  清理 worktree;已合入的分支自动删除,未合入的保留供排查。worktree 存在未提交改动时 cleanup 会拒绝,先人工确认再决定处理方式。全部批次完成后进入步骤 5。
@@ -303,3 +301,18 @@ Spec 同步提示:
303
301
  ```
304
302
 
305
303
  3. 若需求目录已无 `draft` / `in-progress` / `blocked` 子任务,提示:运行 `cf-task-verify-e2e <需求目录>` 执行延迟的 E2E 终验。
304
+
305
+ <!-- code-flow:runtime-commands start -->
306
+
307
+ 运行时命令示例(由命令契约生成;实际参数见各命令 --help):
308
+
309
+ ```bash
310
+ code-flow spec status --task-dir "<需求目录>" --root "$PWD" --json
311
+ code-flow spec refresh --task-dir "<需求目录>" --root "$PWD" --json
312
+ code-flow task start --task-dir "<需求目录>" --task-file "<任务文件>" --task TASK-001 --root "$PWD" --json
313
+ code-flow task finish --task-dir "<需求目录>" --task TASK-001 --root "$PWD" --json
314
+ code-flow task verify --task-dir "<需求目录>" --tasks TASK-001,TASK-002 --layers validators,e2e --profile smoke --root "$PWD" --json
315
+ code-flow task parallel --help
316
+ ```
317
+
318
+ <!-- code-flow:runtime-commands end -->
@@ -3,6 +3,18 @@ name: cf-task-status
3
3
  description: "Show task status overview: subtask states, progress percentages, blocked items, and overall completion. Use when checking task progress, what's done, what's blocked, or what needs to be done next."
4
4
  ---
5
5
 
6
+ ## 命令面(0.8)
7
+
8
+ `cf-task-status` 收敛了原先三个独立命令;旧命令保留一个 minor(0.9.0 移除):
9
+
10
+ | 子动作 | 等价旧命令 | 用途 |
11
+ |--------|-----------|------|
12
+ | `--notes` | `cf-task-note` | 讨论并收敛 `#NOTES` |
13
+ | `--block` | `cf-task-block` | 标记阻塞并记录原因 |
14
+ | `--graph` | `cf-task-graph` | 依赖 DAG 与并行批次 |
15
+
16
+ 带上述参数时,按对应旧命令章节的步骤执行;不带参数时行为不变。
17
+
6
18
  ## 输入
7
19
 
8
20
  - `cf-task-status` — 显示所有活跃 task 文件的状态
@@ -1,17 +1,30 @@
1
1
  ---
2
2
  name: cf-task-verify-e2e
3
- description: Execute deferred E2E scenarios after all functional tests pass
3
+ description: Run layered verification or full requirement verification, including deferred E2E
4
4
  ---
5
5
 
6
+ ## 验证子动作(0.8)
7
+
8
+ - `code-flow task verify --checks` — 等价于 `--layers validators`,是 `cf-validate` 的 0.8 入口。
9
+ - `code-flow task verify-e2e --checks` 同样只跑 validators;需要包含 heavy validator 时显式指定 `--profile full`。仅 validators 可在任务进行中运行,使用 active TASK 基线以来的变更,不推进任务状态。
10
+ - `cf-validate` 保留为兼容别名,0.9.0 移除。
11
+
12
+ 执行需求目录下被延迟的 E2E 验收场景。
13
+
6
14
  ## 使用场景
7
15
 
8
16
  本命令是**需求级终验**入口,在所有子任务的 functional 测试通过后统一执行:
9
17
 
10
- 1. **review 层 verifier**:绑定规范中 `stage: review` 的 required verifier(e2e/acceptance/构建等重型验证)。遍历需求目录全部 task context,按 spec/rule 去重执行一次,证据写回全部相关 context;输出 `executed` / `reused` / `failed` 计数。
11
- 2. **E2E 验收场景**:依赖外部环境(数据库、API、浏览器等)、编码阶段标记 `e2e_deferred` 的场景。
18
+ 1. **全量 verifier**:需求目录全部 task context 绑定的 required rules(code 层被任务延后的 `deferred_to_review` + `stage: review` 重型验证),按 spec/rule 去重全量执行一次,证据写回全部相关 context;输出 `executed` / `reused` / `failed` 计数。
19
+ 2. **E2E 验收场景**:依赖外部环境(数据库、API、浏览器等)、编码阶段标记 `e2e_deferred` 的场景;已通过且工作树内容指纹未变的场景跨运行复用(不重复执行 E2E),内容变化/失败自动重跑,`code-flow acceptance run --no-cache` 可强制全量。
20
+ 3. **全量 validation**:执行 `validation.yml` 全部 validator(含 `heavy: true` 全量套件/构建/E2E);结果按工作树内容指纹缓存,归档复验命中即复用、不重复执行,`code-flow validate --no-cache` 强制重跑。
12
21
 
13
22
  失败不写 verified、不反转已 done 的任务状态;归档前必须 `decision=pass`。未声明 review verifier 且无 E2E 场景时为空操作(`reason=nothing_to_verify`)。
14
23
 
24
+ > 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)。
25
+ >
26
+ > E2E 也按范围执行:`profile=changed` 只跑 `trigger_paths` 命中当前 diff 的 E2E,没有 `trigger_paths` 的 smoke E2E 不会在 changed 中顺跑;`profile=smoke` 只跑标记 `smoke` / `profile=smoke` 的 E2E(旧计划没有 smoke 标记时才回退全量 E2E)。不要把全量 E2E 当成每个小改动的默认门禁。
27
+
15
28
  ## 调用方式
16
29
 
17
30
  ```
@@ -28,58 +41,69 @@ cf-task-verify-e2e <需求目录>
28
41
  rg "^- \*\*Status\*\*:" <需求目录>/*.md
29
42
  ```
30
43
 
31
- 如有 `in-progress` 或 `blocked` 任务,提示用户先完成。
44
+ 本步骤只适用于包含 review/e2e 的需求验证。如有 `in-progress` 或 `blocked` 任务,先完成任务;仅 `--checks` / `--layers validators` 不要求任务 done,但仍校验 active Context 与需求身份。
32
45
 
33
46
  ### 2. 检查环境依赖
34
47
 
35
- 读取 `.acceptance-manifest.json` 中的 E2E 场景,提取所需的外部依赖(从 `boundary` 字段推断):
48
+ 读取所选 checks 的 `env`、`env_scope`、`preflight` 声明。运行时在实际执行 check 前自动运行 preflight;已有有效证据时允许复用。不要从 `boundary` 猜测端口、数据库或驱动,也不要固定询问环境是否就绪。
49
+
50
+ 收到 `env_blocked` 时,展示 `env_blocked_details` 中的 check ID、owner、失败的 preflight 命令、退出码和输出。根据真实失败修复可处理的本地问题;只有缺少外部配置、需要用户启动外部环境或涉及权限时请求用户输入。未声明 preflight 的检查仍按真实执行结果判断,不能自报环境已通过。
36
51
 
37
- - `HTTP API` → 提示确认 API 服务运行中
38
- - `Browser` → 提示确认浏览器驱动已安装
39
- - `Database` → 提示确认测试数据库可访问
52
+ ### 3. 执行 E2E 场景
40
53
 
41
- 显示清单并询问:
54
+ 用户请求需求级终验时,执行:
42
55
 
56
+ ```bash
57
+ code-flow task verify \
58
+ --task-dir "<需求目录>" --root "$PWD" \
59
+ --layers validators,review,e2e --profile full --json
43
60
  ```
44
- E2E 场景需要以下环境:
45
- - 本地 API 服务 (http://localhost:3000)
46
- - PostgreSQL 测试数据库
47
- - Chrome WebDriver
48
61
 
49
- 环境已就绪?(y/N)
50
- ```
62
+ 相关批次使用 `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`。
51
63
 
52
- ### 3. 执行 E2E 场景
64
+ 全量终验重新检查所有 TASK、锁定 manifest 与 functional/manual 最新证据,执行全量 validation(含 heavy)和 code+review verifier(含 deferred 项)。runner 按范围执行 acceptance:仅 E2E 的路径使用 `--only-e2e`,full 或 functional 证据过期时同时复验所需 functional。只有全层 full 通过才将任务提升为 verified;单层、changed、smoke 通过均不推进状态。不得手动改状态。
65
+
66
+ ### 4. 人工验收确认(manual_confirmation_required)
53
67
 
54
- 用户确认后,执行:
68
+ 需求中的 manual 验收默认落 review 层,编码阶段不逐任务打断,统一在这里确认。`verify-e2e` 返回 `reason=manual_confirmation_required` 时:
69
+
70
+ 1. 向用户完整展示 `manual_rules`(spec 规则、checklist、owner)与 `manual_scenarios`(场景 ID、真实边界),一次性请求确认;用户只确认部分时记录未确认的 ref/id。
71
+ 2. 用户明确回复后执行(`--confirmed-by` 必须是用户身份,Agent 不得代确认;`--source` 填写用户回复原文):
55
72
 
56
73
  ```bash
57
- python3 .code-flow/scripts/cf_task_workflow.py verify-e2e \
58
- --task-dir "<需求目录>" --root "$PWD" --json
74
+ code-flow task confirm-manual \
75
+ --task-dir "<需求目录>" --root "$PWD" \
76
+ --confirmed-by "user:<用户>" --source "<用户回复原文>" --json
59
77
  ```
60
78
 
61
- 该入口重新检查所有 TASK、锁定 manifest 和 functional/manual 最新证据,内部以 `--only-e2e` 调用 runner;只有全通过才把任务提升为 verified。不得手动改状态。
79
+ 部分确认时追加 `--refs <spec#RULE,...>` 与/或 `--scenarios <S-01,...>`。
80
+ 3. 重跑 `verify-e2e`;全部通过后任务才提升为 `verified`。
81
+
82
+ > 显式声明 `stage: code` 的 manual 规则仍在任务 Done Gate 逐个确认,属于有意保留的强门禁。
62
83
 
63
- ### 4. 报告结果
84
+ ### 5. 报告结果
64
85
 
65
86
  解析执行结果:
66
87
 
67
88
  ```json
68
89
  {
69
90
  "decision": "block",
70
- "results": [
71
- {"id": "E-01", "kind": "e2e", "status": "passed"},
72
- {"id": "E-02", "kind": "e2e", "status": "failed", "exit_code": 1}
73
- ]
91
+ "layers": {
92
+ "e2e": {
93
+ "decision": "block",
94
+ "checks": [{"id": "CHK-B", "status": "failed", "scenarios": ["E-02"]}]
95
+ }
96
+ }
74
97
  }
75
98
  ```
76
99
 
77
- - `decision=pass`:所有 E2E 场景通过,提示"E2E 验收完成"
78
- - `decision=block`:有失败场景,列出失败的场景 ID 和错误信息
100
+ - `decision=pass`:报告实际 `selected_layers`、`profile`、执行与复用计数,不将部分范围通过报告为全量终验完成
101
+ - `decision=block`:列出失败层、场景 ID 与 check ID,从 `check_results` 或 `env_blocked_details` 展示对应命令、退出码和错误输出
102
+ - `reason=manual_confirmation_required`:先按「人工验收确认」章节取得用户确认并执行 `confirm-manual`,再重跑本命令
79
103
 
80
- ### 5. 更新任务状态
104
+ ### 6. 更新任务状态
81
105
 
82
- 确认命令已将需求目录下所有任务 Status 更新为 `verified`,并保留原契约与运行历史。无需再次编辑状态。
106
+ 全层 full 通过后确认运行时已将任务 Status 更新为 `verified`,并保留原契约与运行历史。其他验证范围保留原状态。无需再次编辑状态。
83
107
 
84
108
  ## 失败处理
85
109
 
@@ -87,7 +111,7 @@ E2E 失败时:
87
111
 
88
112
  1. 显示失败场景的完整命令和退出码
89
113
  2. 提示查看 `.acceptance-manifest.json` 中的 `evidence` 字段
90
- 3. 不自动修改任务状态,等待用户修复后重新执行
114
+ 3. 修复可处理的问题后重跑所选范围;缺少用户输入时报告具体阻塞,不自动修改任务状态
91
115
 
92
116
  ## 示例
93
117
 
@@ -96,11 +120,7 @@ cf-task-verify-e2e .code-flow/tasks/2026-03-15/auth-module
96
120
 
97
121
  > 检查子任务状态... 所有任务已完成
98
122
  >
99
- > E2E 场景需要以下环境:
100
- > - 本地 API 服务 (http://localhost:3000)
101
- > - PostgreSQL 测试数据库 (postgresql://localhost:5432/test)
102
- >
103
- > 环境已就绪?(y/N) y
123
+ > 按 checks 声明执行 preflight... 通过
104
124
  >
105
125
  > 执行 E2E 场景...
106
126
  > ✓ E-01: 用户登录流程 (1.2s)
@@ -109,3 +129,17 @@ cf-task-verify-e2e .code-flow/tasks/2026-03-15/auth-module
109
129
  > E2E 验收完成!2/2 场景通过
110
130
  > 已更新任务状态为 verified
111
131
  ```
132
+
133
+ <!-- code-flow:runtime-commands start -->
134
+
135
+ 运行时命令示例(由命令契约生成;实际参数见各命令 --help):
136
+
137
+ ```bash
138
+ code-flow task verify --task-dir "<需求目录>" --tasks TASK-001,TASK-002 --layers validators,e2e --profile smoke --root "$PWD" --json
139
+ code-flow task verify-e2e --task-dir "<需求目录>" --root "$PWD" --json
140
+ code-flow task confirm-manual --help
141
+ code-flow acceptance run --manifest "<需求目录>/.acceptance-manifest.json" --root "$PWD" --write-evidence
142
+ code-flow validate --root "$PWD" --json
143
+ ```
144
+
145
+ <!-- code-flow:runtime-commands end -->
@@ -3,6 +3,9 @@ name: cf-validate
3
3
  description: Run validation rules (lint, type check, tests) against changed files based on .code-flow/validation.yml. Auto-fix failures. Use when validating code changes, running project checks, or after editing source files.
4
4
  ---
5
5
 
6
+ > **命令面状态(0.8)**:alias — 等价于 `cf-task-verify-e2e --checks`(运行时 `code-flow task verify --checks`);保留一个 minor,0.9.0 移除。
7
+
8
+
6
9
  ## 输入
7
10
 
8
11
  - `cf-validate` — 自动获取任务基线或 Git 全部变更文件
@@ -16,7 +19,7 @@ description: Run validation rules (lint, type check, tests) against changed file
16
19
  用 shell 命令执行:
17
20
 
18
21
  ```bash
19
- python3 .code-flow/scripts/cf_validation.py --root "$PWD" --scope-only --json
22
+ code-flow validate --root "$PWD" --scope-only --json
20
23
  ```
21
24
 
22
25
  有 active TASK 时使用冻结基线以来的全部任务变更(含已提交文件);无 active TASK 时包含暂存、未暂存和未跟踪文件。用户指定路径时用 `--files "src/a.py" "src/b.py"` 原样传递;若结果确实为空才输出“无变更需要验证”。
@@ -33,21 +36,33 @@ validators:
33
36
  trigger: "**/*.{ts,tsx}"
34
37
  command: "npx tsc --noEmit"
35
38
  timeout: 30000
36
- heavy: false # true = Stop 每轮跳过,finish 与 cf-validate 执行
39
+ heavy: false # true = Stop 与 finish 跳过,需求终验与 cf-validate 执行
37
40
  on_fail: "修复建议"
38
41
  ```
39
42
 
40
- 全量测试 / e2e 等慢命令标 `heavy: true`:Stop 每轮跳过,**任务 finish 自动执行一次**,也可显式运行 `cf-validate`(或 CI),避免拖慢每个任务。
43
+ 全量测试 / e2e 等慢命令标 `heavy: true`:Stop 与任务 finish 跳过,由需求终验 / 归档执行,也可显式运行 `cf-validate`(或 CI),避免拖慢每个任务。
41
44
 
42
45
  ### 3. 匹配并执行验证
43
46
 
44
47
  执行统一验证入口:
45
48
 
49
+ 文末是通用入口示例;本技能的实际调用使用以下 validators 范围,不额外执行 review/e2e。
50
+
51
+ - 有 active TASK 时走任务验证入口(`--checks` 等价于 `--layers validators`):
52
+
53
+ ```bash
54
+ code-flow task verify --checks --profile full --task-dir "<需求目录>" --root "$PWD" --json
55
+ ```
56
+
57
+ - 无 active TASK 或用户显式指定文件时走变更验证入口:
58
+
46
59
  ```bash
47
- python3 .code-flow/scripts/cf_validation.py --root "$PWD" --json
60
+ code-flow validate --root "$PWD" --json
48
61
  ```
49
62
 
50
- 显式范围追加 `--files "src/a.py" "src/b.py"`。程序匹配 trigger、解析 argv 并展开 `{files}`,不拼接 shell 命令;同一运行内相同 argv/cwd/timeout 去重,跨运行不复用。删除文件仍触发全局测试,但不传给文件级编译器。每条 timeout 仍按配置的毫秒值生效,总预算耗尽返回 incomplete/block。
63
+ 仅 validators 支持任务进行中运行,不要求所有 TASK 完成,也不推进任务状态;active Context 损坏或身份不匹配仍阻断。`--profile full` 包含 heavy validator;只做轻量检查时明确使用 `--profile changed`。
64
+
65
+ 显式范围在 `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。
51
66
 
52
67
  ### 4. 汇总结果
53
68
 
@@ -74,3 +89,14 @@ python3 .code-flow/scripts/cf_validation.py --root "$PWD" --json
74
89
  - 命令执行超时 → 输出超时提示,建议增大 timeout 或缩小验证范围
75
90
  - 命令不存在或配置无效 → 返回 block 并提示所缺依赖,不当作验证通过
76
91
  - 无变更文件 → 输出"无变更需要验证"
92
+
93
+ <!-- code-flow:runtime-commands start -->
94
+
95
+ 运行时命令示例(由命令契约生成;实际参数见各命令 --help):
96
+
97
+ ```bash
98
+ code-flow task verify --task-dir "<需求目录>" --tasks TASK-001,TASK-002 --layers validators,e2e --profile smoke --root "$PWD" --json
99
+ code-flow validate --root "$PWD" --json
100
+ ```
101
+
102
+ <!-- code-flow:runtime-commands end -->
@@ -0,0 +1,115 @@
1
+ {
2
+ "schema_version": 1,
3
+ "content_canonical": "claude",
4
+ "commands": [
5
+ {
6
+ "id": "cf-init",
7
+ "file": "cf-init.md",
8
+ "kind": "user",
9
+ "description": "初始化项目规范体系"
10
+ },
11
+ {
12
+ "id": "cf-learn",
13
+ "file": "cf-learn.md",
14
+ "kind": "user",
15
+ "description": "从项目证据沉淀规范"
16
+ },
17
+ {
18
+ "id": "cf-spec",
19
+ "file": "cf-spec.md",
20
+ "kind": "user",
21
+ "description": "Spec Context、迁移计划与 doctor"
22
+ },
23
+ {
24
+ "id": "cf-stats",
25
+ "file": "cf-stats.md",
26
+ "kind": "user",
27
+ "description": "Token/预算统计与规范质量审计"
28
+ },
29
+ {
30
+ "id": "cf-task-prd",
31
+ "file": "cf-task/prd.md",
32
+ "kind": "user",
33
+ "description": "产出产品需求文档"
34
+ },
35
+ {
36
+ "id": "cf-task-align",
37
+ "file": "cf-task/align.md",
38
+ "kind": "user",
39
+ "description": "需求对齐与设计简报"
40
+ },
41
+ {
42
+ "id": "cf-task-plan",
43
+ "file": "cf-task/plan.md",
44
+ "kind": "user",
45
+ "description": "能力级任务拆解与预算门禁"
46
+ },
47
+ {
48
+ "id": "cf-task-start",
49
+ "file": "cf-task/start.md",
50
+ "kind": "user",
51
+ "description": "激活任务并编码"
52
+ },
53
+ {
54
+ "id": "cf-task-status",
55
+ "file": "cf-task/status.md",
56
+ "kind": "user",
57
+ "description": "任务状态总览与 notes/block/graph 子动作",
58
+ "subactions": [
59
+ "--notes",
60
+ "--block",
61
+ "--graph"
62
+ ]
63
+ },
64
+ {
65
+ "id": "cf-task-archive",
66
+ "file": "cf-task/archive.md",
67
+ "kind": "user",
68
+ "description": "归档已完成需求"
69
+ },
70
+ {
71
+ "id": "cf-task-verify-e2e",
72
+ "file": "cf-task/verify-e2e.md",
73
+ "kind": "user",
74
+ "description": "分层/分级验证(task verify 别名)"
75
+ },
76
+ {
77
+ "id": "cf-task-note",
78
+ "file": "cf-task/note.md",
79
+ "kind": "alias",
80
+ "alias_of": "cf-task-status",
81
+ "alias_flag": "--notes",
82
+ "remove_in": "0.9.0"
83
+ },
84
+ {
85
+ "id": "cf-task-block",
86
+ "file": "cf-task/block.md",
87
+ "kind": "alias",
88
+ "alias_of": "cf-task-status",
89
+ "alias_flag": "--block",
90
+ "remove_in": "0.9.0"
91
+ },
92
+ {
93
+ "id": "cf-task-graph",
94
+ "file": "cf-task/graph.md",
95
+ "kind": "alias",
96
+ "alias_of": "cf-task-status",
97
+ "alias_flag": "--graph",
98
+ "remove_in": "0.9.0"
99
+ },
100
+ {
101
+ "id": "cf-validate",
102
+ "file": "cf-validate.md",
103
+ "kind": "alias",
104
+ "alias_of": "cf-task-verify-e2e",
105
+ "alias_flag": "--checks",
106
+ "remove_in": "0.9.0"
107
+ },
108
+ {
109
+ "id": "cf-sync",
110
+ "file": "cf-sync.md",
111
+ "kind": "internal",
112
+ "description": "canonical → 部署副本同步,仅开发/发布维护使用"
113
+ }
114
+ ]
115
+ }
@@ -32,7 +32,7 @@ Do NOT ask the user which Specs to load—the Context-first router is authoritat
32
32
 
33
33
  1. 编辑代码后收到 **Spec 合规反馈 (auto-check)** 时,先按提示修正违规,再继续当前任务
34
34
  2. 用户表示某条反馈是误报("这是误报"/"忽略这个检查")时,代为执行:
35
- `python3 .code-flow/scripts/cf_feedback.py ignore <check-id>`
35
+ `code-flow feedback ignore <check-id>`
36
36
  (check-id 见反馈中的 `规则: <spec>#<check-id>`;同一规则误报达阈值会自动停用)
37
37
  3. 会话收尾被校验拦回(cf-stop 反馈未过项)时,修复后再结束;不要绕过
38
38
  4. 新增/修改规范时优先用 ✅/❌ 代码对照示例表达(见 spec 模板 Examples 段)
@@ -153,9 +153,7 @@ CLAUDE.md 的完整内容由适配器模板统一定义,`code-flow init` 已
153
153
 
154
154
  ### 6. 生成 .costrict/settings.local.json Hook 配置
155
155
 
156
- 检查 `.costrict/settings.local.json` 是否存在。如果不存在,按当前适配器模板创建,必须包含 `PreToolUse`、`PostToolUse`、`UserPromptSubmit`、`Stop` 四类 hook,并使用 guarded project root 定位脚本路径。
157
-
158
- 如果文件已存在,只合并缺失的 hook 事件、matcher 或 command,保留用户已有 permissions、settings 和自定义 hooks,不得整文件覆盖。
156
+ 执行 `code-flow init --platform=costrict`,由适配器模板统一生成/合并 `PreToolUse`、`PostToolUse`、`UserPromptSubmit`、`Stop` 四类 Hook,保留用户已有 permissions、settings 和自定义 hooks,不得整文件覆盖。不得手工拼装受管理 Hook;旧安装或清单校验失败时通过 `code-flow migrate --runtime --dry-run` / `--apply` 修复。
159
157
 
160
158
  ### 7. 安装 pyyaml
161
159
 
@@ -31,7 +31,7 @@
31
31
 
32
32
  1. 读取并展示 `spec-context.yml` 的 bindings、Rule stage status、artifact refs、Evidence 与 drift。
33
33
  2. 执行:
34
- `python3 .code-flow/scripts/cf_spec_context.py validate --task-dir <目录> --json`
34
+ `code-flow spec validate --task-dir <目录> --json`
35
35
  3. Context 缺失、schema/hash 无效时 fail-closed,不回退 Catalog。
36
36
 
37
37
 
@@ -41,7 +41,7 @@
41
41
 
42
42
  执行:
43
43
 
44
- `python3 .code-flow/scripts/cf_spec_context.py status --task-dir <目录> --root "$PWD"`
44
+ `code-flow spec status --task-dir <目录> --root "$PWD"`
45
45
 
46
46
  - marker 漂移时输出下一步:先 refresh 自动重同步;仍不一致时用 `active doctor --resync`(hash 取 status --json 的 context_sha256)。
47
47
  - 需要机器可读输出时加 `--json`。
@@ -50,7 +50,7 @@
50
50
 
51
51
  执行:
52
52
 
53
- `python3 .code-flow/scripts/cf_spec_context.py refresh --task-dir <目录> --root "$PWD" --json`
53
+ `code-flow spec refresh --task-dir <目录> --root "$PWD" --json`
54
54
 
55
55
  - changed required Rule 标为 stale,关联 stage Gate 必须阻断。
56
56
  - missing/conflict 不自动降级;回 Align 或 Plan 更新承接后再继续。
@@ -65,3 +65,23 @@
65
65
  - **marker 损坏或归属无法证明**:向用户说明影响,仅在用户明确确认放弃该 TASK 后执行 `active doctor --abandon`,随后重新规划该任务。
66
66
  3. `active doctor` 返回 `recovery_required`(退出码 3)是诊断结果而非崩溃:按第 2 步选择 refresh / `--resync` / `--abandon`,不要用 `--help` 探测或反复重试。
67
67
  4. 输出明确修复命令。不得删除损坏 marker、越过 required Gate 或静默切换到无任务模式。
68
+ 5. doctor 的安装/Context 健康结果与 `readiness.plan/code/review` 分开阅读。`applied` 只表示存在引用,不能替代 code/review 的 verified 执行证据;引用条目仍有“待同步/待确认/TBD”时返回 `rule_applied_unresolved`。
69
+ 6. `decision=null` 是自动验证的正常情况;无需改代码但已符合规则时提交对应证据,不强制用户 N/A。只有确实不适用/豁免时要求用户 decision。
70
+ 7. `convention_review_required` 表示绑定 Spec 的 Conventions 尚未成为可执行约束;审查与当前设计的冲突,关键条目提升为稳定 Rule 并配置 verifier。CLI 低于 runtime 时先按提示升级 CLI;不要尝试把项目 runtime 降级。
71
+
72
+ ## 规范自检与优化
73
+
74
+ 按 `docs/spec-optimization.md` 执行审计、路径预算、影响查询和只读优化预览。`code-flow spec optimize --apply --plan <提案>` 需要在交互终端展示并获得用户对具体 diff 的明确确认;不得代为确认。应用后对受影响需求执行 refresh 和 doctor。
75
+
76
+ <!-- code-flow:runtime-commands start -->
77
+
78
+ 运行时命令示例(由命令契约生成;实际参数见各命令 --help):
79
+
80
+ ```bash
81
+ code-flow spec optimize --help
82
+ code-flow spec validate --task-dir "<需求目录>" --json
83
+ code-flow spec status --task-dir "<需求目录>" --root "$PWD" --json
84
+ code-flow spec refresh --task-dir "<需求目录>" --root "$PWD" --json
85
+ ```
86
+
87
+ <!-- code-flow:runtime-commands end -->