@jahanxu/code-flow 0.2.2 → 0.2.4

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jahanxu/code-flow",
3
- "version": "0.2.2",
3
+ "version": "0.2.4",
4
4
  "license": "UNLICENSED",
5
5
  "bin": {
6
6
  "code-flow": "src/cli.js"
@@ -1,18 +1,20 @@
1
1
  # cf-task:archive
2
2
 
3
- 归档已完成的整个 task 文件。
3
+ 归档已完成的整个 task 文件。归档前执行三维校验,归档后提示更新 specs。
4
4
 
5
5
  ## 输入
6
6
 
7
7
  - `/cf-task:archive <file>` — 归档指定的 task 文件
8
8
 
9
- 其中 `<file>` 可省略路径前缀和 `.md` 后缀。
9
+ 其中 `<file>` 可省略日期目录前缀和 `.md` 后缀。
10
+
11
+ 查找逻辑:用 Glob 搜索 `.code-flow/tasks/**/<file>.md`,从结果中排除包含 `archived/` 的路径,匹配第一个结果。
10
12
 
11
13
  ## 执行步骤
12
14
 
13
15
  ### 1. 完成度检查
14
16
 
15
- 1. 用 Read 读取 `.code-flow/tasks/<file>.md`
17
+ 1. 用 Read 读取匹配到的 task 文件
16
18
  2. 提取所有 `## TASK-xxx` 段落的 Status
17
19
  3. 检查是否所有子任务均为 `done`
18
20
 
@@ -28,21 +30,73 @@
28
30
  当前完成度: 2/4 (50%)
29
31
  ```
30
32
 
31
- ### 2. 执行归档
33
+ ### 2. 归档前校验(Verify)
34
+
35
+ 所有子任务 done 后,执行三维校验:
36
+
37
+ **完整性**:
38
+ - 所有 Checklist 项已勾选
39
+ - 无未解决的 Notes(无 `[NOTE-n]` 未标记 `[RESOLVED]`)
40
+
41
+ **正确性**:
42
+ - 如果 `.code-flow/validation.yml` 存在,Read 读取验证规则,用 Bash 执行其中匹配的 `command`(如 `npx tsc --noEmit`、`python3 -m pytest` 等)
43
+ - 检查本次变更涉及的文件是否通过 lint/type check
44
+
45
+ **一致性**:
46
+ - 读取 task 文件的 `## Proposal`,对照实际代码变更,检查意图是否已实现
47
+
48
+ 校验结果输出:
49
+
50
+ ```
51
+ 归档前校验:
52
+ [PASS] 完整性: 所有 Checklist 已完成,无未解决 Notes
53
+ [PASS] 正确性: cf-validate 通过
54
+ [WARN] 一致性: Proposal 提到"支持 OAuth 登录",但未发现相关实现
55
+
56
+ WARN 不阻塞归档,但建议确认后再继续。继续归档?
57
+ ```
58
+
59
+ PASS → 继续。WARN → 提示用户确认。FAIL → 阻塞归档,列出失败原因。
32
60
 
33
- 所有子任务已完成:
61
+ ### 3. 执行归档
34
62
 
35
- 1. 用 Bash 创建归档目录并移动文件:
63
+ 校验通过后:
64
+
65
+ 1. 提取文件所在的日期目录名(如 `2026-03-15`)
66
+ 2. 用 Bash 创建归档目录并移动文件:
36
67
  ```bash
37
- mkdir -p .code-flow/tasks/archived
38
- mv .code-flow/tasks/<file>.md .code-flow/tasks/archived/
68
+ mkdir -p .code-flow/tasks/archived/<日期目录>
69
+ mv .code-flow/tasks/<日期目录>/<file>.md .code-flow/tasks/archived/<日期目录>/
39
70
  ```
40
- 2. 输出归档摘要
71
+ 3. 如果原日期目录为空,删除空目录
72
+
73
+ ### 4. Spec 更新提示
74
+
75
+ 归档完成后,检查本次变更是否引入了新的规范约束需要同步到 specs:
76
+
77
+ 1. 读取 task 文件中所有子任务的 Description 和 Checklist
78
+ 2. 对照 `.code-flow/specs/` 下的现有规范
79
+ 3. 如果发现新增的模式或约束未被 specs 覆盖,提示用户:
80
+
81
+ ```
82
+ Spec 同步建议:
83
+ 本次变更引入了以下尚未记录的规范:
84
+ - 所有 API handler 增加了 rate limiting 中间件
85
+ - 新增 AppError 统一错误处理模式
86
+
87
+ 建议更新:
88
+ - .code-flow/specs/backend/platform-rules.md — 补充 rate limiting 规则
89
+ - .code-flow/specs/backend/code-quality-performance.md — 补充错误处理模式
90
+
91
+ 运行 /cf-learn 可自动扫描并补充。
92
+ ```
93
+
94
+ 如果无新规范需同步,跳过此步骤。
41
95
 
42
- ### 3. 归档摘要
96
+ ### 5. 归档摘要
43
97
 
44
98
  ```
45
- 已归档: <file>.md → .code-flow/tasks/archived/<file>.md
99
+ 已归档: <file>.md → .code-flow/tasks/archived/<日期目录>/<file>.md
46
100
 
47
101
  摘要:
48
102
  - 来源: docs/xxx设计说明书.md
@@ -50,4 +104,5 @@
50
104
  - 创建日期: 2026-03-15
51
105
  - 归档日期: 2026-03-20
52
106
  - 历时: 5 天
107
+ - 校验: 3/3 PASS
53
108
  ```
@@ -6,18 +6,20 @@
6
6
 
7
7
  - `/cf-task:block <file> TASK-001 "阻塞原因"`
8
8
 
9
- 其中 `<file>` 可省略路径前缀和 `.md` 后缀。
9
+ 其中 `<file>` 可省略日期目录前缀和 `.md` 后缀。
10
+
11
+ 查找逻辑:用 Glob 搜索 `.code-flow/tasks/**/<file>.md`,从结果中排除包含 `archived/` 的路径,匹配第一个结果。
10
12
 
11
13
  ## 执行步骤
12
14
 
13
- 1. 用 Read 读取 `.code-flow/tasks/<file>.md`
15
+ 1. 用 Glob 定位任务文件,Read 读取
14
16
  2. 定位 `## TASK-001` 段落,检查当前 Status:
15
17
  - `done` → 拒绝:`TASK-001 已完成,无法标记阻塞`
16
18
  - `blocked` → 提示:`TASK-001 已处于 blocked 状态`,仍追加新的阻塞原因
17
19
  - `draft` / `in-progress` → 继续
18
20
  3. 用 Edit 更新 Status 为 `blocked`
19
21
  4. 在 `### Notes` 追加:`- [BLOCKED] <阻塞原因>`
20
- 5. 在 `### Log` 追加:`- [<当前日期>] blocked (<阻塞原因>)`
22
+ 5. 在 `### Log` 追加:`- [<当前日期>] blocked (<阻塞原因>, was <原状态>)`
21
23
  6. 更新文件头 `Updated` 日期
22
24
  7. 输出确认:`TASK-001 已标记为 blocked: <原因>`
23
25
 
@@ -7,14 +7,16 @@
7
7
  - `/cf-task:graph <file>` — 显示指定文件的依赖图
8
8
  - `/cf-task:graph` — 显示所有活跃 task 文件的依赖图
9
9
 
10
- 其中 `<file>` 可省略路径前缀和 `.md` 后缀。
10
+ 其中 `<file>` 可省略日期目录前缀和 `.md` 后缀。
11
+
12
+ 查找逻辑:用 Glob 搜索 `.code-flow/tasks/**/<file>.md`,从结果中排除包含 `archived/` 的路径,匹配第一个结果。
11
13
 
12
14
  ## 执行步骤
13
15
 
14
16
  ### 1. 读取任务数据
15
17
 
16
- - 指定文件:Read `.code-flow/tasks/<file>.md`
17
- - 全部文件:Glob `.code-flow/tasks/*.md`(排除 `archived/` 目录),逐个 Read
18
+ - 指定文件:Glob 定位后 Read
19
+ - 全部文件:Glob `.code-flow/tasks/**/*.md`,从结果中排除包含 `archived/` 的路径,逐个 Read
18
20
 
19
21
  从每个 `## TASK-xxx` 段落提取:ID、标题、Status、Depends。
20
22
 
@@ -8,17 +8,19 @@
8
8
  - `/cf-task:note <file> TASK-001 resolve NOTE-1` — 标记批注为已解决
9
9
  - `/cf-task:note <file> TASK-001 resolve all` — 标记所有批注为已解决
10
10
 
11
- 其中 `<file>` 可省略路径前缀和 `.md` 后缀。
11
+ 其中 `<file>` 可省略日期目录前缀和 `.md` 后缀。
12
+
13
+ 查找逻辑:用 Glob 搜索 `.code-flow/tasks/**/<file>.md`,从结果中排除包含 `archived/` 的路径,匹配第一个结果。
12
14
 
13
15
  ## 添加批注
14
16
 
15
17
  ### 执行步骤
16
18
 
17
- 1. 用 Read 读取 `.code-flow/tasks/<file>.md`
19
+ 1. 用 Glob 定位任务文件,Read 读取
18
20
  2. 定位 `## TASK-001` 段落下的 `### Notes` 区域
19
21
  3. 扫描已有 `[NOTE-n]`,计算下一个编号
20
22
  4. 用 Edit 在 `### Notes` 下追加:`- [NOTE-<n>] <批注内容>`
21
- 5. 如果子任务 Status 为 `in-progress`,自动用 Edit 改为 `blocked`,并在 `### Log` 追加:`- [<当前日期>] blocked (unresolved note)`
23
+ 5. 如果子任务 Status 为 `in-progress` 或 `draft`,自动用 Edit 改为 `blocked`,并在 `### Log` 追加:`- [<当前日期>] blocked (unresolved note, was <原状态>)`(记录阻塞前的状态,用于后续恢复)
22
24
  6. 更新文件头 `Updated` 日期
23
25
  7. 输出确认:`已添加 [NOTE-<n>],TASK-001 状态: blocked`
24
26
 
@@ -30,8 +32,8 @@
30
32
  2. 定位指定的 `[NOTE-n]` 批注
31
33
  3. 用 Edit 将 `[NOTE-n]` 改为 `[NOTE-n] [RESOLVED]`
32
34
  4. 检查是否还有未解决的 Notes:
33
- - 全部解决 + 状态为 blocked → 自动恢复为 `draft`(如果之前是 draft 被阻塞)或 `in-progress`
34
- - 在 `### Log` 追加:`- [<当前日期>] unblocked (notes resolved)`
35
+ - 全部解决 + 状态为 blocked → 扫描 `### Log`,查找最近一条 `blocked (unresolved note, was <状态>)` 记录,恢复为记录中的原状态
36
+ - 在 `### Log` 追加:`- [<当前日期>] unblocked (notes resolved, restored to <原状态>)`
35
37
  5. 更新文件头 `Updated` 日期
36
38
  6. 输出确认
37
39
 
@@ -6,6 +6,7 @@
6
6
 
7
7
  - `/cf-task:plan <设计文档路径>` — 指定文档路径
8
8
  - `/cf-task:plan` — 交互式选择(从 `docs/` 目录列出候选)
9
+ - `/cf-task:plan <设计文档路径> --explore` — 仅输出分析报告,不生成文件
9
10
 
10
11
  ## 执行步骤
11
12
 
@@ -18,7 +19,55 @@
18
19
  2. 展示列表,让用户选择目标文档
19
20
  3. Read 读取选中的文档
20
21
 
21
- ### 2. 分析文档,拆解子任务
22
+ ### 2. 建立章节索引
23
+
24
+ Read 设计文档后,**先扫描文档结构**,建立章节索引表:
25
+
26
+ ```
27
+ 章节索引:
28
+ §1 概述 (L1-L25)
29
+ §2 需求分析 (L26-L80)
30
+ §2.1 用户故事 (L28-L55)
31
+ §2.2 非功能需求 (L56-L80)
32
+ §3 详细设计 (L81-L200)
33
+ §3.1 数据模型 (L83-L110)
34
+ §3.2 API 接口 (L111-L155)
35
+ §3.3 业务逻辑 (L156-L200)
36
+ ...
37
+ ```
38
+
39
+ 此索引用于后续步骤中精确记录每个子任务的来源章节。
40
+
41
+ ### 2.5. Explore 模式(--explore)
42
+
43
+ 如果用户传入 `--explore`,在建立章节索引后,输出以下分析报告,**不生成任务文件**:
44
+
45
+ ```
46
+ 探索分析报告
47
+ ============
48
+
49
+ 文档: docs/xxx设计说明书.md
50
+ 章节数: N | 预估子任务数: M
51
+
52
+ 功能域识别:
53
+ - 用户认证 (§3.1-§3.3) — 核心功能,建议 P0
54
+ - 支付集成 (§3.4-§3.6) — 依赖第三方 SDK,存在阻塞风险
55
+ - 通知系统 (§3.7) — 独立模块,可并行
56
+
57
+ 关键依赖:
58
+ - §3.2 API 接口依赖 §3.1 数据模型
59
+ - §3.5 支付回调依赖 §3.4 订单模型
60
+
61
+ 风险点:
62
+ - §3.4 中提到的第三方 SDK 版本未确定
63
+ - §3.6 缺少错误码定义
64
+
65
+ 建议: 确认风险点后,运行 /cf-task:plan docs/xxx.md 生成任务文件
66
+ ```
67
+
68
+ 输出后结束,不进入后续步骤。
69
+
70
+ ### 3. 分析文档,拆解子任务
22
71
 
23
72
  阅读设计文档内容,按以下原则拆解:
24
73
 
@@ -28,12 +77,20 @@
28
77
  - 预估编码时间 15-60 分钟
29
78
 
30
79
  **提取内容**:
31
- - 功能需求 → 子任务标题 + 描述
80
+ - 功能需求 → 子任务标题 + 描述(提炼重点,不必复制全文)
32
81
  - 实现要点 → Checklist 条目
33
82
  - 模块依赖 → Depends 字段
34
83
  - 紧急程度 → Priority(P0 核心功能 / P1 重要功能 / P2 优化项)
35
84
 
36
- ### 3. 生成任务文件方案
85
+ **关键:精确记录章节引用**
86
+
87
+ 每个子任务的 `Source` 字段必须记录该任务对应的详设文档**具体章节和行号范围**。
88
+
89
+ 引用格式:`文件路径#章节标题(L起始-L结束)`,多个章节用逗号分隔。
90
+
91
+ 验证方法:记录引用后,用 Read 工具按行号范围回读验证,确保引用内容与子任务描述一致。如不一致,修正行号。
92
+
93
+ ### 4. 生成任务文件方案
37
94
 
38
95
  将拆解结果按以下格式组织,展示给用户确认:
39
96
 
@@ -44,6 +101,12 @@
44
101
  - **Created**: <当前日期>
45
102
  - **Updated**: <当前日期>
46
103
 
104
+ ## Proposal
105
+
106
+ <2-3 句话说明变更意图:为什么做这个变更?解决什么问题?期望达成什么效果?>
107
+
108
+ 这段由 AI 从设计文档中提炼生成,帮助编码阶段快速理解全局意图,而不必重读整篇详设。
109
+
47
110
  ---
48
111
 
49
112
  ## TASK-001: <子任务标题>
@@ -51,9 +114,10 @@
51
114
  - **Status**: draft
52
115
  - **Priority**: P0
53
116
  - **Depends**:
117
+ - **Source**: docs/xxx.md#§3.1 数据模型(L83-L110)
54
118
 
55
119
  ### Description
56
- <从设计文档提取的需求描述>
120
+ <从设计文档提取的需求重点,不必复制全文>
57
121
 
58
122
  ### Checklist
59
123
  - [ ] <具体实现步骤1>
@@ -68,6 +132,13 @@
68
132
  ---
69
133
 
70
134
  ## TASK-002: <子任务标题>
135
+
136
+ - **Status**: draft
137
+ - **Priority**: P1
138
+ - **Depends**: TASK-001
139
+ - **Source**: docs/xxx.md#§3.2 API 接口(L111-L155), docs/xxx.md#§3.3 业务逻辑(L156-L180)
140
+
141
+ ### Description
71
142
  ...
72
143
  ```
73
144
 
@@ -77,11 +148,13 @@
77
148
  拆解结果(共 N 个子任务):
78
149
 
79
150
  TASK-001: <标题> [P0]
151
+ 来源: §3.1 数据模型 (L83-L110)
80
152
  描述: ...
81
153
  Checklist: N 项
82
154
  依赖: 无
83
155
 
84
156
  TASK-002: <标题> [P1]
157
+ 来源: §3.2 API 接口 (L111-L155), §3.3 业务逻辑 (L156-L180)
85
158
  描述: ...
86
159
  Checklist: N 项
87
160
  依赖: TASK-001
@@ -90,24 +163,26 @@ TASK-002: <标题> [P1]
90
163
  - 修改某个子任务的内容
91
164
  - 删除不需要的子任务
92
165
  - 合并过于细碎的子任务
93
- - 调整依赖关系
166
+ - 调整依赖关系和章节引用
94
167
  ```
95
168
 
96
169
  等待用户确认或调整。
97
170
 
98
- ### 4. 写入文件
171
+ ### 5. 写入文件
99
172
 
100
173
  用户确认后:
101
- 1. 文件名取模块/功能名(kebab-case),如 `auth-module.md`、`payment-api.md`
102
- 2. 用 Write 写入 `.code-flow/tasks/<name>.md`
174
+ 1. 文件名取模块/功能名(kebab-case),如 `auth-module.md`
175
+ 2. 按当前日期创建目录:`.code-flow/tasks/<YYYY-MM-DD>/`
176
+ 3. 用 Write 写入 `.code-flow/tasks/<YYYY-MM-DD>/<name>.md`
103
177
 
104
- ### 5. 输出摘要
178
+ ### 6. 输出摘要
105
179
 
106
180
  ```
107
- 已生成任务文件: .code-flow/tasks/<name>.md
181
+ 已生成任务文件: .code-flow/tasks/2026-03-15/auth-module.md
108
182
  - 子任务数: N
109
183
  - P0: x 个, P1: y 个, P2: z 个
110
184
  - 依赖链深度: N 层
185
+ - 详设引用覆盖: §3.1, §3.2, §3.3, §3.5 (共 4 个章节)
111
186
 
112
187
  建议执行顺序:
113
188
  1. TASK-001 (无依赖)
@@ -116,7 +191,7 @@ TASK-002: <标题> [P1]
116
191
  ...
117
192
 
118
193
  下一步:
119
- - 审阅任务: 直接阅读 .code-flow/tasks/<name>.md
120
- - 添加批注: /cf-task:note <name> TASK-001 "批注内容"
121
- - 开始编码: /cf-task:start <name>
194
+ - 审阅任务: 直接阅读 .code-flow/tasks/2026-03-15/auth-module.md
195
+ - 添加批注: /cf-task:note auth-module TASK-001 "批注内容"
196
+ - 开始编码: /cf-task:start auth-module
122
197
  ```
@@ -7,7 +7,9 @@
7
7
  - `/cf-task:start <file> TASK-001` — 激活指定文件中的单个子任务
8
8
  - `/cf-task:start <file>` — 激活文件内所有可执行的 draft 子任务
9
9
 
10
- 其中 `<file>` 为 `.code-flow/tasks/` 下的文件名,可省略路径前缀和 `.md` 后缀。
10
+ 其中 `<file>` 为 `.code-flow/tasks/` 下的文件名,可省略日期目录前缀和 `.md` 后缀。
11
+
12
+ 查找逻辑:用 Glob 搜索 `.code-flow/tasks/**/<file>.md`,从结果中排除包含 `archived/` 的路径,匹配第一个结果。
11
13
 
12
14
  示例:
13
15
  - `/cf-task:start auth-module TASK-002`
@@ -17,7 +19,7 @@
17
19
 
18
20
  ### 1. 前置检查
19
21
 
20
- 用 Read 读取 `.code-flow/tasks/<file>.md`,定位 `## TASK-xxx` 段落:
22
+ 用 Read 读取任务文件,定位 `## TASK-xxx` 段落:
21
23
 
22
24
  **状态检查**:Status 必须为 `draft`。若为其他状态:
23
25
  - `in-progress` → 提示"任务已在进行中,继续编码"(不阻塞,直接跳到步骤 2)
@@ -33,22 +35,35 @@
33
35
  - 所有依赖必须为 `done`
34
36
  - 未满足 → 输出:`前置检查失败:以下依赖未完成\n- TASK-001: in-progress\n- TASK-003: draft`
35
37
 
36
- ### 2. 激活并编码
38
+ ### 2. 加载详设上下文
39
+
40
+ 前置检查通过后,**编码前先加载关联的详设文档章节**:
41
+
42
+ 1. 读取子任务的 `Source` 字段,解析章节引用
43
+ - 格式:`docs/xxx.md#§3.1 数据模型(L83-L110)`
44
+ - 提取:文件路径 + 行号范围
45
+ 2. 用 Read 按行号范围读取详设文档的对应章节(使用 offset/limit 参数)
46
+ 3. 将读取的章节内容作为编码上下文,与 Checklist 一起指导实现
47
+
48
+ 示例:Source 为 `docs/auth.md#§3.2 API 接口(L111-L155), docs/auth.md#§3.5 错误码(L201-L220)`
49
+ → Read `docs/auth.md` offset=111 limit=45
50
+ → Read `docs/auth.md` offset=201 limit=20
51
+
52
+ ### 3. 激活并编码
37
53
 
38
- 前置检查通过后:
39
54
  1. 用 Edit 更新子任务 Status 为 `in-progress`
40
55
  2. 在 `### Log` 追加:`- [<当前日期>] started (in-progress)`
41
56
  3. 更新文件头 `Updated` 日期
42
- 4. 读取 `### Checklist`,逐项执行编码工作
57
+ 4. 结合详设上下文 + Checklist,逐项执行编码工作
43
58
  5. 每完成一个 checklist 项 → 用 Edit 将 `- [ ]` 改为 `- [x]`
44
59
 
45
- ### 3. 自动完成
60
+ ### 4. 自动完成
46
61
 
47
62
  当所有 checklist 项都勾选为 `[x]` 后:
48
63
  1. 用 Edit 更新 Status 为 `done`
49
64
  2. 在 `### Log` 追加:`- [<当前日期>] completed (done)`
50
65
  3. 更新文件头 `Updated` 日期
51
- 4. 输出:`TASK-xxx 已完成 ✓`
66
+ 4. 输出:`TASK-xxx 已完成`
52
67
 
53
68
  ## 整文件模式
54
69
 
@@ -56,7 +71,14 @@
56
71
 
57
72
  用 Read 读取整个 task 文件,提取所有 `## TASK-xxx` 段落的 ID、Status、Depends。
58
73
 
59
- ### 2. 构建执行计划
74
+ ### 2. 加载详设文档
75
+
76
+ 1. 读取文件头的 `Source` 字段,提取设计文档路径(文件头 Source 只有路径,无行号范围)
77
+ 2. 用 Read 加载完整的详设文档作为全局上下文(不使用 offset/limit)
78
+
79
+ > 注:整文件模式加载完整详设(因为涉及所有子任务),单任务模式只加载子任务 Source 中引用的章节(节省 token)。
80
+
81
+ ### 3. 构建执行计划
60
82
 
61
83
  按依赖关系拓扑排序:
62
84
  1. 筛选所有 `draft` 状态的子任务
@@ -81,13 +103,13 @@
81
103
  开始执行...
82
104
  ```
83
105
 
84
- ### 3. 按序执行
106
+ ### 4. 按序执行
85
107
 
86
- 对每个可激活的子任务,执行单任务模式的步骤 2-3。
108
+ 对每个可激活的子任务,执行单任务模式的步骤 3-4(详设已在步骤 2 加载,无需重复读取)。
87
109
 
88
110
  完成一个子任务后,检查是否解锁了新的子任务(依赖已满足),如果是则继续执行。
89
111
 
90
- ### 4. 输出摘要
112
+ ### 5. 输出摘要
91
113
 
92
114
  ```
93
115
  执行完成:
@@ -11,7 +11,7 @@
11
11
 
12
12
  ### 1. 读取任务数据
13
13
 
14
- - 用 Glob 搜索 `.code-flow/tasks/*.md`(排除 `archived/` 目录)
14
+ - 用 Glob 搜索 `.code-flow/tasks/**/*.md`,从结果中排除包含 `archived/` 的路径
15
15
  - 逐个 Read,提取每个 `## TASK-xxx` 的:ID、标题、Status、Priority、Depends、Checklist 完成度
16
16
 
17
17
  ### 2. 输出总览表格