@michaelxwb/code-flow 0.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +157 -0
- package/package.json +16 -0
- package/src/adapters/claude/CLAUDE.md +51 -0
- package/src/adapters/claude/commands/cf-init.md +262 -0
- package/src/adapters/claude/commands/cf-inject.md +55 -0
- package/src/adapters/claude/commands/cf-learn.md +291 -0
- package/src/adapters/claude/commands/cf-stats.md +86 -0
- package/src/adapters/claude/commands/cf-task/align.md +283 -0
- package/src/adapters/claude/commands/cf-task/archive.md +131 -0
- package/src/adapters/claude/commands/cf-task/block.md +30 -0
- package/src/adapters/claude/commands/cf-task/graph.md +73 -0
- package/src/adapters/claude/commands/cf-task/note.md +239 -0
- package/src/adapters/claude/commands/cf-task/plan.md +270 -0
- package/src/adapters/claude/commands/cf-task/prd.md +138 -0
- package/src/adapters/claude/commands/cf-task/start.md +173 -0
- package/src/adapters/claude/commands/cf-task/status.md +59 -0
- package/src/adapters/claude/commands/cf-validate.md +73 -0
- package/src/adapters/claude/settings.local.json +60 -0
- package/src/adapters/codex/AGENTS.md +51 -0
- package/src/adapters/codex/config.toml +3 -0
- package/src/adapters/codex/hooks.json +48 -0
- package/src/adapters/codex/skills/cf-init/SKILL.md +271 -0
- package/src/adapters/codex/skills/cf-inject/SKILL.md +56 -0
- package/src/adapters/codex/skills/cf-learn/SKILL.md +296 -0
- package/src/adapters/codex/skills/cf-stats/SKILL.md +87 -0
- package/src/adapters/codex/skills/cf-task-align/SKILL.md +284 -0
- package/src/adapters/codex/skills/cf-task-archive/SKILL.md +132 -0
- package/src/adapters/codex/skills/cf-task-block/SKILL.md +31 -0
- package/src/adapters/codex/skills/cf-task-graph/SKILL.md +74 -0
- package/src/adapters/codex/skills/cf-task-note/SKILL.md +236 -0
- package/src/adapters/codex/skills/cf-task-plan/SKILL.md +271 -0
- package/src/adapters/codex/skills/cf-task-prd/SKILL.md +139 -0
- package/src/adapters/codex/skills/cf-task-start/SKILL.md +174 -0
- package/src/adapters/codex/skills/cf-task-status/SKILL.md +60 -0
- package/src/adapters/codex/skills/cf-validate/SKILL.md +74 -0
- package/src/adapters/costrict/CLAUDE.md +51 -0
- package/src/adapters/costrict/commands/cf-init.md +262 -0
- package/src/adapters/costrict/commands/cf-inject.md +55 -0
- package/src/adapters/costrict/commands/cf-learn.md +291 -0
- package/src/adapters/costrict/commands/cf-stats.md +86 -0
- package/src/adapters/costrict/commands/cf-task/align.md +283 -0
- package/src/adapters/costrict/commands/cf-task/archive.md +131 -0
- package/src/adapters/costrict/commands/cf-task/block.md +30 -0
- package/src/adapters/costrict/commands/cf-task/graph.md +73 -0
- package/src/adapters/costrict/commands/cf-task/note.md +239 -0
- package/src/adapters/costrict/commands/cf-task/plan.md +270 -0
- package/src/adapters/costrict/commands/cf-task/prd.md +138 -0
- package/src/adapters/costrict/commands/cf-task/start.md +173 -0
- package/src/adapters/costrict/commands/cf-task/status.md +59 -0
- package/src/adapters/costrict/commands/cf-validate.md +73 -0
- package/src/adapters/costrict/settings.local.json +60 -0
- package/src/adapters/opencode/AGENTS.md +51 -0
- package/src/adapters/opencode/commands/cf-init.md +275 -0
- package/src/adapters/opencode/commands/cf-inject.md +59 -0
- package/src/adapters/opencode/commands/cf-learn.md +295 -0
- package/src/adapters/opencode/commands/cf-stats.md +90 -0
- package/src/adapters/opencode/commands/cf-task/align.md +287 -0
- package/src/adapters/opencode/commands/cf-task/archive.md +135 -0
- package/src/adapters/opencode/commands/cf-task/block.md +34 -0
- package/src/adapters/opencode/commands/cf-task/graph.md +77 -0
- package/src/adapters/opencode/commands/cf-task/note.md +243 -0
- package/src/adapters/opencode/commands/cf-task/plan.md +274 -0
- package/src/adapters/opencode/commands/cf-task/prd.md +142 -0
- package/src/adapters/opencode/commands/cf-task/start.md +177 -0
- package/src/adapters/opencode/commands/cf-task/status.md +63 -0
- package/src/adapters/opencode/commands/cf-validate.md +77 -0
- package/src/adapters/opencode/opencode.json +4 -0
- package/src/adapters/opencode/plugins/code-flow/index.js +132 -0
- package/src/adapters/opencode/plugins/code-flow/package.json +6 -0
- package/src/cli.js +810 -0
- package/src/core/code-flow/config.yml +159 -0
- package/src/core/code-flow/scripts/cf_checks.py +306 -0
- package/src/core/code-flow/scripts/cf_core.py +954 -0
- package/src/core/code-flow/scripts/cf_feedback.py +56 -0
- package/src/core/code-flow/scripts/cf_inject_hook.py +178 -0
- package/src/core/code-flow/scripts/cf_log.py +146 -0
- package/src/core/code-flow/scripts/cf_post_hook.py +196 -0
- package/src/core/code-flow/scripts/cf_scan.py +293 -0
- package/src/core/code-flow/scripts/cf_session_hook.py +42 -0
- package/src/core/code-flow/scripts/cf_stats.py +439 -0
- package/src/core/code-flow/scripts/cf_stop_hook.py +191 -0
- package/src/core/code-flow/scripts/cf_user_prompt_hook.py +402 -0
- package/src/core/code-flow/specs/backend/_map.md +56 -0
- package/src/core/code-flow/specs/backend/code-quality-performance.md +47 -0
- package/src/core/code-flow/specs/backend/database.md +39 -0
- package/src/core/code-flow/specs/backend/directory-structure.md +42 -0
- package/src/core/code-flow/specs/backend/logging.md +38 -0
- package/src/core/code-flow/specs/backend/platform-rules.md +43 -0
- package/src/core/code-flow/specs/frontend/_map.md +52 -0
- package/src/core/code-flow/specs/frontend/component-specs.md +56 -0
- package/src/core/code-flow/specs/frontend/directory-structure.md +41 -0
- package/src/core/code-flow/specs/frontend/quality-standards.md +46 -0
- package/src/core/code-flow/specs/shared/_map.md +57 -0
- package/src/core/code-flow/specs/shared/design/design-frontend.md +247 -0
- package/src/core/code-flow/specs/shared/design/design-full.md +494 -0
- package/src/core/code-flow/specs/shared/design/design-lite.md +293 -0
- package/src/core/code-flow/specs/shared/prd-template.md +187 -0
- package/src/core/code-flow/tasks/.gitkeep +0 -0
- package/src/core/code-flow/validation.yml +48 -0
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: 归档已完成的 task 文件
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# cf-task:archive
|
|
6
|
+
|
|
7
|
+
归档已完成的整个 task 文件。归档前执行三维校验,归档后提示更新 specs。
|
|
8
|
+
|
|
9
|
+
## 输入
|
|
10
|
+
|
|
11
|
+
- `/cf-task:archive <file>` — 归档指定的 task 文件
|
|
12
|
+
|
|
13
|
+
其中 `<file>` 可省略日期目录前缀和 `.md` 后缀。
|
|
14
|
+
|
|
15
|
+
查找逻辑:用 Glob 搜索 `.code-flow/tasks/**/<file>.md`,从结果中排除包含 `archived/` 的路径。如果匹配到多个结果,输出警告列出所有匹配项,让用户指定完整路径;如果只有一个结果,直接使用。
|
|
16
|
+
|
|
17
|
+
## 执行步骤
|
|
18
|
+
|
|
19
|
+
### 1. 完成度检查
|
|
20
|
+
|
|
21
|
+
1. 用 Read 读取匹配到的 task 文件
|
|
22
|
+
2. 提取所有 `## TASK-xxx` 段落的 Status
|
|
23
|
+
3. 检查是否所有子任务均为 `done`
|
|
24
|
+
|
|
25
|
+
若有未完成子任务,拒绝归档并输出:
|
|
26
|
+
|
|
27
|
+
```
|
|
28
|
+
无法归档: 以下子任务未完成
|
|
29
|
+
|
|
30
|
+
- TASK-002: in-progress (进度 1/4)
|
|
31
|
+
- TASK-004: blocked ([BLOCKED] 等待 SDK)
|
|
32
|
+
|
|
33
|
+
请先完成所有子任务后再归档。
|
|
34
|
+
当前完成度: 2/4 (50%)
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
### 2. 归档前校验(Verify)
|
|
38
|
+
|
|
39
|
+
所有子任务 done 后,执行三维校验:
|
|
40
|
+
|
|
41
|
+
**完整性**:
|
|
42
|
+
- 所有 Checklist 项已勾选
|
|
43
|
+
- 全文无残留的 `#NOTES` 标记
|
|
44
|
+
|
|
45
|
+
**正确性**:
|
|
46
|
+
- 如果 `.code-flow/validation.yml` 存在,Read 读取验证规则,用 Bash 执行其中匹配的 `command`(如 `npx tsc --noEmit`、`python3 -m pytest` 等)
|
|
47
|
+
- 检查本次变更涉及的文件是否通过 lint/type check
|
|
48
|
+
|
|
49
|
+
**一致性**:
|
|
50
|
+
- 读取 task 文件的 `## Proposal`,对照实际代码变更,检查意图是否已实现
|
|
51
|
+
|
|
52
|
+
校验结果输出:
|
|
53
|
+
|
|
54
|
+
```
|
|
55
|
+
归档前校验:
|
|
56
|
+
[PASS] 完整性: 所有 Checklist 已完成,无未解决 Notes
|
|
57
|
+
[PASS] 正确性: cf-validate 通过
|
|
58
|
+
[WARN] 一致性: Proposal 提到"支持 OAuth 登录",但未发现相关实现
|
|
59
|
+
|
|
60
|
+
WARN 不阻塞归档,但建议确认后再继续。继续归档?
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
PASS → 继续。WARN → 提示用户确认。FAIL → 阻塞归档,列出失败原因。
|
|
64
|
+
|
|
65
|
+
### 3. 执行归档
|
|
66
|
+
|
|
67
|
+
校验通过后,先判断布局(任务文件路径形态):
|
|
68
|
+
|
|
69
|
+
**A. 需求目录布局**(任务文件位于 `.code-flow/tasks/<日期>/<需求>/<需求>.md`)——**整个需求目录一并归档**:
|
|
70
|
+
```bash
|
|
71
|
+
mkdir -p .code-flow/tasks/archived/<日期>
|
|
72
|
+
mv .code-flow/tasks/<日期>/<需求>/ .code-flow/tasks/archived/<日期>/<需求>/
|
|
73
|
+
```
|
|
74
|
+
目录内的 `.prd.md` / `.frontend.design.md` / `.backend.design.md` / `.design.md` / `.md` 随目录一并归档,无需逐个 mv。
|
|
75
|
+
|
|
76
|
+
**B. 旧扁平布局**(任务文件直接位于 `.code-flow/tasks/<日期>/<file>.md`,无需求目录,向后兼容)——逐文件归档:
|
|
77
|
+
1. 提取文件所在的日期目录名(如 `2026-03-15`)
|
|
78
|
+
2. 创建归档目录并移动任务文件:
|
|
79
|
+
```bash
|
|
80
|
+
mkdir -p .code-flow/tasks/archived/<日期目录>
|
|
81
|
+
mv .code-flow/tasks/<日期目录>/<file>.md .code-flow/tasks/archived/<日期目录>/
|
|
82
|
+
```
|
|
83
|
+
3. 同名 `.design.md` 存在则一并移动:`mv .code-flow/tasks/<日期目录>/<file>.design.md .code-flow/tasks/archived/<日期目录>/`
|
|
84
|
+
4. 同名 `.prd.md` 存在则一并移动:`mv .code-flow/tasks/<日期目录>/<file>.prd.md .code-flow/tasks/archived/<日期目录>/`
|
|
85
|
+
5. 如果原日期目录为空,删除空目录
|
|
86
|
+
|
|
87
|
+
**临时约束清理(FEAT-08)**:删除 `.code-flow/specs/_session/task-<name>.md`(存在时)。该文件由 cf-task:start 生成,归档后不得残留。
|
|
88
|
+
|
|
89
|
+
### 4. Spec 更新提示
|
|
90
|
+
|
|
91
|
+
归档完成后,检查本次变更是否引入了新的规范约束需要同步到 specs:
|
|
92
|
+
|
|
93
|
+
1. 读取 task 文件中所有子任务的 Description 和 Checklist
|
|
94
|
+
2. 对照 `.code-flow/specs/` 下的现有规范
|
|
95
|
+
3. 如果发现新增的模式或约束未被 specs 覆盖,提示用户:
|
|
96
|
+
|
|
97
|
+
```
|
|
98
|
+
Spec 同步建议:
|
|
99
|
+
本次变更引入了以下尚未记录的规范:
|
|
100
|
+
- 所有 API handler 增加了 rate limiting 中间件
|
|
101
|
+
- 新增 AppError 统一错误处理模式
|
|
102
|
+
|
|
103
|
+
建议更新:
|
|
104
|
+
- .code-flow/specs/backend/platform-rules.md — 补充 rate limiting 规则
|
|
105
|
+
- .code-flow/specs/backend/code-quality-performance.md — 补充错误处理模式
|
|
106
|
+
|
|
107
|
+
运行 /cf-learn 可自动扫描并补充。
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
如果无新规范需同步,跳过此步骤。
|
|
111
|
+
|
|
112
|
+
### 5. 归档摘要
|
|
113
|
+
|
|
114
|
+
需求目录布局(A):
|
|
115
|
+
```
|
|
116
|
+
已归档需求目录: <需求>/ → .code-flow/tasks/archived/<日期>/<需求>/
|
|
117
|
+
含: <需求>.prd.md、<需求>.frontend.design.md / <需求>.backend.design.md(按实际)、<需求>.md
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
旧扁平布局(B):
|
|
121
|
+
```
|
|
122
|
+
已归档: <file>.md → .code-flow/tasks/archived/<日期目录>/<file>.md
|
|
123
|
+
(如有关联设计简报): <file>.design.md → .code-flow/tasks/archived/<日期目录>/<file>.design.md
|
|
124
|
+
(如有关联 PRD): <file>.prd.md → .code-flow/tasks/archived/<日期目录>/<file>.prd.md
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
```
|
|
128
|
+
摘要:
|
|
129
|
+
- 来源: docs/xxx设计说明书.md
|
|
130
|
+
- 子任务数: N 个
|
|
131
|
+
- 创建日期: 2026-03-15
|
|
132
|
+
- 归档日期: 2026-03-20
|
|
133
|
+
- 历时: 5 天
|
|
134
|
+
- 校验: 3/3 PASS
|
|
135
|
+
```
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: 标记子任务为阻塞状态
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# cf-task:block
|
|
6
|
+
|
|
7
|
+
标记子任务为阻塞状态。
|
|
8
|
+
|
|
9
|
+
## 输入
|
|
10
|
+
|
|
11
|
+
- `/cf-task:block <file> TASK-001 "阻塞原因"`
|
|
12
|
+
|
|
13
|
+
其中 `<file>` 可省略日期目录前缀和 `.md` 后缀。
|
|
14
|
+
|
|
15
|
+
查找逻辑:用 Glob 搜索 `.code-flow/tasks/**/<file>.md`,从结果中排除包含 `archived/` 的路径。如果匹配到多个结果,输出警告列出所有匹配项,让用户指定完整路径;如果只有一个结果,直接使用。
|
|
16
|
+
|
|
17
|
+
## 执行步骤
|
|
18
|
+
|
|
19
|
+
1. 用 Glob 定位任务文件,Read 读取
|
|
20
|
+
2. 定位 `## TASK-001` 段落,检查当前 Status:
|
|
21
|
+
- `done` → 拒绝:`TASK-001 已完成,无法标记阻塞`
|
|
22
|
+
- `blocked` → 提示:`TASK-001 已处于 blocked 状态`,仍追加新的阻塞原因
|
|
23
|
+
- `draft` / `in-progress` → 继续
|
|
24
|
+
3. 用 Edit 更新 Status 为 `blocked`
|
|
25
|
+
4. 在 `### Log` 前追加:`> BLOCKED: <阻塞原因>`
|
|
26
|
+
5. 在 `### Log` 追加:`- [<当前日期>] blocked (<阻塞原因>, was <原状态>)`
|
|
27
|
+
6. 更新文件头 `Updated` 日期
|
|
28
|
+
7. 输出确认:`TASK-001 已标记为 blocked: <原因>`
|
|
29
|
+
|
|
30
|
+
## 解除阻塞
|
|
31
|
+
|
|
32
|
+
阻塞的解除不通过本命令操作,而是:
|
|
33
|
+
- 如果是 Notes 导致的阻塞 → 用 `/project:cf-task:note` 与 AI 讨论解决后自动解除
|
|
34
|
+
- 如果是 `[BLOCKED]` 标记 → 用户手动编辑文件移除 `[BLOCKED]` 条目,或用 `/project:cf-task:start` 重新启动(需所有阻塞条件清除)
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: 可视化子任务依赖关系 DAG
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# cf-task:graph
|
|
6
|
+
|
|
7
|
+
可视化子任务的依赖关系 DAG,识别可并行执行的任务组。
|
|
8
|
+
|
|
9
|
+
## 输入
|
|
10
|
+
|
|
11
|
+
- `/cf-task:graph <file>` — 显示指定文件的依赖图
|
|
12
|
+
- `/cf-task:graph` — 显示所有活跃 task 文件的依赖图
|
|
13
|
+
|
|
14
|
+
其中 `<file>` 可省略日期目录前缀和 `.md` 后缀。
|
|
15
|
+
|
|
16
|
+
查找逻辑:用 Glob 搜索 `.code-flow/tasks/**/<file>.md`,从结果中排除包含 `archived/` 的路径。如果匹配到多个结果,输出警告列出所有匹配项,让用户指定完整路径;如果只有一个结果,直接使用。
|
|
17
|
+
|
|
18
|
+
## 执行步骤
|
|
19
|
+
|
|
20
|
+
### 1. 读取任务数据
|
|
21
|
+
|
|
22
|
+
- 指定文件:Glob 定位后 Read
|
|
23
|
+
- 全部文件:Glob `.code-flow/tasks/**/*.md`,从结果中排除包含 `archived/` 的路径,逐个 Read
|
|
24
|
+
|
|
25
|
+
从每个 `## TASK-xxx` 段落提取:ID、标题、Status、Depends。
|
|
26
|
+
|
|
27
|
+
### 2. 构建依赖 DAG
|
|
28
|
+
|
|
29
|
+
按依赖关系构建有向无环图。检测循环依赖,若存在则报错。
|
|
30
|
+
|
|
31
|
+
### 3. 输出可视化
|
|
32
|
+
|
|
33
|
+
用 ASCII art 渲染 DAG,格式示例:
|
|
34
|
+
|
|
35
|
+
```
|
|
36
|
+
依赖关系图: auth-module
|
|
37
|
+
|
|
38
|
+
Layer 0 (无依赖):
|
|
39
|
+
┌──────────────────────┐ ┌──────────────────────┐
|
|
40
|
+
│ TASK-001 [draft] │ │ TASK-003 [draft] │
|
|
41
|
+
│ 用户模型定义 │ │ JWT 工具函数 │
|
|
42
|
+
└──────────┬───────────┘ └──────────┬───────────┘
|
|
43
|
+
│ │
|
|
44
|
+
▼ │
|
|
45
|
+
Layer 1: │ │
|
|
46
|
+
┌──────────┴───────────┐ │
|
|
47
|
+
│ TASK-002 [draft] │◄─────────────┘
|
|
48
|
+
│ 注册接口实现 │
|
|
49
|
+
└──────────┬───────────┘
|
|
50
|
+
│
|
|
51
|
+
▼
|
|
52
|
+
Layer 2:
|
|
53
|
+
┌──────────┴───────────┐
|
|
54
|
+
│ TASK-004 [draft] │
|
|
55
|
+
│ 登录接口实现 │
|
|
56
|
+
└──────────────────────┘
|
|
57
|
+
|
|
58
|
+
可并行执行组:
|
|
59
|
+
- 组 1: TASK-001, TASK-003 (无依赖,可同时开始)
|
|
60
|
+
- 组 2: TASK-002 (需等待组 1 完成)
|
|
61
|
+
- 组 3: TASK-004 (需等待组 2 完成)
|
|
62
|
+
|
|
63
|
+
建议执行顺序: TASK-001 → TASK-003 → TASK-002 → TASK-004
|
|
64
|
+
关键路径: TASK-001 → TASK-002 → TASK-004
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
### 4. 状态标注
|
|
68
|
+
|
|
69
|
+
按子任务状态标注:
|
|
70
|
+
- `[draft]` — 待启动
|
|
71
|
+
- `[in-progress]` — 进行中
|
|
72
|
+
- `[done]` — 已完成
|
|
73
|
+
- `[blocked]` — 被阻塞(附原因)
|
|
74
|
+
|
|
75
|
+
### 5. 多文件模式
|
|
76
|
+
|
|
77
|
+
当显示所有文件时,按文件分组输出,每个文件一个独立的 DAG。
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: 讨论文件中的 #NOTES 标记,对齐最优解后沉淀回原文
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# cf-task:note
|
|
6
|
+
|
|
7
|
+
与用户协作讨论文件中的 `#NOTES` 标记,对齐最优解后将结论沉淀回原文,删除标记。
|
|
8
|
+
|
|
9
|
+
支持两种文件类型:
|
|
10
|
+
- **任务文件**(`.md`):讨论任务中的实现细节问题
|
|
11
|
+
- **设计简报**(`.design.md`):讨论设计方案中的缺陷或待确认项
|
|
12
|
+
|
|
13
|
+
## 背景
|
|
14
|
+
|
|
15
|
+
用户在 review 文件时,直接在有问题的位置**就地标注** `#NOTES`,格式:
|
|
16
|
+
|
|
17
|
+
任务文件中:
|
|
18
|
+
```markdown
|
|
19
|
+
### Checklist
|
|
20
|
+
- [ ] 实现用户注册接口
|
|
21
|
+
- [ ] 密码加密存储 #NOTES 用 bcrypt 还是 argon2?
|
|
22
|
+
- [ ] 编写单元测试
|
|
23
|
+
|
|
24
|
+
### Description
|
|
25
|
+
实现 JWT 认证 #NOTES token 过期时间设多少合适?
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
设计简报中:
|
|
29
|
+
```markdown
|
|
30
|
+
## Database Design
|
|
31
|
+
|
|
32
|
+
### users 表
|
|
33
|
+
| Column | Type | Constraints | Notes |
|
|
34
|
+
|--------|------|-------------|-------|
|
|
35
|
+
| email | VARCHAR(255) | UNIQUE NOT NULL | 登录凭证 #NOTES 需要支持手机号登录吗? |
|
|
36
|
+
|
|
37
|
+
## API Design
|
|
38
|
+
|
|
39
|
+
### POST /auth/register
|
|
40
|
+
- Request: `{ email: string, password: string }` #NOTES 需要用户名字段吗?
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
`#NOTES` 是临时讨论标记,解决后必须消失,结论直接融入原文。
|
|
44
|
+
|
|
45
|
+
## 输入
|
|
46
|
+
|
|
47
|
+
- `/cf-task:note <file>` — 讨论指定文件中所有 `#NOTES`
|
|
48
|
+
- `/cf-task:note <file> TASK-001` — 只讨论指定子任务中的 `#NOTES`(仅限任务文件)
|
|
49
|
+
|
|
50
|
+
其中 `<file>` 可省略日期目录前缀和 `.md` 后缀。
|
|
51
|
+
|
|
52
|
+
查找逻辑:用 Glob 搜索 `.code-flow/tasks/**/<file>.md` 和 `.code-flow/tasks/**/<file>*.design.md`(`*` 兼容旧 `<file>.design.md` 与域后缀 `<file>.frontend.design.md` / `<file>.backend.design.md`),从结果中排除包含 `archived/` 的路径。如果匹配到多个结果(如全栈需求的前后端 design),输出警告列出所有匹配项,让用户指定要讨论的具体文件;如果只有一个结果,直接使用。
|
|
53
|
+
|
|
54
|
+
## 执行步骤
|
|
55
|
+
|
|
56
|
+
### 0. 判断文件类型
|
|
57
|
+
|
|
58
|
+
Read 读取匹配到的文件后,判断类型:
|
|
59
|
+
- 文件路径以 `.design.md` 结尾 → **设计简报模式**
|
|
60
|
+
- 其他 → **任务文件模式**
|
|
61
|
+
|
|
62
|
+
---
|
|
63
|
+
|
|
64
|
+
## 任务文件模式
|
|
65
|
+
|
|
66
|
+
### 1. 扫描 #NOTES 标记
|
|
67
|
+
|
|
68
|
+
1. 用 Glob 定位任务文件,Read 读取全文
|
|
69
|
+
2. 用正则扫描所有包含 `#NOTES` 的行,记录:
|
|
70
|
+
- 所在的子任务(`## TASK-xxx`)
|
|
71
|
+
- 所在的段落(Description / Checklist / 其他)
|
|
72
|
+
- 原始行内容
|
|
73
|
+
- `#NOTES` 后的问题描述
|
|
74
|
+
3. 如果没有找到 `#NOTES`,提示"无待讨论的标记",结束
|
|
75
|
+
|
|
76
|
+
输出扫描结果:
|
|
77
|
+
```
|
|
78
|
+
找到 3 个 #NOTES 标记:
|
|
79
|
+
|
|
80
|
+
TASK-001:
|
|
81
|
+
1. [Checklist] 密码加密存储 #NOTES 用 bcrypt 还是 argon2?
|
|
82
|
+
2. [Description] 实现 JWT 认证 #NOTES token 过期时间设多少合适?
|
|
83
|
+
|
|
84
|
+
TASK-002:
|
|
85
|
+
3. [Checklist] 调用支付 SDK #NOTES 用哪个版本的 SDK?
|
|
86
|
+
|
|
87
|
+
开始逐条讨论...
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
### 2. 加载上下文
|
|
91
|
+
|
|
92
|
+
1. 读取当前子任务的 `Source` 字段,解析章节引用
|
|
93
|
+
2. 用 Read 按行号范围读取详设文档的对应章节
|
|
94
|
+
3. 将详设上下文作为讨论背景
|
|
95
|
+
|
|
96
|
+
### 3. 逐条讨论
|
|
97
|
+
|
|
98
|
+
对每个 `#NOTES`,展示上下文并给出建议方案,与用户对话:
|
|
99
|
+
|
|
100
|
+
```
|
|
101
|
+
--- #NOTES 1/3 ---
|
|
102
|
+
位置: TASK-001 / Checklist
|
|
103
|
+
原文: 密码加密存储 #NOTES 用 bcrypt 还是 argon2?
|
|
104
|
+
|
|
105
|
+
详设参考 (§3.1 L95-L98):
|
|
106
|
+
"用户密码必须加密存储,推荐使用行业标准算法"
|
|
107
|
+
|
|
108
|
+
分析:
|
|
109
|
+
- bcrypt: 成熟稳定,生态支持好,Node.js 原生支持
|
|
110
|
+
- argon2: 更现代,抗 GPU 攻击更强,但依赖 C 编译
|
|
111
|
+
|
|
112
|
+
建议: bcrypt(项目技术栈为 Node.js,无需额外编译依赖)
|
|
113
|
+
|
|
114
|
+
是否采纳?或提出你的方案:
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
等待用户回应。
|
|
118
|
+
|
|
119
|
+
### 4. 沉淀结论并清除标记
|
|
120
|
+
|
|
121
|
+
用户确认方案后:
|
|
122
|
+
|
|
123
|
+
1. 用 Edit 将该行中的 `#NOTES xxx` 删除,并将结论融入原文
|
|
124
|
+
- 修改前:`- [ ] 密码加密存储 #NOTES 用 bcrypt 还是 argon2?`
|
|
125
|
+
- 修改后:`- [ ] 密码使用 bcrypt 加密存储`
|
|
126
|
+
2. 如果结论需要新增步骤 → 用 Edit 追加 Checklist 条目或补充 Description
|
|
127
|
+
3. 在 `### Log` 追加:`- [<当前日期>] resolved #NOTES: <结论摘要>`
|
|
128
|
+
|
|
129
|
+
**Edit 边界约束(必须遵守)**:
|
|
130
|
+
- `old_string` 必须严格限定在当前 TASK 段落内,**绝对禁止**匹配到 `---` 分隔线或下一个 `## TASK-xxx` 标题
|
|
131
|
+
- Log 追加时,`old_string` 只匹配 Log 段落的最后一行内容,不要向下延伸到段落外
|
|
132
|
+
- 如果 Log 是当前 TASK 的最后一个段落,其内容到 `---` 分隔线之前结束;`old_string` 不得包含 `---` 及其后的任何内容
|
|
133
|
+
- 示例(正确):`old_string = "- [2026-03-23] created (draft)"` → 只匹配 Log 末行
|
|
134
|
+
- 示例(错误):`old_string = "- [2026-03-23] created (draft)\n\n---\n\n## TASK-003"` → 越界,会删除下一个 TASK 标题
|
|
135
|
+
|
|
136
|
+
### 5. 完成检查
|
|
137
|
+
|
|
138
|
+
所有 `#NOTES` 讨论完毕后:
|
|
139
|
+
|
|
140
|
+
1. 再次扫描文件,确认无残留 `#NOTES` 标记
|
|
141
|
+
2. 如果子任务之前因 `#NOTES` 被标记为 `blocked`:
|
|
142
|
+
- 扫描 `### Log`,查找 `blocked` 记录中的原状态
|
|
143
|
+
- 用 Edit 恢复原状态
|
|
144
|
+
- 在 `### Log` 追加:`- [<当前日期>] unblocked (all #NOTES resolved, restored to <原状态>)`
|
|
145
|
+
3. 更新文件头 `Updated` 日期
|
|
146
|
+
|
|
147
|
+
### 6. 输出摘要
|
|
148
|
+
|
|
149
|
+
```
|
|
150
|
+
#NOTES 讨论完成: auth-module
|
|
151
|
+
|
|
152
|
+
已解决:
|
|
153
|
+
1. TASK-001 密码加密 → 使用 bcrypt
|
|
154
|
+
2. TASK-001 token 过期 → 设为 7 天,支持 refresh
|
|
155
|
+
3. TASK-002 SDK 版本 → 使用 v3.2.1
|
|
156
|
+
|
|
157
|
+
文件已更新,所有 #NOTES 标记已清除。
|
|
158
|
+
可执行 /cf-task:start auth-module 开始编码。
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
---
|
|
162
|
+
|
|
163
|
+
## 设计简报模式
|
|
164
|
+
|
|
165
|
+
### 1. 扫描 #NOTES 标记
|
|
166
|
+
|
|
167
|
+
1. Read 读取 `.design.md` 全文
|
|
168
|
+
2. 用正则扫描所有包含 `#NOTES` 的行,记录:
|
|
169
|
+
- 所在的章节(`## Goal` / `## Database Design` / `## API Design` 等)
|
|
170
|
+
- 原始行内容
|
|
171
|
+
- `#NOTES` 后的问题描述
|
|
172
|
+
3. 如果没有找到 `#NOTES`,提示"无待讨论的标记",结束
|
|
173
|
+
|
|
174
|
+
输出扫描结果:
|
|
175
|
+
```
|
|
176
|
+
找到 2 个 #NOTES 标记 (设计简报):
|
|
177
|
+
|
|
178
|
+
[Database Design]:
|
|
179
|
+
1. email 字段 #NOTES 需要支持手机号登录吗?
|
|
180
|
+
|
|
181
|
+
[API Design / POST /auth/register]:
|
|
182
|
+
2. Request schema #NOTES 需要用户名字段吗?
|
|
183
|
+
|
|
184
|
+
开始逐条讨论...
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
### 2. 加载上下文
|
|
188
|
+
|
|
189
|
+
设计简报本身就是设计文档,无需加载外部 Source。上下文来自:
|
|
190
|
+
|
|
191
|
+
1. 读取 `.design.md` 中该 `#NOTES` 所在章节的完整内容
|
|
192
|
+
2. 扫描代码库中与该问题相关的现有实现(如 Glob 搜索现有 model/route/middleware)
|
|
193
|
+
3. 将代码库上下文 + 设计文档上下文作为讨论背景
|
|
194
|
+
|
|
195
|
+
### 3. 逐条讨论
|
|
196
|
+
|
|
197
|
+
对每个 `#NOTES`,展示上下文并给出建议方案,与用户对话:
|
|
198
|
+
|
|
199
|
+
```
|
|
200
|
+
--- #NOTES 1/2 ---
|
|
201
|
+
位置: Database Design / users 表
|
|
202
|
+
原文: email 字段 #NOTES 需要支持手机号登录吗?
|
|
203
|
+
|
|
204
|
+
当前设计: users 表仅有 email 字段作为登录凭证
|
|
205
|
+
代码库参考: 现有 User model 无手机号字段,mailer 模块仅支持邮件
|
|
206
|
+
|
|
207
|
+
分析:
|
|
208
|
+
- 仅邮箱: 与现有 mailer 模块一致,MVP 足够
|
|
209
|
+
- 支持手机号: 需新增 phone 字段、SMS 服务依赖、双凭证登录逻辑
|
|
210
|
+
|
|
211
|
+
建议: 仅邮箱(与 Non-goals 中"保持 MVP 精简"一致,手机号可后续迭代)
|
|
212
|
+
|
|
213
|
+
是否采纳?或提出你的方案:
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
### 4. 沉淀结论并清除标记
|
|
217
|
+
|
|
218
|
+
用户确认方案后:
|
|
219
|
+
|
|
220
|
+
1. 用 Edit 将该行中的 `#NOTES xxx` 删除,并将结论融入原文
|
|
221
|
+
- 修改前:`| email | VARCHAR(255) | UNIQUE NOT NULL | 登录凭证 #NOTES 需要支持手机号登录吗? |`
|
|
222
|
+
- 修改后:`| email | VARCHAR(255) | UNIQUE NOT NULL | 登录凭证(仅邮箱,手机号后续迭代) |`
|
|
223
|
+
2. 如果结论影响其他章节(如 Database Design 的结论影响 API Design),同步更新相关章节
|
|
224
|
+
|
|
225
|
+
### 5. 完成检查
|
|
226
|
+
|
|
227
|
+
所有 `#NOTES` 讨论完毕后:
|
|
228
|
+
|
|
229
|
+
1. 再次扫描文件,确认无残留 `#NOTES` 标记
|
|
230
|
+
2. 无 Log 段落需更新(设计简报没有 Log)
|
|
231
|
+
|
|
232
|
+
### 6. 输出摘要
|
|
233
|
+
|
|
234
|
+
```
|
|
235
|
+
#NOTES 讨论完成: user-auth.design.md
|
|
236
|
+
|
|
237
|
+
已解决:
|
|
238
|
+
1. [Database Design] 登录凭证 → 仅邮箱,手机号后续迭代
|
|
239
|
+
2. [API Design] 注册接口 → 不加 username 字段,保持 email + password
|
|
240
|
+
|
|
241
|
+
文件已更新,所有 #NOTES 标记已清除。
|
|
242
|
+
可执行 /cf-task:plan .code-flow/tasks/2026-04-06/user-auth.design.md 拆解任务。
|
|
243
|
+
```
|