ai-spec-dev 0.1.0 → 0.17.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/.claude/settings.local.json +18 -0
  2. package/README.md +1215 -146
  3. package/RELEASE_LOG.md +1489 -0
  4. package/cli/index.ts +1981 -0
  5. package/cli/welcome.ts +151 -0
  6. package/core/code-generator.ts +757 -0
  7. package/core/combined-generator.ts +63 -0
  8. package/core/constitution-consolidator.ts +141 -0
  9. package/core/constitution-generator.ts +89 -0
  10. package/core/context-loader.ts +453 -0
  11. package/core/contract-bridge.ts +217 -0
  12. package/core/dsl-extractor.ts +337 -0
  13. package/core/dsl-types.ts +166 -0
  14. package/core/dsl-validator.ts +450 -0
  15. package/core/error-feedback.ts +354 -0
  16. package/core/frontend-context-loader.ts +602 -0
  17. package/core/global-constitution.ts +88 -0
  18. package/core/key-store.ts +49 -0
  19. package/core/knowledge-memory.ts +171 -0
  20. package/core/mock-server-generator.ts +571 -0
  21. package/core/openapi-exporter.ts +361 -0
  22. package/core/requirement-decomposer.ts +198 -0
  23. package/core/reviewer.ts +259 -0
  24. package/core/spec-assessor.ts +99 -0
  25. package/core/spec-generator.ts +428 -0
  26. package/core/spec-refiner.ts +89 -0
  27. package/core/spec-updater.ts +227 -0
  28. package/core/spec-versioning.ts +213 -0
  29. package/core/task-generator.ts +174 -0
  30. package/core/test-generator.ts +273 -0
  31. package/core/workspace-loader.ts +256 -0
  32. package/dist/cli/index.js +6717 -672
  33. package/dist/cli/index.js.map +1 -1
  34. package/dist/cli/index.mjs +6717 -670
  35. package/dist/cli/index.mjs.map +1 -1
  36. package/dist/index.d.mts +147 -27
  37. package/dist/index.d.ts +147 -27
  38. package/dist/index.js +2337 -286
  39. package/dist/index.js.map +1 -1
  40. package/dist/index.mjs +2329 -285
  41. package/dist/index.mjs.map +1 -1
  42. package/git/worktree.ts +109 -0
  43. package/index.ts +9 -0
  44. package/package.json +4 -28
  45. package/prompts/codegen.prompt.ts +259 -0
  46. package/prompts/consolidate.prompt.ts +73 -0
  47. package/prompts/constitution.prompt.ts +63 -0
  48. package/prompts/decompose.prompt.ts +168 -0
  49. package/prompts/dsl.prompt.ts +203 -0
  50. package/prompts/frontend-spec.prompt.ts +191 -0
  51. package/prompts/global-constitution.prompt.ts +61 -0
  52. package/prompts/spec-assess.prompt.ts +53 -0
  53. package/prompts/spec.prompt.ts +102 -0
  54. package/prompts/tasks.prompt.ts +35 -0
  55. package/prompts/testgen.prompt.ts +84 -0
  56. package/prompts/update.prompt.ts +131 -0
  57. package/purpose.docx +0 -0
  58. package/purpose.md +444 -0
  59. package/tsconfig.json +14 -0
  60. package/tsup.config.ts +10 -0
package/README.md CHANGED
@@ -1,9 +1,15 @@
1
1
  # ai-spec
2
2
 
3
- > AI 驱动的功能开发编排工具 — 从一句话需求到可运行代码的完整流水线
3
+ > AI 驱动的功能开发编排工具 — 从一句话需求到可运行代码的完整流水线,支持单 Repo 及多 Repo 跨端联动
4
4
 
5
+ **单 Repo 模式:**
5
6
  ```
6
- 需求描述 → 项目感知 → Spec 生成 → 交互式润色 → Git 隔离 → 代码生成 → AI 代码审查
7
+ 需求描述 → 项目宪法 → 项目感知 → Spec+Tasks → 交互式润色(Diff预览)Spec质量预评估 → Approval Gate → DSL提取+校验 → Git 隔离 → 代码生成(同层并行)TDD测试(--tdd) / 测试骨架 → 错误反馈自动修复 → 2-pass 代码审查 → 经验积累(宪法§9)
8
+ ```
9
+
10
+ **多 Repo 模式(工作区):**
11
+ ```
12
+ 一句需求 → AI 拆分职责+UX决策 → [后端流水线 → DSL契约] → [前端流水线(注入后端契约)] → 全链路完成
7
13
  ```
8
14
 
9
15
  ---
