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.
- package/.claude/settings.local.json +18 -0
- package/README.md +1215 -146
- package/RELEASE_LOG.md +1489 -0
- package/cli/index.ts +1981 -0
- package/cli/welcome.ts +151 -0
- package/core/code-generator.ts +757 -0
- package/core/combined-generator.ts +63 -0
- package/core/constitution-consolidator.ts +141 -0
- package/core/constitution-generator.ts +89 -0
- package/core/context-loader.ts +453 -0
- package/core/contract-bridge.ts +217 -0
- package/core/dsl-extractor.ts +337 -0
- package/core/dsl-types.ts +166 -0
- package/core/dsl-validator.ts +450 -0
- package/core/error-feedback.ts +354 -0
- package/core/frontend-context-loader.ts +602 -0
- package/core/global-constitution.ts +88 -0
- package/core/key-store.ts +49 -0
- package/core/knowledge-memory.ts +171 -0
- package/core/mock-server-generator.ts +571 -0
- package/core/openapi-exporter.ts +361 -0
- package/core/requirement-decomposer.ts +198 -0
- package/core/reviewer.ts +259 -0
- package/core/spec-assessor.ts +99 -0
- package/core/spec-generator.ts +428 -0
- package/core/spec-refiner.ts +89 -0
- package/core/spec-updater.ts +227 -0
- package/core/spec-versioning.ts +213 -0
- package/core/task-generator.ts +174 -0
- package/core/test-generator.ts +273 -0
- package/core/workspace-loader.ts +256 -0
- package/dist/cli/index.js +6717 -672
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/index.mjs +6717 -670
- package/dist/cli/index.mjs.map +1 -1
- package/dist/index.d.mts +147 -27
- package/dist/index.d.ts +147 -27
- package/dist/index.js +2337 -286
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +2329 -285
- package/dist/index.mjs.map +1 -1
- package/git/worktree.ts +109 -0
- package/index.ts +9 -0
- package/package.json +4 -28
- package/prompts/codegen.prompt.ts +259 -0
- package/prompts/consolidate.prompt.ts +73 -0
- package/prompts/constitution.prompt.ts +63 -0
- package/prompts/decompose.prompt.ts +168 -0
- package/prompts/dsl.prompt.ts +203 -0
- package/prompts/frontend-spec.prompt.ts +191 -0
- package/prompts/global-constitution.prompt.ts +61 -0
- package/prompts/spec-assess.prompt.ts +53 -0
- package/prompts/spec.prompt.ts +102 -0
- package/prompts/tasks.prompt.ts +35 -0
- package/prompts/testgen.prompt.ts +84 -0
- package/prompts/update.prompt.ts +131 -0
- package/purpose.docx +0 -0
- package/purpose.md +444 -0
- package/tsconfig.json +14 -0
- 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
|
|
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
|
-
|
|
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]
|
|
40
|
-
|
|
41
|
-
[
|
|
42
|
-
|
|
43
|
-
[
|
|
44
|
-
|
|
45
|
-
[
|
|
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
|
-
|
|
|
55
|
-
|
|
|
56
|
-
|
|
|
57
|
-
|
|
|
58
|
-
|
|
|
59
|
-
|
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
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
|
|
75
|
-
ai-spec
|
|
76
|
-
ai-spec
|
|
77
|
-
ai-spec
|
|
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
|
-
#
|
|
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
|
|
382
|
+
--codegen-model qwen3-72b
|
|
383
|
+
|
|
384
|
+
# 全自动模式(非交互,claude -p 执行,节省 token)
|
|
385
|
+
ai-spec create "消息通知" --auto
|
|
101
386
|
|
|
102
|
-
# 只生成 Spec
|
|
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
|
|
402
|
+
| `--codegen-provider <name>` | 代码生成使用的 provider | 同 `--provider` |
|
|
115
403
|
| `--codegen-model <name>` | 代码生成使用的模型 | — |
|
|
116
|
-
| `--codegen-key <key>` | 代码生成的 API Key
|
|
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` |
|
|
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-
|
|
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
|
|
451
|
+
> 提示:先执行 `git add .` 再运行 `ai-spec review`,确保所有变更都被纳入审查。
|
|
201
452
|
|
|
202
453
|
---
|
|
203
454
|
|
|
204
|
-
### `ai-spec
|
|
455
|
+
### `ai-spec model`
|
|
205
456
|
|
|
206
|
-
|
|
457
|
+
交互式 provider / model 切换器,结果写入当前目录的 `.ai-spec.json`。
|
|
207
458
|
|
|
208
459
|
```bash
|
|
209
|
-
#
|
|
210
|
-
ai-spec
|
|
460
|
+
# 交互式选择
|
|
461
|
+
ai-spec model
|
|
211
462
|
|
|
212
|
-
#
|
|
213
|
-
ai-spec
|
|
463
|
+
# 查看所有可用 provider 和模型
|
|
464
|
+
ai-spec model --list
|
|
465
|
+
```
|
|
466
|
+
|
|
467
|
+
---
|
|
468
|
+
|
|
469
|
+
### `ai-spec config`
|
|
214
470
|
|
|
215
|
-
|
|
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
|
|
686
|
+
### Step 1 — 项目宪法 + Context(宪法加载 & 项目感知)
|
|
239
687
|
|
|
240
|
-
|
|
688
|
+
**项目宪法**(`.ai-spec-constitution.md`):
|
|
241
689
|
|
|
242
|
-
-
|
|
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
|
-
|
|
717
|
+
> "以上文件已存在,必须向其中追加内容,禁止新建同类平行文件"
|
|
718
|
+
|
|
719
|
+
**项目宪法 §8** 也会自动记录这些文件路径,确保 `ai-spec init --force` 重跑后约束持久化。
|
|
247
720
|
|
|
248
721
|
---
|
|
249
722
|
|
|
250
|
-
### Step 2 — Spec
|
|
723
|
+
### Step 2 — Spec 生成 + Tasks 分解
|
|
251
724
|
|
|
252
|
-
|
|
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
|
|
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
|
-
|
|
280
|
-
|
|
281
|
-
|
|
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 —
|
|
796
|
+
### Step 3.4 — Spec 质量预评估
|
|
797
|
+
|
|
798
|
+
Approval Gate 之前,系统对 Spec 进行一次 AI 质量检查,给出**建议性**评分,不阻断流程。
|
|
799
|
+
|
|
800
|
+
**三个评分维度(0-10):**
|
|
286
801
|
|
|
287
|
-
|
|
802
|
+
| 维度 | 衡量内容 |
|
|
803
|
+
|---|---|
|
|
804
|
+
| **Coverage(覆盖度)** | 错误处理、边界条件、auth 规则是否都有描述? |
|
|
805
|
+
| **Clarity(清晰度)** | API 契约是否清晰到可以可靠提取 DSL?response 结构是否明确? |
|
|
806
|
+
| **Constitution(一致性)** | 是否与项目宪法保持一致?命名、错误码、约定有没有冲突? |
|
|
288
807
|
|
|
289
808
|
```
|
|
290
|
-
|
|
291
|
-
|
|
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
|
-
-
|
|
296
|
-
-
|
|
828
|
+
- 评分 < 6 时会出现黄色警告,但不阻止继续
|
|
829
|
+
- **DSL 可提取性预警**:Clarity < 6 且无结构化 API 章节时,提示 DSL 提取可能不准确
|
|
830
|
+
- `--skip-assessment` 跳过此步骤(节省一次 AI 调用);`--auto` 模式下自动跳过
|
|
297
831
|
|
|
298
832
|
---
|
|
299
833
|
|
|
300
|
-
### Step 5 —
|
|
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
|
-
|
|
938
|
+
**抗幻觉设计:**
|
|
303
939
|
|
|
304
|
-
|
|
940
|
+
- Prompt 明确要求"只提取 Spec 中明确写出的内容,不推断、不补全"
|
|
941
|
+
- 空数组 `[]` 是正确输出,不强求每个字段都有内容
|
|
942
|
+
- 重试时把上次的错误字段路径和原因一并告知 AI,定向修复
|
|
305
943
|
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
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
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
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
|
-
|
|
317
|
-
|
|
318
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1021
|
+
仅输出实施方案,不写入任何文件。
|
|
1022
|
+
|
|
1023
|
+
---
|
|
1024
|
+
|
|
1025
|
+
### Step 7 — 测试生成
|
|
1026
|
+
|
|
1027
|
+
测试生成有两种模式:**普通骨架模式**(默认)和 **TDD 模式**(`--tdd`)。
|
|
328
1028
|
|
|
329
1029
|
---
|
|
330
1030
|
|
|
331
|
-
|
|
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
|
-
|
|
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`
|
|
1297
|
+
`.ai-spec.json` 存放在项目根目录,所有命令自动读取:
|
|
340
1298
|
|
|
341
1299
|
```json
|
|
342
1300
|
{
|
|
343
1301
|
"provider": "qwen",
|
|
344
|
-
"model": "
|
|
1302
|
+
"model": "qwen3-235b-a22b",
|
|
345
1303
|
"codegen": "api",
|
|
346
1304
|
"codegenProvider": "glm",
|
|
347
|
-
"codegenModel": "glm-
|
|
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
|
|
363
|
-
|
|
364
|
-
|
|
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
|
-
│
|
|
1414
|
+
│ ├── index.ts # CLI 入口,定义所有命令
|
|
1415
|
+
│ └── welcome.ts # 欢迎界面(无参数运行时展示)
|
|
375
1416
|
├── core/
|
|
376
|
-
│ ├── spec-generator.ts
|
|
377
|
-
│ ├── context-loader.ts
|
|
378
|
-
│ ├── spec-refiner.ts
|
|
379
|
-
│ ├──
|
|
380
|
-
│
|
|
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
|
|
1438
|
+
│ └── worktree.ts # Git Worktree 管理
|
|
383
1439
|
├── prompts/
|
|
384
|
-
│ ├── spec.prompt.ts
|
|
385
|
-
│
|
|
386
|
-
|
|
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
|
```
|