@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.
- package/README.md +47 -3
- package/docs/USAGE.md +1529 -0
- package/docs/acceptance-contract.md +217 -0
- package/docs/ci/acceptance-evidence.md +77 -0
- package/docs/migrations/runtime-0.7.0.md +41 -0
- package/docs/migrations/runtime-0.8.0.md +154 -0
- package/docs/migrations/runtime-0.9.0.md +40 -0
- package/docs/spec-injection-hardening.md +54 -0
- package/docs/spec-injection-performance.json +73 -0
- package/docs/spec-optimization.md +12 -0
- package/package.json +18 -3
- package/src/adapters/claude/CLAUDE.md +1 -1
- package/src/adapters/claude/commands/cf-init.md +1 -3
- package/src/adapters/claude/commands/cf-spec.md +23 -3
- package/src/adapters/claude/commands/cf-stats.md +11 -1
- package/src/adapters/claude/commands/cf-sync.md +20 -6
- package/src/adapters/claude/commands/cf-task/align.md +25 -3
- package/src/adapters/claude/commands/cf-task/archive.md +36 -40
- package/src/adapters/claude/commands/cf-task/block.md +15 -2
- package/src/adapters/claude/commands/cf-task/graph.md +13 -1
- package/src/adapters/claude/commands/cf-task/note.md +13 -1
- package/src/adapters/claude/commands/cf-task/plan.md +137 -23
- package/src/adapters/claude/commands/cf-task/prd.md +13 -2
- package/src/adapters/claude/commands/cf-task/start.md +67 -35
- package/src/adapters/claude/commands/cf-task/status.md +12 -0
- package/src/adapters/claude/commands/cf-task/verify-e2e.md +72 -34
- package/src/adapters/claude/commands/cf-validate.md +30 -5
- package/src/adapters/codex/AGENTS.md +1 -1
- package/src/adapters/codex/hooks.json +14 -10
- package/src/adapters/codex/skills/cf-init/SKILL.md +4 -4
- package/src/adapters/codex/skills/cf-spec/SKILL.md +34 -6
- package/src/adapters/codex/skills/cf-stats/SKILL.md +11 -1
- package/src/adapters/codex/skills/cf-sync/SKILL.md +21 -6
- package/src/adapters/codex/skills/cf-task-align/SKILL.md +30 -8
- package/src/adapters/codex/skills/cf-task-archive/SKILL.md +36 -40
- package/src/adapters/codex/skills/cf-task-block/SKILL.md +15 -2
- package/src/adapters/codex/skills/cf-task-graph/SKILL.md +13 -1
- package/src/adapters/codex/skills/cf-task-note/SKILL.md +13 -1
- package/src/adapters/codex/skills/cf-task-plan/SKILL.md +175 -21
- package/src/adapters/codex/skills/cf-task-prd/SKILL.md +13 -2
- package/src/adapters/codex/skills/cf-task-start/SKILL.md +67 -35
- package/src/adapters/codex/skills/cf-task-status/SKILL.md +12 -0
- package/src/adapters/codex/skills/cf-task-verify-e2e/SKILL.md +73 -34
- package/src/adapters/codex/skills/cf-validate/SKILL.md +31 -5
- package/src/adapters/commands.json +115 -0
- package/src/adapters/costrict/CLAUDE.md +1 -1
- package/src/adapters/costrict/commands/cf-init.md +1 -3
- package/src/adapters/costrict/commands/cf-spec.md +23 -3
- package/src/adapters/costrict/commands/cf-stats.md +11 -1
- package/src/adapters/costrict/commands/cf-sync.md +20 -6
- package/src/adapters/costrict/commands/cf-task/align.md +25 -3
- package/src/adapters/costrict/commands/cf-task/archive.md +36 -40
- package/src/adapters/costrict/commands/cf-task/block.md +15 -2
- package/src/adapters/costrict/commands/cf-task/graph.md +13 -1
- package/src/adapters/costrict/commands/cf-task/note.md +13 -1
- package/src/adapters/costrict/commands/cf-task/plan.md +137 -23
- package/src/adapters/costrict/commands/cf-task/prd.md +13 -2
- package/src/adapters/costrict/commands/cf-task/start.md +67 -35
- package/src/adapters/costrict/commands/cf-task/status.md +12 -0
- package/src/adapters/costrict/commands/cf-task/verify-e2e.md +72 -34
- package/src/adapters/costrict/commands/cf-validate.md +30 -5
- package/src/adapters/install-plan.json +100 -0
- package/src/adapters/opencode/AGENTS.md +1 -1
- package/src/adapters/opencode/commands/cf-init.md +7 -7
- package/src/adapters/opencode/commands/cf-learn.md +6 -6
- package/src/adapters/opencode/commands/cf-spec.md +34 -2
- package/src/adapters/opencode/commands/cf-stats.md +17 -7
- package/src/adapters/opencode/commands/cf-sync.md +21 -6
- package/src/adapters/opencode/commands/cf-task/align.md +25 -8
- package/src/adapters/opencode/commands/cf-task/archive.md +36 -40
- package/src/adapters/opencode/commands/cf-task/block.md +16 -2
- package/src/adapters/opencode/commands/cf-task/graph.md +14 -1
- package/src/adapters/opencode/commands/cf-task/note.md +14 -1
- package/src/adapters/opencode/commands/cf-task/plan.md +137 -23
- package/src/adapters/opencode/commands/cf-task/prd.md +13 -2
- package/src/adapters/opencode/commands/cf-task/start.md +68 -41
- package/src/adapters/opencode/commands/cf-task/status.md +13 -0
- package/src/adapters/opencode/commands/cf-task/verify-e2e.md +72 -34
- package/src/adapters/opencode/commands/cf-validate.md +35 -9
- package/src/adapters/opencode/plugins/code-flow/index.js +128 -179
- package/src/adapters/platform-bindings.json +370 -0
- package/src/cli.js +369 -316
- package/src/core/code-flow/config.yml +4 -1
- package/src/core/code-flow/runtime-commands.json +259 -0
- package/src/core/code-flow/scripts/cf_acceptance_manifest.py +5 -289
- package/src/core/code-flow/scripts/cf_acceptance_runner.py +5 -187
- package/src/core/code-flow/scripts/cf_audit.py +10 -0
- package/src/core/code-flow/scripts/cf_codex_hook.py +10 -0
- package/src/core/code-flow/scripts/cf_design_lint.py +10 -0
- package/src/core/code-flow/scripts/cf_evidence_import.py +10 -0
- package/src/core/code-flow/scripts/cf_feedback.py +5 -51
- package/src/core/code-flow/scripts/cf_opencode_event.py +10 -0
- package/src/core/code-flow/scripts/cf_post_hook.py +6 -191
- package/src/core/code-flow/scripts/cf_pre_tool_hook.py +6 -99
- package/src/core/code-flow/scripts/cf_scenarios.py +10 -0
- package/src/core/code-flow/scripts/cf_spec_context.py +5 -1714
- package/src/core/code-flow/scripts/cf_spec_gate.py +5 -257
- package/src/core/code-flow/scripts/cf_spec_session.py +5 -114
- package/src/core/code-flow/scripts/cf_stats.py +5 -501
- package/src/core/code-flow/scripts/cf_stop_hook.py +6 -376
- package/src/core/code-flow/scripts/cf_sync.py +5 -135
- package/src/core/code-flow/scripts/cf_task_index.py +5 -143
- package/src/core/code-flow/scripts/cf_task_parallel.py +5 -380
- package/src/core/code-flow/scripts/cf_task_workflow.py +6 -103
- package/src/core/code-flow/scripts/cf_user_prompt_hook.py +6 -173
- package/src/core/code-flow/scripts/cf_validation.py +6 -77
- package/src/core/code-flow/scripts/codeflow/__init__.py +0 -0
- package/src/core/code-flow/scripts/codeflow/acceptance/__init__.py +0 -0
- package/src/core/code-flow/scripts/codeflow/acceptance/cf_acceptance_evidence.py +347 -0
- package/src/core/code-flow/scripts/codeflow/acceptance/cf_acceptance_manifest_core.py +660 -0
- package/src/core/code-flow/scripts/codeflow/acceptance/cf_acceptance_plan.py +202 -0
- package/src/core/code-flow/scripts/codeflow/acceptance/cf_acceptance_registration.py +60 -0
- package/src/core/code-flow/scripts/codeflow/acceptance/cf_acceptance_risk.py +73 -0
- package/src/core/code-flow/scripts/codeflow/acceptance/cf_acceptance_schema.py +282 -0
- package/src/core/code-flow/scripts/codeflow/acceptance/cf_acceptance_selection.py +266 -0
- package/src/core/code-flow/scripts/codeflow/acceptance/cf_check_inputs.py +172 -0
- package/src/core/code-flow/scripts/codeflow/acceptance/cf_check_registration.py +326 -0
- package/src/core/code-flow/scripts/{cf_checks.py → codeflow/acceptance/cf_checks.py} +8 -11
- package/src/core/code-flow/scripts/codeflow/acceptance/cf_plan_quality.py +197 -0
- package/src/core/code-flow/scripts/codeflow/acceptance/cf_scenario_quality.py +174 -0
- package/src/core/code-flow/scripts/codeflow/acceptance/cf_scenario_source.py +300 -0
- package/src/core/code-flow/scripts/codeflow/acceptance/cf_traceability.py +502 -0
- package/src/core/code-flow/scripts/codeflow/cli/__init__.py +0 -0
- package/src/core/code-flow/scripts/codeflow/cli/cf_acceptance_manifest.py +347 -0
- package/src/core/code-flow/scripts/codeflow/cli/cf_acceptance_runner.py +1490 -0
- package/src/core/code-flow/scripts/codeflow/cli/cf_audit.py +533 -0
- package/src/core/code-flow/scripts/codeflow/cli/cf_design_lint.py +172 -0
- package/src/core/code-flow/scripts/codeflow/cli/cf_evidence_import.py +607 -0
- package/src/core/code-flow/scripts/codeflow/cli/cf_feedback.py +53 -0
- package/src/core/code-flow/scripts/codeflow/cli/cf_scenarios.py +58 -0
- package/src/core/code-flow/scripts/codeflow/cli/cf_spec_context.py +1175 -0
- package/src/core/code-flow/scripts/codeflow/cli/cf_spec_gate.py +60 -0
- package/src/core/code-flow/scripts/codeflow/cli/cf_spec_session.py +46 -0
- package/src/core/code-flow/scripts/codeflow/cli/cf_stats.py +540 -0
- package/src/core/code-flow/scripts/codeflow/cli/cf_sync.py +144 -0
- package/src/core/code-flow/scripts/codeflow/cli/cf_task_index.py +177 -0
- package/src/core/code-flow/scripts/codeflow/cli/cf_task_parallel.py +1142 -0
- package/src/core/code-flow/scripts/codeflow/cli/cf_task_workflow.py +742 -0
- package/src/core/code-flow/scripts/codeflow/cli/cf_validation.py +31 -0
- package/src/core/code-flow/scripts/codeflow/core/__init__.py +0 -0
- package/src/core/code-flow/scripts/codeflow/core/cf_context_cache.py +67 -0
- package/src/core/code-flow/scripts/{cf_core.py → codeflow/core/cf_core.py} +119 -297
- package/src/core/code-flow/scripts/codeflow/core/cf_exec_base.py +325 -0
- package/src/core/code-flow/scripts/codeflow/core/cf_fs.py +57 -0
- package/src/core/code-flow/scripts/codeflow/core/cf_git.py +92 -0
- package/src/core/code-flow/scripts/{cf_log.py → codeflow/core/cf_log.py} +13 -7
- package/src/core/code-flow/scripts/codeflow/core/cf_markdown.py +77 -0
- package/src/core/code-flow/scripts/codeflow/core/cf_native_paths.py +26 -0
- package/src/core/code-flow/scripts/codeflow/core/cf_patch.py +33 -0
- package/src/core/code-flow/scripts/codeflow/core/cf_runtime_install.py +32 -0
- package/src/core/code-flow/scripts/codeflow/core/cf_stop_guard.py +53 -0
- package/src/core/code-flow/scripts/codeflow/core/cf_task_state.py +9 -0
- package/src/core/code-flow/scripts/codeflow/core/cf_validators.py +408 -0
- package/src/core/code-flow/scripts/codeflow/core/cf_worktree_env.py +253 -0
- package/src/core/code-flow/scripts/codeflow/evidence/__init__.py +0 -0
- package/src/core/code-flow/scripts/codeflow/evidence/cf_evidence_store.py +527 -0
- package/src/core/code-flow/scripts/codeflow/hooks/__init__.py +0 -0
- package/src/core/code-flow/scripts/codeflow/hooks/cf_codex_hook.py +95 -0
- package/src/core/code-flow/scripts/codeflow/hooks/cf_opencode_event.py +98 -0
- package/src/core/code-flow/scripts/codeflow/hooks/cf_post_hook.py +30 -0
- package/src/core/code-flow/scripts/codeflow/hooks/cf_pre_tool_hook.py +41 -0
- package/src/core/code-flow/scripts/codeflow/hooks/cf_stop_hook.py +292 -0
- package/src/core/code-flow/scripts/codeflow/hooks/cf_user_prompt_hook.py +161 -0
- package/src/core/code-flow/scripts/codeflow/spec/__init__.py +0 -0
- package/src/core/code-flow/scripts/codeflow/spec/cf_active_task.py +412 -0
- package/src/core/code-flow/scripts/codeflow/spec/cf_context_refresh.py +301 -0
- package/src/core/code-flow/scripts/codeflow/spec/cf_edit_service.py +149 -0
- package/src/core/code-flow/scripts/codeflow/spec/cf_injection.py +111 -0
- package/src/core/code-flow/scripts/codeflow/spec/cf_rule_readiness.py +114 -0
- package/src/core/code-flow/scripts/{cf_scan.py → codeflow/spec/cf_scan.py} +93 -21
- package/src/core/code-flow/scripts/codeflow/spec/cf_spec_budget.py +55 -0
- package/src/core/code-flow/scripts/codeflow/spec/cf_spec_context_model.py +477 -0
- package/src/core/code-flow/scripts/codeflow/spec/cf_spec_impact.py +119 -0
- package/src/core/code-flow/scripts/{cf_spec_metadata.py → codeflow/spec/cf_spec_metadata.py} +37 -3
- package/src/core/code-flow/scripts/{cf_spec_migrate.py → codeflow/spec/cf_spec_migrate.py} +27 -10
- package/src/core/code-flow/scripts/codeflow/spec/cf_spec_optimize.py +193 -0
- package/src/core/code-flow/scripts/codeflow/spec/cf_spec_optimize_apply.py +187 -0
- package/src/core/code-flow/scripts/{cf_spec_resolver.py → codeflow/spec/cf_spec_resolver.py} +39 -17
- package/src/core/code-flow/scripts/{cf_spec_router.py → codeflow/spec/cf_spec_router.py} +96 -36
- package/src/core/code-flow/scripts/{cf_spec_verify.py → codeflow/spec/cf_spec_verify.py} +252 -26
- package/src/core/code-flow/scripts/codeflow/spec/cf_stage_gate.py +330 -0
- package/src/core/code-flow/scripts/codeflow/spec/cf_task_projection.py +83 -0
- package/src/core/code-flow/scripts/codeflow/spec/cf_workflow_service.py +755 -0
- package/src/core/code-flow/scripts/{cf_workflow_transaction.py → codeflow/spec/cf_workflow_transaction.py} +29 -15
- package/src/core/code-flow/scripts/codeflow/task/__init__.py +0 -0
- package/src/core/code-flow/scripts/codeflow/task/cf_requirement_verification.py +867 -0
- package/src/core/code-flow/scripts/codeflow/task/cf_task_doc.py +178 -0
- package/src/core/code-flow/scripts/codeflow/task/cf_task_merge.py +635 -0
- package/src/core/code-flow/scripts/codeflow/task/cf_task_plan.py +251 -0
- package/src/core/code-flow/scripts/codeflow/task/cf_task_runtime.py +570 -0
- package/src/core/code-flow/scripts/codeflow/task/cf_validation_service.py +73 -0
- package/src/core/code-flow/scripts/runtime-resources.json +29 -0
- package/src/core/code-flow/specs/shared/design/design-frontend.md +18 -15
- package/src/core/code-flow/specs/shared/design/design-full.md +33 -23
- package/src/core/code-flow/specs/shared/design/design-lite.md +23 -13
- package/src/core/code-flow/specs/shared/scenarios-template.md +55 -0
- package/src/core/code-flow/validation.yml +9 -3
- package/src/migrate/runtime.js +213 -0
- package/src/migrate/spec-workflow.js +16 -1
- package/src/runtime.js +219 -0
- package/src/core/code-flow/scripts/cf_acceptance_evidence.py +0 -100
- package/src/core/code-flow/scripts/cf_acceptance_schema.py +0 -83
- package/src/core/code-flow/scripts/cf_exec_base.py +0 -112
- package/src/core/code-flow/scripts/cf_task_runtime.py +0 -299
- package/src/core/code-flow/scripts/cf_task_state.py +0 -3
- package/src/core/code-flow/scripts/cf_workflow_service.py +0 -366
- /package/src/core/code-flow/scripts/{cf_session_state.py → codeflow/core/cf_session_state.py} +0 -0
|
@@ -1,15 +1,32 @@
|
|
|
1
1
|
---
|
|
2
|
-
description:
|
|
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
|
-
|
|
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
|
-
|
|
47
|
+
本步骤只适用于包含 review/e2e 的需求验证。如有 `in-progress` 或 `blocked` 任务,先完成任务;仅 `--checks` / `--layers validators` 不要求任务 done,但仍校验 active Context 与需求身份。
|
|
31
48
|
|
|
32
49
|
### 2. 检查环境依赖
|
|
33
50
|
|
|
34
|
-
|
|
51
|
+
读取所选 checks 的 `env`、`env_scope`、`preflight` 声明。运行时在实际执行 check 前自动运行 preflight;已有有效证据时允许复用。不要从 `boundary` 猜测端口、数据库或驱动,也不要固定询问环境是否就绪。
|
|
35
52
|
|
|
36
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
57
|
-
--task-dir "<需求目录>" --root "$PWD"
|
|
77
|
+
code-flow task confirm-manual \
|
|
78
|
+
--task-dir "<需求目录>" --root "$PWD" \
|
|
79
|
+
--confirmed-by "user:<用户>" --source "<用户回复原文>" --json
|
|
58
80
|
```
|
|
59
81
|
|
|
60
|
-
|
|
82
|
+
部分确认时追加 `--refs <spec#RULE,...>` 与/或 `--scenarios <S-01,...>`。
|
|
83
|
+
3. 重跑 `verify-e2e`;全部通过后任务才提升为 `verified`。
|
|
84
|
+
|
|
85
|
+
> 显式声明 `stage: code` 的 manual 规则仍在任务 Done Gate 逐个确认,属于有意保留的强门禁。
|
|
61
86
|
|
|
62
|
-
###
|
|
87
|
+
### 5. 报告结果
|
|
63
88
|
|
|
64
89
|
解析执行结果:
|
|
65
90
|
|
|
66
91
|
```json
|
|
67
92
|
{
|
|
68
93
|
"decision": "block",
|
|
69
|
-
"
|
|
70
|
-
|
|
71
|
-
|
|
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
|
|
77
|
-
- `decision=block
|
|
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
|
-
###
|
|
107
|
+
### 6. 更新任务状态
|
|
80
108
|
|
|
81
|
-
|
|
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
|
-
>
|
|
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 -->
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
# cf-validate
|
|
2
2
|
|
|
3
|
+
> **命令面状态(0.8)**:alias — 等价于 `cf-task-verify-e2e --checks`(运行时 `code-flow task verify --checks`);保留一个 minor,0.9.0 移除。
|
|
4
|
+
|
|
3
5
|
根据变更文件自动匹配并执行验证规则(测试、类型检查、lint),失败时自动尝试修复。
|
|
4
6
|
|
|
5
7
|
## 输入
|
|
@@ -15,7 +17,7 @@
|
|
|
15
17
|
用 Bash 执行:
|
|
16
18
|
|
|
17
19
|
```bash
|
|
18
|
-
|
|
20
|
+
code-flow validate --root "$PWD" --scope-only --json
|
|
19
21
|
```
|
|
20
22
|
|
|
21
23
|
有 active TASK 时使用冻结基线以来的全部任务变更(含已提交文件);无 active TASK 时包含暂存、未暂存和未跟踪文件。用户指定路径时用 `--files "src/a.py" "src/b.py"` 原样传递;若结果确实为空才输出“无变更需要验证”。
|
|
@@ -32,21 +34,33 @@ validators:
|
|
|
32
34
|
trigger: "**/*.{ts,tsx}"
|
|
33
35
|
command: "npx tsc --noEmit"
|
|
34
36
|
timeout: 30000
|
|
35
|
-
heavy: false # true = Stop
|
|
37
|
+
heavy: false # true = Stop 与 finish 跳过,需求终验与 /cf-validate 执行
|
|
36
38
|
on_fail: "修复建议"
|
|
37
39
|
```
|
|
38
40
|
|
|
39
|
-
全量测试 / e2e 等慢命令标 `heavy: true`:Stop
|
|
41
|
+
全量测试 / e2e 等慢命令标 `heavy: true`:Stop 与任务 finish 跳过,由需求终验 / 归档执行,也可显式运行 `/cf-validate`(或 CI),避免拖慢每个任务。
|
|
40
42
|
|
|
41
43
|
### 3. 匹配并执行验证
|
|
42
44
|
|
|
43
45
|
执行统一验证入口:
|
|
44
46
|
|
|
47
|
+
文末是通用入口示例;本技能的实际调用使用以下 validators 范围,不额外执行 review/e2e。
|
|
48
|
+
|
|
49
|
+
- 有 active TASK 时走任务验证入口(`--checks` 等价于 `--layers validators`):
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
code-flow task verify --checks --profile full --task-dir "<需求目录>" --root "$PWD" --json
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
- 无 active TASK 或用户显式指定文件时走变更验证入口:
|
|
56
|
+
|
|
45
57
|
```bash
|
|
46
|
-
|
|
58
|
+
code-flow validate --root "$PWD" --json
|
|
47
59
|
```
|
|
48
60
|
|
|
49
|
-
|
|
61
|
+
仅 validators 支持任务进行中运行,不要求所有 TASK 完成,也不推进任务状态;active Context 损坏或身份不匹配仍阻断。`--profile full` 包含 heavy validator;只做轻量检查时明确使用 `--profile changed`。
|
|
62
|
+
|
|
63
|
+
显式范围在 `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。
|
|
50
64
|
|
|
51
65
|
### 4. 汇总结果
|
|
52
66
|
|
|
@@ -73,3 +87,14 @@ python3 .code-flow/scripts/cf_validation.py --root "$PWD" --json
|
|
|
73
87
|
- 命令执行超时 → 输出超时提示,建议增大 timeout 或缩小验证范围
|
|
74
88
|
- 命令不存在或配置无效 → 返回 block 并提示所缺依赖,不当作验证通过
|
|
75
89
|
- 无变更文件 → 输出"无变更需要验证"
|
|
90
|
+
|
|
91
|
+
<!-- code-flow:runtime-commands start -->
|
|
92
|
+
|
|
93
|
+
运行时命令示例(由命令契约生成;实际参数见各命令 --help):
|
|
94
|
+
|
|
95
|
+
```bash
|
|
96
|
+
code-flow task verify --task-dir "<需求目录>" --tasks TASK-001,TASK-002 --layers validators,e2e --profile smoke --root "$PWD" --json
|
|
97
|
+
code-flow validate --root "$PWD" --json
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
<!-- code-flow:runtime-commands end -->
|
|
@@ -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
|
-
`
|
|
35
|
+
`code-flow feedback ignore <check-id>`
|
|
36
36
|
(check-id 见反馈中的 `规则: <spec>#<check-id>`;同一规则误报达阈值会自动停用)
|
|
37
37
|
3. 会话收尾被校验拦回(cf-stop 反馈未过项)时,修复后再结束;不要绕过
|
|
38
38
|
4. 新增/修改规范时优先用 ✅/❌ 代码对照示例表达(见 spec 模板 Examples 段)
|
|
@@ -2,24 +2,26 @@
|
|
|
2
2
|
"hooks": {
|
|
3
3
|
"PreToolUse": [
|
|
4
4
|
{
|
|
5
|
-
"matcher": "
|
|
5
|
+
"matcher": "^apply_patch$",
|
|
6
6
|
"hooks": [
|
|
7
7
|
{
|
|
8
8
|
"type": "command",
|
|
9
|
-
"command": "d=\"$
|
|
10
|
-
"timeout": 5
|
|
9
|
+
"command": "d=\"$PWD\"; while [ ! -f \"$d/.code-flow/scripts/cf_codex_hook.py\" ] && [ \"$d\" != / ]; do d=\"$(dirname \"$d\")\"; done; f=\"$d/.code-flow/scripts/cf_codex_hook.py\"; if [ -f \"$f\" ]; then python3 \"$f\"; fi",
|
|
10
|
+
"timeout": 5,
|
|
11
|
+
"commandWindows": "py -3 -c \"import pathlib,runpy,sys; roots=(pathlib.Path.cwd(), *pathlib.Path.cwd().parents); script=next((root/'.code-flow/scripts/cf_codex_hook.py' for root in roots if (root/'.code-flow/scripts/cf_codex_hook.py').is_file()), None); sys.path.insert(0,str(script.parent)) if script else None; runpy.run_path(str(script),run_name='__main__') if script else None\""
|
|
11
12
|
}
|
|
12
13
|
]
|
|
13
14
|
}
|
|
14
15
|
],
|
|
15
16
|
"PostToolUse": [
|
|
16
17
|
{
|
|
17
|
-
"matcher": "
|
|
18
|
+
"matcher": "^apply_patch$",
|
|
18
19
|
"hooks": [
|
|
19
20
|
{
|
|
20
21
|
"type": "command",
|
|
21
|
-
"command": "d=\"$
|
|
22
|
-
"timeout": 5
|
|
22
|
+
"command": "d=\"$PWD\"; while [ ! -f \"$d/.code-flow/scripts/cf_codex_hook.py\" ] && [ \"$d\" != / ]; do d=\"$(dirname \"$d\")\"; done; f=\"$d/.code-flow/scripts/cf_codex_hook.py\"; if [ -f \"$f\" ]; then python3 \"$f\"; fi",
|
|
23
|
+
"timeout": 5,
|
|
24
|
+
"commandWindows": "py -3 -c \"import pathlib,runpy,sys; roots=(pathlib.Path.cwd(), *pathlib.Path.cwd().parents); script=next((root/'.code-flow/scripts/cf_codex_hook.py' for root in roots if (root/'.code-flow/scripts/cf_codex_hook.py').is_file()), None); sys.path.insert(0,str(script.parent)) if script else None; runpy.run_path(str(script),run_name='__main__') if script else None\""
|
|
23
25
|
}
|
|
24
26
|
]
|
|
25
27
|
}
|
|
@@ -29,8 +31,9 @@
|
|
|
29
31
|
"hooks": [
|
|
30
32
|
{
|
|
31
33
|
"type": "command",
|
|
32
|
-
"command": "d=\"$
|
|
33
|
-
"timeout": 5
|
|
34
|
+
"command": "d=\"$PWD\"; while [ ! -f \"$d/.code-flow/scripts/cf_codex_hook.py\" ] && [ \"$d\" != / ]; do d=\"$(dirname \"$d\")\"; done; f=\"$d/.code-flow/scripts/cf_codex_hook.py\"; if [ -f \"$f\" ]; then python3 \"$f\"; fi",
|
|
35
|
+
"timeout": 5,
|
|
36
|
+
"commandWindows": "py -3 -c \"import pathlib,runpy,sys; roots=(pathlib.Path.cwd(), *pathlib.Path.cwd().parents); script=next((root/'.code-flow/scripts/cf_codex_hook.py' for root in roots if (root/'.code-flow/scripts/cf_codex_hook.py').is_file()), None); sys.path.insert(0,str(script.parent)) if script else None; runpy.run_path(str(script),run_name='__main__') if script else None\""
|
|
34
37
|
}
|
|
35
38
|
]
|
|
36
39
|
}
|
|
@@ -40,8 +43,9 @@
|
|
|
40
43
|
"hooks": [
|
|
41
44
|
{
|
|
42
45
|
"type": "command",
|
|
43
|
-
"command": "d=\"$
|
|
44
|
-
"timeout": 35
|
|
46
|
+
"command": "d=\"$PWD\"; while [ ! -f \"$d/.code-flow/scripts/cf_codex_hook.py\" ] && [ \"$d\" != / ]; do d=\"$(dirname \"$d\")\"; done; f=\"$d/.code-flow/scripts/cf_codex_hook.py\"; if [ -f \"$f\" ]; then python3 \"$f\"; fi",
|
|
47
|
+
"timeout": 35,
|
|
48
|
+
"commandWindows": "py -3 -c \"import pathlib,runpy,sys; roots=(pathlib.Path.cwd(), *pathlib.Path.cwd().parents); script=next((root/'.code-flow/scripts/cf_codex_hook.py' for root in roots if (root/'.code-flow/scripts/cf_codex_hook.py').is_file()), None); sys.path.insert(0,str(script.parent)) if script else None; runpy.run_path(str(script),run_name='__main__') if script else None\""
|
|
45
49
|
}
|
|
46
50
|
]
|
|
47
51
|
}
|
|
@@ -158,11 +158,9 @@ AGENTS.md 的完整内容由适配器模板统一定义,`code-flow init` 已
|
|
|
158
158
|
|
|
159
159
|
### 6. 生成 .codex/hooks.json 和 .codex/config.toml
|
|
160
160
|
|
|
161
|
-
|
|
161
|
+
安装 Hook 和配置必须执行 `code-flow init --platform=codex`,由适配器模板统一生成/合并,保留用户配置。`PreToolUse`、`PostToolUse`、`UserPromptSubmit`、`Stop` 四个事件调用 `cf_codex_hook.py`,配置启用 `[features] hooks = true`,保留用户模型、sandbox、approval 设置,不得整文件覆盖;写文件 matcher 为 `^apply_patch$`,输入来自 `tool_input.command`、`cwd`、`session_id`。不得手工拼装或修改受管理 Hook。
|
|
162
162
|
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
检查 `.codex/config.toml`。如果缺少 `[features] hooks = true`,只补这一项;若存在旧版 `codex_hooks = true`,迁移为 `hooks = true`;保留用户已有模型、sandbox、approval 等配置。
|
|
163
|
+
旧安装或清单校验失败时执行 `code-flow migrate --runtime --dry-run` 查看范围,再执行 `code-flow migrate --runtime --apply` 更新全部已安装平台。
|
|
166
164
|
|
|
167
165
|
Codex 会要求 review/trust 非 managed command hooks。生成或更新 hook 后,提醒用户在 Codex CLI 中运行 `/hooks` 并信任 code-flow hooks。
|
|
168
166
|
|
|
@@ -271,3 +269,5 @@ Token 估算: ...
|
|
|
271
269
|
## v0.5 质量闭环部署说明
|
|
272
270
|
|
|
273
271
|
init/upgrade 后新增:PostToolUse / Stop hook 注册(合规反馈与收尾守门)、`.code-flow/.gitignore`(运行时数据不入库)。运行时数据 `.session-log.jsonl` / `.check-state.json` 首次使用自动创建,仅存本地。规范写作建议:frontmatter 加 `description`(Spec Catalog 行)与 `checks`(机检标注),规则优先用 ✅/❌ Examples 段表达(cf-learn 候选自动生成草稿)。
|
|
272
|
+
|
|
273
|
+
安装产物由 `code-flow init --platform=codex` 统一部署。脚本、Skill、Hook 的完整性由安装清单校验;损坏时执行 `code-flow migrate --runtime --dry-run` 查看修复范围,再执行 `code-flow migrate --runtime --apply`。不得凭技能名猜 Python 脚本入口。
|
|
@@ -3,10 +3,6 @@ name: cf-spec
|
|
|
3
3
|
description: Manage schema-v1 Spec Context, drift recovery, and prepared one-shot migration plans.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
# cf-spec
|
|
7
|
-
|
|
8
|
-
管理 schema v1 Spec Context 与一次性迁移。用法:
|
|
9
|
-
|
|
10
6
|
- `cf-spec migrate --plan <migration-plan.yml>`
|
|
11
7
|
- `cf-spec context [需求目录]`
|
|
12
8
|
- `cf-spec refresh [需求目录]`
|
|
@@ -36,14 +32,26 @@ description: Manage schema-v1 Spec Context, drift recovery, and prepared one-sho
|
|
|
36
32
|
|
|
37
33
|
1. 读取并展示 `spec-context.yml` 的 bindings、Rule stage status、artifact refs、Evidence 与 drift。
|
|
38
34
|
2. 执行:
|
|
39
|
-
`
|
|
35
|
+
`code-flow spec validate --task-dir <目录> --json`
|
|
40
36
|
3. Context 缺失、schema/hash 无效时 fail-closed,不回退 Catalog。
|
|
41
37
|
|
|
38
|
+
|
|
39
|
+
## status
|
|
40
|
+
|
|
41
|
+
展示人话版 Context 状态:任务、marker hash 是否一致、code Gate 结果、各绑定 Rule 状态。
|
|
42
|
+
|
|
43
|
+
执行:
|
|
44
|
+
|
|
45
|
+
`code-flow spec status --task-dir <目录> --root "$PWD"`
|
|
46
|
+
|
|
47
|
+
- marker 漂移时输出下一步:先 refresh 自动重同步;仍不一致时用 `active doctor --resync`(hash 取 status --json 的 context_sha256)。
|
|
48
|
+
- 需要机器可读输出时加 `--json`。
|
|
49
|
+
|
|
42
50
|
## refresh
|
|
43
51
|
|
|
44
52
|
执行:
|
|
45
53
|
|
|
46
|
-
`
|
|
54
|
+
`code-flow spec refresh --task-dir <目录> --root "$PWD" --json`
|
|
47
55
|
|
|
48
56
|
- changed required Rule 标为 stale,关联 stage Gate 必须阻断。
|
|
49
57
|
- missing/conflict 不自动降级;回 Align 或 Plan 更新承接后再继续。
|
|
@@ -58,3 +66,23 @@ description: Manage schema-v1 Spec Context, drift recovery, and prepared one-sho
|
|
|
58
66
|
- **marker 损坏或归属无法证明**:向用户说明影响,仅在用户明确确认放弃该 TASK 后执行 `active doctor --abandon`,随后重新规划该任务。
|
|
59
67
|
3. `active doctor` 返回 `recovery_required`(退出码 3)是诊断结果而非崩溃:按第 2 步选择 refresh / `--resync` / `--abandon`,不要用 `--help` 探测或反复重试。
|
|
60
68
|
4. 输出明确修复命令。不得删除损坏 marker、越过 required Gate 或静默切换到无任务模式。
|
|
69
|
+
5. doctor 的安装/Context 健康结果与 `readiness.plan/code/review` 分开阅读。`applied` 只表示存在引用,不能替代 code/review 的 verified 执行证据;引用条目仍有“待同步/待确认/TBD”时返回 `rule_applied_unresolved`。
|
|
70
|
+
6. `decision=null` 是自动验证的正常情况;无需改代码但已符合规则时提交对应证据,不强制用户 N/A。只有确实不适用/豁免时要求用户 decision。
|
|
71
|
+
7. `convention_review_required` 表示绑定 Spec 的 Conventions 尚未成为可执行约束;审查与当前设计的冲突,关键条目提升为稳定 Rule 并配置 verifier。CLI 低于 runtime 时先按提示升级 CLI;不要尝试把项目 runtime 降级。
|
|
72
|
+
|
|
73
|
+
## 规范自检与优化
|
|
74
|
+
|
|
75
|
+
按 `docs/spec-optimization.md` 执行审计、路径预算、影响查询和只读优化预览。`code-flow spec optimize --apply --plan <提案>` 需要在交互终端展示并获得用户对具体 diff 的明确确认;不得代为确认。应用后对受影响需求执行 refresh 和 doctor。
|
|
76
|
+
|
|
77
|
+
<!-- code-flow:runtime-commands start -->
|
|
78
|
+
|
|
79
|
+
运行时命令示例(由命令契约生成;实际参数见各命令 --help):
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
code-flow spec optimize --help
|
|
83
|
+
code-flow spec validate --task-dir "<需求目录>" --json
|
|
84
|
+
code-flow spec status --task-dir "<需求目录>" --root "$PWD" --json
|
|
85
|
+
code-flow spec refresh --task-dir "<需求目录>" --root "$PWD" --json
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
<!-- code-flow:runtime-commands end -->
|
|
@@ -19,7 +19,7 @@ description: Show token usage statistics for the spec system (per-file breakdown
|
|
|
19
19
|
用 shell 命令执行:
|
|
20
20
|
|
|
21
21
|
```bash
|
|
22
|
-
|
|
22
|
+
code-flow stats [--human] [--domain=frontend] [--audit]
|
|
23
23
|
```
|
|
24
24
|
|
|
25
25
|
将用户传入的参数原样透传。
|
|
@@ -85,3 +85,13 @@ COMPRESSION: 1820 → 1580 (-13.2%)
|
|
|
85
85
|
|
|
86
86
|
- `.code-flow/` 不存在 → 提示运行 `cf-init`
|
|
87
87
|
- Python 脚本执行失败 → 输出错误信息,建议检查 Python 环境
|
|
88
|
+
|
|
89
|
+
<!-- code-flow:runtime-commands start -->
|
|
90
|
+
|
|
91
|
+
运行时命令示例(由命令契约生成;实际参数见各命令 --help):
|
|
92
|
+
|
|
93
|
+
```bash
|
|
94
|
+
code-flow stats --help
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
<!-- code-flow:runtime-commands end -->
|
|
@@ -5,26 +5,41 @@ description: One-command canonical → deploy sync for dual-copy artifacts, with
|
|
|
5
5
|
|
|
6
6
|
# cf-sync
|
|
7
7
|
|
|
8
|
+
|
|
9
|
+
> **命令面状态(0.8)**:internal — 仅开发/发布维护使用,不属于 0.8 用户命令面;普通用户无需调用。
|
|
10
|
+
|
|
8
11
|
一键同步双副本(canonical 源 → 部署副本),并检查漂移。用法:
|
|
9
12
|
|
|
10
|
-
- `
|
|
11
|
-
- `
|
|
12
|
-
- `
|
|
13
|
+
- `code-flow sync check` — 检查全部配对是否一致(默认)
|
|
14
|
+
- `code-flow sync apply` — 把 canonical 源复制到部署副本
|
|
15
|
+
- `code-flow sync check --verbose` — 额外列出部署侧独有文件
|
|
13
16
|
|
|
14
17
|
## 同步配对
|
|
15
18
|
|
|
16
19
|
| canonical 源 | 部署副本 | 同步内容 |
|
|
17
20
|
|---|---|---|
|
|
18
|
-
| `src/core/code-flow` | `.code-flow` | `scripts
|
|
21
|
+
| `src/core/code-flow` | `.code-flow` | `scripts/`、`runtime-commands.json`、`.version`、`.gitignore` |
|
|
19
22
|
| `src/adapters/claude` | `.claude` | `commands/` |
|
|
20
|
-
| `src/adapters/codex` | `.codex` | `hooks.json` |
|
|
21
23
|
| `src/adapters/codex/skills` | `.agents/skills` | 全部 |
|
|
22
24
|
| `src/adapters/costrict` | `.costrict` | `commands/` |
|
|
23
25
|
| `src/adapters/opencode` | `.opencode` | `commands/`、`plugins/` |
|
|
24
26
|
|
|
27
|
+
`.codex/hooks.json` 由 init 的合并逻辑和 runtime 事务迁移管理,不属于 cf-sync 的字节同步配对。
|
|
28
|
+
|
|
25
29
|
## 规则
|
|
26
30
|
|
|
27
31
|
1. 项目自有内容(`specs/`、`tasks/`、`config.yml`、`validation.yml`、`settings.local.json`)不在同步范围内,不会被动覆盖。
|
|
28
32
|
2. 部署侧独有文件不会被删除(避免误删本地产物)。
|
|
29
|
-
3. 只改一侧 = 测试通过但 live 行为不变;改完 canonical 源后运行 `
|
|
33
|
+
3. 只改一侧 = 测试通过但 live 行为不变;改完 canonical 源后运行 `code-flow sync apply` 部署,提交时双副本一起提交。
|
|
30
34
|
4. 每对 `check` 全绿后提交,保证四平台命令与运行副本同步。
|
|
35
|
+
|
|
36
|
+
<!-- code-flow:runtime-commands start -->
|
|
37
|
+
|
|
38
|
+
运行时命令示例(由命令契约生成;实际参数见各命令 --help):
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
code-flow sync check --help
|
|
42
|
+
code-flow sync apply --help
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
<!-- code-flow:runtime-commands end -->
|
|
@@ -3,6 +3,14 @@ name: cf-task-align
|
|
|
3
3
|
description: Generate a design brief (.design.md) from a requirement through structured interactive dialogue. Accepts plain text, an existing PRD (.prd.md) to derive from, or a .design.md draft to resume. Adapts to the nature of the work — feature development, refactoring, CLI tools, background jobs, performance optimization, etc.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
+
## Scenario-First(0.9)
|
|
7
|
+
|
|
8
|
+
全栈用户场景统一写入 `<需求>.scenarios.md`,作为验收场景唯一源;design 文档只写实现逻辑并引用场景 ID。场景文件不存在时,新需求不得进入 plan。
|
|
9
|
+
|
|
10
|
+
设计简报 frontmatter 写明实际选择的 `design_template: lite`、`full` 或 `frontend`。FEAT/API/NFR 定义与场景引用必须闭合;每个范围内功能关联验收场景。生成后执行 `code-flow design lint --file "<需求>.design.md" --scenarios-file "<需求>.scenarios.md" --json`,多份设计重复传 `--file`。按模板保留必填章节,不适用的可选章节按模板删除。
|
|
11
|
+
|
|
12
|
+
场景区分浏览器 E2E 与 API/CLI 的 system/integration;capacity 可使用独立层级或 tags。expected 必须具体,并通过 expected_refs 关联步骤或已声明断言;延后场景保留原因、责任人及目标阶段。详细可执行格式见 `docs/acceptance-contract.md`。
|
|
13
|
+
|
|
6
14
|
## 输入
|
|
7
15
|
|
|
8
16
|
- `cf-task-align "需求描述"` — 从需求描述新建设计简报
|
|
@@ -20,7 +28,7 @@ description: Generate a design brief (.design.md) from a requirement through str
|
|
|
20
28
|
|---------|------|------|
|
|
21
29
|
| 已存在的 `.design.md` 文件 | **恢复模式** | 读取,展示当前内容,询问调整点,进入 Step 3 |
|
|
22
30
|
| 已存在的 `.prd.md` 文件 | **PRD 派生模式** | 读取 PRD,执行 Step 2.6 预填充维度,Step 3 只补技术维度 |
|
|
23
|
-
| 已存在的其他 `.md` 文件 | **新建模式(带上下文)** |
|
|
31
|
+
| 已存在的其他 `.md` 文件 | **新建模式(带上下文)** | 读取 作为参考材料,进入 Step 2 |
|
|
24
32
|
| 纯文本字符串 | **新建模式** | 以文本作为初始需求,进入 Step 2 |
|
|
25
33
|
| 无参数 | **交互模式** | 询问"要实现什么功能?",进入 Step 2 |
|
|
26
34
|
|
|
@@ -28,9 +36,9 @@ description: Generate a design brief (.design.md) from a requirement through str
|
|
|
28
36
|
|
|
29
37
|
快速了解项目现状,为后续建议提供依据:
|
|
30
38
|
|
|
31
|
-
1. 用 `rg --files`
|
|
39
|
+
1. 用 `rg --files` 检查 `.code-flow/specs/*/_map.md` 是否存在,若有则 读取(了解项目结构)
|
|
32
40
|
2. 检测技术栈:读取 `package.json` / `requirements.txt` / `go.mod` / `pyproject.toml` 等(取存在的)
|
|
33
|
-
3. 用 `rg --files`
|
|
41
|
+
3. 用 `rg --files` 扫描与需求相关的现有代码目录,了解已有模式
|
|
34
42
|
|
|
35
43
|
目的:**让后续建议基于实际代码库**,而非泛泛的通用建议。
|
|
36
44
|
|
|
@@ -115,7 +123,7 @@ PRD 已覆盖的维度如无需调整,将直接使用。
|
|
|
115
123
|
|
|
116
124
|
进入技术讨论前先定位需求目录中的 `spec-context.yml`:
|
|
117
125
|
|
|
118
|
-
1. PRD 派生/恢复模式必须执行 `
|
|
126
|
+
1. PRD 派生/恢复模式必须执行 `code-flow spec refresh --task-dir <需求目录> --root "$PWD" --json`;missing/stale/conflict 必须先处理。
|
|
119
127
|
2. 已有 binding 必须从 PRD Context 原样继承,**不得重新选择**、降级 enforcement 或清空 PRD 阶段 refs/decision/evidence。根据预计实现路径运行 `catalog --stage design`,只对新增 design-stage 候选做增量 bind,并记录 reason。
|
|
120
128
|
3. 为每条 design-stage required Rule 预建 `Spec Compliance Matrix` 行:`Spec/Rule`、enforcement、设计影响、具体设计落点、验证场景/verifier、状态或 N/A 理由。
|
|
121
129
|
4. required Rule 没有具体 heading/item 和验证方式时不得进入可评审状态;只写“遵循规范”无效。
|
|
@@ -173,7 +181,9 @@ CLI 场景:
|
|
|
173
181
|
**验收标准**(必选)
|
|
174
182
|
- 怎么判断做完了?正常 / 异常场景各列至少一条
|
|
175
183
|
- 可验证、可转为自动化测试断言的条件(明确输入与可观测输出);场景 ID(S-/E-/B-)即测试用例来源
|
|
176
|
-
- 为每个场景指定测试层级(unit / integration / E2E / manual
|
|
184
|
+
- 为每个场景指定测试层级(unit / component / contract / integration / E2E / manual)和关键真实边界;按最低可覆盖层选择:UI/表单/布局用 component,DTO/错误码用 contract,鉴权/事务/模块边界用 integration,只有真实浏览器 + 真实后端 + 鉴权/DB 才能暴露的 P0/P1 关键旅程才用 E2E
|
|
185
|
+
- ✅ CAS 冲突由 contract + component + 真实存储 integration 共同证明;聚合补零用数据 contract + component,关系绑定用真实存储 integration。Cookie 身份隔离和 SSE 恢复可保留对应关键 E2E。❌ 按用户可见结果机械增加 E2E 或用固定比例决定层级;描述独特故障、低层覆盖和剩余接线风险,由设计评审判断。
|
|
186
|
+
- E2E 场景必须同时给出 `why_e2e`(低层为什么不够)、`trigger_paths`(哪些源码变化触发)和 `smoke`(是否发布冒烟);缺少时不得进入 plan
|
|
177
187
|
- RULE 与高影响 RISK 必须映射到至少一个 S/E/B 场景;manual 仅限无法自动化的外部条件,必须写明原因
|
|
178
188
|
|
|
179
189
|
**妥协与技术债**(按需)
|
|
@@ -272,19 +282,19 @@ CLI 场景:
|
|
|
272
282
|
- **恢复模式**:保持原需求名
|
|
273
283
|
- **新建/交互模式**:从目标推导 kebab-case,如 `user-auth`
|
|
274
284
|
2. **确定需求目录**:
|
|
275
|
-
- **PRD 派生模式**:使用 PRD 所在的需求目录 `.code-flow/tasks/<日期>/<需求>/`(PRD 与 design 同目录,便于 `cf-task
|
|
285
|
+
- **PRD 派生模式**:使用 PRD 所在的需求目录 `.code-flow/tasks/<日期>/<需求>/`(PRD 与 design 同目录,便于 `cf-task:archive` 整目录归档)
|
|
276
286
|
- **恢复模式**:保持原目录
|
|
277
287
|
- **新建/交互模式**:按当前日期创建需求目录 `.code-flow/tasks/<YYYY-MM-DD>/<需求>/`;目录已存在且非本次草稿时目录名追加序号 `<需求>-2`…
|
|
278
288
|
3. **按域后缀命名**(同一需求目录内):
|
|
279
289
|
- 前端设计(design-frontend)→ `<需求>.frontend.design.md`
|
|
280
290
|
- 后端/通用设计(design-lite/full)→ 全栈时 `<需求>.backend.design.md`;纯后端/通用单域时 `<需求>.design.md`
|
|
281
291
|
- **全栈需求**:前后端各写一份到同一需求目录
|
|
282
|
-
4.
|
|
292
|
+
4. 写入最终路径
|
|
283
293
|
|
|
284
294
|
写入后,对 Matrix 每一行调用 `bind --stage design` 的 `applications` 回填 design artifact、`section_id`、稳定 `item_id` 和脚本计算的 hash;随后执行:
|
|
285
295
|
|
|
286
296
|
```bash
|
|
287
|
-
|
|
297
|
+
code-flow spec gate --task-dir <需求目录> --stage design --json
|
|
288
298
|
```
|
|
289
299
|
|
|
290
300
|
只有 Design Gate `decision=pass` 才能输出 Plan 下一步。缺 Matrix 行、artifact ref、验证方式、用户确认或发生 drift 时保留草稿并修复,不得推迟到 Coding/Done 才发现。
|
|
@@ -308,3 +318,15 @@ python3 .code-flow/scripts/cf_spec_gate.py --task-dir <需求目录> --stage des
|
|
|
308
318
|
- 标注问题: 在文件中添加 #NOTES,然后 cf-task-note <name>.design
|
|
309
319
|
- 生成任务: cf-task-plan <完整路径>
|
|
310
320
|
```
|
|
321
|
+
|
|
322
|
+
<!-- code-flow:runtime-commands start -->
|
|
323
|
+
|
|
324
|
+
运行时命令示例(由命令契约生成;实际参数见各命令 --help):
|
|
325
|
+
|
|
326
|
+
```bash
|
|
327
|
+
code-flow spec refresh --task-dir "<需求目录>" --root "$PWD" --json
|
|
328
|
+
code-flow spec gate --help
|
|
329
|
+
code-flow design lint --file "<需求>.design.md" --scenarios-file "<需求>.scenarios.md" --json
|
|
330
|
+
```
|
|
331
|
+
|
|
332
|
+
<!-- code-flow:runtime-commands end -->
|