@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.
- package/README.md +75 -110
- package/bin/code-flow.js +12 -0
- package/docs/README.md +19 -0
- package/docs/USAGE.md +268 -0
- 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 +21 -9
- 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 +22 -19
- package/{src/core/code-flow/specs/shared/design → templates/workflow}/design-full.md +36 -28
- package/{src/core/code-flow/specs/shared/design → templates/workflow}/design-lite.md +27 -17
- 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/migrations/spec-workflow-0.6.0.md +0 -42
- package/src/adapters/claude/CLAUDE.md +0 -45
- package/src/adapters/claude/commands/cf-init.md +0 -264
- package/src/adapters/claude/commands/cf-learn.md +0 -291
- package/src/adapters/claude/commands/cf-spec.md +0 -67
- package/src/adapters/claude/commands/cf-stats.md +0 -86
- package/src/adapters/claude/commands/cf-sync.md +0 -25
- package/src/adapters/claude/commands/cf-task/align.md +0 -309
- package/src/adapters/claude/commands/cf-task/archive.md +0 -161
- package/src/adapters/claude/commands/cf-task/block.md +0 -36
- package/src/adapters/claude/commands/cf-task/graph.md +0 -80
- package/src/adapters/claude/commands/cf-task/note.md +0 -236
- package/src/adapters/claude/commands/cf-task/plan.md +0 -363
- package/src/adapters/claude/commands/cf-task/prd.md +0 -162
- package/src/adapters/claude/commands/cf-task/start.md +0 -304
- package/src/adapters/claude/commands/cf-task/status.md +0 -59
- package/src/adapters/claude/commands/cf-task/verify-e2e.md +0 -115
- package/src/adapters/claude/commands/cf-validate.md +0 -75
- 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 -50
- 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 -60
- package/src/adapters/codex/skills/cf-stats/SKILL.md +0 -87
- package/src/adapters/codex/skills/cf-sync/SKILL.md +0 -30
- package/src/adapters/codex/skills/cf-task-align/SKILL.md +0 -310
- package/src/adapters/codex/skills/cf-task-archive/SKILL.md +0 -162
- package/src/adapters/codex/skills/cf-task-block/SKILL.md +0 -37
- package/src/adapters/codex/skills/cf-task-graph/SKILL.md +0 -81
- package/src/adapters/codex/skills/cf-task-note/SKILL.md +0 -233
- package/src/adapters/codex/skills/cf-task-plan/SKILL.md +0 -324
- package/src/adapters/codex/skills/cf-task-prd/SKILL.md +0 -163
- package/src/adapters/codex/skills/cf-task-start/SKILL.md +0 -305
- package/src/adapters/codex/skills/cf-task-status/SKILL.md +0 -60
- package/src/adapters/codex/skills/cf-task-verify-e2e/SKILL.md +0 -111
- package/src/adapters/codex/skills/cf-validate/SKILL.md +0 -76
- package/src/adapters/costrict/CLAUDE.md +0 -45
- package/src/adapters/costrict/commands/cf-init.md +0 -264
- package/src/adapters/costrict/commands/cf-learn.md +0 -291
- package/src/adapters/costrict/commands/cf-spec.md +0 -67
- package/src/adapters/costrict/commands/cf-stats.md +0 -86
- package/src/adapters/costrict/commands/cf-sync.md +0 -25
- package/src/adapters/costrict/commands/cf-task/align.md +0 -309
- package/src/adapters/costrict/commands/cf-task/archive.md +0 -161
- package/src/adapters/costrict/commands/cf-task/block.md +0 -36
- package/src/adapters/costrict/commands/cf-task/graph.md +0 -80
- package/src/adapters/costrict/commands/cf-task/note.md +0 -236
- package/src/adapters/costrict/commands/cf-task/plan.md +0 -363
- package/src/adapters/costrict/commands/cf-task/prd.md +0 -162
- package/src/adapters/costrict/commands/cf-task/start.md +0 -304
- package/src/adapters/costrict/commands/cf-task/status.md +0 -59
- package/src/adapters/costrict/commands/cf-task/verify-e2e.md +0 -115
- package/src/adapters/costrict/commands/cf-validate.md +0 -75
- package/src/adapters/costrict/settings.local.json +0 -50
- 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 -59
- package/src/adapters/opencode/commands/cf-stats.md +0 -90
- package/src/adapters/opencode/commands/cf-sync.md +0 -29
- package/src/adapters/opencode/commands/cf-task/align.md +0 -314
- package/src/adapters/opencode/commands/cf-task/archive.md +0 -166
- package/src/adapters/opencode/commands/cf-task/block.md +0 -40
- package/src/adapters/opencode/commands/cf-task/graph.md +0 -84
- package/src/adapters/opencode/commands/cf-task/note.md +0 -240
- package/src/adapters/opencode/commands/cf-task/plan.md +0 -363
- package/src/adapters/opencode/commands/cf-task/prd.md +0 -167
- package/src/adapters/opencode/commands/cf-task/start.md +0 -309
- package/src/adapters/opencode/commands/cf-task/status.md +0 -63
- package/src/adapters/opencode/commands/cf-task/verify-e2e.md +0 -115
- package/src/adapters/opencode/commands/cf-validate.md +0 -79
- package/src/adapters/opencode/opencode.json +0 -3
- package/src/adapters/opencode/plugins/code-flow/index.js +0 -213
- package/src/adapters/opencode/plugins/code-flow/package.json +0 -6
- package/src/cli.js +0 -1023
- package/src/core/code-flow/config.yml +0 -158
- package/src/core/code-flow/scripts/cf_acceptance_evidence.py +0 -100
- package/src/core/code-flow/scripts/cf_acceptance_manifest.py +0 -294
- package/src/core/code-flow/scripts/cf_acceptance_runner.py +0 -192
- package/src/core/code-flow/scripts/cf_acceptance_schema.py +0 -83
- package/src/core/code-flow/scripts/cf_checks.py +0 -336
- package/src/core/code-flow/scripts/cf_core.py +0 -787
- package/src/core/code-flow/scripts/cf_exec_base.py +0 -112
- package/src/core/code-flow/scripts/cf_feedback.py +0 -56
- package/src/core/code-flow/scripts/cf_log.py +0 -154
- package/src/core/code-flow/scripts/cf_post_hook.py +0 -196
- package/src/core/code-flow/scripts/cf_pre_tool_hook.py +0 -104
- package/src/core/code-flow/scripts/cf_scan.py +0 -295
- package/src/core/code-flow/scripts/cf_session_state.py +0 -37
- package/src/core/code-flow/scripts/cf_spec_context.py +0 -1746
- package/src/core/code-flow/scripts/cf_spec_gate.py +0 -264
- package/src/core/code-flow/scripts/cf_spec_metadata.py +0 -384
- package/src/core/code-flow/scripts/cf_spec_migrate.py +0 -512
- package/src/core/code-flow/scripts/cf_spec_resolver.py +0 -347
- package/src/core/code-flow/scripts/cf_spec_router.py +0 -244
- package/src/core/code-flow/scripts/cf_spec_session.py +0 -119
- package/src/core/code-flow/scripts/cf_spec_verify.py +0 -559
- package/src/core/code-flow/scripts/cf_stats.py +0 -506
- package/src/core/code-flow/scripts/cf_stop_hook.py +0 -381
- package/src/core/code-flow/scripts/cf_sync.py +0 -140
- package/src/core/code-flow/scripts/cf_task_index.py +0 -148
- package/src/core/code-flow/scripts/cf_task_parallel.py +0 -394
- package/src/core/code-flow/scripts/cf_task_runtime.py +0 -304
- package/src/core/code-flow/scripts/cf_task_state.py +0 -3
- package/src/core/code-flow/scripts/cf_task_workflow.py +0 -205
- package/src/core/code-flow/scripts/cf_user_prompt_hook.py +0 -178
- package/src/core/code-flow/scripts/cf_validation.py +0 -81
- package/src/core/code-flow/scripts/cf_workflow_service.py +0 -366
- package/src/core/code-flow/scripts/cf_workflow_transaction.py +0 -96
- 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/tasks/.gitkeep +0 -0
- package/src/core/code-flow/validation.yml +0 -53
- package/src/migrate/spec-workflow.js +0 -238
package/README.md
CHANGED
|
@@ -1,157 +1,122 @@
|
|
|
1
1
|
# code-flow
|
|
2
2
|
|
|
3
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
16
|
+
init 会安装 `.code-flow/templates/project-guidelines.md` 作为项目规范 starter;`cf-init` 会据此把项目特有规范写到 `CLAUDE.md`/`AGENTS.md` 的托管块之外,并把 `.code-flow/specs` 明确为规范来源。
|
|
22
17
|
|
|
23
|
-
|
|
24
|
-
npm i -g @michaelxwb/code-flow@latest
|
|
25
|
-
```
|
|
18
|
+
旧版本需要人工保存资料、清除旧平台入口后重新初始化;v1 不包含迁移、转换或自动删除逻辑。详见[使用说明](docs/USAGE.md)。
|
|
26
19
|
|
|
27
|
-
|
|
20
|
+
## 规范与任务
|
|
28
21
|
|
|
29
|
-
```
|
|
30
|
-
|
|
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
|
-
|
|
33
|
+
一个需求一份任务文档,内部包含多个 `## TASK-NNN` 段。默认 `workflow: hook` 只需要 `example.md`;`workflow: full` 额外生成 PRD/前后端 design/scenarios:
|
|
36
34
|
|
|
37
|
-
```
|
|
38
|
-
|
|
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
|
-
|
|
45
|
+
任务文档的 TASK 段声明 status、source、scenarios、spec_refs 和 tests(hook 下 source/scenarios 可留空):
|
|
42
46
|
|
|
43
|
-
|
|
44
|
-
|
|
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
|
-
|
|
56
|
+
### Tests
|
|
50
57
|
|
|
51
|
-
```
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
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
|
-
|
|
66
|
+
- [ ] 实现相关行为并验证回归。
|
|
67
|
+
````
|
|
66
68
|
|
|
67
|
-
|
|
69
|
+
`Source`/`Scenarios` 在 hook 工作流可留空;full 工作流填 design/scenarios 引用。
|
|
68
70
|
|
|
69
|
-
|
|
71
|
+
完整示例见[使用说明](docs/USAGE.md)。
|
|
70
72
|
|
|
71
|
-
```
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
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
|
-
|
|
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
|
-
|
|
82
|
+
Hook 只在用户提交 prompt 时读取并交付上下文。没有编辑/Stop 门禁;规范修改后下次适用注入读取最新内容。finish 实际执行本任务声明测试;archive 仅应用 Delta 并移动需求目录,CI 独立承担全量与 E2E。
|
|
88
83
|
|
|
89
|
-
|
|
84
|
+
批次 worktree 从包含 specs/当前需求/config 的 baseline 创建;业务代码 dirty 时拒绝。worker 默认使用全局 CLI,prepare 不再自动 init;只有需要 worker 内宿主会话时才用 `--init`。随后校验 specs 快照并自动合并。
|
|
90
85
|
|
|
91
|
-
##
|
|
86
|
+
## 工作流与过程数据
|
|
92
87
|
|
|
93
|
-
|
|
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
|
-
|
|
98
|
+
- `workflow`: `hook`(默认)要求 task 文档和声明测试;`full` 启用 PRD/design/scenarios。设计文档是项目资产,不作为 prompt 输入;只有 Spec 会注入。
|
|
99
|
+
- `capture`: 开启后 CLI/Hook 自动写入 `.code-flow/process/events.jsonl`。验证结束用跨平台命令采集:
|
|
103
100
|
|
|
104
|
-
```
|
|
105
|
-
|
|
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
|
-
|
|
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
|
-
|
|
142
|
-
|
|
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
|
-
-
|
|
156
|
-
- 原因:本地或全局已有同名命令/包。
|
|
157
|
-
- 处理:先卸载冲突包或更换名称后再安装。
|
|
122
|
+
[文档索引](docs/README.md) · [设计](docs/v1-design.md) · [验收覆盖](docs/v1-implementation.md) · [使用说明](docs/USAGE.md)
|
package/bin/code-flow.js
ADDED
|
@@ -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 是否把隐含约束写清楚。
|