@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.
Files changed (99) hide show
  1. package/README.md +157 -0
  2. package/package.json +16 -0
  3. package/src/adapters/claude/CLAUDE.md +51 -0
  4. package/src/adapters/claude/commands/cf-init.md +262 -0
  5. package/src/adapters/claude/commands/cf-inject.md +55 -0
  6. package/src/adapters/claude/commands/cf-learn.md +291 -0
  7. package/src/adapters/claude/commands/cf-stats.md +86 -0
  8. package/src/adapters/claude/commands/cf-task/align.md +283 -0
  9. package/src/adapters/claude/commands/cf-task/archive.md +131 -0
  10. package/src/adapters/claude/commands/cf-task/block.md +30 -0
  11. package/src/adapters/claude/commands/cf-task/graph.md +73 -0
  12. package/src/adapters/claude/commands/cf-task/note.md +239 -0
  13. package/src/adapters/claude/commands/cf-task/plan.md +270 -0
  14. package/src/adapters/claude/commands/cf-task/prd.md +138 -0
  15. package/src/adapters/claude/commands/cf-task/start.md +173 -0
  16. package/src/adapters/claude/commands/cf-task/status.md +59 -0
  17. package/src/adapters/claude/commands/cf-validate.md +73 -0
  18. package/src/adapters/claude/settings.local.json +60 -0
  19. package/src/adapters/codex/AGENTS.md +51 -0
  20. package/src/adapters/codex/config.toml +3 -0
  21. package/src/adapters/codex/hooks.json +48 -0
  22. package/src/adapters/codex/skills/cf-init/SKILL.md +271 -0
  23. package/src/adapters/codex/skills/cf-inject/SKILL.md +56 -0
  24. package/src/adapters/codex/skills/cf-learn/SKILL.md +296 -0
  25. package/src/adapters/codex/skills/cf-stats/SKILL.md +87 -0
  26. package/src/adapters/codex/skills/cf-task-align/SKILL.md +284 -0
  27. package/src/adapters/codex/skills/cf-task-archive/SKILL.md +132 -0
  28. package/src/adapters/codex/skills/cf-task-block/SKILL.md +31 -0
  29. package/src/adapters/codex/skills/cf-task-graph/SKILL.md +74 -0
  30. package/src/adapters/codex/skills/cf-task-note/SKILL.md +236 -0
  31. package/src/adapters/codex/skills/cf-task-plan/SKILL.md +271 -0
  32. package/src/adapters/codex/skills/cf-task-prd/SKILL.md +139 -0
  33. package/src/adapters/codex/skills/cf-task-start/SKILL.md +174 -0
  34. package/src/adapters/codex/skills/cf-task-status/SKILL.md +60 -0
  35. package/src/adapters/codex/skills/cf-validate/SKILL.md +74 -0
  36. package/src/adapters/costrict/CLAUDE.md +51 -0
  37. package/src/adapters/costrict/commands/cf-init.md +262 -0
  38. package/src/adapters/costrict/commands/cf-inject.md +55 -0
  39. package/src/adapters/costrict/commands/cf-learn.md +291 -0
  40. package/src/adapters/costrict/commands/cf-stats.md +86 -0
  41. package/src/adapters/costrict/commands/cf-task/align.md +283 -0
  42. package/src/adapters/costrict/commands/cf-task/archive.md +131 -0
  43. package/src/adapters/costrict/commands/cf-task/block.md +30 -0
  44. package/src/adapters/costrict/commands/cf-task/graph.md +73 -0
  45. package/src/adapters/costrict/commands/cf-task/note.md +239 -0
  46. package/src/adapters/costrict/commands/cf-task/plan.md +270 -0
  47. package/src/adapters/costrict/commands/cf-task/prd.md +138 -0
  48. package/src/adapters/costrict/commands/cf-task/start.md +173 -0
  49. package/src/adapters/costrict/commands/cf-task/status.md +59 -0
  50. package/src/adapters/costrict/commands/cf-validate.md +73 -0
  51. package/src/adapters/costrict/settings.local.json +60 -0
  52. package/src/adapters/opencode/AGENTS.md +51 -0
  53. package/src/adapters/opencode/commands/cf-init.md +275 -0
  54. package/src/adapters/opencode/commands/cf-inject.md +59 -0
  55. package/src/adapters/opencode/commands/cf-learn.md +295 -0
  56. package/src/adapters/opencode/commands/cf-stats.md +90 -0
  57. package/src/adapters/opencode/commands/cf-task/align.md +287 -0
  58. package/src/adapters/opencode/commands/cf-task/archive.md +135 -0
  59. package/src/adapters/opencode/commands/cf-task/block.md +34 -0
  60. package/src/adapters/opencode/commands/cf-task/graph.md +77 -0
  61. package/src/adapters/opencode/commands/cf-task/note.md +243 -0
  62. package/src/adapters/opencode/commands/cf-task/plan.md +274 -0
  63. package/src/adapters/opencode/commands/cf-task/prd.md +142 -0
  64. package/src/adapters/opencode/commands/cf-task/start.md +177 -0
  65. package/src/adapters/opencode/commands/cf-task/status.md +63 -0
  66. package/src/adapters/opencode/commands/cf-validate.md +77 -0
  67. package/src/adapters/opencode/opencode.json +4 -0
  68. package/src/adapters/opencode/plugins/code-flow/index.js +132 -0
  69. package/src/adapters/opencode/plugins/code-flow/package.json +6 -0
  70. package/src/cli.js +810 -0
  71. package/src/core/code-flow/config.yml +159 -0
  72. package/src/core/code-flow/scripts/cf_checks.py +306 -0
  73. package/src/core/code-flow/scripts/cf_core.py +954 -0
  74. package/src/core/code-flow/scripts/cf_feedback.py +56 -0
  75. package/src/core/code-flow/scripts/cf_inject_hook.py +178 -0
  76. package/src/core/code-flow/scripts/cf_log.py +146 -0
  77. package/src/core/code-flow/scripts/cf_post_hook.py +196 -0
  78. package/src/core/code-flow/scripts/cf_scan.py +293 -0
  79. package/src/core/code-flow/scripts/cf_session_hook.py +42 -0
  80. package/src/core/code-flow/scripts/cf_stats.py +439 -0
  81. package/src/core/code-flow/scripts/cf_stop_hook.py +191 -0
  82. package/src/core/code-flow/scripts/cf_user_prompt_hook.py +402 -0
  83. package/src/core/code-flow/specs/backend/_map.md +56 -0
  84. package/src/core/code-flow/specs/backend/code-quality-performance.md +47 -0
  85. package/src/core/code-flow/specs/backend/database.md +39 -0
  86. package/src/core/code-flow/specs/backend/directory-structure.md +42 -0
  87. package/src/core/code-flow/specs/backend/logging.md +38 -0
  88. package/src/core/code-flow/specs/backend/platform-rules.md +43 -0
  89. package/src/core/code-flow/specs/frontend/_map.md +52 -0
  90. package/src/core/code-flow/specs/frontend/component-specs.md +56 -0
  91. package/src/core/code-flow/specs/frontend/directory-structure.md +41 -0
  92. package/src/core/code-flow/specs/frontend/quality-standards.md +46 -0
  93. package/src/core/code-flow/specs/shared/_map.md +57 -0
  94. package/src/core/code-flow/specs/shared/design/design-frontend.md +247 -0
  95. package/src/core/code-flow/specs/shared/design/design-full.md +494 -0
  96. package/src/core/code-flow/specs/shared/design/design-lite.md +293 -0
  97. package/src/core/code-flow/specs/shared/prd-template.md +187 -0
  98. package/src/core/code-flow/tasks/.gitkeep +0 -0
  99. package/src/core/code-flow/validation.yml +48 -0
