@michaelxwb/code-flow 0.6.5 → 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.
Files changed (177) hide show
  1. package/README.md +75 -110
  2. package/bin/code-flow.js +12 -0
  3. package/docs/README.md +19 -0
  4. package/docs/USAGE.md +268 -0
  5. package/docs/v1-design.md +1858 -0
  6. package/docs/v1-implementation.md +186 -0
  7. package/lib/adapters.js +126 -0
  8. package/lib/cli.js +258 -0
  9. package/lib/config.js +85 -0
  10. package/lib/doctor.js +283 -0
  11. package/lib/frontmatter.js +42 -0
  12. package/lib/fs.js +141 -0
  13. package/lib/glob.js +23 -0
  14. package/lib/hook.js +99 -0
  15. package/lib/init.js +132 -0
  16. package/lib/learn.js +170 -0
  17. package/lib/locks.js +52 -0
  18. package/lib/markdown.js +13 -0
  19. package/lib/process.js +116 -0
  20. package/lib/render.js +115 -0
  21. package/lib/repo.js +48 -0
  22. package/lib/runs.js +155 -0
  23. package/lib/session.js +40 -0
  24. package/lib/spec.js +80 -0
  25. package/lib/task.js +258 -0
  26. package/lib/taskdoc.js +308 -0
  27. package/lib/toml.js +140 -0
  28. package/lib/verify.js +168 -0
  29. package/lib/worktree.js +930 -0
  30. package/package.json +21 -9
  31. package/templates/adapters/opencode.mjs +65 -0
  32. package/templates/config.json +39 -0
  33. package/templates/instructions.md +13 -0
  34. package/templates/launcher/bridge.cjs +295 -0
  35. package/templates/launcher/hook.cmd +15 -0
  36. package/templates/launcher/hook.ps1 +10 -0
  37. package/templates/launcher/hook.sh +20 -0
  38. package/templates/skills/cf-check.md +19 -0
  39. package/templates/skills/cf-init.md +16 -0
  40. package/templates/skills/cf-spec.md +20 -0
  41. package/templates/skills/cf-task-align.md +19 -0
  42. package/templates/skills/cf-task-archive.md +20 -0
  43. package/templates/skills/cf-task-plan.md +31 -0
  44. package/templates/skills/cf-task-prd.md +14 -0
  45. package/templates/skills/cf-task-start.md +41 -0
  46. package/{src/core/code-flow/specs/shared/design → templates/workflow}/design-frontend.md +22 -19
  47. package/{src/core/code-flow/specs/shared/design → templates/workflow}/design-full.md +36 -28
  48. package/{src/core/code-flow/specs/shared/design → templates/workflow}/design-lite.md +27 -17
  49. package/{src/core/code-flow/specs/shared/prd-template.md → templates/workflow/prd.md} +1 -1
  50. package/templates/workflow/project-guidelines.md +48 -0
  51. package/templates/workflow/scenarios.md +67 -0
  52. package/templates/workflow/task.md +56 -0
  53. package/docs/migrations/spec-workflow-0.6.0.md +0 -42
  54. package/src/adapters/claude/CLAUDE.md +0 -45
  55. package/src/adapters/claude/commands/cf-init.md +0 -264
  56. package/src/adapters/claude/commands/cf-learn.md +0 -291
  57. package/src/adapters/claude/commands/cf-spec.md +0 -67
  58. package/src/adapters/claude/commands/cf-stats.md +0 -86
  59. package/src/adapters/claude/commands/cf-sync.md +0 -25
  60. package/src/adapters/claude/commands/cf-task/align.md +0 -309
  61. package/src/adapters/claude/commands/cf-task/archive.md +0 -161
  62. package/src/adapters/claude/commands/cf-task/block.md +0 -36
  63. package/src/adapters/claude/commands/cf-task/graph.md +0 -80
  64. package/src/adapters/claude/commands/cf-task/note.md +0 -236
  65. package/src/adapters/claude/commands/cf-task/plan.md +0 -363
  66. package/src/adapters/claude/commands/cf-task/prd.md +0 -162
  67. package/src/adapters/claude/commands/cf-task/start.md +0 -304
  68. package/src/adapters/claude/commands/cf-task/status.md +0 -59
  69. package/src/adapters/claude/commands/cf-task/verify-e2e.md +0 -115
  70. package/src/adapters/claude/commands/cf-validate.md +0 -75
  71. package/src/adapters/claude/settings.local.json +0 -50
  72. package/src/adapters/codex/AGENTS.md +0 -45
  73. package/src/adapters/codex/config.toml +0 -3
  74. package/src/adapters/codex/hooks.json +0 -50
  75. package/src/adapters/codex/skills/cf-init/SKILL.md +0 -273
  76. package/src/adapters/codex/skills/cf-learn/SKILL.md +0 -296
  77. package/src/adapters/codex/skills/cf-spec/SKILL.md +0 -60
  78. package/src/adapters/codex/skills/cf-stats/SKILL.md +0 -87
  79. package/src/adapters/codex/skills/cf-sync/SKILL.md +0 -30
  80. package/src/adapters/codex/skills/cf-task-align/SKILL.md +0 -310
  81. package/src/adapters/codex/skills/cf-task-archive/SKILL.md +0 -162
  82. package/src/adapters/codex/skills/cf-task-block/SKILL.md +0 -37
  83. package/src/adapters/codex/skills/cf-task-graph/SKILL.md +0 -81
  84. package/src/adapters/codex/skills/cf-task-note/SKILL.md +0 -233
  85. package/src/adapters/codex/skills/cf-task-plan/SKILL.md +0 -324
  86. package/src/adapters/codex/skills/cf-task-prd/SKILL.md +0 -163
  87. package/src/adapters/codex/skills/cf-task-start/SKILL.md +0 -305
  88. package/src/adapters/codex/skills/cf-task-status/SKILL.md +0 -60
  89. package/src/adapters/codex/skills/cf-task-verify-e2e/SKILL.md +0 -111
  90. package/src/adapters/codex/skills/cf-validate/SKILL.md +0 -76
  91. package/src/adapters/costrict/CLAUDE.md +0 -45
  92. package/src/adapters/costrict/commands/cf-init.md +0 -264
  93. package/src/adapters/costrict/commands/cf-learn.md +0 -291
  94. package/src/adapters/costrict/commands/cf-spec.md +0 -67
  95. package/src/adapters/costrict/commands/cf-stats.md +0 -86
  96. package/src/adapters/costrict/commands/cf-sync.md +0 -25
  97. package/src/adapters/costrict/commands/cf-task/align.md +0 -309
  98. package/src/adapters/costrict/commands/cf-task/archive.md +0 -161
  99. package/src/adapters/costrict/commands/cf-task/block.md +0 -36
  100. package/src/adapters/costrict/commands/cf-task/graph.md +0 -80
  101. package/src/adapters/costrict/commands/cf-task/note.md +0 -236
  102. package/src/adapters/costrict/commands/cf-task/plan.md +0 -363
  103. package/src/adapters/costrict/commands/cf-task/prd.md +0 -162
  104. package/src/adapters/costrict/commands/cf-task/start.md +0 -304
  105. package/src/adapters/costrict/commands/cf-task/status.md +0 -59
  106. package/src/adapters/costrict/commands/cf-task/verify-e2e.md +0 -115
  107. package/src/adapters/costrict/commands/cf-validate.md +0 -75
  108. package/src/adapters/costrict/settings.local.json +0 -50
  109. package/src/adapters/opencode/AGENTS.md +0 -45
  110. package/src/adapters/opencode/commands/cf-init.md +0 -281
  111. package/src/adapters/opencode/commands/cf-learn.md +0 -295
  112. package/src/adapters/opencode/commands/cf-spec.md +0 -59
  113. package/src/adapters/opencode/commands/cf-stats.md +0 -90
  114. package/src/adapters/opencode/commands/cf-sync.md +0 -29
  115. package/src/adapters/opencode/commands/cf-task/align.md +0 -314
  116. package/src/adapters/opencode/commands/cf-task/archive.md +0 -166
  117. package/src/adapters/opencode/commands/cf-task/block.md +0 -40
  118. package/src/adapters/opencode/commands/cf-task/graph.md +0 -84
  119. package/src/adapters/opencode/commands/cf-task/note.md +0 -240
  120. package/src/adapters/opencode/commands/cf-task/plan.md +0 -363
  121. package/src/adapters/opencode/commands/cf-task/prd.md +0 -167
  122. package/src/adapters/opencode/commands/cf-task/start.md +0 -309
  123. package/src/adapters/opencode/commands/cf-task/status.md +0 -63
  124. package/src/adapters/opencode/commands/cf-task/verify-e2e.md +0 -115
  125. package/src/adapters/opencode/commands/cf-validate.md +0 -79
  126. package/src/adapters/opencode/opencode.json +0 -3
  127. package/src/adapters/opencode/plugins/code-flow/index.js +0 -213
  128. package/src/adapters/opencode/plugins/code-flow/package.json +0 -6
  129. package/src/cli.js +0 -1023
  130. package/src/core/code-flow/config.yml +0 -158
  131. package/src/core/code-flow/scripts/cf_acceptance_evidence.py +0 -100
  132. package/src/core/code-flow/scripts/cf_acceptance_manifest.py +0 -294
  133. package/src/core/code-flow/scripts/cf_acceptance_runner.py +0 -192
  134. package/src/core/code-flow/scripts/cf_acceptance_schema.py +0 -83
  135. package/src/core/code-flow/scripts/cf_checks.py +0 -336
  136. package/src/core/code-flow/scripts/cf_core.py +0 -787
  137. package/src/core/code-flow/scripts/cf_exec_base.py +0 -112
  138. package/src/core/code-flow/scripts/cf_feedback.py +0 -56
  139. package/src/core/code-flow/scripts/cf_log.py +0 -154
  140. package/src/core/code-flow/scripts/cf_post_hook.py +0 -196
  141. package/src/core/code-flow/scripts/cf_pre_tool_hook.py +0 -104
  142. package/src/core/code-flow/scripts/cf_scan.py +0 -295
  143. package/src/core/code-flow/scripts/cf_session_state.py +0 -37
  144. package/src/core/code-flow/scripts/cf_spec_context.py +0 -1746
  145. package/src/core/code-flow/scripts/cf_spec_gate.py +0 -264
  146. package/src/core/code-flow/scripts/cf_spec_metadata.py +0 -384
  147. package/src/core/code-flow/scripts/cf_spec_migrate.py +0 -512
  148. package/src/core/code-flow/scripts/cf_spec_resolver.py +0 -347
  149. package/src/core/code-flow/scripts/cf_spec_router.py +0 -244
  150. package/src/core/code-flow/scripts/cf_spec_session.py +0 -119
  151. package/src/core/code-flow/scripts/cf_spec_verify.py +0 -559
  152. package/src/core/code-flow/scripts/cf_stats.py +0 -506
  153. package/src/core/code-flow/scripts/cf_stop_hook.py +0 -381
  154. package/src/core/code-flow/scripts/cf_sync.py +0 -140
  155. package/src/core/code-flow/scripts/cf_task_index.py +0 -148
  156. package/src/core/code-flow/scripts/cf_task_parallel.py +0 -394
  157. package/src/core/code-flow/scripts/cf_task_runtime.py +0 -304
  158. package/src/core/code-flow/scripts/cf_task_state.py +0 -3
  159. package/src/core/code-flow/scripts/cf_task_workflow.py +0 -205
  160. package/src/core/code-flow/scripts/cf_user_prompt_hook.py +0 -178
  161. package/src/core/code-flow/scripts/cf_validation.py +0 -81
  162. package/src/core/code-flow/scripts/cf_workflow_service.py +0 -366
  163. package/src/core/code-flow/scripts/cf_workflow_transaction.py +0 -96
  164. package/src/core/code-flow/specs/backend/_map.md +0 -56
  165. package/src/core/code-flow/specs/backend/code-quality-performance.md +0 -59
  166. package/src/core/code-flow/specs/backend/database.md +0 -51
  167. package/src/core/code-flow/specs/backend/directory-structure.md +0 -54
  168. package/src/core/code-flow/specs/backend/logging.md +0 -50
  169. package/src/core/code-flow/specs/backend/platform-rules.md +0 -55
  170. package/src/core/code-flow/specs/frontend/_map.md +0 -52
  171. package/src/core/code-flow/specs/frontend/component-specs.md +0 -68
  172. package/src/core/code-flow/specs/frontend/directory-structure.md +0 -53
  173. package/src/core/code-flow/specs/frontend/quality-standards.md +0 -58
  174. package/src/core/code-flow/specs/shared/_map.md +0 -57
  175. package/src/core/code-flow/tasks/.gitkeep +0 -0
  176. package/src/core/code-flow/validation.yml +0 -53
  177. package/src/migrate/spec-workflow.js +0 -238
