ai-spec-dev 0.1.0 → 0.14.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/settings.local.json +18 -0
- package/README.md +1211 -146
- package/RELEASE_LOG.md +1444 -0
- package/cli/index.ts +1961 -0
- package/cli/welcome.ts +151 -0
- package/core/code-generator.ts +740 -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/RELEASE_LOG.md
ADDED
|
@@ -0,0 +1,1444 @@
|
|
|
1
|
+
# Release Log
|
|
2
|
+
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
## [0.16.0] 2026-03-24 — Spec 质量预评估 · 分层代码审查 · TDD 模式
|
|
6
|
+
|
|
7
|
+
### 1. Spec 质量预评估(`core/spec-assessor.ts`, `prompts/spec-assess.prompt.ts`)
|
|
8
|
+
|
|
9
|
+
- **触发时机**:`ai-spec create` 非 `--auto` 模式下,在 Approval Gate 之前自动运行(可用 `--skip-assessment` 跳过)
|
|
10
|
+
- **评估维度**(0-10 分):
|
|
11
|
+
- `coverageScore` — 错误处理、边界条件、auth 规则覆盖完整度
|
|
12
|
+
- `clarityScore` — API 契约是否足够清晰,可供 DSL 可靠提取
|
|
13
|
+
- `constitutionScore` — 是否与项目宪法保持一致(命名、错误码、中间件约定)
|
|
14
|
+
- **输出**:评分条形图 + 具体问题列表 + 改进建议 + DSL 可提取性预警
|
|
15
|
+
- **设计原则**:纯建议性,不阻断流程;让工程师在进入 Approval Gate 前就看到结构性问题
|
|
16
|
+
|
|
17
|
+
### 2. 分层代码审查(`core/reviewer.ts`, `prompts/codegen.prompt.ts`)
|
|
18
|
+
|
|
19
|
+
- **两遍审查替代单次审查**:
|
|
20
|
+
- **Pass 1(架构层)**:聚焦 Spec 合规性、层职责分离、安全权限、数据模型完整性 — 不评论代码细节
|
|
21
|
+
- **Pass 2(实现层)**:聚焦输入校验、错误处理、边界条件、代码模式 — 不重复架构层发现
|
|
22
|
+
- **历史问题对比**:读取 `.ai-spec-reviews.json` 中最近 5 次审查,将 top issues 注入 Pass 2 prompt,触发「历史问题复现」检查
|
|
23
|
+
- **评分趋势记录**:每次审查结束后,评分 + top issues 写入 `.ai-spec-reviews.json`(保留最近 20 条);`ai-spec review` 命令在审查后自动打印趋势图
|
|
24
|
+
- **constructor 新增 `projectRoot` 参数**:reviewer 实例绑定项目根目录,历史文件路径准确
|
|
25
|
+
|
|
26
|
+
### 3. TDD 模式(`--tdd` flag, `core/test-generator.ts`, `prompts/testgen.prompt.ts`)
|
|
27
|
+
|
|
28
|
+
- **新增 `--tdd` flag**:`ai-spec create --tdd`
|
|
29
|
+
- **流程变化**:
|
|
30
|
+
```
|
|
31
|
+
普通模式:DSL → codegen → 测试骨架(空断言)→ error feedback
|
|
32
|
+
TDD 模式:DSL → TDD 测试(真实断言,预期 FAIL)→ codegen → error feedback(最多 3 轮,以测试通过为目标)
|
|
33
|
+
```
|
|
34
|
+
- **TDD 测试 vs 骨架**:
|
|
35
|
+
- 骨架(原):`it('should create task', () => { /* TODO */ })`
|
|
36
|
+
- TDD(新):`expect(res.status).toBe(201); expect(res.body.data.id).toBeDefined(); expect(res.body.code).toBe('MISSING_FIELD')`
|
|
37
|
+
- **新增 `tddTestGenSystemPrompt`**:要求 AI 生成可运行的断言,以 supertest 做 HTTP 集成测试,所有 endpoint 的成功/校验失败/auth 失败路径全部覆盖
|
|
38
|
+
- **`TestGenerator.generateTdd()`**:新方法,使用 TDD prompt,由 `cli/index.ts` 在代码生成之前调用
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
## [0.15.0] 2026-03-24 — 并行 Task 执行(同层 tasks 并发)
|
|
43
|
+
|
|
44
|
+
### 核心变更 (`core/code-generator.ts`)
|
|
45
|
+
|
|
46
|
+
**问题**:`runApiModeWithTasks` 完全串行 — 一个 task 完成才开始下一个。6 个 service 层 task 每个 30s,总耗时 3 分钟。同层 task 之间通常没有真实依赖,浪费严重。
|
|
47
|
+
|
|
48
|
+
**实现**:按 `data → infra → service → api → test` 顺序分层,每层内所有 pending task 通过 `Promise.all` 并发执行:
|
|
49
|
+
|
|
50
|
+
```
|
|
51
|
+
旧(串行):
|
|
52
|
+
TASK-002 → TASK-003 → TASK-004 → TASK-005 → ... (每个 30s = 2.5 分钟)
|
|
53
|
+
|
|
54
|
+
新(同层并行):
|
|
55
|
+
TASK-002 ┐
|
|
56
|
+
TASK-003 ┤ Promise.all (~30s) → TASK-005 ┐
|
|
57
|
+
TASK-004 ┘ TASK-006 ┘ (~30s)
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
**关键设计决策**:
|
|
61
|
+
1. **Shared config 文件排除并行**:`routes/index.ts` 等注册文件从各 task 的 filePlan 中剥离,改为层完成后统一执行一次 batch update(携带该层所有新建模块名),避免多个 AI 调用同时覆写同一文件
|
|
62
|
+
2. **Cache 快照隔离**:同层所有 task 拿到的是本层开始前的 `generatedFileCache` 快照,避免同层 task 之间的竞态;层结束后统一写入 cache,供下一层使用
|
|
63
|
+
3. **并行输出前缀**:`generateFiles` 新增 `taskLabel` 参数,并行模式下每行输出加 `[TASK-XXX]` 前缀,防止多 task 输出行交叉混乱
|
|
64
|
+
4. **done task 先显示**:已完成 task 在进入层循环前统一展示跳过,进度条状态清晰
|
|
65
|
+
|
|
66
|
+
**输出示例**:
|
|
67
|
+
```
|
|
68
|
+
[████████░░░░░░░░░░░░] 40% ⚡ Layer [service] 🔧 — 3 tasks running in parallel
|
|
69
|
+
[TASK-002] + src/services/userService.ts ✔
|
|
70
|
+
[TASK-003] + src/services/productService.ts ✔
|
|
71
|
+
[TASK-004] + src/services/orderService.ts ✔
|
|
72
|
+
|
|
73
|
+
✔ TASK-002 🔧 Create user service — 1/1 files
|
|
74
|
+
✔ TASK-003 🔧 Create product service — 1/1 files
|
|
75
|
+
✔ TASK-004 🔧 Create order service — 1/1 files
|
|
76
|
+
|
|
77
|
+
+ updating shared config: src/router/routes/index.ts [route-index]
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
---
|
|
81
|
+
|
|
82
|
+
## [0.14.5] 2026-03-24 — 前端分页参数一致性:自动提取并注入项目真实分页 pattern
|
|
83
|
+
|
|
84
|
+
### 分页参数 ground-truth 注入 (`core/frontend-context-loader.ts`)
|
|
85
|
+
|
|
86
|
+
- **问题**:生成的列表接口使用 `page`/`size` + GET `{ params }`,但项目实际使用 `pageIndex`/`pageSize` + POST body,导致前端运行时分页失效
|
|
87
|
+
- **根因**:
|
|
88
|
+
1. `src/apis/` 目录不在 API 文件扫描路径中 → `httpClientImport` 提取失败 → AI 回退到 raw `axios` 而非 `http from '@/utils/http'`
|
|
89
|
+
2. `FrontendContext` 无分页 pattern 字段 → AI 使用通用默认值而非项目约定
|
|
90
|
+
- **修复**:
|
|
91
|
+
1. 将 `"src/apis/**/*.{ts,js}"` 加入 `apiFilePatterns`,修复 `httpClientImport` 提取覆盖缺失问题
|
|
92
|
+
2. 新增 `paginationExample?: string` 字段至 `FrontendContext`
|
|
93
|
+
3. 新增分页 pattern 提取逻辑:扫描所有 API 文件,找到包含 `pageIndex`/`pageSize`/`pageNum`/`current`/`page`/`size` 等字段的 interface,并提取使用该 interface 的第一个导出函数作为示例
|
|
94
|
+
4. `buildFrontendContextSection()` 注入时使用强制标签:`"COPY THIS EXACTLY for all paginated list APIs — use IDENTICAL parameter names, HTTP method, and call style"`
|
|
95
|
+
|
|
96
|
+
---
|
|
97
|
+
|
|
98
|
+
## [0.14.4] 2026-03-24 — 前端出码率提升:路由 Index 自动注册 & 跨 Task 函数名一致性
|
|
99
|
+
|
|
100
|
+
### 1. 路由模块 Index 注册特指化 (`core/code-generator.ts`)
|
|
101
|
+
|
|
102
|
+
- **问题**:`impliesRegistration` 自动注入 `routes/index.ts` 时,purpose 只写 `"Register/update route-index entries for the new feature"` — AI 不知道具体要 import 哪个模块名,经常不修改 index 文件
|
|
103
|
+
- **修复**:注入 `route-index` / `store-index` 类文件时,从同 task 正在新建的文件中提取模块名,生成具体描述:
|
|
104
|
+
> `"Add to this file: import taskManagement from their respective paths and register them in the export/default array. Do NOT remove any existing imports."`
|
|
105
|
+
|
|
106
|
+
### 2. 跨 Task 函数名一致性(Generated File Cache)(`core/code-generator.ts`)
|
|
107
|
+
|
|
108
|
+
- **根本原因**:API 文件(Task A 生成 `src/apis/task.ts`,导出 `getTaskList`)与路由文件(Task B 生成)是两个完全独立的 AI 调用,Task B 看不到 Task A 写了什么,只能靠 DSL endpoint ID 猜函数名 → 猜出 `getTasks` 而非 `getTaskList`
|
|
109
|
+
- **修复**:
|
|
110
|
+
1. 新增 `buildGeneratedFilesSection(cache)` — 将已生成文件的内容格式化为 `=== Files Already Generated in This Run ===` 区段注入后续 task
|
|
111
|
+
2. 每个 task 完成后,将写入的 `src/api*` / `src/service*` / `src/store*` / `src/composable*` 文件读回,存入 `generatedFileCache: Map<string, string>`
|
|
112
|
+
3. 后续每个 task 的 `generateFiles` 调用都携带 `generatedFilesSection`,后续 task 可以看到之前 task 输出的确切导出名称
|
|
113
|
+
|
|
114
|
+
### 3. 系统提示新增规则 (`prompts/codegen.prompt.ts`)
|
|
115
|
+
|
|
116
|
+
- **规则 16**(路由 Index 强制注册):创建 `src/router/routes/X.ts` 时**必须同时**更新 `routes/index.ts`,添加 import 和 export 注册
|
|
117
|
+
- **规则 17**(跨文件一致性):`=== Files Already Generated in This Run ===` 中的函数名是权威来源,NEVER 重命名或猜测替代名;无此区段时从 DSL endpoint ID 推导
|
|
118
|
+
|
|
119
|
+
---
|
|
120
|
+
|
|
121
|
+
## [0.14.3] 2026-03-24 — 欢迎界面
|
|
122
|
+
|
|
123
|
+
### Welcome Screen (`cli/welcome.ts`, `cli/index.ts`)
|
|
124
|
+
|
|
125
|
+
- `ai-spec` 无参数运行时展示两栏欢迎界面(仿 Claude Code 风格),不再直接输出帮助文本
|
|
126
|
+
- **左栏**:橙色标题栏 `─── ai-spec v0.14.1 ───` · 居中 `Welcome back, <username>!` · Unicode 机器人 ASCII art · Provider/Model/当前目录(超长路径自动截断 + `…`)
|
|
127
|
+
- **右栏**(垂直分隔符分割):
|
|
128
|
+
- **Tips for getting started** — 三条常用命令示例
|
|
129
|
+
- **Recent activity** — 扫描 `specs/` 目录,列出最近 3 个 spec 文件及相对时间(`2d ago`、`3h ago`)
|
|
130
|
+
- `program.version` 从硬编码错误值 `"0.6.0"` 更正为 `"0.14.1"`
|
|
131
|
+
|
|
132
|
+
---
|
|
133
|
+
|
|
134
|
+
## [0.14.2] 2026-03-24 — Java/Maven 项目上下文感知
|
|
135
|
+
|
|
136
|
+
### Java 项目 ContextLoader 支持 (`core/context-loader.ts`)
|
|
137
|
+
|
|
138
|
+
- **问题**:`ContextLoader.loadProjectContext()` 只处理 PHP(`composer.json`)和 Node.js(`package.json`);Java Maven/Gradle 项目的 `techStack` 和 `dependencies` 均为空,workspace `[W1]` 显示 `unknown (0 deps)`
|
|
139
|
+
- **修复**:
|
|
140
|
+
1. 新增 `isJava` 检测:`pom.xml` / `build.gradle` / `build.gradle.kts`,优先级在 Node.js 之前
|
|
141
|
+
2. 新增 `loadMavenOrGradle(context)` — Maven:正则提取所有 `<artifactId>` 标签(跳过项目自身 artifact),解析 `<maven.compiler.source>` 获取 Java 版本,按依赖名推断技术栈(Spring Boot / MyBatis / JPA / Dubbo / RocketMQ / Redis / Lombok / OpenFeign / Nacos / Sentinel);Gradle:提取 `group:artifact:version` 格式中的 artifactId
|
|
142
|
+
3. 新增 `loadJavaApiStructure(context)` — glob `**/src/main/java/**/*Controller.java`(排除 `target/`)作为 `apiStructure`;读取 `application.properties/yml` 前 800 字符作为 `routeSummary`
|
|
143
|
+
|
|
144
|
+
---
|
|
145
|
+
|
|
146
|
+
## [0.14.1] 2026-03-24 — 关键 Bug 修复:非 Node 项目生成 TypeScript 代码
|
|
147
|
+
|
|
148
|
+
### `repoType` 从未传入 `generateCode`,导致所有非 Node 项目使用 Node.js 系统提示 (`cli/index.ts`)
|
|
149
|
+
|
|
150
|
+
- **根本原因**:`getCodeGenSystemPrompt(options.repoType)` 需要 `repoType` 参数才能选择对应语言的 prompt(PHP / Go / Java / Rust / Python),但两处 `generateCode` 调用(单 repo `create` 命令 + workspace pipeline)都**从未传过 `repoType`**
|
|
151
|
+
— `options.repoType` 始终是 `undefined`,一律 fallback 到 Node.js/TypeScript 默认 prompt
|
|
152
|
+
— PHP 项目生成 `.ts` / `prisma/schema.prisma`;Java 项目生成 TypeScript 代码
|
|
153
|
+
- **修复**:
|
|
154
|
+
1. 单 repo `create` 命令:在加载 context 后立即调用 `detectRepoType(currentDir)`,将结果作为 `repoType` 传入 `generateCode`
|
|
155
|
+
2. workspace pipeline `runSingleRepoPipelineInWorkspace`:同样调用 `detectRepoType(repoAbsPath)`,传入 `generateCode`
|
|
156
|
+
3. Tech stack 日志新增语言标签显示(如 `PHP, Lumen [php]`),便于排查
|
|
157
|
+
|
|
158
|
+
---
|
|
159
|
+
|
|
160
|
+
## [0.14.0] 2026-03-24 — P0 修复:前端框架检测统一 & Task 模式前端上下文显式注入
|
|
161
|
+
|
|
162
|
+
### 1. `isFrontendDeps` — 单一可信源 (`core/context-loader.ts`)
|
|
163
|
+
|
|
164
|
+
- **问题**:`["react", "vue", "next", "react-native", "expo"]` 这个列表在 6 个地方各写一遍(`cli/index.ts` ×4、`code-generator.ts`、`test-generator.ts`、`spec-updater.ts`)
|
|
165
|
+
— 添加新框架(Svelte、Solid、Nuxt)需要改 6 个地方,且各处已经不一致(`spec-updater.ts` 漏掉了 `expo`)
|
|
166
|
+
- **修复**:
|
|
167
|
+
- 新增 `export const FRONTEND_FRAMEWORKS` — 完整列表(含 Svelte、Solid、Qwik、Nuxt)
|
|
168
|
+
- 新增 `export function isFrontendDeps(deps: string[]): boolean`
|
|
169
|
+
- 所有 6 处 inline 检测全部替换为 `isFrontendDeps(...)` / `FRONTEND_FRAMEWORKS`
|
|
170
|
+
- 以后只改一处即可全局生效
|
|
171
|
+
|
|
172
|
+
### 2. `frontendSection` 从隐式变为显式参数 (`core/code-generator.ts`)
|
|
173
|
+
|
|
174
|
+
- **问题**:`frontendSection` 被拼入 `constitutionSection` 字符串后传给 `runApiModeWithTasks`,命名误导 — 未来有人往 `constitutionSection` 拼了其他内容时容易漏掉 `frontendSection`
|
|
175
|
+
- **修复**:`runApiModeWithTasks` 新增独立的 `frontendSection: string` 参数,在 `generateFiles` 调用中显式拼入 `constitutionSection + frontendSection + sharedConfigSection`
|
|
176
|
+
— 前端上下文(layout import、store 范式、组件复用列表、HTTP client import 等)现在在 task 模式中**有名有姓地**注入每个文件生成请求
|
|
177
|
+
|
|
178
|
+
---
|
|
179
|
+
|
|
180
|
+
## [0.13.9] 2026-03-24 — 组件复用感知
|
|
181
|
+
|
|
182
|
+
### 前端组件复用上下文 (`core/frontend-context-loader.ts`, `prompts/codegen.prompt.ts`)
|
|
183
|
+
|
|
184
|
+
- **问题**:AI 不知道项目 `src/components/` 里已经有哪些组件,也不知道现有页面里用的是哪些 UI 库组件,导致重复造轮子或使用与项目风格不符的写法
|
|
185
|
+
- **新增字段**:
|
|
186
|
+
- `reusableComponents: string[]` — 扫描 `src/components/` 全部 `.vue/.tsx/.jsx`,列出所有可复用组件路径(最多 40 个)
|
|
187
|
+
- `pageExamples: string[]` — 读取 1-2 个现有 view/page 文件前 80 行,展示实际的组件引用和 UI 库使用方式
|
|
188
|
+
- **上下文注入**:
|
|
189
|
+
- 组件列表标注为 "check this BEFORE creating a new component"
|
|
190
|
+
- 页面示例标注为 "follow the same import and usage patterns"
|
|
191
|
+
- **系统提示新增规则**:
|
|
192
|
+
- 规则 12:生成任何 UI 组件前,先检查 `reusableComponents` 列表,有的直接 import 复用
|
|
193
|
+
- 规则 13:从 `pageExamples` 学习 UI 库组件的具体用法,不用原生 HTML 替代已有的组件
|
|
194
|
+
|
|
195
|
+
---
|
|
196
|
+
|
|
197
|
+
## [0.13.8] 2026-03-24 — Store HTTP 幻觉 & HTTP Client Import 幻觉修复
|
|
198
|
+
|
|
199
|
+
### 1. Store 层直接发 HTTP 请求 (`core/frontend-context-loader.ts`, `prompts/codegen.prompt.ts`)
|
|
200
|
+
|
|
201
|
+
- **根本原因**:`storeFiles` 只传文件路径列表,AI 从未看到项目里真实 store 的内容,用了训练数据里"store 自己做请求"的默认经验
|
|
202
|
+
- **修复**:
|
|
203
|
+
1. `FrontendContext` 新增 `storePatterns: string[]` — 读取 1-2 个现有 store 文件的前 60 行内容
|
|
204
|
+
2. `buildFrontendContextSection()` 将 store 内容标注为 **"CRITICAL — stores call API layer, NOT HTTP directly"**,直接作为结构模板
|
|
205
|
+
3. `codeGenSystemPrompt` 新增架构层分离规则:Store 只能调用 API 层函数,不能直接发 HTTP 请求
|
|
206
|
+
|
|
207
|
+
### 2. HTTP client import 幻觉(`@/utils/request`)(`core/frontend-context-loader.ts`)
|
|
208
|
+
|
|
209
|
+
- **根本原因**:API 文件的 HTTP client import 路径没有被提取为具名事实,AI 猜测了一个在中文 Vue 项目中常见但本项目不存在的路径
|
|
210
|
+
- **修复**:
|
|
211
|
+
1. `FrontendContext` 新增 `httpClientImport?: string` — 正则扫描现有 API 文件,提取精确 import 行(支持 `@/` 别名路径和 `axios`/`ky` 直接导入)
|
|
212
|
+
2. `buildFrontendContextSection()` 将该行标注为 **"COPY THIS EXACTLY"**,禁止 AI 发明其他路径
|
|
213
|
+
|
|
214
|
+
---
|
|
215
|
+
|
|
216
|
+
## [0.13.6] 2026-03-24 — Layout 幻觉 & 路由注册可靠性修复
|
|
217
|
+
|
|
218
|
+
### Layout 组件路径幻觉 (`core/frontend-context-loader.ts`)
|
|
219
|
+
|
|
220
|
+
- **根本原因**:AI 在 120 行的路由模块预览里"看到"了正确的 `@/layout/index.vue`,但训练数据里 `@/layouts/MainLayout.vue` 更常见,覆盖了实际样本
|
|
221
|
+
- **修复**:主动提取,而非依赖 AI 自行寻找
|
|
222
|
+
1. `extractRouteModuleContext()` — 扫描 `src/router/modules/` 中的现有模块文件,用正则提取 Layout import 的**精确代码行**(支持 `const Layout = () => import(...)` / `import Layout from ...` 两种形式)
|
|
223
|
+
2. 取一个完整的路由模块文件(≤100行)作为 `routeModuleExample`
|
|
224
|
+
3. `buildFrontendContextSection()` 将 layout import 行标注为 **"COPY THIS EXACTLY"**,路由模块作为 **structural template** 直接插入提示
|
|
225
|
+
- 效果:AI 收到的是**具名事实**(`layoutImport = "const Layout = () => import('@/layout/index.vue')"`)而非需要在样本里自行找,彻底避免路径幻觉
|
|
226
|
+
|
|
227
|
+
---
|
|
228
|
+
|
|
229
|
+
## [0.13.5] 2026-03-24 — 前端代码生成幻觉 & 路由规范修复
|
|
230
|
+
|
|
231
|
+
### 1. 依赖幻觉防御 — 禁止使用未安装的包 (`core/code-generator.ts`, `prompts/codegen.prompt.ts`)
|
|
232
|
+
|
|
233
|
+
- **根本原因**:codegen 上下文只传了 `techStack` 和部分文件名,AI 从未收到实际安装的 npm 包列表,只能靠猜测 → 幻觉引入 `vue-i18n` 等不存在的依赖
|
|
234
|
+
- **修复**:
|
|
235
|
+
1. 新增 `buildInstalledPackagesSection()` — 将项目的完整 `dependencies` 列表格式化为 `=== Installed Packages ===` 区段,注入进每次生成调用(plan/api/task 三种路径均覆盖)
|
|
236
|
+
2. `codeGenSystemPrompt` 新增绑定性规则:**ONLY use packages from the Installed Packages list. NEVER import anything not listed.** 若功能需要不存在的包,用已有包实现等价逻辑
|
|
237
|
+
|
|
238
|
+
### 2. 从样本学习约定,而非 hardcode 目录规则 (`prompts/codegen.prompt.ts`, `core/code-generator.ts`, `core/context-loader.ts`)
|
|
239
|
+
|
|
240
|
+
- **根本原因**:之前用 `hasRouterModules` 检测 `src/router/modules/` 目录来注入特定规则,这是 hack — 换个项目结构就失效
|
|
241
|
+
- **修复方向**:让 AI 从真实代码样本中自行推断项目约定,而非靠工具硬编码猜测
|
|
242
|
+
1. 移除 `buildSharedConfigSection()` 中的 `hasRouterModules` 目录检测逻辑
|
|
243
|
+
2. 移除 `codeGenSystemPrompt` 中的 Vue Router 专项硬编码规则
|
|
244
|
+
3. 新增通用的"样本优先"规则:**从 Existing Shared Config Files 中的真实代码学习结构、命名和注册方式,项目样本 > 框架默认经验**
|
|
245
|
+
4. shared config files preview 从 80 行提升到 120 行,确保 AI 看到完整的路由模块示例
|
|
246
|
+
|
|
247
|
+
---
|
|
248
|
+
|
|
249
|
+
## [0.13.4] 2026-03-24 — MiMo max_tokens 截断修复
|
|
250
|
+
|
|
251
|
+
### MiMo `stop_reason: max_tokens` 导致 DSL 提取失败 (`core/spec-generator.ts`)
|
|
252
|
+
|
|
253
|
+
- MiMo 在生成 DSL JSON 时,若 CoT thinking 内容过长会先耗尽 token,导致响应中只有 `thinking` block、没有 `text` block
|
|
254
|
+
- 之前抛出 `Unexpected MiMo response` 原始 JSON,信息不易排查
|
|
255
|
+
- 修复:
|
|
256
|
+
1. `max_tokens` 从 `8192` 提升到 `16384`,减少截断概率
|
|
257
|
+
2. 检测 `stop_reason === "max_tokens"`,抛出明确提示:"prompt 过长,可缩短 spec 或换更大 context 的模型"
|
|
258
|
+
|
|
259
|
+
---
|
|
260
|
+
|
|
261
|
+
## [0.13.3] 2026-03-24 — DSL 校验误报修复
|
|
262
|
+
|
|
263
|
+
### DSL `errors[].code` 空字符串导致校验失败 (`core/dsl-extractor.ts`)
|
|
264
|
+
|
|
265
|
+
- AI 生成 DSL 时偶尔将 `endpoints[].errors[].code` / `.description` 输出为空字符串 `""`
|
|
266
|
+
- 校验器报 `Must be a non-empty string, got: string`,触发无效 retry 循环
|
|
267
|
+
- 修复:在 `validateDsl` 前调用 `sanitizeDsl()`,自动过滤掉 `code`/`description` 为空的 error 条目;若全部被过滤则删除整个 `errors` 字段
|
|
268
|
+
|
|
269
|
+
---
|
|
270
|
+
|
|
271
|
+
## [0.13.2] 2026-03-24 — API Key 持久化
|
|
272
|
+
|
|
273
|
+
### API Key 持久化存储 (`core/key-store.ts`, `cli/index.ts`)
|
|
274
|
+
|
|
275
|
+
- 第一次输入 API key 后自动保存到 `~/.ai-spec-keys.json`(文件权限 600,仅 owner 可读)
|
|
276
|
+
- 下次运行时若已有保存的 key,显示脱敏 key(`sk-ab12...ef56`)并提示选择:
|
|
277
|
+
- **Use saved key** — 直接复用
|
|
278
|
+
- **Enter a new key** — 输入新 key 并覆盖保存
|
|
279
|
+
- 优先级:CLI `--key` flag → 环境变量 → 保存的 key → 交互输入
|
|
280
|
+
- 新增 `ai-spec config` 子命令选项:
|
|
281
|
+
- `--list-keys` — 列出所有已保存 key 的 provider(脱敏显示)
|
|
282
|
+
- `--clear-key <provider>` — 删除指定 provider 的保存 key
|
|
283
|
+
- `--clear-keys` — 清除全部保存的 key
|
|
284
|
+
|
|
285
|
+
---
|
|
286
|
+
|
|
287
|
+
## [0.13.1] 2026-03-23 — 前端自动跳过 worktree & Bug 修复
|
|
288
|
+
|
|
289
|
+
### 1. 前端项目自动跳过 worktree (`cli/index.ts`)
|
|
290
|
+
|
|
291
|
+
- 检测到前端项目(依赖含 `react` / `vue` / `next` / `react-native` / `expo`)时,**自动设置 `skipWorktree = true`**
|
|
292
|
+
- 原因:worktree 不复制 `node_modules`,前端 dev server 启动会失败
|
|
293
|
+
- 代码直接在当前仓库的新分支上生成,无需手动 `cd` 到 worktree
|
|
294
|
+
- 新增 `--worktree` flag:强制开启 worktree,覆盖自动跳过行为
|
|
295
|
+
- workspace pipeline 中前端/mobile repo 同样自动跳过
|
|
296
|
+
|
|
297
|
+
### 2. MiMo Thinking Block 修复 (`core/spec-generator.ts`)
|
|
298
|
+
|
|
299
|
+
- MiMo v2 Pro 启用 CoT 时会在 `content` 数组首位返回 `{ type: "thinking" }` block
|
|
300
|
+
- 之前只检查 `content[0].type === "text"`,thinking 排第一时抛异常并将原始响应打印到终端
|
|
301
|
+
- 修复:改用 `blocks.find(b => b.type === "text")` 跳过 thinking block
|
|
302
|
+
|
|
303
|
+
### 3. vue-tsc 工具崩溃检测 (`core/error-feedback.ts`)
|
|
304
|
+
|
|
305
|
+
- `vue-tsc` 与 TypeScript 版本不兼容时会抛 `ReferenceError: ScriptKind is not defined`
|
|
306
|
+
- 之前将此错误当作真实类型错误喂进 AI 自动修复循环,导致无效修复
|
|
307
|
+
- 修复:检测到 `ReferenceError/TypeError` + `node_modules` 堆栈时,判定为工具崩溃,打印警告并跳过
|
|
308
|
+
|
|
309
|
+
### 4. git diff --cached 在非 git 目录崩溃 (`core/reviewer.ts`)
|
|
310
|
+
|
|
311
|
+
- 在非 git 目录执行 `git diff --cached` 时,git 输出 `error: unknown option 'cached'` 并将整个帮助信息喷到终端
|
|
312
|
+
- 修复:先执行 `git rev-parse --is-inside-work-tree` 前置检查,并对所有 git 命令加 `stdio: "pipe"` 静默 stderr
|
|
313
|
+
|
|
314
|
+
### 5. Worktree 后 node_modules/vendor 丢失 (`git/worktree.ts`)
|
|
315
|
+
|
|
316
|
+
- worktree 目录不含 `node_modules`,导致 `vite: command not found`
|
|
317
|
+
- 修复:worktree 创建后自动 symlink `node_modules/`(Node.js)和 `vendor/`(PHP Composer)
|
|
318
|
+
|
|
319
|
+
### 6. Task 模式下路由/Store 文件未被修改 (`core/code-generator.ts`)
|
|
320
|
+
|
|
321
|
+
- Task 的 `filesToTouch` 只含组件文件,路由注册文件未被处理
|
|
322
|
+
- 修复:检测到 task 涉及新建页面/组件时,自动将 `sharedConfigFiles`(router/store)注入当前 task 的 filePlan
|
|
323
|
+
- 所有已存在文件的 action 从硬编码 `"create"` 改为动态检测 `"modify"`
|
|
324
|
+
|
|
325
|
+
### 7. Workspace Init 自动扫描子目录 (`cli/index.ts`)
|
|
326
|
+
|
|
327
|
+
- 之前只能逐个手动添加 repo
|
|
328
|
+
- 新增:输入 workspace name 后询问「Auto-scan sibling directories?」,一键检测所有子目录
|
|
329
|
+
|
|
330
|
+
---
|
|
331
|
+
|
|
332
|
+
## [0.13.0] 2026-03-23 — 上下文感知 & 错误反馈增强
|
|
333
|
+
|
|
334
|
+
### 1. sharedConfigFiles 路由/Store 扫描补全 (`core/context-loader.ts`)
|
|
335
|
+
|
|
336
|
+
新增路由注册文件扫描模式:
|
|
337
|
+
- Vue Router Modules: `src/router/modules/**/*.{ts,js}`, `src/router/routes.{ts,js}`
|
|
338
|
+
- React Router: `src/routes.{ts,tsx}`, `src/router.{ts,tsx}`
|
|
339
|
+
- PHP Lumen/Laravel: `routes/api.php`, `routes/web.php`
|
|
340
|
+
|
|
341
|
+
新增 Store 注册文件扫描,独立 `store-index` 分类:
|
|
342
|
+
- Pinia/Vuex: `src/stores/index.ts`, `src/store/modules/index.ts`
|
|
343
|
+
- Redux: `src/store/rootReducer.ts`, `src/app/store.ts`
|
|
344
|
+
|
|
345
|
+
`fileStructure` 扫描范围扩大:maxDepth 3→5,文件数上限 60→120,新增排除 `vendor/**`、`build/**`、`*.map`、`*.min.js`
|
|
346
|
+
|
|
347
|
+
### 2. TypeScript 类型检查加入 error feedback loop (`core/error-feedback.ts`)
|
|
348
|
+
|
|
349
|
+
新增 `detectBuildCommand()`:
|
|
350
|
+
- 有 `tsconfig.json` + `vue-tsc` → `npx vue-tsc --noEmit`
|
|
351
|
+
- 有 `scripts.type-check` / `scripts.typecheck` → `npm run type-check`
|
|
352
|
+
- 默认 → `npx tsc --noEmit`
|
|
353
|
+
|
|
354
|
+
`ErrorFeedbackOptions` 新增 `skipBuild?: boolean`
|
|
355
|
+
type-check 在 test/lint 之前运行(最快,最常见错误源)
|
|
356
|
+
|
|
357
|
+
### 3. PHP / Lumen 项目上下文感知 (`core/context-loader.ts`)
|
|
358
|
+
|
|
359
|
+
新增 `loadComposerJson()`:读取 `composer.json`,提取依赖和技术栈(Lumen/Laravel/Eloquent/JWT Auth 等)
|
|
360
|
+
新增 `loadPhpRoutes()`:加载 `routes/api.php` + `routes/web.php` 作为 routeSummary,扫描 `app/Http/Controllers/**/*.php` 作为 apiStructure
|
|
361
|
+
PHP 异常处理文件识别:`app/Exceptions/Handler.php`
|
|
362
|
+
|
|
363
|
+
---
|
|
364
|
+
|
|
365
|
+
## [0.12.2] 2026-03-23 — PHP/Lumen 后端支持
|
|
366
|
+
|
|
367
|
+
**修改:** `core/workspace-loader.ts` · `core/error-feedback.ts` · `prompts/codegen.prompt.ts`
|
|
368
|
+
|
|
369
|
+
- `RepoType` 新增 `"php"` 类型
|
|
370
|
+
- `detectRepoType()` 新增 `composer.json` 检测(优先级在 Node.js 之前):自动识别 PHP/Lumen/Laravel 项目为 `{ type: "php", role: "backend" }`
|
|
371
|
+
- `autoDetect()` manifest 列表新增 `composer.json`(workspace init 时自动扫描 PHP 项目)
|
|
372
|
+
- `detectTestCommand()`:PHP → `./vendor/bin/phpunit --colors=never` 或 `php artisan test --no-ansi`
|
|
373
|
+
- `detectLintCommand()`:PHP → `./vendor/bin/phpstan analyse`(如已安装,否则 null)
|
|
374
|
+
- `parseErrors()` 文件扩展名正则新增 `.php`
|
|
375
|
+
- 新增 `codeGenPhpSystemPrompt`:PSR-12,PHP 8.x,Lumen/Laravel 路由约定,Eloquent ORM,构造器属性提升
|
|
376
|
+
|
|
377
|
+
---
|
|
378
|
+
|
|
379
|
+
## [0.12.1] 2026-03-23 — 恢复 MiMo v2 Pro 支持
|
|
380
|
+
|
|
381
|
+
**修改:** `core/spec-generator.ts`
|
|
382
|
+
|
|
383
|
+
- 新增 `MiMoProvider` 类:使用 axios 直接调用小米 MiMo API
|
|
384
|
+
- Endpoint: `https://api.xiaomimimo.com/anthropic/v1/messages`
|
|
385
|
+
- Auth 格式:`api-key: $MIMO_API_KEY`(不同于 Anthropic 的 `x-api-key`,因此无法复用 Anthropic SDK,用 axios 独立实现)
|
|
386
|
+
- 请求/响应格式与 Anthropic messages API 兼容
|
|
387
|
+
- `PROVIDER_CATALOG` 新增 `mimo` 条目:`mimo-v2-pro`,env var `MIMO_API_KEY`
|
|
388
|
+
- `createProvider()` factory 新增 `case "mimo"` 分支
|
|
389
|
+
|
|
390
|
+
**使用:**
|
|
391
|
+
```bash
|
|
392
|
+
export MIMO_API_KEY=your_key_here
|
|
393
|
+
ai-spec create "功能描述" --provider mimo
|
|
394
|
+
ai-spec create "功能描述" --provider mimo --model mimo-v2-pro
|
|
395
|
+
```
|
|
396
|
+
|
|
397
|
+
---
|
|
398
|
+
|
|
399
|
+
## [0.12.0] 2026-03-23 — 宪法整合:`ai-spec init --consolidate`
|
|
400
|
+
|
|
401
|
+
### 问题
|
|
402
|
+
|
|
403
|
+
`ai-spec review` 每次运行后会把审查 issue 追加到宪法 §9。长期运行后 §9 会积累几十条条目,其中充斥着重复措辞、已修复问题的历史记录、不再适用的早期教训。宪法被注入每次 AI 调用,§9 越长越造成 token 浪费和信噪比下降(代码中有 2000 字符硬截断,超出部分直接丢弃)。
|
|
404
|
+
|
|
405
|
+
### 解决方案:Constitution Rebase
|
|
406
|
+
|
|
407
|
+
类比 `git rebase`:把散落在 §9 的经验教训提炼、去重,归并到 §1–§8 相应章节,再清理 §9。
|
|
408
|
+
|
|
409
|
+
---
|
|
410
|
+
|
|
411
|
+
### 新增:`prompts/consolidate.prompt.ts`
|
|
412
|
+
|
|
413
|
+
- `consolidateSystemPrompt` — 主导 AI 按三条决策路径处理每条 §9 lesson:
|
|
414
|
+
- **LIFT**:通用且持久的规则 → 自然融入 §1–§8 对应章节,改写为规范性语句
|
|
415
|
+
- **KEEP**:近期特定、尚未泛化 → 保留在 §9(max 5 条)
|
|
416
|
+
- **DROP**:重复、已覆盖或不再适用 → 删除
|
|
417
|
+
- `buildConsolidatePrompt()` — 注入完整宪法和 §9 数量
|
|
418
|
+
- `parseConstitutionStats()` — 解析宪法的总行数、§9 行数、lesson 数量(用于阈值检测和效果对比)
|
|
419
|
+
|
|
420
|
+
### 新增:`core/constitution-consolidator.ts`
|
|
421
|
+
|
|
422
|
+
- `ConstitutionConsolidator.consolidate()` — 完整整合流程:
|
|
423
|
+
1. 解析当前 §9 数量,低于阈值(默认 5)直接跳过
|
|
424
|
+
2. 调用 AI 生成整合后的宪法
|
|
425
|
+
3. 展示彩色 diff(复用 `computeDiff` / `printDiff`)
|
|
426
|
+
4. 写入前自动创建带时间戳的备份(`.ai-spec-constitution.backup-YYYY-MM-DD-HH-MM-SS.md`)
|
|
427
|
+
5. 写入整合后的宪法,输出前后对比数据
|
|
428
|
+
- `checkConsolidationNeeded()` — 可供外部调用的阈值检查函数
|
|
429
|
+
|
|
430
|
+
### 修改:`core/knowledge-memory.ts`
|
|
431
|
+
|
|
432
|
+
`appendLessonsToConstitution()` 写入后自动检查 §9 数量:
|
|
433
|
+
- ≥ 8 条时打印黄色提示:`⚠ §9 now has N lessons. Run \`ai-spec init --consolidate\` to prune and rebase.`
|
|
434
|
+
|
|
435
|
+
### 修改:`cli/index.ts` — `init` 命令新增两个选项
|
|
436
|
+
|
|
437
|
+
```
|
|
438
|
+
ai-spec init --consolidate # 整合 §9 → §1–§8,清理冗余(需要现有宪法)
|
|
439
|
+
ai-spec init --consolidate --dry-run # 预览整合结果,不写入磁盘
|
|
440
|
+
```
|
|
441
|
+
|
|
442
|
+
整合流程输出示例:
|
|
443
|
+
```
|
|
444
|
+
─── Constitution Consolidation ──────────────────
|
|
445
|
+
File : .ai-spec-constitution.md
|
|
446
|
+
Size : 187 lines
|
|
447
|
+
§9 items: 14 accumulated lessons
|
|
448
|
+
|
|
449
|
+
Consolidating 14 lesson(s) with AI...
|
|
450
|
+
|
|
451
|
+
Changes preview:
|
|
452
|
+
+ ## 3. API 规范
|
|
453
|
+
+ - 所有 POST 接口必须在 request body 中验证 email 格式,不接受裸字符串
|
|
454
|
+
...
|
|
455
|
+
~ removed: 8 lines added: 3 lines
|
|
456
|
+
|
|
457
|
+
After consolidation:
|
|
458
|
+
Size : 162 lines (was 187)
|
|
459
|
+
§9 items: 4 remaining (was 14)
|
|
460
|
+
✔ ~10 lesson(s) lifted into §1–§8 or removed
|
|
461
|
+
|
|
462
|
+
Backup : .ai-spec-constitution.backup-2026-03-23-14-30-00.md
|
|
463
|
+
✔ Constitution updated: .ai-spec-constitution.md
|
|
464
|
+
|
|
465
|
+
Summary:
|
|
466
|
+
Lines : 187 → 162 (-25)
|
|
467
|
+
§9 : 14 → 4 lessons remaining
|
|
468
|
+
```
|
|
469
|
+
|
|
470
|
+
---
|
|
471
|
+
|
|
472
|
+
## [0.11.0] 2026-03-23 — 三大高优先级补全:增量更新 / OpenAPI 导出 / 多语言 Codegen Prompt
|
|
473
|
+
|
|
474
|
+
### 目标
|
|
475
|
+
|
|
476
|
+
填补工具链中最关键的三个空白:变更驱动的需求更新、标准接口格式导出、以及对 Go/Python/Java/Rust 项目的真正有效代码生成。
|
|
477
|
+
|
|
478
|
+
---
|
|
479
|
+
|
|
480
|
+
### Feature 1:`ai-spec update` — 增量 Spec + 代码更新流水线
|
|
481
|
+
|
|
482
|
+
**核心思路:** 现实中 90% 的工作是"改需求",而非从零开始。现有的 `create` 命令无法处理这种场景。
|
|
483
|
+
|
|
484
|
+
**新增:** `core/spec-updater.ts`
|
|
485
|
+
|
|
486
|
+
- `SpecUpdater.update()` — 三步流程:
|
|
487
|
+
1. **更新 Spec**:AI 读取现有 Spec + 变更描述 → 生成更新后的完整 Spec(保留未变更部分)
|
|
488
|
+
2. **更新 DSL**:若存在现有 DSL → 使用定向 DSL 更新 prompt(只更新变化的端点/模型);失败时降级为全量重提取
|
|
489
|
+
3. **识别受影响文件**:对比新旧 DSL,让 AI 列出需要修改的文件列表(不是全量重生成)
|
|
490
|
+
- `SpecUpdater.findLatestSpec()` — 从 `specs/` 目录自动找最新版本文件
|
|
491
|
+
- 所有结果写入新版本文件(`feature-xxx-v2.md` + `feature-xxx-v2.dsl.json`)
|
|
492
|
+
|
|
493
|
+
**新增:** `prompts/update.prompt.ts`
|
|
494
|
+
|
|
495
|
+
- `specUpdateSystemPrompt` — 要求 AI 最小化改动,保留原有结构
|
|
496
|
+
- `dslUpdateSystemPrompt` — 针对 DSL JSON 的精准更新指令(保留未变更条目)
|
|
497
|
+
- `buildAffectedFilesPrompt()` — 基于 DSL diff(新增/修改的端点/模型)生成受影响文件 prompt
|
|
498
|
+
|
|
499
|
+
**新增:** `cli/index.ts` — `ai-spec update` 命令
|
|
500
|
+
|
|
501
|
+
```
|
|
502
|
+
ai-spec update "新增商品收藏功能" # 自动找最新 Spec,生成 v2
|
|
503
|
+
ai-spec update "把价格字段改为 Float" # 更新 DSL 模型字段
|
|
504
|
+
ai-spec update --codegen # 更新完后自动重新生成受影响文件
|
|
505
|
+
ai-spec update --spec specs/xxx-v1.md # 指定 Spec 文件
|
|
506
|
+
ai-spec update --skip-affected # 跳过受影响文件识别
|
|
507
|
+
```
|
|
508
|
+
|
|
509
|
+
**工作流对比:**
|
|
510
|
+
|
|
511
|
+
| 场景 | 之前 | 现在 |
|
|
512
|
+
|---|---|---|
|
|
513
|
+
| 新功能 | `ai-spec create "..."` | 同上 |
|
|
514
|
+
| 改现有功能 | 手动修改 Spec + 手动更新代码 | `ai-spec update "..."` |
|
|
515
|
+
| 改完自动更新代码 | 不支持 | `ai-spec update "..." --codegen` |
|
|
516
|
+
|
|
517
|
+
---
|
|
518
|
+
|
|
519
|
+
### Feature 2:`ai-spec export` — DSL → OpenAPI 3.1.0
|
|
520
|
+
|
|
521
|
+
**核心思路:** DSL 已是结构化中间表示,距离 OpenAPI 只差一步。有了 OpenAPI 可以接入整个开放生态。
|
|
522
|
+
|
|
523
|
+
**新增:** `core/openapi-exporter.ts`
|
|
524
|
+
|
|
525
|
+
- `dslToOpenApi()` — 将 SpecDSL 转换为 OpenAPI 3.1.0 对象:
|
|
526
|
+
- `models[]` → `components.schemas`(含类型映射、required 字段推断)
|
|
527
|
+
- `endpoints[]` → `paths`(含路径参数提取、query params、requestBody、success/error responses)
|
|
528
|
+
- `auth: true` → `security: [{bearerAuth: []}]` + `components.securitySchemes.bearerAuth`
|
|
529
|
+
- 自动注入 `ErrorResponse` 通用 schema
|
|
530
|
+
- 路径参数格式自动转换(`:id` → `{id}`)
|
|
531
|
+
- `exportOpenApi()` — 写入 `openapi.yaml` 或 `openapi.json`(内置 YAML 序列化,零外部依赖)
|
|
532
|
+
|
|
533
|
+
**新增:** `cli/index.ts` — `ai-spec export` 命令
|
|
534
|
+
|
|
535
|
+
```
|
|
536
|
+
ai-spec export # 读取最新 DSL,生成 openapi.yaml
|
|
537
|
+
ai-spec export --format json # 生成 openapi.json
|
|
538
|
+
ai-spec export --server https://api.example.com # 指定服务器 URL
|
|
539
|
+
ai-spec export --output docs/api.yaml # 指定输出路径
|
|
540
|
+
ai-spec export --dsl specs/xxx.dsl.json # 指定 DSL 文件
|
|
541
|
+
```
|
|
542
|
+
|
|
543
|
+
**下游工具链:**
|
|
544
|
+
|
|
545
|
+
```
|
|
546
|
+
openapi.yaml → Postman / Insomnia 直接导入
|
|
547
|
+
→ openapi-generator → TypeScript / Go / Python / Java SDK
|
|
548
|
+
→ Swagger UI → 在线接口文档
|
|
549
|
+
→ Prism → 更专业的 mock server
|
|
550
|
+
```
|
|
551
|
+
|
|
552
|
+
---
|
|
553
|
+
|
|
554
|
+
### Feature 3:多语言 Codegen System Prompt
|
|
555
|
+
|
|
556
|
+
**核心思路:** `workspace-loader` 已识别 Go/Python/Java/Rust,但代码生成的 prompt 仍是 Node.js 风格。对这些项目生成的代码是无法使用的。
|
|
557
|
+
|
|
558
|
+
**修改:** `prompts/codegen.prompt.ts`
|
|
559
|
+
|
|
560
|
+
新增四个语言专属 system prompt,并提供统一入口函数:
|
|
561
|
+
|
|
562
|
+
```typescript
|
|
563
|
+
getCodeGenSystemPrompt(repoType?: string): string
|
|
564
|
+
// "go" → codeGenGoSystemPrompt
|
|
565
|
+
// "python" → codeGenPythonSystemPrompt
|
|
566
|
+
// "java" → codeGenJavaSystemPrompt
|
|
567
|
+
// "rust" → codeGenRustSystemPrompt
|
|
568
|
+
// default → codeGenSystemPrompt (Node.js)
|
|
569
|
+
```
|
|
570
|
+
|
|
571
|
+
各 prompt 的核心差异:
|
|
572
|
+
|
|
573
|
+
| 语言 | 关键规则 |
|
|
574
|
+
|---|---|
|
|
575
|
+
| Go | 惯用 Go 风格(named return errors, context, slog/zap),按 go.mod 检测 router(chi/gin/echo),标准 testing + testify |
|
|
576
|
+
| Python | 检测 FastAPI/Flask/Django,PEP 8 + type annotations + Pydantic,正确注册路由(APIRouter / urls.py) |
|
|
577
|
+
| Java | Spring Boot 分层(Controller→Service→Repository),构造器注入,Lombok 支持,@ControllerAdvice |
|
|
578
|
+
| Rust | 检测 Axum/Actix-web,Result<T,E> everywhere,no unwrap() in production,现有 Cargo.toml crates only |
|
|
579
|
+
|
|
580
|
+
**修改:** `core/code-generator.ts`
|
|
581
|
+
|
|
582
|
+
- `CodeGenOptions` 新增 `repoType?: string` 字段
|
|
583
|
+
- `runApiMode()` 根据 `repoType` 调用 `getCodeGenSystemPrompt()` 选择 prompt
|
|
584
|
+
- `generateFiles()` 和 `runApiModeWithTasks()` 透传 `systemPrompt` 参数
|
|
585
|
+
|
|
586
|
+
**修改:** `core/error-feedback.ts`
|
|
587
|
+
|
|
588
|
+
- `attemptFix()` 改为使用 `getCodeGenSystemPrompt()`(修复时也使用语言正确的 prompt)
|
|
589
|
+
|
|
590
|
+
---
|
|
591
|
+
|
|
592
|
+
## [0.10.0] 2026-03-23 — Mock Server + 多语言后端支持
|
|
593
|
+
|
|
594
|
+
### 目标
|
|
595
|
+
|
|
596
|
+
解决 `ai-spec create` 之后前后端联调断层问题:后端 DSL 已有,但服务未部署、本地无法连数据库,前端无从联调。同时扩展多语言后端 Repo 识别与错误反馈。
|
|
597
|
+
|
|
598
|
+
---
|
|
599
|
+
|
|
600
|
+
### Feature 1:`ai-spec mock` — 一键联调 Mock 套件
|
|
601
|
+
|
|
602
|
+
**新增:** `core/mock-server-generator.ts`
|
|
603
|
+
|
|
604
|
+
从已有 DSL(`.ai-spec/*.dsl.json`)生成三类联调资产:
|
|
605
|
+
|
|
606
|
+
**① 独立 Express Mock 服务器(`mock/server.js`)**
|
|
607
|
+
|
|
608
|
+
- 纯 CommonJS,只依赖 `express`,无需任何编译,`node mock/server.js` 即运行
|
|
609
|
+
- 每个 DSL 端点对应一个路由,返回从数据模型字段类型推断的 fixture 响应
|
|
610
|
+
- `DateTime` → ISO 8601 字符串,`Int` ID 字段 → `"abc123"`,`price` 字段 → `9.99`,List 端点 → `{ data: [...], total, page, pageSize }`
|
|
611
|
+
- `auth: true` 端点自动挂 Bearer Token 验证中间件(缺失时返回 401)
|
|
612
|
+
- CORS 全开(dev only)
|
|
613
|
+
- 生成 `mock/README.md`:端点表、快速启动说明
|
|
614
|
+
|
|
615
|
+
**② 前端 Proxy 配置片段(`--proxy`)**
|
|
616
|
+
|
|
617
|
+
- 自动识别前端框架(检测 `vite.config.*` / `next.config.*` / `react-scripts` / `webpack.config.*`)
|
|
618
|
+
- 按框架生成对应配置片段(注释形式):
|
|
619
|
+
- Vite → `server.proxy` 块
|
|
620
|
+
- Next.js → `rewrites()` 数组
|
|
621
|
+
- CRA → `package.json "proxy"` + `setupProxy.js`
|
|
622
|
+
- webpack → `devServer.proxy` 块
|
|
623
|
+
|
|
624
|
+
**③ MSW Handler(`--msw`)**
|
|
625
|
+
|
|
626
|
+
- 生成 `src/mocks/handlers.ts`:msw v2 风格,`http.get/post/...` + `HttpResponse.json()`
|
|
627
|
+
- 生成 `src/mocks/browser.ts`:`setupWorker` 初始化
|
|
628
|
+
- 适用于前端完全脱离后端本地运行的场景
|
|
629
|
+
|
|
630
|
+
**新增:** `cli/index.ts` — `ai-spec mock` 命令
|
|
631
|
+
|
|
632
|
+
```
|
|
633
|
+
ai-spec mock # 读取最新 DSL,生成 mock/server.js
|
|
634
|
+
ai-spec mock --port 3002 # 指定端口(默认 3001)
|
|
635
|
+
ai-spec mock --proxy # 同时生成 Proxy 配置片段
|
|
636
|
+
ai-spec mock --msw # 同时生成 MSW handlers
|
|
637
|
+
ai-spec mock --dsl <path> # 指定 DSL 文件
|
|
638
|
+
ai-spec mock --workspace # 工作区所有后端 repo 批量生成
|
|
639
|
+
```
|
|
640
|
+
|
|
641
|
+
---
|
|
642
|
+
|
|
643
|
+
### Feature 2:多语言后端支持
|
|
644
|
+
|
|
645
|
+
**修改:** `core/workspace-loader.ts`
|
|
646
|
+
|
|
647
|
+
`RepoType` 新增:`"go"` | `"python"` | `"java"` | `"rust"`
|
|
648
|
+
|
|
649
|
+
`detectRepoType()` 在 `package.json` 检测前优先检查非 Node.js 语言:
|
|
650
|
+
|
|
651
|
+
| 语言 | 识别依据 |
|
|
652
|
+
|---|---|
|
|
653
|
+
| Go | `go.mod` |
|
|
654
|
+
| Rust | `Cargo.toml` |
|
|
655
|
+
| Java | `pom.xml` / `build.gradle` / `build.gradle.kts` |
|
|
656
|
+
| Python | `requirements.txt` / `pyproject.toml` / `setup.py` |
|
|
657
|
+
|
|
658
|
+
`autoDetect()` 扩展扫描条件:不再只检查 `package.json`,同时检查以上所有 manifest 文件。
|
|
659
|
+
|
|
660
|
+
**修改:** `core/error-feedback.ts`
|
|
661
|
+
|
|
662
|
+
`detectTestCommand()` 和 `detectLintCommand()` 按语言自动选择:
|
|
663
|
+
|
|
664
|
+
| 语言 | 测试命令 | Lint 命令 |
|
|
665
|
+
|---|---|---|
|
|
666
|
+
| Go | `go test ./...` | `go vet ./...` |
|
|
667
|
+
| Rust | `cargo test` | `cargo clippy -- -D warnings` |
|
|
668
|
+
| Java (Maven) | `mvn test -q` | — |
|
|
669
|
+
| Java (Gradle) | `./gradlew test` | — |
|
|
670
|
+
| Python | `pytest` | `ruff check . \|\| flake8 .` |
|
|
671
|
+
| Node.js | `npm test` / `npx vitest run` | `npm run lint` / `npx eslint .` |
|
|
672
|
+
|
|
673
|
+
`parseErrors()` 文件路径提取正则扩展支持 `.go` `.py` `.java` `.rs` 后缀。
|
|
674
|
+
|
|
675
|
+
**修改:** `cli/index.ts` — workspace init 交互
|
|
676
|
+
|
|
677
|
+
Repo 类型选择器新增 `go` / `python` / `java` / `rust` 选项。
|
|
678
|
+
|
|
679
|
+
---
|
|
680
|
+
|
|
681
|
+
## [0.9.0] 2026-03-23 — 三项精准 Fix:前端 DSL 提取 / 分解上下文 / Codegen 注入
|
|
682
|
+
|
|
683
|
+
### 目标
|
|
684
|
+
|
|
685
|
+
修复上一版自我评估中指出的三个薄弱点,使「一句话 → 前后端全链路」真正可靠运行而不依赖 AI 猜测。
|
|
686
|
+
|
|
687
|
+
---
|
|
688
|
+
|
|
689
|
+
### Fix 1:前端 DSL 提取 — ComponentSpec 提取不再依赖推断
|
|
690
|
+
|
|
691
|
+
**修改:** `prompts/dsl.prompt.ts`
|
|
692
|
+
|
|
693
|
+
新增 `dslFrontendSystemPrompt`:
|
|
694
|
+
- 专为前端规格设计的提取规则,输出格式含 `components[]` 数组
|
|
695
|
+
- `models[]` 在前端 feature 中强制为 `[]`,由 `components[]` 替代
|
|
696
|
+
- `ComponentSpec` 结构:id / name / description / props(name/type/required)/ events(name/payload)/ state(Record<string,string>)/ apiCalls(调用的端点列表)
|
|
697
|
+
- `buildDslExtractionPrompt()` 新增 `isFrontend` 参数,前端场景追加提示语
|
|
698
|
+
|
|
699
|
+
**修改:** `core/dsl-extractor.ts`
|
|
700
|
+
|
|
701
|
+
- `extract()` 新增 `opts.isFrontend?: boolean` 参数
|
|
702
|
+
- 前端项目自动使用 `dslFrontendSystemPrompt` 和前端提取 prompt
|
|
703
|
+
- `buildDslContextSection()` 扩展:若 DSL 含 `components[]`,追加 `-- UI Components --` 区块注入到 codegen prompt
|
|
704
|
+
- 自动检测依赖(react/vue/next/react-native/expo)→ 设置 `isFrontend`
|
|
705
|
+
|
|
706
|
+
**修改:** `core/dsl-validator.ts`
|
|
707
|
+
|
|
708
|
+
- 新增 `validateComponent()` 函数:校验 `ComponentSpec` 的 id/name/description/props/events/state/apiCalls 字段
|
|
709
|
+
- `validateDsl()` 增加 `components[]` 可选字段校验(bounded loop,max 50)
|
|
710
|
+
- `printDslSummary()` 扩展:显示 `Components: N` 及每个组件的 id、name、props/events 数量
|
|
711
|
+
|
|
712
|
+
**修改:** `cli/index.ts` — 两处 `extract()` 调用
|
|
713
|
+
|
|
714
|
+
- 单 repo 模式:从 `context.dependencies` 检测前端项目,传入 `isFrontend`
|
|
715
|
+
- 多 repo 模式(`runSingleRepoPipelineInWorkspace`):同样检测并传入 `isFrontend`
|
|
716
|
+
|
|
717
|
+
---
|
|
718
|
+
|
|
719
|
+
### Fix 2:需求分解上下文注入 — UX 决策基于真实代码而非猜测
|
|
720
|
+
|
|
721
|
+
**修改:** `prompts/decompose.prompt.ts`
|
|
722
|
+
|
|
723
|
+
`buildDecomposePrompt()` 新增 `frontendContexts?: Map<string, FrontendContext>` 参数:
|
|
724
|
+
|
|
725
|
+
对每个前端/移动端 repo,在 prompt 中注入:
|
|
726
|
+
- `Framework / Test / HTTP client` 基础信息
|
|
727
|
+
- 现有 hook 文件列表(告诉 AI "reference these in specIdea")
|
|
728
|
+
- 现有 API wrapper 列表(附注"MUST extend, NOT recreate")
|
|
729
|
+
- 现有 store 文件列表(附注"add state here, don't create new stores")
|
|
730
|
+
- API wrapper 前 10 行代码片段(让 AI 知道现有调用模式)
|
|
731
|
+
|
|
732
|
+
**修改:** `core/requirement-decomposer.ts`
|
|
733
|
+
|
|
734
|
+
- `decompose()` 新增 `frontendContexts?: Map<string, FrontendContext>` 参数,透传到 `buildDecomposePrompt()`
|
|
735
|
+
|
|
736
|
+
**修改:** `cli/index.ts` — `runMultiRepoPipeline()`
|
|
737
|
+
|
|
738
|
+
- W1 阶段:对 frontend/mobile repo 同步调用 `loadFrontendContext()`,构建 `frontendContexts` Map
|
|
739
|
+
- W1 输出展示:`framework / httpClient | hooks:N stores:N`
|
|
740
|
+
- W2 阶段:将 `frontendContexts` 传入 `decomposer.decompose()`
|
|
741
|
+
|
|
742
|
+
---
|
|
743
|
+
|
|
744
|
+
### Fix 3:前端 Codegen 上下文注入 — AI 不再凭空创建 hook/service
|
|
745
|
+
|
|
746
|
+
**修改:** `core/code-generator.ts`
|
|
747
|
+
|
|
748
|
+
`runApiMode()` 新增前端感知逻辑:
|
|
749
|
+
1. 检测 `context.dependencies` 中是否含前端框架(react/vue/next/react-native/expo)
|
|
750
|
+
2. 如果是前端项目 → 调用 `loadFrontendContext(workingDir)`
|
|
751
|
+
3. `buildFrontendContextSection()` 输出注入 prompt(展示现有 hook/store/API wrapper 文件和代码)
|
|
752
|
+
4. `frontendSection` 拼入:
|
|
753
|
+
- 有 tasks 时:`constitutionSection + dslSection + frontendSection`(传入 `runApiModeWithTasks`)
|
|
754
|
+
- 无 tasks 时:`plan prompt` 和 `generateFiles` 调用均包含 `frontendSection`
|
|
755
|
+
5. Plan prompt 新增明确指令:`Extend existing hooks/services/stores — do NOT create new parallel utilities`
|
|
756
|
+
|
|
757
|
+
---
|
|
758
|
+
|
|
759
|
+
## [0.8.0] 2026-03-23 — 前端支持增强 + 跨项目共享宪法
|
|
760
|
+
|
|
761
|
+
### 目标
|
|
762
|
+
|
|
763
|
+
两项中优先级优化同步落地:让 ai-spec 真正理解前端项目的结构(而不只是检测框架名称),并将「项目宪法」从单项目升级为「全局 + 项目」双层架构,使团队规范可以跨 repo 共享。
|
|
764
|
+
|
|
765
|
+
---
|
|
766
|
+
|
|
767
|
+
### #14 前端支持增强 (6.4)
|
|
768
|
+
|
|
769
|
+
**修改:** `core/dsl-types.ts`
|
|
770
|
+
|
|
771
|
+
新增 `ComponentSpec` 类型:
|
|
772
|
+
- `ComponentProp`:name / type / required / description
|
|
773
|
+
- `ComponentEvent`:name / payload(回调事件)
|
|
774
|
+
- `ComponentSpec`:id / name / description / props / events / state / apiCalls
|
|
775
|
+
- `SpecDSL.components?: ComponentSpec[]`(前端 DSL 的可选组件规格列表)
|
|
776
|
+
|
|
777
|
+
**修改:** `core/frontend-context-loader.ts`
|
|
778
|
+
|
|
779
|
+
`FrontendContext` 新增字段:
|
|
780
|
+
- `testFramework`:自动检测 `rtl` / `cypress` / `vitest` / `jest` / `unknown`
|
|
781
|
+
- `apiWrapperContent`:前 2 个 API 封装文件的前 60 行内容(阻止 AI 重复创建请求工具)
|
|
782
|
+
- `hookFiles`:`use*.ts/tsx` hook 文件列表(15 个以内)
|
|
783
|
+
- `hookPatterns`:前 2 个 hook 文件的前 30 行内容(提供命名和结构参考)
|
|
784
|
+
- `storeFiles`:Zustand store / Redux slice 等状态文件列表
|
|
785
|
+
|
|
786
|
+
`buildFrontendContextSection()` 更新:
|
|
787
|
+
- 展示 API wrapper 代码(附注"extend these, do NOT create new request utilities")
|
|
788
|
+
- 展示 hook 列表和结构示例
|
|
789
|
+
- 展示 store 文件列表
|
|
790
|
+
|
|
791
|
+
**修改:** `core/test-generator.ts`
|
|
792
|
+
|
|
793
|
+
前后端感知测试生成:
|
|
794
|
+
- `isFrontendProject()` — 通过 package.json 检测前端项目(react / vue / next / react-native)
|
|
795
|
+
- `generate()` 自动分叉:前端走 RTL/Cypress 模板,后端走原有 Jest/Vitest 模板
|
|
796
|
+
- 前端模式:把 `ComponentSpec` / hook 文件 / API wrapper 结构注入 prompt
|
|
797
|
+
- 在 console 输出显示 `Mode: frontend (react / rtl)` 等信息
|
|
798
|
+
|
|
799
|
+
**修改:** `prompts/testgen.prompt.ts`
|
|
800
|
+
|
|
801
|
+
新增 `testGenFrontendSystemPrompt`:
|
|
802
|
+
- 专为 React Testing Library 编写的规则集
|
|
803
|
+
- 覆盖:渲染测试 / props 测试 / 交互事件 / 加载状态 / 乐观更新回滚 / 节流防抖(`jest.useFakeTimers()`)
|
|
804
|
+
|
|
805
|
+
---
|
|
806
|
+
|
|
807
|
+
### #15 跨项目共享宪法 (6.3)
|
|
808
|
+
|
|
809
|
+
**新文件:** `core/global-constitution.ts`
|
|
810
|
+
|
|
811
|
+
- `GLOBAL_CONSTITUTION_FILE = ".ai-spec-global-constitution.md"`
|
|
812
|
+
- `loadGlobalConstitution(extraRoots)` — 按优先级搜索:传入目录 → 用户 home
|
|
813
|
+
- `mergeConstitutions(global, project)` — 双层注入:全局宪法 + 项目宪法(项目优先)
|
|
814
|
+
- `saveGlobalConstitution(content, targetDir)` — 保存到指定目录(默认 home)
|
|
815
|
+
|
|
816
|
+
**新文件:** `prompts/global-constitution.prompt.ts`
|
|
817
|
+
|
|
818
|
+
- `globalConstitutionSystemPrompt`:5 个章节(团队 API 规范 / 命名规范 / 禁区 / 跨端契约规范 / 日志规范)
|
|
819
|
+
- `buildGlobalConstitutionPrompt(summaries)` — 构建跨 repo 分析 prompt
|
|
820
|
+
|
|
821
|
+
**修改:** `core/context-loader.ts`
|
|
822
|
+
|
|
823
|
+
`loadConstitution()` 升级为双层宪法加载:
|
|
824
|
+
1. 加载项目宪法(`.ai-spec-constitution.md`)
|
|
825
|
+
2. 搜索全局宪法(项目父目录 → home dir)
|
|
826
|
+
3. 如果全局宪法存在 → `mergeConstitutions()` 合并注入
|
|
827
|
+
4. 如果只有项目宪法 → 直接使用(完全向后兼容)
|
|
828
|
+
|
|
829
|
+
**修改:** `cli/index.ts`
|
|
830
|
+
|
|
831
|
+
`ai-spec init` 新增 `--global` 选项:
|
|
832
|
+
- 生成全局宪法而非项目宪法(写入当前目录的 `.ai-spec-global-constitution.md`)
|
|
833
|
+
- 使用 `globalConstitutionSystemPrompt` 生成团队级规范
|
|
834
|
+
- 支持 `--force` 覆盖已有全局宪法
|
|
835
|
+
|
|
836
|
+
`ai-spec init`(项目模式)新增:
|
|
837
|
+
- 检测全局宪法后显示提示:`ℹ Global constitution detected: <path>`,提示用户项目规则优先
|
|
838
|
+
|
|
839
|
+
---
|
|
840
|
+
|
|
841
|
+
## [0.7.0] 2026-03-23 — Phase 4: 多 Repo 工作区编排
|
|
842
|
+
|
|
843
|
+
### 目标
|
|
844
|
+
|
|
845
|
+
将 ai-spec 从「单项目工具」升级为「多 Repo 需求编排器」。输入一句需求,系统自动分析它对各端(后端/前端/移动端)意味着什么,按依赖顺序依次为每个 Repo 运行完整流水线,并通过契约桥接确保后端接口定义直接成为前端开发的输入上下文,消灭前后端对接歧义。
|
|
846
|
+
|
|
847
|
+
---
|
|
848
|
+
|
|
849
|
+
### #13 Workspace 层
|
|
850
|
+
|
|
851
|
+
**新文件:** `core/workspace-loader.ts`
|
|
852
|
+
|
|
853
|
+
- `RepoConfig`:name / path / type / role / constitution(运行时加载)
|
|
854
|
+
- `WorkspaceConfig`:name + repos 数组
|
|
855
|
+
- `detectRepoType(absPath)`:从 package.json 依赖自动检测 repo 类型和角色
|
|
856
|
+
- react-native/expo → mobile
|
|
857
|
+
- next → frontend
|
|
858
|
+
- react → frontend
|
|
859
|
+
- vue → frontend
|
|
860
|
+
- koa → backend
|
|
861
|
+
- express/prisma/mongoose → backend
|
|
862
|
+
- `WorkspaceLoader.load()`:加载 `.ai-spec-workspace.json`,不存在时返回 null(优雅降级)
|
|
863
|
+
- `WorkspaceLoader.autoDetect()`:扫描当前目录的子目录,自动发现包含 package.json 的 repo
|
|
864
|
+
- `WorkspaceLoader.resolveRepoPaths()`:解析相对路径 + 自动加载各 repo 的宪法文件
|
|
865
|
+
- `WorkspaceLoader.save()`:保存时自动去掉运行时字段(constitution)
|
|
866
|
+
- `WorkspaceLoader.getProcessingOrder()`:按 backend → shared → frontend → mobile 排序
|
|
867
|
+
|
|
868
|
+
---
|
|
869
|
+
|
|
870
|
+
### #14 需求分解器
|
|
871
|
+
|
|
872
|
+
**新文件:** `core/requirement-decomposer.ts` + `prompts/decompose.prompt.ts`
|
|
873
|
+
|
|
874
|
+
**核心类型:**
|
|
875
|
+
|
|
876
|
+
```typescript
|
|
877
|
+
UxDecision {
|
|
878
|
+
throttleMs?: number // e.g. 300 — 按钮点击类操作
|
|
879
|
+
debounceMs?: number // e.g. 500 — 搜索输入类操作
|
|
880
|
+
optimisticUpdate: boolean // 先更新 UI,再等服务器确认
|
|
881
|
+
reloadOnSuccess?: string[]// 成功后需要重新拉取哪些接口(通常为空)
|
|
882
|
+
errorRollback: boolean // 乐观更新失败时回滚
|
|
883
|
+
loadingState: boolean // 是否显示 loading
|
|
884
|
+
notes?: string // 额外协作说明
|
|
885
|
+
}
|
|
886
|
+
|
|
887
|
+
RepoRequirement {
|
|
888
|
+
repoName, role, specIdea
|
|
889
|
+
isContractProvider // 该 repo 的 DSL 成为其他 repo 的契约
|
|
890
|
+
dependsOnRepos // 依赖哪些 repo 先完成
|
|
891
|
+
uxDecisions // 仅前端/移动端有
|
|
892
|
+
}
|
|
893
|
+
|
|
894
|
+
DecompositionResult {
|
|
895
|
+
originalRequirement, summary
|
|
896
|
+
repos: RepoRequirement[]
|
|
897
|
+
coordinationNotes // 跨 repo 协调说明
|
|
898
|
+
}
|
|
899
|
+
```
|
|
900
|
+
|
|
901
|
+
**Prompt 设计(`decompose.prompt.ts`):**
|
|
902
|
+
- 包含 throttle vs debounce 判断指南(高频点击用 throttle,输入搜索用 debounce)
|
|
903
|
+
- 包含乐观更新模式说明(点赞/收藏等用 optimistic,支付等用等待确认)
|
|
904
|
+
- 要求输出精确的接口路径、方法、返回字段,不允许模糊描述
|
|
905
|
+
- 输出标准 JSON,包含完整示例
|
|
906
|
+
|
|
907
|
+
**鲁棒性:**
|
|
908
|
+
- 分解失败时降级:自动为所有 repo 生成基础 requirement,后端 isContractProvider=true,前端依赖后端
|
|
909
|
+
- `sortByDependency()`:拓扑排序,循环依赖时给出警告但不崩溃
|
|
910
|
+
|
|
911
|
+
---
|
|
912
|
+
|
|
913
|
+
### #15 跨 Repo 契约桥接
|
|
914
|
+
|
|
915
|
+
**新文件:** `core/contract-bridge.ts`
|
|
916
|
+
|
|
917
|
+
**核心功能:**
|
|
918
|
+
- `buildFrontendApiContract(dsl)`:将后端 SpecDSL 转换为前端可消费的 API 契约
|
|
919
|
+
- 生成 TypeScript interface 定义(Request / Response 类型)
|
|
920
|
+
- `inferTsType()`:从 DSL 字段描述启发式推断 TS 类型(boolean/number/string/datetime)
|
|
921
|
+
- `buildResponseInterface()`:优先从模型字段推断响应类型,降级到从 successDescription 关键词推断
|
|
922
|
+
- `buildContractContextSection(contract)`:生成注入 prompt 的文本块,明确标注「不得更改路径/方法/类型」
|
|
923
|
+
|
|
924
|
+
**前端 Spec Prompt:** `prompts/frontend-spec.prompt.ts`
|
|
925
|
+
- 包含 UX 工程模式参考(throttle/debounce/optimistic update/state sync 最佳实践)
|
|
926
|
+
- `buildFrontendSpecPrompt(opts)`:将 API 契约 + UX 决策 + 前端上下文组合成完整 prompt
|
|
927
|
+
|
|
928
|
+
---
|
|
929
|
+
|
|
930
|
+
### #16 前端项目上下文加载
|
|
931
|
+
|
|
932
|
+
**新文件:** `core/frontend-context-loader.ts`
|
|
933
|
+
|
|
934
|
+
- 检测框架(react / next / vue / react-native)
|
|
935
|
+
- 检测状态管理(zustand / redux / jotai / pinia 等)
|
|
936
|
+
- 检测 HTTP 客户端(axios / react-query / swr / fetch)
|
|
937
|
+
- 检测 UI 库(tailwind / antd / shadcn / MUI 等)
|
|
938
|
+
- 检测路由模式(react-router / next-app-router / vue-router)
|
|
939
|
+
- 扫描现有 api/ / services/ 目录
|
|
940
|
+
- 扫描 component 模式样本
|
|
941
|
+
|
|
942
|
+
---
|
|
943
|
+
|
|
944
|
+
### Pipeline 集成
|
|
945
|
+
|
|
946
|
+
**`cli/index.ts` 变更:**
|
|
947
|
+
|
|
948
|
+
**新增:`workspace` 命令**
|
|
949
|
+
|
|
950
|
+
```
|
|
951
|
+
ai-spec workspace init # 交互式设置 .ai-spec-workspace.json
|
|
952
|
+
ai-spec workspace status # 显示当前 workspace 配置和路径解析状态
|
|
953
|
+
```
|
|
954
|
+
|
|
955
|
+
`workspace init` 流程:
|
|
956
|
+
1. 询问 workspace 名称
|
|
957
|
+
2. 循环添加 repo(name + 相对路径),自动检测 type/role
|
|
958
|
+
3. 保存 `.ai-spec-workspace.json`
|
|
959
|
+
|
|
960
|
+
**修改:`create` 命令增加 workspace 模式检测**
|
|
961
|
+
|
|
962
|
+
- 启动时检测 `.ai-spec-workspace.json` 是否存在
|
|
963
|
+
- 存在时进入多 Repo 流水线(`runMultiRepoPipeline`)
|
|
964
|
+
- 不存在时静默 fallback 到原单 Repo 流水线
|
|
965
|
+
|
|
966
|
+
**`runMultiRepoPipeline()` 流程:**
|
|
967
|
+
|
|
968
|
+
```
|
|
969
|
+
[W1] 加载所有 repo 的 ProjectContext
|
|
970
|
+
[W2] AI 分解需求 → DecompositionResult(含 UxDecision)
|
|
971
|
+
[W3] 展示分解预览 + 用户确认(--auto 跳过)
|
|
972
|
+
[W4] 按依赖顺序逐 repo 运行完整流水线
|
|
973
|
+
后端完成后 → buildFrontendApiContract(dsl)
|
|
974
|
+
→ buildContractContextSection(contract)
|
|
975
|
+
→ 注入到下一个 frontend repo 的 spec idea 中
|
|
976
|
+
[W5] 最终汇总(所有 repo 的 spec / DSL / worktree 路径)
|
|
977
|
+
```
|
|
978
|
+
|
|
979
|
+
**`runSingleRepoPipelineInWorkspace()` 关键特性:**
|
|
980
|
+
- 接受 `contractContextSection` 参数,注入 spec idea 前端
|
|
981
|
+
- 每个 repo 独立容错,失败不中断其他 repo
|
|
982
|
+
- 自动为每个 repo 生成宪法(如不存在)
|
|
983
|
+
|
|
984
|
+
---
|
|
985
|
+
|
|
986
|
+
### 命令新增
|
|
987
|
+
|
|
988
|
+
```
|
|
989
|
+
ai-spec workspace init # 初始化 workspace
|
|
990
|
+
ai-spec workspace status # 查看 workspace 状态
|
|
991
|
+
ai-spec create "..." # 自动检测 workspace 模式
|
|
992
|
+
```
|
|
993
|
+
|
|
994
|
+
---
|
|
995
|
+
|
|
996
|
+
### 文档
|
|
997
|
+
|
|
998
|
+
- `RELEASE_LOG.md`:本条目
|
|
999
|
+
|
|
1000
|
+
---
|
|
1001
|
+
|
|
1002
|
+
## [0.6.0] 2026-03-23 — Phase 3: 测试生成 · 错误反馈 · 经验积累
|
|
1003
|
+
|
|
1004
|
+
### 目标
|
|
1005
|
+
|
|
1006
|
+
在代码生成后引入"自动质检"闭环:生成测试骨架 → 运行测试/lint → AI 自动修复 → 代码审查 → 将审查教训写回项目宪法,使宪法随每次迭代持续进化。
|
|
1007
|
+
|
|
1008
|
+
---
|
|
1009
|
+
|
|
1010
|
+
### #10 测试骨架生成
|
|
1011
|
+
|
|
1012
|
+
**新文件:** `core/test-generator.ts` + `prompts/testgen.prompt.ts`
|
|
1013
|
+
|
|
1014
|
+
**触发条件:** 代码生成完成且 DSL 提取成功时自动运行(可用 `--skip-tests` 跳过)
|
|
1015
|
+
|
|
1016
|
+
**生成逻辑:**
|
|
1017
|
+
|
|
1018
|
+
- `buildTestGenPrompt(dsl, testDir)` — 从 DSL 提取测试要点:
|
|
1019
|
+
- 每个端点 → 成功路径 / 参数校验 / 鉴权测试(`auth: true` 时)
|
|
1020
|
+
- 每个模型 → 创建测试 / 唯一约束测试(有 `unique` 字段时)
|
|
1021
|
+
- 每个业务行为 → 边界用例
|
|
1022
|
+
- `detectTestDir()` — 自动检测 `tests/` · `test/` · `__tests__/` · `spec/`,默认 `tests/`
|
|
1023
|
+
- AI 返回 `[{ file: "path", content: "source" }]` JSON 数组,逐文件写入
|
|
1024
|
+
|
|
1025
|
+
**Prompt 约束(`testgen.prompt.ts`):**
|
|
1026
|
+
|
|
1027
|
+
- 使用项目已有测试框架(Jest/Vitest 自动检测)
|
|
1028
|
+
- `describe/it` 骨架结构,不实现断言(placeholder 注释标 TODO)
|
|
1029
|
+
- 每个端点至少:成功路径、参数校验、鉴权(if auth=true)
|
|
1030
|
+
- 每个模型至少:创建、唯一约束(if unique 字段存在)
|
|
1031
|
+
- 最多 2 层 describe 嵌套
|
|
1032
|
+
|
|
1033
|
+
**步骤标记:** `[7/9]`(位于代码生成后、错误反馈前)
|
|
1034
|
+
|
|
1035
|
+
---
|
|
1036
|
+
|
|
1037
|
+
### #11 错误反馈自动修复循环
|
|
1038
|
+
|
|
1039
|
+
**新文件:** `core/error-feedback.ts`
|
|
1040
|
+
|
|
1041
|
+
**触发条件:** 代码生成/测试生成后自动运行(可用 `--skip-error-feedback` 跳过)
|
|
1042
|
+
|
|
1043
|
+
**检测:**
|
|
1044
|
+
|
|
1045
|
+
- `detectTestCommand()` — 检查 `package.json scripts.test`、vitest/jest config 文件
|
|
1046
|
+
- `detectLintCommand()` — 检查 `package.json scripts.lint`、`.eslintrc*` / `eslint.config.js`
|
|
1047
|
+
- 两者都未检测到时跳过整个 feedback 步骤
|
|
1048
|
+
|
|
1049
|
+
**修复流程(最多 2 次 cycle):**
|
|
1050
|
+
|
|
1051
|
+
```
|
|
1052
|
+
cycle 1: runCommand(testCmd) → parseErrors() → attemptFix()
|
|
1053
|
+
cycle 2: runCommand(testCmd) → 验证修复结果
|
|
1054
|
+
```
|
|
1055
|
+
|
|
1056
|
+
- `parseErrors()` — 取输出最后 80 行,过滤 node_modules / npm timing / stack trace 噪音
|
|
1057
|
+
- `attemptFix()` — 按文件分组错误,逐文件提交 AI,prompt 携带 DSL 上下文 + 当前文件内容
|
|
1058
|
+
- 每次 fix 后重写文件,cycle 通过则提前结束
|
|
1059
|
+
- 2 次后仍有错误 → 黄色警告,不中断流水线
|
|
1060
|
+
|
|
1061
|
+
**选项:** `ErrorFeedbackOptions { maxCycles, skipTests, skipLint }`
|
|
1062
|
+
|
|
1063
|
+
**步骤标记:** `[8/9]`(位于测试生成后、代码审查前)
|
|
1064
|
+
|
|
1065
|
+
---
|
|
1066
|
+
|
|
1067
|
+
### #12 知识记忆 / 经验积累
|
|
1068
|
+
|
|
1069
|
+
**新文件:** `core/knowledge-memory.ts`
|
|
1070
|
+
|
|
1071
|
+
**触发条件:** 代码审查完成后自动运行(`--skip-review` 时跳过)
|
|
1072
|
+
|
|
1073
|
+
**提取流程:**
|
|
1074
|
+
|
|
1075
|
+
1. `extractIssuesFromReview(reviewText)` — 解析审查报告中的 `## ⚠️ 问题` 章节,提取最多 10 条 issue
|
|
1076
|
+
2. `categorizeIssue(text)` — 根据关键词自动分类:security 🔒 / performance ⚡ / bug 🐛 / pattern 📐 / general 📝
|
|
1077
|
+
3. `appendLessonsToConstitution(projectRoot, issues)` — 追加到宪法 `§9 积累教训`:
|
|
1078
|
+
- Section 不存在时自动创建 `## 9. 积累教训 (Accumulated Lessons)`
|
|
1079
|
+
- 存在时追加到 Section 内容末尾(自动找到下一个 `## \d` 前的位置)
|
|
1080
|
+
- **去重**:issue 描述前 50 字符与宪法现有内容匹配时跳过
|
|
1081
|
+
|
|
1082
|
+
**宪法 §9 格式:**
|
|
1083
|
+
|
|
1084
|
+
```markdown
|
|
1085
|
+
## 9. 积累教训 (Accumulated Lessons)
|
|
1086
|
+
- 🔒 **[2026-03-23]** 登录接口缺少 rate limiting
|
|
1087
|
+
- 🐛 **[2026-03-23]** 异步错误未被全局 error handler 捕获
|
|
1088
|
+
```
|
|
1089
|
+
|
|
1090
|
+
**效果:** 每次 `ai-spec create` 运行时宪法(含 §9)会注入所有 Spec/代码生成 prompt,积累的教训在后续迭代中自动生效。
|
|
1091
|
+
|
|
1092
|
+
---
|
|
1093
|
+
|
|
1094
|
+
### Pipeline 集成
|
|
1095
|
+
|
|
1096
|
+
**`cli/index.ts` 变更:**
|
|
1097
|
+
|
|
1098
|
+
- 新增 `--skip-tests` 选项
|
|
1099
|
+
- 新增 `--skip-error-feedback` 选项
|
|
1100
|
+
- 新增 `[7/9]` 测试生成步骤(代码生成后)
|
|
1101
|
+
- 新增 `[8/9]` 错误反馈步骤
|
|
1102
|
+
- 原 `[7/7]` 代码审查 → 改为 `[9/9]`
|
|
1103
|
+
- 审查完成后捕获返回值,传入 `accumulateReviewKnowledge()`
|
|
1104
|
+
- Done 摘要新增测试骨架文件数
|
|
1105
|
+
- 版本号升至 `0.6.0`
|
|
1106
|
+
|
|
1107
|
+
---
|
|
1108
|
+
|
|
1109
|
+
### 其他变更
|
|
1110
|
+
|
|
1111
|
+
- **移除小米 MiMo provider**:从 `PROVIDER_CATALOG` 和 README 中移除 `mimo` / `MIMO_API_KEY` / `mimo-v2-pro`。MiMo V2 Pro 模型目前暂不支持。
|
|
1112
|
+
|
|
1113
|
+
---
|
|
1114
|
+
|
|
1115
|
+
### 文档
|
|
1116
|
+
|
|
1117
|
+
- `README.md`:
|
|
1118
|
+
- 流水线概览图加入 Phase 3 全部步骤
|
|
1119
|
+
- 快速开始示例输出更新(含 Phase 3 步骤日志)
|
|
1120
|
+
- 支持模型表移除 MiMo
|
|
1121
|
+
- `create` 选项表新增 `--skip-tests`、`--skip-error-feedback`
|
|
1122
|
+
- 新增 "Step 7 — 测试骨架生成"、"Step 8 — 错误反馈自动修复"、"Step 9 — 代码审查 + 经验积累" 章节
|
|
1123
|
+
- 项目结构更新(新增 3 个 Phase 3 文件)
|
|
1124
|
+
- 命令总览更新,新增所有命令与选项速查表
|
|
1125
|
+
- `RELEASE_LOG.md`:本条目
|
|
1126
|
+
|
|
1127
|
+
---
|
|
1128
|
+
|
|
1129
|
+
## [0.5.0] 2026-03-23 — Phase 2: DSL 转换 · Schema · 校验
|
|
1130
|
+
|
|
1131
|
+
### 目标
|
|
1132
|
+
|
|
1133
|
+
在 Approval Gate 之后、代码生成之前,引入结构化 JSON DSL 作为 Spec → Code 的中间层。DSL 提供确定性的端点签名和数据模型定义,减少 codegen 阶段的 AI 猜测。
|
|
1134
|
+
|
|
1135
|
+
---
|
|
1136
|
+
|
|
1137
|
+
### #5 DSL Schema / 类型系统
|
|
1138
|
+
|
|
1139
|
+
**新文件:** `core/dsl-types.ts`
|
|
1140
|
+
|
|
1141
|
+
定义 `SpecDSL` 及其所有子类型,**设计约束**:
|
|
1142
|
+
- 所有类型完全扁平,无递归类型定义
|
|
1143
|
+
- 无泛型 / 条件类型 / 映射类型,保持 TS 编译简单
|
|
1144
|
+
- `request/response` schema 用 `Record<string, string>`(字段名 → 类型描述字符串),避免深层嵌套引发幻觉
|
|
1145
|
+
|
|
1146
|
+
**类型结构:**
|
|
1147
|
+
```
|
|
1148
|
+
SpecDSL
|
|
1149
|
+
├── version: "1.0"
|
|
1150
|
+
├── feature: FeatureMeta { id, title, description }
|
|
1151
|
+
├── models: DataModel[]
|
|
1152
|
+
│ └── DataModel { name, description?, fields: ModelField[], relations?: string[] }
|
|
1153
|
+
│ └── ModelField { name, type, required, unique?, description? }
|
|
1154
|
+
├── endpoints: ApiEndpoint[]
|
|
1155
|
+
│ └── ApiEndpoint { id, method, path, description, auth, request?, successStatus, successDescription, errors? }
|
|
1156
|
+
│ ├── RequestSchema { body?, query?, params? } — values are FieldMap (Record<string,string>)
|
|
1157
|
+
│ └── ResponseError { status, code, description }
|
|
1158
|
+
└── behaviors: BusinessBehavior[]
|
|
1159
|
+
└── BusinessBehavior { id, description, trigger?, constraints?: string[] }
|
|
1160
|
+
```
|
|
1161
|
+
|
|
1162
|
+
---
|
|
1163
|
+
|
|
1164
|
+
### #6 DSL 校验器
|
|
1165
|
+
|
|
1166
|
+
**新文件:** `core/dsl-validator.ts`
|
|
1167
|
+
|
|
1168
|
+
**安全设计原则:**
|
|
1169
|
+
- 所有循环以有限数组长度为边界,无递归调用
|
|
1170
|
+
- 硬性上界防护:models ≤ 50,fields/model ≤ 100,endpoints ≤ 100,behaviors ≤ 50,errors/endpoint ≤ 20
|
|
1171
|
+
- 单次遍历收集所有错误(不在第一个错误时抛出),给出完整报告
|
|
1172
|
+
- 精确字段路径:如 `endpoints[1].request.body.userId`
|
|
1173
|
+
- 无外部依赖(不使用 zod / ajv 等)
|
|
1174
|
+
|
|
1175
|
+
**校验规则(关键):**
|
|
1176
|
+
- `method` 枚举校验:只允许 `GET|POST|PUT|PATCH|DELETE`
|
|
1177
|
+
- `path` 必须以 `/` 开头
|
|
1178
|
+
- `auth` 必须是 boolean(不接受字符串 `"true"`)
|
|
1179
|
+
- `successStatus` 必须是 100-599 的整数
|
|
1180
|
+
- `FieldMap` 的值必须是字符串(防止嵌套对象幻觉)
|
|
1181
|
+
- `relations` 必须是字符串数组(plain text,不接受对象)
|
|
1182
|
+
|
|
1183
|
+
**辅助函数:**
|
|
1184
|
+
- `printValidationErrors(errors)` — 彩色错误列表输出
|
|
1185
|
+
- `printDslSummary(dsl)` — 简洁统计 + endpoint 列表
|
|
1186
|
+
|
|
1187
|
+
---
|
|
1188
|
+
|
|
1189
|
+
### #4 DSL 提取器 + Prompt
|
|
1190
|
+
|
|
1191
|
+
**新文件:** `prompts/dsl.prompt.ts` + `core/dsl-extractor.ts`
|
|
1192
|
+
|
|
1193
|
+
**Prompt 抗幻觉设计(9 条 CRITICAL RULES):**
|
|
1194
|
+
1. 只提取明确写出的内容,不推断不补全
|
|
1195
|
+
2. 无 models → `"models": []`,无 behaviors → `"behaviors": []`
|
|
1196
|
+
3. 输出纯 JSON,无 markdown fence,无任何前置/后置文字
|
|
1197
|
+
4. 缺失字段用空字符串 `""`,不能省略字段
|
|
1198
|
+
5. path 必须以 `/` 开头,method 枚举严格
|
|
1199
|
+
6. FieldMap 值必须是类型描述字符串,不能是嵌套对象
|
|
1200
|
+
7. 提供完整 JSON schema 模板供模型对照
|
|
1201
|
+
8. 提供具体 few-shot 示例(带注释说明)
|
|
1202
|
+
9. retry prompt 携带具体错误路径,定向修复
|
|
1203
|
+
|
|
1204
|
+
**提取流程(最多 2 次 retry):**
|
|
1205
|
+
```
|
|
1206
|
+
attempt 1: buildDslExtractionPrompt(spec) → AI → parseJSON → validateDsl
|
|
1207
|
+
成功 → 返回 SpecDSL
|
|
1208
|
+
失败 → 展示错误
|
|
1209
|
+
attempt 2: buildDslRetryPrompt(spec, prevOutput, errors) → AI → parseJSON → validateDsl
|
|
1210
|
+
成功 → 返回 SpecDSL
|
|
1211
|
+
失败 → handleFailure()
|
|
1212
|
+
```
|
|
1213
|
+
|
|
1214
|
+
**JSON 解析容错(`parseJsonFromOutput`):**
|
|
1215
|
+
- 直接以 `{` 开头 → 直接 `JSON.parse`
|
|
1216
|
+
- 有 ` ``` ` fence → 提取 fence 内容再 parse
|
|
1217
|
+
- 都不是 → 找第一个 `{` 到最后一个 `}` 再 parse
|
|
1218
|
+
- 全部失败 → 抛出 `SyntaxError`,触发 retry
|
|
1219
|
+
|
|
1220
|
+
**故障处理:**
|
|
1221
|
+
- `--auto` 模式:失败时静默跳过,不中断流水线
|
|
1222
|
+
- 交互模式:展示选项 `⏭ Skip / ❌ Abort`
|
|
1223
|
+
|
|
1224
|
+
**`buildDslContextSection(dsl)`:**
|
|
1225
|
+
|
|
1226
|
+
将 SpecDSL 转换为紧凑的纯文本摘要(而非 JSON),注入 codegen prompt:
|
|
1227
|
+
- 控制输出大小,避免 token 浪费
|
|
1228
|
+
- 提取最有价值的信息:端点签名(method + path + auth + status)、模型字段、业务规则
|
|
1229
|
+
|
|
1230
|
+
**`loadDslForSpec(specFilePath)`:**
|
|
1231
|
+
|
|
1232
|
+
从 spec 文件路径自动推断 DSL 路径(`.dsl.json` 后缀),加载并重新校验,失败返回 `null`(不抛出)。
|
|
1233
|
+
|
|
1234
|
+
---
|
|
1235
|
+
|
|
1236
|
+
### Pipeline 集成
|
|
1237
|
+
|
|
1238
|
+
**`cli/index.ts` 变更:**
|
|
1239
|
+
- 新增 `--skip-dsl` 选项
|
|
1240
|
+
- 新增 `[DSL]` 步骤(位于 Approval Gate 后、Worktree 前)
|
|
1241
|
+
- Step 5 保存 DSL 文件(`feature-<slug>-v<N>.dsl.json`)
|
|
1242
|
+
- `generateCode()` 传入 `dslFilePath`
|
|
1243
|
+
- Done 摘要新增 DSL 文件路径
|
|
1244
|
+
|
|
1245
|
+
**`core/code-generator.ts` 变更:**
|
|
1246
|
+
- `CodeGenOptions` 新增 `dslFilePath?: string`
|
|
1247
|
+
- `runApiMode()` 自动加载 DSL,调用 `buildDslContextSection()` 生成摘要
|
|
1248
|
+
- DSL section 注入:plan prompt(文件规划)和 task codegen prompt(文件生成)都会收到 DSL 上下文
|
|
1249
|
+
- 有 DSL 时打印 `✓ DSL loaded — N endpoints, M models`
|
|
1250
|
+
|
|
1251
|
+
**输出文件新增:**
|
|
1252
|
+
```
|
|
1253
|
+
specs/feature-<slug>-v1.dsl.json ← 与 spec 和 tasks 文件并排
|
|
1254
|
+
```
|
|
1255
|
+
|
|
1256
|
+
---
|
|
1257
|
+
|
|
1258
|
+
### 文档
|
|
1259
|
+
|
|
1260
|
+
- `README.md`:
|
|
1261
|
+
- 流水线概览图加入 DSL 步骤
|
|
1262
|
+
- 快速开始示例输出更新(含 DSL 步骤日志)
|
|
1263
|
+
- `create` 选项表新增 `--skip-dsl`
|
|
1264
|
+
- 新增 "Step DSL" 工作流章节(含结构说明、抗幻觉设计、示例 DSL JSON)
|
|
1265
|
+
- 项目结构更新(新增 3 个 DSL 文件)
|
|
1266
|
+
- `RELEASE_LOG.md`:本条目
|
|
1267
|
+
|
|
1268
|
+
---
|
|
1269
|
+
|
|
1270
|
+
> 记录每次迭代的功能变更、架构调整和修复。
|
|
1271
|
+
> 格式:`[版本] 日期 — 变更摘要`
|
|
1272
|
+
|
|
1273
|
+
---
|
|
1274
|
+
|
|
1275
|
+
## [0.4.0] 2026-03-23 — Phase 1: 工业化流水线基础设施
|
|
1276
|
+
|
|
1277
|
+
### 目标
|
|
1278
|
+
|
|
1279
|
+
为 ai-spec 补充"可工业化 AI 开发流水线"的三个基础模块:
|
|
1280
|
+
Spec 版本管理、人工审批门禁、增量构建续跑。
|
|
1281
|
+
|
|
1282
|
+
---
|
|
1283
|
+
|
|
1284
|
+
### #3 Spec Versioning & Diff
|
|
1285
|
+
|
|
1286
|
+
**新文件:** `core/spec-versioning.ts`
|
|
1287
|
+
|
|
1288
|
+
- `slugify(idea)` — 自然语言需求转安全文件名 slug
|
|
1289
|
+
- 示例:`"用户登录 with OAuth2"` → `"--with-oauth2"`(CJK 字符过滤后取 ascii 部分)
|
|
1290
|
+
- `findLatestVersion(specsDir, slug)` — 扫描 `specs/` 目录,返回最新版本的路径、版本号和内容
|
|
1291
|
+
- `nextVersionPath(specsDir, slug)` — 自动递增版本号,返回下一个文件路径
|
|
1292
|
+
- 输出:`feature-<slug>-v1.md`、`feature-<slug>-v2.md` …
|
|
1293
|
+
- `computeDiff(oldText, newText)` — 基于 LCS 算法的行级 diff,无外部依赖
|
|
1294
|
+
- 大文件(> 800 行)自动降级为 O(n) 简化 diff,避免内存溢出
|
|
1295
|
+
- `printDiff(diff)` — 彩色 unified-style diff 输出(`+` 绿 / `-` 红 / 上下文灰)
|
|
1296
|
+
- `printDiffSummary(diff, label)` — 单行摘要:`+12 -3 lines`
|
|
1297
|
+
|
|
1298
|
+
**变更:**
|
|
1299
|
+
|
|
1300
|
+
- `cli/index.ts`:Spec 文件名从 `feature-{timestamp}.md` 改为 `feature-{slug}-v{N}.md`
|
|
1301
|
+
- `core/spec-refiner.ts`:AI Polish 完成后自动展示变更 diff,让用户在打开编辑器前预览改动
|
|
1302
|
+
|
|
1303
|
+
---
|
|
1304
|
+
|
|
1305
|
+
### #7 Approval Gate(人工确认检查点)
|
|
1306
|
+
|
|
1307
|
+
**变更:** `cli/index.ts` 新增 `[3.5/6]` 步骤
|
|
1308
|
+
|
|
1309
|
+
在 Spec 润色完成(Step 3)与 Git Worktree 创建(Step 4)之间插入正式的人工审批门禁:
|
|
1310
|
+
|
|
1311
|
+
**展示信息:**
|
|
1312
|
+
- Spec 行数 / 词数
|
|
1313
|
+
- 已生成的 task 数量
|
|
1314
|
+
- 若存在历史版本,自动对比并展示彩色 diff(版本 v1 → v2 的变化)
|
|
1315
|
+
|
|
1316
|
+
**三选一操作:**
|
|
1317
|
+
- `✅ Proceed` — 确认,继续代码生成
|
|
1318
|
+
- `📋 View full spec` — 在终端完整展示 Spec 内容,再次询问是否继续
|
|
1319
|
+
- `❌ Abort` — 中止,Spec **不写入磁盘**
|
|
1320
|
+
|
|
1321
|
+
**跳过条件:** `--auto` 模式自动选 Proceed,跳过此步骤(适合 CI/全自动流水线)
|
|
1322
|
+
|
|
1323
|
+
---
|
|
1324
|
+
|
|
1325
|
+
### #9 Incremental Build + `--resume`
|
|
1326
|
+
|
|
1327
|
+
**变更:** `core/code-generator.ts`、`cli/index.ts`
|
|
1328
|
+
|
|
1329
|
+
#### CLI 新增选项
|
|
1330
|
+
|
|
1331
|
+
```
|
|
1332
|
+
--resume 续跑模式:跳过 tasks.json 中已标记为 done 的 task
|
|
1333
|
+
```
|
|
1334
|
+
|
|
1335
|
+
#### claude-code `--auto` 增量执行
|
|
1336
|
+
|
|
1337
|
+
之前:`--auto` 模式将所有 tasks 合并成一个 prompt 发送给 `claude -p`
|
|
1338
|
+
|
|
1339
|
+
现在:`--auto` + tasks 文件存在时,改为**逐 task 执行** `claude -p`:
|
|
1340
|
+
- 每个 task 单独一次 `claude -p` 调用,prompt 包含 task 详情 + spec 路径
|
|
1341
|
+
- 每次调用完成后将 task 状态写入 `tasks.json`(`"status": "done"` 或 `"failed"`)
|
|
1342
|
+
- 任一 task 失败不中断整体流程(标记 `failed`,跳过继续)
|
|
1343
|
+
- 支持 `--resume` 跳过已完成 task
|
|
1344
|
+
|
|
1345
|
+
#### api 模式 resume 增强
|
|
1346
|
+
|
|
1347
|
+
- `runApiModeWithTasks` 接收 `options.resume`,在日志中明确区分 "resume" 和普通 checkpoint 恢复
|
|
1348
|
+
- `--resume` 标志传递链:`cli opts.resume` → `generateCode(options)` → `runApiMode(options)` → `runApiModeWithTasks(options)`
|
|
1349
|
+
|
|
1350
|
+
#### 进度条(两种模式通用)
|
|
1351
|
+
|
|
1352
|
+
新增 `printTaskProgress(completed, total, task, mode)` 辅助函数:
|
|
1353
|
+
|
|
1354
|
+
```
|
|
1355
|
+
[████████░░░░░░░░░░░░] 40% → TASK-002 🔧 Implement FavoriteService
|
|
1356
|
+
[████████░░░░░░░░░░░░] 40% ✓ TASK-001 💾 Add schema — already done
|
|
1357
|
+
```
|
|
1358
|
+
|
|
1359
|
+
- 进度 = `已完成 task 数 / 总 task 数`
|
|
1360
|
+
- 每层对应图标:💾 data / ⚙️ infra / 🔧 service / 🌐 api / 🧪 test
|
|
1361
|
+
- `skip` 模式(已完成 task)使用灰色显示
|
|
1362
|
+
|
|
1363
|
+
---
|
|
1364
|
+
|
|
1365
|
+
### 文档
|
|
1366
|
+
|
|
1367
|
+
- `README.md`:
|
|
1368
|
+
- 更新流水线概览图
|
|
1369
|
+
- 新增 `[3.5/6] Approval Gate` 步骤说明和示例
|
|
1370
|
+
- 更新 Step 3 增加 AI diff 预览说明
|
|
1371
|
+
- 更新 Step 5 增加版本化命名、增量构建、进度条说明
|
|
1372
|
+
- `create` 选项表新增 `--resume`
|
|
1373
|
+
- codegen 模式表更新 claude-code 增量执行说明
|
|
1374
|
+
- 项目结构更新(新增 `spec-versioning.ts`、`RELEASE_LOG.md`)
|
|
1375
|
+
- `RELEASE_LOG.md`:本文件,新建
|
|
1376
|
+
|
|
1377
|
+
---
|
|
1378
|
+
|
|
1379
|
+
## [0.3.0] 2026-03-19 — 项目宪法 + 任务分解 + RTK 集成
|
|
1380
|
+
|
|
1381
|
+
### 新功能
|
|
1382
|
+
|
|
1383
|
+
#### `ai-spec init` 命令
|
|
1384
|
+
|
|
1385
|
+
新增独立的 `init` 命令,分析代码库并生成项目宪法(`.ai-spec-constitution.md`)。
|
|
1386
|
+
|
|
1387
|
+
宪法包含 8 个章节:架构规则、命名规范、API 规范、数据层规范、错误处理规范、禁区、测试规范、共享配置文件清单。
|
|
1388
|
+
|
|
1389
|
+
`ai-spec create` 会在 Step 1 自动检测宪法是否存在,不存在时自动运行 init。
|
|
1390
|
+
|
|
1391
|
+
#### Task 分解
|
|
1392
|
+
|
|
1393
|
+
Spec 生成后自动分解为结构化 `tasks.json`,包含:
|
|
1394
|
+
- `id`、`title`、`layer`(data / infra / service / api / test)
|
|
1395
|
+
- `filesToTouch`、`acceptanceCriteria`、`dependencies`、`priority`
|
|
1396
|
+
- `status`(运行时写入:pending / done / failed)
|
|
1397
|
+
|
|
1398
|
+
任务按层级顺序排列:`data → infra → service → api → test`
|
|
1399
|
+
|
|
1400
|
+
Spec + Tasks 通过单次 AI 调用完成(`core/combined-generator.ts`),节省 token。
|
|
1401
|
+
|
|
1402
|
+
`api` 模式代码生成检测到 tasks 文件时自动切换 task-by-task 模式,精度更高。
|
|
1403
|
+
|
|
1404
|
+
#### RTK 集成
|
|
1405
|
+
|
|
1406
|
+
检测 `rtk` binary 是否可用,若可用则在 `claude-code` 模式中自动使用 `rtk claude` 替代 `claude` 执行,减少 claude code 会话中的 token 消耗。
|
|
1407
|
+
|
|
1408
|
+
`--auto` 模式下以 `rtk claude -p` 非交互方式执行。
|
|
1409
|
+
|
|
1410
|
+
### 变更
|
|
1411
|
+
|
|
1412
|
+
- `core/context-loader.ts`:新增宪法文件加载、共享配置文件扫描
|
|
1413
|
+
- `core/task-generator.ts`:新建,包含 `SpecTask` 类型、`TaskGenerator`、`updateTaskStatus`
|
|
1414
|
+
- `core/combined-generator.ts`:新建,Spec + Tasks 合并 AI 调用
|
|
1415
|
+
- `core/constitution-generator.ts`:新建
|
|
1416
|
+
- `core/code-generator.ts`:新增 RTK 检测、task-by-task 模式、断点续传
|
|
1417
|
+
- `cli/index.ts`:新增 `init`、`--skip-tasks`、`--auto`、`--fast` 选项
|
|
1418
|
+
|
|
1419
|
+
---
|
|
1420
|
+
|
|
1421
|
+
## [0.2.0] 2026-03-?? — 多 Provider 支持 + 交互式 model 切换
|
|
1422
|
+
|
|
1423
|
+
### 新功能
|
|
1424
|
+
|
|
1425
|
+
- 支持 9 个 AI Provider:Gemini / Claude / OpenAI / DeepSeek / Qwen / GLM / MiniMax / Doubao / MiMo
|
|
1426
|
+
- `ai-spec model` 命令:交互式 provider + model 切换器
|
|
1427
|
+
- `ai-spec config` 命令:项目级默认配置管理(`.ai-spec.json`)
|
|
1428
|
+
- Provider 自动适配:Qwen3 注入 `enable_thinking: false`;OpenAI o1/o3 使用 `developer` role;MiMo 使用 Anthropic 兼容接口
|
|
1429
|
+
|
|
1430
|
+
### 变更
|
|
1431
|
+
|
|
1432
|
+
- `core/spec-generator.ts`:重构为 `AIProvider` 接口 + 各 provider 实现
|
|
1433
|
+
- `cli/index.ts`:新增 `model`、`config` 命令,`create` 新增 `--codegen-provider`、`--codegen-model` 选项
|
|
1434
|
+
|
|
1435
|
+
---
|
|
1436
|
+
|
|
1437
|
+
## [0.1.0] 2026-03-?? — 初始版本
|
|
1438
|
+
|
|
1439
|
+
### 功能
|
|
1440
|
+
|
|
1441
|
+
- `ai-spec create`:调用 Gemini 生成 Spec → 交互式润色 → Git Worktree → Claude Code 生成代码 → AI 代码审查
|
|
1442
|
+
- `ai-spec review`:独立代码审查命令
|
|
1443
|
+
- 支持 `claude-code` / `api` / `plan` 三种代码生成模式
|
|
1444
|
+
- 项目上下文自动扫描(package.json / Prisma schema / 路由文件)
|