@@ -13,9 +19,13 @@
13
19
  - [快速开始](#快速开始)
14
20
  - [支持的模型](#支持的模型)
15
21
  - [命令总览](#命令总览)
22
+ - [命令详解](#命令详解)
16
23
  - [工作流详解](#工作流详解)
24
+ - [多 Repo 工作区模式](#多-repo-工作区模式)
17
25
  - [配置文件](#配置文件)
18
26
  - [全局安装](#全局安装)
27
+ - [项目结构](#项目结构)
28
+ - [Release Log](RELEASE_LOG.md)
19
29
 
20
30
  ---
21
31
 
@@ -29,20 +39,61 @@ npm run build
29
39
  # 2. 设置 API Key(以 Gemini 为例)
30
40
  export GEMINI_API_KEY=your_key_here
31
41
 
32
- # 3. 运行
33
- node dist/cli/index.js create "给用户模块增加登录功能"
42
+ # 3. 首次使用:生成项目宪法(可选,create 会自动触发)
43
+ ai-spec init
44
+
45
+ # 4. 开始开发
46
+ ai-spec create "给用户模块增加登录功能"
34
47
  ```
35
48
 
36
- 运行后会依次经历以下步骤(全部自动化):
49
+ 运行 `create` 后会依次经历以下步骤:
37
50
 
38
51
  ```
39
- [1/6] Loading project context... ← 读取 package.json / prisma / 路由文件
40
- [2/6] Generating spec with gemini... AI 生成结构化 Markdown Spec
41
- [3/6] Interactive spec refinement... ← 终端交互:编辑 / AI 润色 / 确认
42
- [4/6] Setting up git worktree... ← 创建隔离的 feature 分支工作区
43
- [5/6] Spec saved: specs/feature-xxx.md
44
- [6/6] Code generation (mode: api)... ← AI 生成代码文件 / 启动 Claude Code
45
- [7/7] Automated code review... AI 对照 Spec 审查 git diff
52
+ [1/6] Loading project context...
53
+ Constitution : found (.ai-spec-constitution.md) 已有则直接使用
54
+ [2/6] Generating spec with gemini/gemini-2.5-pro...
55
+ Spec generated. ✔ 7 tasks generated.
56
+ [3/6] Interactive spec refinement... ← --fast 可跳过
57
+ AI Changes ── +12 -3 lines ← AI 润色后彩色 diff
58
+ [3.4/6] Spec quality assessment... --skip-assessment 可跳过
59
+ Coverage [████████░░] 8/10
60
+ Clarity [██████░░░░] 6/10 ← DSL提取可能不准确
61
+ Constitution[█████████░] 9/10
62
+ ⚠ 未描述密码错误返回的错误码 (§5)
63
+ [3.5/6] Approval Gate — review before code generation ← --auto 可跳过
64
+ v1 → v2: +12 -3 lines (彩色 diff 预览)
65
+ ✅ Proceed / 📋 View full spec / ❌ Abort
66
+ [DSL] Extracting structured DSL from spec... ← --skip-dsl 可跳过
67
+ ✔ DSL valid
68
+ Models : 2
69
+ Endpoints : 4
70
+ Behaviors : 1
71
+ POST /api/v1/auth/login → 200
72
+ ...
73
+ [4/6] Setting up git worktree...
74
+ [5/6] ✔ Spec saved : specs/feature-user-login-v1.md (v1)
75
+ ✔ DSL saved : specs/feature-user-login-v1.dsl.json
76
+ ✔ Tasks saved: specs/feature-user-login-v1-tasks.json
77
+ [6/6] Code generation (mode: api)...
78
+ ✓ DSL loaded — 4 endpoints, 2 models
79
+ [████░░░░░░░░░░░░░░░░] 20% → TASK-001 💾 Add schema
80
+ [████████░░░░░░░░░░░░] 40% → TASK-002 🔧 Service 层
81
+ ✔ Task-based generation: 8/8 files written across 5 tasks.
82
+ [7/9] Test skeleton generation... ← --skip-tests 可跳过
83
+ + tests/auth.test.ts ← --tdd 时改为 TDD 真实断言
84
+ + tests/auth.service.test.ts
85
+ ✔ 2 test file(s) generated.
86
+ [8/9] Error feedback loop... ← --skip-error-feedback 可跳过
87
+ [cycle 1/2] Running tests: npm test
88
+ ✘ Tests failed (3 error(s) captured)
89
+ Attempting auto-fix (3 error(s))...
90
+ ✔ Auto-fixed: src/services/authService.ts
91
+ [cycle 2/2] Running tests: npm test
92
+ ✔ Tests passed.
93
+ ✔ All checks passed after 2 cycle(s).
94
+ [9/9] Automated code review (file-based)...
95
+ ─── Knowledge Memory ─────────────────────────────
96
+ ✔ 2 lesson(s) appended to constitution (§9).
46
97
  ```
47
98
 
48
99
  ---
@@ -51,16 +102,37 @@ node dist/cli/index.js create "给用户模块增加登录功能"
51
102
 
52
103
  | Provider | 关键词 | API Key 环境变量 | 默认模型 |
53
104
  |---|---|---|---|
54
- | Google Gemini | `gemini` | `GEMINI_API_KEY` | `gemini-2.5-flash` |
55
- | Anthropic Claude | `claude` | `ANTHROPIC_API_KEY` | `claude-sonnet-4-6` |
56
- | OpenAI | `openai` | `OPENAI_API_KEY` | `gpt-4o` |
57
- | 通义千问 | `qwen` | `DASHSCOPE_API_KEY` | `qwen-max` |
58
- | MiniMax | `minimax` | `MINIMAX_API_KEY` | `MiniMax-Text-01` |
59
- | 智谱 GLM | `glm` | `ZHIPU_API_KEY` | `glm-4-plus` |
60
-
61
- > 国内模型(Qwen / MiniMax / GLM)均使用 OpenAI 兼容接口,无需额外依赖。
62
-
63
- 查看所有 provider 的完整模型列表:
105
+ | MiMo (Xiaomi) | `mimo` | `MIMO_API_KEY` | `mimo-v2-pro` |
106
+ | Google Gemini | `gemini` | `GEMINI_API_KEY` | `gemini-2.5-pro` |
107
+ | Anthropic Claude | `claude` | `ANTHROPIC_API_KEY` | `claude-opus-4-6` |
108
+ | OpenAI | `openai` | `OPENAI_API_KEY` | `o3` |
109
+ | DeepSeek | `deepseek` | `DEEPSEEK_API_KEY` | `deepseek-chat` |
110
+ | 通义千问 | `qwen` | `DASHSCOPE_API_KEY` | `qwen3-235b-a22b` |
111
+ | 智谱 GLM | `glm` | `ZHIPU_API_KEY` | `glm-5` |
112
+ | MiniMax | `minimax` | `MINIMAX_API_KEY` | `MiniMax-Text-2.7` |
113
+ | 豆包 Doubao | `doubao` | `ARK_API_KEY` | `doubao-pro-256k` |
114
+
115
+ **各 provider 可用模型:**
116
+
117
+ | Provider | 模型列表 |
118
+ |---|---|
119
+ | mimo | `mimo-v2-pro` |
120
+ | gemini | `gemini-2.5-pro` · `gemini-2.5-flash` · `gemini-2.0-flash` · `gemini-2.0-flash-lite` · `gemini-1.5-pro` |
121
+ | claude | `claude-opus-4-6` · `claude-sonnet-4-6` · `claude-haiku-4-5` · `claude-3-7-sonnet-20250219` |
122
+ | openai | `o3` · `o3-mini` · `o1` · `o1-mini` · `gpt-4o` · `gpt-4o-mini` |
123
+ | deepseek | `deepseek-chat`(V3)· `deepseek-reasoner`(R1) |
124
+ | qwen | `qwen3-235b-a22b` · `qwen3-72b` · `qwen3-32b` · `qwen3-8b` · `qwen-max` · `qwen-plus` |
125
+ | glm | `glm-5` · `glm-5-flash` · `glm-z1`(推理)· `glm-z1-flash` · `glm-4-plus` · `glm-4-flash` |
126
+ | minimax | `MiniMax-Text-2.7` · `MiniMax-Text-01` · `abab6.5s-chat` |
127
+ | doubao | `doubao-pro-256k` · `doubao-pro-128k` · `doubao-pro-32k` · `doubao-lite-128k` |
128
+
129
+ > **兼容说明:**
130
+ > - MiMo:Anthropic messages 格式,自定义 `api-key` 鉴权头(非标准 Bearer),通过 axios 直接调用
131
+ > - DeepSeek / Qwen / GLM / MiniMax / Doubao:OpenAI 兼容接口
132
+ > - OpenAI o1/o3:自动切换为 `developer` role(不使用 `system`)
133
+ > - Qwen3:自动注入 `enable_thinking: false` 避免 CoT 污染结构化输出
134
+
135
+ 查看所有 provider 完整模型列表:
64
136
 
65
137
  ```bash
66
138
  ai-spec model --list
@@ -71,22 +143,232 @@ ai-spec model --list
71
143
  ## 命令总览
72
144
 
73
145
  ```
74
- ai-spec create [idea] 完整工作流:context → spec → refine → worktree → codegen → review
75
- ai-spec model 交互式切换 AI provider / model,写入 .ai-spec.json
76
- ai-spec review [file] 对当前 git diff 运行 AI 代码审查
77
- ai-spec config 查看 / 修改 / 重置项目级配置
146
+ ai-spec init 分析代码库,生成项目宪法(.ai-spec-constitution.md)
147
+ ai-spec init --consolidate 整合宪法:将 §9 积累教训提炼归并到 §1–§8,清理冗余(Constitution Rebase)
148
+ ai-spec create [idea] 完整工作流:宪法 context spec → tasks → refine → worktree → codegen → 测试生成 → 错误修复 → review → 经验积累
149
+ ai-spec update [change] 增量更新:修改现有 Spec 重提取 DSL → 识别受影响文件 → 可选重新生成代码
150
+ ai-spec export DSL → OpenAPI 3.1.0 YAML/JSON(可导入 Postman / Swagger UI / openapi-generator)
151
+ ai-spec mock 从 DSL 生成 Mock Server / 前端 Proxy 配置 / MSW Handlers(联调利器)
152
+ ai-spec review [file] 对当前 git diff 运行 2-pass AI 代码审查(架构层 + 实现层),并打印评分趋势
153
+ ai-spec model 交互式切换 AI provider / model,写入 .ai-spec.json
154
+ ai-spec config 查看 / 修改 / 重置项目级配置
155
+ ai-spec workspace init 初始化多 Repo 工作区(生成 .ai-spec-workspace.json)
156
+ ai-spec workspace status 查看工作区内各 Repo 状态
157
+ ```
158
+
159
+ ### 所有命令与选项速查
160
+
161
+ #### `ai-spec init`
162
+
163
+ ```
164
+ ai-spec init # 生成项目宪法(.ai-spec-constitution.md)
165
+ ai-spec init --global # 生成全局宪法(.ai-spec-global-constitution.md)— 团队级跨项目规范
166
+ ai-spec init --force # 强制覆盖已有宪法
167
+ ai-spec init --consolidate # 整合宪法:§9 教训 → §1–§8 核心规则(Constitution Rebase)
168
+ ai-spec init --consolidate --dry-run # 预览整合结果,不写入磁盘
169
+ ai-spec init --provider <name> # 指定 provider
170
+ ai-spec init --model <name> # 指定 model
171
+ ai-spec init -k <key> # 指定 API Key
172
+ ```
173
+
174
+ #### `ai-spec create`
175
+
176
+ ```
177
+ ai-spec create "功能描述" # 最简用法(交互式询问)
178
+ ai-spec create # 省略 idea 时交互式询问
179
+
180
+ # Provider / Model
181
+ --provider <name> # Spec 生成使用的 provider(默认 gemini)
182
+ --model <name> # Spec 生成使用的模型
183
+ -k, --key <key> # API Key
184
+ --codegen-provider <name> # 代码生成使用的 provider
185
+ --codegen-model <name> # 代码生成使用的模型
186
+ --codegen-key <key> # 代码生成的 API Key
187
+
188
+ # Codegen 模式
189
+ --codegen <mode> # claude-code(默认)| api | plan
190
+
191
+ # 流程控制
192
+ --fast # 跳过 Spec 交互式润色
193
+ --auto # 全自动非交互模式(跳过 Approval Gate)
194
+ --resume # 续跑:跳过已完成 task
195
+
196
+ # Worktree 控制
197
+ --worktree # 强制创建 git worktree(前端项目默认自动跳过)
198
+ --skip-worktree # 手动跳过 git worktree 创建
199
+
200
+ # 跳过某步骤
201
+ --skip-tasks # 跳过 Tasks 分解
202
+ --skip-dsl # 跳过 DSL 提取
203
+ --skip-tests # 跳过测试骨架生成
204
+ --skip-error-feedback # 跳过错误反馈自动修复
205
+ --skip-review # 跳过代码审查(同时跳过经验积累)
206
+ --skip-assessment # 跳过 Spec 质量预评估(省一次 AI 调用)
207
+
208
+ # 模式增强
209
+ --tdd # TDD 模式:在代码生成前写入真实断言测试,由 error feedback loop 驱动实现通过测试
210
+ ```
211
+
212
+ > **Worktree 自动策略:**
213
+ > - 后端项目(Node.js / Go / PHP 等):默认创建 worktree 隔离分支
214
+ > - 前端项目(React / Vue / Next / React-Native):**自动跳过 worktree**,直接在当前仓库生成代码
215
+ > - 原因:worktree 不含 `node_modules`,前端 dev server 无法启动
216
+ > - 如需强制 worktree 模式,加 `--worktree` flag
217
+
218
+ #### `ai-spec review`
219
+
220
+ ```
221
+ ai-spec review # 自动检测最新 spec,审查当前 git diff
222
+ ai-spec review specs/feature-xxx.md # 指定 spec 文件
223
+ ai-spec review --provider <name> # 指定 provider
224
+ ai-spec review --model <name> # 指定 model
225
+ ```
226
+
227
+ #### `ai-spec model`
228
+
229
+ ```
230
+ ai-spec model # 交互式选择 provider + model
231
+ ai-spec model --list # 列出所有 provider 和可用模型
232
+ ```
233
+
234
+ #### `ai-spec config`
235
+
236
+ ```
237
+ ai-spec config --show # 打印当前配置
238
+ ai-spec config --provider <name> # 设置默认 spec provider
239
+ ai-spec config --model <name> # 设置默认 spec model
240
+ ai-spec config --codegen <mode> # 设置默认 codegen 模式
241
+ ai-spec config --codegen-provider <name> # 设置默认 codegen provider
242
+ ai-spec config --codegen-model <name> # 设置默认 codegen model
243
+ ai-spec config --reset # 清空配置文件
244
+ ```
245
+
246
+ #### `ai-spec workspace`
247
+
248
+ ```
249
+ ai-spec workspace init # 扫描并初始化工作区(生成 .ai-spec-workspace.json)
250
+ ai-spec workspace init --name <n> # 指定工作区名称
251
+ ai-spec workspace init --repos a,b # 仅纳入指定目录的 repo
252
+ ai-spec workspace status # 列出工作区内所有 repo 及其类型/角色/宪法状态
253
+ ```
254
+
255
+ #### `ai-spec update`
256
+
257
+ ```
258
+ ai-spec update "变更描述" # 自动找最新 Spec,生成更新版本(v1 → v2)
259
+ ai-spec update # 省略描述时交互式询问
260
+ ai-spec update --codegen # 更新 Spec + DSL 后,自动重新生成受影响文件
261
+ ai-spec update --spec <path> # 指定要更新的 Spec 文件
262
+ ai-spec update --skip-affected # 跳过受影响文件识别(只更新 Spec 和 DSL)
263
+ ai-spec update --provider <name> # 指定 provider
264
+ ai-spec update --codegen-provider <n> # 代码生成使用不同 provider
265
+ ```
266
+
267
+ #### `ai-spec export`
268
+
269
+ ```
270
+ ai-spec export # 读取最新 DSL,生成 openapi.yaml
271
+ ai-spec export --format json # 生成 openapi.json
272
+ ai-spec export --server <url> # 指定服务器 URL(默认 http://localhost:3000)
273
+ ai-spec export --output <path> # 指定输出路径
274
+ ai-spec export --dsl <path> # 指定 DSL 文件
275
+ ```
276
+
277
+ #### `ai-spec mock`
278
+
279
+ ```
280
+ ai-spec mock # 读取最新 DSL,生成 mock/server.js(Express 独立 Mock 服务器)
281
+ ai-spec mock --port 3002 # 指定端口(默认 3001)
282
+ ai-spec mock --proxy # 同时生成前端框架 Proxy 配置片段(Vite/Next.js/webpack 自动识别)
283
+ ai-spec mock --msw # 同时生成 MSW Handlers(src/mocks/handlers.ts + browser.ts)
284
+ ai-spec mock --dsl <path> # 指定 DSL 文件路径(默认自动寻找最新)
285
+ ai-spec mock --workspace # 为工作区内所有后端 repo 批量生成 Mock
78
286
  ```
79
287
 
80
288
  ---
81
289
 
82
290
  ## 命令详解
83
291
 
292
+ ### `ai-spec init`
293
+
294
+ 分析当前项目的代码结构(路由、controllers、Prisma schema、错误处理模式),生成 `.ai-spec-constitution.md`。
295
+
296
+ 该文件是项目的"宪法",所有后续 Spec 生成和代码生成都会自动遵守其中的规则。
297
+
298
+ ```bash
299
+ # 生成项目宪法
300
+ ai-spec init
301
+
302
+ # 指定 provider(默认使用 .ai-spec.json 配置)
303
+ ai-spec init --provider claude --model claude-opus-4-6
304
+
305
+ # 强制重新生成(覆盖已有文件)
306
+ ai-spec init --force
307
+ ```
308
+
309
+ 生成内容包含:
310
+
311
+ ```markdown
312
+ # Project Constitution
313
+ ## 1. 架构规则 ← 分层约束、模块组织
314
+ ## 2. 命名规范 ← 文件名、函数名、路由路径
315
+ ## 3. API 规范 ← 响应结构、错误码、认证模式
316
+ ## 4. 数据层规范 ← ORM 访问规则、事务处理
317
+ ## 5. 错误处理规范 ← 错误抛出和捕获模式
318
+ ## 6. 禁区 ← 绝对不能违反的红线
319
+ ## 7. 测试规范 ← 测试框架、文件位置
320
+ ## 8. 共享配置文件清单 ← i18n/constants/enums/route-index,Append-Only,禁止新建平行文件
321
+ ```
322
+
323
+ > **自动触发**:如果项目目录下没有 `.ai-spec-constitution.md`,`ai-spec create` 会在 Step 1 自动运行 init,无需手动执行。
324
+
325
+ **选项:**
326
+
327
+ | 选项 | 说明 |
328
+ |---|---|
329
+ | `--provider <name>` | 使用的 AI provider |
330
+ | `--model <name>` | 使用的模型 |
331
+ | `-k, --key <key>` | API Key |
332
+ | `--force` | 覆盖已有宪法文件 |
333
+ | `--global` | 生成团队级全局宪法(`.ai-spec-global-constitution.md`)而非项目宪法 |
334
+ | `--consolidate` | 整合宪法:将 §9 提炼归并到 §1–§8,清理冗余 |
335
+ | `--dry-run` | 配合 `--consolidate`:预览不写入 |
336
+
337
+ > **全局宪法 vs 项目宪法**:全局宪法定义团队通用规范(错误码体系、认证模式、日志格式);项目宪法定义本项目特有规范(数据模型、路由前缀、特定限制)。运行时自动合并,项目宪法优先。
338
+
339
+ #### Constitution Rebase — 为什么需要定期整合
340
+
341
+ `ai-spec review` 每次运行后会把审查 issue 追加到宪法 §9。长期运行后 §9 会积累大量条目(重复措辞、已修复问题、不再适用的早期教训)。宪法全文注入每次 AI 调用——内容越长,AI 对中间章节的注意力越分散,效果反而下降。当宪法超过 6,000 字符时,CLI 会自动显示警告提示整合。
342
+
343
+ **建议频率**:§9 达到 8 条以上时(系统会自动提示),或出现以下警告时,运行一次整合:
344
+
345
+ ```
346
+ ⚠ Constitution is long (8,432 chars). Consider running: ai-spec init --consolidate
347
+ ```
348
+
349
+ ```bash
350
+ # 预览效果(不写入)
351
+ ai-spec init --consolidate --dry-run
352
+
353
+ # 确认后执行
354
+ ai-spec init --consolidate
355
+ ```
356
+
357
+ 整合过程:
358
+ 1. AI 逐条审阅 §9,决定每条教训的去向:**LIFT**(提升至 §1–§8)/ **KEEP**(保留,最多 5 条)/ **DROP**(删除重复/已失效)
359
+ 2. 展示彩色 diff,显示前后对比
360
+ 3. 自动创建备份(`.ai-spec-constitution.backup-YYYY-MM-DD-HH-MM-SS.md`)后写入
361
+
362
+ 典型效果:§9 从 14 条压缩到 4 条,宪法总行数减少 10–20%,核心章节获得新的精确规则。
363
+
364
+ ---
365
+
84
366
  ### `ai-spec create [idea]`
85
367
 
86
368
  启动完整的功能开发流水线。`idea` 参数省略时会交互式询问。
87
369
 
88
370
  ```bash
89
- # 最简用法(使用 .ai-spec.json 或默认值)
371
+ # 最简用法
90
372
  ai-spec create "增加商品搜索功能"
91
373
 
92
374
  # 指定 provider / model
@@ -97,10 +379,16 @@ ai-spec create "购物车结算" \
97
379
  --provider claude \
98
380
  --codegen api \
99
381
  --codegen-provider qwen \
100
- --codegen-model qwen-max
382
+ --codegen-model qwen3-72b
383
+
384
+ # 全自动模式(非交互,claude -p 执行,节省 token)
385
+ ai-spec create "消息通知" --auto
101
386
 
102
- # 只生成 Spec 和实施方案,不写代码不创建 worktree
387
+ # 只生成 Spec + Tasks,不写代码
103
388
  ai-spec create "重构支付模块" --codegen plan --skip-worktree --skip-review
389
+
390
+ # 跳过 Tasks 生成
391
+ ai-spec create "小功能" --skip-tasks
104
392
  ```
105
393
 
106
394
  **完整选项:**
@@ -111,63 +399,28 @@ ai-spec create "重构支付模块" --codegen plan --skip-worktree --skip-review
111
399
  | `--model <name>` | Spec 生成使用的模型 | provider 默认模型 |
112
400
  | `-k, --key <key>` | API Key(优先级高于环境变量) | — |
113
401
  | `--codegen <mode>` | 代码生成模式:`claude-code` / `api` / `plan` | `claude-code` |
114
- | `--codegen-provider <name>` | 代码生成使用的 provider(默认同 `--provider`) | — |
402
+ | `--codegen-provider <name>` | 代码生成使用的 provider | 同 `--provider` |
115
403
  | `--codegen-model <name>` | 代码生成使用的模型 | — |
116
- | `--codegen-key <key>` | 代码生成的 API Key(provider 不同时使用) | — |
404
+ | `--codegen-key <key>` | 代码生成的 API Key | — |
117
405
  | `--skip-worktree` | 跳过 git worktree 创建 | — |
118
406
  | `--skip-review` | 跳过最终代码审查 | — |
407
+ | `--skip-tasks` | 跳过 Tasks 分解(只生成 Spec) | — |
408
+ | `--auto` | 非交互模式:用 `claude -p` 执行,同时跳过 Approval Gate(节省 token) | — |
409
+ | `--fast` | 跳过交互式 Spec 润色,直接进入代码生成(适合全自动流水线) | — |
410
+ | `--resume` | 续跑模式:跳过 tasks.json 中已标记为 `done` 的任务 | — |
411
+ | `--skip-dsl` | 跳过 DSL 提取步骤(适合简单功能或快速迭代) | — |
412
+ | `--skip-tests` | 跳过测试骨架生成(需要 DSL;`--skip-dsl` 时自动跳过) | — |
413
+ | `--skip-error-feedback` | 跳过错误反馈自动修复循环 | — |
414
+ | `--tdd` | TDD 模式:代码生成前先写含真实断言的测试,error feedback loop 驱动实现让测试通过(最多 3 轮)。仅支持后端项目 | — |
415
+ | `--skip-assessment` | 跳过 Approval Gate 前的 Spec 质量预评估(节省一次 AI 调用) | — |
119
416
 
120
417
  **`--codegen` 三种模式:**
121
418
 
122
419
  | 模式 | 说明 |
123
420
  |---|---|
124
- | `claude-code` | worktree 目录中交互式启动 Claude Code CLI(默认) |
125
- | `api` | 调用 AI API 自动规划文件列表并逐文件生成代码写入磁盘 |
126
- | `plan` | 仅输出实施方案(文件清单 + 步骤),不写任何代码 |
127
-
128
- ---
129
-
130
- ### `ai-spec model`
131
-
132
- 交互式 provider / model 切换器,结果写入当前目录的 `.ai-spec.json`。
133
-
134
- ```bash
135
- # 启动交互式选择
136
- ai-spec model
137
-
138
- # 仅查看所有可用 provider 和模型,不做任何修改
139
- ai-spec model --list
140
- ```
141
-
142
- **交互流程:**
143
-
144
- ```
145
- ? Configure model for:
146
- ❯ Spec generation (用于 spec 生成和润色)
147
- Code generation (--codegen api 时生效)
148
- Both (spec 和 codegen 使用同一模型)
149
-
150
- ? Spec — select provider:
151
- ❯ Google Gemini Google AI Studio — Gemini 2.5 / 1.5 series
152
- Anthropic Claude Anthropic — Claude 4.x series
153
- 通义千问 (Qwen) 阿里云百炼 DashScope — qwen-max / plus / turbo
154
- MiniMax MiniMax AI — MiniMax-Text-01 / abab series
155
- 智谱 GLM (Zhipu AI) 智谱 AI — GLM-4 plus / flash / air series
156
- ...
157
-
158
- ? Spec — select model (通义千问):
159
- ❯ qwen-max
160
- qwen-max-latest
161
- qwen-plus
162
- qwen-turbo
163
- ✎ Enter custom model name...
164
-
165
- Preview:
166
- spec → qwen/qwen-max
167
-
168
- ? Save to .ai-spec.json? Yes
169
- ✔ Saved to .ai-spec.json
170
- ```
421
+ | `claude-code` | 启动 Claude Code CLI。`--auto` 时改为逐 task 运行 `claude -p`(增量执行,失败可 `--resume` 续跑) |
422
+ | `api` | 调用 AI API 自动规划文件并逐文件生成。有 Tasks 文件时按 task 顺序生成,支持 `--resume` 续跑 |
423
+ | `plan` | 仅输出实施方案,不写任何代码 |
171
424
 
172
425
  ---
173
426
 
@@ -183,44 +436,47 @@ ai-spec review
183
436
  ai-spec review specs/feature-1234567890.md
184
437
 
185
438
  # 指定 provider
186
- ai-spec review --provider glm --model glm-4-plus
439
+ ai-spec review --provider glm --model glm-5
187
440
  ```
188
441
 
189
442
  **输出结构:**
190
443
 
191
444
  ```
192
- ─── Review Result ───────────────────────────────
193
445
  ## ✅ 优点 (What's Good)
194
446
  ## ⚠️ 问题 (Issues Found)
195
447
  ## 💡 改进建议 (Suggestions)
196
448
  ## 📊 总体评价 (Overall Assessment) Score: X/10
197
- ─────────────────────────────────────────────────
198
449
  ```
199
450
 
200
- > 提示:先执行 `git add .` 再运行 `ai-spec review`,可以让 AI 审查所有变更。
451
+ > 提示:先执行 `git add .` 再运行 `ai-spec review`,确保所有变更都被纳入审查。
201
452
 
202
453
  ---
203
454
 
204
- ### `ai-spec config`
455
+ ### `ai-spec model`
205
456
 
206
- 管理当前项目的默认配置(`.ai-spec.json`),避免每次都传重复的参数。
457
+ 交互式 provider / model 切换器,结果写入当前目录的 `.ai-spec.json`。
207
458
 
208
459
  ```bash
209
- # 查看当前配置
210
- ai-spec config --show
460
+ # 交互式选择
461
+ ai-spec model
211
462
 
212
- # 设置默认 provider 和 codegen 模式
213
- ai-spec config --provider qwen --codegen api
463
+ # 查看所有可用 provider 和模型
464
+ ai-spec model --list
465
+ ```
466
+
467
+ ---
468
+
469
+ ### `ai-spec config`
214
470
 
215
- # 单独设置 codegen provider(spec 和 codegen 使用不同模型)
216
- ai-spec config --codegen-provider glm --codegen-model glm-4-plus
471
+ 管理当前项目的默认配置(`.ai-spec.json`)。
217
472
 
218
- # 重置为空(恢复内置默认值)
473
+ ```bash
474
+ ai-spec config --show
475
+ ai-spec config --provider qwen --codegen api
476
+ ai-spec config --codegen-provider glm --codegen-model glm-5
219
477
  ai-spec config --reset
220
478
  ```
221
479
 
222
- **完整选项:**
223
-
224
480
  | 选项 | 说明 |
225
481
  |---|---|
226
482
  | `--provider <name>` | 默认 spec provider |
@@ -233,23 +489,240 @@ ai-spec config --reset
233
489
 
234
490
  ---
235
491
 
492
+ ### `ai-spec workspace`
493
+
494
+ 管理多 Repo 工作区,让 ai-spec 跨越单个项目边界,协同处理包含前端和后端的完整需求。
495
+
496
+ ```bash
497
+ # 在包含多个 repo 的父目录中执行
498
+ cd ~/code/my-project # 下有 backend/ frontend/ 两个子目录
499
+
500
+ # 初始化工作区
501
+ ai-spec workspace init
502
+
503
+ # 查看工作区状态
504
+ ai-spec workspace status
505
+ ```
506
+
507
+ **`workspace init` 输出示例:**
508
+
509
+ ```
510
+ ✔ Detected 2 repos:
511
+ backend (node-express / backend) constitution: ✔
512
+ frontend (react / frontend) constitution: ✘
513
+ ✔ Workspace saved: .ai-spec-workspace.json
514
+ ```
515
+
516
+ **工作区配置文件(`.ai-spec-workspace.json`):**
517
+
518
+ ```json
519
+ {
520
+ "name": "my-project",
521
+ "repos": [
522
+ { "name": "backend", "path": "backend", "type": "node-express", "role": "backend" },
523
+ { "name": "frontend", "path": "frontend", "type": "react", "role": "frontend" }
524
+ ]
525
+ }
526
+ ```
527
+
528
+ 初始化完成后,在同一目录运行 `ai-spec create` 会自动进入**多 Repo 联动模式**(参见[多 Repo 工作区模式](#多-repo-工作区模式))。
529
+
530
+ | 选项 | 说明 |
531
+ |---|---|
532
+ | `--name <name>` | 工作区名称(默认取父目录名) |
533
+ | `--repos <a,b>` | 只纳入指定目录(逗号分隔),不指定则自动扫描所有含 `package.json` / `go.mod` / `Cargo.toml` / `pom.xml` / `requirements.txt` 的子目录 |
534
+
535
+ ---
536
+
537
+ ### `ai-spec update [change]`
538
+
539
+ `ai-spec create` 负责从零开始;`ai-spec update` 负责存量演进。这是日常迭代中最常用的命令。
540
+
541
+ ```bash
542
+ # 描述变更,自动找最新 Spec 并生成 v2
543
+ ai-spec update "新增商品收藏功能,在 Product 模型上加 isFavorited 字段"
544
+
545
+ # 更新完 Spec + DSL 后,自动重新生成受影响的代码文件
546
+ ai-spec update "把价格字段从 Int 改为 Float" --codegen
547
+
548
+ # 只更新 Spec 和 DSL,不识别受影响文件(快速)
549
+ ai-spec update "修复描述文字" --skip-affected
550
+ ```
551
+
552
+ **三步流程:**
553
+
554
+ ```
555
+ [1/3] 更新 Spec
556
+ AI 读取现有 Spec + 变更描述
557
+ → 生成更新后的完整 Spec(保留未变更部分)
558
+ → 写入 feature-xxx-v2.md
559
+
560
+ [2/3] 更新 DSL
561
+ 若存在现有 DSL → 定向更新(只改变了的端点/模型)
562
+ 失败时降级为全量重提取
563
+ → 写入 feature-xxx-v2.dsl.json
564
+
565
+ [3/3] 识别受影响文件
566
+ 对比新旧 DSL(新增/修改的端点、模型字段)
567
+ → 输出需要 create/modify 的文件列表
568
+ → --codegen 时自动重新生成这些文件
569
+ ```
570
+
571
+ | 选项 | 说明 |
572
+ |---|---|
573
+ | `--codegen` | 识别受影响文件后自动重新生成 |
574
+ | `--spec <path>` | 指定要更新的 Spec 文件(默认自动找最新) |
575
+ | `--skip-affected` | 跳过受影响文件识别 |
576
+ | `--provider <name>` | Spec 更新使用的 provider |
577
+ | `--codegen-provider <name>` | 代码生成使用的 provider |
578
+
579
+ ---
580
+
581
+ ### `ai-spec export`
582
+
583
+ 将 DSL 导出为标准 OpenAPI 3.1.0,接入整个 OpenAPI 生态:
584
+
585
+ ```bash
586
+ # 生成 openapi.yaml(默认)
587
+ ai-spec export
588
+
589
+ # 生成 JSON 格式
590
+ ai-spec export --format json
591
+
592
+ # 指定生产服务器地址
593
+ ai-spec export --server https://api.example.com --output docs/openapi.yaml
594
+ ```
595
+
596
+ **生成内容:**
597
+
598
+ - DSL `models[]` → `components.schemas`(字段类型映射 + required 推断)
599
+ - DSL `endpoints[]` → `paths`(路径参数 `:id` → `{id}`,query params,requestBody,success/error responses)
600
+ - `auth: true` 端点 → `security: [{bearerAuth: []}]` + JWT `securitySchemes`
601
+ - 通用 `ErrorResponse` schema(code + message)
602
+
603
+ **下游工具链:**
604
+
605
+ ```bash
606
+ # 导入 Postman
607
+ # File → Import → openapi.yaml
608
+
609
+ # 生成 TypeScript SDK
610
+ npx openapi-generator-cli generate -i openapi.yaml -g typescript-axios -o sdk/
611
+
612
+ # 生成 Go SDK
613
+ openapi-generator generate -i openapi.yaml -g go -o sdk/go/
614
+
615
+ # 启动 Swagger UI
616
+ npx @stoplight/prism-cli mock openapi.yaml
617
+ ```
618
+
619
+ | 选项 | 说明 |
620
+ |---|---|
621
+ | `--format yaml\|json` | 输出格式(默认 yaml) |
622
+ | `--server <url>` | OpenAPI servers[0].url(默认 http://localhost:3000) |
623
+ | `--output <path>` | 输出文件路径(默认 openapi.yaml) |
624
+ | `--dsl <path>` | 指定 DSL 文件(默认自动寻找最新) |
625
+
626
+ ---
627
+
628
+ ### `ai-spec mock`
629
+
630
+ `ai-spec create` 生成了接口 DSL 之后,后端还没有部署,前端无法联调。`ai-spec mock` 从 DSL 直接生成一个**零依赖独立 Mock 服务器**,让前后端可以立即并行开发。
631
+
632
+ ```bash
633
+ # 生成 mock/server.js(独立 Express 服务器,无需数据库)
634
+ ai-spec mock
635
+
636
+ # 同时生成前端 Proxy 配置片段(自动识别 Vite / Next.js / webpack)
637
+ ai-spec mock --proxy
638
+
639
+ # 同时生成 MSW Handlers(适合前端完全脱离后端运行)
640
+ ai-spec mock --msw
641
+
642
+ # 全部生成
643
+ ai-spec mock --port 3002 --proxy --msw
644
+
645
+ # 为工作区所有后端 repo 批量生成
646
+ ai-spec mock --workspace
647
+ ```
648
+
649
+ **生成的文件:**
650
+
651
+ | 文件 | 说明 |
652
+ |---|---|
653
+ | `mock/server.js` | 独立 Express Mock 服务器,每个 DSL 端点对应一个路由,返回 fixture 数据 |
654
+ | `mock/README.md` | 启动指南和端点表 |
655
+ | `mock/proxy.vite.comment.txt` | Vite proxy 配置片段(检测到 vite.config.* 时生成) |
656
+ | `mock/proxy.next.comment.txt` | Next.js rewrites 配置片段(检测到 next.config.* 时生成) |
657
+ | `mock/proxy.webpack.comment.txt` | webpack devServer.proxy 配置片段(默认 fallback) |
658
+ | `src/mocks/handlers.ts` | MSW 请求拦截 handlers(`--msw`) |
659
+ | `src/mocks/browser.ts` | MSW browser worker 初始化(`--msw`) |
660
+
661
+ **Mock Server 特性:**
662
+
663
+ - 无需数据库连接,无需任何运行时依赖(只需 `express`)
664
+ - `auth: true` 的端点自动加 Bearer Token 验证中间件(模拟 401)
665
+ - Fixture 数据从 DSL 数据模型的字段类型推断(String → `"example_xxx"`,DateTime → ISO 8601 字符串,etc.)
666
+ - GET List 端点(描述含 "list"/"all")自动返回分页结构 `{ data: [...], total, page, pageSize }`
667
+
668
+ **联调工作流:**
669
+
670
+ ```
671
+ 后端 repo:
672
+ ai-spec create "用户登录功能" # → 生成 DSL + 代码框架
673
+ ai-spec mock --proxy # → 生成 mock/server.js
674
+ node mock/server.js # → Mock 服务器运行在 localhost:3001
675
+
676
+ 前端 repo:
677
+ 配置 Proxy: 将 /api 代理到 localhost:3001 (参见 mock/proxy.*.txt)
678
+ # 或者:
679
+ ai-spec mock --msw # → 生成 MSW handlers,前端完全脱离后端运行
680
+ ```
681
+
682
+ ---
683
+
236
684
  ## 工作流详解
237
685
 
238
- ### Step 1 — Context Injection(项目感知)
686
+ ### Step 1 — 项目宪法 + Context(宪法加载 & 项目感知)
239
687
 
240
- 自动读取当前项目:
688
+ **项目宪法**(`.ai-spec-constitution.md`):
241
689
 
242
- - `package.json` 依赖列表、技术栈识别(Express / Prisma / React 等)
690
+ - 存在时自动加载,注入到所有 Spec/代码生成 prompt 的最高优先级位置
691
+ - 不存在时自动运行 `init` 生成后继续,生成失败则跳过(不阻断流程)
692
+
693
+ **项目上下文**(自动扫描):
694
+
695
+ - `package.json` → 依赖列表、技术栈识别(Express / Prisma / React / Vue 等)
696
+ - `composer.json` → PHP 依赖列表、技术栈识别(Lumen / Laravel / Eloquent 等)
697
+ - `pom.xml` / `build.gradle` → Java 依赖列表、技术栈识别(Spring Boot / MyBatis / RocketMQ 等);扫描 `**/src/main/java/**/*Controller.java` 作为 API 结构
243
698
  - `prisma/schema.prisma` → 数据库模型
244
- - `src/**/routes/**` / `src/**/controllers/**` → 路由文件(读取前 60 行作为上下文)
699
+ - `src/**/routes/**` / `src/**/controllers/**` → 路由文件(读取前 60 行)
700
+ - `src/**/middleware/**/{error,notFound}.js` → 错误处理模式
701
+ - `src/locales/**` / `src/i18n/**` / `src/constants/**` / `src/enums/**` 等 → **共享配置文件扫描**(见下文)
702
+
703
+ **共享配置文件扫描(防止重复创建):**
704
+
705
+ ContextLoader 会自动扫描以下类别的"单例配置文件",并将其路径和内容片段注入所有 Spec/Codegen prompt:
706
+
707
+ | 类别 | 扫描路径 |
708
+ |---|---|
709
+ | i18n | `src/locales/**`, `src/i18n/**`, `locales/**`, `public/locales/**` |
710
+ | constants | `src/constants/**`, `src/**/constants.{ts,js}` |
711
+ | enums | `src/enums/**`, `src/**/enums.{ts,js}` |
712
+ | config | `src/config/**` |
713
+ | route-index | `src/routes/**/index.{ts,js}`, `src/router/index.{ts,js}` |
714
+
715
+ 这些文件会被标记为 **Append-Only**,AI 在规划阶段会收到明确指令:
245
716
 
246
- 这些信息作为 System Prompt 的一部分注入给 AI,确保生成的 Spec 和代码与现有项目结构一致。
717
+ > "以上文件已存在,必须向其中追加内容,禁止新建同类平行文件"
718
+
719
+ **项目宪法 §8** 也会自动记录这些文件路径,确保 `ai-spec init --force` 重跑后约束持久化。
247
720
 
248
721
  ---
249
722
 
250
- ### Step 2 — Spec Generation(Spec 生成)
723
+ ### Step 2 — Spec 生成 + Tasks 分解
251
724
 
252
- 调用选定的 AI provider,生成结构化的中文 Markdown Spec,模板包含:
725
+ **Spec 生成**:调用选定的 AI,生成结构化中文 Markdown Spec
253
726
 
254
727
  ```
255
728
  # Feature Spec: {功能名称}
@@ -263,11 +736,39 @@ ai-spec config --reset
263
736
  ## 8. 实施要点
264
737
  ```
265
738
 
739
+ **Tasks 分解**(与 Spec 同步生成):
740
+
741
+ Spec 保存后自动生成 `specs/feature-xxx-tasks.json`,包含按实施层级排序的任务列表:
742
+
743
+ ```json
744
+ [
745
+ {
746
+ "id": "TASK-001",
747
+ "title": "Add UserFavorite Prisma model",
748
+ "layer": "data",
749
+ "filesToTouch": ["prisma/schema.prisma", "prisma/migrations/..."],
750
+ "acceptanceCriteria": ["Migration runs successfully", "Table created"],
751
+ "dependencies": [],
752
+ "priority": "high"
753
+ },
754
+ {
755
+ "id": "TASK-002",
756
+ "layer": "service",
757
+ "dependencies": ["TASK-001"],
758
+ ...
759
+ }
760
+ ]
761
+ ```
762
+
763
+ 任务按层级顺序排列:`data → infra → service → api → test`
764
+
765
+ 代码生成时(`api` 模式)如果检测到 Tasks 文件,自动切换为 **task-by-task 模式**,逐任务生成代码,精度更高。
766
+
266
767
  ---
267
768
 
268
- ### Step 3 — Spec Refiner(交互式润色)
769
+ ### Step 3 — 交互式 Spec 润色
269
770
 
270
- 终端交互循环,每轮提供三个选项:
771
+ 每轮提供三个选项:
271
772
 
272
773
  ```
273
774
  ? What would you like to do?
@@ -276,80 +777,615 @@ ai-spec config --reset
276
777
  ✏️ Edit again — continue editing
277
778
  ```
278
779
 
279
- - **Finalize** 确认 Spec,进入下一步
280
- - **AI Polish** — AI 自动润色后在编辑器中打开供确认,不强制覆盖
281
- - **Edit again** — 重新打开编辑器手动修改
780
+ 选择 **AI Polish** 后,AI 改动完成时会自动展示彩色 diff,让你在打开编辑器前先看清楚改了什么:
781
+
782
+ ```
783
+ ── AI Changes ──────────────────────────────
784
+ AI edits: +8 -2 lines
785
+ ## 4. 功能需求
786
+ - - 支持用户登录
787
+ + + 支持用户名/手机号/邮箱多方式登录,失败超过 5 次触发验证码
788
+ @@
789
+ + + ### 边界条件
790
+ + + - token 过期时间 24h,刷新机制...
791
+ ────────────────────────────────────────────
792
+ ```
282
793
 
283
794
  ---
284
795
 
285
- ### Step 4 — Git Worktree(隔离工作区)
796
+ ### Step 3.4 — Spec 质量预评估
797
+
798
+ Approval Gate 之前,系统对 Spec 进行一次 AI 质量检查,给出**建议性**评分,不阻断流程。
799
+
800
+ **三个评分维度(0-10):**
286
801
 
287
- 在项目同级目录自动创建 git worktree:
802
+ | 维度 | 衡量内容 |
803
+ |---|---|
804
+ | **Coverage(覆盖度)** | 错误处理、边界条件、auth 规则是否都有描述? |
805
+ | **Clarity(清晰度)** | API 契约是否清晰到可以可靠提取 DSL?response 结构是否明确? |
806
+ | **Constitution(一致性)** | 是否与项目宪法保持一致?命名、错误码、约定有没有冲突? |
288
807
 
289
808
  ```
290
- 原项目: ~/code/my-app/
291
- worktree: ~/code/my-app-add-user-login/ ← 新目录,独立分支 feature/add-user-login
809
+ [3.4/6] Spec quality assessment...
810
+ ─── Spec Quality Assessment ─────────────────────
811
+ Coverage [████████░░] 8/10 error handling, edge cases, auth
812
+ Clarity [██████░░░░] 6/10 API contracts, response shapes
813
+ Constitution[█████████░] 9/10 naming, error codes, conventions
814
+ Overall [████████░░] 8/10
815
+
816
+ ⚠ DSL extraction may be unreliable — clarityScore < 6
817
+ Consider adding explicit request/response shapes before proceeding.
818
+
819
+ Issues found (2):
820
+ · §5 POST /users/login: 401 error response body format not specified
821
+ · §6 UserFavorite model: missing unique constraint on (userId, itemId)
822
+
823
+ Suggestions:
824
+ 💡 在 §5 明确每个错误码对应的 response body 格式
825
+ ─────────────────────────────────────────────────
292
826
  ```
293
827
 
294
- - 分支已存在时直接复用,不重复创建
295
- - 不是 git 仓库时跳过,在原目录继续
296
- - 可通过 `--skip-worktree` 强制跳过
828
+ - 评分 < 6 时会出现黄色警告,但不阻止继续
829
+ - **DSL 可提取性预警**:Clarity < 6 且无结构化 API 章节时,提示 DSL 提取可能不准确
830
+ - `--skip-assessment` 跳过此步骤(节省一次 AI 调用);`--auto` 模式下自动跳过
297
831
 
298
832
  ---
299
833
 
300
- ### Step 5 — Code Generator(代码生成)
834
+ ### Step 3.5 — Approval Gate(人工确认)
835
+
836
+ 润色完成后、进入代码生成之前,系统会暂停等待你确认:
837
+
838
+ ```
839
+ [3.5/6] Approval Gate — review before code generation
840
+ Spec length : 87 lines / 620 words
841
+ Tasks generated : 7
842
+ Previous version: v1 (specs/feature-user-login-v1.md)
843
+
844
+ ── Changes vs previous version ──────────────
845
+ v1 → v2: +12 -3 lines
846
+ + + ### 安全性
847
+ + + - rate limiting: 每 IP 每分钟最多 10 次登录尝试
848
+ ────────────────────────────────────────────
849
+
850
+ ? Ready to proceed to code generation?
851
+ ❯ ✅ Proceed — start code generation
852
+ 📋 View full spec
853
+ ❌ Abort
854
+ ```
855
+
856
+ - 选 **Proceed** → 继续,Spec 保存并开始代码生成
857
+ - 选 **View full spec** → 终端内展示完整 Spec,再次询问是否继续
858
+ - 选 **Abort** → 中止,Spec **不会**保存到磁盘
859
+
860
+ > `--auto` 模式自动选 Proceed,跳过此步骤。
861
+
862
+ ---
863
+
864
+ ### Step DSL — DSL 提取与校验
865
+
866
+ Approval Gate 通过后,系统自动将 Spec Markdown 转换为 **结构化 JSON DSL**,提取核心架构信息。
867
+
868
+ **DSL 结构:**
869
+
870
+ ```json
871
+ {
872
+ "version": "1.0",
873
+ "feature": { "id": "user-login", "title": "用户登录", "description": "..." },
874
+ "models": [
875
+ {
876
+ "name": "User",
877
+ "fields": [
878
+ { "name": "email", "type": "String", "required": true, "unique": true }
879
+ ],
880
+ "relations": ["has many Session"]
881
+ }
882
+ ],
883
+ "endpoints": [
884
+ {
885
+ "id": "EP-001",
886
+ "method": "POST",
887
+ "path": "/api/v1/auth/login",
888
+ "auth": false,
889
+ "request": { "body": { "email": "string", "password": "string" } },
890
+ "successStatus": 200,
891
+ "successDescription": "返回 JWT token",
892
+ "errors": [
893
+ { "status": 401, "code": "INVALID_CREDENTIALS", "description": "邮箱或密码错误" }
894
+ ]
895
+ }
896
+ ],
897
+ "behaviors": [
898
+ {
899
+ "id": "BHV-001",
900
+ "description": "连续登录失败超过 5 次锁定账号",
901
+ "trigger": "登录失败",
902
+ "constraints": ["失败计数存 Redis", "锁定 30 分钟"]
903
+ }
904
+ ]
905
+ }
906
+ ```
907
+
908
+ **校验机制(无外部依赖):**
909
+
910
+ - 所有必填字段存在且类型正确(`method` 枚举、`path` 以 `/` 开头、`auth` 为 boolean 等)
911
+ - 数组边界检查(models ≤ 50、endpoints ≤ 100 等),防止超大响应导致问题
912
+ - 失败时展示精确的字段路径错误,最多自动重试 2 次(第 2 次携带错误反馈)
913
+ - 2 次重试后仍失败 → 交互式询问:跳过继续 / 中止
914
+
915
+ **前端/后端自动分叉:**
916
+
917
+ 系统根据项目的 `package.json` 依赖自动检测是否为前端项目(`react` / `vue` / `next` / `react-native` / `expo`),并切换到对应的 DSL 提取策略:
918
+
919
+ | 项目类型 | DSL 输出重心 |
920
+ |---|---|
921
+ | 后端(Node/Express/Prisma)| `endpoints[]` + `models[]` + `behaviors[]` |
922
+ | 前端(React/Vue/Next)| `endpoints[]`(本前端调用的接口)+ `components[]`(ComponentSpec) |
923
+
924
+ **`ComponentSpec` 结构(前端专属):**
925
+
926
+ ```json
927
+ {
928
+ "id": "CMP-001",
929
+ "name": "LikeButton",
930
+ "description": "点赞/取消点赞按钮,带乐观更新",
931
+ "props": [{ "name": "postId", "type": "string", "required": true }],
932
+ "events": [{ "name": "onLikeChange", "payload": "{ liked: boolean, count: number }" }],
933
+ "state": { "liked": "boolean", "count": "number", "loading": "boolean" },
934
+ "apiCalls": ["EP-001"]
935
+ }
936
+ ```
301
937
 
302
- 根据 `--codegen` 参数选择模式:
938
+ **抗幻觉设计:**
303
939
 
304
- **`api` 模式(推荐用于自动化)**
940
+ - Prompt 明确要求"只提取 Spec 中明确写出的内容,不推断、不补全"
941
+ - 空数组 `[]` 是正确输出,不强求每个字段都有内容
942
+ - 重试时把上次的错误字段路径和原因一并告知 AI,定向修复
305
943
 
306
- 两阶段生成:
307
- 1. AI 读取 Spec,输出 JSON 格式的文件操作计划(create / modify)
308
- 2. 对每个文件逐一调用 AI 生成完整代码,写入 worktree
944
+ **输出文件:** `specs/feature-<slug>-v<N>.dsl.json`(与 spec 文件并排)
945
+
946
+ **用于 codegen:** DSL(含 `components[]`)被转换为紧凑文本摘要注入 codegen prompt,提供精确的组件接口定义和端点签名。
947
+
948
+ > `--skip-dsl` 跳过此步骤,`--auto` 模式下提取失败时自动跳过(不中断流水线)。
949
+
950
+ ---
951
+
952
+ ### Step 4 — Git Worktree(隔离工作区)
309
953
 
310
954
  ```
311
- Plan: 3 file(s) to process
312
- + src/controllers/userController.ts: Handle user login logic
313
- + src/routes/client/user.ts: Register login routes
314
- ~ src/routes/client/index.ts: Mount user router
955
+ 原项目: ~/code/my-app/
956
+ worktree: ~/code/my-app-add-user-login/ 独立分支 feature/add-user-login
957
+ ```
958
+
959
+ - 分支已存在时直接复用
960
+ - 不是 git 仓库时跳过,在原目录继续
961
+ - `--skip-worktree` 强制跳过
315
962
 
316
- Generating src/controllers/userController.ts... ✔
317
- Generating src/routes/client/user.ts... ✔
318
- Generating src/routes/client/index.ts...
963
+ ---
964
+
965
+ ### Step 5 — 代码生成(增量 · 断点续传)
966
+
967
+ Spec 保存时使用**版本化命名**:`feature-<slug>-v<N>.md`,同一 idea 每次运行自动递增版本号:
968
+
969
+ ```
970
+ specs/
971
+ ├── feature-user-login-v1.md ← 第一次运行
972
+ ├── feature-user-login-v1-tasks.json
973
+ ├── feature-user-login-v2.md ← 修改后再次运行
974
+ └── feature-user-login-v2-tasks.json
319
975
  ```
320
976
 
321
977
  **`claude-code` 模式(默认)**
322
978
 
323
- worktree 目录中启动 Claude Code CLI 交互式会话,由用户手动引导实现。找不到 `claude` CLI 时自动降级到 `plan` 模式。
979
+ - **交互模式**(默认):在 worktree 目录启动 Claude Code CLI,有 Tasks 文件时将任务列表注入 `.claude-prompt.txt`
980
+ - **`--auto` 增量模式**:改为对每个 task 单独运行 `claude -p`,每个 task 完成后写入 checkpoint,进度实时显示:
981
+
982
+ ```
983
+ [████░░░░░░░░░░░░░░░░] 20% → TASK-001 💾 Add UserFavorite Prisma model
984
+ [████████░░░░░░░░░░░░] 40% → TASK-002 🔧 Implement FavoriteService
985
+ [████████████░░░░░░░░] 60% → TASK-003 🌐 Add API routes
986
+ ✔ Incremental build: 3/3 tasks completed.
987
+ ```
988
+
989
+ 检测到 `rtk` 已安装时自动切换为 `rtk claude` 执行。
990
+
991
+ **`api` 模式**
992
+
993
+ 有 Tasks 文件时按 task 顺序生成,每个 task 单独 AI 调用:
994
+
995
+ ```
996
+ [████░░░░░░░░░░░░░░░░] 20% → TASK-001 💾 Add schema
997
+ + prisma/schema.prisma... ✔
998
+ [████████░░░░░░░░░░░░] 40% → TASK-002 🔧 Service 层
999
+ + src/services/favoriteService.ts... ✔
1000
+ ~ src/routes/client/index.ts... ✔
1001
+ ```
1002
+
1003
+ **跨 Task 一致性保障**:每个 task 完成后,写入的 `src/api*` / `src/service*` / `src/store*` / `src/composable*` 文件会被读回并缓存;后续 task 的 prompt 中注入这些文件的**所有 export 声明行**(而非前 N 字符的截断),确保路由/组件层 import 使用的函数名与 API 层完全一致(不再出现 `getTasks` vs `getTaskList` 的跨 task 幻觉)。当前 task 创建新路由模块文件时,也会自动携带对应 `routes/index.ts` 的精确注册指令。
1004
+
1005
+ **分页参数 ground-truth 注入**:`frontend-context-loader` 自动扫描 `src/apis/`(及 `src/api/`、`src/services/` 等)中现有的 API 文件,找到包含分页字段(`pageIndex`/`pageSize`/`pageNum`/`current` 等)的 interface 及对应导出函数,作为 `paginationExample` 注入 prompt,并标注 "COPY THIS EXACTLY"。生成的列表接口将与项目现有接口使用完全相同的分页参数名称和 HTTP 方法(POST body 或 GET query)。
1006
+
1007
+ **续跑(`--resume`)**
1008
+
1009
+ 任一模式中,task 完成后状态写入 `tasks.json`(`"status": "done"`)。运行中断后加 `--resume` 可跳过已完成的 task:
1010
+
1011
+ ```bash
1012
+ # 第一次运行,中途中断
1013
+ ai-spec create "用户收藏功能" --auto
1014
+
1015
+ # 从上次中断位置续跑
1016
+ ai-spec create "用户收藏功能" --auto --resume
1017
+ ```
324
1018
 
325
1019
  **`plan` 模式**
326
1020
 
327
- AI 输出详细的实施方案(文件清单 + 步骤顺序),不写入任何文件。适合人工开发参考。
1021
+ 仅输出实施方案,不写入任何文件。
1022
+
1023
+ ---
1024
+
1025
+ ### Step 7 — 测试生成
1026
+
1027
+ 测试生成有两种模式:**普通骨架模式**(默认)和 **TDD 模式**(`--tdd`)。
328
1028
 
329
1029
  ---
330
1030
 
331
- ### Step 6 — Code Review(代码审查)
1031
+ #### 普通骨架模式(默认)
1032
+
1033
+ 代码生成完成后,如果 DSL 提取成功,系统自动检测项目类型(前端/后端)并生成对应的测试骨架。
1034
+
1035
+ **后端项目(Node.js / Express / Koa 等):**
1036
+
1037
+ - 自动检测测试目录(`tests/` · `test/` · `__tests__/` · `spec/`,默认 `tests/`)
1038
+ - 每个端点生成:成功路径测试、参数校验测试、鉴权测试(`auth: true` 时)
1039
+ - 每个模型生成:创建测试、唯一约束测试(有 `unique` 字段时)
1040
+ - 测试框架:Jest / Vitest 自动检测
1041
+
1042
+ **前端项目(React / Vue / Next.js / React Native):**
332
1043
 
333
- 抓取 worktree 中的 git diff,与 Spec 一起发送给 AI,以架构师身份输出结构化审查报告。
1044
+ - 测试框架:自动检测 `@testing-library/react`(RTL) / `cypress` / `vitest` / `jest`
1045
+ - 每个 `ComponentSpec` 生成:render 测试 / props 测试 / 交互事件测试 / loading 状态测试
1046
+ - API hook 层生成独立测试文件(测试 hook,不测试 component 内部)
1047
+ - 乐观更新流程:自动生成 rollback case(模拟 server error)
1048
+ - 节流/防抖:自动生成 `jest.useFakeTimers()` 延迟行为测试
1049
+
1050
+ > 测试骨架只生成 `describe/it` 结构,不实现断言(用 TODO 注释标出),供开发者补全。
1051
+ > `--skip-tests` 跳过此步骤;`--skip-dsl` 时自动跳过。
1052
+
1053
+ ---
1054
+
1055
+ #### TDD 模式(`--tdd`)
1056
+
1057
+ `--tdd` 改变了整个流程的顺序:**测试在代码生成之前写入**,测试有真实断言,初始状态全部失败,error feedback loop 驱动代码实现直到测试通过。
1058
+
1059
+ ```
1060
+ 普通模式:DSL → codegen → 测试骨架(TODO 注释)→ error feedback(2 轮)
1061
+
1062
+ TDD 模式:DSL → TDD 测试(真实断言,全部 FAIL)→ codegen → error feedback(3 轮,以通过测试为目标)
1063
+ ```
1064
+
1065
+ **TDD 测试 vs 骨架对比:**
1066
+
1067
+ ```typescript
1068
+ // 骨架(普通模式)
1069
+ it('should create a task', async () => {
1070
+ // TODO: implement test
1071
+ });
1072
+
1073
+ // TDD 模式 — 真实断言,基于 DSL 生成
1074
+ it('POST /api/v1/tasks → 201 with task data', async () => {
1075
+ const res = await request(app)
1076
+ .post('/api/v1/tasks')
1077
+ .set('Authorization', 'Bearer test-token')
1078
+ .send({ title: 'My task', status: 'todo', dueDate: '2026-12-31' });
1079
+ expect(res.status).toBe(201);
1080
+ expect(res.body.data).toMatchObject({ title: 'My task', status: 'todo' });
1081
+ expect(res.body.data.id).toBeDefined();
1082
+ });
1083
+
1084
+ it('POST /api/v1/tasks → 400 MISSING_FIELD when title absent', async () => {
1085
+ const res = await request(app)
1086
+ .post('/api/v1/tasks')
1087
+ .set('Authorization', 'Bearer test-token')
1088
+ .send({ status: 'todo' });
1089
+ expect(res.status).toBe(400);
1090
+ expect(res.body.code).toBe('MISSING_FIELD');
1091
+ });
1092
+ ```
1093
+
1094
+ **使用方式:**
1095
+
1096
+ ```bash
1097
+ ai-spec create "任务管理功能" --tdd
1098
+ ai-spec create "任务管理功能" --tdd --codegen api
1099
+ ```
1100
+
1101
+ **注意事项:**
1102
+ - 仅支持**后端项目**(使用 supertest 做 HTTP 集成测试)
1103
+ - 依赖 DSL 提取成功(Spec 需要有清晰的 API 设计章节);DSL 为空时退化为普通骨架模式
1104
+ - error feedback loop 在 TDD 模式下最多运行 **3 轮**(普通模式 2 轮)
1105
+
1106
+ ---
1107
+
1108
+ ### Step 8 — 错误反馈自动修复
1109
+
1110
+ 测试骨架生成后,系统自动运行项目已有的测试和 lint 命令,检测生成代码中的错误,并让 AI 自动修复,最多循环 2 次:
1111
+
1112
+ **错误检测:**
1113
+
1114
+ - 自动检测 `npm test` / `npx vitest run` / `npx jest --forceExit`
1115
+ - 自动检测 `npm run lint` / `npx eslint .`
1116
+ - 无检测到命令时跳过
1117
+
1118
+ **修复流程(最多 2 个 cycle):**
1119
+
1120
+ ```
1121
+ [cycle 1/2] Running tests: npm test
1122
+ ✘ Tests failed (3 error(s) captured)
1123
+ Attempting auto-fix (3 error(s))...
1124
+ ✔ Auto-fixed: src/services/authService.ts
1125
+ [cycle 2/2] Running tests: npm test
1126
+ ✔ Tests passed.
1127
+ ✔ All checks passed after 2 cycle(s).
1128
+ ```
1129
+
1130
+ - 按文件分组错误,逐文件提交 AI 修复(携带 DSL 上下文)
1131
+ - 任一 cycle 全部通过则提前结束
1132
+ - 2 次后仍有错误 → 给出警告提示(不中断流水线)
1133
+
1134
+ > `--skip-error-feedback` 跳过此步骤。
1135
+
1136
+ ---
1137
+
1138
+ ### Step 9 — 代码审查 + 经验积累
1139
+
1140
+ 与 Spec 一起发送给 AI,输出结构化审查报告:
1141
+
1142
+ | 代码生成模式 | 审查方式 |
1143
+ |---|---|
1144
+ | `api` | 直接读取生成的文件内容(不依赖 git diff,生成后立即可审查) |
1145
+ | `claude-code` | 抓取 worktree 中的 git diff(需先 `git add .`) |
1146
+
1147
+ 审查完成后,系统自动从审查报告的 **⚠️ 问题** 章节提取可操作 issue,追加到项目宪法的 **§9 积累教训** 中:
1148
+
1149
+ ```markdown
1150
+ ## 9. 积累教训 (Accumulated Lessons)
1151
+ - 🔒 **[2026-03-23]** 登录接口缺少 rate limiting,需在中间件层添加
1152
+ - 🐛 **[2026-03-23]** 异步错误未被全局 error handler 捕获
1153
+ - 📐 **[2026-03-23]** service 层直接使用了 req/res 对象,违反分层规范
1154
+ ```
1155
+
1156
+ - **自动分类**:security 🔒 / performance ⚡ / bug 🐛 / pattern 📐 / general 📝
1157
+ - **自动去重**:相似内容(前 50 字符匹配)不重复追加
1158
+ - 每次代码审查最多提取 10 条 issue
1159
+ - 下次运行 `ai-spec create` 时,这些教训会随宪法注入所有 Spec/代码生成 prompt,避免重蹈覆辙
1160
+
1161
+ > 审查每运行一次,宪法就"学到"一些新东西,随项目迭代持续进化。
1162
+
1163
+ ---
1164
+
1165
+ ## 多 Repo 工作区模式
1166
+
1167
+ 当父目录中存在 `.ai-spec-workspace.json` 时,`ai-spec create` 自动切换为**多 Repo 联动模式**,一句需求驱动前后端全链路实现。
1168
+
1169
+ ### 快速示例
1170
+
1171
+ ```bash
1172
+ # 目录结构
1173
+ ~/code/my-project/
1174
+ ├── .ai-spec-workspace.json
1175
+ ├── backend/ ← Node.js / Express API 服务
1176
+ └── frontend/ ← React 应用
1177
+
1178
+ # 在 my-project/ 下运行
1179
+ cd ~/code/my-project
1180
+ ai-spec create "实现用户点赞功能"
1181
+ ```
1182
+
1183
+ ### 多 Repo 流水线步骤
1184
+
1185
+ ```
1186
+ [W1] Loading project contexts...
1187
+ ✔ backend (node-express / backend) constitution: ✔
1188
+ ✔ frontend (react / frontend) constitution: ✘ (will auto-generate)
1189
+
1190
+ [W2] Decomposing requirement across repos...
1191
+ ✔ Decomposition complete.
1192
+
1193
+ backend → 新增 POST /api/v1/posts/:id/like 接口,Like 模型,幂等处理
1194
+ frontend → 点赞按钮交互:节流 300ms,乐观更新,失败回滚,成功后 re-fetch 详情
1195
+
1196
+ [W3] Requirement decomposition preview:
1197
+ ┌────────────────────────────────────────────────────────┐
1198
+ │ backend [contract provider] │
1199
+ │ POST /api/v1/posts/:id/like [auth required] │
1200
+ │ DELETE /api/v1/posts/:id/like │
1201
+ │ frontend depends on: backend │
1202
+ │ UX: throttle 300ms · optimistic update · rollback │
1203
+ │ re-fetch: GET /api/v1/posts/:id on success │
1204
+ └────────────────────────────────────────────────────────┘
1205
+ ? Proceed with per-repo pipelines? ✅ Yes / ❌ Abort
1206
+
1207
+ ── Repo 1/2: backend ──────────────────────────────────────────
1208
+ [1/9] Loading context (backend)...
1209
+ [2/9] Generating spec...
1210
+ [DSL] Extracting DSL... ✔ 2 endpoints, 1 model
1211
+ ...(完整单 repo 流水线)...
1212
+ [9/9] Code review + knowledge memory ✔
1213
+
1214
+ ── Repo 2/2: frontend ─────────────────────────────────────────
1215
+ [1/9] Loading context (frontend)...
1216
+ [2/9] Generating spec... ← 自动注入后端 API Contract(端点、TS 类型定义)
1217
+ ╔══ Backend API Contract (injected) ══╗
1218
+ ║ POST /api/v1/posts/:id/like [auth]║
1219
+ ║ interface LikePostRequest { ... } ║
1220
+ ╚═════════════════════════════════════╝
1221
+ ...(完整单 repo 流水线)...
1222
+
1223
+ [W5] ✔ Multi-repo pipeline complete (2/2 repos succeeded)
1224
+ Specs written:
1225
+ backend/specs/feature-like-v1.md
1226
+ frontend/specs/feature-like-v1.md
1227
+ ```
1228
+
1229
+ ### 核心设计
1230
+
1231
+ | 能力 | 说明 |
1232
+ |---|---|
1233
+ | **需求自动拆分** | AI 将一句需求分解为每个 repo 的职责描述 |
1234
+ | **UX 决策注入** | 前端自动获得:节流/防抖时间、是否乐观更新、失败回滚策略、成功后需 re-fetch 的接口列表 |
1235
+ | **基于真实代码的 UX 决策** | 分解时注入前端已有的 hook/store/API wrapper 文件列表,AI 的 specIdea 会直接引用真实文件名而非泛泛描述 |
1236
+ | **Contract Bridge** | 后端 DSL → TypeScript 接口定义 → 注入前端 Spec 生成 prompt,确保路径/方法/类型严格对齐 |
1237
+ | **前端 Codegen 上下文** | API 模式代码生成时自动注入前端项目的 hook/store/API wrapper 现有代码,附注"extend, do NOT recreate" |
1238
+ | **依赖顺序执行** | 按 backend → shared → frontend → mobile 顺序运行,后端先出产 contract |
1239
+ | **容错隔离** | 单个 repo 失败不影响其他 repo;失败时打印错误并继续 |
1240
+ | **优雅降级** | 未找到 `.ai-spec-workspace.json` 时静默退回单 repo 模式,无需任何配置 |
1241
+
1242
+ ### UxDecision 字段说明
1243
+
1244
+ 需求拆分时 AI 会为前端/移动端 repo 生成 `uxDecisions`:
1245
+
1246
+ | 字段 | 类型 | 说明 |
1247
+ |---|---|---|
1248
+ | `throttleMs` | `number?` | 按钮点击节流(ms),适用于频繁操作如点赞 |
1249
+ | `debounceMs` | `number?` | 输入防抖(ms),适用于搜索框 |
1250
+ | `optimisticUpdate` | `boolean` | 是否在服务端确认前先更新 UI |
1251
+ | `reloadOnSuccess` | `string[]?` | 成功后需 re-fetch 的接口路径列表 |
1252
+ | `errorRollback` | `boolean` | 乐观更新失败时是否回滚 UI 状态 |
1253
+ | `loadingState` | `boolean` | 请求期间是否显示加载指示器 |
1254
+ | `notes` | `string?` | 补充协调说明 |
1255
+
1256
+ ---
1257
+
1258
+ ## 多语言后端支持
1259
+
1260
+ ai-spec 不绑定特定后端语言。`workspace init` 和 `detectRepoType()` 会自动识别以下项目类型:
1261
+
1262
+ | 语言 / 框架 | 识别依据 | RepoType | Role |
1263
+ |---|---|---|---|
1264
+ | Node.js / Express | `package.json` 含 `express` | `node-express` | backend |
1265
+ | Node.js / Koa | `package.json` 含 `koa` | `node-koa` | backend |
1266
+ | Go | 根目录存在 `go.mod` | `go` | backend |
1267
+ | Rust | 根目录存在 `Cargo.toml` | `rust` | backend |
1268
+ | Java (Maven) | 根目录存在 `pom.xml` | `java` | backend |
1269
+ | Java (Gradle) | 根目录存在 `build.gradle` / `build.gradle.kts` | `java` | backend |
1270
+
1271
+ > **Java 上下文提取**:`ContextLoader` 会解析 `pom.xml`(正则提取 `<artifactId>` 依赖列表 + `<maven.compiler.source>` Java 版本)并推断技术栈(Spring Boot、MyBatis、Dubbo、RocketMQ、Redis、OpenFeign 等);扫描 `**/src/main/java/**/*Controller.java` 作为 API 结构;读取 `application.properties/yml` 作为路由摘要。workspace `[W1]` 阶段会正常显示 `Java, Java 11, Spring Boot, RocketMQ... (N deps)` 而非 `unknown (0 deps)`。
1272
+ | Python | 根目录存在 `requirements.txt` / `pyproject.toml` / `setup.py` | `python` | backend |
1273
+ | **PHP / Lumen / Laravel** | **根目录存在 `composer.json`** | **`php`** | **backend** |
1274
+ | React | `package.json` 含 `react` | `react` | frontend |
1275
+ | Next.js | `package.json` 含 `next` | `next` | frontend |
1276
+ | Vue | `package.json` 含 `vue` | `vue` | frontend |
1277
+ | React Native / Expo | `package.json` 含 `react-native` / `expo` | `react-native` | mobile |
1278
+
1279
+ **错误反馈自动修复** (`error-feedback.ts`) 也针对各语言自动选择测试/Lint 命令:
1280
+
1281
+ | 语言 | 测试命令 | Lint 命令 |
1282
+ |---|---|---|
1283
+ | Node.js | `npm test` / `npx vitest run` | `npm run lint` / `npx eslint .` |
1284
+ | Go | `go test ./...` | `go vet ./...` |
1285
+ | Rust | `cargo test` | `cargo clippy -- -D warnings` |
1286
+ | Java (Maven) | `mvn test -q` | — |
1287
+ | Java (Gradle) | `./gradlew test` | — |
1288
+ | Python | `pytest` | `ruff check .` / `flake8 .` |
1289
+ | **PHP** | **`./vendor/bin/phpunit`** 或 **`php artisan test`** | **`./vendor/bin/phpstan analyse`**(如已安装) |
1290
+
1291
+ > **代码生成 Prompt 策略**:`ai-spec create` 和 `ai-spec update --codegen` 会根据自动检测的 `RepoType` 选择对应语言的 system prompt(`getCodeGenSystemPrompt(repoType)`)。Go 使用 Go 惯用写法,Python 匹配 FastAPI/Flask/Django,Java 使用 Spring Boot 分层模式,Rust 使用 Result<T,E> 风格,**PHP 匹配 Lumen/Laravel 路由约定,使用 Eloquent ORM,PSR-12 规范**。
334
1292
 
335
1293
  ---
336
1294
 
337
1295
  ## 配置文件
338
1296
 
339
- `.ai-spec.json` 存放在项目根目录,所有 `create` / `review` 命令都会自动读取:
1297
+ `.ai-spec.json` 存放在项目根目录,所有命令自动读取:
340
1298
 
341
1299
  ```json
342
1300
  {
343
1301
  "provider": "qwen",
344
- "model": "qwen-max",
1302
+ "model": "qwen3-235b-a22b",
345
1303
  "codegen": "api",
346
1304
  "codegenProvider": "glm",
347
- "codegenModel": "glm-4-plus"
1305
+ "codegenModel": "glm-5"
348
1306
  }
349
1307
  ```
350
1308
 
351
1309
  **优先级(从高到低):** 命令行参数 > `.ai-spec.json` > 内置默认值
352
1310
 
1311
+ 项目根目录还有两个自动生成的文件:
1312
+
1313
+ | 文件 | 说明 |
1314
+ |---|---|
1315
+ | `.ai-spec-constitution.md` | 项目宪法,`init` 生成,所有命令自动读取 |
1316
+ | `.ai-spec.json` | 模型配置,`config` / `model` 命令管理 |
1317
+
1318
+ ### 共享宪法(跨项目规范)
1319
+
1320
+ 除了项目级宪法,ai-spec 还支持**全局宪法**,将团队通用规范从单个项目提升到工作区/用户级别。
1321
+
1322
+ **搜索顺序(优先级从高到低):**
1323
+
1324
+ ```
1325
+ 1. 工作区根目录 ~/code/my-project/.ai-spec-global-constitution.md
1326
+ 2. 用户 home 目录 ~/.ai-spec-global-constitution.md
1327
+ ```
1328
+
1329
+ **生成全局宪法:**
1330
+
1331
+ ```bash
1332
+ # 在工作区根目录下生成(对该工作区所有 repo 生效)
1333
+ cd ~/code/my-project
1334
+ ai-spec init --global
1335
+
1336
+ # 在 home 目录生成(对所有项目生效)
1337
+ cd ~
1338
+ ai-spec init --global
1339
+ ```
1340
+
1341
+ **注入规则:**
1342
+
1343
+ 全局宪法 + 项目宪法在运行时自动合并,**项目规则优先级更高**:
1344
+
1345
+ ```
1346
+ <!-- BEGIN GLOBAL CONSTITUTION (team baseline — lower priority) -->
1347
+ # Global Constitution
1348
+ ## 1. 团队 API 规范 ← 所有服务通用的响应格式、错误码前缀
1349
+ ## 2. 团队命名规范 ← 环境变量命名、路由前缀约定
1350
+ ...
1351
+ <!-- END GLOBAL CONSTITUTION -->
1352
+
1353
+ <!-- BEGIN PROJECT CONSTITUTION (project-specific — HIGHER priority) -->
1354
+ # Project Constitution
1355
+ ## 1. 架构规则 ← 本项目特有的分层约束
1356
+ ...
1357
+ <!-- END PROJECT CONSTITUTION -->
1358
+ ```
1359
+
1360
+ 当 `ai-spec init` 检测到全局宪法时,会提示:
1361
+
1362
+ ```
1363
+ ℹ Global constitution detected: ~/code/my-project/.ai-spec-global-constitution.md
1364
+ It will be merged with this project constitution at runtime.
1365
+ Project rules take priority over global rules.
1366
+ ```
1367
+
1368
+ ---
1369
+
1370
+ ## RTK 集成
1371
+
1372
+ > RTK 仅对 **`claude-code` 模式**有效,不影响 `api` 模式下对 GLM / Qwen / Gemini 等 provider 的直接 API 调用。
1373
+
1374
+ RTK(Rust Token Killer)作为 Claude Code 的 hook 运行,拦截 Claude Code 会话中的 shell 命令输出(`git diff`、`git status`、`npm` 等),压缩后再返回给 Claude,从而减少 context 中的 token 消耗。
1375
+
1376
+ 安装 RTK 后,`ai-spec` 在 `claude-code` 模式下自动检测并使用 `rtk claude` 替代 `claude` 执行:
1377
+
1378
+ ```bash
1379
+ # 检测到 rtk 时的输出(仅 claude-code 模式)
1380
+ ✓ RTK detected — using rtk claude for token savings
1381
+ ```
1382
+
1383
+ 配合 `--auto` 参数效果最佳(非交互执行,减少会话开销):
1384
+
1385
+ ```bash
1386
+ ai-spec create "功能描述" --auto
1387
+ ```
1388
+
353
1389
  ---
354
1390
 
355
1391
  ## 全局安装
@@ -358,10 +1394,14 @@ AI 输出详细的实施方案(文件清单 + 步骤顺序),不写入任
358
1394
  npm run build
359
1395
  npm link
360
1396
 
361
- # 之后在任意项目目录使用
362
- ai-spec model # 切换模型
363
- ai-spec create "增加消息通知功能" # 开始开发
364
- ai-spec review # 代码审查
1397
+ # 无参数运行 — 展示欢迎界面(版本、当前 provider、最近 spec 列表)
1398
+ ai-spec
1399
+
1400
+ # 在任意项目目录使用
1401
+ ai-spec init # 生成项目宪法
1402
+ ai-spec create "增加消息通知功能" # 开始开发
1403
+ ai-spec review # 代码审查
1404
+ ai-spec model --list # 查看所有模型
365
1405
  ```
366
1406
 
367
1407
  ---
@@ -371,17 +1411,46 @@ ai-spec review # 代码审查
371
1411
  ```
372
1412
  ai-spec-dev-poc/
373
1413
  ├── cli/
374
- └── index.ts # CLI 入口,定义所有命令
1414
+ ├── index.ts # CLI 入口,定义所有命令
1415
+ │ └── welcome.ts # 欢迎界面(无参数运行时展示)
375
1416
  ├── core/
376
- │ ├── spec-generator.ts # 所有 AI Provider + SpecGenerator
377
- │ ├── context-loader.ts # 项目上下文读取
378
- │ ├── spec-refiner.ts # 交互式 Spec 润色循环
379
- │ ├── code-generator.ts # 三模式代码生成器
380
- └── reviewer.ts # AI 代码审查
1417
+ │ ├── spec-generator.ts # 所有 AI Provider + SpecGenerator
1418
+ │ ├── context-loader.ts # 项目上下文 + 宪法加载
1419
+ │ ├── spec-refiner.ts # 交互式 Spec 润色(含 AI diff 预览)
1420
+ │ ├── spec-versioning.ts # Spec 版本化:slug/版本递增/彩色 diff 引擎
1421
+ ├── dsl-types.ts # SpecDSL 类型定义(扁平,无递归)
1422
+ │ ├── dsl-validator.ts # DSL 校验器(迭代,无外部依赖)
1423
+ │ ├── dsl-extractor.ts # AI 提取 + retry + DSL→codegen 摘要
1424
+ │ ├── code-generator.ts # 三模式代码生成器(DSL注入 · 增量执行 · 进度条 · RTK感知 · 跨Task缓存)
1425
+ │ ├── constitution-generator.ts # 项目宪法生成器
1426
+ │ ├── task-generator.ts # Tasks 分解器(含断点续传状态)
1427
+ │ ├── combined-generator.ts # Spec + Tasks 合并单次 AI 调用
1428
+ │ ├── reviewer.ts # AI 代码审查(git diff / 文件内容双模式)
1429
+ │ ├── test-generator.ts # 测试骨架生成器(DSL → Jest/Vitest 骨架)
1430
+ │ ├── error-feedback.ts # 错误反馈自动修复(测试+lint检测 · AI修复循环)
1431
+ │ ├── knowledge-memory.ts # 经验积累:审查 issue → 宪法§9
1432
+ │ ├── workspace-loader.ts # [Phase 4] 工作区配置加载 + repo 类型自动检测
1433
+ │ ├── requirement-decomposer.ts # [Phase 4] 需求跨 repo 拆分 + UX 决策生成
1434
+ │ ├── contract-bridge.ts # [Phase 4] 后端 DSL → 前端 TS 接口契约桥接
1435
+ │ ├── frontend-context-loader.ts # [v0.8] 前端深度感知(hook/store/API封装/测试框架/分页 pattern 检测)
1436
+ │ └── global-constitution.ts # [v0.8] 全局宪法:加载 / 合并 / 保存(跨项目共享规范)
381
1437
  ├── git/
382
- │ └── worktree.ts # Git Worktree 管理
1438
+ │ └── worktree.ts # Git Worktree 管理
383
1439
  ├── prompts/
384
- │ ├── spec.prompt.ts # Spec 生成 System Prompt
385
- └── codegen.prompt.ts # 代码生成 / 审查 System Prompt
386
- └── specs/ # 生成的 Spec 文件输出目录
1440
+ │ ├── spec.prompt.ts # Spec 生成 System Prompt
1441
+ ├── codegen.prompt.ts # 代码生成 / 审查 System Prompt
1442
+ │ ├── constitution.prompt.ts # 项目宪法生成 System Prompt
1443
+ │ ├── tasks.prompt.ts # Tasks 分解 System Prompt
1444
+ │ ├── dsl.prompt.ts # DSL 提取 System Prompt(含抗幻觉规则)
1445
+ │ ├── testgen.prompt.ts # 测试骨架生成 System Prompt
1446
+ │ ├── decompose.prompt.ts # [Phase 4] 需求拆分 System Prompt(含 UX 决策指南)
1447
+ │ ├── frontend-spec.prompt.ts # [Phase 4] 前端 Spec 生成 Prompt(含 API 契约注入)
1448
+ │ └── global-constitution.prompt.ts # [v0.8] 全局宪法生成 System Prompt(5 章跨端规范)
1449
+ ├── specs/ # 生成的 Spec + DSL + Tasks 输出目录
1450
+ │ ├── feature-<slug>-v1.md ← 版本化命名
1451
+ │ ├── feature-<slug>-v1.dsl.json ← DSL(Phase 2 新增)
1452
+ │ ├── feature-<slug>-v1-tasks.json
1453
+ │ └── ...
1454
+ ├── README.md
1455
+ └── RELEASE_LOG.md # 版本变更记录
387
1456
  ```