package/README.md CHANGED
@@ -1,157 +1,122 @@
1
1
  # code-flow
2
2
 
3
- 一个用于快速初始化与管理项目规范的命令行工具。通过全局安装后执行 `code-flow init`,自动生成项目约定文件与目录结构,帮助团队统一流程并提升协作效率。
3
+ v1 是零依赖的全局 Node.js CLI,为 AI 编码工具提供两件事:按当前任务注入最新规范,以及把已完成任务的稳定约束沉淀为 Spec。默认 `hook` 工作流只要求最小 task 文档和声明测试;`full` 文档流程和过程采集按需开启。
4
4
 
5
- ## 安装
5
+ 需要 Node.js 18 或更高版本。支持 Claude Code、Codex、Costrict 与 OpenCode;不需要 Python,不在项目中复制核心脚本。
6
6
 
7
- npm:
7
+ ## 安装与初始化
8
8
 
9
9
  ```bash
10
10
  npm i -g @michaelxwb/code-flow
11
+ code-flow init --platform=codex
11
12
  ```
12
13
 
13
- pnpm:
14
-
15
- ```bash
16
- pnpm add -g @michaelxwb/code-flow
17
- ```
18
-
19
- ## 升级
14
+ 平台可选 claude、codex、costrict、opencode。Codex 按宿主要求审阅并信任新的 Hook。所有项目共享当前全局版本;更新 Node 或全局安装路径后,重新 init。
20
15
 