@@ -0,0 +1,291 @@
1
+ # cf-learn
2
+
3
+ 自动扫描项目配置、代码模式和当前工作区变更,提炼有证据支撑的团队规范。输出先作为候选项给用户确认,再写入 `CLAUDE.md` 或 `.code-flow/specs/<domain>/`。
4
+
5
+ ## 输入
6
+
7
+ - `/project:cf-learn` - 全量扫描
8
+ - `/project:cf-learn <域>` - 仅扫描指定域,如 `scripts`、`cli`,以 `.code-flow/config.yml` 中实际域为准
9
+ - `/project:cf-learn --map` - 生成或更新 Retrieval Map
10
+ - `/project:cf-learn <域> --map` - 仅生成指定域的 Retrieval Map
11
+ - `/project:cf-learn --review` - 基于当前工作区变更提炼可沉淀规范,默认 staged + unstaged + untracked
12
+ - `/project:cf-learn --review --staged` - 仅分析 staged 变更
13
+
14
+ ## 核心原则
15
+
16
+ - 证据优先:只根据配置文件、CI、测试、代码重复模式、当前 diff,以及 `.session-log.jsonl` 的 `correction` 事件写候选规范,禁止编造不存在的团队规则。
17
+ - 用户确认优先:任何写入前都要展示候选项、目标文件、置信度、来源文件和证据片段。
18
+ - 低置信度不自动写入:单点样例、语义不稳定或只出现在临时代码中的模式,只作为观察项展示。
19
+ - 保持现有结构:优先匹配现有 domain、spec 文件和章节,不新增无必要文件;无法判断目标时询问用户。
20
+ - 贴合优先(learn 的目标):通用模板只是起点;learn 后要让规范贴近**项目真实做法**——证据印证的留、矛盾的改写、无证据的删减。替换/删除与新增同为候选,统一走确认门并展示 diff,绝不静默改写。
21
+
22
+ ## 执行流程(全量扫描)
23
+
24
+ 1. 建立扫描范围(§1)→ 2. 项目类型识别与域裁剪(§1.5)→ 3. 采集证据:配置 / 代码模式 / 多维度深读 / 纠正信号(§2)→ 4. 生成候选(§3)→ 5. 模板对账 reconcile(§3.5)→ 6. 选择写入目标(§4)→ 7. 用户确认(§5)→ 8. 写入:新增 / 改写 / 删减(§6)→ 9. Map 对账更新(§7)
25
+
26
+ `--map` 只跑 §7;`--review` 跳过全量,走 R1–R4。
27
+
28
+ ## 1. 建立扫描范围
29
+
30
+ 先读取 `.code-flow/config.yml`,确定 domain、spec 文件、map 文件和 `path_mapping`。如果配置不存在或不完整,只做只读扫描并提示先运行 `cf-init`。
31
+
32
+ 用 `rg --files` 或 `find` 收集配置和源码。进入扫描前必须构建 **统一排除集**:
33
+ - 默认排除:`.git/**`、`.code-flow/**`、`.claude/**`、`.costrict/**`、`.opencode/**`、`.codex/**`、`.agents/**`、`.codex_flow/**`、`node_modules/**`、`dist/**`、`build/**`、`coverage/**`、`.next/**`、`.venv/**`、`venv/**`、`__pycache__/**`
34
+ - 额外排除所有隐藏目录(名称以 `.` 开头),但保留白名单 `.github/workflows/**` 用于 CI 规则提取
35
+ - 从 `.gitignore` 追加排除模式,忽略空行和注释行
36
+ - 所有 `rg --files`、`rg` 和文件读取仅针对“未被排除”的路径执行
37
+
38
+ ## 1.5 项目类型识别与无关域裁剪
39
+
40
+ 全量扫描时(非 `--review`、非 `--map`)先识别项目实际类型,再对 `config.yml` 中已存在却无代码证据的内建域给出裁剪建议。目的:项目演进后(前端被移除、或 init 时误判为 fullstack)保持 specs 与真实技术栈一致,避免无关 spec 持续注入。
41
+
42
+ ### 1.5.1 检测项目类型
43
+
44
+ 复用与 cf-init 一致的信号做只读扫描(应用第 1 步的统一排除集):
45
+ - 前端框架依赖:`react`、`vue`、`@angular/core`、`svelte`、`next`、`nuxt`(读 package.json dependencies/devDependencies,不只看文件是否存在)
46
+ - 前端目录/文件:`src/components`、`src/pages`、`src/hooks`、`app/`、`pages/`、`components/`、`styles/`,及 `.tsx`/`.jsx`/`.vue`/`.svelte` 源码
47
+ - 后端框架依赖:Node(`express`、`fastify`、`koa`、`@nestjs/*`、`prisma`、`typeorm`)、Python(`pyproject.toml`/`requirements.txt` + `fastapi`/`django`/`flask`/`sqlalchemy`)、Go(`go.mod`、`cmd/`、`internal/`)、Rust/Java(`Cargo.toml`、`pom.xml`、`build.gradle`)
48
+ - 后端目录:`api/`、`services/`、`handlers/`、`controllers/`、`models/`、`migrations/`、`routes/`
49
+
50
+ 判定规则(与 cf-init 步骤 1 保持一致):
51
+ - 同时命中明确前端与后端信号 → `fullstack`
52
+ - 仅前端信号 → `frontend`
53
+ - 仅后端信号 → `backend`
54
+ - 无明确信号 → `generic`,不产生任何裁剪建议(保守)
55
+ - 用户自定义域(如 `cli`、`scripts`、`infra`、`mobile`)不参与前后端判定,**永不**作为裁剪候选
56
+
57
+ ### 1.5.2 域漂移检测
58
+
59
+ 把 `config.yml` 中的内建域(`frontend`/`backend`)与检测结果对比:
60
+ - 域有 specs 但检测类型不含它(如存在 `frontend/` 但项目判为 `backend`)→ 标记为**裁剪候选**
61
+ - 检测到某类型却缺对应域 specs(如检测到 `frontend` 但无 `frontend/` 目录)→ 标记为**补全建议**,提示运行 `cf-init <type>`;cf-learn 不自行 scaffold
62
+ - **注入覆盖漂移**:检测到的前端源码类型(如 `.vue`/`.svelte`/`.tsx`)若未被 `config.yml` 的 `frontend.patterns` 覆盖 → 标记为**补全建议**,提示在 patterns 追加对应类型(走确认门,不自行改写);否则编辑这些文件时拿不到注入
63
+ - 检测为 `fullstack` / `generic`:不产生裁剪候选
64
+
65
+ 只有当**整个域无任何代码证据**才建议裁剪;单文件缺失不触发。宁可漏报不可误删。
66
+
67
+ ### 1.5.3 裁剪确认与执行
68
+
69
+ 展示裁剪候选与受影响文件清单,等待用户确认(与第 5 步同一道确认门):
70
+
71
+ ```text
72
+ 项目类型识别:backend(证据:pyproject.toml + fastapi;无任何前端框架/目录信号)
73
+
74
+ 检测到无关域 frontend,建议裁剪:
75
+ - config.yml: 删除 path_mapping.frontend
76
+ - validation.yml: 删除 TypeScript 类型检查 / ESLint / 前端单元测试
77
+ - 删除目录 .code-flow/specs/frontend/(N 个文件)
78
+
79
+ 确认裁剪?(yes 执行 / no 仅保留建议 / 输入编号选择性删除):
80
+ ```
81
+
82
+ 用户确认后执行:
83
+ - 安全编辑 `config.yml`,删除该域的 `path_mapping.<域>` 及相关字段,保留其余结构与用户自定义
84
+ - 删除 `validation.yml` 中该技术栈无关的 validator,保持 YAML 结构与用户修改
85
+ - 删除 `.code-flow/specs/<域>/` 目录及其文件
86
+
87
+ 裁剪是破坏性操作:必须先展示完整文件清单,未确认不得删除;用户输入 `no` 时只在输出摘要保留建议,不改动任何文件。
88
+
89
+ ## 2. 采集证据
90
+
91
+ 读取存在的配置文件并记录证据来源:
92
+ - 前端:`.eslintrc*`、`eslint.config.*`、`tsconfig.json`、`.prettierrc*`、`tailwind.config.*`、`next.config.*`、`nuxt.config.*`、`vite.config.*`、`jest.config.*`、`vitest.config.*`
93
+ - 后端:`pyproject.toml`、`setup.cfg`、`tox.ini`、`.golangci.yml`、`Makefile`、`Dockerfile`、`docker-compose.yml`
94
+ - 通用:`.github/workflows/*.yml`、`.gitlab-ci.yml`、`.editorconfig`、`.gitignore`、`package.json`
95
+
96
+ 用 `rg` 搜索代码模式:
97
+ - 错误处理:`try/except`、`catch`、自定义 Error、显式返回错误
98
+ - 日志:日志库、字段结构、stdout/stderr 使用边界
99
+ - 测试:测试框架、断言风格、fixture、mock、覆盖率入口
100
+ - 导入与模块:alias、相对路径、barrel export、入口文件
101
+ - 命名与组织:文件命名、目录分层、组件/服务/脚本边界
102
+
103
+ 每条候选都必须保留来源文件和证据片段,证据片段只截取能支撑判断的最小内容。
104
+
105
+ 全量扫描还必须消费 `.code-flow/.session-log.jsonl` 的 `correction` 事件(最高价值证据,处理细节见末尾「纠正信号源」)——它直接反映用户纠正过 agent 的真实偏好。
106
+
107
+ ### 2.1 多维度深读(让总结贴合项目)
108
+
109
+ 只靠 rg 命中关键字不足以总结贴切的规范。每个保留域必须多维度抽样**精读代表性源码**,覆盖以下角度后再下判断:
110
+
111
+ - 入口与分层:入口文件 + 每层(如 api/service/model)各 1–2 个代表文件,核对真实分层是否与模板假设一致
112
+ - 错误处理:真实 try/except、catch、自定义异常/错误码的统一程度
113
+ - 测试:框架、断言风格、覆盖范围、fixture/mock 习惯
114
+ - 命名与组织:文件/目录/符号命名的实际惯例
115
+ - 依赖与配置:真实依赖清单、lint/type/格式化配置的实际严格度
116
+ - 数据流:读通一条真实请求/调用链路
117
+ - 前端专项(检测到前端域时):组件分层(容器/展示是否分离)、数据获取是否收口在 `services/`、复用是否提取为 hook/composable、样式是否与逻辑/请求分离(CSS Modules/token vs 内联魔法值)
118
+
119
+ 纪律:每个维度至少读 2 个真实文件再下结论,单文件样例只算低置信度;读取量按项目规模自适应(小项目读全、大项目每层抽样),但每条写入/改写/删减候选都必须能指向具体文件证据。
120
+
121
+ ## 3. 生成候选规范
122
+
123
+ 候选项格式:
124
+
125
+ ```text
126
+ [动作: 新增|改写|删减|保留] [置信度: 高|中|低] [来源: <file>] [目标: <target-file>] <规范描述>
127
+ 证据: <短片段或 diff 摘要>
128
+ 原因: <为什么这会影响 AI 生成代码>
129
+ ```
130
+
131
+ 置信度判断:
132
+ - 高:配置、CI 或测试明确要求,或同一模式在多个相关文件中重复出现
133
+ - 中:单个模块内稳定出现,且与目录结构、测试或调用链相互印证
134
+ - 低:只有单点样例、上下文不足或可能只是临时实现;默认不勾选写入
135
+
136
+ 过滤规则:
137
+ - 与 `CLAUDE.md` 和现有 spec 已覆盖的内容去重,已覆盖项只标记 `[已覆盖]`
138
+ - 忽略纯格式化细节,除非 formatter 配置会影响生成代码结构
139
+ - 不把框架默认行为写成团队规范,除非项目配置显式覆盖或代码中反复体现
140
+
141
+ 机检草稿(checks):可机检的新规则(能用正则 / 简单模式判定,如禁 `print`、禁裸 `except`、禁 `any`)一律附 `checks` 草稿(`id`/`type`/`pattern`/`files`/`message`)写入目标 spec 的 frontmatter;不可机检的只写正文。
142
+
143
+ 前端规则同样生成 checks 草稿(如组件内裸 `fetch`/`axios`、列表 `key={index}`、`: any`)。**精度护栏**:`checks.files` 用 `fnmatch` 匹配相对路径且 `*` 跨 `/`,组件类检查须按路径作用域(`*components*`/`*pages*`)避免误伤允许 fetch 的 `services/` 层;框架语法差异(JSX `key={index}` vs Vue `:key="index"`)用多条 check + 不同 `files` 分别覆盖。
144
+
145
+ ## 3.5 模板条目对账(reconcile)
146
+
147
+ 在保留的域内,把**每条现有 spec 条目**(尤其模板起点的通用 / house-style 规则)与第 2 步的多维度证据对账,分四类处理:
148
+
149
+ | 分类 | 判定 | 处理 |
150
+ |------|------|------|
151
+ | 证实 | 代码反复印证 | 保留,不动 |
152
+ | 矛盾 | 代码真实做法与规则相反 | 候选**改写**为项目真实做法(附冲突文件证据) |
153
+ | 无证据 | 模板通用条文,项目无任何相关代码 / 配置 | 候选**删减** |
154
+ | 缺失 | 代码稳定存在但 spec 未写 | 候选**新增**(走第 3 步) |
155
+
156
+ 判定纪律:
157
+ - 矛盾 / 删减必须有**多个文件一致证据**,单点样例不触发,防误删 house-style
158
+ - 改写优先于删除:能修正成项目真实写法的就改写,纯属无关的才删
159
+ - 拿不准(可能是规范领先于现状的"应然"要求)时标「待确认」交用户,不直接删——规范允许领先现状
160
+
161
+ ## 4. 选择写入目标
162
+
163
+ 按内容路由到目标文件,目标文件名以实际 `.code-flow/config.yml` 和现有 spec 为准:
164
+ - 全局原则、禁忌、验证命令、跨域规则 -> `CLAUDE.md`
165
+ - 目录、模块边界、入口文件、数据流 -> `directory-structure.md`
166
+ - 前端组件、hook、样式、状态管理 -> `component-specs.md`
167
+ - 类型、lint、测试、错误处理、导入规则 -> `quality-standards.md`
168
+ - 数据库、ORM、migration、schema、query -> `database.md`
169
+ - 日志、观测、审计字段 -> `logging.md`
170
+ - API、部署、配置、版本兼容 -> `platform-rules.md`
171
+ - 性能、缓存、重试、异常、测试策略 -> `code-quality-performance.md`
172
+
173
+ 如果目标 domain 或 spec 文件不存在,不要创建猜测文件;把候选标为“需用户选择目标”。
174
+
175
+ ## 5. 用户确认
176
+
177
+ 按 domain 分组展示候选:
178
+
179
+ ```text
180
+ 扫描发现以下未记录的规范候选:
181
+
182
+ 全局(建议写入 CLAUDE.md):
183
+ 1. [x] [高] [pyproject.toml] 所有测试通过 pytest 运行
184
+
185
+ cli(建议写入 .code-flow/specs/cli/quality-standards.md):
186
+ 2. [x] [中] [tests/test_cli_init.py] init 行为必须有回归测试
187
+ 3. [ ] [低] [src/example.js] 单点命名习惯,暂不建议写入
188
+
189
+ 确认要写入的条目(编号、all、none,或修改目标文件):
190
+ ```
191
+
192
+ 对账候选(改写 / 删减)单独成组,每项附**原文 + 拟替换文本**的 diff 预览;删改与新增一同确认。
193
+
194
+ 等待用户确认后再编辑。
195
+
196
+ ## 6. 写入
197
+
198
+ 追加到目标文件的相近章节:
199
+ - 规则类 -> Rules、Core Principles、Constraints 或同义章节
200
+ - 模式类 -> Patterns、Conventions、Implementation Notes 或同义章节
201
+ - 禁忌类 -> Anti-Patterns、Forbidden Patterns 或同义章节
202
+
203
+ 保持原文件风格,不重排无关内容。
204
+
205
+ 对账确认的条目,除追加外还要执行替换 / 删除(破坏性,编辑前展示 diff,未确认不得动):
206
+ - 改写:替换原条目所在行,保留章节其余内容
207
+ - 删减:删除该条目行及其紧邻的从属证据行
208
+
209
+ 写入后输出文件、新增 / 改写 / 删减条目数量。
210
+
211
+ ## 7. Retrieval Map
212
+
213
+ 当传入 `--map`、检测到 `_map.md` 仍含初始占位符,或全量扫描发现 `_map` 与真实结构漂移(Module Map 缺失已存在目录、或列出的文件/层已不存在)时,生成/更新 map:
214
+ - Purpose:来自 README、package metadata 或入口注释
215
+ - Architecture:来自依赖、配置、目录和入口文件
216
+ - Key Files:只列出实际存在并读取过的核心文件
217
+ - Module Map:基于真实目录结构,不列空目录
218
+ - Data Flow:只写能从调用链、路由或脚本入口推断出的流向
219
+ - Navigation Guide:写“做 X 去哪里”的可执行导航
220
+
221
+ 更新前展示 diff 摘要。已有人工内容要保留,只补充缺失或明显过期的段落。
222
+
223
+ ## --review 模式:基于当前工作区变更提炼规范
224
+
225
+ 传入 `--review` 时跳过全量扫描,专注当前工作区变更。
226
+
227
+ ### R1. 采集变更范围
228
+
229
+ 运行:
230
+
231
+ ```bash
232
+ git diff --name-only
233
+ git diff --cached --name-only
234
+ git ls-files --others --exclude-standard
235
+ ```
236
+
237
+ `--review --staged` 只使用 `git diff --cached --name-only`。合并去重后应用统一排除集,仅保留代码、测试、配置和会影响规范的脚本文件。
238
+
239
+ ### R2. 读取变更证据
240
+
241
+ 对候选文件读取:
242
+
243
+ ```bash
244
+ git diff -- <file>
245
+ git diff --cached -- <file>
246
+ ```
247
+
248
+ untracked 文件读取完整内容。每个候选规范必须附带来源文件和证据片段。
249
+
250
+ ### R3. 提炼与去重
251
+
252
+ 从当前工作区变更中提炼稳定模式:
253
+ - 新增强约束:测试、校验、错误处理、协议输出、兼容性边界
254
+ - 新增推荐模式:目录组织、接口分层、复用 helper、命名习惯
255
+ - 新增禁忌:静默异常、重复解析、非 JSON hook stdout、硬编码路径或 secret
256
+
257
+ 与现有 spec 和 `CLAUDE.md` 对比,已覆盖项不再写入。按置信度排序,低置信度默认不选。
258
+
259
+ ### R4. 确认与写入
260
+
261
+ 展示目标文件、置信度、来源文件、证据片段和建议文本。用户确认后按第 6 步写入。
262
+
263
+ ## 纠正信号源(quality_loop.correction_capture,v0.5)
264
+
265
+ `.code-flow/.session-log.jsonl` 中的 `correction` 事件是最高价值证据——用户在对话中纠正过 agent 的行为(修正经对话发生,不依赖人工改代码)。全量与 `--review` 模式都应消费此信号源:
266
+
267
+ ### C1. 读取与配对
268
+
269
+ 1. 读取近 30 天 `correction` 事件(JSONL 逐行解析,损坏行跳过)
270
+ 2. 对每条 correction,按"同 `sid` 且日志顺序在其后 5 个事件内"的 `edit` 事件配对——配对成功即"纠正原因 + agent 修正改动"证据对
271
+ 3. 修正文件用 `git log -p -- <file>` 或当前内容截取相关段,组成 ❌(纠正前问题)/ ✅(修正后写法)对照
272
+ 4. 纯讨论无后续 edit 的 correction 仅保留语句信号,不强行配对
273
+
274
+ ### C2. 聚合与候选
275
+
276
+ - 同类纠正(phrase 相近 + 同 domain)聚合计数;**单次信号不生成候选**(阈值 ≥2,防句式误判噪音)
277
+ - 候选格式:规则文本 + ✅/❌ 对照示例 + 可机检时附 `checks` 草稿(id/type/pattern/message,写入目标 spec 的 frontmatter)+ 纠正原文与次数
278
+ - 置信度:同类 ≥3 次为高、2 次为中;低置信度默认不选
279
+ - 仍需用户确认才落盘(与第 5 步一致)
280
+
281
+ ## 输出摘要
282
+
283
+ ```text
284
+ cf-learn 完成:
285
+ - 扫描文件:N | 纠正信号:K 条(配对成功 J 对)
286
+ - 项目类型:<type>(裁剪域 D / 补全建议 E)
287
+ - 对账:改写 R / 删减 P / 保留 S 条
288
+ - 候选规范:M(高 X / 中 Y / 低 Z)
289
+ - 写入:CLAUDE.md +A,<domain>/<spec>.md +B(含 checks 草稿 C 条)
290
+ - Map 更新:<domain>/_map.md
291
+ ```
@@ -0,0 +1,86 @@
1
+ # cf-stats
2
+
3
+ 统计规范体系的 token 使用情况(各文件分布、预算利用率、压缩与 quality_loop 健康度);`--audit` 附带规范质量审计。
4
+
5
+ > 原 `cf-scan` 已并入本命令:质量审计(冗长/冗余/过时/缺描述 + 待复审清单)改用 `/project:cf-stats --audit`。
6
+
7
+ ## 输入
8
+
9
+ - `/project:cf-stats` — 完整统计
10
+ - `/project:cf-stats --human` — 人类可读格式
11
+ - `/project:cf-stats --domain=frontend` — 仅统计指定领域
12
+ - `/project:cf-stats --audit` — 附带规范质量审计(冗长/冗余/过时/缺描述)与待复审清单
13
+
14
+ ## 执行步骤
15
+
16
+ ### 1. 调用 Python 脚本
17
+
18
+ 用 Bash 执行:
19
+
20
+ ```bash
21
+ python3 .code-flow/scripts/cf_stats.py [--human] [--domain=frontend] [--audit]
22
+ ```
23
+
24
+ 将用户传入的参数原样透传。
25
+
26
+ ### 2. 解析输出
27
+
28
+ 解析 stdout 的 JSON 输出,格式如下:
29
+
30
+ ```json
31
+ {
32
+ "l0": {"file": "CLAUDE.md", "tokens": 650, "budget": 800},
33
+ "l1": {
34
+ "frontend": [
35
+ {"path": "frontend/directory-structure.md", "tokens": 180, "tokens_raw": 200, "tokens_compressed": 180, "saved_pct": 10.0}
36
+ ],
37
+ "backend": [
38
+ {"path": "backend/database.md", "tokens": 200, "tokens_raw": 230, "tokens_compressed": 200, "saved_pct": 13.0}
39
+ ]
40
+ },
41
+ "total_tokens": 1580,
42
+ "total_budget": 2500,
43
+ "utilization": "63%",
44
+ "compression_summary": {"total_raw": 1820, "total_compressed": 1580, "total_saved_pct": 13.2}
45
+ }
46
+ ```
47
+
48
+ 每个 spec 的 `tokens` 为压缩后 token(参与预算计算);`tokens_raw` 为压缩前、`saved_pct` 为节约率。`compression_summary` 为全域聚合。
49
+
50
+ ### 3. 格式化输出
51
+
52
+ 将 JSON 格式化为人类可读的统计信息:
53
+
54
+ ```
55
+ L0 (CLAUDE.md): ~650 / 800 tokens
56
+
57
+ L1 Frontend:
58
+ - directory-structure.md: ~180 tokens (raw=200→compressed=180, -10.0%)
59
+
60
+ L1 Backend:
61
+ - database.md: ~200 tokens (raw=230→compressed=200, -13.0%)
62
+
63
+ Total: ~1580 / 2500 tokens (63%)
64
+ COMPRESSION: 1820 → 1580 (-13.2%)
65
+ ```
66
+
67
+ ### 4. 质量审计(仅 `--audit`)
68
+
69
+ 传入 `--audit` 时,JSON 额外含 `audit` 字段,human 模式额外输出 `AUDIT` 段:
70
+
71
+ ```json
72
+ "audit": {
73
+ "files": [{"path": "specs/backend/database.md", "issues": ["冗长: 620 tokens", "冗余: '...' 出现于 3 个文件"]}],
74
+ "review": [{"item": "specs/frontend/x.md", "reason": "30 天未命中注入/未触发检查"}]
75
+ }
76
+ ```
77
+
78
+ - `audit.files`:仅列出有质量问题的 spec(冗长 >500 token / 跨文件冗余 / 死链过时 / 缺 frontmatter description / checks 标注错误)
79
+ - `audit.review`:待复审清单(长期未命中注入 / 已自动停用 / 反复误报的规则)
80
+
81
+ 格式化为表格,无问题时输出"无规范质量问题"。不传 `--audit` 时提示用户可加 `--audit` 查看。
82
+
83
+ ## 异常处理
84
+
85
+ - `.code-flow/` 不存在 → 提示运行 `/project:cf-init`
86
+ - Python 脚本执行失败 → 输出错误信息,建议检查 Python 环境
@@ -0,0 +1,283 @@
1
+ # cf-task:align
2
+
3
+ 从需求出发,通过结构化对话产出设计简报(`.design.md`),为 `cf-task:plan` 提供足够丰富的输入。支持三种输入:纯文本需求、`.prd.md` 产品需求文档、`.design.md` 草稿。
4
+
5
+ ## 输入
6
+
7
+ - `/cf-task:align "需求描述"` — 从需求描述新建设计简报
8
+ - `/cf-task:align <.prd.md 路径>` — 基于已有 PRD 派生设计简报(推荐路径)
9
+ - `/cf-task:align <.design.md 路径>` — 恢复已有草稿继续讨论
10
+ - `/cf-task:align` — 交互式,先问用户要做什么
11
+
12
+ ## 执行步骤
13
+
14
+ ### 1. 确定模式
15
+
16
+ 按参数类型识别(顺序判断,优先匹配更具体的后缀):
17
+
18
+ | 参数形态 | 模式 | 行为 |
19
+ |---------|------|------|
20
+ | 已存在的 `.design.md` 文件 | **恢复模式** | Read 读取,展示当前内容,询问调整点,进入 Step 3 |
21
+ | 已存在的 `.prd.md` 文件 | **PRD 派生模式** | Read PRD,执行 Step 2.6 预填充维度,Step 3 只补技术维度 |
22
+ | 已存在的其他 `.md` 文件 | **新建模式(带上下文)** | Read 作为参考材料,进入 Step 2 |
23
+ | 纯文本字符串 | **新建模式** | 以文本作为初始需求,进入 Step 2 |
24
+ | 无参数 | **交互模式** | 询问"要实现什么功能?",进入 Step 2 |
25
+
26
+ ### 2. 代码库上下文扫描
27
+
28
+ 快速了解项目现状,为后续建议提供依据:
29
+
30
+ 1. 用 Glob 检查 `.code-flow/specs/*/_map.md` 是否存在,若有则 Read 读取(了解项目结构)
31
+ 2. 检测技术栈:Read `package.json` / `requirements.txt` / `go.mod` / `pyproject.toml` 等(取存在的)
32
+ 3. 用 Glob 扫描与需求相关的现有代码目录,了解已有模式
33
+
34
+ 目的:**让后续建议基于实际代码库**,而非泛泛的通用建议。
35
+
36
+ ### 2.5. 识别需求类型,选择维度
37
+
38
+ 根据需求描述和代码库上下文,判断本次工作的性质,选择适用的讨论维度。
39
+
40
+ **模板选择规则**:
41
+ - **design-lite.md** — 后端/通用,简单:功能开发(简单) | CLI/脚本 | Bug修复 | 小型重构
42
+ - **design-full.md** — 后端/通用,复杂:跨系统集成 | 性能优化 | 架构演进 | 中大型功能开发
43
+ - **design-frontend.md** — 前端:页面/组件/交互/UI 功能开发
44
+
45
+ **域识别(依 Step 2 代码库扫描自动判断,不需用户指定)**:
46
+ - 涉前端(检测到 frontend 域 / `.tsx`·`.jsx`·`.vue`·`.svelte` 源码 / UI·组件·页面·样式类需求)→ 用 design-frontend.md 产出前端设计
47
+ - 涉后端/通用 → 按复杂度用 design-lite / design-full(默认 lite,复杂或用户要求时 full)
48
+ - **全栈需求** → 前后端各产出一份(见 Step 5 按域后缀命名)
49
+
50
+ **模板路径**:
51
+ - Lite: `.code-flow/specs/shared/design/design-lite.md`
52
+ - Full: `.code-flow/specs/shared/design/design-full.md`
53
+ - Frontend: `.code-flow/specs/shared/design/design-frontend.md`
54
+
55
+ 先读取对应模板文件作为生成基准。
56
+
57
+ **核心维度(所有类型必选)**:
58
+ - 目标与边界
59
+ - 技术方案
60
+ - 约束条件
61
+ - 验收标准
62
+
63
+ **扩展维度(按需选择,不适用则跳过)**:
64
+ - 数据模型 — 涉及数据库/存储变更时
65
+ - 接口设计 — 涉及 API / CLI / 函数入口变更时
66
+ - 性能与容量 — 命中性能敏感信号时(写路径 / 高频调用 / 大数据量或列表查询 / 循环内 IO / 外部依赖 / 并发)
67
+
68
+ 常见需求类型与维度匹配:
69
+
70
+ | 需求类型 | 数据模型 | 接口设计 | 技术方案侧重 |
71
+ |----------|---------|---------|-------------|
72
+ | 功能开发(含 API) | ✓ | ✓ API | 组件设计、第三方库选型 |
73
+ | 功能开发(纯后台) | 视情况 | 视情况 | 模块结构、算法/流程、数据流 |
74
+ | CLI 命令/脚本 | — | ✓ CLI | 命令结构、参数、输出格式 |
75
+ | 重构 | — | — | 变更范围、迁移路径、兼容性 |
76
+ | 性能优化 | — | — | 瓶颈分析、优化策略、度量指标 |
77
+ | 定时任务/队列 | 视情况 | — | 调度策略、失败处理、幂等性 |
78
+ | 日志/监控 | — | — | 采集点、指标定义、告警规则 |
79
+ | 构建/CI | — | — | 流水线设计、触发条件、产物 |
80
+ | 缺陷修复 | 视情况 | 视情况 | 根因分析、修复方案、回归范围 |
81
+
82
+ > 上表仅供参考,AI 应根据实际需求灵活判断,不机械套用。
83
+
84
+ ### 2.6. PRD 派生处理(仅 PRD 派生模式)
85
+
86
+ 从 PRD 各章节提取结构化信息,映射到设计维度作为 Step 3 的预填充上下文:
87
+
88
+ | PRD 章节 | 映射到设计维度 | 处理方式 |
89
+ |---------|--------------|---------|
90
+ | §2 背景与目标 | 目标与边界(问题/目标) | 直接继承 |
91
+ | §3 用户与场景(含 US-XX) | 目标与边界(用户) | 继承用户画像;US 列表用于 FEAT 追溯 |
92
+ | §4 功能需求(FEAT-XX) | 功能方案(FEAT 清单) | 继承 FEAT 清单与优先级;保留 US→FEAT 来源映射 |
93
+ | §5 非功能需求 | 约束条件(性能/安全/兼容) | 直接继承 |
94
+ | §6 范围与边界 | 目标与边界(In/Out Scope) | 直接继承 |
95
+ | §7 依赖与风险 | 风险与依赖 | 直接继承 |
96
+
97
+ **需向用户呈现的摘要**:
98
+ ```
99
+ 已从 PRD 解析:
100
+ - 功能 N 个(P0: X, P1: Y)
101
+ - 用户故事 M 个
102
+ - 非功能约束 K 条
103
+ - 范围内/外清单已继承
104
+
105
+ 本轮将聚焦技术维度:数据模型 / 接口设计 / 技术方案
106
+ PRD 已覆盖的维度如无需调整,将直接使用。
107
+ ```
108
+
109
+ **关键约束**:
110
+ - Step 3 中已从 PRD 获得充分信息的维度**不重复提问**,除非用户主动修改
111
+ - design 中 FEAT 的"来源"列必须引用 PRD 中对应的 US-XX
112
+
113
+ ### 3. 交互式细化
114
+
115
+ 围绕选中的维度逐步推进,**每轮提 2-3 个问题**(不要一次性抛 10 个问题):
116
+
117
+ **目标与边界**(必选;PRD 派生模式下已覆盖,只需用户确认)
118
+ - 解决什么问题?为谁?
119
+ - 做什么?(核心功能列表)
120
+ - 不做什么?(明确排除项)
121
+
122
+ **数据模型**(涉及数据库/存储变更时)
123
+ - 需要哪些表/集合?
124
+ - 字段、类型、约束、索引?
125
+ - 与现有模型的关系?(外键、关联)
126
+ - 性能敏感时:高频查询的索引、分页/游标、避免全表扫描、读写热点
127
+
128
+ **接口设计**(涉及 API / CLI / 函数入口时)
129
+
130
+ API 场景:
131
+ - 哪些 endpoint?请求/响应格式?错误码?
132
+
133
+ CLI 场景:
134
+ - 命令名称和子命令?参数和 flag?输出格式?
135
+
136
+ 内部函数入口场景:
137
+ - 公开接口签名?输入输出类型?错误处理约定?
138
+
139
+ 性能敏感时:批量接口优先于循环单调、分页/游标、避免 over-fetch、可缓存性
140
+
141
+ **技术方案**(必选,内容随需求类型变化)
142
+ - 性能敏感路径:正确性满足后按最优性能取向选型——算法/数据结构复杂度、IO/查询次数(杜绝 N+1)、能否批量/缓存/异步、同步阻塞点;记录所选方案的性能依据与放弃的较慢方案
143
+ - 功能开发:关键组件、模块结构、第三方库选型、与现有架构集成方式
144
+ - 重构:变更范围、分步迁移路径、向后兼容策略
145
+ - 性能优化:瓶颈定位、优化策略、性能度量方式
146
+ - 定时任务:调度策略、失败重试、幂等性保证
147
+ - 日志/监控:采集点、指标定义、告警阈值
148
+ - 构建/CI:流水线阶段、触发条件、产物和部署
149
+ - 缺陷修复:根因分析、修复方案、回归测试范围
150
+
151
+ **性能与容量**(命中性能敏感信号时;否则一句"无性能敏感点,跳过")
152
+ - 负载量级?(QPS / 数据规模 / 并发;有实测用数据,无则给量级估计,禁止编造)
153
+ - 延迟 / 吞吐目标?热点路径在哪?
154
+ - 潜在瓶颈与应对策略?(索引 / 分页 / 缓存 / 批量 / 异步 / 连接池 / 算法复杂度)
155
+ - 选定方案为什么最优?放弃了哪个更慢的方案?
156
+
157
+ **约束条件**(必选;PRD 派生模式下已从 NFR 继承)
158
+ - 技术栈、性能要求、兼容性、时间线等
159
+
160
+ **验收标准**(必选)
161
+ - 怎么判断做完了?正常 / 异常场景各列至少一条
162
+ - 可验证、可转为自动化测试断言的条件(明确输入与可观测输出);场景 ID(S-/E-/B-)即测试用例来源
163
+
164
+ **妥协与技术债**(按需)
165
+ - 本次有意接受的取舍或欠债?后续偿还设想?
166
+
167
+ **交互原则**:
168
+ - 基于 Step 2 扫描到的代码库上下文**提出具体默认建议**,而非空泛提问
169
+ - **性能敏感路径上方案按最优性能设计**:择优于更低复杂度、更少 IO/查询、可批量/缓存/异步的方案,并记录"为什么更快、放弃了哪个更慢方案";非敏感路径不过早优化
170
+ - **初始需求、PRD 或参考材料中已明确的维度不重复提问**,只就缺失或模糊处发问
171
+ - 每轮回答后更新理解,追问细节或推进到下一个维度
172
+ - 涉及数据库和接口的维度**必须具体到表结构和请求/响应 schema**
173
+ - 不涉及数据库和接口时,**不要强制展开这些维度**
174
+ - PRD 派生模式下,已从 PRD 覆盖的维度不再提问;用户主动要求调整除外
175
+ - 用户说"你定"或"随意"时,根据代码库上下文选择最合理的默认方案,明确告知用户采用了什么
176
+ - 输出语言默认与用户需求语言保持一致;若用户未明确指定语言,默认使用中文生成完整设计简报(标题、正文、表头均为中文)
177
+ - 仅当用户明确要求英文或项目已有强约定要求英文文档时,才输出英文;避免中英混杂
178
+
179
+ **中断恢复**:在进入 Step 3 之前**提前确定文件路径**(Step 5 的命名与目录逻辑)。当任意两个维度已有实质内容时,立即写入草稿文件。后续每轮对话更新同一文件。这样即使会话中断,进度不会丢失。
180
+
181
+ ### 4. 基于模板生成设计简报
182
+
183
+ 选中的维度都有实质内容后,基于 Step 2.5 选择的模板文件生成设计简报。
184
+
185
+ **操作步骤**:
186
+ 1. 用 Read 读取选定的模板文件(design-lite.md 或 design-full.md)
187
+ 2. 按照模板章节结构,将 Step 3 中收集的内容填入对应位置
188
+ 3. **只包含适用的章节**,模板中有但需求不涉及的章节跳过
189
+ 4. 用 `{}` 占位符替换为实际内容
190
+ 5. PRD 派生模式:功能清单的"来源"列填 PRD 中对应的 US-XX
191
+ 6. 展示生成的设计简报
192
+
193
+ **章节映射**(Lite 模板,对应 `design-lite.md` 实际章节):
194
+
195
+ | 模板章节 | 内容来源 |
196
+ |---------|---------|
197
+ | 1. 文档控制 | 自动生成(修订历史 v0.1) |
198
+ | 2.1 需求概述 | Step 3 的"目标与边界"(PRD 派生时继承自 PRD §2) |
199
+ | 2.2 功能方案 | Step 3 的功能清单 + 字段约束(FEAT 继承自 PRD §4,"来源"列填 US-XX) |
200
+ | 2.3 范围与边界 | Step 3 的 In/Out Scope(PRD 派生时继承自 PRD §6) |
201
+ | 2.4 验收条件 | Step 3 的"验收标准"(正常/异常场景 + 非功能指标) |
202
+ | 3.1 技术选型 | Step 3 的"技术方案"(语言/框架/数据库选型) |
203
+ | 3.2 架构设计 | Step 3 的"技术方案"(分层与组件,按需) |
204
+ | 3.3 接口设计 | Step 3 的"接口设计"(API/CLI/函数签名,按需) |
205
+ | 3.4 性能与容量考量 | Step 3 的"性能与容量"(热点/瓶颈/策略/目标,按需) |
206
+ | 4. 风险与依赖 | Step 3 的依赖与风险(PRD 派生时继承自 PRD §7) |
207
+
208
+ **章节映射**(Full 模板,对应 `design-full.md` 实际章节):
209
+
210
+ | 模板章节 | 内容来源 |
211
+ |---------|---------|
212
+ | 1. 文档控制 | 自动生成 |
213
+ | 2.1 需求概述 | PRD §2 模块/背景/核心目标 |
214
+ | 2.2 痛点与价值 | PRD §2 + §3(目标用户、当前问题、业务影响、预期价值、US 清单) |
215
+ | 2.3 功能方案 | Step 3 的功能清单 + 字段约束(FEAT 继承自 PRD §4,"来源"列填 US-XX) |
216
+ | 2.4 范围与边界 | Step 3 的范围(继承自 PRD §6) |
217
+ | 2.5 验收条件 | Step 3 的"验收标准"(业务规则 RULE + 场景 S/E/B + NFR) |
218
+ | 3.1 方案选型 | Step 3 的"技术方案"(备选对比含性能预期权重 + 技术栈 + ADR 记录性能依据/被否决项) |
219
+ | 3.2 架构设计 | Step 3 的"技术方案"(架构图 + 分层 + 外部依赖) |
220
+ | 3.3 数据设计 | Step 3 的"数据模型"(表 + 索引 + ER + 容量) |
221
+ | 3.4 接口设计 | Step 3 的"接口设计" |
222
+ | 3.5 质量实现方案 | Step 3 的"约束条件 + 性能与容量"(性能设计含热点路径 + 可靠性/安全/可观测性落地) |
223
+ | 4. 部署与运维 | 按需(发布回滚、监控告警、数据迁移) |
224
+ | 5. 风险与依赖 | Step 3 的依赖与风险(继承自 PRD §7) |
225
+ | 6. 需求追溯矩阵 | 自动生成(US→FEAT→API→TC 关联) |
226
+
227
+ **章节映射(Frontend 模板,对应 `design-frontend.md` 实际章节)**:
228
+
229
+ | 模板章节 | 内容来源 |
230
+ |---------|---------|
231
+ | 2.1–2.4 需求概述/功能方案/范围/验收 | Step 3 的目标/功能/范围 + 交互验收场景(S/E/B) |
232
+ | 3.1 技术选型 | 框架 / 状态库 / 路由 / 样式方案 / 数据请求选型 |
233
+ | 3.2 页面与路由结构 | 页面清单与路由层级 |
234
+ | 3.3 组件设计 | 组件树 + 容器/展示分离 + 复用 |
235
+ | 3.4 组件接口契约 | Props / Events |
236
+ | 3.5 状态与数据流 | 状态划分 + 数据流 + services 数据获取层 |
237
+ | 3.6 UI 状态 | loading / empty / error / success |
238
+ | 3.7 样式方案 | 设计 token / 响应式 / 样式与逻辑分离 |
239
+
240
+ **追溯硬约束(plan 拆解与质量门的基础)**:
241
+ - 功能清单每个 FEAT 保留"来源"列(PRD 派生填 US-XX;无 PRD 填需求描述)
242
+ - 接口(API/CLI/函数)与验收场景标注其实现 / 覆盖的 FEAT-XX
243
+ - Full 模板 §6 需求追溯矩阵必须闭合:US → FEAT → API → TC 不留断点,TC 引用 §2.5.2 场景 ID
244
+ - 任一缺口(FEAT 无来源 / FEAT 无验收 / 矩阵断点)在展示时显式列出并提示补全
245
+
246
+ 展示后询问用户:**确认写入?可以调整任何部分。**
247
+
248
+ ### 5. 写入文件
249
+
250
+ 用户确认后:
251
+
252
+ 1. **确定需求名**:
253
+ - **PRD 派生模式**:继承 PRD 需求名(去 `.prd` 后缀)。例:`user-login-flow.prd.md` → `user-login-flow`
254
+ - **恢复模式**:保持原需求名
255
+ - **新建/交互模式**:从目标推导 kebab-case,如 `user-auth`
256
+ 2. **确定需求目录**:
257
+ - **PRD 派生模式**:使用 PRD 所在的需求目录 `.code-flow/tasks/<日期>/<需求>/`(PRD 与 design 同目录,便于 `cf-task:archive` 整目录归档)
258
+ - **恢复模式**:保持原目录
259
+ - **新建/交互模式**:按当前日期创建需求目录 `.code-flow/tasks/<YYYY-MM-DD>/<需求>/`;目录已存在且非本次草稿时目录名追加序号 `<需求>-2`…
260
+ 3. **按域后缀命名**(同一需求目录内):
261
+ - 前端设计(design-frontend)→ `<需求>.frontend.design.md`
262
+ - 后端/通用设计(design-lite/full)→ 全栈时 `<需求>.backend.design.md`;纯后端/通用单域时 `<需求>.design.md`
263
+ - **全栈需求**:前后端各写一份到同一需求目录
264
+ 4. 用 Write 写入最终路径
265
+
266
+ ### 6. 输出摘要
267
+
268
+ ```
269
+ 已生成设计简报: <完整路径>
270
+ 模板类型: Lite / Full
271
+ 来源: <PRD 派生 / 新建 / 恢复>
272
+
273
+ 内容:
274
+ - <按实际包含的章节列出>
275
+ - 验收标准: N 项
276
+ - 追溯自检: 每个 FEAT 有来源(US/需求)✓、有验收场景✓;Full 模板 §6 矩阵 US→FEAT→API→TC 闭合,缺口显式列出
277
+ - 性能自检: 标记性能敏感则方案须体现最优性能设计依据(§3.1/§3.5 或 lite §3.4),否则提示补全或显式声明"无性能敏感点"
278
+
279
+ 下一步:
280
+ - 审阅/编辑: 直接打开设计简报文件
281
+ - 标注问题: 在文件中添加 #NOTES,然后 /cf-task:note <name>.design
282
+ - 生成任务: /cf-task:plan <完整路径>
283
+ ```