@michaelxwb/code-flow 0.8.1 → 1.0.0
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 +73 -152
- package/bin/code-flow.js +12 -0
- package/docs/README.md +19 -0
- package/docs/USAGE.md +156 -1417
- package/docs/v1-design.md +1858 -0
- package/docs/v1-implementation.md +186 -0
- package/lib/adapters.js +126 -0
- package/lib/cli.js +258 -0
- package/lib/config.js +85 -0
- package/lib/doctor.js +283 -0
- package/lib/frontmatter.js +42 -0
- package/lib/fs.js +141 -0
- package/lib/glob.js +23 -0
- package/lib/hook.js +99 -0
- package/lib/init.js +132 -0
- package/lib/learn.js +170 -0
- package/lib/locks.js +52 -0
- package/lib/markdown.js +13 -0
- package/lib/process.js +116 -0
- package/lib/render.js +115 -0
- package/lib/repo.js +48 -0
- package/lib/runs.js +155 -0
- package/lib/session.js +40 -0
- package/lib/spec.js +80 -0
- package/lib/task.js +258 -0
- package/lib/taskdoc.js +308 -0
- package/lib/toml.js +140 -0
- package/lib/verify.js +168 -0
- package/lib/worktree.js +930 -0
- package/package.json +18 -21
- package/templates/adapters/opencode.mjs +65 -0
- package/templates/config.json +39 -0
- package/templates/instructions.md +13 -0
- package/templates/launcher/bridge.cjs +295 -0
- package/templates/launcher/hook.cmd +15 -0
- package/templates/launcher/hook.ps1 +10 -0
- package/templates/launcher/hook.sh +20 -0
- package/templates/skills/cf-check.md +19 -0
- package/templates/skills/cf-init.md +16 -0
- package/templates/skills/cf-spec.md +20 -0
- package/templates/skills/cf-task-align.md +19 -0
- package/templates/skills/cf-task-archive.md +20 -0
- package/templates/skills/cf-task-plan.md +31 -0
- package/templates/skills/cf-task-prd.md +14 -0
- package/templates/skills/cf-task-start.md +41 -0
- package/{src/core/code-flow/specs/shared/design → templates/workflow}/design-frontend.md +12 -12
- package/{src/core/code-flow/specs/shared/design → templates/workflow}/design-full.md +17 -19
- package/{src/core/code-flow/specs/shared/design → templates/workflow}/design-lite.md +12 -12
- package/{src/core/code-flow/specs/shared/prd-template.md → templates/workflow/prd.md} +1 -1
- package/templates/workflow/project-guidelines.md +48 -0
- package/templates/workflow/scenarios.md +67 -0
- package/templates/workflow/task.md +56 -0
- package/docs/acceptance-contract.md +0 -217
- package/docs/ci/acceptance-evidence.md +0 -77
- package/docs/migrations/runtime-0.7.0.md +0 -41
- package/docs/migrations/runtime-0.8.0.md +0 -154
- package/docs/migrations/runtime-0.9.0.md +0 -40
- package/docs/migrations/spec-workflow-0.6.0.md +0 -42
- package/docs/spec-injection-hardening.md +0 -54
- package/docs/spec-injection-performance.json +0 -73
- package/docs/spec-optimization.md +0 -12
- package/src/adapters/claude/CLAUDE.md +0 -45
- package/src/adapters/claude/commands/cf-init.md +0 -262
- package/src/adapters/claude/commands/cf-learn.md +0 -291
- package/src/adapters/claude/commands/cf-spec.md +0 -87
- package/src/adapters/claude/commands/cf-stats.md +0 -96
- package/src/adapters/claude/commands/cf-sync.md +0 -39
- package/src/adapters/claude/commands/cf-task/align.md +0 -331
- package/src/adapters/claude/commands/cf-task/archive.md +0 -155
- package/src/adapters/claude/commands/cf-task/block.md +0 -49
- package/src/adapters/claude/commands/cf-task/graph.md +0 -92
- package/src/adapters/claude/commands/cf-task/note.md +0 -248
- package/src/adapters/claude/commands/cf-task/plan.md +0 -477
- package/src/adapters/claude/commands/cf-task/prd.md +0 -173
- package/src/adapters/claude/commands/cf-task/start.md +0 -317
- package/src/adapters/claude/commands/cf-task/status.md +0 -71
- package/src/adapters/claude/commands/cf-task/verify-e2e.md +0 -148
- package/src/adapters/claude/commands/cf-validate.md +0 -100
- package/src/adapters/claude/settings.local.json +0 -50
- package/src/adapters/codex/AGENTS.md +0 -45
- package/src/adapters/codex/config.toml +0 -3
- package/src/adapters/codex/hooks.json +0 -54
- package/src/adapters/codex/skills/cf-init/SKILL.md +0 -273
- package/src/adapters/codex/skills/cf-learn/SKILL.md +0 -296
- package/src/adapters/codex/skills/cf-spec/SKILL.md +0 -88
- package/src/adapters/codex/skills/cf-stats/SKILL.md +0 -97
- package/src/adapters/codex/skills/cf-sync/SKILL.md +0 -45
- package/src/adapters/codex/skills/cf-task-align/SKILL.md +0 -332
- package/src/adapters/codex/skills/cf-task-archive/SKILL.md +0 -156
- package/src/adapters/codex/skills/cf-task-block/SKILL.md +0 -50
- package/src/adapters/codex/skills/cf-task-graph/SKILL.md +0 -93
- package/src/adapters/codex/skills/cf-task-note/SKILL.md +0 -245
- package/src/adapters/codex/skills/cf-task-plan/SKILL.md +0 -478
- package/src/adapters/codex/skills/cf-task-prd/SKILL.md +0 -174
- package/src/adapters/codex/skills/cf-task-start/SKILL.md +0 -318
- package/src/adapters/codex/skills/cf-task-status/SKILL.md +0 -72
- package/src/adapters/codex/skills/cf-task-verify-e2e/SKILL.md +0 -145
- package/src/adapters/codex/skills/cf-validate/SKILL.md +0 -102
- package/src/adapters/commands.json +0 -115
- package/src/adapters/costrict/CLAUDE.md +0 -45
- package/src/adapters/costrict/commands/cf-init.md +0 -262
- package/src/adapters/costrict/commands/cf-learn.md +0 -291
- package/src/adapters/costrict/commands/cf-spec.md +0 -87
- package/src/adapters/costrict/commands/cf-stats.md +0 -96
- package/src/adapters/costrict/commands/cf-sync.md +0 -39
- package/src/adapters/costrict/commands/cf-task/align.md +0 -331
- package/src/adapters/costrict/commands/cf-task/archive.md +0 -155
- package/src/adapters/costrict/commands/cf-task/block.md +0 -49
- package/src/adapters/costrict/commands/cf-task/graph.md +0 -92
- package/src/adapters/costrict/commands/cf-task/note.md +0 -248
- package/src/adapters/costrict/commands/cf-task/plan.md +0 -477
- package/src/adapters/costrict/commands/cf-task/prd.md +0 -173
- package/src/adapters/costrict/commands/cf-task/start.md +0 -317
- package/src/adapters/costrict/commands/cf-task/status.md +0 -71
- package/src/adapters/costrict/commands/cf-task/verify-e2e.md +0 -148
- package/src/adapters/costrict/commands/cf-validate.md +0 -100
- package/src/adapters/costrict/settings.local.json +0 -50
- package/src/adapters/install-plan.json +0 -100
- package/src/adapters/opencode/AGENTS.md +0 -45
- package/src/adapters/opencode/commands/cf-init.md +0 -281
- package/src/adapters/opencode/commands/cf-learn.md +0 -295
- package/src/adapters/opencode/commands/cf-spec.md +0 -91
- package/src/adapters/opencode/commands/cf-stats.md +0 -100
- package/src/adapters/opencode/commands/cf-sync.md +0 -44
- package/src/adapters/opencode/commands/cf-task/align.md +0 -331
- package/src/adapters/opencode/commands/cf-task/archive.md +0 -160
- package/src/adapters/opencode/commands/cf-task/block.md +0 -54
- package/src/adapters/opencode/commands/cf-task/graph.md +0 -97
- package/src/adapters/opencode/commands/cf-task/note.md +0 -253
- package/src/adapters/opencode/commands/cf-task/plan.md +0 -477
- package/src/adapters/opencode/commands/cf-task/prd.md +0 -178
- package/src/adapters/opencode/commands/cf-task/start.md +0 -317
- package/src/adapters/opencode/commands/cf-task/status.md +0 -76
- package/src/adapters/opencode/commands/cf-task/verify-e2e.md +0 -148
- package/src/adapters/opencode/commands/cf-validate.md +0 -105
- package/src/adapters/opencode/opencode.json +0 -3
- package/src/adapters/opencode/plugins/code-flow/index.js +0 -162
- package/src/adapters/opencode/plugins/code-flow/package.json +0 -6
- package/src/adapters/platform-bindings.json +0 -370
- package/src/cli.js +0 -1076
- package/src/core/code-flow/config.yml +0 -161
- package/src/core/code-flow/runtime-commands.json +0 -259
- package/src/core/code-flow/scripts/cf_acceptance_manifest.py +0 -10
- package/src/core/code-flow/scripts/cf_acceptance_runner.py +0 -10
- package/src/core/code-flow/scripts/cf_audit.py +0 -10
- package/src/core/code-flow/scripts/cf_codex_hook.py +0 -10
- package/src/core/code-flow/scripts/cf_design_lint.py +0 -10
- package/src/core/code-flow/scripts/cf_evidence_import.py +0 -10
- package/src/core/code-flow/scripts/cf_feedback.py +0 -10
- package/src/core/code-flow/scripts/cf_opencode_event.py +0 -10
- package/src/core/code-flow/scripts/cf_post_hook.py +0 -11
- package/src/core/code-flow/scripts/cf_pre_tool_hook.py +0 -11
- package/src/core/code-flow/scripts/cf_scenarios.py +0 -10
- package/src/core/code-flow/scripts/cf_spec_context.py +0 -10
- package/src/core/code-flow/scripts/cf_spec_gate.py +0 -10
- package/src/core/code-flow/scripts/cf_spec_session.py +0 -10
- package/src/core/code-flow/scripts/cf_stats.py +0 -10
- package/src/core/code-flow/scripts/cf_stop_hook.py +0 -11
- package/src/core/code-flow/scripts/cf_sync.py +0 -10
- package/src/core/code-flow/scripts/cf_task_index.py +0 -10
- package/src/core/code-flow/scripts/cf_task_parallel.py +0 -10
- package/src/core/code-flow/scripts/cf_task_workflow.py +0 -10
- package/src/core/code-flow/scripts/cf_user_prompt_hook.py +0 -11
- package/src/core/code-flow/scripts/cf_validation.py +0 -10
- 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 +0 -347
- package/src/core/code-flow/scripts/codeflow/acceptance/cf_acceptance_manifest_core.py +0 -660
- package/src/core/code-flow/scripts/codeflow/acceptance/cf_acceptance_plan.py +0 -202
- package/src/core/code-flow/scripts/codeflow/acceptance/cf_acceptance_registration.py +0 -60
- package/src/core/code-flow/scripts/codeflow/acceptance/cf_acceptance_risk.py +0 -73
- package/src/core/code-flow/scripts/codeflow/acceptance/cf_acceptance_schema.py +0 -282
- package/src/core/code-flow/scripts/codeflow/acceptance/cf_acceptance_selection.py +0 -266
- package/src/core/code-flow/scripts/codeflow/acceptance/cf_check_inputs.py +0 -172
- package/src/core/code-flow/scripts/codeflow/acceptance/cf_check_registration.py +0 -326
- package/src/core/code-flow/scripts/codeflow/acceptance/cf_checks.py +0 -333
- package/src/core/code-flow/scripts/codeflow/acceptance/cf_plan_quality.py +0 -197
- package/src/core/code-flow/scripts/codeflow/acceptance/cf_scenario_quality.py +0 -174
- package/src/core/code-flow/scripts/codeflow/acceptance/cf_scenario_source.py +0 -300
- package/src/core/code-flow/scripts/codeflow/acceptance/cf_traceability.py +0 -502
- package/src/core/code-flow/scripts/codeflow/cli/__init__.py +0 -0
- package/src/core/code-flow/scripts/codeflow/cli/cf_acceptance_manifest.py +0 -347
- package/src/core/code-flow/scripts/codeflow/cli/cf_acceptance_runner.py +0 -1490
- package/src/core/code-flow/scripts/codeflow/cli/cf_audit.py +0 -533
- package/src/core/code-flow/scripts/codeflow/cli/cf_design_lint.py +0 -172
- package/src/core/code-flow/scripts/codeflow/cli/cf_evidence_import.py +0 -607
- package/src/core/code-flow/scripts/codeflow/cli/cf_feedback.py +0 -53
- package/src/core/code-flow/scripts/codeflow/cli/cf_scenarios.py +0 -58
- package/src/core/code-flow/scripts/codeflow/cli/cf_spec_context.py +0 -1175
- package/src/core/code-flow/scripts/codeflow/cli/cf_spec_gate.py +0 -60
- package/src/core/code-flow/scripts/codeflow/cli/cf_spec_session.py +0 -46
- package/src/core/code-flow/scripts/codeflow/cli/cf_stats.py +0 -540
- package/src/core/code-flow/scripts/codeflow/cli/cf_sync.py +0 -144
- package/src/core/code-flow/scripts/codeflow/cli/cf_task_index.py +0 -177
- package/src/core/code-flow/scripts/codeflow/cli/cf_task_parallel.py +0 -1142
- package/src/core/code-flow/scripts/codeflow/cli/cf_task_workflow.py +0 -742
- package/src/core/code-flow/scripts/codeflow/cli/cf_validation.py +0 -31
- package/src/core/code-flow/scripts/codeflow/core/__init__.py +0 -0
- package/src/core/code-flow/scripts/codeflow/core/cf_context_cache.py +0 -67
- package/src/core/code-flow/scripts/codeflow/core/cf_core.py +0 -609
- package/src/core/code-flow/scripts/codeflow/core/cf_exec_base.py +0 -325
- package/src/core/code-flow/scripts/codeflow/core/cf_fs.py +0 -57
- package/src/core/code-flow/scripts/codeflow/core/cf_git.py +0 -92
- package/src/core/code-flow/scripts/codeflow/core/cf_log.py +0 -160
- package/src/core/code-flow/scripts/codeflow/core/cf_markdown.py +0 -77
- package/src/core/code-flow/scripts/codeflow/core/cf_native_paths.py +0 -26
- package/src/core/code-flow/scripts/codeflow/core/cf_patch.py +0 -33
- package/src/core/code-flow/scripts/codeflow/core/cf_runtime_install.py +0 -32
- package/src/core/code-flow/scripts/codeflow/core/cf_session_state.py +0 -37
- package/src/core/code-flow/scripts/codeflow/core/cf_stop_guard.py +0 -53
- package/src/core/code-flow/scripts/codeflow/core/cf_task_state.py +0 -9
- package/src/core/code-flow/scripts/codeflow/core/cf_validators.py +0 -408
- package/src/core/code-flow/scripts/codeflow/core/cf_worktree_env.py +0 -253
- package/src/core/code-flow/scripts/codeflow/evidence/__init__.py +0 -0
- package/src/core/code-flow/scripts/codeflow/evidence/cf_evidence_store.py +0 -527
- package/src/core/code-flow/scripts/codeflow/hooks/__init__.py +0 -0
- package/src/core/code-flow/scripts/codeflow/hooks/cf_codex_hook.py +0 -95
- package/src/core/code-flow/scripts/codeflow/hooks/cf_opencode_event.py +0 -98
- package/src/core/code-flow/scripts/codeflow/hooks/cf_post_hook.py +0 -30
- package/src/core/code-flow/scripts/codeflow/hooks/cf_pre_tool_hook.py +0 -41
- package/src/core/code-flow/scripts/codeflow/hooks/cf_stop_hook.py +0 -292
- package/src/core/code-flow/scripts/codeflow/hooks/cf_user_prompt_hook.py +0 -161
- package/src/core/code-flow/scripts/codeflow/spec/__init__.py +0 -0
- package/src/core/code-flow/scripts/codeflow/spec/cf_active_task.py +0 -412
- package/src/core/code-flow/scripts/codeflow/spec/cf_context_refresh.py +0 -301
- package/src/core/code-flow/scripts/codeflow/spec/cf_edit_service.py +0 -149
- package/src/core/code-flow/scripts/codeflow/spec/cf_injection.py +0 -111
- package/src/core/code-flow/scripts/codeflow/spec/cf_rule_readiness.py +0 -114
- package/src/core/code-flow/scripts/codeflow/spec/cf_scan.py +0 -367
- package/src/core/code-flow/scripts/codeflow/spec/cf_spec_budget.py +0 -55
- package/src/core/code-flow/scripts/codeflow/spec/cf_spec_context_model.py +0 -477
- package/src/core/code-flow/scripts/codeflow/spec/cf_spec_impact.py +0 -119
- package/src/core/code-flow/scripts/codeflow/spec/cf_spec_metadata.py +0 -387
- package/src/core/code-flow/scripts/codeflow/spec/cf_spec_migrate.py +0 -529
- package/src/core/code-flow/scripts/codeflow/spec/cf_spec_optimize.py +0 -193
- package/src/core/code-flow/scripts/codeflow/spec/cf_spec_optimize_apply.py +0 -187
- package/src/core/code-flow/scripts/codeflow/spec/cf_spec_resolver.py +0 -369
- package/src/core/code-flow/scripts/codeflow/spec/cf_spec_router.py +0 -304
- package/src/core/code-flow/scripts/codeflow/spec/cf_spec_verify.py +0 -687
- package/src/core/code-flow/scripts/codeflow/spec/cf_stage_gate.py +0 -330
- package/src/core/code-flow/scripts/codeflow/spec/cf_task_projection.py +0 -83
- package/src/core/code-flow/scripts/codeflow/spec/cf_workflow_service.py +0 -755
- package/src/core/code-flow/scripts/codeflow/spec/cf_workflow_transaction.py +0 -110
- package/src/core/code-flow/scripts/codeflow/task/__init__.py +0 -0
- package/src/core/code-flow/scripts/codeflow/task/cf_requirement_verification.py +0 -867
- package/src/core/code-flow/scripts/codeflow/task/cf_task_doc.py +0 -178
- package/src/core/code-flow/scripts/codeflow/task/cf_task_merge.py +0 -635
- package/src/core/code-flow/scripts/codeflow/task/cf_task_plan.py +0 -251
- package/src/core/code-flow/scripts/codeflow/task/cf_task_runtime.py +0 -570
- package/src/core/code-flow/scripts/codeflow/task/cf_validation_service.py +0 -73
- package/src/core/code-flow/scripts/runtime-resources.json +0 -29
- package/src/core/code-flow/specs/backend/_map.md +0 -56
- package/src/core/code-flow/specs/backend/code-quality-performance.md +0 -59
- package/src/core/code-flow/specs/backend/database.md +0 -51
- package/src/core/code-flow/specs/backend/directory-structure.md +0 -54
- package/src/core/code-flow/specs/backend/logging.md +0 -50
- package/src/core/code-flow/specs/backend/platform-rules.md +0 -55
- package/src/core/code-flow/specs/frontend/_map.md +0 -52
- package/src/core/code-flow/specs/frontend/component-specs.md +0 -68
- package/src/core/code-flow/specs/frontend/directory-structure.md +0 -53
- package/src/core/code-flow/specs/frontend/quality-standards.md +0 -58
- package/src/core/code-flow/specs/shared/_map.md +0 -57
- package/src/core/code-flow/specs/shared/scenarios-template.md +0 -55
- package/src/core/code-flow/tasks/.gitkeep +0 -0
- package/src/core/code-flow/validation.yml +0 -59
- package/src/migrate/runtime.js +0 -213
- package/src/migrate/spec-workflow.js +0 -253
- package/src/runtime.js +0 -219
package/docs/USAGE.md
CHANGED
|
@@ -1,1529 +1,268 @@
|
|
|
1
|
-
# code-flow
|
|
1
|
+
# code-flow v1 使用说明
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
本文描述 v1 用法;实现状态见 [实施记录](v1-implementation.md),完整契约见 [设计](v1-design.md)。
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
- [核心概念](#核心概念)
|
|
7
|
-
- [质量闭环](#质量闭环)
|
|
8
|
-
- [CLI 命令](#cli-命令)
|
|
9
|
-
- [可执行场景、设计和计划门禁](#可执行场景设计和计划门禁)
|
|
10
|
-
- [规范管理命令](#规范管理命令)
|
|
11
|
-
- [任务管理命令](#任务管理命令)
|
|
12
|
-
- [配置参考](#配置参考)
|
|
13
|
-
- [工作流示例](#工作流示例)
|
|
14
|
-
- [Hook 机制](#hook-机制)
|
|
15
|
-
- [故障排查](#故障排查)
|
|
16
|
-
- [0.8.0 运行时命令契约](#080-运行时命令契约)
|
|
17
|
-
|
|
18
|
-
场景格式、测试登记、报告口径与常见错误统一见[可执行验收契约](acceptance-contract.md);升级见 [0.8 迁移指南](migrations/runtime-0.8.0.md)。
|
|
19
|
-
|
|
20
|
-
---
|
|
21
|
-
|
|
22
|
-
## 快速开始
|
|
23
|
-
|
|
24
|
-
### 支持的 AI 工具
|
|
25
|
-
|
|
26
|
-
code-flow 同时支持 Claude Code、Codex CLI、Costrict 和 OpenCode,四者共用同一套 `.code-flow/` 规范体系:
|
|
27
|
-
|
|
28
|
-
| AI 工具 | 指令文件 | Hook 触发时机 | 命令调用方式 |
|
|
29
|
-
|---------|---------|--------------|------------|
|
|
30
|
-
| [Claude Code](https://claude.ai/code) | `CLAUDE.md` | prompt(Catalog/直注)+ 编辑前注入 + 编辑后合规反馈 + 收尾守门 | `/cf-init`、`/cf-learn` 等 |
|
|
31
|
-
| [Codex CLI](https://github.com/openai/codex) | `AGENTS.md` | 同上(hooks.json:UserPromptSubmit/PostToolUse/Stop) | `$cf-init`、`$cf-learn` 等 |
|
|
32
|
-
| [Costrict](https://costrict.com) | `CLAUDE.md` | 同 Claude Code(五 Hook 同协议) | `/cf-init`、`/cf-learn` 等 |
|
|
33
|
-
| [OpenCode](https://opencode.ai) v2 | `AGENTS.md` | v2 插件 hooks 等价转发(`session.prompt`/`tool.execute.after`/`session.idle`) | `/cf-init`、`/cf-learn` 等 |
|
|
34
|
-
|
|
35
|
-
> 四者可同时使用同一项目,规范文件 `.code-flow/specs/` 完全共享。
|
|
36
|
-
|
|
37
|
-
### 前置条件
|
|
38
|
-
|
|
39
|
-
- Node.js 18+(用于 CLI)
|
|
40
|
-
- Python 3.9+
|
|
41
|
-
- pyyaml (`pip install pyyaml`)
|
|
42
|
-
- Codex CLI(如使用 Codex):`npm i -g @openai/codex`,并在 `.codex/config.toml` 中启用 `features.hooks = true`(v0.4.7 起由 codex_hooks 更名;`code-flow init` 自动生成)
|
|
43
|
-
- OpenCode v2(如使用 OpenCode):`opencode.ai`;插件位于 `.opencode/plugins/code-flow/`,由 OpenCode v2 自动加载(v1 插件 API 不兼容)
|
|
44
|
-
|
|
45
|
-
### 安装
|
|
5
|
+
## 1. 全局安装
|
|
46
6
|
|
|
47
7
|
```bash
|
|
48
|
-
# npm
|
|
49
8
|
npm i -g @michaelxwb/code-flow
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
```
|
|
54
|
-
|
|
55
|
-
仓库版本与 npm 的 `latest` 标签独立。安装后核对 `code-flow --version`;需要尚未发布的本地修复时,按 [README 的本地包安装步骤](../README.md#升级)操作。已有项目升级 CLI 后,还要执行 `code-flow migrate --runtime --dry-run` → `--apply`,更新项目 runtime 与已安装平台。
|
|
56
|
-
|
|
57
|
-
### 初始化项目
|
|
58
|
-
|
|
59
|
-
```bash
|
|
60
|
-
cd your-project
|
|
61
|
-
code-flow init # 默认等价于 --platform=claude
|
|
62
|
-
# 或显式指定:
|
|
63
|
-
# code-flow init --platform=claude
|
|
64
|
-
# code-flow init --platform=codex
|
|
65
|
-
# code-flow init --platform=costrict
|
|
66
|
-
# code-flow init --platform=opencode
|
|
67
|
-
```
|
|
68
|
-
|
|
69
|
-
初始化后生成的目录结构(按平台):
|
|
70
|
-
|
|
71
|
-
**所有平台都会生成(core,共用)**:
|
|
72
|
-
|
|
73
|
-
```
|
|
74
|
-
your-project/
|
|
75
|
-
├── .code-flow/
|
|
76
|
-
│ ├── config.yml # 核心配置(路径映射、预算、注入规则)
|
|
77
|
-
│ ├── validation.yml # 验证规则(lint、type check、test)
|
|
78
|
-
│ ├── scripts/ # Python 运行时脚本
|
|
79
|
-
│ │ ├── cf_core.py # 核心工具库
|
|
80
|
-
│ │ ├── cf_pre_tool_hook.py # PreToolUse Hook:Context/scope 检查(替代旧 cf_inject_hook)
|
|
81
|
-
│ │ ├── cf_user_prompt_hook.py # prompt 路由服务及 Claude/Costrict 入口
|
|
82
|
-
│ │ ├── cf_spec_session.py # 会话状态管理(替代旧 cf_session_hook)
|
|
83
|
-
│ │ ├── cf_post_hook.py # PostToolUse Hook:合规反馈(v0.5)
|
|
84
|
-
│ │ ├── cf_stop_hook.py # Stop Hook:收尾守门(v0.5)
|
|
85
|
-
│ │ ├── cf_spec_context.py # Spec Context 刷新/校验
|
|
86
|
-
│ │ ├── cf_spec_gate.py # Stage Gate 判定
|
|
87
|
-
│ │ ├── cf_spec_router.py # Context-first 路由
|
|
88
|
-
│ │ ├── cf_task_runtime.py # active-task 运行时
|
|
89
|
-
│ │ ├── cf_log.py / cf_checks.py # 会话日志 / checks 引擎(v0.5)
|
|
90
|
-
│ │ ├── cf_feedback.py # 误报标记 CLI(v0.5)
|
|
91
|
-
│ │ ├── cf_scan.py # Token 审计脚本
|
|
92
|
-
│ │ └── cf_stats.py # 统计脚本
|
|
93
|
-
│ └── specs/ # 规范文件目录(四端共用)
|
|
94
|
-
│ ├── frontend/ # 前端域(按项目类型生成)
|
|
95
|
-
│ │ ├── _map.md # Tier 0 导航地图
|
|
96
|
-
│ │ ├── directory-structure.md
|
|
97
|
-
│ │ ├── quality-standards.md
|
|
98
|
-
│ │ └── component-specs.md
|
|
99
|
-
│ └── backend/ # 后端域(按项目类型生成)
|
|
100
|
-
│ ├── _map.md
|
|
101
|
-
│ ├── directory-structure.md
|
|
102
|
-
│ ├── logging.md
|
|
103
|
-
│ ├── database.md
|
|
104
|
-
│ ├── platform-rules.md
|
|
105
|
-
│ └── code-quality-performance.md
|
|
106
|
-
```
|
|
107
|
-
|
|
108
|
-
**仅 Claude 平台生成/更新(`code-flow init` 默认)**:
|
|
109
|
-
|
|
110
|
-
```
|
|
111
|
-
.claude/
|
|
112
|
-
└── settings.local.json # Claude Code Hook 配置
|
|
113
|
-
CLAUDE.md # L0 全局指令(Claude Code 每次对话读取)
|
|
114
|
-
.claude/commands/ # Claude 命令文件
|
|
115
|
-
```
|
|
116
|
-
|
|
117
|
-
**仅 Codex 平台生成/更新(`code-flow init --platform=codex`)**:
|
|
118
|
-
|
|
119
|
-
```
|
|
120
|
-
.codex/
|
|
121
|
-
├── hooks.json # Codex CLI Hook 配置
|
|
122
|
-
└── config.toml # Codex 功能开关
|
|
123
|
-
AGENTS.md # L0 全局指令(Codex CLI 每次对话读取)
|
|
124
|
-
.agents/skills/ # Codex Skills(项目级,自动安装)
|
|
125
|
-
cf-init/SKILL.md、cf-learn/SKILL.md、cf-stats/SKILL.md 等
|
|
126
|
-
```
|
|
127
|
-
|
|
128
|
-
**仅 Costrict 平台生成/更新(`code-flow init --platform=costrict`)**:
|
|
129
|
-
|
|
130
|
-
```
|
|
131
|
-
.costrict/
|
|
132
|
-
├── settings.local.json # Costrict Hook 配置
|
|
133
|
-
└── commands/ # Costrict 命令文件
|
|
134
|
-
cf-init.md、cf-learn.md、cf-stats.md 等
|
|
135
|
-
CLAUDE.md # L0 全局指令(Costrict 与 Claude Code 同用 CLAUDE.md)
|
|
9
|
+
code-flow init --platform=claude
|
|
10
|
+
code-flow init --platform=codex
|
|
11
|
+
code-flow init --platform=all
|
|
136
12
|
```
|
|
137
13
|
|
|
138
|
-
|
|
14
|
+
每个使用的平台安装一次。之后 code-flow init 更新当前项目全部已安装的 v1 平台。init --dry-run 只展示变更;不写目录、绑定或锁。
|
|
139
15
|
|
|
140
|
-
|
|
141
|
-
.opencode/
|
|
142
|
-
├── commands/ # OpenCode 命令文件(含 cf-task/)
|
|
143
|
-
│ cf-init.md、cf-learn.md、cf-stats.md、cf-task/{prd,align,plan,...}.md
|
|
144
|
-
└── plugins/code-flow/ # OpenCode v2 原生插件(事件调用 cf_opencode_event.py)
|
|
145
|
-
├── index.js # ESM 插件入口(默认导出 { id, setup })
|
|
146
|
-
└── package.json # `"type": "module"`
|
|
147
|
-
opencode.json # OpenCode 配置(仅 `$schema`;`.opencode/plugins/` 自动发现,无需注册键)
|
|
148
|
-
AGENTS.md # L0 全局指令(OpenCode 每次对话读取)
|
|
149
|
-
```
|
|
16
|
+
init 还会安装 `.code-flow/templates/project-guidelines.md` 作为项目规范 starter。`cf-init` 会据此把项目特有规范写到 `CLAUDE.md` / `AGENTS.md` 的 code-flow 托管块之外,并把 `.code-flow/specs` 明确为规范事实源。受管 skill/插件被用户修改或 Codex 配置无法解析时,init 跳过该文件并在 `conflicts` 中报告,其他文件照常写入;解决后重跑。
|
|
150
17
|
|
|
151
|
-
|
|
18
|
+
Hook 通过项目 bridge 校验 PATH 全局包与协议后优先使用,回退初始化时的固定 Node/JS。项目本地 bin 不参与选择;错误降级且不阻断。两种入口均失效时重新 init,doctor 给出诊断;宿主加载与信任需在宿主中确认。
|
|
152
19
|
|
|
153
|
-
|
|
20
|
+
Codex 的 `features.hooks` 只自动维护规范 `[features]` 表和根级单行 `features.hooks`;引号键、引号形式的 features 表、inline table、数组表或多行值会在 init 时返回 `config_format`,需手工改成规范形式。
|
|
154
21
|
|
|
155
|
-
|
|
156
|
-
# 更新全局包
|
|
157
|
-
npm i -g @michaelxwb/code-flow@latest
|
|
22
|
+
Windows 支持 CMD、PowerShell 和 Git Bash:CMD 使用 `hook.cmd`,PowerShell 使用 `hook.ps1`(委托已验证的 CMD 入口),Git Bash 可运行 `hook.sh` 或直接调用 `code-flow` CLI。三种入口均由 Windows CI 覆盖。
|
|
158
23
|
|
|
159
|
-
|
|
160
|
-
cd your-project
|
|
161
|
-
code-flow init
|
|
162
|
-
```
|
|
163
|
-
|
|
164
|
-
升级时 code-flow 会自动检测当前版本和新版本的差异:
|
|
165
|
-
- **工具文件**(commands/、skills/、scripts/、插件):直接更新
|
|
166
|
-
- **合并文件**(CLAUDE.md、AGENTS.md、settings.local.json、hooks.json、config.toml、config.yml、opencode.json):智能合并,保留用户自定义内容
|
|
167
|
-
- **用户文件**(specs/、tasks/、validation.yml、.gitignore):不覆盖(.code-flow/.gitignore 的托管块会自动补齐运行时条目)
|
|
24
|
+
## 2. 创建 Spec
|
|
168
25
|
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
```bash
|
|
172
|
-
code-flow init --force
|
|
173
|
-
```
|
|
26
|
+
文件 .code-flow/specs/cli/runtime.md:
|
|
174
27
|
|
|
28
|
+
````markdown
|
|
175
29
|
---
|
|
176
|
-
|
|
177
|
-
## 核心概念
|
|
178
|
-
|
|
179
|
-
### 两层规范体系
|
|
180
|
-
|
|
181
|
-
code-flow 采用两层规范架构,自动为 AI 编码提供上下文约束:
|
|
182
|
-
|
|
183
|
-
| 层级 | 文件 | 加载方式 | 内容 |
|
|
184
|
-
|------|------|---------|------|
|
|
185
|
-
| **Tier 0** | `CLAUDE.md` + `_map.md` | 每次对话自动加载 | 全局指令 + 导航地图 |
|
|
186
|
-
| **Tier 1** | `code-standards.md` 等 | 编辑代码时 Hook 按标签注入 | 编码规则、模式、反模式 |
|
|
187
|
-
|
|
188
|
-
**为什么分两层?**
|
|
189
|
-
|
|
190
|
-
- Tier 0 提供全局视角("代码在哪里"),每次对话都需要
|
|
191
|
-
- Tier 1 提供精准约束("代码怎么写"),只在编辑对应文件时才需要
|
|
192
|
-
- 分层后 token 预算可控,避免一次性加载所有规范
|
|
193
|
-
|
|
194
|
-
### 导航地图 (`_map.md`)
|
|
195
|
-
|
|
196
|
-
每个域一个导航地图,结构固定:
|
|
197
|
-
|
|
198
|
-
```markdown
|
|
199
|
-
# [Domain] Retrieval Map
|
|
200
|
-
|
|
201
|
-
## Purpose — 项目在该域的角色
|
|
202
|
-
## Architecture — 技术栈和架构模式
|
|
203
|
-
## Key Files — 关键入口文件表
|
|
204
|
-
## Module Map — 目录树形图
|
|
205
|
-
## Data Flow — 数据流向
|
|
206
|
-
## Navigation Guide — "做 X 去哪里"
|
|
207
|
-
```
|
|
208
|
-
|
|
209
|
-
### 约束规范 (code-standards 等)
|
|
210
|
-
|
|
211
|
-
每个约束 spec 文件遵循统一格式:
|
|
212
|
-
|
|
213
|
-
```markdown
|
|
214
|
-
---
|
|
215
|
-
description: 一句话适用场景(Spec Catalog 目录行来源,v0.5+)
|
|
216
|
-
checks: # 可选:机检标注(v0.5+,见「质量闭环」)
|
|
217
|
-
- id: no-print-debug
|
|
218
|
-
type: regex
|
|
219
|
-
pattern: '^\s*print\('
|
|
220
|
-
files: "**/*.py"
|
|
221
|
-
message: 禁止 print() 调试
|
|
222
|
-
---
|
|
223
|
-
|
|
224
|
-
# [规范名称]
|
|
225
|
-
|
|
226
|
-
## Examples — ✅/❌ 代码对照示例(对 AI 引导最有效,优先使用)
|
|
227
|
-
## Rules — 必须遵守的硬性约束
|
|
228
|
-
## Patterns — 推荐的实现方式
|
|
229
|
-
## Anti-Patterns — 明确禁止的做法
|
|
230
|
-
```
|
|
231
|
-
|
|
232
|
-
> frontmatter 仅用于目录与机检,注入时自动剥离、不占 token 预算。
|
|
233
|
-
|
|
234
|
-
### 自动注入机制
|
|
235
|
-
|
|
236
|
-
**Catalog 模式(默认)**:prompt 不含明确文件路径时,注入一份极小的 **Spec Catalog**(每个 spec 一行适用场景,~150 token),由 AI 按语义自行读取相关 spec 全文——语义匹配交给模型本身,比关键词词表准确(实测可达率 76%→100%):
|
|
237
|
-
|
|
238
|
-
```
|
|
239
|
-
用户提交 prompt(无明确路径)→ 注入 Spec Catalog
|
|
240
|
-
→ AI 按目录行判断 → Read 相关 spec 全文
|
|
241
|
-
```
|
|
242
|
-
|
|
243
|
-
prompt 含明确文件路径、或 AI 实际编辑文件时,仍**直接注入完整约束**兜底:
|
|
244
|
-
|
|
245
|
-
**Claude Code / Costrict**:AI 调用 Edit/Write 时,`PreToolUse Hook` 自动拦截并注入规范:
|
|
246
|
-
|
|
247
|
-
```
|
|
248
|
-
AI 调用 Edit/Write → Hook 拦截(文件路径)
|
|
249
|
-
→ 提取标签 → 匹配 specs → 注入到 AI 上下文
|
|
250
|
-
```
|
|
251
|
-
|
|
252
|
-
**Codex CLI**:用户提交 prompt 时,`UserPromptSubmit Hook` 提取文件引用,命中域则直注完整约束,否则注入 Catalog:
|
|
253
|
-
|
|
254
|
-
```
|
|
255
|
-
用户提交 prompt → Hook 拦截(prompt 文本)
|
|
256
|
-
→ 含路径且命中域 → 直注完整约束
|
|
257
|
-
→ 否则 → 注入 Spec Catalog(AI 自取)
|
|
258
|
-
```
|
|
259
|
-
|
|
260
|
-
> Catalog 模式是唯一行为;v0.4 的纯词表匹配已移除。
|
|
261
|
-
|
|
262
|
-
**OpenCode**:通过 `.opencode/plugins/code-flow/` 插件介入(v2 hooks):
|
|
263
|
-
|
|
264
|
-
```
|
|
265
|
-
用户消息 → 原生 session.prompt hook → cf_opencode_event.py → 共享 prompt 服务
|
|
266
|
-
→ 原生 RPC 返回 context/blocked → 当前插件按 sessionID 排队
|
|
267
|
-
→ session.context hook 将反馈注入 system(SystemPart)
|
|
268
|
-
```
|
|
269
|
-
|
|
270
|
-
四者效果一致,用户无需手动操作,整个过程透明。Hook 输出 JSON 用 `ensure_ascii=False`,避免中文 spec 被 escape 后吃掉 token 预算。
|
|
271
|
-
|
|
272
|
-
### Token 预算
|
|
273
|
-
|
|
274
|
-
规范注入受 token 预算限制,防止上下文膨胀:
|
|
275
|
-
|
|
276
|
-
| 预算项 | 默认值 | 说明 |
|
|
277
|
-
|--------|--------|------|
|
|
278
|
-
| `total` | 2500 | L0 + L1 总预算 |
|
|
279
|
-
| `l0_max` | 800 | CLAUDE.md 最大 token |
|
|
280
|
-
| `l1_max` | 1700 | 所有 tier 1 specs 合计上限 |
|
|
281
|
-
| `map_max` | 400 | 单个 `_map.md` 最大 token |
|
|
282
|
-
| `catalog_max` | 200 | Spec Catalog 目录上限(超出按约束优先截断并告警) |
|
|
283
|
-
|
|
284
|
-
> Hook 注入前默认对 spec 做**保守无损压缩**(`quality_loop.compress: true`),压缩后的 token 才参与预算决策,相同预算下可容纳更完整的 spec。设 `quality_loop.compress: false` 可关闭;`cf-stats` 输出 `compression_summary` 及 `COMPRESSION: raw → compressed (-pct%)` 行。
|
|
285
|
-
|
|
286
|
-
---
|
|
287
|
-
|
|
288
|
-
## 质量闭环
|
|
289
|
-
|
|
290
|
-
> v0.5 新增。零配置开箱即用,`quality_loop.enabled: false` 一键回退。所有数据仅存本地 `.code-flow/`,30 天 / 5MB 滚动,不上传不外发。
|
|
291
|
-
|
|
292
|
-
### 合规反馈(编辑后机检)
|
|
293
|
-
|
|
294
|
-
spec frontmatter 标注 `checks` 后,AI 每次编辑文件都会被自动检查,违规当场反馈修正——**只提示、不阻断**,同一规则同一文件每会话只提醒一次:
|
|
295
|
-
|
|
296
|
-
```
|
|
297
|
-
AI 编辑 src/app.py(写入 print 调试)
|
|
298
|
-
→ PostToolUse Hook 执行匹配域的 checks
|
|
299
|
-
→ 反馈:⚠ 禁止 print() 调试(规则: scripts/code-standards.md#no-print-debug)
|
|
300
|
-
→ AI 当场修正
|
|
301
|
-
```
|
|
302
|
-
|
|
303
|
-
checks 字段:`id`(kebab-case 唯一)、`type`(当前支持 regex;ast/cmd 接口预留)、`pattern`、`files`(fnmatch glob,缺省 `*`)、`message`(≤200 字符)、`severity`(warn/info,无 error 级)。
|
|
304
|
-
|
|
305
|
-
### 收尾守门
|
|
306
|
-
|
|
307
|
-
会话结束时,Stop Hook 按 `validation.yml` 对本会话编辑过的文件执行校验,未过项会把 AI 拦回修复(总预算 30s,超时输出已完成部分;无 validation.yml 则静默跳过)。
|
|
308
|
-
|
|
309
|
-
同一工作区的 Stop 使用非阻塞进程锁;并发调用立即返回 stop_already_running 和持有者 PID。进程退出后 OS 自动释放锁。命令超时会清理子进程组,避免后代进程持有输出管道导致长期等待。
|
|
310
|
-
|
|
311
|
-
### 学习沉淀(纠正即规范)
|
|
312
|
-
|
|
313
|
-
你在对话中纠正 AI("不要用 print 调试"、"改回去")会被记录为 correction 事件;`/cf-learn` 把同类纠正与 AI 随后的修正编辑配对成 ✅/❌ 证据对,聚合 ≥2 次生成候选规范(附 checks 草稿),由你确认后落盘——**纠正一次,不用说第二遍**。
|
|
314
|
-
|
|
315
|
-
### 误报治理
|
|
316
|
-
|
|
317
|
-
反馈出现误报时直接告诉 AI"这是误报",它会代为执行:
|
|
318
|
-
|
|
319
|
-
```bash
|
|
320
|
-
code-flow feedback ignore <check-id>
|
|
321
|
-
```
|
|
322
|
-
|
|
323
|
-
同一规则误报 ≥3 次或误报率 >10% 自动停用并在 `cf-stats` 标注;`cf-stats --audit` 输出待复审清单(长期未命中 / 已停用 / 反复误报的规范),处置后加入 `.check-state.json` 的 `_review_exempt` 列表即不再提示。
|
|
324
|
-
|
|
325
|
-
### 运行时数据
|
|
326
|
-
|
|
327
|
-
| 文件 | 内容 | 说明 |
|
|
328
|
-
|------|------|------|
|
|
329
|
-
| `.code-flow/.session-log.jsonl` | 会话事件流(inject/edit/violation/correction/degrade/stop_check) | 5MB 滚动归档至 `sessions/YYYY-MM/` |
|
|
330
|
-
| `.code-flow/.check-state.json` | check 触发/误报/停用状态 | 误报治理与复审的数据源 |
|
|
331
|
-
|
|
332
|
-
两者均已加入 `.code-flow/.gitignore`,首次使用自动创建。
|
|
333
|
-
|
|
30
|
+
{"description":"CLI 运行时规则","next_rule":2}
|
|
334
31
|
---
|
|
32
|
+
# Runtime
|
|
335
33
|
|
|
336
|
-
##
|
|
337
|
-
|
|
338
|
-
### 0.8 用户命令面(16 → 11)
|
|
339
|
-
|
|
340
|
-
0.8.0 把 Agent 命令从 16 条收敛到 11 条。命令清单的唯一权威源是 `src/adapters/commands.json`,四平台(Claude Code / Codex / Costrict / OpenCode)从同一目录生成/校验;旧命令文件保留一个 minor,0.9.0 移除。
|
|
34
|
+
## Rules
|
|
341
35
|
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
| `cf-learn` | 从项目配置、代码与变更中沉淀规范 |
|
|
346
|
-
| `cf-spec` | Spec Context、迁移计划与 `code-flow spec doctor` |
|
|
347
|
-
| `cf-stats` | Token/预算统计与规范质量审计 |
|
|
348
|
-
| `cf-task:prd` | 产出产品需求文档 |
|
|
349
|
-
| `cf-task:align` | 需求对齐与设计简报 |
|
|
350
|
-
| `cf-task:plan` | 能力级任务拆解与预算门禁 |
|
|
351
|
-
| `cf-task:start` | 激活任务并编码 |
|
|
352
|
-
| `cf-task:status` | 任务总览;`--notes` / `--block` / `--graph` 子动作 |
|
|
353
|
-
| `cf-task:archive` | 归档已完成需求 |
|
|
354
|
-
| `cf-task:verify-e2e` | 分层/分级验证(`code-flow task verify` 兼容别名) |
|
|
36
|
+
- [RULE-001] Hook stdout 只输出协议 JSON。
|
|
37
|
+
诊断输出到 stderr,保留完整多行说明和代码示例。
|
|
38
|
+
````
|
|
355
39
|
|
|
356
|
-
|
|
40
|
+
身份是 cli/runtime。新增规则从 next_rule 分配数字 ID;手动编辑时也要维护计数,删除编号不能复用。允许 RULE-cli-json-001 这样的语义 ID。
|
|
357
41
|
|
|
358
|
-
|
|
359
|
-
|------|------|--------------|
|
|
360
|
-
| `cf-task:note` | 别名(0.9.0 移除) | `/cf-task:status --notes` |
|
|
361
|
-
| `cf-task:block` | 别名(0.9.0 移除) | `/cf-task:status --block` |
|
|
362
|
-
| `cf-task:graph` | 别名(0.9.0 移除) | `/cf-task:status --graph` |
|
|
363
|
-
| `cf-validate` | 别名(0.9.0 移除) | `code-flow task verify --checks` |
|
|
364
|
-
| `cf-sync` | internal(开发/发布维护) | 不属于用户安装面 |
|
|
42
|
+
config.json:
|
|
365
43
|
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
code-flow init --platform=costrict # 显式初始化 Costrict 适配文件
|
|
377
|
-
code-flow init --platform=opencode # 显式初始化 OpenCode 适配文件
|
|
378
|
-
code-flow init --force # 强制重新生成(覆盖工具文件)
|
|
379
|
-
code-flow --help # 查看帮助
|
|
44
|
+
```json
|
|
45
|
+
{
|
|
46
|
+
"version": 1,
|
|
47
|
+
"workflow": "hook",
|
|
48
|
+
"always": ["cli/runtime"],
|
|
49
|
+
"paths": { "src/**/*.js": ["cli/runtime"] },
|
|
50
|
+
"budget": { "maxTokens": 2500, "maxBytes": 16384 },
|
|
51
|
+
"tests": { "timeoutSeconds": 120, "jobs": 2, "regression": null },
|
|
52
|
+
"capture": { "enabled": false, "path": ".code-flow/process" }
|
|
53
|
+
}
|
|
380
54
|
```
|
|
381
55
|
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
| 模式 | 触发条件 | 行为 |
|
|
385
|
-
|------|---------|------|
|
|
386
|
-
| fresh | 项目无 `.code-flow/` | 全量生成 |
|
|
387
|
-
| upgrade | 已有旧版本 | 增量更新,保留用户自定义 |
|
|
388
|
-
| current | 版本一致 | 跳过(输出提示) |
|
|
389
|
-
| force | `--force` 参数 | 强制覆盖工具文件 |
|
|
390
|
-
|
|
391
|
-
### `code-flow evidence import` — CI 证据导入
|
|
392
|
-
|
|
393
|
-
全量 E2E 在 CI 执行后,把 JUnit / Playwright 报告导入 central evidence sidecar;本地 `task verify`、collect 与 archive 直接消费该证据,不再重跑同一 check。
|
|
56
|
+
always 适合少量共享基础规则;领域规范通常放在 Task 的 spec_refs。支持 *、**、?;** 可匹配零层目录,路径严格区分大小写。
|
|
394
57
|
|
|
395
58
|
```bash
|
|
396
|
-
code-flow
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
code-flow evidence import --format playwright --file ci/playwright.json \
|
|
400
|
-
--commit "$(git rev-parse HEAD)" --run-url "https://ci.example.com/runs/42" \
|
|
401
|
-
--check CHK-0123456789ab --json
|
|
402
|
-
```
|
|
403
|
-
|
|
404
|
-
映射与校验规则(全部 fail-closed,缺失即拒绝导入):
|
|
405
|
-
|
|
406
|
-
- `--commit` 必须解析为当前 `HEAD`;不同 commit 的报告不能证明当前工作区。
|
|
407
|
-
- 工作区必须干净(忽略 `.code-flow/`);报告请放在仓库外,或加入 `.gitignore`。
|
|
408
|
-
- `--run-url` 必须是非空 http(s) 地址;证据固定写入 `source=ci`,并绑定当前 `input_hash`。
|
|
409
|
-
- 用例名中的 check ID(`CHK-...`)必须唯一;同一用例同时标记多个 check 会被拒绝。场景 ID(如 `test_acceptance[S-01]`)和 manifest 的 `assertions`(`file:line`)仅用于绑定一个 check 的场景;显式 `--check` 表示整个报告属于该 check。
|
|
410
|
-
- 一个场景绑定多个 checks 时,报告必须分别覆盖全部 check,才能更新该场景。使用下面的显式格式;不得用一条仅标记场景 ID 的用例推断多个 checks 已执行,缺少部分 check 的报告也不能将整个场景标为 verified。
|
|
411
|
-
- 无法映射的用例、`skipped` 用例不会被伪装成通过:映射失败拒绝导入,`skipped` 记为 `incomplete`。
|
|
412
|
-
- 报告推导的 exit code 与 `--exit-code` 不一致时拒绝导入(CI job 因基础设施失败但报告全绿的情况不会被误收)。
|
|
413
|
-
- 导入结果按 check 聚合:全部通过才写 `passed` / `verified`,任一失败写 `failed`;重复导入同一报告是幂等的。
|
|
414
|
-
|
|
415
|
-
```xml
|
|
416
|
-
<testsuite name="acceptance">
|
|
417
|
-
<testcase name="test_cache[CHK-A]" />
|
|
418
|
-
<testcase name="test_resume[CHK-B]" />
|
|
419
|
-
</testsuite>
|
|
420
|
-
```
|
|
421
|
-
|
|
422
|
-
风险接受通过 `acceptance risk --risk-owner TASK-001` 绑定该任务在当前 check 下负责的场景。新增场景不会自动继承已有风险接受;其他任务共用同一 check 时仍需独立验收。`stats` / `audit` 的 `accepted_risks` 只计当前有效且归属匹配的 check,`recorded_risks` 计全部登记,`inactive_risks` 计过期或归属已失效的登记;`deferred_rules` 只计实际延后到 review/heavy 的规则,预算或环境未执行项不算合法延后。
|
|
423
|
-
|
|
424
|
-
旧版 design 保留完整场景定义时可以继续走兼容审计。只有场景引用的 design 缺少 `.scenarios.md` 时返回 `scenario_source_missing`,需恢复场景源后重跑,不能从引用表推断测试层级和真实边界。
|
|
425
|
-
|
|
426
|
-
## 可执行场景、设计和计划门禁
|
|
427
|
-
|
|
428
|
-
`<需求>.scenarios.md` 是验收唯一源,design 引用场景 ID;任务登记责任与命令,manifest 保存投影和执行配置。先验证场景与设计,再锁定和验证计划:
|
|
429
|
-
|
|
430
|
-
```bash
|
|
431
|
-
code-flow scenarios parse --file "<需求>.scenarios.md" --quality --json
|
|
432
|
-
code-flow design lint --file "<需求>.design.md" --scenarios-file "<需求>.scenarios.md" --json
|
|
433
|
-
code-flow acceptance manifest --task-file "<任务文件>" --output "<需求目录>/.acceptance-manifest.json" --scenarios-file "<需求>.scenarios.md" --register-checks
|
|
434
|
-
code-flow spec refresh --task-dir "<需求目录>" --root "$PWD" --json
|
|
435
|
-
# 真实测试登记与引用同步后运行完整门禁
|
|
436
|
-
code-flow acceptance manifest --verify-plan --require-scenarios --task-dir "<需求目录>" --task-file "<任务文件>"
|
|
437
|
-
```
|
|
438
|
-
|
|
439
|
-
多份设计用重复 `--file` 合并检查。design frontmatter 声明 `design_template: lite|full|frontend` 中的实际值;lint 校验 FEAT/API/NFR 定义与引用、功能场景覆盖、场景功能错配和该模板必填章节。未声明模板的旧设计仍进行 ID 校验,不强加不相关章节。
|
|
440
|
-
|
|
441
|
-
verify-plan 始终聚合 manifest 基线、场景质量、设计闭环、测试登记/真实收集和 plan Spec Gate。`--require-scenarios` 不是启用质量检查的开关。浏览器 E2E 的 check 必须属于 browser 套件;smoke/capacity 的 check 和收集用例必须有对应 marker,实际 command 必须选择登记的测试。
|
|
442
|
-
|
|
443
|
-
### E2E 精度(plan / start)
|
|
444
|
-
|
|
445
|
-
E2E 只用于 P0/P1 关键用户旅程,且必须证明低层测试覆盖不了:
|
|
446
|
-
|
|
447
|
-
- `level` 支持 `unit` / `component` / `contract` / `integration` / `system` / `capacity` / `e2e` / `manual`。API/CLI/后台全链路使用 system。
|
|
448
|
-
- E2E 必须有浏览器 env/组件声明、匹配的 `boundary`、`why_e2e`、`steps`、具体 `expected`;非 `smoke` E2E 还必须有 `trigger_paths`。
|
|
449
|
-
- 每个 expected 通过 `expected_refs` 引用存在的步骤(从 1 开始)或已声明断言 ID;deferred 必须声明 defer_reason、owner、target_phase。
|
|
450
|
-
- env 使用 none/local/local-api/browser/external/staging/capacity/ci/production;components 使用稳定标识符。数据库属于组件,不使用 env=db。
|
|
451
|
-
- `code-flow scenarios parse --file <需求>.scenarios.md --quality --json` 和 `code-flow acceptance manifest --verify-plan --require-scenarios ...` 会失败关闭。
|
|
452
|
-
- `code-flow task start` 返回 `e2e_plan`:当前 TASK 的 owned E2E 和全局 smoke E2E 中,只有非 deferred 场景进入 scheduled。显式 deferred 仍显示归属并留到需求终验。
|
|
453
|
-
- 相关批次完成后可运行 `code-flow task verify --tasks TASK-001,TASK-002 --layers validators,e2e --profile smoke`;仅执行关联且已就绪的关键 smoke,结果标为部分范围。普通 task 不默认启动全域浏览器或容量检查,完整需求终验按证据缺口补验。
|
|
454
|
-
- 旧 manifest 没有 e2e_gate 时返回 legacy_e2e_plan 警告;缺 quality_schema: 2 时保留原门禁并提示 legacy_quality_schema。新锁文件启用当前质量校验,完整 verify-plan 始终严格检查。
|
|
455
|
-
- `task verify --profile changed` 只跑 `trigger_paths` 命中当前 diff 的 E2E;没有 `trigger_paths` 的 smoke E2E 不会在 changed 中顺跑。`--profile smoke` 只跑 smoke E2E(旧计划无 smoke 标记时才回退全量)。
|
|
456
|
-
- 不要把“全量 E2E 通过”作为每个小 PR 的硬门禁;全量 E2E 放 nightly / release,PR 用受影响的 component/contract/integration + 少量 smoke。
|
|
457
|
-
|
|
458
|
-
数量报告区分声明的 e2e_browser_count/system_count/capacity_count 与通过真实收集的 runnable 数量;未检查的 runnable 为 null。收集通过不等于已运行真实浏览器或已通过业务断言。完整字段与可复制示例见[验收契约](acceptance-contract.md)。
|
|
459
|
-
|
|
460
|
-
`--register-checks` 从 pytest / Playwright 真实收集自动生成登记,项目收集器通过 --registration-file 配置。重锁保留历史并把变化场景标为 stale;提交不改变相同内容的验收指纹,未跟踪新文件也纳入验证。
|
|
461
|
-
|
|
462
|
-
### `/cf-init` / `$cf-init`
|
|
463
|
-
|
|
464
|
-
在 AI 工具会话中执行的交互式初始化,功能更丰富:
|
|
465
|
-
|
|
466
|
-
**Claude Code 中调用**:
|
|
467
|
-
|
|
468
|
-
```
|
|
469
|
-
/cf-init # 自动检测技术栈
|
|
470
|
-
/cf-init frontend # 强制前端项目
|
|
471
|
-
/cf-init backend # 强制后端项目
|
|
472
|
-
/cf-init fullstack # 强制全栈项目
|
|
473
|
-
/cf-init --skip-learn # 跳过自动扫描,仅生成模板
|
|
474
|
-
```
|
|
475
|
-
|
|
476
|
-
**Codex CLI 中调用**(`.agents/skills/cf-init/SKILL.md` 安装后可用):
|
|
477
|
-
|
|
478
|
-
```
|
|
479
|
-
$cf-init # 自动检测技术栈
|
|
480
|
-
$cf-init frontend # 强制前端项目
|
|
481
|
-
$cf-init backend # 强制后端项目
|
|
482
|
-
$cf-init fullstack # 强制全栈项目
|
|
483
|
-
$cf-init --skip-learn # 跳过自动扫描,仅生成模板
|
|
484
|
-
```
|
|
485
|
-
|
|
486
|
-
**Costrict 中调用**(`.costrict/commands/cf-init.md` 安装后可用):
|
|
487
|
-
|
|
488
|
-
```
|
|
489
|
-
/project:cf-init # 自动检测技术栈
|
|
490
|
-
/project:cf-init frontend # 强制前端项目
|
|
491
|
-
/project:cf-init backend # 强制后端项目
|
|
492
|
-
/project:cf-init fullstack # 强制全栈项目
|
|
493
|
-
/project:cf-init --skip-learn # 跳过自动扫描,仅生成模板
|
|
494
|
-
```
|
|
495
|
-
|
|
496
|
-
**OpenCode 中调用**(`.opencode/commands/cf-init.md` 安装后可用):
|
|
497
|
-
|
|
498
|
-
```
|
|
499
|
-
/cf-init # 自动检测技术栈
|
|
500
|
-
/cf-init frontend # 强制前端项目
|
|
501
|
-
/cf-init backend # 强制后端项目
|
|
502
|
-
/cf-init fullstack # 强制全栈项目
|
|
503
|
-
/cf-init --skip-learn # 跳过自动扫描,仅生成模板
|
|
504
|
-
```
|
|
505
|
-
|
|
506
|
-
与终端 `code-flow init` 的区别:
|
|
507
|
-
- 自动检测技术栈(React/Vue/FastAPI/Go 等)
|
|
508
|
-
- 扫描项目配置和代码模式,填充真实规范内容
|
|
509
|
-
- 生成导航地图(`_map.md`)
|
|
510
|
-
- 生成 `AGENTS.md`(Codex/OpenCode)或合并 `CLAUDE.md`(Claude)
|
|
511
|
-
- 交互式确认
|
|
512
|
-
|
|
513
|
-
---
|
|
514
|
-
|
|
515
|
-
## 规范管理命令
|
|
516
|
-
|
|
517
|
-
以下命令在 Claude Code / OpenCode 中通过 `/cf-` 前缀调用,在 Codex CLI 中通过 `$cf-` 前缀调用(需先完成初始化安装 Skill 文件),在 Costrict 中通过 `/project:cf-` 前缀调用。
|
|
518
|
-
|
|
519
|
-
### `/cf-stats` — 统计 token 使用 + 规范质量审计
|
|
520
|
-
|
|
521
|
-
统计规范体系的 token 分布和预算利用率;`--audit` 附带规范质量审计与待复审清单(原独立命令 `/cf-scan` 已并入本命令)。
|
|
522
|
-
|
|
523
|
-
```
|
|
524
|
-
/cf-stats # 完整统计
|
|
525
|
-
/cf-stats --human # 人类可读格式
|
|
526
|
-
/cf-stats --domain=frontend # 仅统计前端域
|
|
527
|
-
/cf-stats --audit # 附带规范质量审计 + 待复审清单
|
|
528
|
-
```
|
|
529
|
-
|
|
530
|
-
输出示例:
|
|
531
|
-
|
|
532
|
-
```
|
|
533
|
-
L0 (CLAUDE.md): ~650 / 800 tokens
|
|
534
|
-
|
|
535
|
-
L1 Frontend:
|
|
536
|
-
- directory-structure.md: ~180 tokens
|
|
537
|
-
- quality-standards.md: ~150 tokens
|
|
538
|
-
|
|
539
|
-
L1 Backend:
|
|
540
|
-
- database.md: ~200 tokens
|
|
541
|
-
|
|
542
|
-
TOTAL: ~1580 / 2500
|
|
543
|
-
UTILIZATION: 63%
|
|
544
|
-
```
|
|
545
|
-
|
|
546
|
-
当 `config.yml` 中配置了 spec 但文件不存在时,会额外输出缺失清单和告警:
|
|
547
|
-
|
|
548
|
-
```
|
|
549
|
-
L0 (CLAUDE.md): 315 / 800
|
|
550
|
-
MISSING SPECS:
|
|
551
|
-
- frontend frontend/_map.md
|
|
552
|
-
- backend backend/database.md
|
|
553
|
-
TOTAL: 315 / 2500
|
|
554
|
-
UTILIZATION: 13%
|
|
555
|
-
WARNINGS: 配置的 spec 文件缺失: 2 个; 以下域未加载到任何 L1 spec: backend
|
|
556
|
-
```
|
|
557
|
-
|
|
558
|
-
JSON 输出(默认模式)会包含 `missing_specs` 字段,可用于自动化检查。
|
|
559
|
-
|
|
560
|
-
**v0.5 新增输出**:`CATALOG:`(注入模式与目录开销)和 `QUALITY-LOOP:` 节——违规 Top 榜、修正率(违规→后续编辑→未再违规口径)、各 check 的 hit/fp/停用状态、降级组件计数;JSON 模式对应 `catalog` 与 `quality_loop` 字段。无日志数据时显示"暂无数据"。
|
|
561
|
-
|
|
562
|
-
**预算口径**:`tags: []` 的命令专用模板(如 shared 的 PRD/设计模板,仅被 cf-task 命令显式 Read)不计入注入预算,单列为 `TEMPLATES (非注入)` 行;`TOTAL` 与 `UTILIZATION` 只统计真正可注入的规范。
|
|
563
|
-
|
|
564
|
-
**`--audit` 规范质量审计**(原 `/cf-scan`):JSON 增 `audit` 字段、human 模式增 `AUDIT` 段,检测项——
|
|
565
|
-
|
|
566
|
-
- 单文件超过 500 tokens → "冗长"
|
|
567
|
-
- 同一行出现在 3+ 个 spec 文件中 → "冗余"
|
|
568
|
-
- spec 中引用的文件路径不存在 → "过时"
|
|
569
|
-
- 约束 spec 缺 frontmatter `description` → "缺描述"(Spec Catalog 行来源)
|
|
570
|
-
- `checks` 标注语法错误 / message 超长 → "checks"
|
|
571
|
-
|
|
572
|
-
并附 `REVIEW (待复审)` 清单——长期未命中注入、已自动停用、反复误报的规范条目(处置后加入 `.check-state.json` 的 `_review_exempt` 不再提示)。
|
|
573
|
-
|
|
574
|
-
### `/cf-spec` — Spec Context 管理与迁移
|
|
575
|
-
|
|
576
|
-
管理 schema v1 Spec Context(绑定、Rule 阶段状态、漂移检测)与一次性迁移计划确认。替代旧版 `/cf-inject`。
|
|
577
|
-
|
|
578
|
-
**子命令**:
|
|
579
|
-
|
|
580
|
-
| 子命令 | 用途 |
|
|
581
|
-
|--------|------|
|
|
582
|
-
| `context [需求目录]` | 展示 `spec-context.yml` 的 bindings、Rule 状态、Evidence 与 drift |
|
|
583
|
-
| `refresh [需求目录]` | 刷新 Context:changed Rule 标 stale,missing/conflict 不自动降级 |
|
|
584
|
-
| `status [需求目录]` | 人话版 Context 状态:任务、marker 一致性、code Gate、Rule 状态与下一步 |
|
|
585
|
-
| `doctor [需求目录]` | 健康诊断、未解决应用引用、Conventions 提示与 plan/code/review readiness |
|
|
586
|
-
| `migrate --plan <plan>` | 确认 prepared migration plan 中的 unresolved 项(需用户逐项选择) |
|
|
587
|
-
|
|
588
|
-
```
|
|
589
|
-
/cf-spec context # 从 active-task 定位,展示当前 Context
|
|
590
|
-
/cf-spec refresh .code-flow/tasks/2026-04-21/specs-proactive # 刷新指定需求 Context
|
|
591
|
-
/cf-spec doctor # 诊断当前 Spec Workflow;漂移按 next 指引 refresh
|
|
592
|
-
/cf-spec status # 人话版 Context 状态与下一步
|
|
593
|
-
/cf-spec migrate --plan .code-flow/migrations/v0.6.0/plan.yml # 确认迁移计划
|
|
594
|
-
```
|
|
595
|
-
|
|
596
|
-
`doctor` 的机器入口是 `code-flow spec doctor --task-dir "<需求目录>" --root "$PWD" --json`。它只读检查 config schema、active marker、Context hash、迁移 journal/lock、运行时 manifest 与 legacy residue;还检查 applied artifact 的条目是否已解决,并提示 `convention_review_required`。顶层 decision 表示健康诊断,`readiness.plan/code/review` 分别给出阶段准备情况;健康通过不代表各阶段均可通过。发现阻断项时按 `next` 修复。
|
|
597
|
-
|
|
598
|
-
applied 引用必须指向正确章节与条目,不能含待同步/待确认/TBD;code/review 需要执行证据。已有代码无需变更时可通过自动 verifier 证明符合,`decision=null` 本身不阻断;不适用规则仍需 not_applicable 与用户 decision。关键 Conventions 应提升为稳定 Rule 与 verifier。
|
|
599
|
-
|
|
600
|
-
> **硬门禁**:`spec_workflow.schema_version` 非 `1` 时只有 `migrate --plan` 可用;Context 缺失/损坏时 fail-closed,不回退 Catalog。
|
|
601
|
-
>
|
|
602
|
-
> 默认使用 `required`。运行时仍兼容历史 `warn/inject`:它们会降低部分验证门禁,doctor 返回 `legacy_enforcement_mode`,建议审查后显式改回 `required`。配置损坏、绑定 Spec 漂移、Context 无效、TASK 投影失败和注入超预算始终阻断,历史模式不能隐藏这些错误。`quality_loop` 控制质量反馈能力。
|
|
603
|
-
|
|
604
|
-
### `/cf-sync` — 双副本同步(internal)
|
|
605
|
-
|
|
606
|
-
> **0.8 命令面状态**:internal(开发/发布维护专用),不属于 11 条用户命令面。普通用户执行 `code-flow init` / `code-flow migrate --runtime --apply` 即可,无需调用本命令。
|
|
607
|
-
|
|
608
|
-
一键检查/同步 canonical 源与部署副本(`src/core/code-flow` ↔ `.code-flow`、四平台适配器 ↔ 运行目录),防止"测试通过但 live 行为不变"。
|
|
609
|
-
|
|
610
|
-
```
|
|
611
|
-
code-flow sync check # 检查漂移(默认)
|
|
612
|
-
code-flow sync apply # canonical → 部署副本
|
|
613
|
-
```
|
|
614
|
-
|
|
615
|
-
项目自有内容(`specs/`、`tasks/`、`config.yml`、`settings.local.json`)不在同步范围;部署侧独有文件不会被删除。
|
|
616
|
-
|
|
617
|
-
### `/cf-validate` — 验证变更(别名)
|
|
618
|
-
|
|
619
|
-
> **0.8 命令面状态**:alias(0.9.0 移除)。等价入口是 `code-flow task verify --checks`(即 `--layers validators`);需要 review/e2e 时用 `task verify --layers validators,review,e2e`。
|
|
620
|
-
|
|
621
|
-
根据变更文件自动匹配并执行验证规则(测试、类型检查、lint)。
|
|
622
|
-
|
|
623
|
-
```
|
|
624
|
-
code-flow task verify --task-dir "<需求目录>" --checks --profile full --root "$PWD" --json
|
|
625
|
-
code-flow task verify --task-dir "<需求目录>" --layers e2e --profile changed --root "$PWD" --json
|
|
626
|
-
code-flow validate --root "$PWD" --json # 无 active TASK 或显式变更范围
|
|
627
|
-
/cf-validate src/Foo.tsx # 兼容别名:验证指定文件
|
|
628
|
-
/cf-validate --files=src/a.ts,src/b.ts # 兼容别名:验证多个文件
|
|
629
|
-
```
|
|
630
|
-
|
|
631
|
-
验证规则定义在 `.code-flow/validation.yml`:
|
|
632
|
-
|
|
633
|
-
```yaml
|
|
634
|
-
validators:
|
|
635
|
-
- name: "TypeScript 类型检查"
|
|
636
|
-
trigger: "**/*.{ts,tsx}"
|
|
637
|
-
command: "npx tsc --noEmit"
|
|
638
|
-
timeout: 30000
|
|
639
|
-
on_fail: "检查类型定义"
|
|
640
|
-
|
|
641
|
-
- name: "ESLint"
|
|
642
|
-
trigger: "**/*.{ts,tsx,js,jsx}"
|
|
643
|
-
command: "npx eslint {files}"
|
|
644
|
-
timeout: 15000
|
|
645
|
-
on_fail: "运行 npx eslint --fix 自动修复"
|
|
646
|
-
|
|
647
|
-
- name: "Pytest"
|
|
648
|
-
trigger: "**/*.py"
|
|
649
|
-
command: "python3 -m pytest --tb=short -q"
|
|
650
|
-
timeout: 60000
|
|
651
|
-
on_fail: "测试失败,检查断言和 mock"
|
|
652
|
-
```
|
|
653
|
-
|
|
654
|
-
`{files}` 占位符会替换为匹配到的变更文件路径。验证失败时自动尝试修复。
|
|
655
|
-
|
|
656
|
-
`--checks` 等价 `--layers validators`,允许任务进行中执行,不额外运行 review/e2e、不推进 done/verified;`--profile full` 包含 heavy validators。任务范围包含冻结基线以来已提交与未提交的变更。无 active TASK 时使用 `code-flow validate`,指定文件时追加 `--files "src/a.py" "src/b.py"`;损坏的 marker 或 Context 仍须修复。
|
|
657
|
-
|
|
658
|
-
### `/cf-learn` — 规范学习与沉淀
|
|
659
|
-
|
|
660
|
-
从项目配置、代码模式和当前工作区变更中自动提取编码约束,沉淀到 spec 文件。
|
|
661
|
-
|
|
662
|
-
#### 全量扫描模式
|
|
663
|
-
|
|
664
|
-
扫描项目配置文件(eslintrc、tsconfig、pyproject.toml 等)和代码模式,提取隐含规范:
|
|
665
|
-
|
|
666
|
-
```
|
|
667
|
-
/cf-learn # 全量扫描
|
|
668
|
-
/cf-learn frontend # 仅扫描前端
|
|
669
|
-
/cf-learn backend # 仅扫描后端
|
|
670
|
-
```
|
|
671
|
-
|
|
672
|
-
扫描流程:配置文件提取 → 代码模式分析 → 用户选择聚焦域 → 生成候选约束 → 去重过滤 → 用户确认 → 写入 spec 文件。
|
|
673
|
-
|
|
674
|
-
#### 导航地图生成
|
|
675
|
-
|
|
676
|
-
```
|
|
677
|
-
/cf-learn --map # 扫描并生成/更新所有域的导航地图
|
|
678
|
-
/cf-learn frontend --map # 仅生成前端导航地图
|
|
679
|
-
```
|
|
680
|
-
|
|
681
|
-
基于代码结构扫描结果自动填充 `_map.md` 的各段落(Purpose、Architecture、Key Files、Module Map、Data Flow、Navigation Guide)。
|
|
682
|
-
|
|
683
|
-
#### Review 模式(基于当前变更提炼规范)
|
|
684
|
-
|
|
685
|
-
**这是最强大的规范沉淀工具。** 自动从当前工作区代码变更中提炼可沉淀的规则,避免等待历史积累:
|
|
686
|
-
|
|
687
|
-
```
|
|
688
|
-
/cf-learn --review # 扫描 staged + unstaged + untracked 代码变更
|
|
689
|
-
/cf-learn --review --staged # 仅扫描 staged 变更
|
|
59
|
+
code-flow spec list --json
|
|
60
|
+
code-flow spec inject --path src/app.js --json
|
|
61
|
+
code-flow spec inject --task-file .code-flow/tasks/2026-11-10/example/example.md --task TASK-001 --full
|
|
690
62
|
```
|
|
691
63
|
|
|
692
|
-
|
|
64
|
+
Spec 级引用接收后续新增规则;#Rule 引用只选择一条规则。预算按完整规则块裁剪,omitted 显示未发送的引用和完整读取方式。catalog 只读头信息,规则数由 spec list 读取完整正文统计。
|
|
693
65
|
|
|
694
|
-
|
|
695
|
-
2. **读取变更证据**:按文件读取 unstaged/staged diff;新文件读取完整内容
|
|
696
|
-
3. **提炼规则候选**:从当前改动归纳 Rule/Pattern/Anti-Pattern
|
|
697
|
-
4. **聚类置信度**:同一模式在多个文件重复出现标记高置信度
|
|
66
|
+
## 3. 创建与选择 Task
|
|
698
67
|
|
|
699
|
-
|
|
68
|
+
一个需求一份任务文档 `.code-flow/tasks/2026-11-10/example/example.md`,内部包含多个 `## TASK-NNN` 段。设计文档前后端分开:
|
|
700
69
|
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
5. **去重过滤**:与现有 spec 对比,跳过已覆盖规则
|
|
709
|
-
6. **用户确认**:按域分组展示,用户选择写入哪些
|
|
710
|
-
|
|
711
|
-
输出示例:
|
|
712
|
-
|
|
713
|
-
```
|
|
714
|
-
从当前工作区变更中发现 N 个候选规则:
|
|
715
|
-
|
|
716
|
-
scripts 域(建议写入 specs/scripts/code-standards.md):
|
|
717
|
-
1. [x] [高] Anti-Pattern: 禁止在循环中重复调用 load_config()
|
|
718
|
-
来源: src/core/code-flow/scripts/cf_x.py (staged diff)
|
|
719
|
-
2. [x] [高] Rule: Hook 输出必须是合法 JSON
|
|
720
|
-
来源: src/core/code-flow/scripts/cf_a.py, cf_b.py
|
|
721
|
-
|
|
722
|
-
已覆盖(跳过):
|
|
723
|
-
- "禁止使用 print() 调试" → 已在 specs/scripts/code-standards.md 中
|
|
724
|
-
|
|
725
|
-
确认要写入的条目(编号 / all / high / none):
|
|
70
|
+
```text
|
|
71
|
+
.code-flow/tasks/2026-11-10/example/
|
|
72
|
+
example.prd.md
|
|
73
|
+
example.frontend.design.md
|
|
74
|
+
example.backend.design.md
|
|
75
|
+
example.scenarios.md
|
|
76
|
+
example.md
|
|
726
77
|
```
|
|
727
78
|
|
|
728
|
-
|
|
79
|
+
任务文档示例:
|
|
729
80
|
|
|
81
|
+
````markdown
|
|
730
82
|
---
|
|
731
|
-
|
|
732
|
-
## 任务管理命令
|
|
733
|
-
|
|
734
|
-
code-flow 提供从需求对齐到编码实现的完整任务管理流程。
|
|
735
|
-
|
|
736
|
-
### `/cf-task:prd` — 产品需求文档
|
|
737
|
-
|
|
738
|
-
从一句话需求出发,通过结构化对话产出产品需求文档(`.prd.md`),包含问题陈述、用户故事、功能清单、范围边界等,为 `/cf-task:align` 提供足够丰富的需求输入。
|
|
739
|
-
|
|
740
|
-
```
|
|
741
|
-
/cf-task:prd "给项目加上用户认证" # 从需求描述新建
|
|
742
|
-
/cf-task:prd # 交互式
|
|
743
|
-
/cf-task:prd .code-flow/tasks/2026-04-06/user-auth/user-auth.prd.md # 恢复草稿继续讨论
|
|
744
|
-
```
|
|
745
|
-
|
|
746
|
-
**执行流程**:
|
|
747
|
-
1. 扫描项目背景(`.code-flow/specs/shared/_map.md`、已有 PRD)
|
|
748
|
-
2. 围绕 PRD 要素交互:背景与目标 → 用户与场景 → 功能需求 → 非功能需求(按需)→ 范围与边界 → 依赖与风险(按需)
|
|
749
|
-
3. 基于 `.code-flow/specs/shared/prd-template.md` 模板生成文档
|
|
750
|
-
4. 写入 `.code-flow/tasks/<YYYY-MM-DD>/<需求>/<需求>.prd.md`(**需求目录**:PRD / design / tasks 同放一处,`cf-task:archive` 按整目录归档)
|
|
751
|
-
|
|
752
|
-
产出的 `.prd.md` 可直接作为 `/cf-task:align` 的输入。**适用场景**:需求早期阶段,在设计之前;**不适用**:已有明确技术方案(请直接用 `/cf-task:align`)。
|
|
753
|
-
|
|
754
|
-
### `/cf-task:align` — 需求对齐与设计简报
|
|
755
|
-
|
|
756
|
-
从需求出发,通过结构化对话产出设计简报(`.design.md`),包含技术选型、架构设计、接口设计、**性能与容量设计**、验收条件等,为 `/cf-task:plan` 提供足够丰富的输入。支持三种输入:
|
|
757
|
-
|
|
758
|
-
```
|
|
759
|
-
/cf-task:align "给项目加上用户认证" # 纯文本需求,新建
|
|
760
|
-
/cf-task:align .code-flow/tasks/2026-04-06/user-auth/user-auth.prd.md # 从 PRD 派生(推荐路径)
|
|
761
|
-
/cf-task:align .code-flow/tasks/2026-04-06/user-auth/user-auth.design.md # 恢复草稿继续讨论
|
|
762
|
-
/cf-task:align # 交互式
|
|
763
|
-
```
|
|
764
|
-
|
|
765
|
-
**输入模式**:
|
|
766
|
-
|
|
767
|
-
| 参数形态 | 模式 | 行为 |
|
|
768
|
-
|---------|------|------|
|
|
769
|
-
| `.design.md` | 恢复模式 | 读取草稿,展示当前内容,询问调整点 |
|
|
770
|
-
| `.prd.md` | PRD 派生模式 | 继承 PRD 的目标/用户/功能/范围,只补技术维度 |
|
|
771
|
-
| 其他 `.md` | 新建(带上下文) | 作为参考材料进入细化 |
|
|
772
|
-
| 纯文本 / 无参数 | 新建 / 交互 | 从零开始细化 |
|
|
773
|
-
|
|
774
|
-
**执行流程**:
|
|
775
|
-
1. 识别输入模式,扫描代码库上下文(技术栈、现有模式)
|
|
776
|
-
2. 依代码库扫描自动识别域选模板(前端→`design-frontend.md`;后端/通用→`design-lite.md` 简单 / `design-full.md` 跨系统/架构演进)
|
|
777
|
-
3. 围绕维度交互:目标与边界 → 数据模型(按需)→ 接口设计(按需,API/CLI/函数三形态)→ 技术方案(性能敏感路径按最优性能设计)→ 性能与容量(按需)→ 约束条件 → 验收标准(可转测试断言)→ 妥协与技术债(按需)
|
|
778
|
-
4. **PRD 派生模式**:已从 PRD 覆盖的维度不再提问;FEAT 保留对 US-XX 的来源追溯
|
|
779
|
-
5. 基于模板生成设计简报并展示(功能→接口→验收追溯闭合;Full 模板生成 §6 需求追溯矩阵 US→FEAT→API→TC)
|
|
780
|
-
6. 写入需求目录,**按域后缀命名**:前端 `<需求>.frontend.design.md`、后端/通用 `<需求>.backend.design.md` 或 `<需求>.design.md`;全栈需求前后端各产出一份;PRD 派生时复用 PRD 所在需求目录
|
|
781
|
-
|
|
782
|
-
输出摘要含**追溯自检**与**性能自检**:FEAT 无来源/无验收、或标记性能敏感却无对应设计时,显式提示补全。
|
|
783
|
-
|
|
784
|
-
产出 design 时同时维护 canonical 场景源与模板声明,并执行 `scenarios parse --quality`、`design lint`;只引用已定义 ID。规则应用引用应指向已完成条目,不能把“待同步 spec”作为 applied 证明。
|
|
785
|
-
|
|
786
|
-
支持中断恢复——对话进行中即写入草稿,下次通过文件路径继续。
|
|
787
|
-
|
|
788
|
-
### `/cf-task:plan` — 从设计文档拆解任务
|
|
789
|
-
|
|
790
|
-
```
|
|
791
|
-
/cf-task:plan docs/auth-design.md # 设计文档(含缺口分析)
|
|
792
|
-
/cf-task:plan docs/auth-design.md --quick # 跳过缺口分析
|
|
793
|
-
/cf-task:plan docs/auth-design.md --explore # 仅输出分析报告
|
|
794
|
-
/cf-task:plan .code-flow/tasks/2026-04-06/user-auth # 从 align 产出的设计简报拆解(传目录,自动发现 *.design.md)
|
|
795
|
-
```
|
|
796
|
-
|
|
797
|
-
**执行流程**:
|
|
798
|
-
1. 读取输入文件,判断类型(设计简报 vs 设计文档);**传需求目录时自动发现其中全部 `*.design.md`(前后端)合并拆解**
|
|
799
|
-
2. 设计文档模式:建立章节索引 → 缺口分析对话(`--quick` 跳过)→ 拆解
|
|
800
|
-
3. 设计简报模式:直接从 Goal/DB/API/Acceptance Criteria 拆解;多 design 合并为一份任务,各 TASK 的 Source 指向其来源 design
|
|
801
|
-
4. 展示拆解结果供用户确认/调整
|
|
802
|
-
5. 写入任务文件到需求目录:`.code-flow/tasks/<YYYY-MM-DD>/<需求>/<需求>.md`
|
|
803
|
-
|
|
804
|
-
计划产出还包括场景到全部 checks 的绑定与锁定 manifest;补齐真实测试登记,执行 `acceptance manifest --verify-plan` 后才进入 start。重新锁定保留 check 的登记配置,更改配置会使旧输入证明失效。
|
|
805
|
-
|
|
806
|
-
**缺口分析**(设计文档模式,`--quick` 跳过):AI 从文档中识别目标/非目标、范围边界、未确认的技术决策、风险点和验收标准,输出结构化分析并与用户交互讨论。对齐结论写入 Proposal 的 `### Alignment` 子节。
|
|
807
|
-
|
|
808
|
-
生成的任务文件格式:
|
|
809
|
-
|
|
810
|
-
```markdown
|
|
811
|
-
# Tasks: 用户认证模块
|
|
812
|
-
|
|
813
|
-
- **Source**: docs/auth-design.md
|
|
814
|
-
- **Created**: 2026-03-23
|
|
815
|
-
- **Updated**: 2026-03-23
|
|
816
|
-
|
|
817
|
-
## Proposal
|
|
818
|
-
实现用户注册、登录和 JWT 认证功能,支持 token 自动刷新。
|
|
819
|
-
|
|
83
|
+
{"version":1,"requirement":"example"}
|
|
820
84
|
---
|
|
85
|
+
# Tasks: example
|
|
821
86
|
|
|
822
|
-
## TASK-001:
|
|
87
|
+
## TASK-001: Implement behavior
|
|
823
88
|
|
|
824
89
|
- **Status**: draft
|
|
825
|
-
- **Priority**: P0
|
|
826
90
|
- **Depends**:
|
|
827
|
-
- **Source**:
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
### Checklist
|
|
833
|
-
- [ ] 创建 User model
|
|
834
|
-
- [ ] 添加数据库迁移
|
|
835
|
-
- [ ] 编写单元测试
|
|
836
|
-
|
|
837
|
-
### Log
|
|
838
|
-
- [2026-03-23] created (draft)
|
|
839
|
-
```
|
|
840
|
-
|
|
841
|
-
`--explore` 模式仅输出分析报告(功能域识别、依赖关系、风险点),不生成文件,适合先了解全貌再决定是否拆解。
|
|
91
|
+
- **Source**: example.backend.design.md#5.2
|
|
92
|
+
- **Scenarios**: S-01
|
|
93
|
+
- **Spec-Refs**: cli/runtime
|
|
94
|
+
- **Paths**: src/**, test/**
|
|
95
|
+
- **E2E**: ci:e2e
|
|
842
96
|
|
|
843
|
-
###
|
|
97
|
+
### Tests
|
|
844
98
|
|
|
99
|
+
```json
|
|
100
|
+
[
|
|
101
|
+
{
|
|
102
|
+
"id": "unit",
|
|
103
|
+
"argv": ["node", "--test", "test/hook.test.js"],
|
|
104
|
+
"parallel": true
|
|
105
|
+
}
|
|
106
|
+
]
|
|
845
107
|
```
|
|
846
|
-
/cf-task:start auth-module TASK-001 # 启动单个子任务
|
|
847
|
-
/cf-task:start auth-module # 启动文件内所有可执行的子任务(批次内默认并行派发子 agent)
|
|
848
|
-
/cf-task:start auth-module --serial # 整文件模式强制串行(不建 worktree)
|
|
849
|
-
```
|
|
850
|
-
|
|
851
|
-
**单任务模式流程**:
|
|
852
|
-
1. **前置检查**:由 `code-flow task start` 检查状态、依赖、Context/marker、范围及 canonical E2E 质量与登记,不能靠手改状态绕过
|
|
853
|
-
2. **加载详设**:使用已持久化 Context 中的 Spec-Refs、Design refs 与 Acceptance Contract 读取对应内容
|
|
854
|
-
3. **编码**:进入 in-progress,逐项完成 Checklist;开发中可用 `task verify --checks` 运行 validators
|
|
855
|
-
4. **完成门禁**:调用 `code-flow task finish`,依据 required code checks 的有效执行证据推导 done/provisional;勾选 Checklist 不自动证明验收通过
|
|
856
|
-
5. **Spec 同步检查**:检查新增模式是否需要更新规范;需求终验仍需完整 verify
|
|
857
|
-
|
|
858
|
-
**整文件模式(并行批次)**:按依赖拓扑排序输出执行计划,批次内独立 TASK 默认并行执行:
|
|
859
|
-
|
|
860
|
-
1. `cf_task_parallel.py prepare` 预检(git 仓库、tracked 干净、无 active marker),为每个 TASK 建独立 worktree + 分支(`.code-flow/worktrees/`,已 gitignore)
|
|
861
|
-
2. 每个 TASK 派发一个子 agent,在其 worktree 内跑完整单任务流程(RED → 实现 → GREEN → finish 并提交)
|
|
862
|
-
3. `collect` 校验(改动已提交、done/verified、marker 已清理)后,`merge` 按 TASK 顺序自动回并:worktree 内 rebase、状态文件冲突(覆盖状态列 / `spec-context.yml` / manifest)按确定性并集规则解决、主区 `--no-ff` 合并、`refresh` 收敛 hash
|
|
863
|
-
4. 代码文件冲突无法程序化合并时 merge 报 `code_conflict` 并保持主区不变;由主 agent 合并双方意图并用测试仲裁,无法调和才叫停交用户决策
|
|
864
|
-
5. `cleanup` 清理 worktree;已合入分支自动删除,未合入分支保留排查(`--force` 时按用户明确意图一并删除)
|
|
865
108
|
|
|
866
|
-
预检失败(工作区不干净、平台无子 agent 能力、批次仅 1 个任务等)自动回退串行,无需用户介入。
|
|
867
|
-
|
|
868
|
-
### `/cf-task:status` — 查看任务状态
|
|
869
|
-
|
|
870
|
-
```
|
|
871
|
-
/cf-task:status # 所有活跃任务的总览
|
|
872
|
-
/cf-task:status auth-module # 指定文件的详细状态
|
|
873
|
-
```
|
|
874
|
-
|
|
875
|
-
0.8 起 `cf-task:status` 同时承载三个子动作(旧命令保留一个 minor):
|
|
876
|
-
|
|
877
|
-
| 子动作 | 等价旧命令 | 用途 |
|
|
878
|
-
|--------|-----------|------|
|
|
879
|
-
| `/cf-task:status --notes` | `/cf-task:note` | 讨论并收敛 `#NOTES` |
|
|
880
|
-
| `/cf-task:status --block` | `/cf-task:block` | 标记阻塞并记录原因 |
|
|
881
|
-
| `/cf-task:status --graph` | `/cf-task:graph` | 依赖 DAG 与并行批次 |
|
|
882
|
-
|
|
883
|
-
输出示例:
|
|
884
|
-
|
|
885
|
-
```
|
|
886
|
-
📋 auth-module.md (来源: docs/auth-design.md)
|
|
887
|
-
┌──────────┬──────────────┬────────────┬──────┬────────────┐
|
|
888
|
-
│ ID │ 标题 │ 状态 │ 优先 │ 进度 │
|
|
889
|
-
├──────────┼──────────────┼────────────┼──────┼────────────┤
|
|
890
|
-
│ TASK-001 │ 用户模型定义 │ done │ P0 │ 3/3 [100%] │
|
|
891
|
-
│ TASK-002 │ 注册接口实现 │ in-progress│ P0 │ 1/4 [25%] │
|
|
892
|
-
│ TASK-003 │ JWT 工具函数 │ draft │ P1 │ 0/2 [0%] │
|
|
893
|
-
└──────────┴──────────────┴────────────┴──────┴────────────┘
|
|
894
|
-
汇总: 3 个子任务 | done: 1 | in-progress: 1 | draft: 1
|
|
895
|
-
```
|
|
896
|
-
|
|
897
|
-
### `/cf-task:note` — 讨论 Notes(别名)
|
|
898
|
-
|
|
899
|
-
> **0.8 命令面状态**:alias(0.9.0 移除),等价 `/cf-task:status --notes`。
|
|
900
|
-
|
|
901
|
-
用户在 review 任务文件时,可以在任意位置标注 `#NOTES` 提出疑问:
|
|
902
|
-
|
|
903
|
-
```markdown
|
|
904
109
|
### Checklist
|
|
905
|
-
- [ ] 密码加密存储 #NOTES 用 bcrypt 还是 argon2?
|
|
906
|
-
```
|
|
907
110
|
|
|
908
|
-
|
|
111
|
+
- [ ] 实现相关行为并验证回归。
|
|
909
112
|
|
|
910
|
-
|
|
911
|
-
/cf-task:note auth-module # 讨论文件内所有 #NOTES
|
|
912
|
-
/cf-task:note auth-module TASK-001 # 只讨论指定子任务的 #NOTES
|
|
913
|
-
```
|
|
914
|
-
|
|
915
|
-
AI 会加载详设上下文,逐条分析并给出建议方案。用户确认后,结论融入原文,`#NOTES` 标记被删除。
|
|
916
|
-
|
|
917
|
-
> `#NOTES` 是 `cf-task:start` 的前置条件之一——含有未解决 Notes 的子任务无法启动。
|
|
918
|
-
|
|
919
|
-
### `/cf-task:block` — 标记阻塞(别名)
|
|
113
|
+
### Spec Delta
|
|
920
114
|
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
```
|
|
924
|
-
/cf-task:status --block auth-module TASK-001 "等待第三方 SDK 文档" # 0.8 推荐
|
|
925
|
-
/cf-task:block auth-module TASK-001 "等待第三方 SDK 文档" # 兼容别名
|
|
926
|
-
```
|
|
927
|
-
|
|
928
|
-
Status 更新为 blocked,阻塞原因记录在 Log 中。
|
|
929
|
-
|
|
930
|
-
解除方式:
|
|
931
|
-
- Notes 导致的阻塞 → 用 `/cf-task:note` 讨论解决后自动解除
|
|
932
|
-
- 外部阻塞 → 手动编辑文件移除阻塞条目,再用 `/cf-task:start` 重新启动
|
|
933
|
-
|
|
934
|
-
### `/cf-task:graph` — 可视化依赖(别名)
|
|
935
|
-
|
|
936
|
-
> **0.8 命令面状态**:alias(0.9.0 移除),等价 `/cf-task:status --graph`。
|
|
937
|
-
|
|
938
|
-
```
|
|
939
|
-
/cf-task:status --graph auth-module # 0.8 推荐:指定文件的依赖图
|
|
940
|
-
/cf-task:status --graph # 所有活跃文件的依赖图
|
|
941
|
-
/cf-task:graph auth-module # 兼容别名
|
|
115
|
+
```json
|
|
116
|
+
[]
|
|
942
117
|
```
|
|
118
|
+
````
|
|
943
119
|
|
|
944
|
-
|
|
120
|
+
TASK ID 必须与标题 `## TASK-NNN:` 一致,并在文档内唯一;裸 TASK-001 不是跨需求定位键。prompt 的独立行可以指定本轮任务:
|
|
945
121
|
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
```
|
|
949
|
-
/cf-task:archive auth-module
|
|
122
|
+
```text
|
|
123
|
+
task: .code-flow/tasks/2026-11-10/example/example.md#TASK-001
|
|
950
124
|
```
|
|
951
125
|
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
| 维度 | 检查内容 |
|
|
955
|
-
|------|---------|
|
|
956
|
-
| 完整性 | 所有 Checklist 已勾选,无残留 `#NOTES` |
|
|
957
|
-
| 正确性 | validation.yml 中匹配的验证规则通过 |
|
|
958
|
-
| 一致性 | Proposal 中的意图与实际代码变更一致 |
|
|
959
|
-
| 可追溯性 | 场景、全部 checks、Spec Gate 与当前输入执行证据一致 |
|
|
960
|
-
|
|
961
|
-
通过完整需求验收与 Spec Gate 后,由正式运行时归档并移动目录:
|
|
126
|
+
cf-task skill 使用 Hook 上下文中的 session token:
|
|
962
127
|
|
|
963
128
|
```bash
|
|
964
|
-
code-flow task
|
|
965
|
-
```
|
|
966
|
-
|
|
967
|
-
实际归档位置以返回的 `archived_to` 为准,PRD/design/scenarios/tasks 随整个需求目录归档。旧扁平布局缺少独立需求边界时会要求迁移,不提供逐文件移动回退。不要手工 mv 或只移动任务文件;归档后再审查是否需要同步规范。
|
|
968
|
-
|
|
969
|
-
---
|
|
970
|
-
|
|
971
|
-
## 配置参考
|
|
972
|
-
|
|
973
|
-
### `.code-flow/config.yml`
|
|
974
|
-
|
|
975
|
-
```yaml
|
|
976
|
-
version: 1
|
|
977
|
-
|
|
978
|
-
# Token 预算控制
|
|
979
|
-
budget:
|
|
980
|
-
total: 2500 # L0 + L1 总预算
|
|
981
|
-
l0_max: 800 # CLAUDE.md 最大 token
|
|
982
|
-
l1_max: 1700 # 所有 tier 1 specs 合计上限
|
|
983
|
-
map_max: 400 # 单个 _map.md 最大 token
|
|
984
|
-
catalog_max: 200 # Spec Catalog 目录上限(v0.5+)
|
|
985
|
-
|
|
986
|
-
# 推荐 required;历史 warn/inject 的限制和迁移提示见 cf-spec doctor
|
|
987
|
-
spec_workflow:
|
|
988
|
-
schema_version: 1
|
|
989
|
-
enforcement: required
|
|
990
|
-
|
|
991
|
-
# 质量闭环:enabled 仅 literal true 启用(存量升级默认关闭,行为不变);
|
|
992
|
-
# 子开关缺省跟随 enabled,仅 literal false 单独关闭。
|
|
993
|
-
# 注入/校验的扩展名与路径过滤都在这里(v0.6 起注入行为不再有独立 inject 块)
|
|
994
|
-
quality_loop:
|
|
995
|
-
enabled: true
|
|
996
|
-
post_check: true # PostToolUse 违规反馈(只提示不阻断)
|
|
997
|
-
stop_check: true # Stop 收尾按 validation.yml 校验(heavy 项跳过)
|
|
998
|
-
finish_check: true # 任务 finish 时执行 validation.yml(不含 heavy)
|
|
999
|
-
heavy_at_finish: false # 显式 true 时 finish 也跑 heavy 项(默认归档/verify-e2e 跑)
|
|
1000
|
-
finish_verifier_budget: 300 # finish 的 command/test verifier 预算(秒);未完成不算 verified
|
|
1001
|
-
correction_capture: true # 纠正句式采集(喂 cf-learn 候选)
|
|
1002
|
-
compress: true # 注入时对 spec 做保守无损压缩;缺省/非布尔按 true 处理
|
|
1003
|
-
compress_reminder: true # 会话过长每 N 轮提醒压缩上下文
|
|
1004
|
-
code_extensions: # 触发注入的文件扩展名
|
|
1005
|
-
- ".py"
|
|
1006
|
-
- ".js"
|
|
1007
|
-
- ".ts"
|
|
1008
|
-
- ".tsx"
|
|
1009
|
-
skip_extensions: # 跳过的扩展名
|
|
1010
|
-
- ".md"
|
|
1011
|
-
- ".json"
|
|
1012
|
-
- ".yml"
|
|
1013
|
-
skip_paths: # 跳过的路径 glob
|
|
1014
|
-
- "docs/**"
|
|
1015
|
-
- ".code-flow/**"
|
|
1016
|
-
- "node_modules/**"
|
|
1017
|
-
|
|
1018
|
-
# 路径映射:文件路径 → 域 → specs
|
|
1019
|
-
path_mapping:
|
|
1020
|
-
frontend:
|
|
1021
|
-
patterns: # 哪些文件属于该域
|
|
1022
|
-
- "src/components/**"
|
|
1023
|
-
- "**/*.tsx"
|
|
1024
|
-
specs: # 该域关联的规范文件
|
|
1025
|
-
- path: "frontend/_map.md"
|
|
1026
|
-
tags: ["*"] # 通配符,总是匹配
|
|
1027
|
-
tier: 0 # 导航地图
|
|
1028
|
-
- path: "frontend/quality-standards.md"
|
|
1029
|
-
tags: ["quality", "type", "lint", "error"]
|
|
1030
|
-
tier: 1 # 约束规范,按标签匹配
|
|
1031
|
-
backend:
|
|
1032
|
-
patterns:
|
|
1033
|
-
- "**/*.py"
|
|
1034
|
-
specs:
|
|
1035
|
-
- path: "backend/_map.md"
|
|
1036
|
-
tags: ["*"]
|
|
1037
|
-
tier: 0
|
|
1038
|
-
- path: "backend/code-quality-performance.md"
|
|
1039
|
-
tags: ["quality", "error", "test"]
|
|
1040
|
-
tier: 1
|
|
1041
|
-
```
|
|
1042
|
-
|
|
1043
|
-
#### 自定义域扩展
|
|
1044
|
-
|
|
1045
|
-
在 `path_mapping` 中添加任意域:
|
|
1046
|
-
|
|
1047
|
-
```yaml
|
|
1048
|
-
infra:
|
|
1049
|
-
patterns:
|
|
1050
|
-
- "infra/**"
|
|
1051
|
-
- "terraform/**"
|
|
1052
|
-
- "Dockerfile"
|
|
1053
|
-
specs:
|
|
1054
|
-
- path: "infra/_map.md"
|
|
1055
|
-
tags: ["*"]
|
|
1056
|
-
tier: 0
|
|
1057
|
-
- path: "infra/deployment-rules.md"
|
|
1058
|
-
tags: ["deploy", "docker", "terraform", "ci"]
|
|
1059
|
-
tier: 1
|
|
1060
|
-
```
|
|
1061
|
-
|
|
1062
|
-
然后在 `.code-flow/specs/infra/` 下创建对应文件即可,Hook 会自动识别。
|
|
1063
|
-
|
|
1064
|
-
### `.code-flow/validation.yml`
|
|
1065
|
-
|
|
1066
|
-
```yaml
|
|
1067
|
-
validators:
|
|
1068
|
-
- name: "验证器名称"
|
|
1069
|
-
trigger: "**/*.{ts,tsx}" # 触发的文件 glob
|
|
1070
|
-
command: "npx tsc --noEmit" # 执行的命令({files} 占位符可选)
|
|
1071
|
-
timeout: 30000 # 超时时间(毫秒)
|
|
1072
|
-
skip_if_missing: true # 可选:工具未安装时跳过(degrade 记录)而非阻断
|
|
1073
|
-
heavy: true # 可选:慢命令(全量测试/构建/e2e),Stop 与 finish 跳过,
|
|
1074
|
-
# 由 verify-e2e / 归档 / cf-validate 全量执行一次
|
|
1075
|
-
on_fail: "修复建议" # 失败时展示的提示
|
|
129
|
+
code-flow task start .code-flow/tasks/2026-11-10/example/example.md --task TASK-001 --session <token>
|
|
1076
130
|
```
|
|
1077
131
|
|
|
1078
|
-
|
|
1079
|
-
|
|
1080
|
-
Claude Code 项目级 AI 指令文件,每次对话自动加载。核心段落:
|
|
1081
|
-
|
|
1082
|
-
| 段落 | 用途 |
|
|
1083
|
-
|------|------|
|
|
1084
|
-
| `## Team Identity` | 团队和项目标识 |
|
|
1085
|
-
| `## Core Principles` | 全局编码原则 |
|
|
1086
|
-
| `## Forbidden Patterns` | 全局禁止模式 |
|
|
1087
|
-
| `## Spec Loading` | 两层规范加载指令(自动生成,勿手动修改) |
|
|
1088
|
-
|
|
1089
|
-
### `AGENTS.md`
|
|
1090
|
-
|
|
1091
|
-
Codex CLI 和 OpenCode 的项目级 AI 指令文件(Costrict 与 Claude Code 一样使用 `CLAUDE.md`),每次对话自动加载。结构与 `CLAUDE.md` 相同,`Spec Loading` 节说明 Spec Catalog 自取与自动注入的分工,`合规反馈协议` 节(v0.5)约定违规修正与误报代执行行为。
|
|
1092
|
-
|
|
1093
|
-
### `.claude/settings.local.json`
|
|
1094
|
-
|
|
1095
|
-
Claude Code 的 Hook 配置。code-flow 自动生成以下 Hook:
|
|
1096
|
-
|
|
1097
|
-
| Hook 事件 | 触发时机 | 脚本 | 作用 |
|
|
1098
|
-
|-----------|---------|------|------|
|
|
1099
|
-
| PreToolUse | AI 调用 Edit/Write/MultiEdit | `cf_pre_tool_hook.py` | Context/scope 检查、按匹配注入 specs + edit 事件埋点 |
|
|
1100
|
-
| PostToolUse | AI 编辑完成后 | `cf_post_hook.py` | frontmatter checks 合规反馈(v0.5) |
|
|
1101
|
-
| Stop | 会话收尾 | `cf_stop_hook.py` | validation.yml 收尾守门(v0.5) |
|
|
1102
|
-
| UserPromptSubmit | 每次提交 prompt | `cf_user_prompt_hook.py` | Spec Catalog / 直注 + 纠正句式采集 |
|
|
1103
|
-
|
|
1104
|
-
### `.codex/hooks.json`
|
|
1105
|
-
|
|
1106
|
-
Codex 四个事件统一调用原生入口 `cf_codex_hook.py`。编辑事件匹配器为 `^apply_patch$`,补丁来自 `tool_input.command`,会话目录和身份来自 `cwd` / `session_id`。
|
|
1107
|
-
|
|
1108
|
-
| Hook 事件 | 作用 |
|
|
1109
|
-
|-----------|------|
|
|
1110
|
-
| UserPromptSubmit | Context-first 路由与纠正句式采集 |
|
|
1111
|
-
| PreToolUse | 解析新增、修改、删除、移动及多文件补丁,逐文件检查 scope |
|
|
1112
|
-
| PostToolUse | 确认补丁成功后记录编辑,并检查现存文件的合规性 |
|
|
1113
|
-
| Stop | 在会话项目内执行收尾校验 |
|
|
1114
|
-
|
|
1115
|
-
平台入口调用共享业务服务,不转换为其他平台的工具事件。安装清单验证受管理脚本、Skill、命令契约和 Hook 定义;用户自定义 Hook 不计入受管理定义。
|
|
132
|
+
token 由工作区、平台和原生会话 ID 产生。绑定仅在系统临时目录,不保存规范快照或测试事实。不同会话/worktree 互不影响。未获得 token 时省略参数,读取 start 打印的规范 brief。
|
|
1116
133
|
|
|
1117
|
-
|
|
134
|
+
重复 start 一个 in-progress Task 是幂等的。done/blocked/归档后绑定失效,后续不自动改选另一个任务。
|
|
1118
135
|
|
|
1119
|
-
|
|
1120
|
-
|
|
1121
|
-
|
|
1122
|
-
|
|
1123
|
-
|
|
1124
|
-
|
|
1125
|
-
| 原生 API / 事件 | 触发时机 | 处理路径 | 作用 |
|
|
1126
|
-
|---------|---------|---------|------|
|
|
1127
|
-
| `session.hook("prompt")` | 用户提交消息 | `cf_opencode_event.py` → 共享 prompt 服务 | Context / Catalog 注入 |
|
|
1128
|
-
| `tool.hook("execute.before")` | 编辑前 | 原生 `input.path/patchText` → 共享编辑服务 | 路径/安装/Spec 范围检查 |
|
|
1129
|
-
| `tool.hook("execute.after")` | 工具返回后 | 原生 `status: completed/error` → 共享编辑服务 | 成功编辑证据及合规反馈;失败写 degrade |
|
|
1130
|
-
| `session.hook("context")` | 模型请求前 | 插件内按会话消费反馈 | 注入 `{ type: "text", text }` |
|
|
1131
|
-
| `event.subscribe()` → `session.idle` | 会话空闲 | `cf_opencode_event.py` → 共享收尾服务 | 校验失败进入下轮 context;没有阻断 idle 的 API |
|
|
1132
|
-
|
|
1133
|
-
新增路径引入未绑定的 required Spec 时,三端均提示先 refresh Context / Plan,允许本次编辑;上下文损坏或漂移仍按 required 模式阻断。提示不替代阶段门禁的 Spec 校验。
|
|
1134
|
-
|
|
1135
|
-
会话目录取自 `ctx.session.get({ sessionID }).location.directory`,插件状态按实例隔离。同目录子会话不运行主任务 Done gate;独立工作区子会话检查自己的任务。清理插件时取消事件订阅和在途子进程。
|
|
1136
|
-
|
|
1137
|
-
> OpenCode v2 插件入口需默认导出 `{ id, setup }`(或 `Plugin.define`),入口名 `index.js`,`package.json` 含 `"type": "module"`;`code-flow init --platform=opencode` 会一并部署。
|
|
1138
|
-
|
|
1139
|
-
### `.codex/config.toml`
|
|
1140
|
-
|
|
1141
|
-
Codex CLI 功能开关(v0.4.7 起特性开关由 `codex_hooks` 更名为 `hooks`):
|
|
1142
|
-
|
|
1143
|
-
```toml
|
|
1144
|
-
[features]
|
|
1145
|
-
hooks = true
|
|
136
|
+
```bash
|
|
137
|
+
code-flow task unbind --session <token>
|
|
138
|
+
code-flow task block <task-file> --task TASK-001 --reason "等待外部依赖"
|
|
139
|
+
code-flow task start <task-file> --task TASK-001
|
|
140
|
+
code-flow task reopen <done-task-file> --task TASK-001 --reason "新增回归需要验证"
|
|
141
|
+
code-flow task status --json
|
|
1146
142
|
```
|
|
1147
143
|
|
|
1148
|
-
|
|
1149
|
-
|
|
1150
|
-
## 工作流示例
|
|
1151
|
-
|
|
1152
|
-
### 典型开发流程
|
|
144
|
+
## 4. 测试与完成
|
|
1153
145
|
|
|
1154
|
-
```
|
|
1155
|
-
|
|
1156
|
-
code-flow init
|
|
1157
|
-
/cf-learn --map ← 填充导航地图
|
|
1158
|
-
|
|
1159
|
-
2. 需求对齐(三种入口,按需选择)
|
|
1160
|
-
a) 有设计文档:
|
|
1161
|
-
/cf-task:plan docs/feature-design.md ← 缺口分析 + 拆解任务
|
|
1162
|
-
b) 只有一句话需求、需要先理清业务(推荐):
|
|
1163
|
-
/cf-task:prd "给项目加用户认证" ← 交互式产出 .prd.md(业务需求)
|
|
1164
|
-
/cf-task:align .code-flow/tasks/.../xxx.prd.md ← 从 PRD 派生 .design.md(技术设计)
|
|
1165
|
-
/cf-task:plan .code-flow/tasks/.../xxx.design.md ← 从设计简报拆解任务
|
|
1166
|
-
c) 技术方案已明确,直接做设计:
|
|
1167
|
-
/cf-task:align "给项目加用户认证" ← 交互式需求细化,产出 .design.md
|
|
1168
|
-
/cf-task:plan .code-flow/tasks/.../xxx.design.md ← 从设计简报拆解任务
|
|
1169
|
-
|
|
1170
|
-
3. 任务审阅
|
|
1171
|
-
(review 任务文件,标注 #NOTES)
|
|
1172
|
-
/cf-task:note feature-module ← 讨论并解决 Notes
|
|
1173
|
-
|
|
1174
|
-
4. 编码实现
|
|
1175
|
-
/cf-task:start feature-module ← 按依赖顺序逐个编码
|
|
1176
|
-
(任务验收标准自动成为会话约束;编辑前注入规范,
|
|
1177
|
-
编辑后 checks 机检——违规当场反馈,AI 自行修正,v0.5)
|
|
1178
|
-
|
|
1179
|
-
5. 验证
|
|
1180
|
-
(会话收尾 Stop Hook 自动按 validation.yml 校验本次改动,
|
|
1181
|
-
未过项把 AI 拦回修复;/cf-validate 仍可随时手动触发)
|
|
1182
|
-
|
|
1183
|
-
6. 归档
|
|
1184
|
-
/cf-task:archive feature-module ← 三维校验 + 归档(清理会话约束)
|
|
1185
|
-
|
|
1186
|
-
7. 规范沉淀
|
|
1187
|
-
/cf-learn --review ← 候选自动带上本期对话纠正信号
|
|
146
|
+
```bash
|
|
147
|
+
code-flow task finish <task-file> --task TASK-001 --jobs 2 --json
|
|
1188
148
|
```
|
|
1189
149
|
|
|
1190
|
-
|
|
150
|
+
finish 只接受 in-progress,实际执行该 TASK 的 tests,全部通过才原子写入 done。失败、超时和中断保持进行中,回收整个进程树;测试期间 Task 有并发编辑则不覆盖。
|
|
1191
151
|
|
|
1192
|
-
|
|
1193
|
-
开发中 AI 生成代码 → 违规被 checks 当场机检反馈 → AI 自行修正
|
|
1194
|
-
↓
|
|
1195
|
-
机检覆盖不到的问题:你在对话中纠正 AI("不要这样写")
|
|
1196
|
-
↓
|
|
1197
|
-
纠正语句 + AI 的修正改动被自动配对采集(correction 事件)
|
|
1198
|
-
↓
|
|
1199
|
-
/cf-learn 聚合同类纠正(≥2 次)→ 候选规范(✅/❌ 对照 + checks 草稿)
|
|
1200
|
-
↓
|
|
1201
|
-
你确认写入 spec → 下次该问题直接被机检拦住,不再进对话
|
|
1202
|
-
```
|
|
152
|
+
不提供独立 task verify 入口;日常完成直接 finish,避免重复执行。E2E 和全量回归由 CI 执行,`e2e` 字段只作声明。
|
|
1203
153
|
|
|
1204
|
-
|
|
154
|
+
- 优先 argv;需要 shell 特性才使用 run,只执行可信任务中的命令。
|
|
155
|
+
- 默认 cwd 是项目根,覆盖目录必须仍在工作区内。
|
|
156
|
+
- parallel 默认 false,为单 runner 独占屏障;true 的命令受 jobs 上限约束,同仓库各 CLI/worktree 的同名 group 通过仓库共享锁互斥。
|
|
157
|
+
- 同框架多个文件聚合到一次调用,优先框架内部 workers;避免 CLI jobs 与框架 workers 叠加争抢资源。
|
|
158
|
+
- 每个 stdout/stderr 最多保留尾部 50 行、64KiB。
|
|
159
|
+
- tests=[] 需同时有 skip_tests:true 与非空 skip_reason。
|
|
160
|
+
- config.tests.regression 可选,声明一条项目级回归命令(argv/run 二选一);它只在 `task parallel merge` 的任务测试之后执行一次,失败保持 run blocked。未配置时不执行,也不猜 `npm test`。
|
|
1205
161
|
|
|
1206
|
-
|
|
162
|
+
PASS 表示此次声明命令成功,不代表之后修改或全量需求已经通过。
|
|
1207
163
|
|
|
1208
|
-
|
|
164
|
+
Verification 摘要同时记录测试声明哈希、测试时的 HEAD 和工作区状态:`tests=` 来自 start 时的声明,声明在 start 后被修改会标记 `tests-changed`;`head=none` 表示非 Git 项目,`dirty=1` 表示测试跑在未提交的业务改动上(`.code-flow` 文档改动不计入)。这些字段只用于追溯,不改变 PASS/FAIL 语义。
|
|
1209
165
|
|
|
1210
|
-
|
|
166
|
+
## 5. 沉淀与归档
|
|
1211
167
|
|
|
1212
|
-
|
|
168
|
+
done Task 的 `### Spec Delta` JSON 块直接使用数组:
|
|
1213
169
|
|
|
1214
|
-
|
|
1215
|
-
|
|
1216
|
-
|
|
1217
|
-
|
|
1218
|
-
|
|
1219
|
-
|
|
1220
|
-
|
|
1221
|
-
|
|
170
|
+
```json
|
|
171
|
+
[
|
|
172
|
+
{
|
|
173
|
+
"id": "DELTA-001",
|
|
174
|
+
"op": "add",
|
|
175
|
+
"target": "cli/runtime",
|
|
176
|
+
"rule": "测试失败必须保留进行中状态。",
|
|
177
|
+
"evidence": "失败测试不能成为完成依据。"
|
|
178
|
+
}
|
|
179
|
+
]
|
|
1222
180
|
```
|
|
1223
181
|
|
|
1224
|
-
|
|
1225
|
-
|
|
1226
|
-
|
|
1227
|
-
|
|
1228
|
-
|
|
1229
|
-
├─ 修正率:反馈后修正率低 = message 没说清怎么改 → 改提示文案
|
|
1230
|
-
└─ 误报率与自动停用:fp 高的 check → 收紧 pattern 或删除
|
|
1231
|
-
|
|
1232
|
-
/cf-stats --audit
|
|
1233
|
-
├─ REVIEW 待复审清单:长期未命中 / 已停用 / 反复误报 → 改写、删除或豁免
|
|
1234
|
-
├─ "冗长/冗余/过时/缺描述/checks 语法" 告警 → 修文档债
|
|
1235
|
-
└─ CATALOG 行数与 token:目录超预算 = 该拆域或精简 description
|
|
182
|
+
```bash
|
|
183
|
+
code-flow spec learn --from-task <done-task-file> --task TASK-001 --dry-run
|
|
184
|
+
code-flow spec learn --from-task <done-task-file> --task TASK-001
|
|
185
|
+
code-flow task archive <requirement-dir> --dry-run
|
|
186
|
+
code-flow task archive <requirement-dir>
|
|
1236
187
|
```
|
|
1237
188
|
|
|
1238
|
-
|
|
1239
|
-
|
|
1240
|
-
- spec 改动走正常 PR:**checks 标注影响全队的编辑体验,按生产配置评审**(pattern 误报面、message 是否给出修正路径、files glob 范围)
|
|
1241
|
-
- 开发者确认落盘的 cf-learn 候选同样经 PR 进入主干——管理员是最后一道闸
|
|
1242
|
-
- 新规则上线后下个治理周期看它的违规/误报数据,用数据验证规则质量
|
|
1243
|
-
|
|
1244
|
-
**四、升级与灰度**
|
|
189
|
+
add 需要 rule/evidence;update 需要 ref/before/rule/evidence;remove 需要 ref/before/evidence。before 必须匹配旧规则完整正文,目标 Spec 必须存在。
|
|
1245
190
|
|
|
1246
|
-
|
|
1247
|
-
- 新能力灰度:`quality_loop` 子开关支持单项关闭(如只开 post_check、关 correction_capture)
|
|
1248
|
-
- `quality_loop.enabled: false` 可关闭质量反馈;`required` 的 Spec Gate 仍生效。历史 `warn/inject` 会降低部分验证门禁,由 doctor 提示迁移,路由完整性错误始终阻断。运行时升级回滚按迁移 journal 操作。
|
|
1249
|
-
|
|
1250
|
-
**管理员的关键转变**(v0.5):过去判断"规范好不好"靠体感,现在有三组数据闭环——违规率说明规则是否被理解、修正率说明反馈是否有效、误报率说明机检是否过严。规范库的增删都有数据背书,做减法(退役僵尸规范)第一次变得有依据。
|
|
1251
|
-
|
|
1252
|
-
---
|
|
191
|
+
Delta 身份由任务文档路径 + TASK ID + Delta ID 构成,已应用后不能修改 payload,修订需使用新 ID。Spec 的 Applied Deltas 使用 JSON 行记录来源、Rule、操作和 payload hash,保障中断后的重试;不要删除记录或回退 next_rule。
|
|
1253
192
|
|
|
1254
|
-
|
|
193
|
+
多文件应用允许部分成功;失败时保留需求目录,重试跳过相同已应用项。在 Git 注册的协调工作区、关联 run 已完成且所有 Task done、增量应用成功后,才移动至 tasks/archived/<原日期>/<需求>。worker 中 archive/learn 均拒绝,不以目录名判断权限。目标存在时报错,不改名覆盖。
|
|
1255
194
|
|
|
1256
|
-
|
|
195
|
+
archive --no-learn 明确跳过沉淀。归档不会运行任何测试。
|
|
1257
196
|
|
|
1258
|
-
|
|
197
|
+
## 6. 升级、worktree 与旧版切换
|
|
1259
198
|
|
|
1260
|
-
```
|
|
1261
|
-
|
|
1262
|
-
|
|
1263
|
-
→ cf_pre_tool_hook.py 从 stdin 接收 JSON(tool_name + file_path)
|
|
1264
|
-
→ 从文件路径提取上下文标签:{api, user, route, ...}
|
|
1265
|
-
→ 标签与 config.yml 中的 specs tags 做交集匹配
|
|
1266
|
-
→ 读取匹配到的 spec 文件内容
|
|
1267
|
-
→ 按 tier 分层(Tier 0 导航地图在前、Tier 1 约束规范在后)、按 token 预算裁剪
|
|
1268
|
-
→ **约束声明"以上规范是本次开发的约束条件,生成代码必须遵循"始终置于输出顶部**(assemble_context 强制)
|
|
1269
|
-
→ 通过 stdout JSON 返回 hookSpecificOutput.additionalContext
|
|
1270
|
-
→ 规范内容注入到 AI 上下文,指导代码生成
|
|
199
|
+
```bash
|
|
200
|
+
npm i -g @michaelxwb/code-flow@<version>
|
|
201
|
+
code-flow init
|
|
1271
202
|
```
|
|
1272
203
|
|
|
1273
|
-
|
|
204
|
+
所有项目共享全局版本。回滚兼容的 v1 包后重新 init;用户数据通过 git 撤销。
|
|
1274
205
|
|
|
1275
|
-
|
|
206
|
+
批次 worktree 由内部 `task parallel prepare/collect/merge/cleanup` 编排,`cf-task:start` 负责驱动 worker:prepare 仅把 Specs、当前需求和 config 形成 baseline,范围外脏改动(含其他需求/无关暂存内容)拒绝。worker 校验快照;默认不执行 init(worker 直接使用全局 CLI),只有需要在 worker 内启动宿主会话时才用 `--init`。工具增量不提交或合并。
|
|
1276
207
|
|
|
1277
|
-
|
|
1278
|
-
用户输入 "修改 @src/api/users.py 的权限验证逻辑,注意性能"
|
|
1279
|
-
→ Codex CLI 触发 UserPromptSubmit Hook
|
|
1280
|
-
→ cf_user_prompt_hook.py 从 stdin 接收 JSON(prompt + session_id)
|
|
1281
|
-
→ 从 prompt 文本中提取文件引用(@前缀、反引号、裸路径)→ context_tags
|
|
1282
|
-
→ 含路径且命中域:与 specs tags 交集匹配后直注完整约束(+ 附带 Catalog 保证跨域可达)
|
|
1283
|
-
→ 无路径命中(catalog 模式默认):注入 Spec Catalog,AI 按目录行自行 Read 相关 spec
|
|
1284
|
-
→ mode: full 时回到旧行为:关键词词表匹配,零命中 fallback 仅注入 Tier 0 导航地图
|
|
1285
|
-
→ 通过 stdout JSON 返回 hookSpecificOutput.additionalContext
|
|
1286
|
-
→ 规范内容注入到本次 prompt 上下文
|
|
1287
|
-
```
|
|
208
|
+
每个 worker 只改业务代码和自己的 TASK 段。collect 核对完整 diff 与准确 SHA;任务文档按三方归属合并,同段冲突不会采用 done 优先。全部合入后在协调工作区聚合重跑本批相关测试,去重且不跑全量/E2E;配置了 tests.regression 时再追加一次项目回归,通过后才自动清理,失败保留资源。runner 每次重建 ledger 的隔离环境,默认最多 2 个 worker,并结合 jobs/框架 workers 设置资源预算。
|
|
1288
209
|
|
|
1289
|
-
|
|
210
|
+
run ledger 是唯一持久编排台账。中断后 status/doctor 只读给出实际状态,重新调用 prepare/merge/cleanup 才执行恢复;恢复核对 Git 提交与所有权,不凭目录存在继续。
|
|
1290
211
|
|
|
1291
|
-
|
|
212
|
+
从旧版切换:
|
|
1292
213
|
|
|
1293
|
-
|
|
1294
|
-
|
|
1295
|
-
|
|
1296
|
-
|
|
1297
|
-
|
|
1298
|
-
|
|
1299
|
-
会话收尾 → Stop 触发 cf_stop_hook.py
|
|
1300
|
-
→ 从会话日志取本会话编辑过的文件 → 匹配 validation.yml trigger
|
|
1301
|
-
→ 串行执行(总预算 30s)→ 未过项以 decision=block 拦回修复
|
|
1302
|
-
→ 全过/无 validation.yml/stop_hook_active → 静默
|
|
1303
|
-
```
|
|
214
|
+
1. 保存 git 基线与未跟踪资料。
|
|
215
|
+
2. 处理旧 .code-flow 内真实 worktree,避免移动其父目录破坏路径。
|
|
216
|
+
3. 手工移除各平台中旧 code-flow Hook、插件、命令和托管指令段,保留用户其他内容。
|
|
217
|
+
4. 把旧数据保存到项目外,重新 init。
|
|
218
|
+
5. 依据当前代码整理仍适用的 Spec,采用 JSON frontmatter/路径身份;重建活跃 Task 和测试声明。
|
|
1304
219
|
|
|
1305
|
-
|
|
220
|
+
init 不负责旧版清理或转换,不提供迁移脚本。
|
|
1306
221
|
|
|
1307
|
-
|
|
222
|
+
## 7. CI 与诊断
|
|
1308
223
|
|
|
1309
|
-
|
|
1310
|
-
AI 调用 Edit("src/api/users.py", ...)
|
|
1311
|
-
→ Costrict 触发 PreToolUse Hook
|
|
1312
|
-
→ cf_pre_tool_hook.py 从 stdin 接收 JSON(tool_name + file_path)
|
|
1313
|
-
→ 从文件路径提取上下文标签
|
|
1314
|
-
→ 标签与 config.yml 中的 specs tags 做交集匹配
|
|
1315
|
-
→ 读取匹配到的 spec 文件内容
|
|
1316
|
-
→ 通过 stdout JSON 返回 hookSpecificOutput.additionalContext
|
|
1317
|
-
→ 规范内容注入到 AI 上下文,指导代码生成
|
|
1318
|
-
```
|
|
1319
|
-
|
|
1320
|
-
### OpenCode 工作原理
|
|
224
|
+
全量回归和 E2E 是独立 CI 命令。本仓库 CI 使用 `npm test`,在 Ubuntu/macOS/Windows 和 Node 18/22/24 上运行;外部项目按自己的 test:all / test:e2e 脚本执行,不让 task archive 隐式调用。
|
|
1321
225
|
|
|
1322
|
-
|
|
226
|
+
只读诊断:
|
|
1323
227
|
|
|
1324
|
-
```
|
|
1325
|
-
|
|
1326
|
-
execute.before → edit/write 的 input.path、patch 的 input.patchText → 范围检查
|
|
1327
|
-
execute.after → status=completed 才记录 edit 与运行合规检查
|
|
1328
|
-
session.context → 等待该会话的在途事件 → 注入排队反馈
|
|
1329
|
-
session.idle → 从会话 API 获取实际目录 → 校验该工作区的任务
|
|
228
|
+
```bash
|
|
229
|
+
code-flow doctor --json
|
|
1330
230
|
```
|
|
1331
231
|
|
|
1332
|
-
|
|
232
|
+
检查 config、模板、Spec、Task 文档、平台入口、Codex config.toml 形式和 worktree ledger;不修改文件。
|
|
1333
233
|
|
|
1334
|
-
|
|
234
|
+
`code-flow doctor --json` 只读检查配置、引用、Hook、模板和 run;返回稳定诊断与修复建议,不执行用户 Hook/Tests。宿主加载/信任无法确认时标记 unknown,发现错误退出 1,只有警告或 unknown 退出 0,用法/诊断自身错误退出 2。
|
|
1335
235
|
|
|
1336
|
-
|
|
236
|
+
Hook 失败只向 stderr 输出诊断,不拒绝 prompt。普通 CLI 用法/数据错误退出 2,操作或测试失败退出 1;--json 输出结构化结果,中断保留平台退出状态。
|
|
1337
237
|
|
|
1338
|
-
|
|
1339
|
-
|------|---------|
|
|
1340
|
-
| 目录名 | `src`, `api`, `handlers` |
|
|
1341
|
-
| 安全去复数 | `handler` (handlers → handler) |
|
|
1342
|
-
| 语义映射 | `handlers` → `[api, error]` |
|
|
1343
|
-
| 文件名词分割 | `user`, `auth` |
|
|
238
|
+
需要检查全量规则时使用 spec inject --full。没有 Context refresh、安装 manifest、集中 Evidence Store 或持久测试缓存。
|
|
1344
239
|
|
|
1345
|
-
|
|
240
|
+
## 8. 过程数据(可选)
|
|
1346
241
|
|
|
1347
|
-
|
|
242
|
+
在启动宿主前设置事件日志,之后所有 CLI/Hook 调用都会追加一行 JSON:
|
|
1348
243
|
|
|
1349
244
|
```bash
|
|
1350
|
-
|
|
245
|
+
export CF_EVENT_LOG="$PWD/.code-flow-logs/events.jsonl"
|
|
1351
246
|
```
|
|
1352
247
|
|
|
1353
|
-
|
|
248
|
+
事件包含 `command`、`args`、`cwd`、`exit`、`ms`、stdout/stderr 字节数和精简结果(finish 的测试 id/状态/耗时、start/inject 的 emitted/omitted、learn 的 Delta 结果、task status 计数)。它不记录规则正文、源码或测试输出,不改变 Hook stdout 协议和退出码。
|
|
1354
249
|
|
|
1355
|
-
|
|
1356
|
-
CF_DEBUG=1 printf '%s' '{"session_id":"test-session","prompt":"修改 @src/api/users.py 的权限逻辑,注意性能"}' | python3 .code-flow/scripts/cf_user_prompt_hook.py
|
|
1357
|
-
```
|
|
1358
|
-
|
|
1359
|
-
**Costrict Hook**(与 Claude Hook 相同):
|
|
250
|
+
也可以在 `.code-flow/config.json` 开启自动采集:
|
|
1360
251
|
|
|
1361
|
-
```
|
|
1362
|
-
|
|
252
|
+
```json
|
|
253
|
+
{
|
|
254
|
+
"capture": { "enabled": true, "path": ".code-flow/process" }
|
|
255
|
+
}
|
|
1363
256
|
```
|
|
1364
257
|
|
|
1365
|
-
|
|
258
|
+
验证结束后,用跨平台 Node 命令采集(不需要 shell 脚本):
|
|
1366
259
|
|
|
1367
260
|
```bash
|
|
1368
|
-
|
|
1369
|
-
python3 -m pytest -q tests/test_opencode_native.py
|
|
261
|
+
code-flow process collect --out <output-dir> [--transcript <host-session.jsonl>]
|
|
1370
262
|
```
|
|
1371
263
|
|
|
1372
|
-
|
|
1373
|
-
调试输出会包含 `debug` 字段,显示匹配到的域、标签和 specs。
|
|
1374
|
-
|
|
1375
|
-
### 会话状态
|
|
1376
|
-
|
|
1377
|
-
注入状态保存在 `.code-flow/sessions/injection/<session-id 的 SHA256>.json`,Prompt 与编辑入口共享;`.session-state.json` 仅保存上下文压缩提醒计数。
|
|
1378
|
-
|
|
1379
|
-
- TASK 和 path 模式按实际投影指纹去重,修改 `Spec-Refs`、合同或投影依赖后立即重新注入。
|
|
1380
|
-
- 每个会话独立,保留每 25 轮 Prompt 的周期重注入;成功输出后才提交去重状态,输出失败会保留重试机会。
|
|
1381
|
-
- 每个批量编辑事件按所属项目加载一次 Context;每次事件检查绑定 Spec 的源哈希,变化后要求 refresh。
|
|
1382
|
-
- path 注入使用 `min(budget.total, budget.l1_max)` 的估算 token 预算。超预算会阻断并提示创建聚焦 TASK 或缩小编辑范围,required 内容不会被静默截断。
|
|
1383
|
-
- Catalog 排除 `_session/` 与命令模板;目录超预算时显示省略数量,并提供 `code-flow spec catalog --root . --stage code --json` 获取完整约束候选。
|
|
1384
|
-
|
|
1385
|
-
实现与回归场景见 [Specs 注入校验](spec-injection-hardening.md)。
|
|
1386
|
-
|
|
1387
|
-
---
|
|
1388
|
-
|
|
1389
|
-
## 故障排查
|
|
1390
|
-
|
|
1391
|
-
> 先确认初始化平台:
|
|
1392
|
-
> - Claude 路径(`code-flow init` 或 `--platform=claude`)检查 `.claude/settings.local.json`
|
|
1393
|
-
> - Codex 路径(`--platform=codex`)检查 `.codex/hooks.json` 与 `.codex/config.toml`
|
|
1394
|
-
> - Costrict 路径(`--platform=costrict`)检查 `.costrict/settings.local.json`
|
|
1395
|
-
> - OpenCode 路径(`--platform=opencode`)检查 `.opencode/plugins/code-flow/{index.js,package.json}`,并用 `opencode plugin list` 确认 `code-flow` 已加载
|
|
1396
|
-
> - 单平台项目缺少其他平台的配置文件属于正常现象
|
|
1397
|
-
|
|
1398
|
-
### Hook 未触发(Claude Code)
|
|
1399
|
-
|
|
1400
|
-
**现象**:编辑代码文件时没有看到规范注入。
|
|
1401
|
-
|
|
1402
|
-
**排查步骤**:
|
|
1403
|
-
|
|
1404
|
-
1. 检查 `.claude/settings.local.json` 中 hooks 配置是否存在
|
|
1405
|
-
2. 检查文件扩展名是否在 `config.yml` 的 `code_extensions` 列表中
|
|
1406
|
-
3. 检查文件路径是否被 `skip_paths` 排除
|
|
1407
|
-
4. 手动运行 Hook 测试:
|
|
1408
|
-
```bash
|
|
1409
|
-
printf '%s' '{"tool_name":"Edit","tool_input":{"file_path":"/absolute/path/to/file.py"}}' | python3 .code-flow/scripts/cf_pre_tool_hook.py
|
|
1410
|
-
```
|
|
1411
|
-
|
|
1412
|
-
### Hook 未触发(Codex CLI)
|
|
1413
|
-
|
|
1414
|
-
1. 检查 `.codex/config.toml` 中 `features.hooks = true`,并在 Codex `/hooks` 中信任当前定义。
|
|
1415
|
-
2. 检查 `.codex/hooks.json` 的四个事件是否调用 `cf_codex_hook.py`,编辑事件 matcher 是否为 `^apply_patch$`。
|
|
1416
|
-
3. 执行 `code-flow spec validate --help` 检查公开命令与安装完整性。
|
|
1417
|
-
4. 安装损坏或版本不一致时,执行 `code-flow migrate --runtime --dry-run` 查看范围,再执行 `code-flow migrate --runtime --apply`。迁移会备份受影响文件并更新全部已安装平台。
|
|
1418
|
-
5. 没有 active TASK、没有显式文件路径时只注入 Spec Catalog;这是 Context-first 路由的正常行为。
|
|
1419
|
-
|
|
1420
|
-
### Codex 命令不可用
|
|
1421
|
-
|
|
1422
|
-
**现象**:在 Codex CLI 中输入 `$cf-init` 无响应。
|
|
1423
|
-
|
|
1424
|
-
**排查步骤**:
|
|
1425
|
-
|
|
1426
|
-
1. 检查 `.agents/skills/cf-init/SKILL.md` 是否存在
|
|
1427
|
-
2. 若不存在,重新运行 `code-flow init --platform=codex` 重新部署 Skills
|
|
1428
|
-
3. 确认 Codex CLI 版本支持 Skills:`codex --version`
|
|
1429
|
-
|
|
1430
|
-
### Hook 未触发(Costrict)
|
|
1431
|
-
|
|
1432
|
-
**现象**:编辑代码文件时没有看到规范注入。
|
|
1433
|
-
|
|
1434
|
-
**排查步骤**:
|
|
1435
|
-
|
|
1436
|
-
1. 检查 `.costrict/settings.local.json` 中 hooks 配置是否存在
|
|
1437
|
-
2. 检查文件扩展名是否在 `config.yml` 的 `code_extensions` 列表中
|
|
1438
|
-
3. 检查文件路径是否被 `skip_paths` 排除
|
|
1439
|
-
4. 手动运行 Hook 测试(与 Claude Hook 相同):
|
|
1440
|
-
```bash
|
|
1441
|
-
printf '%s' '{"tool_name":"Edit","tool_input":{"file_path":"/absolute/path/to/file.py"}}' | python3 .code-flow/scripts/cf_pre_tool_hook.py
|
|
1442
|
-
```
|
|
1443
|
-
|
|
1444
|
-
### Costrict 命令不可用
|
|
1445
|
-
|
|
1446
|
-
**现象**:在 Costrict 中输入 `/project:cf-init` 无响应。
|
|
1447
|
-
|
|
1448
|
-
**排查步骤**:
|
|
1449
|
-
|
|
1450
|
-
1. 检查 `.costrict/commands/cf-init.md` 是否存在
|
|
1451
|
-
2. 若不存在,重新运行 `code-flow init --platform=costrict` 重新部署命令文件
|
|
1452
|
-
3. 确认命令前缀为 `/project:` 而非 `/`
|
|
1453
|
-
|
|
1454
|
-
### Hook 未触发(OpenCode)
|
|
1455
|
-
|
|
1456
|
-
**现象**:OpenCode 中提交消息后 system prompt 没有 spec 注入。
|
|
1457
|
-
|
|
1458
|
-
**排查步骤**:
|
|
1459
|
-
|
|
1460
|
-
1. 运行 `opencode plugin list`,确认 `code-flow` 以 `local` 来源出现在 `.opencode/plugins/code-flow/index.js`;若 ID 显示为 `-` 说明加载失败,查看 `~/.local/share/opencode/log/opencode.log`(v2 自动发现,不需要 `opencode.json` 注册;若配置里残留 v1 `plugin` 键,删除后重新 init)
|
|
1461
|
-
2. 检查 `.opencode/plugins/code-flow/package.json` 是否存在且包含 `"type": "module"`(ESM 入口必需,缺失会导致插件加载失败)
|
|
1462
|
-
3. 检查 `.opencode/plugins/code-flow/index.js` 是否完整(默认导出 `{ id, setup }`,注册 prompt/context、execute.before/after 并订阅 session.idle)
|
|
1463
|
-
4. 查看 OpenCode 服务日志中的 `code-flow OpenCode` / `native runtime` 错误,以及 `.code-flow/.session-log.jsonl` 中的 inject/edit/degrade 事件;插件在工作区激活后才进入 active 列表
|
|
1464
|
-
5. 手动测试 hook 脚本(与 Codex 相同):
|
|
1465
|
-
```bash
|
|
1466
|
-
printf '%s' '{"session_id":"test","prompt":"修改 @src/api/users.py 注意性能"}' | python3 .code-flow/scripts/cf_user_prompt_hook.py
|
|
1467
|
-
```
|
|
1468
|
-
|
|
1469
|
-
### OpenCode 命令不可用
|
|
1470
|
-
|
|
1471
|
-
**现象**:在 OpenCode 中输入 `/cf-init` 无响应。
|
|
1472
|
-
|
|
1473
|
-
**排查步骤**:
|
|
1474
|
-
|
|
1475
|
-
1. 检查 `.opencode/commands/cf-init.md` 是否存在且首部是合法 YAML frontmatter(`---\ndescription: ...\n---`)
|
|
1476
|
-
2. 若不存在,重新运行 `code-flow init --platform=opencode` 重新部署命令文件
|
|
1477
|
-
3. 确认子命令路径正确,如 `/cf-task:plan` 对应 `.opencode/commands/cf-task/plan.md`
|
|
1478
|
-
|
|
1479
|
-
### 规范未匹配
|
|
1480
|
-
|
|
1481
|
-
**现象**:Hook 触发了但没有注入预期的 spec。
|
|
1482
|
-
|
|
1483
|
-
**排查步骤**:
|
|
1484
|
-
|
|
1485
|
-
1. 用 `CF_DEBUG=1` 运行 Hook,查看 `context_tags` 和 `matched_specs`
|
|
1486
|
-
2. 检查 `config.yml` 中对应 spec 的 `tags` 是否包含文件路径能提取出的标签
|
|
1487
|
-
3. Tier 1 约束规范无 fallback,当 context_tags ∪ prompt_tags 与 spec.tags 无交集时,对应规范不会被注入
|
|
1488
|
-
|
|
1489
|
-
### Python 环境问题
|
|
1490
|
-
|
|
1491
|
-
```bash
|
|
1492
|
-
# 检查 Python 版本
|
|
1493
|
-
python3 --version # 需要 >= 3.9
|
|
1494
|
-
|
|
1495
|
-
# 检查 pyyaml / pytest
|
|
1496
|
-
python3 -c "import yaml; print(yaml.__version__)"
|
|
1497
|
-
python3 -m pytest --version
|
|
1498
|
-
|
|
1499
|
-
# 手动安装运行依赖
|
|
1500
|
-
python3 -m pip install pyyaml pytest
|
|
1501
|
-
```
|
|
1502
|
-
|
|
1503
|
-
### Token 超预算
|
|
1504
|
-
|
|
1505
|
-
运行 `/cf-stats --audit` 查看各文件 token 分布与质量问题。优化方向:
|
|
1506
|
-
- 删除冗余规则(多个 spec 重复的内容)
|
|
1507
|
-
- 精简过长的 spec 文件(单文件 > 500 tokens 会被标记)
|
|
1508
|
-
- 调整 `config.yml` 中的预算上限
|
|
1509
|
-
|
|
1510
|
-
## 0.8.0 运行时命令契约
|
|
1511
|
-
|
|
1512
|
-
Agent 使用 `code-flow spec/task/scenarios/design/acceptance/evidence/audit/validate/stats` 正式入口;Python 文件是内部实现。参数帮助来自实际运行时解析器,例如 `code-flow spec doctor --help`。当前命令包括:
|
|
1513
|
-
|
|
1514
|
-
| 命令 | 用途 |
|
|
1515
|
-
|------|------|
|
|
1516
|
-
| `code-flow scenarios parse --file "<需求>.scenarios.md" --quality --json` | 场景语义与浏览器边界质量门禁 |
|
|
1517
|
-
| `code-flow design lint --file "<需求>.design.md" --scenarios-file "<需求>.scenarios.md" --json` | ID 闭环、功能覆盖与声明模板章节 |
|
|
1518
|
-
| `code-flow acceptance manifest --verify-plan --task-dir "<需求目录>" --task-file "<任务文件>"` | 完整计划门禁与真实收集校验 |
|
|
1519
|
-
| `code-flow task verify --layers validators,review,e2e --profile smoke\|changed\|full --resume --deadline <秒>` | 分层/分级/续跑;`--checks` 等价 `--layers validators` |
|
|
1520
|
-
| `code-flow task finish --batch TASK-001,TASK-002` / `--capability <名称>` | 批量 Done Gate,共享 check 只执行一次 |
|
|
1521
|
-
| `code-flow evidence import --format junit\|playwright --file <报告> --commit <sha> --run-url <url>` | CI 证据导入 |
|
|
1522
|
-
| `code-flow audit --task-dir <需求目录> --json` | 只读不变量审计 |
|
|
1523
|
-
| `code-flow spec doctor --task-dir "<需求目录>" --root "$PWD" --json` | Context/安装健康、应用引用与阶段 readiness |
|
|
1524
|
-
|
|
1525
|
-
运行时状态:`done` 仅在 required code check 全部 verified 后成立;`provisional` 表示仍有合法延后、env_blocked 或 incomplete;真实 failed 会阻断,不会转成成功。`env_blocked` 不写 verified、不计产品失败。0.7 安装需执行显式事务迁移,见 [0.8.0 迁移说明](migrations/runtime-0.8.0.md)(含 rollback、manifest v3 与 evidence sidecar)。旧的 0.7 命令别名保留一个 minor。
|
|
264
|
+
输出一个目录,包含事件日志、`task status`/`doctor`/`spec list`、Specs/Tasks 快照、config、文件哈希、git 状态/日志/diff 摘要,以及可选的宿主会话 transcript;手动压缩该目录传递。
|
|
1526
265
|
|
|
1527
|
-
|
|
266
|
+
隐私:数据包可能包含项目路径、需求文本和对话内容;分享前请审阅。事件日志本身不包含规则正文或源码。
|
|
1528
267
|
|
|
1529
|
-
|
|
268
|
+
分析重点:命令与阶段耗时、finish 重试、blocked 状态、注入/省略的规则与字节数、spec learn/archive 结果、Task 状态,以及 PRD/design/scenarios 是否把隐含约束写清楚。
|