21
- npm:
16
+ init 会安装 `.code-flow/templates/project-guidelines.md` 作为项目规范 starter;`cf-init` 会据此把项目特有规范写到 `CLAUDE.md`/`AGENTS.md` 的托管块之外,并把 `.code-flow/specs` 明确为规范来源。
22
17
 
23
- ```bash
24
- npm i -g @michaelxwb/code-flow@latest
25
- ```
18
+ 旧版本需要人工保存资料、清除旧平台入口后重新初始化;v1 不包含迁移、转换或自动删除逻辑。详见[使用说明](docs/USAGE.md)。
26
19
 
27
- pnpm:
20
+ ## 规范与任务
28
21
 
29
- ```bash
30
- pnpm add -g @michaelxwb/code-flow@latest
22
+ ```text
23
+ .code-flow/
24
+ config.json
25
+ specs/shared/base.md
26
+ specs/cli/runtime.md
27
+ tasks/2026-11-10/example/example.md
28
+ process/ # capture 开启时的过程事件与采集包(gitignored)
31
29
  ```
32
30
 
33
- ## 卸载
31
+ Spec 身份就是相对路径,例如 cli/runtime;JSON frontmatter 包含 description 与 next_rule。完整规则引用为 cli/runtime#RULE-001。
34
32
 
35
- npm:
33
+ 一个需求一份任务文档,内部包含多个 `## TASK-NNN` 段。默认 `workflow: hook` 只需要 `example.md`;`workflow: full` 额外生成 PRD/前后端 design/scenarios:
36
34
 
37
- ```bash
38
- npm rm -g @michaelxwb/code-flow
35
+ ```text
36
+ tasks/2026-11-10/example/
37
+ example.md
38
+ # workflow=full:
39
+ # example.prd.md
40
+ # example.frontend.design.md
41
+ # example.backend.design.md
42
+ # example.scenarios.md
39
43
  ```
40
44
 
41
- pnpm:
45
+ 任务文档的 TASK 段声明 status、source、scenarios、spec_refs 和 tests(hook 下 source/scenarios 可留空):
42
46
 
43
- ```bash
44
- pnpm remove -g @michaelxwb/code-flow
45
- ```
47
+ ````markdown
48
+ ## TASK-001: Implement behavior
46
49
 
47
- ## 基本用法
50
+ - **Status**: draft
51
+ - **Depends**:
52
+ - **Source**:
53
+ - **Scenarios**:
54
+ - **Spec-Refs**: cli/runtime
48
55
 
49
- 初始化(默认 `--platform=claude`):
56
+ ### Tests
50
57
 
51
- ```bash
52
- code-flow init
53
- code-flow init --platform=codex
54
- code-flow init --platform=costrict
55
- code-flow init --platform=opencode
56
- code-flow init --force # 覆盖所有文件,包括用户已编辑内容
58
+ ```json
59
+ [
60
+ { "id": "unit", "argv": ["node", "--test", "test/hook.test.js"] }
61
+ ]
57
62
  ```
58
63
 
59
- 查看帮助:
60
-
61
- ```bash
62
- code-flow --help
63
- ```
64
+ ### Checklist
64
65
 
65
- ## 质量闭环(v0.5)
66
+ - [ ] 实现相关行为并验证回归。
67
+ ````
66
68
 
67
- 零配置开箱即用,安装后自动获得两个闭环:
69
+ `Source`/`Scenarios` 在 hook 工作流可留空;full 工作流填 design/scenarios 引用。
68
70
 
69
- **合规反馈**:spec 约束可在 frontmatter 标注机检规则,AI 编辑文件后自动检查,违规当场反馈给 AI 修正(只提示、不阻断):
71
+ 完整示例见[使用说明](docs/USAGE.md)。
70
72
 
71
- ```yaml
72
- ---
73
- description: 改 Python 脚本时适用
74
- checks:
75
- - id: no-print-debug
76
- type: regex
77
- pattern: '^\s*print\('
78
- files: "**/*.py"
79
- message: 禁止 print() 调试,用日志到 stderr
80
- ---
73
+ ```bash
74
+ code-flow task start .code-flow/tasks/2026-11-10/example/example.md --task TASK-001
75
+ code-flow task finish .code-flow/tasks/2026-11-10/example/example.md --task TASK-001 --json
76
+ code-flow task archive .code-flow/tasks/2026-11-10/example --dry-run
77
+ code-flow task archive .code-flow/tasks/2026-11-10/example
81
78
  ```
82
79
 
83
- **学习沉淀**:你在对话中纠正 AI 的行为("不要用 print 调试")会被记录,`/cf-learn` 将同类纠正聚合为候选规范(附 ✅/❌ 对照与机检草稿),由你确认后落盘——纠正一次,不用说第二遍。
84
-
85
- **误报治理**:反馈出现误报时直接告诉 AI"这是误报"即可,同一规则误报 3 次或误报率超 10% 自动停用;`cf-stats` 可查违规榜/修正率/误报率,`cf-stats --audit` 输出僵尸规范复审清单。
80
+ cf-task skill 把 prompt Hook 给出的 session token 传给 start --session,之后按会话自动续选任务。用户也可用独立行 `task: <任务文档>#TASK-001` 选择本轮任务。绑定缺失时按明确文件路径映射或显示 catalog,不猜测唯一 in-progress。
86
81
 
87
- **一键回退**:`config.yml` 中 `quality_loop.enabled: false` 完整回到 v0.5 行为。
82
+ Hook 只在用户提交 prompt 时读取并交付上下文。没有编辑/Stop 门禁;规范修改后下次适用注入读取最新内容。finish 实际执行本任务声明测试;archive 仅应用 Delta 并移动需求目录,CI 独立承担全量与 E2E。
88
83
 
89
- > **数据声明**:质量闭环产生的所有数据(违规事件、纠正语句摘录、统计计数)仅存储在项目本地 `.code-flow/` 目录(`.session-log.jsonl` / `.check-state.json`,已加入 .gitignore),不上传、不外发、30 天滚动清理。纠正采集可经 `quality_loop.correction_capture: false` 单独关闭。
84
+ 批次 worktree 从包含 specs/当前需求/config 的 baseline 创建;业务代码 dirty 时拒绝。worker 默认使用全局 CLI,prepare 不再自动 init;只有需要 worker 内宿主会话时才用 `--init`。随后校验 specs 快照并自动合并。
90
85
 
91
- ## 支持的 AI 工具
86
+ ## 工作流与过程数据
92
87
 
93
- | 工具 | `--platform` | 状态 |
94
- |------|-------------|------|
95
- | [Claude Code](https://claude.ai/code) | `claude` | ✅ 完整支持 |
96
- | [Codex CLI](https://github.com/openai/codex) | `codex` | ✅ 完整支持 |
97
- | [Costrict](https://costrict.com) | `costrict` | ✅ 完整支持 |
98
- | [OpenCode](https://opencode.ai) | `opencode` | ✅ 完整支持 |
88
+ `config.json` 的关键字段:
99
89
 
100
- ## 生成的目录与文件
90
+ ```json
91
+ {
92
+ "version": 1,
93
+ "workflow": "hook",
94
+ "capture": { "enabled": false, "path": ".code-flow/process" }
95
+ }
96
+ ```
101
97
 
102
- 运行 `code-flow init` 后,将在项目根目录生成(或更新)以下结构:
98
+ - `workflow`: `hook`(默认)要求 task 文档和声明测试;`full` 启用 PRD/design/scenarios。设计文档是项目资产,不作为 prompt 输入;只有 Spec 会注入。
99
+ - `capture`: 开启后 CLI/Hook 自动写入 `.code-flow/process/events.jsonl`。验证结束用跨平台命令采集:
103
100
 
104
- ```
105
- .code-flow/ # 规范核心(共用)
106
- scripts/ # Python Hook 脚本(三端共用)
107
- specs/<domain>/ # 领域 spec(_map.md + 约束规则)
108
-
109
- # Claude Code (--platform=claude)
110
- .claude/commands/ # 命令模板
111
- .claude/settings.local.json # Hook 注册(PreToolUse + UserPromptSubmit)
112
- CLAUDE.md # 全局指令
113
-
114
- # Codex CLI (--platform=codex)
115
- .codex/hooks.json # Hook 注册(SessionStart + UserPromptSubmit)
116
- .codex/config.toml # Codex 配置
117
- .agents/skills/<skill>/SKILL.md # 项目级 Skills
118
- AGENTS.md # 全局指令
119
-
120
- # Costrict (--platform=costrict)
121
- .costrict/commands/ # 命令模板
122
- .costrict/settings.local.json # Hook 注册
123
- CLAUDE.md # 与 Claude 共用全局指令
124
-
125
- # OpenCode (--platform=opencode)
126
- .opencode/commands/ # 命令模板(含 cf-task/)
127
- .opencode/plugins/code-flow/ # v2 插件:session.prompt 转发到 cf_user_prompt_hook.py
128
- opencode.json # OpenCode 配置(`.opencode/plugins/` 自动发现,无需注册键)
129
- AGENTS.md # 全局指令
101
+ ```bash
102
+ code-flow process collect --out <dir> [--transcript <host-session.jsonl>]
130
103
  ```
131
104
 
132
- ## 依赖说明
105
+ 输出目录包含事件、任务/规范快照、状态、git 信息和可选 transcript;手动压缩传递。
133
106
 
134
- - 需要 `python3` 版本 3.9 及以上
135
- - 需要安装 `pyyaml`(`cf_init` 会尝试自动安装,失败会提示手动处理)
136
- - 运行测试需要 `pytest`
107
+ ## 大测试集
137
108
 
138
- ### 运行测试
109
+ 把相关测试文件合成一次框架调用,使用框架自己的 workers。不同命令确认独立后设置 parallel:true;用 group 串行共享数据库、端口或 fixture,--jobs 限制 CLI 并发。相同调用内完全相同命令只执行一次,不跨次缓存结果。
110
+
111
+ ## 开发
139
112
 
140
113
  ```bash
141
- python3 -m pip install pyyaml pytest
142
- python3 -m pytest -q tests
114
+ code-flow doctor --json
115
+ npm test
116
+ npm run test:performance
117
+ npm pack --ignore-scripts
143
118
  ```
144
119
 
145
- ## 常见问题
146
-
147
- - EOTP(`--otp`)
148
- - 原因:启用了 npm/pnpm 的一次性密码或 2FA。
149
- - 处理:按提示输入 OTP,或使用 `--otp` 重新执行安装命令。
150
-
151
- - E402(`--access=public`)
152
- - 原因:发布/安装时访问级别不匹配或权限不足。
153
- - 处理:必要时使用 `--access=public` 重新发布或检查权限配置。
120
+ 运行源码使用 node bin/code-flow.js。测试覆盖真实子进程、全局包安装、worktree、平台原生协议和多文件失败重试。
154
121
 
155
- - name 冲突
156
- - 原因:本地或全局已有同名命令/包。
157
- - 处理:先卸载冲突包或更换名称后再安装。
122
+ [文档索引](docs/README.md) · [设计](docs/v1-design.md) · [验收覆盖](docs/v1-implementation.md) · [使用说明](docs/USAGE.md)
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env node
2
+ 'use strict';
3
+ process.stdout.on('error', error => {
4
+ if (error.code !== 'EPIPE') process.stderr.write('code-flow stdout: ' + error.message + '\n');
5
+ process.exitCode = process.argv[2] === 'hook' ? 0 : 1;
6
+ });
7
+ require('../lib/cli').main(process.argv.slice(2)).then(code => {
8
+ process.exitCode = code;
9
+ }).catch(error => {
10
+ process.stderr.write('code-flow: ' + error.message + '\n');
11
+ process.exitCode = process.argv[2] === 'hook' ? 0 : 1;
12
+ });
package/docs/README.md ADDED
@@ -0,0 +1,19 @@
1
+ # 文档索引
2
+
3
+ 当前只保留 v1 有效文档:
4
+
5
+ | 文档 | 用途 |
6
+ |---|---|
7
+ | [USAGE.md](USAGE.md) | 安装、Spec、Task、测试、worktree、诊断和旧版切换 |
8
+ | [v1-design.md](v1-design.md) | v1 架构、数据格式、Hook、任务生命周期和验收契约 |
9
+ | [v1-implementation.md](v1-implementation.md) | 实现范围、测试矩阵、CI 和已知限制 |
10
+
11
+ 以下历史资料不再维护,可从 Git 标签 `v0.8.1`(提交 `eb0e4c0`)查看:
12
+
13
+ - 旧 Python 运行时与 `src/` 设计;
14
+ - 旧 Spec Context、acceptance manifest、evidence、scenario/design gate 文档;
15
+ - 0.6–0.9 迁移说明、0.8 计划和发布说明;
16
+ - 旧 verification-efficiency 原始测量数据;
17
+ - 旧 worktree-parallel 设计。
18
+
19
+ 当前工作树只使用 `.code-flow/config.json`、`.code-flow/specs/`、`.code-flow/tasks/` 和 `.code-flow/templates/`。v1 不读取、不转换、不自动清理旧文档。
package/docs/USAGE.md ADDED
@@ -0,0 +1,268 @@
1
+ # code-flow v1 使用说明
2
+
3
+ 本文描述 v1 用法;实现状态见 [实施记录](v1-implementation.md),完整契约见 [设计](v1-design.md)。
4
+
5
+ ## 1. 全局安装
6
+
7
+ ```bash
8
+ npm i -g @michaelxwb/code-flow
9
+ code-flow init --platform=claude
10
+ code-flow init --platform=codex
11
+ code-flow init --platform=all
12
+ ```
13
+
14
+ 每个使用的平台安装一次。之后 code-flow init 更新当前项目全部已安装的 v1 平台。init --dry-run 只展示变更;不写目录、绑定或锁。
15
+
16
+ init 还会安装 `.code-flow/templates/project-guidelines.md` 作为项目规范 starter。`cf-init` 会据此把项目特有规范写到 `CLAUDE.md` / `AGENTS.md` 的 code-flow 托管块之外,并把 `.code-flow/specs` 明确为规范事实源。受管 skill/插件被用户修改或 Codex 配置无法解析时,init 跳过该文件并在 `conflicts` 中报告,其他文件照常写入;解决后重跑。
17
+
18
+ Hook 通过项目 bridge 校验 PATH 全局包与协议后优先使用,回退初始化时的固定 Node/JS。项目本地 bin 不参与选择;错误降级且不阻断。两种入口均失效时重新 init,doctor 给出诊断;宿主加载与信任需在宿主中确认。
19
+
20
+ Codex 的 `features.hooks` 只自动维护规范 `[features]` 表和根级单行 `features.hooks`;引号键、引号形式的 features 表、inline table、数组表或多行值会在 init 时返回 `config_format`,需手工改成规范形式。
21
+
22
+ Windows 支持 CMD、PowerShell 和 Git Bash:CMD 使用 `hook.cmd`,PowerShell 使用 `hook.ps1`(委托已验证的 CMD 入口),Git Bash 可运行 `hook.sh` 或直接调用 `code-flow` CLI。三种入口均由 Windows CI 覆盖。
23
+
24
+ ## 2. 创建 Spec
25
+
26
+ 文件 .code-flow/specs/cli/runtime.md:
27
+
28
+ ````markdown
29
+ ---
30
+ {"description":"CLI 运行时规则","next_rule":2}
31
+ ---
32
+ # Runtime
33
+
34
+ ## Rules
35
+
36
+ - [RULE-001] Hook stdout 只输出协议 JSON。
37
+ 诊断输出到 stderr,保留完整多行说明和代码示例。
38
+ ````
39
+
40
+ 身份是 cli/runtime。新增规则从 next_rule 分配数字 ID;手动编辑时也要维护计数,删除编号不能复用。允许 RULE-cli-json-001 这样的语义 ID。
41
+
42
+ config.json:
43
+
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
+ }
54
+ ```
55
+
56
+ always 适合少量共享基础规则;领域规范通常放在 Task 的 spec_refs。支持 *、**、?;** 可匹配零层目录,路径严格区分大小写。
57
+
58
+ ```bash
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
62
+ ```
63
+
64
+ Spec 级引用接收后续新增规则;#Rule 引用只选择一条规则。预算按完整规则块裁剪,omitted 显示未发送的引用和完整读取方式。catalog 只读头信息,规则数由 spec list 读取完整正文统计。
65
+
66
+ ## 3. 创建与选择 Task
67
+
68
+ 一个需求一份任务文档 `.code-flow/tasks/2026-11-10/example/example.md`,内部包含多个 `## TASK-NNN` 段。设计文档前后端分开:
69
+
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
77
+ ```
78
+
79
+ 任务文档示例:
80
+
81
+ ````markdown
82
+ ---
83
+ {"version":1,"requirement":"example"}
84
+ ---
85
+ # Tasks: example
86
+
87
+ ## TASK-001: Implement behavior
88
+
89
+ - **Status**: draft
90
+ - **Depends**:
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
96
+
97
+ ### Tests
98
+
99
+ ```json
100
+ [
101
+ {
102
+ "id": "unit",
103
+ "argv": ["node", "--test", "test/hook.test.js"],
104
+ "parallel": true
105
+ }
106
+ ]
107
+ ```
108
+
109
+ ### Checklist
110
+
111
+ - [ ] 实现相关行为并验证回归。
112
+
113
+ ### Spec Delta
114
+
115
+ ```json
116
+ []
117
+ ```
118
+ ````
119
+
120
+ TASK ID 必须与标题 `## TASK-NNN:` 一致,并在文档内唯一;裸 TASK-001 不是跨需求定位键。prompt 的独立行可以指定本轮任务:
121
+
122
+ ```text
123
+ task: .code-flow/tasks/2026-11-10/example/example.md#TASK-001
124
+ ```
125
+
126
+ cf-task skill 使用 Hook 上下文中的 session token:
127
+
128
+ ```bash
129
+ code-flow task start .code-flow/tasks/2026-11-10/example/example.md --task TASK-001 --session <token>
130
+ ```
131
+
132
+ token 由工作区、平台和原生会话 ID 产生。绑定仅在系统临时目录,不保存规范快照或测试事实。不同会话/worktree 互不影响。未获得 token 时省略参数,读取 start 打印的规范 brief。
133
+
134
+ 重复 start 一个 in-progress Task 是幂等的。done/blocked/归档后绑定失效,后续不自动改选另一个任务。
135
+
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
142
+ ```
143
+
144
+ ## 4. 测试与完成
145
+
146
+ ```bash
147
+ code-flow task finish <task-file> --task TASK-001 --jobs 2 --json
148
+ ```
149
+
150
+ finish 只接受 in-progress,实际执行该 TASK 的 tests,全部通过才原子写入 done。失败、超时和中断保持进行中,回收整个进程树;测试期间 Task 有并发编辑则不覆盖。
151
+
152
+ 不提供独立 task verify 入口;日常完成直接 finish,避免重复执行。E2E 和全量回归由 CI 执行,`e2e` 字段只作声明。
153
+
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`。
161
+
162
+ PASS 表示此次声明命令成功,不代表之后修改或全量需求已经通过。
163
+
164
+ Verification 摘要同时记录测试声明哈希、测试时的 HEAD 和工作区状态:`tests=` 来自 start 时的声明,声明在 start 后被修改会标记 `tests-changed`;`head=none` 表示非 Git 项目,`dirty=1` 表示测试跑在未提交的业务改动上(`.code-flow` 文档改动不计入)。这些字段只用于追溯,不改变 PASS/FAIL 语义。
165
+
166
+ ## 5. 沉淀与归档
167
+
168
+ done Task 的 `### Spec Delta` JSON 块直接使用数组:
169
+
170
+ ```json
171
+ [
172
+ {
173
+ "id": "DELTA-001",
174
+ "op": "add",
175
+ "target": "cli/runtime",
176
+ "rule": "测试失败必须保留进行中状态。",
177
+ "evidence": "失败测试不能成为完成依据。"
178
+ }
179
+ ]
180
+ ```
181
+
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>
187
+ ```
188
+
189
+ add 需要 rule/evidence;update 需要 ref/before/rule/evidence;remove 需要 ref/before/evidence。before 必须匹配旧规则完整正文,目标 Spec 必须存在。
190
+
191
+ Delta 身份由任务文档路径 + TASK ID + Delta ID 构成,已应用后不能修改 payload,修订需使用新 ID。Spec 的 Applied Deltas 使用 JSON 行记录来源、Rule、操作和 payload hash,保障中断后的重试;不要删除记录或回退 next_rule。
192
+
193
+ 多文件应用允许部分成功;失败时保留需求目录,重试跳过相同已应用项。在 Git 注册的协调工作区、关联 run 已完成且所有 Task done、增量应用成功后,才移动至 tasks/archived/<原日期>/<需求>。worker 中 archive/learn 均拒绝,不以目录名判断权限。目标存在时报错,不改名覆盖。
194
+
195
+ archive --no-learn 明确跳过沉淀。归档不会运行任何测试。
196
+
197
+ ## 6. 升级、worktree 与旧版切换
198
+
199
+ ```bash
200
+ npm i -g @michaelxwb/code-flow@<version>
201
+ code-flow init
202
+ ```
203
+
204
+ 所有项目共享全局版本。回滚兼容的 v1 包后重新 init;用户数据通过 git 撤销。
205
+
206
+ 批次 worktree 由内部 `task parallel prepare/collect/merge/cleanup` 编排,`cf-task:start` 负责驱动 worker:prepare 仅把 Specs、当前需求和 config 形成 baseline,范围外脏改动(含其他需求/无关暂存内容)拒绝。worker 校验快照;默认不执行 init(worker 直接使用全局 CLI),只有需要在 worker 内启动宿主会话时才用 `--init`。工具增量不提交或合并。
207
+
208
+ 每个 worker 只改业务代码和自己的 TASK 段。collect 核对完整 diff 与准确 SHA;任务文档按三方归属合并,同段冲突不会采用 done 优先。全部合入后在协调工作区聚合重跑本批相关测试,去重且不跑全量/E2E;配置了 tests.regression 时再追加一次项目回归,通过后才自动清理,失败保留资源。runner 每次重建 ledger 的隔离环境,默认最多 2 个 worker,并结合 jobs/框架 workers 设置资源预算。
209
+
210
+ run ledger 是唯一持久编排台账。中断后 status/doctor 只读给出实际状态,重新调用 prepare/merge/cleanup 才执行恢复;恢复核对 Git 提交与所有权,不凭目录存在继续。
211
+
212
+ 从旧版切换:
213
+
214
+ 1. 保存 git 基线与未跟踪资料。
215
+ 2. 处理旧 .code-flow 内真实 worktree,避免移动其父目录破坏路径。
216
+ 3. 手工移除各平台中旧 code-flow Hook、插件、命令和托管指令段,保留用户其他内容。
217
+ 4. 把旧数据保存到项目外,重新 init。
218
+ 5. 依据当前代码整理仍适用的 Spec,采用 JSON frontmatter/路径身份;重建活跃 Task 和测试声明。
219
+
220
+ init 不负责旧版清理或转换,不提供迁移脚本。
221
+
222
+ ## 7. CI 与诊断
223
+
224
+ 全量回归和 E2E 是独立 CI 命令。本仓库 CI 使用 `npm test`,在 Ubuntu/macOS/Windows 和 Node 18/22/24 上运行;外部项目按自己的 test:all / test:e2e 脚本执行,不让 task archive 隐式调用。
225
+
226
+ 只读诊断:
227
+
228
+ ```bash
229
+ code-flow doctor --json
230
+ ```
231
+
232
+ 检查 config、模板、Spec、Task 文档、平台入口、Codex config.toml 形式和 worktree ledger;不修改文件。
233
+
234
+ `code-flow doctor --json` 只读检查配置、引用、Hook、模板和 run;返回稳定诊断与修复建议,不执行用户 Hook/Tests。宿主加载/信任无法确认时标记 unknown,发现错误退出 1,只有警告或 unknown 退出 0,用法/诊断自身错误退出 2。
235
+
236
+ Hook 失败只向 stderr 输出诊断,不拒绝 prompt。普通 CLI 用法/数据错误退出 2,操作或测试失败退出 1;--json 输出结构化结果,中断保留平台退出状态。
237
+
238
+ 需要检查全量规则时使用 spec inject --full。没有 Context refresh、安装 manifest、集中 Evidence Store 或持久测试缓存。
239
+
240
+ ## 8. 过程数据(可选)
241
+
242
+ 在启动宿主前设置事件日志,之后所有 CLI/Hook 调用都会追加一行 JSON:
243
+
244
+ ```bash
245
+ export CF_EVENT_LOG="$PWD/.code-flow-logs/events.jsonl"
246
+ ```
247
+
248
+ 事件包含 `command`、`args`、`cwd`、`exit`、`ms`、stdout/stderr 字节数和精简结果(finish 的测试 id/状态/耗时、start/inject 的 emitted/omitted、learn 的 Delta 结果、task status 计数)。它不记录规则正文、源码或测试输出,不改变 Hook stdout 协议和退出码。
249
+
250
+ 也可以在 `.code-flow/config.json` 开启自动采集:
251
+
252
+ ```json
253
+ {
254
+ "capture": { "enabled": true, "path": ".code-flow/process" }
255
+ }
256
+ ```
257
+
258
+ 验证结束后,用跨平台 Node 命令采集(不需要 shell 脚本):
259
+
260
+ ```bash
261
+ code-flow process collect --out <output-dir> [--transcript <host-session.jsonl>]
262
+ ```
263
+
264
+ 输出一个目录,包含事件日志、`task status`/`doctor`/`spec list`、Specs/Tasks 快照、config、文件哈希、git 状态/日志/diff 摘要,以及可选的宿主会话 transcript;手动压缩该目录传递。
265
+
266
+ 隐私:数据包可能包含项目路径、需求文本和对话内容;分享前请审阅。事件日志本身不包含规则正文或源码。
267
+
268
+ 分析重点:命令与阶段耗时、finish 重试、blocked 状态、注入/省略的规则与字节数、spec learn/archive 结果、Task 状态,以及 PRD/design/scenarios 是否把隐含约束写清楚。