ai-spec-dev 0.41.0 → 0.42.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/.ai-spec-workspace.json +17 -0
- package/.ai-spec.json +7 -0
- package/cli/pipeline/single-repo.ts +19 -10
- package/core/cli-ui.ts +136 -0
- package/core/code-generator.ts +4 -2
- package/core/error-feedback.ts +4 -2
- package/core/provider-utils.ts +8 -7
- package/demo-backend/.ai-spec-constitution.md +65 -0
- package/demo-backend/package.json +21 -0
- package/demo-backend/prisma/schema.prisma +22 -0
- package/demo-backend/specs/feature-1-bookmark-id-uuid-title-string-required-url-str-v1.dsl.json +186 -0
- package/demo-backend/specs/feature-1-bookmark-id-uuid-title-string-required-url-str-v1.md +211 -0
- package/demo-backend/src/controllers/bookmark.controller.test.ts +255 -0
- package/demo-backend/src/controllers/bookmark.controller.ts +187 -0
- package/demo-backend/src/index.ts +17 -0
- package/demo-backend/src/routes/bookmark.routes.test.ts +264 -0
- package/demo-backend/src/routes/bookmark.routes.ts +11 -0
- package/demo-backend/src/routes/index.ts +8 -0
- package/demo-backend/src/services/bookmark.service.test.ts +433 -0
- package/demo-backend/src/services/bookmark.service.ts +261 -0
- package/demo-backend/tsconfig.json +12 -0
- package/demo-frontend/.ai-spec-constitution.md +95 -0
- package/demo-frontend/package.json +23 -0
- package/demo-frontend/src/App.tsx +12 -0
- package/demo-frontend/src/main.tsx +9 -0
- package/demo-frontend/tsconfig.json +13 -0
- package/dist/cli/index.js +130 -21
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/index.mjs +130 -21
- package/dist/cli/index.mjs.map +1 -1
- package/dist/index.js +80 -8
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +80 -8
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
- package/RELEASE_LOG.md +0 -2962
- package/purpose.md +0 -1434
package/RELEASE_LOG.md
DELETED
|
@@ -1,2962 +0,0 @@
|
|
|
1
|
-
# Release Log
|
|
2
|
-
|
|
3
|
-
<details open>
|
|
4
|
-
<summary>中文</summary>
|
|
5
|
-
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
## v0.41.0 — 2026-04-02 — P2 修复(测试缺口补全 + 类型安全)
|
|
9
|
-
|
|
10
|
-
### 测试缺口补全
|
|
11
|
-
|
|
12
|
-
**#13 — error-feedback 修复逻辑测试(`tests/error-feedback-repair.test.ts` — NEW, 36 tests)**
|
|
13
|
-
|
|
14
|
-
新增 `parseErrors` / `parseRelativeImports` / `buildRepairOrder` / `detectBuildCommand` / `detectTestCommand` / `detectLintCommand` 6 个函数的独立测试。覆盖:TS/Go/Python 错误格式解析、noise 过滤(npm timing/node_modules/stack trace)、20 条上限截断、长消息 400 字符截断、相对导入提取(含 type import 跳过/多行 import)、依赖排序(含循环依赖/不可读文件)、7 语言构建/测试/lint 命令检测。
|
|
15
|
-
|
|
16
|
-
导出 `parseErrors` / `parseRelativeImports` / `buildRepairOrder` / `detectBuildCommand` / `detectTestCommand` / `detectLintCommand` / `ErrorEntry` 以支持测试。
|
|
17
|
-
|
|
18
|
-
**#15 — dsl-feedback JSON 解析路径测试(`tests/dsl-feedback.test.ts` — +3 tests)**
|
|
19
|
-
|
|
20
|
-
新增 3 个 `extractStructuralFindings` 测试:结构化 JSON block 解析、无效条目过滤、JSON 格式错误时 regex fallback。总计 26→29 tests。
|
|
21
|
-
|
|
22
|
-
### 类型安全
|
|
23
|
-
|
|
24
|
-
**#19 — `SingleRepoPipelineOpts` 类型定义**
|
|
25
|
-
|
|
26
|
-
- `cli/pipeline/single-repo.ts`: 新增 `SingleRepoPipelineOpts` 接口(22 个字段),替换 `Record<string, any>`
|
|
27
|
-
- IDE 补全、重构安全、拼写错误编译期检测
|
|
28
|
-
|
|
29
|
-
### 测试统计
|
|
30
|
-
|
|
31
|
-
**42 → 43 个测试文件,741 → 780 test cases(+39)**
|
|
32
|
-
|
|
33
|
-
---
|
|
34
|
-
|
|
35
|
-
## v0.40.0 — 2026-04-02 — P0+P1 关键修复(8 项安全/健壮性改进)
|
|
36
|
-
|
|
37
|
-
### Critical(P0)
|
|
38
|
-
|
|
39
|
-
**C1 — 消除 `process.chdir()` 竞态条件**
|
|
40
|
-
|
|
41
|
-
- `cli/pipeline/single-repo.ts`: `CodeReviewer` 构造参数从 `currentDir` 改为 `workingDir`,移除 `process.chdir(workingDir)` / `process.chdir(originalDir)` 块
|
|
42
|
-
- `cli/pipeline/multi-repo.ts`: 同上,`new CodeReviewer(specProvider)` → `new CodeReviewer(specProvider, workingDir)`
|
|
43
|
-
- reviewer.ts 的 `getGitDiff()` 已正确使用 `cwd: this.projectRoot`,无需 chdir
|
|
44
|
-
|
|
45
|
-
**C2 — `Promise.all` → `Promise.allSettled`(layer 批次执行)**
|
|
46
|
-
|
|
47
|
-
- `core/code-generator.ts`: 批次任务执行从 `Promise.all + .catch()` 改为 `Promise.allSettled`,rejected 结果逐个处理并输出失败任务 ID + 原因,不中断同批次其他任务
|
|
48
|
-
|
|
49
|
-
**C3 — 统一 JSON 解析工具(`core/safe-json.ts` — NEW)**
|
|
50
|
-
|
|
51
|
-
- 新增 `safeParseJson<T>()`(返回 null)和 `parseJsonFromAiOutput<T>()`(抛异常)
|
|
52
|
-
- 支持 3 种解析策略:裸 JSON / fenced JSON / 嵌入文本提取,每种策略内 try/catch 保护
|
|
53
|
-
- 替换 `dsl-extractor.ts`、`requirement-decomposer.ts`、`spec-updater.ts` 中重复的 `parseJsonFromOutput()` 函数
|
|
54
|
-
|
|
55
|
-
### High(P1)
|
|
56
|
-
|
|
57
|
-
**H2 — VCR 回放 prompt hash 校验**
|
|
58
|
-
|
|
59
|
-
- `core/vcr.ts` `VcrReplayProvider`: 回放时计算当前 prompt 的 SHA-256[:8] 与录制条目的 `callHash` 比对
|
|
60
|
-
- 新增 `mismatches` / `hasMismatches` 属性追踪不匹配条目
|
|
61
|
-
- `cli/pipeline/single-repo.ts`: pipeline 结束时输出 mismatch 警告(不阻断回放)
|
|
62
|
-
|
|
63
|
-
**H3 — DSL 验证器交叉引用检查**
|
|
64
|
-
|
|
65
|
-
- `core/dsl-validator.ts` 新增 `crossReferenceChecks()`:
|
|
66
|
-
- 重复 path+method 检测
|
|
67
|
-
- model relations 引用不存在的 model 名称
|
|
68
|
-
- component apiCalls 引用不存在的 endpoint ID
|
|
69
|
-
|
|
70
|
-
**H4 — execSync 全局超时**
|
|
71
|
-
|
|
72
|
-
- `core/reviewer.ts`: git 命令 `timeout: 30_000`
|
|
73
|
-
- `core/code-generator.ts`: `claude --version` 检查 `timeout: 10_000`
|
|
74
|
-
- `core/codegen/helpers.ts`: `rtk --version` 检查 `timeout: 10_000`
|
|
75
|
-
- `cli/commands/dashboard.ts`: 浏览器打开 `timeout: 10_000`
|
|
76
|
-
|
|
77
|
-
### Medium(P1)
|
|
78
|
-
|
|
79
|
-
**M1 — 前端框架检测扩展**
|
|
80
|
-
|
|
81
|
-
- `core/frontend-context-loader.ts`: `FrontendFramework` 类型新增 `svelte` | `sveltekit` | `solid` | `qwik` | `remix` | `astro`
|
|
82
|
-
- 检测逻辑:`@sveltejs/kit` → sveltekit, `svelte` → svelte, `@builder.io/qwik` → qwik, `@remix-run/react` → remix, `astro` → astro, `solid-js` → solid
|
|
83
|
-
- 新增路由识别:sveltekit/remix/astro 使用 file-based routing, `@solidjs/router`, `@builder.io/qwik-city`
|
|
84
|
-
|
|
85
|
-
**M6 — Error Feedback 断路器增强**
|
|
86
|
-
|
|
87
|
-
- `core/error-feedback.ts`: 区分"错误数量不变"(黄色 ⚠ 无进展)和"错误数量增加"(红色 ✘ 引入回归),后者输出更强烈的回归警告
|
|
88
|
-
|
|
89
|
-
### 新增测试
|
|
90
|
-
|
|
91
|
-
| # | 文件 | 测试数 | 覆盖内容 |
|
|
92
|
-
|---|------|--------|----------|
|
|
93
|
-
| 31 | `safe-json.test.ts` | 13 | `safeParseJson`(裸 JSON/数组/fenced/嵌入文本/无效/空白/泛型)+ `parseJsonFromAiOutput`(有效/无效/空) |
|
|
94
|
-
| 32 | `dsl-validator-xref.test.ts` | 6 | 重复路由检测 / 不同 method 允许 / relation 引用不存在 model / relation 正常 / apiCalls 引用不存在 endpoint / apiCalls 正常 |
|
|
95
|
-
| 33 | `vcr-hash.test.ts` | 7 | prompt 匹配/不匹配/system 变更/多次调用追踪/mismatch 仍返回响应/exhausted/recording |
|
|
96
|
-
|
|
97
|
-
**测试覆盖率提升:39 → 42 个测试文件,715 → 741 test cases**
|
|
98
|
-
|
|
99
|
-
---
|
|
100
|
-
|
|
101
|
-
## v0.39.0 — 2026-04-02 — Pipeline 质量增强(Phase 1+2:4 个结构性缺口修补)
|
|
102
|
-
|
|
103
|
-
### 新增功能
|
|
104
|
-
|
|
105
|
-
**Gap 3 — 测试存在性校验(`core/error-feedback.ts`)**
|
|
106
|
-
|
|
107
|
-
Error Feedback 循环前新增 `validateTestFilesExist()` 预检:检查生成的测试文件是否存在于磁盘且包含实际测试 pattern(`describe(`/`it(`/`test(`/`func Test`/`def test_`/`@Test`/`#[test]`)。无有效测试文件时输出 "tests not validated" 警告,防止 `npm test` exit 0 的假阴性。
|
|
108
|
-
|
|
109
|
-
**Gap 4 — §9 自动压缩(`core/knowledge-memory.ts`)**
|
|
110
|
-
|
|
111
|
-
新增 `maybeAutoConsolidate()`:Review 知识积累完成后,自动检查 §9 教训条数,超阈值(默认 12,`.ai-spec.json` `autoConsolidateThreshold` 可配)自动调用 `ConstitutionConsolidator` 压缩。非阻塞、有备份、失败不影响 pipeline。
|
|
112
|
-
|
|
113
|
-
**Gap 1 — Spec↔DSL 覆盖率检查(`core/dsl-coverage-checker.ts` — NEW)**
|
|
114
|
-
|
|
115
|
-
新模块:从 Spec markdown 提取 User Story(中英文 `作为`/`As a`)、功能需求(checklist `- [ ]` 和编号条目)、边界条件,通过关键词匹配(CJK 字符/双字词 + 英文词,过滤停用词)校验每条需求是否在 DSL endpoint/model/behavior 中有对应。覆盖率 <80% 时注入 `uncovered_requirement` 类型的 `DslGap`,走已有 gap feedback 流程。
|
|
116
|
-
|
|
117
|
-
**Gap 2 — Token 预算管理(`core/token-budget.ts` — NEW)**
|
|
118
|
-
|
|
119
|
-
新模块:`estimateTokens()` 轻量估算(CJK ~1 token/字,英文 ~4 chars/token);`assembleSections()` 按优先级裁剪;`getDefaultBudget()` 按 provider 返回默认预算(Gemini 900K / Claude 180K / OpenAI 120K / default 100K)。集成到 `code-generator.ts`(上下文组装时检测并裁剪 §9)和 `dsl-extractor.ts`(替换硬编码 `MAX_SPEC_CHARS=12000`,按 provider 动态计算上限)。
|
|
120
|
-
|
|
121
|
-
### 新增测试
|
|
122
|
-
|
|
123
|
-
**Test 27 — `dsl-coverage-checker.test.ts`(18 tests)** — `extractKeywords`(英文/CJK/混合/停用词过滤/空输入)、`extractSpecRequirements`(中文 User Story/英文 User Story/checklist 功能需求/编号子条目/边界条件/无需求返回空)、`checkDslCoverage`(空需求/endpoint 匹配/未覆盖检测/model 字段匹配/behavior 匹配/低覆盖率)
|
|
124
|
-
|
|
125
|
-
**Test 28 — `token-budget.test.ts`(13 tests)** — `estimateTokens`(空字符串/英文/CJK/混合/代码)、`assembleSections`(全部包含/优先级排序/超预算裁剪/完全丢弃/空 section 跳过/空输入)、`getDefaultBudget`(已知 provider/未知 provider)
|
|
126
|
-
|
|
127
|
-
**Test 29 — `error-feedback-validation.test.ts`(10 tests)** — `validateTestFilesExist`(空列表/不存在文件/无 test pattern/describe/test/Go func Test/Python def test_/多文件混合/Java @Test/Rust #[test])
|
|
128
|
-
|
|
129
|
-
**Test 30 — `auto-consolidation.test.ts`(6 tests)** — `maybeAutoConsolidate`(无 constitution/低于阈值/触发压缩/失败容错/自定义阈值/默认阈值 12)
|
|
130
|
-
|
|
131
|
-
**测试覆盖率提升:85.0% → 87.2%(35 → 39 个测试文件,668 → 715 test cases)**
|
|
132
|
-
|
|
133
|
-
---
|
|
134
|
-
|
|
135
|
-
## v0.38.0 — 2026-04-02 — Bug 修复 + 测试清理 + P0 测试覆盖 + 模块拆分
|
|
136
|
-
|
|
137
|
-
### Bug 修复
|
|
138
|
-
|
|
139
|
-
**Fix 1 — `CodeReviewer.getGitDiff()` 未使用 `projectRoot` 作为 cwd(`core/reviewer.ts`)**
|
|
140
|
-
|
|
141
|
-
`getGitDiff()` 中所有 `execSync("git ...")` 调用未传 `cwd: this.projectRoot`,导致 Review 始终在进程工作目录而非指定项目根目录执行 diff。当 `CodeReviewer` 实例化时传入的 `projectRoot` 与 `process.cwd()` 不同(如 workspace 模式或测试环境),会拿到错误项目的 diff 甚至误报 "No changes"。
|
|
142
|
-
|
|
143
|
-
- 为 `getGitDiff()` 内 `silent` 对象统一添加 `cwd: this.projectRoot`
|
|
144
|
-
- 修复对应测试:改为在隔离的 `git init` 目录中运行,不再依赖宿主环境
|
|
145
|
-
|
|
146
|
-
### 测试清理
|
|
147
|
-
|
|
148
|
-
**`tests 2/` 目录删除**
|
|
149
|
-
|
|
150
|
-
发现 `tests 2/` 目录下 9 个测试文件与 `tests/` 完全重复(`tests/` 为超集,dsl-validator 38 > 30),属于历史遗留。删除后消除 186 个重复执行的测试,CI 运行时间减少约 40%。
|
|
151
|
-
|
|
152
|
-
### 新增测试(P0 模块覆盖)
|
|
153
|
-
|
|
154
|
-
**Test 10 — `frontend-context-loader.test.ts`(64 tests)**
|
|
155
|
-
|
|
156
|
-
覆盖 `parseImportStatements`(默认 import / named import / 多行 named import / import type 跳过 / 块注释内跳过 / 空输入 / 多条 import / 原始行保留)、`findHttpClientImport`(axios / @/ 别名 / ~/ 别名 / #/ 别名 / ky / undici / alova / 相对路径 request / 无 HTTP import / import type 跳过 / 多行匹配 / 首匹配优先)、`loadFrontendContext` 集成测试(无 package.json 默认值 / React/Vue/Next/React Native 框架检测 / zustand+jotai+pinia 状态管理 / axios+swr HTTP 客户端 / antd+element-plus UI 库 / react-router+vue-router+next-app-router+next-pages-router 路由 / RTL+vitest+cypress 测试框架 / src/api+src/services API 文件发现 / test 文件排除 / httpClientImport 提取含多行 / store 文件发现 / hook 文件发现 / 可复用组件发现 / page 示例读取 / pagination 提取含 interface+函数+箭头函数+嵌套对象+type.ts 跳过 / layout 静态 import+动态 import / 损坏 package.json 容错 / 空 dependencies 容错)、`buildFrontendContextSection`(基本信息 / layout import COPY THIS EXACTLY / httpClientImport / pagination / store CRITICAL 警告 / reusable components / 边界标记 / 空 state management)。
|
|
157
|
-
|
|
158
|
-
为支持直接单元测试,`parseImportStatements` 和 `findHttpClientImport` 从 private 改为 `export`。
|
|
159
|
-
|
|
160
|
-
**Test 11 — `run-logger.test.ts`(22 tests)**
|
|
161
|
-
|
|
162
|
-
覆盖 `generateRunId`(非空 / 格式校验 / 唯一性)、`RunLogger` 类(构造时创建目录和文件 / provider+model 元数据存储 / stageStart+stageEnd 含 duration / stageFail 含 error 记录 / setPromptHash / setHarnessScore / fileWritten 去重 / finish 设置 endedAt+totalDurationMs / printSummary 不抛错 / JSONL header 写入 / JSONL 各类型行完整性)、`reconstructRunLogFromJsonl`(完整重建 / 不存在文件返回 null / 缺 header 返回 null / 损坏行跳过 / 崩溃恢复无 footer / 空文件)、singleton 访问器(get/set 往返)。
|
|
163
|
-
|
|
164
|
-
**Test 12 — `knowledge-memory.test.ts`(25 tests)**
|
|
165
|
-
|
|
166
|
-
覆盖 `extractIssuesFromReview`(标准格式提取 / security+performance+bug+pattern+general 分类 / 无 issues 段返回空 / 短条目跳过 / 上限 10 条 / markdown bold 剥离 / 数字列表 / 长描述截断 200)、`appendLessonsToConstitution`(创建 §9 段 / 追加到已有 §9 / 去重 / 无宪法文件跳过 / 空数组不操作 / 各 category badge 对应 🔒⚡🐛📐📝 / 日期戳格式)、`appendDirectLesson`(正常追加 / 无宪法返回失败 / 去重 60 字符 / 创建 §9)、`accumulateReviewKnowledge` 集成(提取+追加 / 无 issues 不操作)。
|
|
167
|
-
|
|
168
|
-
**Test 13 — `prompt-hasher.test.ts`(3 tests)** — 哈希格式、确定性、长度校验
|
|
169
|
-
|
|
170
|
-
**Test 14 — `run-snapshot.test.ts`(9 tests)** — snapshotFile(备份创建/不存在文件跳过/去重/相对路径)、restore(全量恢复/无备份返回空)、singleton 访问器
|
|
171
|
-
|
|
172
|
-
**Test 15 — `global-constitution.test.ts`(10 tests)** — mergeConstitutions(全局标记/项目高优先级标记/空内容跳过/trim)、loadGlobalConstitution(不存在返回 null/extraRoots 优先/首目录优先)、saveGlobalConstitution
|
|
173
|
-
|
|
174
|
-
**Test 16 — `contract-bridge.test.ts`(19 tests)** — buildFrontendApiContract(端点数量/method+path/auth/errorCodes/请求类型接口/响应类型接口/model 字段匹配/204 No Content/类型定义块/summary 含 feature/auth 标签/空 errors/无 models/TS 类型推断/token 响应)、buildContractContextSection(边界标记/summary/TypeScript 定义/不可修改指令)
|
|
175
|
-
|
|
176
|
-
**Test 17 — `workspace-loader.test.ts`(30 tests)** — detectRepoType(Go/Rust/Java pom+gradle/Python requirements+pyproject/PHP/React Native/Next.js/React/Vue/Koa/Express/NestJS/Prisma/空 package.json/无 manifest/损坏 JSON)、WorkspaceLoader(load null/invalid JSON/missing fields/empty repos/正常加载/constitution 加载/resolveAbsPath/save 去除 constitution/autoDetect 含 dotfile+node_modules 跳过+名称过滤/getProcessingOrder 角色排序)
|
|
177
|
-
|
|
178
|
-
**Test 18 — `project-index.test.ts`(13 tests)** — loadIndex/saveIndex 往返、runScan(Node.js 项目发现/Go 项目/跳过目录/hasConstitution+hasWorkspace 标志/增量 added+nowMissing+updated/maxDepth 限制/路径排序/techStack 提取)
|
|
179
|
-
|
|
180
|
-
**Test 19 — `combined-generator.test.ts`(6 tests)** — generateSpecWithTasks(spec+tasks 解析/无分隔符/无效 JSON/architecture decision 注入/context 注入/trim)
|
|
181
|
-
|
|
182
|
-
**Test 20 — `requirement-decomposer.test.ts`(12 tests)** — sortByDependency(无依赖优先/多层级/循环依赖安全/独立保序/空数组)、decompose(有效响应解析/fenced JSON/无效 JSON 抛错/缺 summary/空 repos/AI 失败/字段默认值)
|
|
183
|
-
|
|
184
|
-
**Test 21 — `constitution-generator.test.ts`(7 tests)** — generate 调用 provider/saveConstitution 文件写入/loadConstitution 存在+不存在/printConstitutionHint 存在+不存在
|
|
185
|
-
|
|
186
|
-
**Test 22 — `test-generator.test.ts`(9 tests)** — generate(写入测试文件/无效 JSON/AI 失败/前端模式检测/已有测试目录/fenced JSON)、generateTdd(写入 TDD 文件/AI 失败/无效 JSON)
|
|
187
|
-
|
|
188
|
-
**Test 23 — `key-store.test.ts`(4 tests)** — getSavedKey 未知 provider/saveKey+getSavedKey 往返/clearKey/clearAllKeys
|
|
189
|
-
|
|
190
|
-
**Test 24 — `spec-updater.test.ts`(9 tests)** — findLatestSpec(不存在目录/无匹配/最新版本/slug 提取/多 feature)、update(新版本生成+保存/DSL 失败返回 null/spec 失败抛错/markdown fence 剥离)
|
|
191
|
-
|
|
192
|
-
**Test 25 — `design-dialogue.test.ts`(7 tests)** — 选择选项/跳过返回 null/blend 模式/blend 失败/AI 失败/选项全文提取/400 字符截断
|
|
193
|
-
|
|
194
|
-
**Test 26 — `constitution-consolidator.test.ts`(10 tests)** — checkConsolidationNeeded(阈值警告/低于阈值/自定义阈值)、consolidate(无文件抛错/低于阈值跳过/正常合并/dry-run 不写入/备份创建/fence 剥离/AI 失败抛错)
|
|
195
|
-
|
|
196
|
-
**测试覆盖率提升:45% → 85.0%(18 → 35 个模块有测试,409 → 668 test cases)**
|
|
197
|
-
|
|
198
|
-
### 依赖安全
|
|
199
|
-
|
|
200
|
-
- 移除未使用的 `inquirer@8` 依赖(项目已使用 `@inquirer/prompts`),消除 lodash 传递依赖及 1 个 moderate 漏洞
|
|
201
|
-
|
|
202
|
-
### 残留清理
|
|
203
|
-
|
|
204
|
-
- 删除 `dist 2/`、`docs-assets 2/`、`cli/utils 2.ts` 残留文件/目录
|
|
205
|
-
|
|
206
|
-
### 重构 — `create.ts` 拆分(1248 行 → 4 文件)
|
|
207
|
-
|
|
208
|
-
将 1248 行的单体 `cli/commands/create.ts` 拆分为模块化 pipeline 目录:
|
|
209
|
-
|
|
210
|
-
| 文件 | 职责 | 行数 |
|
|
211
|
-
|------|------|------|
|
|
212
|
-
| `cli/commands/create.ts` | CLI 注册 + 参数解析 + 分发 | ~85 |
|
|
213
|
-
| `cli/pipeline/helpers.ts` | 共享类型 (`MultiRepoResult`) + `printBanner()` | ~35 |
|
|
214
|
-
| `cli/pipeline/multi-repo.ts` | 多仓库编排 + 单仓库 workspace 子流水线 + auto-serve | ~490 |
|
|
215
|
-
| `cli/pipeline/single-repo.ts` | 完整 12 阶段单仓库流水线(context→design→spec→DSL→codegen→review→eval) | ~480 |
|
|
216
|
-
|
|
217
|
-
零行为变更,build + 520 tests 全部通过。
|
|
218
|
-
|
|
219
|
-
### 重构 — `code-generator.ts` 拆分(991 行 → 676 行 + 2 模块)
|
|
220
|
-
|
|
221
|
-
| 文件 | 职责 | 行数 |
|
|
222
|
-
|------|------|------|
|
|
223
|
-
| `core/code-generator.ts` | CodeGenerator 类 + 类型导出 | 676 |
|
|
224
|
-
| `core/codegen/helpers.ts` | `extractBehavioralContract`、`buildGeneratedFilesSection`、`stripCodeFences`、`parseJsonArray`、`isRtkAvailable`、`FileAction` 类型 | ~200 |
|
|
225
|
-
| `core/codegen/topo-sort.ts` | `topoSortLayerTasks`、`printTaskProgress`、`LAYER_ICONS` | ~95 |
|
|
226
|
-
|
|
227
|
-
### 重构 — `mock-server-generator.ts` 拆分(782 行 → 333 行 + 2 模块)
|
|
228
|
-
|
|
229
|
-
| 文件 | 职责 | 行数 |
|
|
230
|
-
|------|------|------|
|
|
231
|
-
| `core/mock-server-generator.ts` | Express/MSW 生成 + `generateMockAssets` + `findLatestDslFile` | 333 |
|
|
232
|
-
| `core/mock/fixtures.ts` | `typeToFixture`、`buildFixtureObject`、`buildEndpointFixture` | ~89 |
|
|
233
|
-
| `core/mock/proxy.ts` | 代理配置生成(Vite/Next/CRA/Webpack)+ `applyMockProxy`/`restoreMockProxy`/`startMockServerBackground`/`saveMockServerPid` | ~380 |
|
|
234
|
-
|
|
235
|
-
两次拆分均通过 re-export 保持向后兼容,build + 668 tests 全部通过。
|
|
236
|
-
|
|
237
|
-
---
|
|
238
|
-
|
|
239
|
-
## v0.37.0 — 2026-04-02 — P1 测试覆盖:Mock Server / Types Generator / VCR
|
|
240
|
-
|
|
241
|
-
### 新增测试(Phase 1 收尾)
|
|
242
|
-
|
|
243
|
-
**Test 7 — `mock-server-generator.test.ts`(28 tests)**
|
|
244
|
-
|
|
245
|
-
覆盖 `generateMockAssets`(Express server.js 生成、README.md 端点表格、auth 中间件条件生成、DELETE 204 sendStatus、错误模拟注释、自定义端口、自定义输出目录、列表端点分页 fixture、MSW handlers/browser 生成、proxy 配置生成)、前端框架检测(Vite/Next.js/CRA/Webpack)、fixture 启发式(email/boolean/DateTime 字段类型)、`findLatestDslFile`(不存在目录、无匹配文件、最新文件选择、嵌套目录扫描)、`applyMockProxy`/`restoreMockProxy`(Vite 配置写入+dev:mock 脚本注入+还原、CRA proxy 字段注入+还原、Next.js 手动提示、无 lock 文件容错)。
|
|
246
|
-
|
|
247
|
-
**Test 8 — `types-generator.test.ts`(28 tests)**
|
|
248
|
-
|
|
249
|
-
覆盖类型映射(String→string、Int/Float→number、Boolean→boolean、DateTime→string、Json→Record、数组类型、PascalCase 模型引用保留、未知类型回退 string、nullable 标记剥离)、模型接口渲染(export interface、必填/可选字段、模型描述 JSDoc、字段描述 JSDoc)、端点类型(请求体接口、查询参数可选接口、路径参数接口、includeEndpointTypes 开关、无 schema 端点跳过)、端点常量表(API_ENDPOINTS const、method/path/auth 字段、ApiEndpointKey 类型、includeEndpointMap 开关)、自定义 header、前端组件 Props 接口、`saveTypescriptTypes`(默认路径写入、自定义路径写入)。
|
|
250
|
-
|
|
251
|
-
**Test 9 — `vcr.test.ts`(22 tests)**
|
|
252
|
-
|
|
253
|
-
覆盖 `VcrRecordingProvider`(透传 generate 调用、元数据记录含 callHash/promptPreview/duration/provider/model、providerName/modelName 代理、无 systemInstruction 时省略字段、promptPreview 截断 200 字符、保存至 .ai-spec-vcr 目录、双 recorder 合并按时间排序+重建索引、多 provider 记录)、`VcrReplayProvider`(按序回放、providerName=vcr-replay、modelName=runId、remaining/consumed 计数、exhausted 抛错、忽略 prompt 内容纯按索引回放)、`loadVcrRecording`(正常加载、不存在返回 null、损坏 JSON 返回 null)、`listVcrRecordings`(不存在目录返回空、逆序排列、跳过损坏文件、忽略非 JSON 文件、summary 字段正确性)。
|
|
254
|
-
|
|
255
|
-
**测试覆盖率提升:37.5% → 45%(15 → 18 个模块有测试,331 → 409 test cases)**
|
|
256
|
-
|
|
257
|
-
---
|
|
258
|
-
|
|
259
|
-
## v0.36.1 — 2026-04-02 — P0 测试覆盖 + 质量硬门禁 + 错误体验优化
|
|
260
|
-
|
|
261
|
-
### 新增测试(Week 2)
|
|
262
|
-
|
|
263
|
-
**Test 4 — `context-loader.test.ts`(19 tests)**
|
|
264
|
-
|
|
265
|
-
覆盖 `isFrontendDeps`(React/Vue/Next/Nuxt/Svelte/纯后端/空数组)、`ContextLoader` 类(Node.js/PHP/Java 三种项目类型的上下文加载、Prisma schema 读取、宪法加载、API 结构扫描、共享配置文件发现、错误模式提取、空目录容错)。
|
|
266
|
-
|
|
267
|
-
**Test 5 — `openapi-exporter.test.ts`(27 tests)**
|
|
268
|
-
|
|
269
|
-
覆盖 `dslToOpenApi`(结构完整性、info 元数据、自定义 server URL、路径参数标准化 `:id`→`{id}`、请求体生成、错误响应、认证端点 401 自动注入、安全方案生成、模型 schema 映射、必填字段标记、204 无内容响应、无认证场景)、类型映射(String/Int/Float/Boolean/DateTime/email/password/$ref)、`exportOpenApi`(YAML/JSON 格式、自定义输出路径、自定义 server URL)。
|
|
270
|
-
|
|
271
|
-
**Test 6 — `spec-versioning.test.ts`(26 tests)**
|
|
272
|
-
|
|
273
|
-
覆盖 `slugify`(英文转换、特殊字符、CJK 处理、长度限制、空输入回退、连字符折叠)、`computeDiff`(相同/新增/删除/修改/空文本/大文件回退/行类型正确性)、`findLatestVersion`(不存在目录、无匹配文件、单版本、多版本最新、不同 slug 隔离、正则特殊字符)、`nextVersionPath`(无版本/有 v1/跳跃版本号)。
|
|
274
|
-
|
|
275
|
-
**测试覆盖率提升:30% → 37.5%(12 → 15 个模块有测试,259 → 331 test cases)**
|
|
276
|
-
|
|
277
|
-
### 质量硬门禁(Week 3)
|
|
278
|
-
|
|
279
|
-
**Feature 1 — Harness Score 阻断门禁(`cli/commands/create.ts`、`cli/utils.ts`)**
|
|
280
|
-
|
|
281
|
-
- 新增 `minHarnessScore` 配置项(`.ai-spec.json`,默认 0 = 禁用)
|
|
282
|
-
- 自评阶段(Step 10)后,当 `harnessScore < minHarnessScore` 且未使用 `--force` 时,打印阈值提示并 `exit(1)`
|
|
283
|
-
- 与 `minSpecScore` 同样支持 `--force` 绕过
|
|
284
|
-
|
|
285
|
-
**Feature 2 — Error Feedback 轮次可配置(`cli/commands/create.ts`、`cli/utils.ts`)**
|
|
286
|
-
|
|
287
|
-
- 新增 `maxErrorCycles` 配置项(默认 2,TDD 模式默认 3,范围 1-10)
|
|
288
|
-
- 替换原来硬编码的 `maxCycles: opts.tdd ? 3 : 2`,读取 `config.maxErrorCycles`
|
|
289
|
-
|
|
290
|
-
**Feature 3 — Config 命令增强(`cli/commands/config.ts`)**
|
|
291
|
-
|
|
292
|
-
- 新增 `--min-harness-score <score>` 和 `--max-error-cycles <n>` CLI 选项
|
|
293
|
-
- 含输入范围校验(0-10 / 1-10)
|
|
294
|
-
|
|
295
|
-
### 错误体验优化(Week 4)
|
|
296
|
-
|
|
297
|
-
**Enhancement 1 — Provider 错误消息增强(`core/provider-utils.ts`)**
|
|
298
|
-
|
|
299
|
-
- **Auth 错误(401/403)**:提示检查 API key 有效性 + 运行 `ai-spec model` 重新配置
|
|
300
|
-
- **Rate Limit(429)**:提示等待或切换 provider + 检查计费面板
|
|
301
|
-
- **网络错误**:提示检查连接和代理设置
|
|
302
|
-
- **模型不存在**:提示运行 `ai-spec model` 查看可用模型
|
|
303
|
-
- **余额/配额不足**:提示检查计费面板 + 切换 provider
|
|
304
|
-
|
|
305
|
-
**Enhancement 2 — DSL 提取失败诊断增强(`core/dsl-extractor.ts`)**
|
|
306
|
-
|
|
307
|
-
- JSON 解析失败时,输出 AI 原始响应前 500 字符的预览,方便判断是 prompt 问题还是 model 能力问题
|
|
308
|
-
- Spec 超过 12K 字符截断时,**立即**打印黄色警告(而非静默截断),提醒用户详情可能丢失
|
|
309
|
-
|
|
310
|
-
**Enhancement 3 — Key Store 读取容错(`core/key-store.ts`)**
|
|
311
|
-
|
|
312
|
-
- 读取损坏的 key store 文件时,输出具体错误消息(而非静默忽略)
|
|
313
|
-
|
|
314
|
-
---
|
|
315
|
-
|
|
316
|
-
## v0.36.0 — 2026-04-01 — 安全修复 + 核心模块测试覆盖
|
|
317
|
-
|
|
318
|
-
### 安全修复
|
|
319
|
-
|
|
320
|
-
**Fix 1 — Shell 命令注入防护(`core/code-generator.ts`)**
|
|
321
|
-
|
|
322
|
-
`execSync` 拼接 shell 字符串传递 prompt 内容时,仅转义了 `"` 字符,未处理 `$`、`;`、`|`、`&` 等 shell 元字符,存在命令注入风险。
|
|
323
|
-
|
|
324
|
-
- 将 `execSync(\`\${claudeCmd} -p "..."\`)` 替换为 `spawnSync(claudeCmd, ["-p", promptContent], { shell: false })`(共 2 处)
|
|
325
|
-
- `spawnSync` 数组形式绕过 shell 解析,彻底消除注入可能
|
|
326
|
-
- 新增 `spawnSync` 导入(`child_process`)
|
|
327
|
-
|
|
328
|
-
**Fix 2 — API Key 存储权限时序(`core/key-store.ts`)**
|
|
329
|
-
|
|
330
|
-
原来先 `writeJson()` 再 `chmod(0o600)`,在写入与权限设置之间存在短暂窗口期,其他进程可能读取到明文 key。
|
|
331
|
-
|
|
332
|
-
- 改为 `ensureFile()` → `chmod(0o600)` → `writeJson()` 顺序,确保文件权限在写入敏感数据前就已设置
|
|
333
|
-
|
|
334
|
-
### 新增测试
|
|
335
|
-
|
|
336
|
-
**Test 1 — `spec-generator.test.ts`(23 tests)**
|
|
337
|
-
|
|
338
|
-
覆盖 `PROVIDER_CATALOG` 结构完整性、`createProvider` 工厂函数(9 个 provider 分支 + 自定义 model + 未知 provider 异常)、`SpecGenerator` prompt 构建逻辑(architecture decision 注入、constitution 优先级、context 截断限制)。
|
|
339
|
-
|
|
340
|
-
**Test 2 — `reviewer.test.ts`(19 tests)**
|
|
341
|
-
|
|
342
|
-
覆盖 `extractComplianceScore`(整数/小数/大小写/空字符串/多行/多匹配)、`extractMissingCount`(正常/大小写/缺失/多行)、`CodeReviewer` 类(空 diff 处理、多 Pass 调用验证、缺失文件容错、大文件截断、历史趋势渲染)。
|
|
343
|
-
|
|
344
|
-
**Test 3 — `code-generator.test.ts`(23 tests)**
|
|
345
|
-
|
|
346
|
-
覆盖 `extractBehavioralContract`(interface/enum/type/function/const/class/abstract class/defineStore/return 块/export default/嵌套大括号/throw 捕获上限/无 export 回退)、`printTaskProgress`(百分比计算/run 模式/skip 模式/0 total/未知 layer)。
|
|
347
|
-
|
|
348
|
-
**测试覆盖率提升:22.5% → 30%(9 → 12 个模块有测试,251 → 259 test cases)**
|
|
349
|
-
|
|
350
|
-
- `extractBehavioralContract` 从 private 改为 `export`(`core/code-generator.ts`),支持直接单元测试
|
|
351
|
-
|
|
352
|
-
### DSL 验证增强
|
|
353
|
-
|
|
354
|
-
**Fix 3 — Endpoint ID 唯一性检查(`core/dsl-validator.ts`)**
|
|
355
|
-
|
|
356
|
-
AI 经常生成重复的 Endpoint ID(如两个 `EP-001`),导致下游 DSL 消费方(types-generator、mock-server 等)产生覆盖冲突。
|
|
357
|
-
|
|
358
|
-
- 在 endpoints 验证阶段新增 `Set<string>` 去重检查,重复 ID 报告具体位置(`endpoints[N].id`)
|
|
359
|
-
- 新增 4 个测试用例(唯一 ID 通过、重复 ID 拒绝、路径定位正确、多组重复检测)
|
|
360
|
-
|
|
361
|
-
**Fix 4 — Model 字段名唯一性检查(`core/dsl-validator.ts`)**
|
|
362
|
-
|
|
363
|
-
同一 Model 内出现重复字段名(如两个 `id`)会导致 Prisma schema 或 TypeScript interface 生成冲突。
|
|
364
|
-
|
|
365
|
-
- 在 `validateModel` 内新增 `Set<string>` 去重检查,同一 model 内重复字段报告具体位置
|
|
366
|
-
- 不同 model 之间允许同名字段(如 `User.id` 和 `Post.id`)
|
|
367
|
-
- 新增 4 个测试用例
|
|
368
|
-
|
|
369
|
-
**Fix 5 — `missing_errors` 误报修复(`core/dsl-feedback.ts`)**
|
|
370
|
-
|
|
371
|
-
原来的逻辑:只要有任何 endpoint 缺少 errors 且总 endpoint ≥ 2 就标记 gap。这导致当部分 endpoint 已有 errors 时仍然误报。
|
|
372
|
-
|
|
373
|
-
- 修改为:仅当 **所有** endpoint 都缺少 errors 时才标记 `missing_errors` gap
|
|
374
|
-
- 修复了 `dsl-feedback.test.ts` 中已有的失败测试
|
|
375
|
-
|
|
376
|
-
---
|
|
377
|
-
|
|
378
|
-
## [Unreleased] 2026-04-01 — P1 Task 验证步骤 + P2 设计方案对话
|
|
379
|
-
|
|
380
|
-
### 新增 / 增强
|
|
381
|
-
|
|
382
|
-
**Feature 1 — Task verificationSteps(`core/task-generator.ts`、`prompts/tasks.prompt.ts`、`core/combined-generator.ts`)**
|
|
383
|
-
|
|
384
|
-
受 Superpowers writing-plans 启发,每个 Task 新增 `verificationSteps` 字段,要求具体可执行的验证命令 + 预期结果,防止"works correctly"式模糊验收标准。
|
|
385
|
-
|
|
386
|
-
- `SpecTask` 新增 `verificationSteps: string[]`,语义为"the how to verify"(区别于 `acceptanceCriteria` 的"the what")
|
|
387
|
-
- `tasksSystemPrompt` 新增 verificationSteps 规则段:每条步骤必须是具体命令 + 可观察预期结果,给出 Good/Bad 示例,要求 2-5 条/task,backend 必须含 HTTP 检查,frontend 必须含 UI render + state 检查
|
|
388
|
-
- `combined-generator.ts` 的内联 tasks instruction 同步更新,包含 `verificationSteps` 字段定义
|
|
389
|
-
- `printTasks` 每个 task 输出前 2 条 verificationSteps(灰色),超过 2 条显示 "+ N more"
|
|
390
|
-
|
|
391
|
-
**Feature 2 — Design Options Dialogue(`core/design-dialogue.ts`、`prompts/design.prompt.ts`、`cli/commands/create.ts`)**
|
|
392
|
-
|
|
393
|
-
受 Superpowers brainstorming 启发,在 Spec 生成前新增 Step 1.5:AI 提出 2-3 个架构方案供用户选择,选定方案作为约束注入 spec prompt,防止 Spec 生成完后才发现方向不对。
|
|
394
|
-
|
|
395
|
-
- `prompts/design.prompt.ts` — `designOptionsSystemPrompt`:每个方案含 Approach / Trade-offs(2-3条)/ Best when,保持简短(≤2分钟阅读),附 Recommended 建议
|
|
396
|
-
- `core/design-dialogue.ts` — `DesignDialogue` 类:提案展示 → 用户选择(Option A/B/C / Blend / Skip)→ Blend 模式让 AI 融合多方案;解析 AI 输出的方案标签,提取选定方案全文(最多 400 字符)注入 spec
|
|
397
|
-
- `create.ts` Step 1.5:在 context load 完成后、spec gen 前运行;`--fast` / `--auto` / `--vcr-replay` 自动跳过;`architectureDecision` 传入 `generateSpecWithTasks` 和 `SpecGenerator.generateSpec`
|
|
398
|
-
- `combined-generator.ts` / `spec-generator.ts` 均新增 `architectureDecision?: string` 参数,以 `=== Architecture Decision ===` 段注入 prompt
|
|
399
|
-
|
|
400
|
-
---
|
|
401
|
-
|
|
402
|
-
## [Unreleased] 2026-04-01 — Pass 0 Spec Compliance Check + 项目索引 + 抗幻觉 Skills
|
|
403
|
-
|
|
404
|
-
### 新增 / 增强
|
|
405
|
-
|
|
406
|
-
**Feature 1 — Pass 0 Spec Compliance Check(`prompts/codegen.prompt.ts`、`core/reviewer.ts`、`core/self-evaluator.ts`)**
|
|
407
|
-
|
|
408
|
-
受 Superpowers 工作流启发,在现有 3-pass review 前新增专用的 Spec 合规性检查 Pass 0。
|
|
409
|
-
|
|
410
|
-
- `specComplianceSystemPrompt` — 穷举式审计:从 Spec 中提取所有需求(endpoints、models、business rules、auth、error cases、side effects),逐条标 ✅ / ⚠️ / ❌,输出 `ComplianceScore: X/10` + Blockers 列表
|
|
411
|
-
- `Pass 1 架构 Review` 去除原有"是否覆盖所有需求"条款,Pass 0 已处理,Pass 1 聚焦层分离 / 契约设计 / 安全姿态
|
|
412
|
-
- Pass 1 prompt 注入 Pass 0 合规报告作为上下文,避免重复发现
|
|
413
|
-
- `extractComplianceScore` / `extractMissingCount` 公开导出,供下游消费
|
|
414
|
-
- `create.ts` 在 `stageEnd("review")` 后即时打印合规分 + 缺失需求数
|
|
415
|
-
- `SelfEvalResult` 新增 `complianceScore` 字段;harnessScore 权重更新:当 compliance + review 均可用时,compliance 0.30 · dsl 0.25 · compile 0.20 · review 0.25
|
|
416
|
-
- `printSelfEval` 输出新增 `Compliance: X/10` 行,低于 6 显示红色 ⚠
|
|
417
|
-
- Review History 记录新增 `complianceScore` 字段
|
|
418
|
-
|
|
419
|
-
**Feature 2 — 项目索引 `ai-spec scan`(`core/project-index.ts`、`cli/commands/scan.ts`)**
|
|
420
|
-
|
|
421
|
-
- `core/project-index.ts` — 扫描根目录下所有子项目(识别 `package.json` / `go.mod` / `Cargo.toml` / `pom.xml` 等 manifest),持久化到 `.ai-spec-index.json`
|
|
422
|
-
- 增量逻辑:新项目 → 添加 `firstSeen`;已有项目 → 更新 `techStack / hasConstitution / lastSeen`;目录消失 → 标记 `missing:true`(不删除记录)
|
|
423
|
-
- Git Worktree 过滤:`.git` 为文件(非目录)时跳过,防止 ai-spec 生成的 worktree 被误识别为项目
|
|
424
|
-
- `ai-spec scan` — 扫描并输出变更摘要(added / updated / unchanged / missing)
|
|
425
|
-
- `ai-spec scan --list` — 不重新扫描,直接展示当前 index
|
|
426
|
-
- `ai-spec init --global` 联动:优先读取 index,对每个活跃项目提取 type / techStack / constitution §1-§6 前 2000 字符,作为全局宪法生成的多项目上下文;无 index 时 fallback 并提示先 `scan`
|
|
427
|
-
|
|
428
|
-
**Feature 3 — 抗幻觉 Skill 文件(`.claude/commands/`)**
|
|
429
|
-
|
|
430
|
-
从 ai-spec 现有抗幻觉设计中提炼 5 个可复用 Claude Code slash command skill,供团队共享:
|
|
431
|
-
|
|
432
|
-
- `/scan-singletons` — 扫描项目所有单例 config 文件(i18n / constants / routes / store-index),输出"只能修改、绝不重建"清单
|
|
433
|
-
- `/add-lesson` — 将 review 发现写入宪法 §9,含去重(前 60 字符比对)+ 分类(bug/security/pattern/perf/convention)+ 时间戳
|
|
434
|
-
- `/installed-deps` — 列出 `package.json` 所有依赖作为 codegen 白名单,附检测常用替代品歧义提示
|
|
435
|
-
- `/recall-lessons` — 读取 §9,按与当前任务的相关度(High/Medium/Low)筛选并展示历史教训
|
|
436
|
-
- `/verify-imports` — 验证文件中所有 import 路径(alias 解析 + 相对路径 + 包名白名单),输出 broken imports 及修复建议
|
|
437
|
-
|
|
438
|
-
---
|
|
439
|
-
|
|
440
|
-
## [Unreleased] 2026-04-01 — VCR 录制回放 + 异步 §9 + Approval Gate 增强
|
|
441
|
-
|
|
442
|
-
### 新增 / 增强
|
|
443
|
-
|
|
444
|
-
**Feature 1 — VCR 录制 & 零成本回放(`core/vcr.ts`、`cli/commands/vcr.ts`、`cli/commands/create.ts`)**
|
|
445
|
-
|
|
446
|
-
受 Claude Code VCR token 计数测试模式启发,将所有 AI 响应录制成 JSON 快照,供离线无 API 调用地回放。
|
|
447
|
-
|
|
448
|
-
- `VcrRecordingProvider` — 透明包装任意 `AIProvider`,拦截每次 `generate()` 并记录 `(index, promptPreview, callHash, response, providerName, modelName, ts, durationMs)`;`save()` 支持合并 spec + codegen 两个 recorder 并按时间戳排序
|
|
449
|
-
- `VcrReplayProvider` — 按序返回预录响应,入参 prompt 被忽略;录制耗尽时抛出明确错误
|
|
450
|
-
- 快照存储在 `.ai-spec-vcr/{runId}.json`,与 RunLog 使用相同 `runId`,可交叉查询
|
|
451
|
-
- `ai-spec vcr list` — 列出所有录制(runId、AI 调用数、provider/model、录制日期)
|
|
452
|
-
- `ai-spec vcr show <runId>` — 逐条展示每次 AI 调用的 promptPreview + callHash + 耗时
|
|
453
|
-
- CLI 选项:`--vcr-record`(当次运行录制)、`--vcr-replay <runId>`(零 API 调用回放)
|
|
454
|
-
- 实现 fire-and-await 模式:spec 和 codegen 两个 provider 分别包装,运行结束后统一 merge 保存
|
|
455
|
-
|
|
456
|
-
**Enhancement 1 — §9 知识积累改为异步 fire-and-await(`cli/commands/create.ts`)**
|
|
457
|
-
|
|
458
|
-
原来 `await accumulateReviewKnowledge(...)` 阻塞在 Loop 2 结构性反馈之前,拉长了关键路径。
|
|
459
|
-
|
|
460
|
-
- 将调用改为立即启动、在 `runLogger.finish()` 前 `await`(fire-and-await 模式)
|
|
461
|
-
- Loop 2 交互式结构分析不再等待 §9 写入,用户体验更流畅
|
|
462
|
-
- 错误通过 `.catch()` 打印 `⚠ §9 accumulation failed: ...`,不影响主流程
|
|
463
|
-
|
|
464
|
-
**Enhancement 2 — Approval Gate DSL 范围预估(`cli/commands/create.ts`)**
|
|
465
|
-
|
|
466
|
-
原来 Approval Gate 只显示行数和字数,用户难以判断代码生成规模。
|
|
467
|
-
|
|
468
|
-
- 新增 `estimateFromSpec(spec)` 内联逻辑(正则,无 AI 调用):从 spec 文本统计 HTTP 端点数(`GET/POST/PUT/PATCH/DELETE /`)和数据模型数(`## Model`、`**Xxx**:`)
|
|
469
|
-
- Approval Gate 增加 `Est. DSL scope : ~N endpoint(s), ~M model(s) → ~K files` 预估行
|
|
470
|
-
- 让用户在点击 Proceed 前对代码生成规模有量化感知
|
|
471
|
-
|
|
472
|
-
---
|
|
473
|
-
|
|
474
|
-
## [Unreleased] 2026-04-01 — Pipeline 可靠性强化(二):JSONL 崩溃恢复 + 熔断 + Token Budget
|
|
475
|
-
|
|
476
|
-
### 功能增强
|
|
477
|
-
|
|
478
|
-
**Enhancement 1 — RunLog JSONL Append-Only Shadow(`core/run-logger.ts`、`core/run-trend.ts`)**
|
|
479
|
-
|
|
480
|
-
原有 `RunLogger.flush()` 是异步 fire-and-forget 的全量 JSON 重写,进程崩溃时当次 RunLog 全丢。
|
|
481
|
-
|
|
482
|
-
- 新增 `appendJsonlLine(filePath, record)` — 用 `fs.appendFileSync` 同步追加,保证每条记录落盘后才继续执行
|
|
483
|
-
- `RunLogger` 构造时立即写 `header` 行到 `{runId}.jsonl`;每个 `push()`、`stageFail()`、`setPromptHash()`、`setHarnessScore()`、`fileWritten()`、`finish()` 均追加对应类型的 JSONL 行(`header` / `entry` / `error` / `file` / `meta` / `footer`)
|
|
484
|
-
- 原有 `.json` 全量文件保留不变(消费者 `trend`、`dashboard`、`logs` 无需改动)
|
|
485
|
-
- 新增 `reconstructRunLogFromJsonl(path)` — 从 JSONL 行逐条重建 `RunLog`,供崩溃恢复使用
|
|
486
|
-
- `loadRunLogs()` 新增孤儿 `.jsonl` 恢复路径:扫描到没有对应 `.json` 的 `.jsonl` 文件时,自动重建并纳入返回结果
|
|
487
|
-
|
|
488
|
-
**Enhancement 2 — ErrorFeedback 无进展熔断(`core/error-feedback.ts`)**
|
|
489
|
-
|
|
490
|
-
原有修复循环没有"进展检测",即使每次修复后错误数未减少,仍会消耗完所有 `maxCycles`。
|
|
491
|
-
|
|
492
|
-
- 新增 `prevErrorCount` 跟踪上一轮的错误数量
|
|
493
|
-
- 每次 fix 后重新检查:若 `allErrors.length >= prevErrorCount`(错误数未减少),立即中止并打印 `⚠ Auto-fix made no progress` 提示,不再浪费额外 AI 调用
|
|
494
|
-
- 参考:Claude Code `MAX_CONSECUTIVE_AUTOCOMPACT_FAILURES = 3` 防止 compact 死循环的同类设计
|
|
495
|
-
|
|
496
|
-
**Enhancement 3 — Command Output + File Content Token Budget(`core/error-feedback.ts`)**
|
|
497
|
-
|
|
498
|
-
- 新增 `MAX_COMMAND_OUTPUT_CHARS = 50_000`(约 10K tokens):`runCommand` 返回的 stderr/stdout 超过此限时截断,防止巨型构建输出撑满 AI context
|
|
499
|
-
- 新增 `MAX_FIX_FILE_CHARS = 60_000`(约 12K tokens):`attemptFix` 中发给 AI 的 `existingContent` 超过此限时截断并附加提示,AI 仍可通过错误行号定位问题
|
|
500
|
-
- 参考:Claude Code `applyToolResultBudget(toolResult, maxTokens)` 工具输出预算设计
|
|
501
|
-
|
|
502
|
-
---
|
|
503
|
-
|
|
504
|
-
## [Unreleased] 2026-04-01 — Pipeline 可靠性强化:结构化 Review Findings + §9 知识闭环
|
|
505
|
-
|
|
506
|
-
### 功能增强
|
|
507
|
-
|
|
508
|
-
**Enhancement 1 — Loop 2 结构性发现:正则 → 结构化 JSON(`prompts/codegen.prompt.ts`、`core/dsl-feedback.ts`)**
|
|
509
|
-
|
|
510
|
-
原有 `extractStructuralFindings` 用正则解析 AI 生成的 review 自然语言,格式漂移会导致静默漏报,且只覆盖硬编码的 4 种关键词。
|
|
511
|
-
|
|
512
|
-
- `reviewArchitectureSystemPrompt` Pass 1 格式末尾新增 `## 🔍 结构性发现 JSON` 段,要求 AI 强制输出 `{"structuralFindings": [...]}` JSON block(即使无发现也输出空数组),category 枚举与原有一致:`auth_design` / `api_contract` / `model_design` / `layer_violation` / `other_design`
|
|
513
|
-
- `extractStructuralFindings` 改为**优先解析 JSON block**:从 Pass 1 文本提取 ` ```json{...}``` `,parse `structuralFindings` 数组并做类型守卫过滤;解析失败或旧格式 review 才 fallback 到原有正则逻辑(向后兼容)
|
|
514
|
-
- 结果:Loop 2 发现的问题不再受限于关键词列表,任何被 Pass 1 明确指出的设计问题都会进入反馈环
|
|
515
|
-
|
|
516
|
-
**Enhancement 2 — §9 知识积累真正形成双向闭环(`prompts/spec.prompt.ts`、`core/reviewer.ts`)**
|
|
517
|
-
|
|
518
|
-
原有实现的两个断层:
|
|
519
|
-
1. constitution 虽然注入到 spec 生成 prompt,但 `specPrompt` 没有明确指令让 AI 去应用 §9 教训
|
|
520
|
-
2. Reviewer 三 Pass 完全不读 constitution,无法检验新代码是否重蹈 §9 记录的问题
|
|
521
|
-
|
|
522
|
-
修复:
|
|
523
|
-
- `specPrompt` 末尾新增 CRITICAL 指令:如果 constitution 含 §9,spec 生成前必须逐条审阅教训;对直接相关的教训,在 §8 实施要点末尾追加「⚠ 基于历史教训:[简述规避方式]」
|
|
524
|
-
- `reviewer.ts` 新增 `loadAccumulatedLessons(projectRoot)` — 读取 constitution 中 §9 段落(`## 9. 积累教训` 到下一 `## \d` 或 EOF);注入到 Pass 1 arch review prompt(`=== §9 历史积累教训 ===`),让 reviewer 能交叉检验新代码是否复现已知问题,发现则写入 JSON findings 块触发 Loop 2
|
|
525
|
-
|
|
526
|
-
**两个闭环现在都真正贯通:**
|
|
527
|
-
```
|
|
528
|
-
Review → §9 写入 constitution
|
|
529
|
-
↓
|
|
530
|
-
下次 create spec 时 → spec 生成读取 §9 → 设计时规避
|
|
531
|
-
↓
|
|
532
|
-
Review Pass 1 读取 §9 → 检验代码是否复现 → 若复现触发 Loop 2 修正 DSL
|
|
533
|
-
```
|
|
534
|
-
|
|
535
|
-
---
|
|
536
|
-
|
|
537
|
-
## [Unreleased] 2026-03-31 — 文档同步:README / purpose / RELEASE_LOG
|
|
538
|
-
|
|
539
|
-
### 文档更新
|
|
540
|
-
|
|
541
|
-
- README 首页主流程同步到最新架构:
|
|
542
|
-
- 补入 **DSL Gap Feedback**
|
|
543
|
-
- 补入 **Review→DSL Loop**
|
|
544
|
-
- 明确 `logs` / `trend` / `dashboard` 消费 Harness Self-Eval 的 RunLog 数据
|
|
545
|
-
- 补充 DSL 的下游产物说明(`types` / `export` / `mock` / workspace 契约注入)
|
|
546
|
-
- purpose 文档升级到 **v0.34.0** 口径:
|
|
547
|
-
- 版本记录速览补入 v0.32.0 / v0.33.0 / v0.34.0
|
|
548
|
-
- 新增“两条 Pipeline 反馈环”章节
|
|
549
|
-
- 新增“DSL 的多出口价值:类型、Dashboard 与可观测性”章节
|
|
550
|
-
- 完整功能矩阵扩展到 `types`、`logs`、`trend`、`dashboard`
|
|
551
|
-
- purpose 的 Mermaid 流程图已切换为 **SVG 图片 + 折叠纯文本备用版**,方便在不支持 Mermaid 的文档平台中阅读
|
|
552
|
-
- RELEASE_LOG 新增当前文档同步记录,保证产品叙事与代码实现保持一致
|
|
553
|
-
|
|
554
|
-
---
|
|
555
|
-
|
|
556
|
-
## [0.34.0] 2026-03-31 — Harness Dashboard + TypeScript 类型生成
|
|
557
|
-
|
|
558
|
-
### 新增内容
|
|
559
|
-
|
|
560
|
-
**Feature 1 — `ai-spec dashboard`(`core/dashboard-generator.ts`、`cli/commands/dashboard.ts`)**
|
|
561
|
-
|
|
562
|
-
- 基于现有 `.ai-spec-logs/` RunLog 数据,一键生成静态 HTML Harness Dashboard
|
|
563
|
-
- 包含:
|
|
564
|
-
- Overview 统计(总运行数 / 平均分 / 编译通过率)
|
|
565
|
-
- Score Trend 折线图(SVG,最近 30 次有评分运行)
|
|
566
|
-
- Prompt 版本对比表(avg / best / worst,当前版本高亮)
|
|
567
|
-
- 近 10 次运行历史(带评分条形)
|
|
568
|
-
- 阶段耗时柱状图(平均 ms,前 8 阶段)
|
|
569
|
-
- Top 5 错误频次统计
|
|
570
|
-
- 零外部依赖(纯 inline CSS + SVG)
|
|
571
|
-
- `--open` 选项:生成后自动打开浏览器
|
|
572
|
-
|
|
573
|
-
```bash
|
|
574
|
-
ai-spec dashboard # 生成 .ai-spec/dashboard.html
|
|
575
|
-
ai-spec dashboard --open # 生成后自动在浏览器打开
|
|
576
|
-
ai-spec dashboard --last 20 # 只分析最近 20 次运行
|
|
577
|
-
ai-spec dashboard --output ./report.html
|
|
578
|
-
```
|
|
579
|
-
|
|
580
|
-
---
|
|
581
|
-
|
|
582
|
-
**Feature 2 — `ai-spec types`(`core/types-generator.ts`、`cli/commands/types.ts`)**
|
|
583
|
-
|
|
584
|
-
- DSL → TypeScript 类型文件,前端可直接 import,无需手写
|
|
585
|
-
- 生成内容:
|
|
586
|
-
- 所有 `models` → `export interface ModelName { ... }`(含可选/必填、类型映射)
|
|
587
|
-
- 所有 `endpoints.request.body/query/params` → `export interface PostXxxRequest { ... }`
|
|
588
|
-
- `export const API_ENDPOINTS = { ... } as const`(含 method / path / auth)
|
|
589
|
-
- 前端 `components[].props` → `export interface ComponentNameProps { ... }`
|
|
590
|
-
- 类型映射:`String→string`,`Int/Float→number`,`Boolean→boolean`,`DateTime→string`,`PascalCase→该 interface 引用`
|
|
591
|
-
|
|
592
|
-
```bash
|
|
593
|
-
ai-spec types # 生成 .ai-spec/<feature>.types.ts
|
|
594
|
-
ai-spec types --stdout # 打印到 stdout(适合管道)
|
|
595
|
-
ai-spec types --output src/types/api.ts
|
|
596
|
-
ai-spec types --no-endpoint-map # 不生成 API_ENDPOINTS 常量
|
|
597
|
-
```
|
|
598
|
-
|
|
599
|
-
---
|
|
600
|
-
|
|
601
|
-
## [0.33.0] 2026-03-30 — Pipeline 反馈环:DSL Gap Loop + Review→DSL Loop
|
|
602
|
-
|
|
603
|
-
### 新增内容
|
|
604
|
-
|
|
605
|
-
**Feature — 两条 Pipeline 反馈环(`core/dsl-feedback.ts`、`cli/index.ts`)**
|
|
606
|
-
|
|
607
|
-
原有流水线是严格单向的——每一步的输出只能向前传递,review 发现的问题只能写入 §9,DSL 提取稀疏也只能硬着头皮继续。v0.33.0 在两个关键位置插入局部反馈环,让 pipeline 在保持可测量性的前提下具备弹性。
|
|
608
|
-
|
|
609
|
-
---
|
|
610
|
-
|
|
611
|
-
**Loop 1 — DSL Gap Feedback(DSL 提取完成 → Worktree 之前)**
|
|
612
|
-
|
|
613
|
-
- 新增 `assessDslRichness(dsl)` — 纯启发式检查,零 AI 调用,检测四类常见 DSL 缺口:
|
|
614
|
-
|
|
615
|
-
| 缺口类型 | 检测逻辑 |
|
|
616
|
-
|----------|---------|
|
|
617
|
-
| `no_models_no_endpoints` | DSL 完全为空——spec 可能太抽象 |
|
|
618
|
-
| `generic_endpoint_desc` | endpoint description < 15 字符或以模糊动词开头(handles/管理/处理…)|
|
|
619
|
-
| `missing_errors` | ≥2 个 endpoint 且全部无 errors 定义 |
|
|
620
|
-
| `sparse_model` | model 字段数 < 2 |
|
|
621
|
-
|
|
622
|
-
- 发现缺口时,交互模式下展示具体缺口列表并提供选择:
|
|
623
|
-
- `🔧 Refine spec` — AI 执行定向 spec 补全(`buildDslGapRefinementPrompt`),不改变功能范围,只填充缺失细节 → 自动重新提取 DSL
|
|
624
|
-
- `⏭ Skip` — 继续用当前 DSL
|
|
625
|
-
|
|
626
|
-
- `--auto` / `--fast` / `--skip-dsl` 模式下完全跳过此 Loop
|
|
627
|
-
- 结果写入 RunLog `dsl_gap_feedback` 阶段(action: `refined` / `skipped` / `refinement_error`)
|
|
628
|
-
|
|
629
|
-
---
|
|
630
|
-
|
|
631
|
-
**Loop 2 — Review → DSL Structural Feedback(§9 知识积累 → Self-Eval 之前)**
|
|
632
|
-
|
|
633
|
-
- 新增 `extractStructuralFindings(reviewText)` — 解析 Pass 1(架构审查)文本,识别设计层问题(而非实现层问题):
|
|
634
|
-
|
|
635
|
-
| 类别 | 触发模式 |
|
|
636
|
-
|------|---------|
|
|
637
|
-
| `auth_design` | 缺少认证 / missing auth / 鉴权缺 |
|
|
638
|
-
| `api_contract` | 接口设计问题 / API design / 接口缺少 |
|
|
639
|
-
| `model_design` | 模型缺少字段 / model missing field / schema incomplete |
|
|
640
|
-
| `layer_violation` | 层级违反 / layer violation / 分层问题 |
|
|
641
|
-
|
|
642
|
-
Pass 1 得分 ≥ 8 时认为架构没问题,自动跳过分类
|
|
643
|
-
|
|
644
|
-
- 发现结构性问题时展示区别于 §9 的"设计层警告",并提供三种选择:
|
|
645
|
-
- `🔧 Amend spec + update DSL` — AI 根据结构性发现定向修订 spec → 重新提取 DSL → 覆盖保存 spec 文件和 DSL 文件 → 提示 `ai-spec update --codegen` 重新生成受影响文件
|
|
646
|
-
- `📝 Note in §9 only` — §9 已由 knowledge accumulation 写入,DSL 不变
|
|
647
|
-
- `⏭ Skip`
|
|
648
|
-
|
|
649
|
-
- 关键设计决策:Loop 2 **不自动触发 codegen**。DSL 修正后提示用户主动运行 `update --codegen`,保持人在决策节点的控制权
|
|
650
|
-
- `--auto` 模式下完全跳过此 Loop(不增加 CI 耗时)
|
|
651
|
-
- 结果写入 RunLog `review_dsl_feedback` 阶段
|
|
652
|
-
|
|
653
|
-
---
|
|
654
|
-
|
|
655
|
-
**新流水线结构:**
|
|
656
|
-
|
|
657
|
-
```
|
|
658
|
-
Spec → DSL 提取
|
|
659
|
-
↓
|
|
660
|
-
[Loop 1] DSL Gap 检测
|
|
661
|
-
↓ (不满足 → 定向 spec 补全 → 重新提取 DSL)
|
|
662
|
-
Approval Gate → Worktree → Codegen → ErrorFix → Review
|
|
663
|
-
↓
|
|
664
|
-
§9 知识积累
|
|
665
|
-
↓
|
|
666
|
-
[Loop 2] 结构性问题检测
|
|
667
|
-
↓ (发现 → spec 修订 → DSL 更新)
|
|
668
|
-
Self-Eval → Done
|
|
669
|
-
```
|
|
670
|
-
|
|
671
|
-
---
|
|
672
|
-
|
|
673
|
-
**内部重构(2026-03-31)— CLI 命令拆分**
|
|
674
|
-
|
|
675
|
-
- `cli/index.ts` 从 2533 行拆分为 42 行入口 + 13 个独立命令文件(`cli/commands/*.ts`)+ 共享工具层(`cli/utils.ts`)
|
|
676
|
-
- 无任何用户可见功能变化,编译输出与重构前等价
|
|
677
|
-
|
|
678
|
-
---
|
|
679
|
-
|
|
680
|
-
## [0.32.0] 2026-03-30 — Harness 数据闭环:`trend` / `logs` 命令 + DSL Coverage 细化评分
|
|
681
|
-
|
|
682
|
-
### 新增内容
|
|
683
|
-
|
|
684
|
-
**Feature #1 — `ai-spec trend` 跨运行趋势命令(`core/run-trend.ts`、`cli/index.ts`)**
|
|
685
|
-
|
|
686
|
-
- 新增 `core/run-trend.ts` — 趋势分析模块:
|
|
687
|
-
- `loadRunLogs(workingDir)` — 扫描 `.ai-spec-logs/*.json`,按运行时间倒序排列,静默跳过损坏文件
|
|
688
|
-
- `buildTrendReport(logs, opts)` — 从 RunLog 数组生成趋势报告:按 `promptHash` 分组,统计 avg / best / worst;支持 `last` 和 `promptFilter` 选项
|
|
689
|
-
- `printTrendReport(report, workingDir)` — 彩色表格输出,分为「Prompt 版本摘要」和「运行历史」两区,当前 prompt 版本用 `◀ current` 标记
|
|
690
|
-
- 新增 CLI 命令 `ai-spec trend`:
|
|
691
|
-
```bash
|
|
692
|
-
ai-spec trend # 最近 15 次有评分的运行,按 promptHash 分组
|
|
693
|
-
ai-spec trend --last 30 # 最近 30 次
|
|
694
|
-
ai-spec trend --prompt a3f # 只看 hash 以 a3f 开头的 prompt 版本
|
|
695
|
-
ai-spec trend --json # 输出原始 JSON,适合脚本聚合分析
|
|
696
|
-
```
|
|
697
|
-
输出示例:
|
|
698
|
-
```
|
|
699
|
-
─── Harness Trend ───────────────────────────────────────────────
|
|
700
|
-
Prompt Versions:
|
|
701
|
-
Hash Runs Avg Best Worst Last seen
|
|
702
|
-
─────────────────────────────────────────────────────────
|
|
703
|
-
a3f2c1d8 3 7.6 8.2 6.9 2026-03-30 ◀ current
|
|
704
|
-
b1e4a2f0 5 6.8 7.4 5.5 2026-03-29
|
|
705
|
-
|
|
706
|
-
Run History:
|
|
707
|
-
2026-03-30 [████████░░] 7.8 a3f2c1d8 1m24s feature-login-v1.md
|
|
708
|
-
2026-03-30 [████████░░] 8.2 a3f2c1d8 1m18s feature-user-v1.md
|
|
709
|
-
...
|
|
710
|
-
```
|
|
711
|
-
|
|
712
|
-
**Feature #2 — `ai-spec logs` 运行日志列表命令(`cli/index.ts`)**
|
|
713
|
-
|
|
714
|
-
- 新增 CLI 命令 `ai-spec logs`:
|
|
715
|
-
```bash
|
|
716
|
-
ai-spec logs # 列出最近 10 次运行(runId、日期、score、文件数、耗时)
|
|
717
|
-
ai-spec logs --last 20 # 列出最近 20 次
|
|
718
|
-
ai-spec logs <runId> # 展示该次运行的完整阶段耗时表格
|
|
719
|
-
```
|
|
720
|
-
单次运行详情示例:
|
|
721
|
-
```
|
|
722
|
-
─── Run: 20260330-143022-a7f2 ─────────────────────────────────
|
|
723
|
-
Started : 2026-03-30T14:30:22.000Z
|
|
724
|
-
Provider: gemini / gemini-2.5-pro
|
|
725
|
-
Prompt : a3f2c1d8
|
|
726
|
-
Score : 7.8/10
|
|
727
|
-
Stages:
|
|
728
|
-
✔ context_load 0.3s
|
|
729
|
-
✔ spec_gen 18.4s
|
|
730
|
-
✔ dsl_extract 6.1s
|
|
731
|
-
✔ codegen 51.2s
|
|
732
|
-
✔ review 14.8s
|
|
733
|
-
✔ self_eval 0.0s
|
|
734
|
-
```
|
|
735
|
-
- 结尾提示 `ai-spec logs <runId>` 和 `ai-spec trend`,引导用户进入分析工作流
|
|
736
|
-
|
|
737
|
-
### 功能增强
|
|
738
|
-
|
|
739
|
-
**Enhancement — DSL Coverage Score 三层细化评分(`core/self-evaluator.ts`)**
|
|
740
|
-
|
|
741
|
-
原有评分只做二元判断(endpoint 层有无、model 层有无),无法反映实际覆盖深度。新增两个 Tier:
|
|
742
|
-
|
|
743
|
-
| Tier | 检查项 | 扣分规则 |
|
|
744
|
-
|------|--------|--------|
|
|
745
|
-
| Tier 1(原有)| endpoint 层存在 / model 层存在 | -4 / -3(同前)|
|
|
746
|
-
| **Tier 2(新增)** | Model name 覆盖率:对每个 DSL 声明的 model,检查其名称(含 camelCase → snake_case 规范化)是否出现在任何生成文件路径中 | coverage < 50% → -2;50-79% → -1;≥80% → 0 |
|
|
747
|
-
| **Tier 3(新增)** | Endpoint 文件充足性:≥5 个端点但 endpoint 层文件 < 2 个 | -1 |
|
|
748
|
-
|
|
749
|
-
- 新增 `modelNameTokens(name)` — 将 PascalCase 模型名规范化为多种路径匹配 token(`OrderItem` → `orderitem` / `order-item` / `order_item`)
|
|
750
|
-
- `SelfEvalResult.detail` 新增 `endpointLayerFiles`、`modelNameCoverage`、`modelNameMatched` 字段,写入 RunLog 供后续分析
|
|
751
|
-
- `printSelfEval()` 当存在 DSL model 时新增 Detail 行:
|
|
752
|
-
```
|
|
753
|
-
─── Harness Self-Eval ───────────────────────────
|
|
754
|
-
Score : [████████░░] 7.8/10
|
|
755
|
-
DSL : 8/10 Compile: pass Review: 7.2/10
|
|
756
|
-
Detail : Models: 3/4 (75%) Endpoints: 5 Files: 9
|
|
757
|
-
Prompt : a3f2c1d8
|
|
758
|
-
─────────────────────────────────────────────────
|
|
759
|
-
```
|
|
760
|
-
|
|
761
|
-
---
|
|
762
|
-
|
|
763
|
-
## [0.31.0] 2026-03-29 — Harness Engineer:Prompt Hash + Create 内联 Self-Eval
|
|
764
|
-
|
|
765
|
-
### 新增内容
|
|
766
|
-
|
|
767
|
-
**Feature #1 — Prompt Hash 关联(`core/prompt-hasher.ts`、`core/run-logger.ts`)**
|
|
768
|
-
|
|
769
|
-
- 新增 `computePromptHash()` — 对 6 个核心 prompt 字符串(codegen、DSL extractor、spec generator、review 三 pass)计算 SHA-256 并取前 8 位,返回形如 `a3f2c1d8` 的短 hex 字符串
|
|
770
|
-
- `RunLog` 新增 `promptHash?: string` 字段;`RunLogger` 新增 `setPromptHash()` + `setHarnessScore()` 方法
|
|
771
|
-
- `ai-spec create` 运行开始时立即调用 `computePromptHash()` 写入 RunLog,任何 prompt 文件改动都会产生不同的 hash
|
|
772
|
-
- **目的**:跨多次运行对比 `harnessScore` 时,可以精确知道「这两次用的 prompt 版本是否相同」,将 prompt 改动的效果从模型随机性中解耦
|
|
773
|
-
|
|
774
|
-
**Feature #2 — Create 内联 Harness Self-Eval(`core/self-evaluator.ts`、`cli/index.ts`)**
|
|
775
|
-
|
|
776
|
-
- 新增 `core/self-evaluator.ts` — 零 AI 调用的确定性评分模块:
|
|
777
|
-
- **DSL Coverage Score (0-10)**:检查 `generatedFiles` 中是否存在 endpoint 层文件(`src/api*`、`src/routes*`、`src/controller*`…)和 model 层文件(`src/model*`、`prisma/`、`src/db*`…),与 DSL 中声明的 endpoint / model 数量对照
|
|
778
|
-
- **Compile Score (0-10)**:`runErrorFeedback()` 返回 `true` → 10,未通过 / 跳过 → 5
|
|
779
|
-
- **Review Score (0-10)**:从 3-pass review 文本中提取 `Score: X/10`(与 `reviewer.ts` 同规则),review 跳过时为 null
|
|
780
|
-
- **Harness Score**:加权平均(有 review:DSL×40% + Compile×30% + Review×30%;无 review:DSL×55% + Compile×45%)
|
|
781
|
-
- `runErrorFeedback()` 的返回值(`boolean`)现在被接住赋给 `compilePassed`,传入 self-eval
|
|
782
|
-
- `ai-spec create` Step 9(code review)之后新增 **Step 10: Harness Self-Eval**,完成后打印:
|
|
783
|
-
|
|
784
|
-
```
|
|
785
|
-
─── Harness Self-Eval ───────────────────────────
|
|
786
|
-
Score : [████████░░] 7.8/10
|
|
787
|
-
DSL : 8/10 Compile: pass Review: 7.2/10
|
|
788
|
-
Prompt : a3f2c1d8
|
|
789
|
-
─────────────────────────────────────────────────
|
|
790
|
-
```
|
|
791
|
-
|
|
792
|
-
- `harnessScore` 和所有维度分数写入 RunLog 的 `self_eval:done` 事件 + 根级 `harnessScore` 字段,便于后续脚本聚合分析
|
|
793
|
-
|
|
794
|
-
---
|
|
795
|
-
|
|
796
|
-
## [0.30.0] 2026-03-29 — 错误修复依赖图排序 + 前端 Import 多行感知解析
|
|
797
|
-
|
|
798
|
-
### 改进内容
|
|
799
|
-
|
|
800
|
-
**Improvement #1 — Error Repair 升级为依赖图排序(`core/error-feedback.ts`)**
|
|
801
|
-
|
|
802
|
-
- **问题**:`attemptFix()` 对出错文件的修复顺序完全取决于 `Map` 的插入顺序(即错误首次出现的顺序),与文件间的 import 关系无关。典型场景:`userService.ts` 导出一个类型,`userController.ts` 和 `userStore.ts` 同时 import 它,三个文件都出错时,若 controller/store 先被修复,修复 prompt 中的 service 仍是破损版本,cycle 1 无法消除 cascade 错误,只能等 cycle 2 补救。
|
|
803
|
-
- **修复**:新增 `parseRelativeImports()` + `buildRepairOrder()` 两个函数:
|
|
804
|
-
- `parseRelativeImports(content, fromFile)` — 从文件内容中解析相对 import 路径(`./foo`、`../foo`),规范化为项目根相对路径(不含扩展名),跳过 `import type`(仅类型,不影响运行时错误)
|
|
805
|
-
- `buildRepairOrder(errorsByFile, workingDir)` — 读取所有出错文件的 import 声明,构建「出错文件子图」,使用 Kahn 拓扑排序将被依赖的文件排在前面,有环依赖的文件追加到末尾
|
|
806
|
-
- `attemptFix()` 调用 `await buildRepairOrder()` 替换原先直接遍历 `errorsByFile`
|
|
807
|
-
- **效果**:上例中 `userService.ts` 先被修复,cycle 1 即可消除 controller / store 的 cascade 错误,2 轮上限的利用率提升,复杂跨文件依赖错误的一次性修复率提高
|
|
808
|
-
|
|
809
|
-
**Improvement #2 — `httpClientImport` / `layoutImport` 升级为多行感知解析(`core/frontend-context-loader.ts`)**
|
|
810
|
-
|
|
811
|
-
- **问题**:旧版 `httpClientImport` 提取使用单行正则 `httpImportRegex`,`[^}]+` 不跨换行符,导致所有多行 named import(`import {\n request\n} from '@/utils/http'`)静默匹配失败,回退到 `undefined`,AI 自由发挥 import 路径;`layoutImport` 同样依赖单行正则,多行动态 import 写法(`const Layout = defineAsyncComponent(\n () => import('...')\n)`)无法识别。
|
|
812
|
-
- **修复**:
|
|
813
|
-
- 新增 `parseImportStatements(content)` — 轻量 import 解析器:先将多行 named import block(`import { ... }`)折叠为单行,再逐行匹配,返回 `{ line, modulePath, specifiers }` 结构化对象,跳过 `import type`;不引入任何新依赖
|
|
814
|
-
- 新增 `HTTP_MODULE_PATTERNS` — 三类模式数组(路径别名 `@/` `~/` `#/` / 已知 HTTP 库名 / 含关键词的相对路径),独立于 import 行格式,匹配逻辑与解析逻辑解耦
|
|
815
|
-
- 新增 `findHttpClientImport(content)` — 组合以上两者,替换旧版 `httpImportRegex` 的调用处
|
|
816
|
-
- `extractRouteModuleContext()` 中 `layoutImport` 静态 import 改用 `parseImportStatements()` 提取;动态 import(`const Layout = ...`)增加多行折叠预处理后再匹配,覆盖 `defineAsyncComponent` 等包装写法
|
|
817
|
-
|
|
818
|
-
---
|
|
819
|
-
|
|
820
|
-
## [0.29.0] 2026-03-27 — 全量审查修复(RunLogger 插桩、update 快照、Score Trend 升级、死代码清理)
|
|
821
|
-
|
|
822
|
-
### 修复内容
|
|
823
|
-
|
|
824
|
-
**Fix #1 — RunLogger 各阶段从未插桩(结构化日志实际为空)**
|
|
825
|
-
- 文件:`cli/index.ts`(create 命令主流水线)
|
|
826
|
-
- 问题:`core/run-logger.ts` 设计了完整的 `stageStart()`/`stageEnd()`/`stageFail()` API,但 CLI 中从未调用,生成的 `.ai-spec-logs/<runId>.json` 的 `entries[]` 数组始终为空——只有开始/结束时间戳和文件列表,丧失了每阶段耗时的核心价值。
|
|
827
|
-
- 修复:在 `create` 流水线所有主要阶段添加 stage 调用,覆盖以下 8 个节点:
|
|
828
|
-
|
|
829
|
-
| Stage Key | 对应步骤 | 记录数据 |
|
|
830
|
-
|---|---|---|
|
|
831
|
-
| `context_load` | Step 1 — 加载项目上下文 | `techStack`, `repoType` |
|
|
832
|
-
| `spec_gen` | Step 2 — Spec + Tasks 生成 | `provider`, `model`, `taskCount`;失败时 `stageFail` |
|
|
833
|
-
| `spec_refine` | Step 3 — 交互式润色 | 耗时 |
|
|
834
|
-
| `spec_assess` | Step 3.4 — Spec 质量评估 | `overallScore`;gate 失败时 `stageFail` |
|
|
835
|
-
| `dsl_extract` | DSL — 结构化提取 | `endpoints`, `models` 数量;提取失败时 `stageFail` |
|
|
836
|
-
| `codegen` | Step 6 — 代码生成 | `mode`, `provider`, `model`, `filesGenerated` |
|
|
837
|
-
| `test_gen` | Step 7 — 测试骨架生成 | `filesGenerated` |
|
|
838
|
-
| `error_feedback` | Step 8 — 错误反馈闭环 | 耗时 |
|
|
839
|
-
| `review` | Step 9 — 3-pass 代码审查 | 耗时 |
|
|
840
|
-
|
|
841
|
-
**Fix #2 — `update --codegen` 写文件前无快照,运行结束无日志**
|
|
842
|
-
- 文件:`cli/index.ts`(update 命令)
|
|
843
|
-
- 问题:`update --codegen` 直接改写受影响文件,但 `setActiveSnapshot()`/`setActiveLogger()` 只在 `create` 命令中调用,`getActiveSnapshot()?.snapshotFile()` 因返回 `null` 而静默跳过,用户无法对 update 产生的改动执行 `ai-spec restore`。
|
|
844
|
-
- 修复:
|
|
845
|
-
- update 命令启动时生成独立 `updateRunId`,初始化 `RunSnapshot` 和 `RunLogger` 并注册为 active 单例
|
|
846
|
-
- 写每个受影响文件前调用 `updateSnapshot.snapshotFile(fullPath)`,现在 `ai-spec restore <updateRunId>` 对 update 生成的改动同样有效
|
|
847
|
-
- 写文件后调用 `updateLogger.fileWritten()`
|
|
848
|
-
- `update_codegen` stage 包含 `stageStart`/`stageEnd`/`stageFail`
|
|
849
|
-
- 命令结束时 `finish()` + `printSummary()` + restore 提示(与 create 对齐)
|
|
850
|
-
|
|
851
|
-
**Fix #3 — `update --codegen` 结束后不积累审查知识**
|
|
852
|
-
- 文件:`cli/index.ts`(update 命令)
|
|
853
|
-
- 问题:`create` 流水线最后会用 `accumulateReviewKnowledge()` 把 review 结论写入宪法 §9;`update --codegen` 虽然也修改了代码,但流程结束后什么都不写。团队在 update 阶段发现的问题从来不进入知识库,宪法无法从迭代修改中学习。
|
|
854
|
-
- 修复:`update --codegen` 完成文件写入后,自动对更新后的 Spec 运行一次 `reviewer.reviewCode()`,并将结果传入 `accumulateReviewKnowledge()`,复用 spec 更新阶段已创建的 `provider` 实例,无需额外配置。
|
|
855
|
-
|
|
856
|
-
**Fix #4 — `reviewSystemPrompt` 旧版单体 prompt 变为死代码未清理**
|
|
857
|
-
- 文件:`prompts/codegen.prompt.ts`、`core/reviewer.ts`
|
|
858
|
-
- 问题:v0.28.0 升级为 3-pass 后,旧的整合式 `reviewSystemPrompt`(18 行)仍在 `codegen.prompt.ts` 中导出,并被 `reviewer.ts` import 但不在任何地方调用,造成维护混淆。
|
|
859
|
-
- 修复:删除 `codegen.prompt.ts` 中的 `reviewSystemPrompt` export,同步删除 `reviewer.ts` 中的对应 import;注释由 `// ─── Two-pass review prompts` 更新为 `// ─── 3-pass review prompts`。
|
|
860
|
-
|
|
861
|
-
### 功能增强
|
|
862
|
-
|
|
863
|
-
**Enhancement — `printScoreTrend()` 新增影响等级 / 复杂度等级展示**
|
|
864
|
-
- 文件:`core/reviewer.ts`
|
|
865
|
-
- 背景:v0.28.0 审查历史 `ReviewHistoryEntry` 已增加 `impactLevel` 和 `complexityLevel` 字段并持久化,但 `printScoreTrend()` 展示趋势时从未读取这两个字段,用户看不到任何影响 / 复杂度信息。
|
|
866
|
-
- 修复:每行趋势输出追加两个彩色标签,颜色编码:高=红、中=黄、低=绿。
|
|
867
|
-
|
|
868
|
-
```
|
|
869
|
-
前(只有分数):
|
|
870
|
-
2026-03-26 [████████░░] 8/10 feature-tasks-v1.md
|
|
871
|
-
|
|
872
|
-
后(新增等级标签):
|
|
873
|
-
2026-03-26 [████████░░] 8/10 影响:中 复杂度:低 feature-tasks-v1.md
|
|
874
|
-
```
|
|
875
|
-
|
|
876
|
-
---
|
|
877
|
-
|
|
878
|
-
## [0.28.0] 2026-03-26 — 三 Pass 代码审查(影响面评估 + 代码复杂度评估)
|
|
879
|
-
|
|
880
|
-
### 新增内容
|
|
881
|
-
|
|
882
|
-
**Feature — Review Pass 3:影响面评估 + 代码复杂度评估**
|
|
883
|
-
- 文件:`prompts/codegen.prompt.ts`(新增 `reviewImpactComplexitySystemPrompt`)、`core/reviewer.ts`(两 Pass 升级为三 Pass)
|
|
884
|
-
- 原有两 Pass 不变;新增第三 Pass 专注于两个前两 Pass 刻意跳过的维度:
|
|
885
|
-
|
|
886
|
-
**影响面评估 (Impact Assessment)**
|
|
887
|
-
- 直接影响文件列表
|
|
888
|
-
- 间接影响范围(哪些模块/消费方/下游服务受影响)
|
|
889
|
-
- 破坏性变更检测(接口签名变更、Schema 变更、配置变更、导出重命名)
|
|
890
|
-
- 影响等级:低 / 中 / 高(附理由)
|
|
891
|
-
|
|
892
|
-
**代码复杂度评估 (Complexity Assessment)**
|
|
893
|
-
- 认知复杂度热点(最难理解的 1-3 个函数,说明为什么复杂)
|
|
894
|
-
- 耦合度分析(依赖注入 vs 硬编码、循环依赖风险)
|
|
895
|
-
- 可维护性风险(魔法数字、业务逻辑藏在生命周期钩子里、隐式时序耦合)
|
|
896
|
-
- 复杂度等级:低 / 中 / 高(附理由)
|
|
897
|
-
|
|
898
|
-
- `ReviewHistoryEntry` 新增 `impactLevel` 和 `complexityLevel` 字段,历史记录持久化到 `.ai-spec-reviews.json`
|
|
899
|
-
- CLI banner 更新为 `3-pass: architecture + implementation + impact/complexity`
|
|
900
|
-
|
|
901
|
-
---
|
|
902
|
-
|
|
903
|
-
## [0.27.0] 2026-03-26 — 三项工业化底座(Provider 可靠性、文件快照回滚、RunId 结构化日志)
|
|
904
|
-
|
|
905
|
-
### 新增内容
|
|
906
|
-
|
|
907
|
-
**Feature #1 — Provider 统一可靠性封装**
|
|
908
|
-
- 新文件:`core/provider-utils.ts`
|
|
909
|
-
- 新增 `withReliability(fn, opts)` 包装器,覆盖所有 provider 的 `generate()` 调用(Gemini、Claude、OpenAI-compatible、MiMo)
|
|
910
|
-
- 能力:超时(默认 90s)+ 自动重试(2 次,退避 2s/6s)+ 结构化错误分类(`auth` / `rate_limit` / `timeout` / `network` / `provider`)
|
|
911
|
-
- Auth 错误(401/403)不重试,避免无效消耗;限流(429)和网络抖动均自动重试并打印黄色警告
|
|
912
|
-
|
|
913
|
-
**Feature #2 — 文件写入快照与一键回滚**
|
|
914
|
-
- 新文件:`core/run-snapshot.ts`
|
|
915
|
-
- 每次 `create` 运行前,自动备份将被覆盖的文件到 `.ai-spec-backup/<runId>/`
|
|
916
|
-
- 新增命令:`ai-spec restore <runId>`,将本次运行修改的所有文件恢复到原始状态
|
|
917
|
-
- 涵盖 codegen 写入(`code-generator.ts`)和错误修复写入(`error-feedback.ts`)两个落盘点
|
|
918
|
-
- 纯新建文件不备份(无需恢复);同一文件多次写入只备份一次(保留原始版本)
|
|
919
|
-
|
|
920
|
-
**Feature #3 — RunId + 结构化执行日志**
|
|
921
|
-
- 新文件:`core/run-logger.ts`
|
|
922
|
-
- 每次运行生成唯一 RunId(格式:`YYYYMMDD-HHMMSS-xxxx`),打印在 banner 下方
|
|
923
|
-
- 执行阶段、写入文件、错误信息实时写入 `.ai-spec-logs/<runId>.json`
|
|
924
|
-
- 运行结束时打印摘要:RunId + 耗时 + 写入文件数 + 错误数 + 日志路径
|
|
925
|
-
- 有文件被修改时自动提示:`To undo changes: ai-spec restore <runId>`
|
|
926
|
-
|
|
927
|
-
---
|
|
928
|
-
|
|
929
|
-
## [0.26.0] 2026-03-26 — 三项稳定性修复(多仓库 review、并行 batch 容错、tasks JSON 损坏)
|
|
930
|
-
|
|
931
|
-
### 修复内容
|
|
932
|
-
|
|
933
|
-
**Fix #1 — 多仓库模式代码审查 git diff 为空**
|
|
934
|
-
- 文件:`cli/index.ts` → `runSingleRepoPipelineInWorkspace`
|
|
935
|
-
- 问题:`reviewer.reviewCode()` 内部调用 `execSync("git diff")`,运行在 `process.cwd()`(CLI 启动目录)而非当前 repo 的 `workingDir`(可能是 worktree 路径),导致 diff 为空或错误,审查结果没有意义。
|
|
936
|
-
- 修复:在 `reviewCode` 调用前后加 `process.chdir(workingDir)` / `process.chdir(originalDir)`,与单仓库模式保持一致。
|
|
937
|
-
|
|
938
|
-
**Fix #2 — 并行 batch 单任务抛异常导致整层崩溃**
|
|
939
|
-
- 文件:`core/code-generator.ts` → `runApiModeWithTasks` batch 执行循环
|
|
940
|
-
- 问题:`Promise.all(batchResultPromises)` 中任意一个 `executeTask` 抛出未捕获异常(磁盘满、mkdir 失败、provider 超时),整个 `Promise.all` 立即 reject,该层剩余所有任务都被丢弃,没有任何降级处理。
|
|
941
|
-
- 修复:每个 `executeTask` 调用后追加 `.catch((err) => ...)` 返回失败结果对象,确保单任务失败只影响自身,不中断同批次其他任务。
|
|
942
|
-
|
|
943
|
-
**Fix #3 — `loadTasksForSpec` 遇到损坏的 JSON 文件直接崩溃**
|
|
944
|
-
- 文件:`core/task-generator.ts` → `loadTasksForSpec`
|
|
945
|
-
- 问题:如果上次运行中途中断导致 `*-tasks.json` 是不完整的 JSON,`fs.readJson()` 抛出 parse 错误,没有任何 try-catch 包裹,用户看到的是裸 JS 异常而非友好提示。
|
|
946
|
-
- 修复:加 try-catch,catch 块打印"Tasks file corrupt,请重新运行 `ai-spec tasks`"并返回 `null`(触发重新生成),不再崩溃。
|
|
947
|
-
|
|
948
|
-
---
|
|
949
|
-
|
|
950
|
-
## [0.25.0] 2026-03-26 — 三项上下文提取修复(HTTP import、分页示例、工具崩溃误判)
|
|
951
|
-
|
|
952
|
-
### 修复内容
|
|
953
|
-
|
|
954
|
-
**Fix #1 — HTTP import 幻觉防护失效**
|
|
955
|
-
- 文件:`core/frontend-context-loader.ts` → `httpImportRegex`
|
|
956
|
-
- 问题:旧正则只匹配 `axios`、`ky`、`@/` 开头的路径。使用 `import request from '@/utils/request'` 等自定义封装的项目(极其常见)提取结果为 `undefined`,AI 会自由发挥 import 路径。
|
|
957
|
-
- 修复:扩展匹配范围:
|
|
958
|
-
- 所有项目别名:`@/`、`~/`、`#/`、`@@/`
|
|
959
|
-
- 包含 http/request/fetch/client/api 关键词的相对路径
|
|
960
|
-
- 完整 HTTP 库列表:axios、ky、ky-universal、undici、node-fetch、cross-fetch、got、superagent、alova、openapi-fetch
|
|
961
|
-
- 排除 `import type` 语句(它们不是运行时 import)
|
|
962
|
-
|
|
963
|
-
**Fix #2 — 分页示例提取正则永远不匹配**
|
|
964
|
-
- 文件:`core/frontend-context-loader.ts` → 分页提取块
|
|
965
|
-
- 问题:
|
|
966
|
-
1. 接口正则用 `[^}]*` 匹配接口体,遇到嵌套对象 `{ field: { ... } }` 立即截断
|
|
967
|
-
2. 函数正则用 `\n\}` 匹配闭合括号,但缩进的 ` }` 永远不匹配
|
|
968
|
-
3. 只处理 `export function`,遗漏了现代代码中更常见的 `export const x = () =>` 写法
|
|
969
|
-
- 修复:完全重写为**逐行 + 括号深度计数器**的两步提取法:
|
|
970
|
-
- Step 1:找到带分页字段(pageIndex/pageSize/page/…)的接口,用深度计数捕获完整块(支持嵌套对象)
|
|
971
|
-
- Step 2:找到引用该接口的导出函数(同时支持 `export function` 和 `export const = () =>`),同样用深度计数捕获函数体
|
|
972
|
-
|
|
973
|
-
**Fix #3 — `isToolCrash` 把用户代码错误当工具崩溃**
|
|
974
|
-
- 文件:`core/error-feedback.ts`
|
|
975
|
-
- 问题:旧判断条件是"输出包含 ReferenceError/TypeError 且包含 node_modules"。TypeScript 的自动修复测试运行时,测试框架的 stack trace 中也会包含 node_modules,导致用户自己代码里的 ReferenceError 被误判为工具崩溃跳过。
|
|
976
|
-
- 修复:改为精确判断:必须同时满足(1)存在未捕获 JS 错误,且(2)stack trace 中有 `at … node_modules/…` 帧——即错误起源于工具二进制本身,而不仅仅是"输出中某处出现了 node_modules"。
|
|
977
|
-
|
|
978
|
-
---
|
|
979
|
-
|
|
980
|
-
## [0.24.0] 2026-03-25 — 四项质量修复(lesson 计数、export default、impliesRegistration、依赖拓扑排序)
|
|
981
|
-
|
|
982
|
-
### 修复内容
|
|
983
|
-
|
|
984
|
-
**Fix #1 — Lesson count 误计**
|
|
985
|
-
- 文件:`prompts/consolidate.prompt.ts`
|
|
986
|
-
- 问题:`parseConstitutionStats` 中用 `line.startsWith("-")` 统计 §9 教训条数,会将多行教训的子列表项、普通破折号行都计入,导致计数虚高、过早触发 consolidate 警告。
|
|
987
|
-
- 修复:改为正则 `/^-\s+.*\*\*\[\d{4}-\d{2}-\d{2}\]\*\*/` 只匹配带日期徽章的真实教训行。
|
|
988
|
-
|
|
989
|
-
**Fix #2 — `export default function/class` 未捕获**
|
|
990
|
-
- 文件:`core/code-generator.ts` → `extractBehavioralContract`
|
|
991
|
-
- 问题:React 函数组件 (`export default function Foo()`) 和 class 组件只被当作单行 export 处理,消费者看不到函数体内的 return 结构与 props 形状。
|
|
992
|
-
- 修复:在单行 export 分支之前新增完整块捕获逻辑(大括号深度计数),与 `defineStore` 捕获逻辑对称。
|
|
993
|
-
|
|
994
|
-
**Fix #3 — `impliesRegistration` 对 `route`/`view`/`api` 层失效**
|
|
995
|
-
- 文件:`core/code-generator.ts` → `runApiModeWithTasks`
|
|
996
|
-
- 问题:`impliesRegistration` 仅依赖任务文本关键词,若 `route` 层任务描述不含 "route"/"router" 等词,则跳过路由索引更新,新路由永远不注册。
|
|
997
|
-
- 修复:增加 `task.layer === "route" || "view" || "api"` 的层级直接判断,文本关键词作为额外补充。
|
|
998
|
-
|
|
999
|
-
**Fix #4 — `dependencies` 字段从未使用**
|
|
1000
|
-
- 文件:`core/code-generator.ts` + `core/task-generator.ts`
|
|
1001
|
-
- 问题:同层任务始终全量并行,任务 JSON 中声明的 `dependencies` 字段完全被忽略,层内顺序依赖无法保证。
|
|
1002
|
-
- 修复:
|
|
1003
|
-
- 新增 `topoSortLayerTasks(tasks)` 函数,将同层任务按依赖关系分拆为多个批次(batch);同批次内仍并行,批次间顺序执行。
|
|
1004
|
-
- 每批完成后立即更新 `generatedFileCache`,确保后续批次能看到前驱批次的导出。
|
|
1005
|
-
- `task-generator.ts` 同步更新 `TaskLayer` 类型、`LAYER_ORDER`、`layerColors`,补齐 `view` 和 `route` 层。
|
|
1006
|
-
|
|
1007
|
-
---
|
|
1008
|
-
|
|
1009
|
-
## [0.23.0] 2026-03-25 — 文件名幻觉修复(`index.vue` → `TaskManagement.vue`)
|
|
1010
|
-
|
|
1011
|
-
### 根本原因
|
|
1012
|
-
|
|
1013
|
-
路由文件引用的是 `@/views/task-management/index.vue`,但实际文件是 `TaskManagement.vue`。
|
|
1014
|
-
|
|
1015
|
-
**两个叠加 bug:**
|
|
1016
|
-
|
|
1017
|
-
**Bug 1:`generatedFileCache` 不缓存 `views/` 文件**
|
|
1018
|
-
|
|
1019
|
-
cache 的 regex 只覆盖 `src/api*/service*/stores*/composables*/`,视图组件从未被缓存。路由文件生成时,cache 里根本看不到 `TaskManagement.vue` 的存在,只能靠「约定」猜文件名。
|
|
1020
|
-
|
|
1021
|
-
`index.vue` 是全球最常见的视图组件命名(Next.js、Nuxt、Vite 项目大量使用),模型先验概率极高 → 幻觉必然发生。
|
|
1022
|
-
|
|
1023
|
-
**Bug 2:路由文件和视图组件在同一层(`view`)或路由在更早的层**
|
|
1024
|
-
|
|
1025
|
-
即使扩展了 cache regex,如果路由文件和视图组件并行执行,视图的 cache 条目还是不存在。
|
|
1026
|
-
|
|
1027
|
-
### 修复
|
|
1028
|
-
|
|
1029
|
-
**1. 新增 `route` 层(`core/code-generator.ts`)**
|
|
1030
|
-
|
|
1031
|
-
完整的前端六层链:
|
|
1032
|
-
```
|
|
1033
|
-
data → infra → service → api → view → route → test
|
|
1034
|
-
```
|
|
1035
|
-
|
|
1036
|
-
| 层 | 前端含义 |
|
|
1037
|
-
|---|---|
|
|
1038
|
-
| `service` | `src/api/` HTTP 函数 |
|
|
1039
|
-
| `api` | `src/stores/` stores |
|
|
1040
|
-
| `view` | `src/views/` 页面组件 |
|
|
1041
|
-
| `route` | `src/router/routes/` 路由文件 ← 新增 |
|
|
1042
|
-
| `test` | 测试 |
|
|
1043
|
-
|
|
1044
|
-
**2. `view` 文件加入 cache(路径 sentinel,`core/code-generator.ts`)**
|
|
1045
|
-
|
|
1046
|
-
扩展 cache regex:加入 `views?/pages?/`。但不读取文件内容(SFC 300+ 行太大),而是写入固定 sentinel:
|
|
1047
|
-
```
|
|
1048
|
-
// view component — use this exact path for router imports
|
|
1049
|
-
```
|
|
1050
|
-
|
|
1051
|
-
**3. `buildGeneratedFilesSection` 对 view 文件只展示路径标记**
|
|
1052
|
-
|
|
1053
|
-
```
|
|
1054
|
-
// exists: src/views/task-management/TaskManagement.vue
|
|
1055
|
-
```
|
|
1056
|
-
|
|
1057
|
-
路由生成 AI 看到的不是猜测,而是已知事实。
|
|
1058
|
-
|
|
1059
|
-
**4. `tasks.prompt.ts` 四层分离规则**
|
|
1060
|
-
|
|
1061
|
-
含具体 EXAMPLE:
|
|
1062
|
-
```
|
|
1063
|
-
TASK-003 layer:"view" src/views/task-management/TaskManagement.vue
|
|
1064
|
-
TASK-004 layer:"route" src/router/routes/taskManagement.ts ← 此时 cache 有 TaskManagement.vue ✓
|
|
1065
|
-
```
|
|
1066
|
-
|
|
1067
|
-
**5. `codegen.prompt.ts` Rule 17 补充路径规则**
|
|
1068
|
-
|
|
1069
|
-
"// exists:" 条目中的路径是权威来源,不得替换为 `index.vue` 或其他猜测值。
|
|
1070
|
-
|
|
1071
|
-
---
|
|
1072
|
-
|
|
1073
|
-
## [0.22.0] 2026-03-25 — 前端三层分离(`view` 层)彻底根治 API→Store 命名幻觉
|
|
1074
|
-
|
|
1075
|
-
### 根本原因
|
|
1076
|
-
|
|
1077
|
-
v0.21.0 修复了「store → 页面」的命名幻觉,但遗漏了「**api 文件 → store**」这条更上游的依赖链。
|
|
1078
|
-
|
|
1079
|
-
v0.21.0 的 `tasks.prompt.ts` 写的是:
|
|
1080
|
-
```
|
|
1081
|
-
"service" — API call files (src/api/) AND stores (src/stores/)
|
|
1082
|
-
```
|
|
1083
|
-
|
|
1084
|
-
两者被分配到**同一层**(`service`),并行执行。生成 `taskStore.ts` 时,`taskManagement.ts`(exports `getTaskList`)还没写完,不在 cache 里。Store AI 只能猜 `getTasks`。
|
|
1085
|
-
|
|
1086
|
-
**完整的前端命名幻觉依赖链:**
|
|
1087
|
-
```
|
|
1088
|
-
src/apis/taskManagement.ts (layer: service)
|
|
1089
|
-
↓ store 需要知道这里有哪些函数
|
|
1090
|
-
src/stores/taskStore.ts (layer: ???) ← 必须在 service 之后
|
|
1091
|
-
↓ 页面需要知道这里有哪些 actions
|
|
1092
|
-
src/views/TaskManagement.vue (layer: ???) ← 必须在 store 之后
|
|
1093
|
-
```
|
|
1094
|
-
|
|
1095
|
-
如果三者在同一层或 store 与 api 同层,幻觉必然发生。
|
|
1096
|
-
|
|
1097
|
-
### 修复
|
|
1098
|
-
|
|
1099
|
-
**1. 新增 `view` 层(`core/code-generator.ts`)**
|
|
1100
|
-
|
|
1101
|
-
`LAYER_ORDER` 从 5 层扩展到 6 层:
|
|
1102
|
-
```
|
|
1103
|
-
["data", "infra", "service", "api", "view", "test"]
|
|
1104
|
-
```
|
|
1105
|
-
|
|
1106
|
-
映射关系:
|
|
1107
|
-
| 层 | 后端含义 | 前端含义 |
|
|
1108
|
-
|---|---|---|
|
|
1109
|
-
| `service` | 业务逻辑 | API call 函数(`src/api/` 或 `src/apis/`) |
|
|
1110
|
-
| `api` | 路由/控制器 | Pinia/Vuex stores(`src/stores/`) |
|
|
1111
|
-
| `view` | (后端不用) | 页面/视图组件(`src/views/`, `src/pages/`) |
|
|
1112
|
-
| `test` | 测试 | 测试 |
|
|
1113
|
-
|
|
1114
|
-
**2. `tasks.prompt.ts` 三层分离规则**
|
|
1115
|
-
|
|
1116
|
-
明确的层级分配规则,含错误原因解释:
|
|
1117
|
-
```
|
|
1118
|
-
service → src/apis/*.ts (HTTP 函数,如 getTaskList)
|
|
1119
|
-
api → src/stores/*.ts (store 调用 service 层函数 — service 层已在 cache 里)
|
|
1120
|
-
view → src/views/*.vue (页面调用 store — api 层已在 cache 里)
|
|
1121
|
-
```
|
|
1122
|
-
|
|
1123
|
-
附带具体 EXAMPLE 展示正确的三 task 写法。
|
|
1124
|
-
|
|
1125
|
-
### 效果
|
|
1126
|
-
|
|
1127
|
-
完整的三级 cache 保障:
|
|
1128
|
-
```
|
|
1129
|
-
service 层完成 → cache 有 getTaskList ← store 生成时看得到 ✓
|
|
1130
|
-
api 层完成 → cache 有 fetchTasks ← 页面生成时看得到 ✓
|
|
1131
|
-
```
|
|
1132
|
-
|
|
1133
|
-
---
|
|
1134
|
-
|
|
1135
|
-
## [0.21.0] 2026-03-25 — Store 行为契约提取修复(`fetchTasks` → `fetchTaskList` 幻觉根治)
|
|
1136
|
-
|
|
1137
|
-
### 根本原因分析
|
|
1138
|
-
|
|
1139
|
-
触发条件:**Pinia / Vuex / Zustand store 文件被生成后,消费该 store 的页面/组件在同一轮继续生成时,函数名出现幻觉**(如 `fetchTasks` 被猜成 `fetchTaskList`、`loadTasks`、`fetchTaskData`)。
|
|
1140
|
-
|
|
1141
|
-
**两个叠加 bug:**
|
|
1142
|
-
|
|
1143
|
-
**Bug 1:`extractBehavioralContract` 对 store 文件是空壳**
|
|
1144
|
-
|
|
1145
|
-
Pinia composition API store 的典型结构:
|
|
1146
|
-
```typescript
|
|
1147
|
-
export const useTaskStore = defineStore('task', () => {
|
|
1148
|
-
const tasks = ref<Task[]>([])
|
|
1149
|
-
async function fetchTasks() { ... }
|
|
1150
|
-
return { tasks, fetchTasks } // ← 这里是真正的公开 API
|
|
1151
|
-
})
|
|
1152
|
-
```
|
|
1153
|
-
|
|
1154
|
-
`extractBehavioralContract` 的 `export const ...` 规则只捕获**第一行**:
|
|
1155
|
-
```
|
|
1156
|
-
export const useTaskStore = defineStore('task', () => {
|
|
1157
|
-
```
|
|
1158
|
-
`return { tasks, fetchTasks }` 完全丢失。消费方 AI 看到的是空壳,只能靠直觉猜函数名——而 GPT/Claude 类模型的直觉会把 `fetchTasks` 猜成 `fetchTaskList`("更完整的命名风格")。
|
|
1159
|
-
|
|
1160
|
-
**Bug 2:store 和页面在同一 task layer 并行执行时,cache 快照里没有 store**
|
|
1161
|
-
|
|
1162
|
-
cache 更新逻辑是在**整层完成后**统一写入,确保下一层看到完整结果。但如果 task generator AI 把 store 和消费 store 的页面分配到同一层(如都是 `service` 层),它们并行执行,页面生成时 cache 里根本没有 store 内容。
|
|
1163
|
-
|
|
1164
|
-
---
|
|
1165
|
-
|
|
1166
|
-
### 修复方案
|
|
1167
|
-
|
|
1168
|
-
**1. `extractBehavioralContract` 新增两个捕获模式(`core/code-generator.ts`)**
|
|
1169
|
-
|
|
1170
|
-
- `export const X = defineStore(` / `createStore(` / `createSlice(` — 使用**括号深度计数器**完整捕获整个 `defineStore(...)` 调用(含 state/actions/getters 定义体)
|
|
1171
|
-
- `return { ... }` — 使用**大括号深度计数器**完整捕获 return 对象(Pinia composition API 的公开 API 列表),并添加注释行 `// public API (return object):` 提示 AI 这是权威命名来源
|
|
1172
|
-
|
|
1173
|
-
**2. `buildGeneratedFilesSection` 对 store/composable 文件传全文内容(`core/code-generator.ts`)**
|
|
1174
|
-
|
|
1175
|
-
对路径匹配 `src/stores?/` 或 `src/composables?/` 的文件,不再调用 `extractBehavioralContract`,直接传入完整文件内容。Store 文件通常 50-200 行,context 成本可接受,且整个文件就是 API 合约。
|
|
1176
|
-
|
|
1177
|
-
```typescript
|
|
1178
|
-
const isStoreOrComposable = /src[\\/](stores?|composables?)[\\/]/i.test(filePath);
|
|
1179
|
-
lines.push(isStoreOrComposable ? content : extractBehavioralContract(content));
|
|
1180
|
-
```
|
|
1181
|
-
|
|
1182
|
-
**3. 强化 Rule 17(`prompts/codegen.prompt.ts`)**
|
|
1183
|
-
|
|
1184
|
-
补充常见幻觉模式的负例:
|
|
1185
|
-
```
|
|
1186
|
-
fetchTasks → fetchTaskList ✗ fetchTaskData ✗ fetchTaskAll ✗
|
|
1187
|
-
fetchTasks → getTasks ✗ loadTasks ✗ queryTasks ✗
|
|
1188
|
-
createTask → createTasks ✗
|
|
1189
|
-
```
|
|
1190
|
-
以及 Pinia 专项说明:"// public API (return object):" 区段展示的是 EVERY available action name。
|
|
1191
|
-
|
|
1192
|
-
**4. 前端层级顺序规则(`prompts/tasks.prompt.ts`)**
|
|
1193
|
-
|
|
1194
|
-
新增 CRITICAL 规则:在同一功能中,**store 必须在 `service` 层,消费该 store 的页面/组件必须在 `api` 层**。打破同层并行依赖,确保页面生成时 cache 已有 store 的完整内容。
|
|
1195
|
-
|
|
1196
|
-
---
|
|
1197
|
-
|
|
1198
|
-
### 效果
|
|
1199
|
-
|
|
1200
|
-
修复后 cache 区段对 Pinia composition API store 的展示从:
|
|
1201
|
-
```
|
|
1202
|
-
export const useTaskStore = defineStore('task', () => {
|
|
1203
|
-
```
|
|
1204
|
-
变为:
|
|
1205
|
-
```
|
|
1206
|
-
export const useTaskStore = defineStore('task', () => {
|
|
1207
|
-
const tasks = ref([])
|
|
1208
|
-
...
|
|
1209
|
-
// public API (return object):
|
|
1210
|
-
return {
|
|
1211
|
-
tasks,
|
|
1212
|
-
loading,
|
|
1213
|
-
fetchTasks,
|
|
1214
|
-
createTask,
|
|
1215
|
-
updateTaskStatus,
|
|
1216
|
-
}
|
|
1217
|
-
```
|
|
1218
|
-
消费方 AI 能看到 `fetchTasks` 的精确名字,无需猜测。
|
|
1219
|
-
|
|
1220
|
-
---
|
|
1221
|
-
|
|
1222
|
-
## [0.20.0] 2026-03-25 — 一键 Mock 联调(`--serve` / `--restore`)
|
|
1223
|
-
|
|
1224
|
-
### 功能:Mock Server 自动启动 + 前端 Proxy 自动 patch
|
|
1225
|
-
|
|
1226
|
-
**背景**:代码生成完成后,前端要联调需要手动三步:① 启动 Mock 服务器、② 在前端框架配置 Proxy、③ 启动前端 Dev Server。每次都要做一遍,且 Proxy 修改要记得恢复。
|
|
1227
|
-
|
|
1228
|
-
**方案**:新增 `--serve` / `--restore` 工作流,做到一条命令完成所有操作,联调结束一条命令还原。
|
|
1229
|
-
|
|
1230
|
-
---
|
|
1231
|
-
|
|
1232
|
-
#### `ai-spec mock --serve --frontend <path>`
|
|
1233
|
-
|
|
1234
|
-
在后台启动 Mock 服务器,并自动 patch 前端 Proxy:
|
|
1235
|
-
|
|
1236
|
-
- **Vite 项目**:生成 `vite.config.ai-spec-mock.ts`(使用 `mergeConfig` 动态合并基础配置,非破坏性),在 `package.json` 添加 `"dev:mock"` 脚本 → 执行 `npm run dev:mock`
|
|
1237
|
-
- **CRA 项目**:临时修改 `package.json` 的 `"proxy"` 字段(原值存入 lock 文件),执行 `npm start`
|
|
1238
|
-
- **Next.js / webpack**:自动 patch 不适用,打印手动配置说明
|
|
1239
|
-
|
|
1240
|
-
所有操作记录在 `<frontend-dir>/.ai-spec-mock.lock.json`(含 Mock 服务器 PID),供 `--restore` 使用。
|
|
1241
|
-
|
|
1242
|
-
#### `ai-spec mock --restore --frontend <path>`
|
|
1243
|
-
|
|
1244
|
-
逐一撤销 lock 文件中记录的所有操作,并向 Mock 服务器进程发送 SIGTERM。
|
|
1245
|
-
|
|
1246
|
-
#### `ai-spec create --serve`(工作区模式)
|
|
1247
|
-
|
|
1248
|
-
多 Repo Pipeline 完成后,自动触发:
|
|
1249
|
-
1. 为后端 repo 生成 Mock Assets
|
|
1250
|
-
2. 后台启动 Mock 服务器
|
|
1251
|
-
3. 为前端 repo patch Proxy
|
|
1252
|
-
4. 打印前端 Dev Server 启动命令
|
|
1253
|
-
|
|
1254
|
-
```bash
|
|
1255
|
-
ai-spec create "用户登录" --serve
|
|
1256
|
-
# → [W1..W4] 后端 + 前端 Pipeline
|
|
1257
|
-
# → ✔ Mock 服务器启动 (PID 12345) → http://localhost:3001
|
|
1258
|
-
# → ✔ 前端 Proxy patched (vite)
|
|
1259
|
-
# → Ready! cd ../frontend && npm run dev:mock
|
|
1260
|
-
```
|
|
1261
|
-
|
|
1262
|
-
---
|
|
1263
|
-
|
|
1264
|
-
#### 实现细节
|
|
1265
|
-
|
|
1266
|
-
**新增文件/函数(`core/mock-server-generator.ts`):**
|
|
1267
|
-
|
|
1268
|
-
| 函数 | 说明 |
|
|
1269
|
-
|---|---|
|
|
1270
|
-
| `applyMockProxy(frontendDir, mockPort, endpoints?)` | 检测前端框架,执行对应 patch 操作,写入 lock 文件 |
|
|
1271
|
-
| `restoreMockProxy(frontendDir)` | 读取 lock 文件,逐一撤销,删除 lock 文件 |
|
|
1272
|
-
| `startMockServerBackground(serverJsPath, port)` | `spawn` 后台 detached 进程,返回 PID |
|
|
1273
|
-
| `saveMockServerPid(frontendDir, pid)` | 将 PID 写入已有 lock 文件 |
|
|
1274
|
-
|
|
1275
|
-
**`generateViteMockConfigTs`** 生成的 `vite.config.ai-spec-mock.ts` 通过动态 `import()` 加载基础配置,支持 object / function 两种导出形式:
|
|
1276
|
-
|
|
1277
|
-
```typescript
|
|
1278
|
-
export default defineConfig(async (env) => {
|
|
1279
|
-
const mod = await import('./vite.config');
|
|
1280
|
-
const baseConfigOrFn = mod.default;
|
|
1281
|
-
const baseConfig = typeof baseConfigOrFn === 'function'
|
|
1282
|
-
? await baseConfigOrFn(env)
|
|
1283
|
-
: baseConfigOrFn;
|
|
1284
|
-
return mergeConfig(baseConfig ?? {}, { server: { proxy: { ... } } });
|
|
1285
|
-
});
|
|
1286
|
-
```
|
|
1287
|
-
|
|
1288
|
-
---
|
|
1289
|
-
|
|
1290
|
-
## [0.19.0] 2026-03-25 — 错误解析重写 · 行为契约完整提取 · Auto Gate 修复
|
|
1291
|
-
|
|
1292
|
-
### 1. 错误解析重写(`core/error-feedback.ts`)
|
|
1293
|
-
|
|
1294
|
-
**问题**:`parseErrors` 取输出最后 80 行。TypeScript / Jest 错误的结构是"具体 file:line 错误在前,摘要在后",`slice(-80)` 恰好丢掉了最前面真正有文件路径的错误行,只留下摘要——AI 修的是摘要里说的东西,不是实际的错误位置。2 轮结束后 branch 仍有编译错误。
|
|
1295
|
-
|
|
1296
|
-
**修复**:扫全文,**只保留含 `file:line` 模式的行**,过滤掉所有摘要行、noise 行。遇到 20 条即停(break),确保取到的是最早出现的 20 个可操作错误,message 截断从 300 → 400 字符避免切掉关键类型信息。
|
|
1297
|
-
|
|
1298
|
-
```
|
|
1299
|
-
// Before: slice(-80) — 取末尾,丢掉最前面的具体报错
|
|
1300
|
-
src/services/auth.ts:15:3 - error TS2345... ← 丢失
|
|
1301
|
-
...
|
|
1302
|
-
Found 12 errors. ← 被"修复"的是这里
|
|
1303
|
-
|
|
1304
|
-
// After: scan full, filter by file:line — 取有路径的行
|
|
1305
|
-
src/services/auth.ts:15:3 - error TS2345... ← ✔ 捕获
|
|
1306
|
-
src/controllers/user.ts:42:1 - error TS2304 ← ✔ 捕获
|
|
1307
|
-
```
|
|
1308
|
-
|
|
1309
|
-
### 2. 行为契约完整提取(`core/code-generator.ts`)
|
|
1310
|
-
|
|
1311
|
-
**问题**:`extractBehavioralContract` 对 `interface` / `type` 只捕获开头一行(`export interface UserService {`),body 里的所有方法签名、字段定义全部丢失。Task B 看到的是空壳,照样幻觉方法名和参数类型。
|
|
1312
|
-
|
|
1313
|
-
**修复**:`interface` / `type X = {` / `class` / `enum` 使用大括号深度计数器,**完整捕获多行块**直到对应的 `}`。单行的 `export function` / `export const` 保持原有行为。
|
|
1314
|
-
|
|
1315
|
-
```typescript
|
|
1316
|
-
// Before: 只有一行
|
|
1317
|
-
export interface UserService {
|
|
1318
|
-
|
|
1319
|
-
// After: 完整 interface body
|
|
1320
|
-
export interface UserService {
|
|
1321
|
-
getUser(id: string): Promise<User | null>;
|
|
1322
|
-
createUser(dto: CreateUserDto): Promise<User>;
|
|
1323
|
-
deleteUser(id: string): Promise<void>;
|
|
1324
|
-
}
|
|
1325
|
-
export type CreateUserDto = {
|
|
1326
|
-
name: string;
|
|
1327
|
-
email: string;
|
|
1328
|
-
role: 'admin' | 'user';
|
|
1329
|
-
}
|
|
1330
|
-
```
|
|
1331
|
-
|
|
1332
|
-
### 3. Auto 模式 Gate 修复(`cli/index.ts`)
|
|
1333
|
-
|
|
1334
|
-
**问题**:`if (!opts.auto && !opts.skipAssessment)` 让 `minSpecScore` 在 `--auto` 模式下完全失效。团队配置了 `minSpecScore: 7`,CI 跑 `--auto` 照样通过,没有任何警告。
|
|
1335
|
-
|
|
1336
|
-
**修复**:`--auto` 模式下,如果 `minSpecScore > 0`,**仍然运行 assessment 并强制执行 Gate**(只跳过交互式展示 scorecard)。`--force` 仍可绕过。
|
|
1337
|
-
|
|
1338
|
-
```
|
|
1339
|
-
# 配置了 minSpecScore: 7 的项目
|
|
1340
|
-
ai-spec create --auto → 运行 assessment,score=5 → exit(1),打印原因
|
|
1341
|
-
ai-spec create --auto --force → 运行 assessment,score=5 → 黄色警告,继续
|
|
1342
|
-
ai-spec create --auto(未配置 minSpecScore) → 跳过 assessment,行为不变
|
|
1343
|
-
```
|
|
1344
|
-
|
|
1345
|
-
---
|
|
1346
|
-
|
|
1347
|
-
## [0.18.0] 2026-03-25 — ai-spec learn · 行为契约注入 · Approval Gate 硬门槛
|
|
1348
|
-
|
|
1349
|
-
### 1. `ai-spec learn` — 零摩擦知识注入
|
|
1350
|
-
|
|
1351
|
-
**背景**:宪法 §9 只收录通过 `ai-spec review` 触发的教训,依赖工具覆盖率(100% 使用 ai-spec review 在实际团队几乎不可能)。混用 Cursor / Copilot 的决策和踩坑永远不会回流。
|
|
1352
|
-
|
|
1353
|
-
**新增命令**:`ai-spec learn "<lesson>"`
|
|
1354
|
-
|
|
1355
|
-
```bash
|
|
1356
|
-
ai-spec learn "所有新接口必须走 validateRequest 中间件,上次某 PR 遗漏导致生产 bug"
|
|
1357
|
-
ai-spec learn # 无参数时进入交互式输入
|
|
1358
|
-
```
|
|
1359
|
-
|
|
1360
|
-
- 直接 append 到 `.ai-spec-constitution.md` §9,无需 AI 调用,无需完整 review 流程
|
|
1361
|
-
- 自动去重(检查前 60 字符是否已存在相似条目)
|
|
1362
|
-
- §9 超过 8 条时提示 `--consolidate`
|
|
1363
|
-
|
|
1364
|
-
**新增函数**(`core/knowledge-memory.ts`):`appendDirectLesson(projectRoot, lessonText)`
|
|
1365
|
-
|
|
1366
|
-
### 2. Generated File Cache — 行为契约注入
|
|
1367
|
-
|
|
1368
|
-
**背景**:0.17.0 解决了函数名幻觉(名称层)。但 Task A 的 service 校验了某字段,Task B 的 API 层完全不知道这个校验存在,命名正确但逻辑前后矛盾,lint/test 不一定能抓住。
|
|
1369
|
-
|
|
1370
|
-
**升级**(`core/code-generator.ts`):将 `extractExportSignatures()` 替换为 `extractBehavioralContract()`:
|
|
1371
|
-
|
|
1372
|
-
```typescript
|
|
1373
|
-
// Before: 只提取 export 行(名称层)
|
|
1374
|
-
export function createTask(dto: CreateTaskDto): Promise<Task>
|
|
1375
|
-
|
|
1376
|
-
// After: 同时提取 throw/validation 模式(契约层)
|
|
1377
|
-
export function createTask(dto: CreateTaskDto): Promise<Task>
|
|
1378
|
-
export function updateTask(id: string, dto: UpdateTaskDto): Promise<Task>
|
|
1379
|
-
|
|
1380
|
-
// Error contracts (throws / validation):
|
|
1381
|
-
// throw new AppError('TASK_TITLE_REQUIRED', 400)
|
|
1382
|
-
// throw new AppError('PROJECT_NOT_FOUND', 404)
|
|
1383
|
-
```
|
|
1384
|
-
|
|
1385
|
-
后续 task 注入的 context 不仅知道"叫什么",还知道"校验什么、会抛什么错",有效防止跨 task 的行为契约幻觉。
|
|
1386
|
-
|
|
1387
|
-
### 3. Approval Gate 可配置硬门槛
|
|
1388
|
-
|
|
1389
|
-
**背景**:spec-assessor 是建议性的、不阻断的——赶时间的工程师直接 Proceed,错误检测时机太晚。
|
|
1390
|
-
|
|
1391
|
-
**新增配置项**(`.ai-spec.json`):`minSpecScore`(默认 0 = 禁用)
|
|
1392
|
-
|
|
1393
|
-
```bash
|
|
1394
|
-
ai-spec config --min-spec-score 7 # 设置最低分 7/10
|
|
1395
|
-
```
|
|
1396
|
-
|
|
1397
|
-
当 `overallScore < minSpecScore` 时:
|
|
1398
|
-
- 打印红色错误信息,列出失败原因和当前阈值
|
|
1399
|
-
- `process.exit(1)` 阻断流程
|
|
1400
|
-
- `--force` flag 可强制绕过(同时输出黄色警告)
|
|
1401
|
-
|
|
1402
|
-
**设计原则**:默认关闭,不破坏现有用户工作流;团队可按需在 `.ai-spec.json` 开启,阈值完全可配置。
|
|
1403
|
-
|
|
1404
|
-
---
|
|
1405
|
-
|
|
1406
|
-
## [0.17.0] 2026-03-24 — 宪法全文注入 · Export 精准缓存 · 宪法长度警告
|
|
1407
|
-
|
|
1408
|
-
### 1. 宪法全文注入(移除硬截断)
|
|
1409
|
-
|
|
1410
|
-
**问题**:宪法在所有 prompt 中存在硬截断(`codegen`/`task-generator`/`spec-assessor`/`update` 各处分别为 1500–2000 字符),§9 最新教训恰好位于宪法末尾,最容易被截掉——工具越用越长的宪法反而越来越被忽视。
|
|
1411
|
-
|
|
1412
|
-
**修复**(涉及 6 处):
|
|
1413
|
-
- `core/code-generator.ts` — 代码生成 prompt 中的宪法注入
|
|
1414
|
-
- `cli/index.ts` — update 命令中的宪法注入
|
|
1415
|
-
- `prompts/update.prompt.ts` — update prompt 构建函数
|
|
1416
|
-
- `core/task-generator.ts` — task 生成 prompt
|
|
1417
|
-
- `core/spec-assessor.ts` — Spec 质量评估 prompt
|
|
1418
|
-
- `core/context-loader.ts` — 项目文件预览从 800 → 2000 字符
|
|
1419
|
-
|
|
1420
|
-
现代模型(Claude/Gemini/Qwen3)上下文窗口充足,宪法通常 3000–8000 字符,全文注入不会造成负担,但能确保 §9 始终被 AI 读到。
|
|
1421
|
-
|
|
1422
|
-
### 2. Generated File Cache — Export 精准提取
|
|
1423
|
-
|
|
1424
|
-
**问题**:跨 task 一致性保障依赖 `generatedFileCache`,原实现截取每个缓存文件的前 800 字符注入后续 task prompt。对于超过 30 行的 service/api 文件,大量 export 函数名落在 800 字符之外,跨 task 函数名幻觉问题依然存在于大文件场景。
|
|
1425
|
-
|
|
1426
|
-
**修复**(`core/code-generator.ts`):新增 `extractExportSignatures()` 函数,从文件全文中提取**所有以 `export` 开头的声明行**,注入后续 task prompt。无论文件长度,所有导出名称完整可见;对无显式 export 的文件(CommonJS)回退到前 3000 字符。
|
|
1427
|
-
|
|
1428
|
-
```typescript
|
|
1429
|
-
// Before: 取前 800 字符,大文件的 export 被截掉
|
|
1430
|
-
content.slice(0, 800)
|
|
1431
|
-
|
|
1432
|
-
// After: 提取所有 export 声明行,精准且不浪费 token
|
|
1433
|
-
export function getUserList(...): Promise<...>
|
|
1434
|
-
export function createUser(...): Promise<...>
|
|
1435
|
-
export const updateUser = ...
|
|
1436
|
-
// ...全部导出,不含实现细节
|
|
1437
|
-
```
|
|
1438
|
-
|
|
1439
|
-
### 3. 宪法长度警告
|
|
1440
|
-
|
|
1441
|
-
**新增**:当宪法超过 **6,000 字符**时,`create` / `update` / workspace 各命令加载上下文后自动输出提示:
|
|
1442
|
-
|
|
1443
|
-
```
|
|
1444
|
-
⚠ Constitution is long (8,432 chars). Consider running: ai-spec init --consolidate
|
|
1445
|
-
```
|
|
1446
|
-
|
|
1447
|
-
设计原则:不阻断流程,纯提示性;帮助用户在宪法真正影响 AI 注意力之前主动整合,而不是等到效果已经变差才发现。
|
|
1448
|
-
|
|
1449
|
-
---
|
|
1450
|
-
|
|
1451
|
-
## [0.16.0] 2026-03-24 — Spec 质量预评估 · 分层代码审查 · TDD 模式
|
|
1452
|
-
|
|
1453
|
-
### 1. Spec 质量预评估(`core/spec-assessor.ts`, `prompts/spec-assess.prompt.ts`)
|
|
1454
|
-
|
|
1455
|
-
- **触发时机**:`ai-spec create` 非 `--auto` 模式下,在 Approval Gate 之前自动运行(可用 `--skip-assessment` 跳过)
|
|
1456
|
-
- **评估维度**(0-10 分):
|
|
1457
|
-
- `coverageScore` — 错误处理、边界条件、auth 规则覆盖完整度
|
|
1458
|
-
- `clarityScore` — API 契约是否足够清晰,可供 DSL 可靠提取
|
|
1459
|
-
- `constitutionScore` — 是否与项目宪法保持一致(命名、错误码、中间件约定)
|
|
1460
|
-
- **输出**:评分条形图 + 具体问题列表 + 改进建议 + DSL 可提取性预警
|
|
1461
|
-
- **设计原则**:纯建议性,不阻断流程;让工程师在进入 Approval Gate 前就看到结构性问题
|
|
1462
|
-
|
|
1463
|
-
### 2. 分层代码审查(`core/reviewer.ts`, `prompts/codegen.prompt.ts`)
|
|
1464
|
-
|
|
1465
|
-
- **两遍审查替代单次审查**:
|
|
1466
|
-
- **Pass 1(架构层)**:聚焦 Spec 合规性、层职责分离、安全权限、数据模型完整性 — 不评论代码细节
|
|
1467
|
-
- **Pass 2(实现层)**:聚焦输入校验、错误处理、边界条件、代码模式 — 不重复架构层发现
|
|
1468
|
-
- **历史问题对比**:读取 `.ai-spec-reviews.json` 中最近 5 次审查,将 top issues 注入 Pass 2 prompt,触发「历史问题复现」检查
|
|
1469
|
-
- **评分趋势记录**:每次审查结束后,评分 + top issues 写入 `.ai-spec-reviews.json`(保留最近 20 条);`ai-spec review` 命令在审查后自动打印趋势图
|
|
1470
|
-
- **constructor 新增 `projectRoot` 参数**:reviewer 实例绑定项目根目录,历史文件路径准确
|
|
1471
|
-
|
|
1472
|
-
### 3. TDD 模式(`--tdd` flag, `core/test-generator.ts`, `prompts/testgen.prompt.ts`)
|
|
1473
|
-
|
|
1474
|
-
- **新增 `--tdd` flag**:`ai-spec create --tdd`
|
|
1475
|
-
- **流程变化**:
|
|
1476
|
-
```
|
|
1477
|
-
普通模式:DSL → codegen → 测试骨架(空断言)→ error feedback
|
|
1478
|
-
TDD 模式:DSL → TDD 测试(真实断言,预期 FAIL)→ codegen → error feedback(最多 3 轮,以测试通过为目标)
|
|
1479
|
-
```
|
|
1480
|
-
- **TDD 测试 vs 骨架**:
|
|
1481
|
-
- 骨架(原):`it('should create task', () => { /* TODO */ })`
|
|
1482
|
-
- TDD(新):`expect(res.status).toBe(201); expect(res.body.data.id).toBeDefined(); expect(res.body.code).toBe('MISSING_FIELD')`
|
|
1483
|
-
- **新增 `tddTestGenSystemPrompt`**:要求 AI 生成可运行的断言,以 supertest 做 HTTP 集成测试,所有 endpoint 的成功/校验失败/auth 失败路径全部覆盖
|
|
1484
|
-
- **`TestGenerator.generateTdd()`**:新方法,使用 TDD prompt,由 `cli/index.ts` 在代码生成之前调用
|
|
1485
|
-
|
|
1486
|
-
---
|
|
1487
|
-
|
|
1488
|
-
## [0.15.0] 2026-03-24 — 并行 Task 执行(同层 tasks 并发)
|
|
1489
|
-
|
|
1490
|
-
### 核心变更 (`core/code-generator.ts`)
|
|
1491
|
-
|
|
1492
|
-
**问题**:`runApiModeWithTasks` 完全串行 — 一个 task 完成才开始下一个。6 个 service 层 task 每个 30s,总耗时 3 分钟。同层 task 之间通常没有真实依赖,浪费严重。
|
|
1493
|
-
|
|
1494
|
-
**实现**:按 `data → infra → service → api → test` 顺序分层,每层内所有 pending task 通过 `Promise.all` 并发执行:
|
|
1495
|
-
|
|
1496
|
-
```
|
|
1497
|
-
旧(串行):
|
|
1498
|
-
TASK-002 → TASK-003 → TASK-004 → TASK-005 → ... (每个 30s = 2.5 分钟)
|
|
1499
|
-
|
|
1500
|
-
新(同层并行):
|
|
1501
|
-
TASK-002 ┐
|
|
1502
|
-
TASK-003 ┤ Promise.all (~30s) → TASK-005 ┐
|
|
1503
|
-
TASK-004 ┘ TASK-006 ┘ (~30s)
|
|
1504
|
-
```
|
|
1505
|
-
|
|
1506
|
-
**关键设计决策**:
|
|
1507
|
-
1. **Shared config 文件排除并行**:`routes/index.ts` 等注册文件从各 task 的 filePlan 中剥离,改为层完成后统一执行一次 batch update(携带该层所有新建模块名),避免多个 AI 调用同时覆写同一文件
|
|
1508
|
-
2. **Cache 快照隔离**:同层所有 task 拿到的是本层开始前的 `generatedFileCache` 快照,避免同层 task 之间的竞态;层结束后统一写入 cache,供下一层使用
|
|
1509
|
-
3. **并行输出前缀**:`generateFiles` 新增 `taskLabel` 参数,并行模式下每行输出加 `[TASK-XXX]` 前缀,防止多 task 输出行交叉混乱
|
|
1510
|
-
4. **done task 先显示**:已完成 task 在进入层循环前统一展示跳过,进度条状态清晰
|
|
1511
|
-
|
|
1512
|
-
**输出示例**:
|
|
1513
|
-
```
|
|
1514
|
-
[████████░░░░░░░░░░░░] 40% ⚡ Layer [service] 🔧 — 3 tasks running in parallel
|
|
1515
|
-
[TASK-002] + src/services/userService.ts ✔
|
|
1516
|
-
[TASK-003] + src/services/productService.ts ✔
|
|
1517
|
-
[TASK-004] + src/services/orderService.ts ✔
|
|
1518
|
-
|
|
1519
|
-
✔ TASK-002 🔧 Create user service — 1/1 files
|
|
1520
|
-
✔ TASK-003 🔧 Create product service — 1/1 files
|
|
1521
|
-
✔ TASK-004 🔧 Create order service — 1/1 files
|
|
1522
|
-
|
|
1523
|
-
+ updating shared config: src/router/routes/index.ts [route-index]
|
|
1524
|
-
```
|
|
1525
|
-
|
|
1526
|
-
---
|
|
1527
|
-
|
|
1528
|
-
## [0.14.5] 2026-03-24 — 前端分页参数一致性:自动提取并注入项目真实分页 pattern
|
|
1529
|
-
|
|
1530
|
-
### 分页参数 ground-truth 注入 (`core/frontend-context-loader.ts`)
|
|
1531
|
-
|
|
1532
|
-
- **问题**:生成的列表接口使用 `page`/`size` + GET `{ params }`,但项目实际使用 `pageIndex`/`pageSize` + POST body,导致前端运行时分页失效
|
|
1533
|
-
- **根因**:
|
|
1534
|
-
1. `src/apis/` 目录不在 API 文件扫描路径中 → `httpClientImport` 提取失败 → AI 回退到 raw `axios` 而非 `http from '@/utils/http'`
|
|
1535
|
-
2. `FrontendContext` 无分页 pattern 字段 → AI 使用通用默认值而非项目约定
|
|
1536
|
-
- **修复**:
|
|
1537
|
-
1. 将 `"src/apis/**/*.{ts,js}"` 加入 `apiFilePatterns`,修复 `httpClientImport` 提取覆盖缺失问题
|
|
1538
|
-
2. 新增 `paginationExample?: string` 字段至 `FrontendContext`
|
|
1539
|
-
3. 新增分页 pattern 提取逻辑:扫描所有 API 文件,找到包含 `pageIndex`/`pageSize`/`pageNum`/`current`/`page`/`size` 等字段的 interface,并提取使用该 interface 的第一个导出函数作为示例
|
|
1540
|
-
4. `buildFrontendContextSection()` 注入时使用强制标签:`"COPY THIS EXACTLY for all paginated list APIs — use IDENTICAL parameter names, HTTP method, and call style"`
|
|
1541
|
-
|
|
1542
|
-
---
|
|
1543
|
-
|
|
1544
|
-
## [0.14.4] 2026-03-24 — 前端出码率提升:路由 Index 自动注册 & 跨 Task 函数名一致性
|
|
1545
|
-
|
|
1546
|
-
### 1. 路由模块 Index 注册特指化 (`core/code-generator.ts`)
|
|
1547
|
-
|
|
1548
|
-
- **问题**:`impliesRegistration` 自动注入 `routes/index.ts` 时,purpose 只写 `"Register/update route-index entries for the new feature"` — AI 不知道具体要 import 哪个模块名,经常不修改 index 文件
|
|
1549
|
-
- **修复**:注入 `route-index` / `store-index` 类文件时,从同 task 正在新建的文件中提取模块名,生成具体描述:
|
|
1550
|
-
> `"Add to this file: import taskManagement from their respective paths and register them in the export/default array. Do NOT remove any existing imports."`
|
|
1551
|
-
|
|
1552
|
-
### 2. 跨 Task 函数名一致性(Generated File Cache)(`core/code-generator.ts`)
|
|
1553
|
-
|
|
1554
|
-
- **根本原因**:API 文件(Task A 生成 `src/apis/task.ts`,导出 `getTaskList`)与路由文件(Task B 生成)是两个完全独立的 AI 调用,Task B 看不到 Task A 写了什么,只能靠 DSL endpoint ID 猜函数名 → 猜出 `getTasks` 而非 `getTaskList`
|
|
1555
|
-
- **修复**:
|
|
1556
|
-
1. 新增 `buildGeneratedFilesSection(cache)` — 将已生成文件的内容格式化为 `=== Files Already Generated in This Run ===` 区段注入后续 task
|
|
1557
|
-
2. 每个 task 完成后,将写入的 `src/api*` / `src/service*` / `src/store*` / `src/composable*` 文件读回,存入 `generatedFileCache: Map<string, string>`
|
|
1558
|
-
3. 后续每个 task 的 `generateFiles` 调用都携带 `generatedFilesSection`,后续 task 可以看到之前 task 输出的确切导出名称
|
|
1559
|
-
|
|
1560
|
-
### 3. 系统提示新增规则 (`prompts/codegen.prompt.ts`)
|
|
1561
|
-
|
|
1562
|
-
- **规则 16**(路由 Index 强制注册):创建 `src/router/routes/X.ts` 时**必须同时**更新 `routes/index.ts`,添加 import 和 export 注册
|
|
1563
|
-
- **规则 17**(跨文件一致性):`=== Files Already Generated in This Run ===` 中的函数名是权威来源,NEVER 重命名或猜测替代名;无此区段时从 DSL endpoint ID 推导
|
|
1564
|
-
|
|
1565
|
-
---
|
|
1566
|
-
|
|
1567
|
-
## [0.14.3] 2026-03-24 — 欢迎界面
|
|
1568
|
-
|
|
1569
|
-
### Welcome Screen (`cli/welcome.ts`, `cli/index.ts`)
|
|
1570
|
-
|
|
1571
|
-
- `ai-spec` 无参数运行时展示两栏欢迎界面(仿 Claude Code 风格),不再直接输出帮助文本
|
|
1572
|
-
- **左栏**:橙色标题栏 `─── ai-spec v0.14.1 ───` · 居中 `Welcome back, <username>!` · Unicode 机器人 ASCII art · Provider/Model/当前目录(超长路径自动截断 + `…`)
|
|
1573
|
-
- **右栏**(垂直分隔符分割):
|
|
1574
|
-
- **Tips for getting started** — 三条常用命令示例
|
|
1575
|
-
- **Recent activity** — 扫描 `specs/` 目录,列出最近 3 个 spec 文件及相对时间(`2d ago`、`3h ago`)
|
|
1576
|
-
- `program.version` 从硬编码错误值 `"0.6.0"` 更正为 `"0.14.1"`
|
|
1577
|
-
|
|
1578
|
-
---
|
|
1579
|
-
|
|
1580
|
-
## [0.14.2] 2026-03-24 — Java/Maven 项目上下文感知
|
|
1581
|
-
|
|
1582
|
-
### Java 项目 ContextLoader 支持 (`core/context-loader.ts`)
|
|
1583
|
-
|
|
1584
|
-
- **问题**:`ContextLoader.loadProjectContext()` 只处理 PHP(`composer.json`)和 Node.js(`package.json`);Java Maven/Gradle 项目的 `techStack` 和 `dependencies` 均为空,workspace `[W1]` 显示 `unknown (0 deps)`
|
|
1585
|
-
- **修复**:
|
|
1586
|
-
1. 新增 `isJava` 检测:`pom.xml` / `build.gradle` / `build.gradle.kts`,优先级在 Node.js 之前
|
|
1587
|
-
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
|
|
1588
|
-
3. 新增 `loadJavaApiStructure(context)` — glob `**/src/main/java/**/*Controller.java`(排除 `target/`)作为 `apiStructure`;读取 `application.properties/yml` 前 800 字符作为 `routeSummary`
|
|
1589
|
-
|
|
1590
|
-
---
|
|
1591
|
-
|
|
1592
|
-
## [0.14.1] 2026-03-24 — 关键 Bug 修复:非 Node 项目生成 TypeScript 代码
|
|
1593
|
-
|
|
1594
|
-
### `repoType` 从未传入 `generateCode`,导致所有非 Node 项目使用 Node.js 系统提示 (`cli/index.ts`)
|
|
1595
|
-
|
|
1596
|
-
- **根本原因**:`getCodeGenSystemPrompt(options.repoType)` 需要 `repoType` 参数才能选择对应语言的 prompt(PHP / Go / Java / Rust / Python),但两处 `generateCode` 调用(单 repo `create` 命令 + workspace pipeline)都**从未传过 `repoType`**
|
|
1597
|
-
— `options.repoType` 始终是 `undefined`,一律 fallback 到 Node.js/TypeScript 默认 prompt
|
|
1598
|
-
— PHP 项目生成 `.ts` / `prisma/schema.prisma`;Java 项目生成 TypeScript 代码
|
|
1599
|
-
- **修复**:
|
|
1600
|
-
1. 单 repo `create` 命令:在加载 context 后立即调用 `detectRepoType(currentDir)`,将结果作为 `repoType` 传入 `generateCode`
|
|
1601
|
-
2. workspace pipeline `runSingleRepoPipelineInWorkspace`:同样调用 `detectRepoType(repoAbsPath)`,传入 `generateCode`
|
|
1602
|
-
3. Tech stack 日志新增语言标签显示(如 `PHP, Lumen [php]`),便于排查
|
|
1603
|
-
|
|
1604
|
-
---
|
|
1605
|
-
|
|
1606
|
-
## [0.14.0] 2026-03-24 — P0 修复:前端框架检测统一 & Task 模式前端上下文显式注入
|
|
1607
|
-
|
|
1608
|
-
### 1. `isFrontendDeps` — 单一可信源 (`core/context-loader.ts`)
|
|
1609
|
-
|
|
1610
|
-
- **问题**:`["react", "vue", "next", "react-native", "expo"]` 这个列表在 6 个地方各写一遍(`cli/index.ts` ×4、`code-generator.ts`、`test-generator.ts`、`spec-updater.ts`)
|
|
1611
|
-
— 添加新框架(Svelte、Solid、Nuxt)需要改 6 个地方,且各处已经不一致(`spec-updater.ts` 漏掉了 `expo`)
|
|
1612
|
-
- **修复**:
|
|
1613
|
-
- 新增 `export const FRONTEND_FRAMEWORKS` — 完整列表(含 Svelte、Solid、Qwik、Nuxt)
|
|
1614
|
-
- 新增 `export function isFrontendDeps(deps: string[]): boolean`
|
|
1615
|
-
- 所有 6 处 inline 检测全部替换为 `isFrontendDeps(...)` / `FRONTEND_FRAMEWORKS`
|
|
1616
|
-
- 以后只改一处即可全局生效
|
|
1617
|
-
|
|
1618
|
-
### 2. `frontendSection` 从隐式变为显式参数 (`core/code-generator.ts`)
|
|
1619
|
-
|
|
1620
|
-
- **问题**:`frontendSection` 被拼入 `constitutionSection` 字符串后传给 `runApiModeWithTasks`,命名误导 — 未来有人往 `constitutionSection` 拼了其他内容时容易漏掉 `frontendSection`
|
|
1621
|
-
- **修复**:`runApiModeWithTasks` 新增独立的 `frontendSection: string` 参数,在 `generateFiles` 调用中显式拼入 `constitutionSection + frontendSection + sharedConfigSection`
|
|
1622
|
-
— 前端上下文(layout import、store 范式、组件复用列表、HTTP client import 等)现在在 task 模式中**有名有姓地**注入每个文件生成请求
|
|
1623
|
-
|
|
1624
|
-
---
|
|
1625
|
-
|
|
1626
|
-
## [0.13.9] 2026-03-24 — 组件复用感知
|
|
1627
|
-
|
|
1628
|
-
### 前端组件复用上下文 (`core/frontend-context-loader.ts`, `prompts/codegen.prompt.ts`)
|
|
1629
|
-
|
|
1630
|
-
- **问题**:AI 不知道项目 `src/components/` 里已经有哪些组件,也不知道现有页面里用的是哪些 UI 库组件,导致重复造轮子或使用与项目风格不符的写法
|
|
1631
|
-
- **新增字段**:
|
|
1632
|
-
- `reusableComponents: string[]` — 扫描 `src/components/` 全部 `.vue/.tsx/.jsx`,列出所有可复用组件路径(最多 40 个)
|
|
1633
|
-
- `pageExamples: string[]` — 读取 1-2 个现有 view/page 文件前 80 行,展示实际的组件引用和 UI 库使用方式
|
|
1634
|
-
- **上下文注入**:
|
|
1635
|
-
- 组件列表标注为 "check this BEFORE creating a new component"
|
|
1636
|
-
- 页面示例标注为 "follow the same import and usage patterns"
|
|
1637
|
-
- **系统提示新增规则**:
|
|
1638
|
-
- 规则 12:生成任何 UI 组件前,先检查 `reusableComponents` 列表,有的直接 import 复用
|
|
1639
|
-
- 规则 13:从 `pageExamples` 学习 UI 库组件的具体用法,不用原生 HTML 替代已有的组件
|
|
1640
|
-
|
|
1641
|
-
---
|
|
1642
|
-
|
|
1643
|
-
## [0.13.8] 2026-03-24 — Store HTTP 幻觉 & HTTP Client Import 幻觉修复
|
|
1644
|
-
|
|
1645
|
-
### 1. Store 层直接发 HTTP 请求 (`core/frontend-context-loader.ts`, `prompts/codegen.prompt.ts`)
|
|
1646
|
-
|
|
1647
|
-
- **根本原因**:`storeFiles` 只传文件路径列表,AI 从未看到项目里真实 store 的内容,用了训练数据里"store 自己做请求"的默认经验
|
|
1648
|
-
- **修复**:
|
|
1649
|
-
1. `FrontendContext` 新增 `storePatterns: string[]` — 读取 1-2 个现有 store 文件的前 60 行内容
|
|
1650
|
-
2. `buildFrontendContextSection()` 将 store 内容标注为 **"CRITICAL — stores call API layer, NOT HTTP directly"**,直接作为结构模板
|
|
1651
|
-
3. `codeGenSystemPrompt` 新增架构层分离规则:Store 只能调用 API 层函数,不能直接发 HTTP 请求
|
|
1652
|
-
|
|
1653
|
-
### 2. HTTP client import 幻觉(`@/utils/request`)(`core/frontend-context-loader.ts`)
|
|
1654
|
-
|
|
1655
|
-
- **根本原因**:API 文件的 HTTP client import 路径没有被提取为具名事实,AI 猜测了一个在中文 Vue 项目中常见但本项目不存在的路径
|
|
1656
|
-
- **修复**:
|
|
1657
|
-
1. `FrontendContext` 新增 `httpClientImport?: string` — 正则扫描现有 API 文件,提取精确 import 行(支持 `@/` 别名路径和 `axios`/`ky` 直接导入)
|
|
1658
|
-
2. `buildFrontendContextSection()` 将该行标注为 **"COPY THIS EXACTLY"**,禁止 AI 发明其他路径
|
|
1659
|
-
|
|
1660
|
-
---
|
|
1661
|
-
|
|
1662
|
-
## [0.13.6] 2026-03-24 — Layout 幻觉 & 路由注册可靠性修复
|
|
1663
|
-
|
|
1664
|
-
### Layout 组件路径幻觉 (`core/frontend-context-loader.ts`)
|
|
1665
|
-
|
|
1666
|
-
- **根本原因**:AI 在 120 行的路由模块预览里"看到"了正确的 `@/layout/index.vue`,但训练数据里 `@/layouts/MainLayout.vue` 更常见,覆盖了实际样本
|
|
1667
|
-
- **修复**:主动提取,而非依赖 AI 自行寻找
|
|
1668
|
-
1. `extractRouteModuleContext()` — 扫描 `src/router/modules/` 中的现有模块文件,用正则提取 Layout import 的**精确代码行**(支持 `const Layout = () => import(...)` / `import Layout from ...` 两种形式)
|
|
1669
|
-
2. 取一个完整的路由模块文件(≤100行)作为 `routeModuleExample`
|
|
1670
|
-
3. `buildFrontendContextSection()` 将 layout import 行标注为 **"COPY THIS EXACTLY"**,路由模块作为 **structural template** 直接插入提示
|
|
1671
|
-
- 效果:AI 收到的是**具名事实**(`layoutImport = "const Layout = () => import('@/layout/index.vue')"`)而非需要在样本里自行找,彻底避免路径幻觉
|
|
1672
|
-
|
|
1673
|
-
---
|
|
1674
|
-
|
|
1675
|
-
## [0.13.5] 2026-03-24 — 前端代码生成幻觉 & 路由规范修复
|
|
1676
|
-
|
|
1677
|
-
### 1. 依赖幻觉防御 — 禁止使用未安装的包 (`core/code-generator.ts`, `prompts/codegen.prompt.ts`)
|
|
1678
|
-
|
|
1679
|
-
- **根本原因**:codegen 上下文只传了 `techStack` 和部分文件名,AI 从未收到实际安装的 npm 包列表,只能靠猜测 → 幻觉引入 `vue-i18n` 等不存在的依赖
|
|
1680
|
-
- **修复**:
|
|
1681
|
-
1. 新增 `buildInstalledPackagesSection()` — 将项目的完整 `dependencies` 列表格式化为 `=== Installed Packages ===` 区段,注入进每次生成调用(plan/api/task 三种路径均覆盖)
|
|
1682
|
-
2. `codeGenSystemPrompt` 新增绑定性规则:**ONLY use packages from the Installed Packages list. NEVER import anything not listed.** 若功能需要不存在的包,用已有包实现等价逻辑
|
|
1683
|
-
|
|
1684
|
-
### 2. 从样本学习约定,而非 hardcode 目录规则 (`prompts/codegen.prompt.ts`, `core/code-generator.ts`, `core/context-loader.ts`)
|
|
1685
|
-
|
|
1686
|
-
- **根本原因**:之前用 `hasRouterModules` 检测 `src/router/modules/` 目录来注入特定规则,这是 hack — 换个项目结构就失效
|
|
1687
|
-
- **修复方向**:让 AI 从真实代码样本中自行推断项目约定,而非靠工具硬编码猜测
|
|
1688
|
-
1. 移除 `buildSharedConfigSection()` 中的 `hasRouterModules` 目录检测逻辑
|
|
1689
|
-
2. 移除 `codeGenSystemPrompt` 中的 Vue Router 专项硬编码规则
|
|
1690
|
-
3. 新增通用的"样本优先"规则:**从 Existing Shared Config Files 中的真实代码学习结构、命名和注册方式,项目样本 > 框架默认经验**
|
|
1691
|
-
4. shared config files preview 从 80 行提升到 120 行,确保 AI 看到完整的路由模块示例
|
|
1692
|
-
|
|
1693
|
-
---
|
|
1694
|
-
|
|
1695
|
-
## [0.13.4] 2026-03-24 — MiMo max_tokens 截断修复
|
|
1696
|
-
|
|
1697
|
-
### MiMo `stop_reason: max_tokens` 导致 DSL 提取失败 (`core/spec-generator.ts`)
|
|
1698
|
-
|
|
1699
|
-
- MiMo 在生成 DSL JSON 时,若 CoT thinking 内容过长会先耗尽 token,导致响应中只有 `thinking` block、没有 `text` block
|
|
1700
|
-
- 之前抛出 `Unexpected MiMo response` 原始 JSON,信息不易排查
|
|
1701
|
-
- 修复:
|
|
1702
|
-
1. `max_tokens` 从 `8192` 提升到 `16384`,减少截断概率
|
|
1703
|
-
2. 检测 `stop_reason === "max_tokens"`,抛出明确提示:"prompt 过长,可缩短 spec 或换更大 context 的模型"
|
|
1704
|
-
|
|
1705
|
-
---
|
|
1706
|
-
|
|
1707
|
-
## [0.13.3] 2026-03-24 — DSL 校验误报修复
|
|
1708
|
-
|
|
1709
|
-
### DSL `errors[].code` 空字符串导致校验失败 (`core/dsl-extractor.ts`)
|
|
1710
|
-
|
|
1711
|
-
- AI 生成 DSL 时偶尔将 `endpoints[].errors[].code` / `.description` 输出为空字符串 `""`
|
|
1712
|
-
- 校验器报 `Must be a non-empty string, got: string`,触发无效 retry 循环
|
|
1713
|
-
- 修复:在 `validateDsl` 前调用 `sanitizeDsl()`,自动过滤掉 `code`/`description` 为空的 error 条目;若全部被过滤则删除整个 `errors` 字段
|
|
1714
|
-
|
|
1715
|
-
---
|
|
1716
|
-
|
|
1717
|
-
## [0.13.2] 2026-03-24 — API Key 持久化
|
|
1718
|
-
|
|
1719
|
-
### API Key 持久化存储 (`core/key-store.ts`, `cli/index.ts`)
|
|
1720
|
-
|
|
1721
|
-
- 第一次输入 API key 后自动保存到 `~/.ai-spec-keys.json`(文件权限 600,仅 owner 可读)
|
|
1722
|
-
- 下次运行时若已有保存的 key,显示脱敏 key(`sk-ab12...ef56`)并提示选择:
|
|
1723
|
-
- **Use saved key** — 直接复用
|
|
1724
|
-
- **Enter a new key** — 输入新 key 并覆盖保存
|
|
1725
|
-
- 优先级:CLI `--key` flag → 环境变量 → 保存的 key → 交互输入
|
|
1726
|
-
- 新增 `ai-spec config` 子命令选项:
|
|
1727
|
-
- `--list-keys` — 列出所有已保存 key 的 provider(脱敏显示)
|
|
1728
|
-
- `--clear-key <provider>` — 删除指定 provider 的保存 key
|
|
1729
|
-
- `--clear-keys` — 清除全部保存的 key
|
|
1730
|
-
|
|
1731
|
-
---
|
|
1732
|
-
|
|
1733
|
-
## [0.13.1] 2026-03-23 — 前端自动跳过 worktree & Bug 修复
|
|
1734
|
-
|
|
1735
|
-
### 1. 前端项目自动跳过 worktree (`cli/index.ts`)
|
|
1736
|
-
|
|
1737
|
-
- 检测到前端项目(依赖含 `react` / `vue` / `next` / `react-native` / `expo`)时,**自动设置 `skipWorktree = true`**
|
|
1738
|
-
- 原因:worktree 不复制 `node_modules`,前端 dev server 启动会失败
|
|
1739
|
-
- 代码直接在当前仓库的新分支上生成,无需手动 `cd` 到 worktree
|
|
1740
|
-
- 新增 `--worktree` flag:强制开启 worktree,覆盖自动跳过行为
|
|
1741
|
-
- workspace pipeline 中前端/mobile repo 同样自动跳过
|
|
1742
|
-
|
|
1743
|
-
### 2. MiMo Thinking Block 修复 (`core/spec-generator.ts`)
|
|
1744
|
-
|
|
1745
|
-
- MiMo v2 Pro 启用 CoT 时会在 `content` 数组首位返回 `{ type: "thinking" }` block
|
|
1746
|
-
- 之前只检查 `content[0].type === "text"`,thinking 排第一时抛异常并将原始响应打印到终端
|
|
1747
|
-
- 修复:改用 `blocks.find(b => b.type === "text")` 跳过 thinking block
|
|
1748
|
-
|
|
1749
|
-
### 3. vue-tsc 工具崩溃检测 (`core/error-feedback.ts`)
|
|
1750
|
-
|
|
1751
|
-
- `vue-tsc` 与 TypeScript 版本不兼容时会抛 `ReferenceError: ScriptKind is not defined`
|
|
1752
|
-
- 之前将此错误当作真实类型错误喂进 AI 自动修复循环,导致无效修复
|
|
1753
|
-
- 修复:检测到 `ReferenceError/TypeError` + `node_modules` 堆栈时,判定为工具崩溃,打印警告并跳过
|
|
1754
|
-
|
|
1755
|
-
### 4. git diff --cached 在非 git 目录崩溃 (`core/reviewer.ts`)
|
|
1756
|
-
|
|
1757
|
-
- 在非 git 目录执行 `git diff --cached` 时,git 输出 `error: unknown option 'cached'` 并将整个帮助信息喷到终端
|
|
1758
|
-
- 修复:先执行 `git rev-parse --is-inside-work-tree` 前置检查,并对所有 git 命令加 `stdio: "pipe"` 静默 stderr
|
|
1759
|
-
|
|
1760
|
-
### 5. Worktree 后 node_modules/vendor 丢失 (`git/worktree.ts`)
|
|
1761
|
-
|
|
1762
|
-
- worktree 目录不含 `node_modules`,导致 `vite: command not found`
|
|
1763
|
-
- 修复:worktree 创建后自动 symlink `node_modules/`(Node.js)和 `vendor/`(PHP Composer)
|
|
1764
|
-
|
|
1765
|
-
### 6. Task 模式下路由/Store 文件未被修改 (`core/code-generator.ts`)
|
|
1766
|
-
|
|
1767
|
-
- Task 的 `filesToTouch` 只含组件文件,路由注册文件未被处理
|
|
1768
|
-
- 修复:检测到 task 涉及新建页面/组件时,自动将 `sharedConfigFiles`(router/store)注入当前 task 的 filePlan
|
|
1769
|
-
- 所有已存在文件的 action 从硬编码 `"create"` 改为动态检测 `"modify"`
|
|
1770
|
-
|
|
1771
|
-
### 7. Workspace Init 自动扫描子目录 (`cli/index.ts`)
|
|
1772
|
-
|
|
1773
|
-
- 之前只能逐个手动添加 repo
|
|
1774
|
-
- 新增:输入 workspace name 后询问「Auto-scan sibling directories?」,一键检测所有子目录
|
|
1775
|
-
|
|
1776
|
-
---
|
|
1777
|
-
|
|
1778
|
-
## [0.13.0] 2026-03-23 — 上下文感知 & 错误反馈增强
|
|
1779
|
-
|
|
1780
|
-
### 1. sharedConfigFiles 路由/Store 扫描补全 (`core/context-loader.ts`)
|
|
1781
|
-
|
|
1782
|
-
新增路由注册文件扫描模式:
|
|
1783
|
-
- Vue Router Modules: `src/router/modules/**/*.{ts,js}`, `src/router/routes.{ts,js}`
|
|
1784
|
-
- React Router: `src/routes.{ts,tsx}`, `src/router.{ts,tsx}`
|
|
1785
|
-
- PHP Lumen/Laravel: `routes/api.php`, `routes/web.php`
|
|
1786
|
-
|
|
1787
|
-
新增 Store 注册文件扫描,独立 `store-index` 分类:
|
|
1788
|
-
- Pinia/Vuex: `src/stores/index.ts`, `src/store/modules/index.ts`
|
|
1789
|
-
- Redux: `src/store/rootReducer.ts`, `src/app/store.ts`
|
|
1790
|
-
|
|
1791
|
-
`fileStructure` 扫描范围扩大:maxDepth 3→5,文件数上限 60→120,新增排除 `vendor/**`、`build/**`、`*.map`、`*.min.js`
|
|
1792
|
-
|
|
1793
|
-
### 2. TypeScript 类型检查加入 error feedback loop (`core/error-feedback.ts`)
|
|
1794
|
-
|
|
1795
|
-
新增 `detectBuildCommand()`:
|
|
1796
|
-
- 有 `tsconfig.json` + `vue-tsc` → `npx vue-tsc --noEmit`
|
|
1797
|
-
- 有 `scripts.type-check` / `scripts.typecheck` → `npm run type-check`
|
|
1798
|
-
- 默认 → `npx tsc --noEmit`
|
|
1799
|
-
|
|
1800
|
-
`ErrorFeedbackOptions` 新增 `skipBuild?: boolean`
|
|
1801
|
-
type-check 在 test/lint 之前运行(最快,最常见错误源)
|
|
1802
|
-
|
|
1803
|
-
### 3. PHP / Lumen 项目上下文感知 (`core/context-loader.ts`)
|
|
1804
|
-
|
|
1805
|
-
新增 `loadComposerJson()`:读取 `composer.json`,提取依赖和技术栈(Lumen/Laravel/Eloquent/JWT Auth 等)
|
|
1806
|
-
新增 `loadPhpRoutes()`:加载 `routes/api.php` + `routes/web.php` 作为 routeSummary,扫描 `app/Http/Controllers/**/*.php` 作为 apiStructure
|
|
1807
|
-
PHP 异常处理文件识别:`app/Exceptions/Handler.php`
|
|
1808
|
-
|
|
1809
|
-
---
|
|
1810
|
-
|
|
1811
|
-
## [0.12.2] 2026-03-23 — PHP/Lumen 后端支持
|
|
1812
|
-
|
|
1813
|
-
**修改:** `core/workspace-loader.ts` · `core/error-feedback.ts` · `prompts/codegen.prompt.ts`
|
|
1814
|
-
|
|
1815
|
-
- `RepoType` 新增 `"php"` 类型
|
|
1816
|
-
- `detectRepoType()` 新增 `composer.json` 检测(优先级在 Node.js 之前):自动识别 PHP/Lumen/Laravel 项目为 `{ type: "php", role: "backend" }`
|
|
1817
|
-
- `autoDetect()` manifest 列表新增 `composer.json`(workspace init 时自动扫描 PHP 项目)
|
|
1818
|
-
- `detectTestCommand()`:PHP → `./vendor/bin/phpunit --colors=never` 或 `php artisan test --no-ansi`
|
|
1819
|
-
- `detectLintCommand()`:PHP → `./vendor/bin/phpstan analyse`(如已安装,否则 null)
|
|
1820
|
-
- `parseErrors()` 文件扩展名正则新增 `.php`
|
|
1821
|
-
- 新增 `codeGenPhpSystemPrompt`:PSR-12,PHP 8.x,Lumen/Laravel 路由约定,Eloquent ORM,构造器属性提升
|
|
1822
|
-
|
|
1823
|
-
---
|
|
1824
|
-
|
|
1825
|
-
## [0.12.1] 2026-03-23 — 恢复 MiMo v2 Pro 支持
|
|
1826
|
-
|
|
1827
|
-
**修改:** `core/spec-generator.ts`
|
|
1828
|
-
|
|
1829
|
-
- 新增 `MiMoProvider` 类:使用 axios 直接调用小米 MiMo API
|
|
1830
|
-
- Endpoint: `https://api.xiaomimimo.com/anthropic/v1/messages`
|
|
1831
|
-
- Auth 格式:`api-key: $MIMO_API_KEY`(不同于 Anthropic 的 `x-api-key`,因此无法复用 Anthropic SDK,用 axios 独立实现)
|
|
1832
|
-
- 请求/响应格式与 Anthropic messages API 兼容
|
|
1833
|
-
- `PROVIDER_CATALOG` 新增 `mimo` 条目:`mimo-v2-pro`,env var `MIMO_API_KEY`
|
|
1834
|
-
- `createProvider()` factory 新增 `case "mimo"` 分支
|
|
1835
|
-
|
|
1836
|
-
**使用:**
|
|
1837
|
-
```bash
|
|
1838
|
-
export MIMO_API_KEY=your_key_here
|
|
1839
|
-
ai-spec create "功能描述" --provider mimo
|
|
1840
|
-
ai-spec create "功能描述" --provider mimo --model mimo-v2-pro
|
|
1841
|
-
```
|
|
1842
|
-
|
|
1843
|
-
---
|
|
1844
|
-
|
|
1845
|
-
## [0.12.0] 2026-03-23 — 宪法整合:`ai-spec init --consolidate`
|
|
1846
|
-
|
|
1847
|
-
### 问题
|
|
1848
|
-
|
|
1849
|
-
`ai-spec review` 每次运行后会把审查 issue 追加到宪法 §9。长期运行后 §9 会积累几十条条目,其中充斥着重复措辞、已修复问题的历史记录、不再适用的早期教训。宪法被注入每次 AI 调用,§9 越长越造成 token 浪费和信噪比下降(代码中有 2000 字符硬截断,超出部分直接丢弃)。
|
|
1850
|
-
|
|
1851
|
-
### 解决方案:Constitution Rebase
|
|
1852
|
-
|
|
1853
|
-
类比 `git rebase`:把散落在 §9 的经验教训提炼、去重,归并到 §1–§8 相应章节,再清理 §9。
|
|
1854
|
-
|
|
1855
|
-
---
|
|
1856
|
-
|
|
1857
|
-
### 新增:`prompts/consolidate.prompt.ts`
|
|
1858
|
-
|
|
1859
|
-
- `consolidateSystemPrompt` — 主导 AI 按三条决策路径处理每条 §9 lesson:
|
|
1860
|
-
- **LIFT**:通用且持久的规则 → 自然融入 §1–§8 对应章节,改写为规范性语句
|
|
1861
|
-
- **KEEP**:近期特定、尚未泛化 → 保留在 §9(max 5 条)
|
|
1862
|
-
- **DROP**:重复、已覆盖或不再适用 → 删除
|
|
1863
|
-
- `buildConsolidatePrompt()` — 注入完整宪法和 §9 数量
|
|
1864
|
-
- `parseConstitutionStats()` — 解析宪法的总行数、§9 行数、lesson 数量(用于阈值检测和效果对比)
|
|
1865
|
-
|
|
1866
|
-
### 新增:`core/constitution-consolidator.ts`
|
|
1867
|
-
|
|
1868
|
-
- `ConstitutionConsolidator.consolidate()` — 完整整合流程:
|
|
1869
|
-
1. 解析当前 §9 数量,低于阈值(默认 5)直接跳过
|
|
1870
|
-
2. 调用 AI 生成整合后的宪法
|
|
1871
|
-
3. 展示彩色 diff(复用 `computeDiff` / `printDiff`)
|
|
1872
|
-
4. 写入前自动创建带时间戳的备份(`.ai-spec-constitution.backup-YYYY-MM-DD-HH-MM-SS.md`)
|
|
1873
|
-
5. 写入整合后的宪法,输出前后对比数据
|
|
1874
|
-
- `checkConsolidationNeeded()` — 可供外部调用的阈值检查函数
|
|
1875
|
-
|
|
1876
|
-
### 修改:`core/knowledge-memory.ts`
|
|
1877
|
-
|
|
1878
|
-
`appendLessonsToConstitution()` 写入后自动检查 §9 数量:
|
|
1879
|
-
- ≥ 8 条时打印黄色提示:`⚠ §9 now has N lessons. Run \`ai-spec init --consolidate\` to prune and rebase.`
|
|
1880
|
-
|
|
1881
|
-
### 修改:`cli/index.ts` — `init` 命令新增两个选项
|
|
1882
|
-
|
|
1883
|
-
```
|
|
1884
|
-
ai-spec init --consolidate # 整合 §9 → §1–§8,清理冗余(需要现有宪法)
|
|
1885
|
-
ai-spec init --consolidate --dry-run # 预览整合结果,不写入磁盘
|
|
1886
|
-
```
|
|
1887
|
-
|
|
1888
|
-
整合流程输出示例:
|
|
1889
|
-
```
|
|
1890
|
-
─── Constitution Consolidation ──────────────────
|
|
1891
|
-
File : .ai-spec-constitution.md
|
|
1892
|
-
Size : 187 lines
|
|
1893
|
-
§9 items: 14 accumulated lessons
|
|
1894
|
-
|
|
1895
|
-
Consolidating 14 lesson(s) with AI...
|
|
1896
|
-
|
|
1897
|
-
Changes preview:
|
|
1898
|
-
+ ## 3. API 规范
|
|
1899
|
-
+ - 所有 POST 接口必须在 request body 中验证 email 格式,不接受裸字符串
|
|
1900
|
-
...
|
|
1901
|
-
~ removed: 8 lines added: 3 lines
|
|
1902
|
-
|
|
1903
|
-
After consolidation:
|
|
1904
|
-
Size : 162 lines (was 187)
|
|
1905
|
-
§9 items: 4 remaining (was 14)
|
|
1906
|
-
✔ ~10 lesson(s) lifted into §1–§8 or removed
|
|
1907
|
-
|
|
1908
|
-
Backup : .ai-spec-constitution.backup-2026-03-23-14-30-00.md
|
|
1909
|
-
✔ Constitution updated: .ai-spec-constitution.md
|
|
1910
|
-
|
|
1911
|
-
Summary:
|
|
1912
|
-
Lines : 187 → 162 (-25)
|
|
1913
|
-
§9 : 14 → 4 lessons remaining
|
|
1914
|
-
```
|
|
1915
|
-
|
|
1916
|
-
---
|
|
1917
|
-
|
|
1918
|
-
## [0.11.0] 2026-03-23 — 三大高优先级补全:增量更新 / OpenAPI 导出 / 多语言 Codegen Prompt
|
|
1919
|
-
|
|
1920
|
-
### 目标
|
|
1921
|
-
|
|
1922
|
-
填补工具链中最关键的三个空白:变更驱动的需求更新、标准接口格式导出、以及对 Go/Python/Java/Rust 项目的真正有效代码生成。
|
|
1923
|
-
|
|
1924
|
-
---
|
|
1925
|
-
|
|
1926
|
-
### Feature 1:`ai-spec update` — 增量 Spec + 代码更新流水线
|
|
1927
|
-
|
|
1928
|
-
**核心思路:** 现实中 90% 的工作是"改需求",而非从零开始。现有的 `create` 命令无法处理这种场景。
|
|
1929
|
-
|
|
1930
|
-
**新增:** `core/spec-updater.ts`
|
|
1931
|
-
|
|
1932
|
-
- `SpecUpdater.update()` — 三步流程:
|
|
1933
|
-
1. **更新 Spec**:AI 读取现有 Spec + 变更描述 → 生成更新后的完整 Spec(保留未变更部分)
|
|
1934
|
-
2. **更新 DSL**:若存在现有 DSL → 使用定向 DSL 更新 prompt(只更新变化的端点/模型);失败时降级为全量重提取
|
|
1935
|
-
3. **识别受影响文件**:对比新旧 DSL,让 AI 列出需要修改的文件列表(不是全量重生成)
|
|
1936
|
-
- `SpecUpdater.findLatestSpec()` — 从 `specs/` 目录自动找最新版本文件
|
|
1937
|
-
- 所有结果写入新版本文件(`feature-xxx-v2.md` + `feature-xxx-v2.dsl.json`)
|
|
1938
|
-
|
|
1939
|
-
**新增:** `prompts/update.prompt.ts`
|
|
1940
|
-
|
|
1941
|
-
- `specUpdateSystemPrompt` — 要求 AI 最小化改动,保留原有结构
|
|
1942
|
-
- `dslUpdateSystemPrompt` — 针对 DSL JSON 的精准更新指令(保留未变更条目)
|
|
1943
|
-
- `buildAffectedFilesPrompt()` — 基于 DSL diff(新增/修改的端点/模型)生成受影响文件 prompt
|
|
1944
|
-
|
|
1945
|
-
**新增:** `cli/index.ts` — `ai-spec update` 命令
|
|
1946
|
-
|
|
1947
|
-
```
|
|
1948
|
-
ai-spec update "新增商品收藏功能" # 自动找最新 Spec,生成 v2
|
|
1949
|
-
ai-spec update "把价格字段改为 Float" # 更新 DSL 模型字段
|
|
1950
|
-
ai-spec update --codegen # 更新完后自动重新生成受影响文件
|
|
1951
|
-
ai-spec update --spec specs/xxx-v1.md # 指定 Spec 文件
|
|
1952
|
-
ai-spec update --skip-affected # 跳过受影响文件识别
|
|
1953
|
-
```
|
|
1954
|
-
|
|
1955
|
-
**工作流对比:**
|
|
1956
|
-
|
|
1957
|
-
| 场景 | 之前 | 现在 |
|
|
1958
|
-
|---|---|---|
|
|
1959
|
-
| 新功能 | `ai-spec create "..."` | 同上 |
|
|
1960
|
-
| 改现有功能 | 手动修改 Spec + 手动更新代码 | `ai-spec update "..."` |
|
|
1961
|
-
| 改完自动更新代码 | 不支持 | `ai-spec update "..." --codegen` |
|
|
1962
|
-
|
|
1963
|
-
---
|
|
1964
|
-
|
|
1965
|
-
### Feature 2:`ai-spec export` — DSL → OpenAPI 3.1.0
|
|
1966
|
-
|
|
1967
|
-
**核心思路:** DSL 已是结构化中间表示,距离 OpenAPI 只差一步。有了 OpenAPI 可以接入整个开放生态。
|
|
1968
|
-
|
|
1969
|
-
**新增:** `core/openapi-exporter.ts`
|
|
1970
|
-
|
|
1971
|
-
- `dslToOpenApi()` — 将 SpecDSL 转换为 OpenAPI 3.1.0 对象:
|
|
1972
|
-
- `models[]` → `components.schemas`(含类型映射、required 字段推断)
|
|
1973
|
-
- `endpoints[]` → `paths`(含路径参数提取、query params、requestBody、success/error responses)
|
|
1974
|
-
- `auth: true` → `security: [{bearerAuth: []}]` + `components.securitySchemes.bearerAuth`
|
|
1975
|
-
- 自动注入 `ErrorResponse` 通用 schema
|
|
1976
|
-
- 路径参数格式自动转换(`:id` → `{id}`)
|
|
1977
|
-
- `exportOpenApi()` — 写入 `openapi.yaml` 或 `openapi.json`(内置 YAML 序列化,零外部依赖)
|
|
1978
|
-
|
|
1979
|
-
**新增:** `cli/index.ts` — `ai-spec export` 命令
|
|
1980
|
-
|
|
1981
|
-
```
|
|
1982
|
-
ai-spec export # 读取最新 DSL,生成 openapi.yaml
|
|
1983
|
-
ai-spec export --format json # 生成 openapi.json
|
|
1984
|
-
ai-spec export --server https://api.example.com # 指定服务器 URL
|
|
1985
|
-
ai-spec export --output docs/api.yaml # 指定输出路径
|
|
1986
|
-
ai-spec export --dsl specs/xxx.dsl.json # 指定 DSL 文件
|
|
1987
|
-
```
|
|
1988
|
-
|
|
1989
|
-
**下游工具链:**
|
|
1990
|
-
|
|
1991
|
-
```
|
|
1992
|
-
openapi.yaml → Postman / Insomnia 直接导入
|
|
1993
|
-
→ openapi-generator → TypeScript / Go / Python / Java SDK
|
|
1994
|
-
→ Swagger UI → 在线接口文档
|
|
1995
|
-
→ Prism → 更专业的 mock server
|
|
1996
|
-
```
|
|
1997
|
-
|
|
1998
|
-
---
|
|
1999
|
-
|
|
2000
|
-
### Feature 3:多语言 Codegen System Prompt
|
|
2001
|
-
|
|
2002
|
-
**核心思路:** `workspace-loader` 已识别 Go/Python/Java/Rust,但代码生成的 prompt 仍是 Node.js 风格。对这些项目生成的代码是无法使用的。
|
|
2003
|
-
|
|
2004
|
-
**修改:** `prompts/codegen.prompt.ts`
|
|
2005
|
-
|
|
2006
|
-
新增四个语言专属 system prompt,并提供统一入口函数:
|
|
2007
|
-
|
|
2008
|
-
```typescript
|
|
2009
|
-
getCodeGenSystemPrompt(repoType?: string): string
|
|
2010
|
-
// "go" → codeGenGoSystemPrompt
|
|
2011
|
-
// "python" → codeGenPythonSystemPrompt
|
|
2012
|
-
// "java" → codeGenJavaSystemPrompt
|
|
2013
|
-
// "rust" → codeGenRustSystemPrompt
|
|
2014
|
-
// default → codeGenSystemPrompt (Node.js)
|
|
2015
|
-
```
|
|
2016
|
-
|
|
2017
|
-
各 prompt 的核心差异:
|
|
2018
|
-
|
|
2019
|
-
| 语言 | 关键规则 |
|
|
2020
|
-
|---|---|
|
|
2021
|
-
| Go | 惯用 Go 风格(named return errors, context, slog/zap),按 go.mod 检测 router(chi/gin/echo),标准 testing + testify |
|
|
2022
|
-
| Python | 检测 FastAPI/Flask/Django,PEP 8 + type annotations + Pydantic,正确注册路由(APIRouter / urls.py) |
|
|
2023
|
-
| Java | Spring Boot 分层(Controller→Service→Repository),构造器注入,Lombok 支持,@ControllerAdvice |
|
|
2024
|
-
| Rust | 检测 Axum/Actix-web,Result<T,E> everywhere,no unwrap() in production,现有 Cargo.toml crates only |
|
|
2025
|
-
|
|
2026
|
-
**修改:** `core/code-generator.ts`
|
|
2027
|
-
|
|
2028
|
-
- `CodeGenOptions` 新增 `repoType?: string` 字段
|
|
2029
|
-
- `runApiMode()` 根据 `repoType` 调用 `getCodeGenSystemPrompt()` 选择 prompt
|
|
2030
|
-
- `generateFiles()` 和 `runApiModeWithTasks()` 透传 `systemPrompt` 参数
|
|
2031
|
-
|
|
2032
|
-
**修改:** `core/error-feedback.ts`
|
|
2033
|
-
|
|
2034
|
-
- `attemptFix()` 改为使用 `getCodeGenSystemPrompt()`(修复时也使用语言正确的 prompt)
|
|
2035
|
-
|
|
2036
|
-
---
|
|
2037
|
-
|
|
2038
|
-
## [0.10.0] 2026-03-23 — Mock Server + 多语言后端支持
|
|
2039
|
-
|
|
2040
|
-
### 目标
|
|
2041
|
-
|
|
2042
|
-
解决 `ai-spec create` 之后前后端联调断层问题:后端 DSL 已有,但服务未部署、本地无法连数据库,前端无从联调。同时扩展多语言后端 Repo 识别与错误反馈。
|
|
2043
|
-
|
|
2044
|
-
---
|
|
2045
|
-
|
|
2046
|
-
### Feature 1:`ai-spec mock` — 一键联调 Mock 套件
|
|
2047
|
-
|
|
2048
|
-
**新增:** `core/mock-server-generator.ts`
|
|
2049
|
-
|
|
2050
|
-
从已有 DSL(`.ai-spec/*.dsl.json`)生成三类联调资产:
|
|
2051
|
-
|
|
2052
|
-
**① 独立 Express Mock 服务器(`mock/server.js`)**
|
|
2053
|
-
|
|
2054
|
-
- 纯 CommonJS,只依赖 `express`,无需任何编译,`node mock/server.js` 即运行
|
|
2055
|
-
- 每个 DSL 端点对应一个路由,返回从数据模型字段类型推断的 fixture 响应
|
|
2056
|
-
- `DateTime` → ISO 8601 字符串,`Int` ID 字段 → `"abc123"`,`price` 字段 → `9.99`,List 端点 → `{ data: [...], total, page, pageSize }`
|
|
2057
|
-
- `auth: true` 端点自动挂 Bearer Token 验证中间件(缺失时返回 401)
|
|
2058
|
-
- CORS 全开(dev only)
|
|
2059
|
-
- 生成 `mock/README.md`:端点表、快速启动说明
|
|
2060
|
-
|
|
2061
|
-
**② 前端 Proxy 配置片段(`--proxy`)**
|
|
2062
|
-
|
|
2063
|
-
- 自动识别前端框架(检测 `vite.config.*` / `next.config.*` / `react-scripts` / `webpack.config.*`)
|
|
2064
|
-
- 按框架生成对应配置片段(注释形式):
|
|
2065
|
-
- Vite → `server.proxy` 块
|
|
2066
|
-
- Next.js → `rewrites()` 数组
|
|
2067
|
-
- CRA → `package.json "proxy"` + `setupProxy.js`
|
|
2068
|
-
- webpack → `devServer.proxy` 块
|
|
2069
|
-
|
|
2070
|
-
**③ MSW Handler(`--msw`)**
|
|
2071
|
-
|
|
2072
|
-
- 生成 `src/mocks/handlers.ts`:msw v2 风格,`http.get/post/...` + `HttpResponse.json()`
|
|
2073
|
-
- 生成 `src/mocks/browser.ts`:`setupWorker` 初始化
|
|
2074
|
-
- 适用于前端完全脱离后端本地运行的场景
|
|
2075
|
-
|
|
2076
|
-
**新增:** `cli/index.ts` — `ai-spec mock` 命令
|
|
2077
|
-
|
|
2078
|
-
```
|
|
2079
|
-
ai-spec mock # 读取最新 DSL,生成 mock/server.js
|
|
2080
|
-
ai-spec mock --port 3002 # 指定端口(默认 3001)
|
|
2081
|
-
ai-spec mock --proxy # 同时生成 Proxy 配置片段
|
|
2082
|
-
ai-spec mock --msw # 同时生成 MSW handlers
|
|
2083
|
-
ai-spec mock --dsl <path> # 指定 DSL 文件
|
|
2084
|
-
ai-spec mock --workspace # 工作区所有后端 repo 批量生成
|
|
2085
|
-
```
|
|
2086
|
-
|
|
2087
|
-
---
|
|
2088
|
-
|
|
2089
|
-
### Feature 2:多语言后端支持
|
|
2090
|
-
|
|
2091
|
-
**修改:** `core/workspace-loader.ts`
|
|
2092
|
-
|
|
2093
|
-
`RepoType` 新增:`"go"` | `"python"` | `"java"` | `"rust"`
|
|
2094
|
-
|
|
2095
|
-
`detectRepoType()` 在 `package.json` 检测前优先检查非 Node.js 语言:
|
|
2096
|
-
|
|
2097
|
-
| 语言 | 识别依据 |
|
|
2098
|
-
|---|---|
|
|
2099
|
-
| Go | `go.mod` |
|
|
2100
|
-
| Rust | `Cargo.toml` |
|
|
2101
|
-
| Java | `pom.xml` / `build.gradle` / `build.gradle.kts` |
|
|
2102
|
-
| Python | `requirements.txt` / `pyproject.toml` / `setup.py` |
|
|
2103
|
-
|
|
2104
|
-
`autoDetect()` 扩展扫描条件:不再只检查 `package.json`,同时检查以上所有 manifest 文件。
|
|
2105
|
-
|
|
2106
|
-
**修改:** `core/error-feedback.ts`
|
|
2107
|
-
|
|
2108
|
-
`detectTestCommand()` 和 `detectLintCommand()` 按语言自动选择:
|
|
2109
|
-
|
|
2110
|
-
| 语言 | 测试命令 | Lint 命令 |
|
|
2111
|
-
|---|---|---|
|
|
2112
|
-
| Go | `go test ./...` | `go vet ./...` |
|
|
2113
|
-
| Rust | `cargo test` | `cargo clippy -- -D warnings` |
|
|
2114
|
-
| Java (Maven) | `mvn test -q` | — |
|
|
2115
|
-
| Java (Gradle) | `./gradlew test` | — |
|
|
2116
|
-
| Python | `pytest` | `ruff check . \|\| flake8 .` |
|
|
2117
|
-
| Node.js | `npm test` / `npx vitest run` | `npm run lint` / `npx eslint .` |
|
|
2118
|
-
|
|
2119
|
-
`parseErrors()` 文件路径提取正则扩展支持 `.go` `.py` `.java` `.rs` 后缀。
|
|
2120
|
-
|
|
2121
|
-
**修改:** `cli/index.ts` — workspace init 交互
|
|
2122
|
-
|
|
2123
|
-
Repo 类型选择器新增 `go` / `python` / `java` / `rust` 选项。
|
|
2124
|
-
|
|
2125
|
-
---
|
|
2126
|
-
|
|
2127
|
-
## [0.9.0] 2026-03-23 — 三项精准 Fix:前端 DSL 提取 / 分解上下文 / Codegen 注入
|
|
2128
|
-
|
|
2129
|
-
### 目标
|
|
2130
|
-
|
|
2131
|
-
修复上一版自我评估中指出的三个薄弱点,使「一句话 → 前后端全链路」真正可靠运行而不依赖 AI 猜测。
|
|
2132
|
-
|
|
2133
|
-
---
|
|
2134
|
-
|
|
2135
|
-
### Fix 1:前端 DSL 提取 — ComponentSpec 提取不再依赖推断
|
|
2136
|
-
|
|
2137
|
-
**修改:** `prompts/dsl.prompt.ts`
|
|
2138
|
-
|
|
2139
|
-
新增 `dslFrontendSystemPrompt`:
|
|
2140
|
-
- 专为前端规格设计的提取规则,输出格式含 `components[]` 数组
|
|
2141
|
-
- `models[]` 在前端 feature 中强制为 `[]`,由 `components[]` 替代
|
|
2142
|
-
- `ComponentSpec` 结构:id / name / description / props(name/type/required)/ events(name/payload)/ state(Record<string,string>)/ apiCalls(调用的端点列表)
|
|
2143
|
-
- `buildDslExtractionPrompt()` 新增 `isFrontend` 参数,前端场景追加提示语
|
|
2144
|
-
|
|
2145
|
-
**修改:** `core/dsl-extractor.ts`
|
|
2146
|
-
|
|
2147
|
-
- `extract()` 新增 `opts.isFrontend?: boolean` 参数
|
|
2148
|
-
- 前端项目自动使用 `dslFrontendSystemPrompt` 和前端提取 prompt
|
|
2149
|
-
- `buildDslContextSection()` 扩展:若 DSL 含 `components[]`,追加 `-- UI Components --` 区块注入到 codegen prompt
|
|
2150
|
-
- 自动检测依赖(react/vue/next/react-native/expo)→ 设置 `isFrontend`
|
|
2151
|
-
|
|
2152
|
-
**修改:** `core/dsl-validator.ts`
|
|
2153
|
-
|
|
2154
|
-
- 新增 `validateComponent()` 函数:校验 `ComponentSpec` 的 id/name/description/props/events/state/apiCalls 字段
|
|
2155
|
-
- `validateDsl()` 增加 `components[]` 可选字段校验(bounded loop,max 50)
|
|
2156
|
-
- `printDslSummary()` 扩展:显示 `Components: N` 及每个组件的 id、name、props/events 数量
|
|
2157
|
-
|
|
2158
|
-
**修改:** `cli/index.ts` — 两处 `extract()` 调用
|
|
2159
|
-
|
|
2160
|
-
- 单 repo 模式:从 `context.dependencies` 检测前端项目,传入 `isFrontend`
|
|
2161
|
-
- 多 repo 模式(`runSingleRepoPipelineInWorkspace`):同样检测并传入 `isFrontend`
|
|
2162
|
-
|
|
2163
|
-
---
|
|
2164
|
-
|
|
2165
|
-
### Fix 2:需求分解上下文注入 — UX 决策基于真实代码而非猜测
|
|
2166
|
-
|
|
2167
|
-
**修改:** `prompts/decompose.prompt.ts`
|
|
2168
|
-
|
|
2169
|
-
`buildDecomposePrompt()` 新增 `frontendContexts?: Map<string, FrontendContext>` 参数:
|
|
2170
|
-
|
|
2171
|
-
对每个前端/移动端 repo,在 prompt 中注入:
|
|
2172
|
-
- `Framework / Test / HTTP client` 基础信息
|
|
2173
|
-
- 现有 hook 文件列表(告诉 AI "reference these in specIdea")
|
|
2174
|
-
- 现有 API wrapper 列表(附注"MUST extend, NOT recreate")
|
|
2175
|
-
- 现有 store 文件列表(附注"add state here, don't create new stores")
|
|
2176
|
-
- API wrapper 前 10 行代码片段(让 AI 知道现有调用模式)
|
|
2177
|
-
|
|
2178
|
-
**修改:** `core/requirement-decomposer.ts`
|
|
2179
|
-
|
|
2180
|
-
- `decompose()` 新增 `frontendContexts?: Map<string, FrontendContext>` 参数,透传到 `buildDecomposePrompt()`
|
|
2181
|
-
|
|
2182
|
-
**修改:** `cli/index.ts` — `runMultiRepoPipeline()`
|
|
2183
|
-
|
|
2184
|
-
- W1 阶段:对 frontend/mobile repo 同步调用 `loadFrontendContext()`,构建 `frontendContexts` Map
|
|
2185
|
-
- W1 输出展示:`framework / httpClient | hooks:N stores:N`
|
|
2186
|
-
- W2 阶段:将 `frontendContexts` 传入 `decomposer.decompose()`
|
|
2187
|
-
|
|
2188
|
-
---
|
|
2189
|
-
|
|
2190
|
-
### Fix 3:前端 Codegen 上下文注入 — AI 不再凭空创建 hook/service
|
|
2191
|
-
|
|
2192
|
-
**修改:** `core/code-generator.ts`
|
|
2193
|
-
|
|
2194
|
-
`runApiMode()` 新增前端感知逻辑:
|
|
2195
|
-
1. 检测 `context.dependencies` 中是否含前端框架(react/vue/next/react-native/expo)
|
|
2196
|
-
2. 如果是前端项目 → 调用 `loadFrontendContext(workingDir)`
|
|
2197
|
-
3. `buildFrontendContextSection()` 输出注入 prompt(展示现有 hook/store/API wrapper 文件和代码)
|
|
2198
|
-
4. `frontendSection` 拼入:
|
|
2199
|
-
- 有 tasks 时:`constitutionSection + dslSection + frontendSection`(传入 `runApiModeWithTasks`)
|
|
2200
|
-
- 无 tasks 时:`plan prompt` 和 `generateFiles` 调用均包含 `frontendSection`
|
|
2201
|
-
5. Plan prompt 新增明确指令:`Extend existing hooks/services/stores — do NOT create new parallel utilities`
|
|
2202
|
-
|
|
2203
|
-
---
|
|
2204
|
-
|
|
2205
|
-
## [0.8.0] 2026-03-23 — 前端支持增强 + 跨项目共享宪法
|
|
2206
|
-
|
|
2207
|
-
### 目标
|
|
2208
|
-
|
|
2209
|
-
两项中优先级优化同步落地:让 ai-spec 真正理解前端项目的结构(而不只是检测框架名称),并将「项目宪法」从单项目升级为「全局 + 项目」双层架构,使团队规范可以跨 repo 共享。
|
|
2210
|
-
|
|
2211
|
-
---
|
|
2212
|
-
|
|
2213
|
-
### #14 前端支持增强 (6.4)
|
|
2214
|
-
|
|
2215
|
-
**修改:** `core/dsl-types.ts`
|
|
2216
|
-
|
|
2217
|
-
新增 `ComponentSpec` 类型:
|
|
2218
|
-
- `ComponentProp`:name / type / required / description
|
|
2219
|
-
- `ComponentEvent`:name / payload(回调事件)
|
|
2220
|
-
- `ComponentSpec`:id / name / description / props / events / state / apiCalls
|
|
2221
|
-
- `SpecDSL.components?: ComponentSpec[]`(前端 DSL 的可选组件规格列表)
|
|
2222
|
-
|
|
2223
|
-
**修改:** `core/frontend-context-loader.ts`
|
|
2224
|
-
|
|
2225
|
-
`FrontendContext` 新增字段:
|
|
2226
|
-
- `testFramework`:自动检测 `rtl` / `cypress` / `vitest` / `jest` / `unknown`
|
|
2227
|
-
- `apiWrapperContent`:前 2 个 API 封装文件的前 60 行内容(阻止 AI 重复创建请求工具)
|
|
2228
|
-
- `hookFiles`:`use*.ts/tsx` hook 文件列表(15 个以内)
|
|
2229
|
-
- `hookPatterns`:前 2 个 hook 文件的前 30 行内容(提供命名和结构参考)
|
|
2230
|
-
- `storeFiles`:Zustand store / Redux slice 等状态文件列表
|
|
2231
|
-
|
|
2232
|
-
`buildFrontendContextSection()` 更新:
|
|
2233
|
-
- 展示 API wrapper 代码(附注"extend these, do NOT create new request utilities")
|
|
2234
|
-
- 展示 hook 列表和结构示例
|
|
2235
|
-
- 展示 store 文件列表
|
|
2236
|
-
|
|
2237
|
-
**修改:** `core/test-generator.ts`
|
|
2238
|
-
|
|
2239
|
-
前后端感知测试生成:
|
|
2240
|
-
- `isFrontendProject()` — 通过 package.json 检测前端项目(react / vue / next / react-native)
|
|
2241
|
-
- `generate()` 自动分叉:前端走 RTL/Cypress 模板,后端走原有 Jest/Vitest 模板
|
|
2242
|
-
- 前端模式:把 `ComponentSpec` / hook 文件 / API wrapper 结构注入 prompt
|
|
2243
|
-
- 在 console 输出显示 `Mode: frontend (react / rtl)` 等信息
|
|
2244
|
-
|
|
2245
|
-
**修改:** `prompts/testgen.prompt.ts`
|
|
2246
|
-
|
|
2247
|
-
新增 `testGenFrontendSystemPrompt`:
|
|
2248
|
-
- 专为 React Testing Library 编写的规则集
|
|
2249
|
-
- 覆盖:渲染测试 / props 测试 / 交互事件 / 加载状态 / 乐观更新回滚 / 节流防抖(`jest.useFakeTimers()`)
|
|
2250
|
-
|
|
2251
|
-
---
|
|
2252
|
-
|
|
2253
|
-
### #15 跨项目共享宪法 (6.3)
|
|
2254
|
-
|
|
2255
|
-
**新文件:** `core/global-constitution.ts`
|
|
2256
|
-
|
|
2257
|
-
- `GLOBAL_CONSTITUTION_FILE = ".ai-spec-global-constitution.md"`
|
|
2258
|
-
- `loadGlobalConstitution(extraRoots)` — 按优先级搜索:传入目录 → 用户 home
|
|
2259
|
-
- `mergeConstitutions(global, project)` — 双层注入:全局宪法 + 项目宪法(项目优先)
|
|
2260
|
-
- `saveGlobalConstitution(content, targetDir)` — 保存到指定目录(默认 home)
|
|
2261
|
-
|
|
2262
|
-
**新文件:** `prompts/global-constitution.prompt.ts`
|
|
2263
|
-
|
|
2264
|
-
- `globalConstitutionSystemPrompt`:5 个章节(团队 API 规范 / 命名规范 / 禁区 / 跨端契约规范 / 日志规范)
|
|
2265
|
-
- `buildGlobalConstitutionPrompt(summaries)` — 构建跨 repo 分析 prompt
|
|
2266
|
-
|
|
2267
|
-
**修改:** `core/context-loader.ts`
|
|
2268
|
-
|
|
2269
|
-
`loadConstitution()` 升级为双层宪法加载:
|
|
2270
|
-
1. 加载项目宪法(`.ai-spec-constitution.md`)
|
|
2271
|
-
2. 搜索全局宪法(项目父目录 → home dir)
|
|
2272
|
-
3. 如果全局宪法存在 → `mergeConstitutions()` 合并注入
|
|
2273
|
-
4. 如果只有项目宪法 → 直接使用(完全向后兼容)
|
|
2274
|
-
|
|
2275
|
-
**修改:** `cli/index.ts`
|
|
2276
|
-
|
|
2277
|
-
`ai-spec init` 新增 `--global` 选项:
|
|
2278
|
-
- 生成全局宪法而非项目宪法(写入当前目录的 `.ai-spec-global-constitution.md`)
|
|
2279
|
-
- 使用 `globalConstitutionSystemPrompt` 生成团队级规范
|
|
2280
|
-
- 支持 `--force` 覆盖已有全局宪法
|
|
2281
|
-
|
|
2282
|
-
`ai-spec init`(项目模式)新增:
|
|
2283
|
-
- 检测全局宪法后显示提示:`ℹ Global constitution detected: <path>`,提示用户项目规则优先
|
|
2284
|
-
|
|
2285
|
-
---
|
|
2286
|
-
|
|
2287
|
-
## [0.7.0] 2026-03-23 — Phase 4: 多 Repo 工作区编排
|
|
2288
|
-
|
|
2289
|
-
### 目标
|
|
2290
|
-
|
|
2291
|
-
将 ai-spec 从「单项目工具」升级为「多 Repo 需求编排器」。输入一句需求,系统自动分析它对各端(后端/前端/移动端)意味着什么,按依赖顺序依次为每个 Repo 运行完整流水线,并通过契约桥接确保后端接口定义直接成为前端开发的输入上下文,消灭前后端对接歧义。
|
|
2292
|
-
|
|
2293
|
-
---
|
|
2294
|
-
|
|
2295
|
-
### #13 Workspace 层
|
|
2296
|
-
|
|
2297
|
-
**新文件:** `core/workspace-loader.ts`
|
|
2298
|
-
|
|
2299
|
-
- `RepoConfig`:name / path / type / role / constitution(运行时加载)
|
|
2300
|
-
- `WorkspaceConfig`:name + repos 数组
|
|
2301
|
-
- `detectRepoType(absPath)`:从 package.json 依赖自动检测 repo 类型和角色
|
|
2302
|
-
- react-native/expo → mobile
|
|
2303
|
-
- next → frontend
|
|
2304
|
-
- react → frontend
|
|
2305
|
-
- vue → frontend
|
|
2306
|
-
- koa → backend
|
|
2307
|
-
- express/prisma/mongoose → backend
|
|
2308
|
-
- `WorkspaceLoader.load()`:加载 `.ai-spec-workspace.json`,不存在时返回 null(优雅降级)
|
|
2309
|
-
- `WorkspaceLoader.autoDetect()`:扫描当前目录的子目录,自动发现包含 package.json 的 repo
|
|
2310
|
-
- `WorkspaceLoader.resolveRepoPaths()`:解析相对路径 + 自动加载各 repo 的宪法文件
|
|
2311
|
-
- `WorkspaceLoader.save()`:保存时自动去掉运行时字段(constitution)
|
|
2312
|
-
- `WorkspaceLoader.getProcessingOrder()`:按 backend → shared → frontend → mobile 排序
|
|
2313
|
-
|
|
2314
|
-
---
|
|
2315
|
-
|
|
2316
|
-
### #14 需求分解器
|
|
2317
|
-
|
|
2318
|
-
**新文件:** `core/requirement-decomposer.ts` + `prompts/decompose.prompt.ts`
|
|
2319
|
-
|
|
2320
|
-
**核心类型:**
|
|
2321
|
-
|
|
2322
|
-
```typescript
|
|
2323
|
-
UxDecision {
|
|
2324
|
-
throttleMs?: number // e.g. 300 — 按钮点击类操作
|
|
2325
|
-
debounceMs?: number // e.g. 500 — 搜索输入类操作
|
|
2326
|
-
optimisticUpdate: boolean // 先更新 UI,再等服务器确认
|
|
2327
|
-
reloadOnSuccess?: string[]// 成功后需要重新拉取哪些接口(通常为空)
|
|
2328
|
-
errorRollback: boolean // 乐观更新失败时回滚
|
|
2329
|
-
loadingState: boolean // 是否显示 loading
|
|
2330
|
-
notes?: string // 额外协作说明
|
|
2331
|
-
}
|
|
2332
|
-
|
|
2333
|
-
RepoRequirement {
|
|
2334
|
-
repoName, role, specIdea
|
|
2335
|
-
isContractProvider // 该 repo 的 DSL 成为其他 repo 的契约
|
|
2336
|
-
dependsOnRepos // 依赖哪些 repo 先完成
|
|
2337
|
-
uxDecisions // 仅前端/移动端有
|
|
2338
|
-
}
|
|
2339
|
-
|
|
2340
|
-
DecompositionResult {
|
|
2341
|
-
originalRequirement, summary
|
|
2342
|
-
repos: RepoRequirement[]
|
|
2343
|
-
coordinationNotes // 跨 repo 协调说明
|
|
2344
|
-
}
|
|
2345
|
-
```
|
|
2346
|
-
|
|
2347
|
-
**Prompt 设计(`decompose.prompt.ts`):**
|
|
2348
|
-
- 包含 throttle vs debounce 判断指南(高频点击用 throttle,输入搜索用 debounce)
|
|
2349
|
-
- 包含乐观更新模式说明(点赞/收藏等用 optimistic,支付等用等待确认)
|
|
2350
|
-
- 要求输出精确的接口路径、方法、返回字段,不允许模糊描述
|
|
2351
|
-
- 输出标准 JSON,包含完整示例
|
|
2352
|
-
|
|
2353
|
-
**鲁棒性:**
|
|
2354
|
-
- 分解失败时降级:自动为所有 repo 生成基础 requirement,后端 isContractProvider=true,前端依赖后端
|
|
2355
|
-
- `sortByDependency()`:拓扑排序,循环依赖时给出警告但不崩溃
|
|
2356
|
-
|
|
2357
|
-
---
|
|
2358
|
-
|
|
2359
|
-
### #15 跨 Repo 契约桥接
|
|
2360
|
-
|
|
2361
|
-
**新文件:** `core/contract-bridge.ts`
|
|
2362
|
-
|
|
2363
|
-
**核心功能:**
|
|
2364
|
-
- `buildFrontendApiContract(dsl)`:将后端 SpecDSL 转换为前端可消费的 API 契约
|
|
2365
|
-
- 生成 TypeScript interface 定义(Request / Response 类型)
|
|
2366
|
-
- `inferTsType()`:从 DSL 字段描述启发式推断 TS 类型(boolean/number/string/datetime)
|
|
2367
|
-
- `buildResponseInterface()`:优先从模型字段推断响应类型,降级到从 successDescription 关键词推断
|
|
2368
|
-
- `buildContractContextSection(contract)`:生成注入 prompt 的文本块,明确标注「不得更改路径/方法/类型」
|
|
2369
|
-
|
|
2370
|
-
**前端 Spec Prompt:** `prompts/frontend-spec.prompt.ts`
|
|
2371
|
-
- 包含 UX 工程模式参考(throttle/debounce/optimistic update/state sync 最佳实践)
|
|
2372
|
-
- `buildFrontendSpecPrompt(opts)`:将 API 契约 + UX 决策 + 前端上下文组合成完整 prompt
|
|
2373
|
-
|
|
2374
|
-
---
|
|
2375
|
-
|
|
2376
|
-
### #16 前端项目上下文加载
|
|
2377
|
-
|
|
2378
|
-
**新文件:** `core/frontend-context-loader.ts`
|
|
2379
|
-
|
|
2380
|
-
- 检测框架(react / next / vue / react-native)
|
|
2381
|
-
- 检测状态管理(zustand / redux / jotai / pinia 等)
|
|
2382
|
-
- 检测 HTTP 客户端(axios / react-query / swr / fetch)
|
|
2383
|
-
- 检测 UI 库(tailwind / antd / shadcn / MUI 等)
|
|
2384
|
-
- 检测路由模式(react-router / next-app-router / vue-router)
|
|
2385
|
-
- 扫描现有 api/ / services/ 目录
|
|
2386
|
-
- 扫描 component 模式样本
|
|
2387
|
-
|
|
2388
|
-
---
|
|
2389
|
-
|
|
2390
|
-
### Pipeline 集成
|
|
2391
|
-
|
|
2392
|
-
**`cli/index.ts` 变更:**
|
|
2393
|
-
|
|
2394
|
-
**新增:`workspace` 命令**
|
|
2395
|
-
|
|
2396
|
-
```
|
|
2397
|
-
ai-spec workspace init # 交互式设置 .ai-spec-workspace.json
|
|
2398
|
-
ai-spec workspace status # 显示当前 workspace 配置和路径解析状态
|
|
2399
|
-
```
|
|
2400
|
-
|
|
2401
|
-
`workspace init` 流程:
|
|
2402
|
-
1. 询问 workspace 名称
|
|
2403
|
-
2. 循环添加 repo(name + 相对路径),自动检测 type/role
|
|
2404
|
-
3. 保存 `.ai-spec-workspace.json`
|
|
2405
|
-
|
|
2406
|
-
**修改:`create` 命令增加 workspace 模式检测**
|
|
2407
|
-
|
|
2408
|
-
- 启动时检测 `.ai-spec-workspace.json` 是否存在
|
|
2409
|
-
- 存在时进入多 Repo 流水线(`runMultiRepoPipeline`)
|
|
2410
|
-
- 不存在时静默 fallback 到原单 Repo 流水线
|
|
2411
|
-
|
|
2412
|
-
**`runMultiRepoPipeline()` 流程:**
|
|
2413
|
-
|
|
2414
|
-
```
|
|
2415
|
-
[W1] 加载所有 repo 的 ProjectContext
|
|
2416
|
-
[W2] AI 分解需求 → DecompositionResult(含 UxDecision)
|
|
2417
|
-
[W3] 展示分解预览 + 用户确认(--auto 跳过)
|
|
2418
|
-
[W4] 按依赖顺序逐 repo 运行完整流水线
|
|
2419
|
-
后端完成后 → buildFrontendApiContract(dsl)
|
|
2420
|
-
→ buildContractContextSection(contract)
|
|
2421
|
-
→ 注入到下一个 frontend repo 的 spec idea 中
|
|
2422
|
-
[W5] 最终汇总(所有 repo 的 spec / DSL / worktree 路径)
|
|
2423
|
-
```
|
|
2424
|
-
|
|
2425
|
-
**`runSingleRepoPipelineInWorkspace()` 关键特性:**
|
|
2426
|
-
- 接受 `contractContextSection` 参数,注入 spec idea 前端
|
|
2427
|
-
- 每个 repo 独立容错,失败不中断其他 repo
|
|
2428
|
-
- 自动为每个 repo 生成宪法(如不存在)
|
|
2429
|
-
|
|
2430
|
-
---
|
|
2431
|
-
|
|
2432
|
-
### 命令新增
|
|
2433
|
-
|
|
2434
|
-
```
|
|
2435
|
-
ai-spec workspace init # 初始化 workspace
|
|
2436
|
-
ai-spec workspace status # 查看 workspace 状态
|
|
2437
|
-
ai-spec create "..." # 自动检测 workspace 模式
|
|
2438
|
-
```
|
|
2439
|
-
|
|
2440
|
-
---
|
|
2441
|
-
|
|
2442
|
-
### 文档
|
|
2443
|
-
|
|
2444
|
-
- `RELEASE_LOG.md`:本条目
|
|
2445
|
-
|
|
2446
|
-
---
|
|
2447
|
-
|
|
2448
|
-
## [0.6.0] 2026-03-23 — Phase 3: 测试生成 · 错误反馈 · 经验积累
|
|
2449
|
-
|
|
2450
|
-
### 目标
|
|
2451
|
-
|
|
2452
|
-
在代码生成后引入"自动质检"闭环:生成测试骨架 → 运行测试/lint → AI 自动修复 → 代码审查 → 将审查教训写回项目宪法,使宪法随每次迭代持续进化。
|
|
2453
|
-
|
|
2454
|
-
---
|
|
2455
|
-
|
|
2456
|
-
### #10 测试骨架生成
|
|
2457
|
-
|
|
2458
|
-
**新文件:** `core/test-generator.ts` + `prompts/testgen.prompt.ts`
|
|
2459
|
-
|
|
2460
|
-
**触发条件:** 代码生成完成且 DSL 提取成功时自动运行(可用 `--skip-tests` 跳过)
|
|
2461
|
-
|
|
2462
|
-
**生成逻辑:**
|
|
2463
|
-
|
|
2464
|
-
- `buildTestGenPrompt(dsl, testDir)` — 从 DSL 提取测试要点:
|
|
2465
|
-
- 每个端点 → 成功路径 / 参数校验 / 鉴权测试(`auth: true` 时)
|
|
2466
|
-
- 每个模型 → 创建测试 / 唯一约束测试(有 `unique` 字段时)
|
|
2467
|
-
- 每个业务行为 → 边界用例
|
|
2468
|
-
- `detectTestDir()` — 自动检测 `tests/` · `test/` · `__tests__/` · `spec/`,默认 `tests/`
|
|
2469
|
-
- AI 返回 `[{ file: "path", content: "source" }]` JSON 数组,逐文件写入
|
|
2470
|
-
|
|
2471
|
-
**Prompt 约束(`testgen.prompt.ts`):**
|
|
2472
|
-
|
|
2473
|
-
- 使用项目已有测试框架(Jest/Vitest 自动检测)
|
|
2474
|
-
- `describe/it` 骨架结构,不实现断言(placeholder 注释标 TODO)
|
|
2475
|
-
- 每个端点至少:成功路径、参数校验、鉴权(if auth=true)
|
|
2476
|
-
- 每个模型至少:创建、唯一约束(if unique 字段存在)
|
|
2477
|
-
- 最多 2 层 describe 嵌套
|
|
2478
|
-
|
|
2479
|
-
**步骤标记:** `[7/9]`(位于代码生成后、错误反馈前)
|
|
2480
|
-
|
|
2481
|
-
---
|
|
2482
|
-
|
|
2483
|
-
### #11 错误反馈自动修复循环
|
|
2484
|
-
|
|
2485
|
-
**新文件:** `core/error-feedback.ts`
|
|
2486
|
-
|
|
2487
|
-
**触发条件:** 代码生成/测试生成后自动运行(可用 `--skip-error-feedback` 跳过)
|
|
2488
|
-
|
|
2489
|
-
**检测:**
|
|
2490
|
-
|
|
2491
|
-
- `detectTestCommand()` — 检查 `package.json scripts.test`、vitest/jest config 文件
|
|
2492
|
-
- `detectLintCommand()` — 检查 `package.json scripts.lint`、`.eslintrc*` / `eslint.config.js`
|
|
2493
|
-
- 两者都未检测到时跳过整个 feedback 步骤
|
|
2494
|
-
|
|
2495
|
-
**修复流程(最多 2 次 cycle):**
|
|
2496
|
-
|
|
2497
|
-
```
|
|
2498
|
-
cycle 1: runCommand(testCmd) → parseErrors() → attemptFix()
|
|
2499
|
-
cycle 2: runCommand(testCmd) → 验证修复结果
|
|
2500
|
-
```
|
|
2501
|
-
|
|
2502
|
-
- `parseErrors()` — 取输出最后 80 行,过滤 node_modules / npm timing / stack trace 噪音
|
|
2503
|
-
- `attemptFix()` — 按文件分组错误,逐文件提交 AI,prompt 携带 DSL 上下文 + 当前文件内容
|
|
2504
|
-
- 每次 fix 后重写文件,cycle 通过则提前结束
|
|
2505
|
-
- 2 次后仍有错误 → 黄色警告,不中断流水线
|
|
2506
|
-
|
|
2507
|
-
**选项:** `ErrorFeedbackOptions { maxCycles, skipTests, skipLint }`
|
|
2508
|
-
|
|
2509
|
-
**步骤标记:** `[8/9]`(位于测试生成后、代码审查前)
|
|
2510
|
-
|
|
2511
|
-
---
|
|
2512
|
-
|
|
2513
|
-
### #12 知识记忆 / 经验积累
|
|
2514
|
-
|
|
2515
|
-
**新文件:** `core/knowledge-memory.ts`
|
|
2516
|
-
|
|
2517
|
-
**触发条件:** 代码审查完成后自动运行(`--skip-review` 时跳过)
|
|
2518
|
-
|
|
2519
|
-
**提取流程:**
|
|
2520
|
-
|
|
2521
|
-
1. `extractIssuesFromReview(reviewText)` — 解析审查报告中的 `## ⚠️ 问题` 章节,提取最多 10 条 issue
|
|
2522
|
-
2. `categorizeIssue(text)` — 根据关键词自动分类:security 🔒 / performance ⚡ / bug 🐛 / pattern 📐 / general 📝
|
|
2523
|
-
3. `appendLessonsToConstitution(projectRoot, issues)` — 追加到宪法 `§9 积累教训`:
|
|
2524
|
-
- Section 不存在时自动创建 `## 9. 积累教训 (Accumulated Lessons)`
|
|
2525
|
-
- 存在时追加到 Section 内容末尾(自动找到下一个 `## \d` 前的位置)
|
|
2526
|
-
- **去重**:issue 描述前 50 字符与宪法现有内容匹配时跳过
|
|
2527
|
-
|
|
2528
|
-
**宪法 §9 格式:**
|
|
2529
|
-
|
|
2530
|
-
```markdown
|
|
2531
|
-
## 9. 积累教训 (Accumulated Lessons)
|
|
2532
|
-
- 🔒 **[2026-03-23]** 登录接口缺少 rate limiting
|
|
2533
|
-
- 🐛 **[2026-03-23]** 异步错误未被全局 error handler 捕获
|
|
2534
|
-
```
|
|
2535
|
-
|
|
2536
|
-
**效果:** 每次 `ai-spec create` 运行时宪法(含 §9)会注入所有 Spec/代码生成 prompt,积累的教训在后续迭代中自动生效。
|
|
2537
|
-
|
|
2538
|
-
---
|
|
2539
|
-
|
|
2540
|
-
### Pipeline 集成
|
|
2541
|
-
|
|
2542
|
-
**`cli/index.ts` 变更:**
|
|
2543
|
-
|
|
2544
|
-
- 新增 `--skip-tests` 选项
|
|
2545
|
-
- 新增 `--skip-error-feedback` 选项
|
|
2546
|
-
- 新增 `[7/9]` 测试生成步骤(代码生成后)
|
|
2547
|
-
- 新增 `[8/9]` 错误反馈步骤
|
|
2548
|
-
- 原 `[7/7]` 代码审查 → 改为 `[9/9]`
|
|
2549
|
-
- 审查完成后捕获返回值,传入 `accumulateReviewKnowledge()`
|
|
2550
|
-
- Done 摘要新增测试骨架文件数
|
|
2551
|
-
- 版本号升至 `0.6.0`
|
|
2552
|
-
|
|
2553
|
-
---
|
|
2554
|
-
|
|
2555
|
-
### 其他变更
|
|
2556
|
-
|
|
2557
|
-
- **移除小米 MiMo provider**:从 `PROVIDER_CATALOG` 和 README 中移除 `mimo` / `MIMO_API_KEY` / `mimo-v2-pro`。MiMo V2 Pro 模型目前暂不支持。
|
|
2558
|
-
|
|
2559
|
-
---
|
|
2560
|
-
|
|
2561
|
-
### 文档
|
|
2562
|
-
|
|
2563
|
-
- `README.md`:
|
|
2564
|
-
- 流水线概览图加入 Phase 3 全部步骤
|
|
2565
|
-
- 快速开始示例输出更新(含 Phase 3 步骤日志)
|
|
2566
|
-
- 支持模型表移除 MiMo
|
|
2567
|
-
- `create` 选项表新增 `--skip-tests`、`--skip-error-feedback`
|
|
2568
|
-
- 新增 "Step 7 — 测试骨架生成"、"Step 8 — 错误反馈自动修复"、"Step 9 — 代码审查 + 经验积累" 章节
|
|
2569
|
-
- 项目结构更新(新增 3 个 Phase 3 文件)
|
|
2570
|
-
- 命令总览更新,新增所有命令与选项速查表
|
|
2571
|
-
- `RELEASE_LOG.md`:本条目
|
|
2572
|
-
|
|
2573
|
-
---
|
|
2574
|
-
|
|
2575
|
-
## [0.5.0] 2026-03-23 — Phase 2: DSL 转换 · Schema · 校验
|
|
2576
|
-
|
|
2577
|
-
### 目标
|
|
2578
|
-
|
|
2579
|
-
在 Approval Gate 之后、代码生成之前,引入结构化 JSON DSL 作为 Spec → Code 的中间层。DSL 提供确定性的端点签名和数据模型定义,减少 codegen 阶段的 AI 猜测。
|
|
2580
|
-
|
|
2581
|
-
---
|
|
2582
|
-
|
|
2583
|
-
### #5 DSL Schema / 类型系统
|
|
2584
|
-
|
|
2585
|
-
**新文件:** `core/dsl-types.ts`
|
|
2586
|
-
|
|
2587
|
-
定义 `SpecDSL` 及其所有子类型,**设计约束**:
|
|
2588
|
-
- 所有类型完全扁平,无递归类型定义
|
|
2589
|
-
- 无泛型 / 条件类型 / 映射类型,保持 TS 编译简单
|
|
2590
|
-
- `request/response` schema 用 `Record<string, string>`(字段名 → 类型描述字符串),避免深层嵌套引发幻觉
|
|
2591
|
-
|
|
2592
|
-
**类型结构:**
|
|
2593
|
-
```
|
|
2594
|
-
SpecDSL
|
|
2595
|
-
├── version: "1.0"
|
|
2596
|
-
├── feature: FeatureMeta { id, title, description }
|
|
2597
|
-
├── models: DataModel[]
|
|
2598
|
-
│ └── DataModel { name, description?, fields: ModelField[], relations?: string[] }
|
|
2599
|
-
│ └── ModelField { name, type, required, unique?, description? }
|
|
2600
|
-
├── endpoints: ApiEndpoint[]
|
|
2601
|
-
│ └── ApiEndpoint { id, method, path, description, auth, request?, successStatus, successDescription, errors? }
|
|
2602
|
-
│ ├── RequestSchema { body?, query?, params? } — values are FieldMap (Record<string,string>)
|
|
2603
|
-
│ └── ResponseError { status, code, description }
|
|
2604
|
-
└── behaviors: BusinessBehavior[]
|
|
2605
|
-
└── BusinessBehavior { id, description, trigger?, constraints?: string[] }
|
|
2606
|
-
```
|
|
2607
|
-
|
|
2608
|
-
---
|
|
2609
|
-
|
|
2610
|
-
### #6 DSL 校验器
|
|
2611
|
-
|
|
2612
|
-
**新文件:** `core/dsl-validator.ts`
|
|
2613
|
-
|
|
2614
|
-
**安全设计原则:**
|
|
2615
|
-
- 所有循环以有限数组长度为边界,无递归调用
|
|
2616
|
-
- 硬性上界防护:models ≤ 50,fields/model ≤ 100,endpoints ≤ 100,behaviors ≤ 50,errors/endpoint ≤ 20
|
|
2617
|
-
- 单次遍历收集所有错误(不在第一个错误时抛出),给出完整报告
|
|
2618
|
-
- 精确字段路径:如 `endpoints[1].request.body.userId`
|
|
2619
|
-
- 无外部依赖(不使用 zod / ajv 等)
|
|
2620
|
-
|
|
2621
|
-
**校验规则(关键):**
|
|
2622
|
-
- `method` 枚举校验:只允许 `GET|POST|PUT|PATCH|DELETE`
|
|
2623
|
-
- `path` 必须以 `/` 开头
|
|
2624
|
-
- `auth` 必须是 boolean(不接受字符串 `"true"`)
|
|
2625
|
-
- `successStatus` 必须是 100-599 的整数
|
|
2626
|
-
- `FieldMap` 的值必须是字符串(防止嵌套对象幻觉)
|
|
2627
|
-
- `relations` 必须是字符串数组(plain text,不接受对象)
|
|
2628
|
-
|
|
2629
|
-
**辅助函数:**
|
|
2630
|
-
- `printValidationErrors(errors)` — 彩色错误列表输出
|
|
2631
|
-
- `printDslSummary(dsl)` — 简洁统计 + endpoint 列表
|
|
2632
|
-
|
|
2633
|
-
---
|
|
2634
|
-
|
|
2635
|
-
### #4 DSL 提取器 + Prompt
|
|
2636
|
-
|
|
2637
|
-
**新文件:** `prompts/dsl.prompt.ts` + `core/dsl-extractor.ts`
|
|
2638
|
-
|
|
2639
|
-
**Prompt 抗幻觉设计(9 条 CRITICAL RULES):**
|
|
2640
|
-
1. 只提取明确写出的内容,不推断不补全
|
|
2641
|
-
2. 无 models → `"models": []`,无 behaviors → `"behaviors": []`
|
|
2642
|
-
3. 输出纯 JSON,无 markdown fence,无任何前置/后置文字
|
|
2643
|
-
4. 缺失字段用空字符串 `""`,不能省略字段
|
|
2644
|
-
5. path 必须以 `/` 开头,method 枚举严格
|
|
2645
|
-
6. FieldMap 值必须是类型描述字符串,不能是嵌套对象
|
|
2646
|
-
7. 提供完整 JSON schema 模板供模型对照
|
|
2647
|
-
8. 提供具体 few-shot 示例(带注释说明)
|
|
2648
|
-
9. retry prompt 携带具体错误路径,定向修复
|
|
2649
|
-
|
|
2650
|
-
**提取流程(最多 2 次 retry):**
|
|
2651
|
-
```
|
|
2652
|
-
attempt 1: buildDslExtractionPrompt(spec) → AI → parseJSON → validateDsl
|
|
2653
|
-
成功 → 返回 SpecDSL
|
|
2654
|
-
失败 → 展示错误
|
|
2655
|
-
attempt 2: buildDslRetryPrompt(spec, prevOutput, errors) → AI → parseJSON → validateDsl
|
|
2656
|
-
成功 → 返回 SpecDSL
|
|
2657
|
-
失败 → handleFailure()
|
|
2658
|
-
```
|
|
2659
|
-
|
|
2660
|
-
**JSON 解析容错(`parseJsonFromOutput`):**
|
|
2661
|
-
- 直接以 `{` 开头 → 直接 `JSON.parse`
|
|
2662
|
-
- 有 ` ``` ` fence → 提取 fence 内容再 parse
|
|
2663
|
-
- 都不是 → 找第一个 `{` 到最后一个 `}` 再 parse
|
|
2664
|
-
- 全部失败 → 抛出 `SyntaxError`,触发 retry
|
|
2665
|
-
|
|
2666
|
-
**故障处理:**
|
|
2667
|
-
- `--auto` 模式:失败时静默跳过,不中断流水线
|
|
2668
|
-
- 交互模式:展示选项 `⏭ Skip / ❌ Abort`
|
|
2669
|
-
|
|
2670
|
-
**`buildDslContextSection(dsl)`:**
|
|
2671
|
-
|
|
2672
|
-
将 SpecDSL 转换为紧凑的纯文本摘要(而非 JSON),注入 codegen prompt:
|
|
2673
|
-
- 控制输出大小,避免 token 浪费
|
|
2674
|
-
- 提取最有价值的信息:端点签名(method + path + auth + status)、模型字段、业务规则
|
|
2675
|
-
|
|
2676
|
-
**`loadDslForSpec(specFilePath)`:**
|
|
2677
|
-
|
|
2678
|
-
从 spec 文件路径自动推断 DSL 路径(`.dsl.json` 后缀),加载并重新校验,失败返回 `null`(不抛出)。
|
|
2679
|
-
|
|
2680
|
-
---
|
|
2681
|
-
|
|
2682
|
-
### Pipeline 集成
|
|
2683
|
-
|
|
2684
|
-
**`cli/index.ts` 变更:**
|
|
2685
|
-
- 新增 `--skip-dsl` 选项
|
|
2686
|
-
- 新增 `[DSL]` 步骤(位于 Approval Gate 后、Worktree 前)
|
|
2687
|
-
- Step 5 保存 DSL 文件(`feature-<slug>-v<N>.dsl.json`)
|
|
2688
|
-
- `generateCode()` 传入 `dslFilePath`
|
|
2689
|
-
- Done 摘要新增 DSL 文件路径
|
|
2690
|
-
|
|
2691
|
-
**`core/code-generator.ts` 变更:**
|
|
2692
|
-
- `CodeGenOptions` 新增 `dslFilePath?: string`
|
|
2693
|
-
- `runApiMode()` 自动加载 DSL,调用 `buildDslContextSection()` 生成摘要
|
|
2694
|
-
- DSL section 注入:plan prompt(文件规划)和 task codegen prompt(文件生成)都会收到 DSL 上下文
|
|
2695
|
-
- 有 DSL 时打印 `✓ DSL loaded — N endpoints, M models`
|
|
2696
|
-
|
|
2697
|
-
**输出文件新增:**
|
|
2698
|
-
```
|
|
2699
|
-
specs/feature-<slug>-v1.dsl.json ← 与 spec 和 tasks 文件并排
|
|
2700
|
-
```
|
|
2701
|
-
|
|
2702
|
-
---
|
|
2703
|
-
|
|
2704
|
-
### 文档
|
|
2705
|
-
|
|
2706
|
-
- `README.md`:
|
|
2707
|
-
- 流水线概览图加入 DSL 步骤
|
|
2708
|
-
- 快速开始示例输出更新(含 DSL 步骤日志)
|
|
2709
|
-
- `create` 选项表新增 `--skip-dsl`
|
|
2710
|
-
- 新增 "Step DSL" 工作流章节(含结构说明、抗幻觉设计、示例 DSL JSON)
|
|
2711
|
-
- 项目结构更新(新增 3 个 DSL 文件)
|
|
2712
|
-
- `RELEASE_LOG.md`:本条目
|
|
2713
|
-
|
|
2714
|
-
---
|
|
2715
|
-
|
|
2716
|
-
> 记录每次迭代的功能变更、架构调整和修复。
|
|
2717
|
-
> 格式:`[版本] 日期 — 变更摘要`
|
|
2718
|
-
|
|
2719
|
-
---
|
|
2720
|
-
|
|
2721
|
-
## [0.4.0] 2026-03-23 — Phase 1: 工业化流水线基础设施
|
|
2722
|
-
|
|
2723
|
-
### 目标
|
|
2724
|
-
|
|
2725
|
-
为 ai-spec 补充"可工业化 AI 开发流水线"的三个基础模块:
|
|
2726
|
-
Spec 版本管理、人工审批门禁、增量构建续跑。
|
|
2727
|
-
|
|
2728
|
-
---
|
|
2729
|
-
|
|
2730
|
-
### #3 Spec Versioning & Diff
|
|
2731
|
-
|
|
2732
|
-
**新文件:** `core/spec-versioning.ts`
|
|
2733
|
-
|
|
2734
|
-
- `slugify(idea)` — 自然语言需求转安全文件名 slug
|
|
2735
|
-
- 示例:`"用户登录 with OAuth2"` → `"--with-oauth2"`(CJK 字符过滤后取 ascii 部分)
|
|
2736
|
-
- `findLatestVersion(specsDir, slug)` — 扫描 `specs/` 目录,返回最新版本的路径、版本号和内容
|
|
2737
|
-
- `nextVersionPath(specsDir, slug)` — 自动递增版本号,返回下一个文件路径
|
|
2738
|
-
- 输出:`feature-<slug>-v1.md`、`feature-<slug>-v2.md` …
|
|
2739
|
-
- `computeDiff(oldText, newText)` — 基于 LCS 算法的行级 diff,无外部依赖
|
|
2740
|
-
- 大文件(> 800 行)自动降级为 O(n) 简化 diff,避免内存溢出
|
|
2741
|
-
- `printDiff(diff)` — 彩色 unified-style diff 输出(`+` 绿 / `-` 红 / 上下文灰)
|
|
2742
|
-
- `printDiffSummary(diff, label)` — 单行摘要:`+12 -3 lines`
|
|
2743
|
-
|
|
2744
|
-
**变更:**
|
|
2745
|
-
|
|
2746
|
-
- `cli/index.ts`:Spec 文件名从 `feature-{timestamp}.md` 改为 `feature-{slug}-v{N}.md`
|
|
2747
|
-
- `core/spec-refiner.ts`:AI Polish 完成后自动展示变更 diff,让用户在打开编辑器前预览改动
|
|
2748
|
-
|
|
2749
|
-
---
|
|
2750
|
-
|
|
2751
|
-
### #7 Approval Gate(人工确认检查点)
|
|
2752
|
-
|
|
2753
|
-
**变更:** `cli/index.ts` 新增 `[3.5/6]` 步骤
|
|
2754
|
-
|
|
2755
|
-
在 Spec 润色完成(Step 3)与 Git Worktree 创建(Step 4)之间插入正式的人工审批门禁:
|
|
2756
|
-
|
|
2757
|
-
**展示信息:**
|
|
2758
|
-
- Spec 行数 / 词数
|
|
2759
|
-
- 已生成的 task 数量
|
|
2760
|
-
- 若存在历史版本,自动对比并展示彩色 diff(版本 v1 → v2 的变化)
|
|
2761
|
-
|
|
2762
|
-
**三选一操作:**
|
|
2763
|
-
- `✅ Proceed` — 确认,继续代码生成
|
|
2764
|
-
- `📋 View full spec` — 在终端完整展示 Spec 内容,再次询问是否继续
|
|
2765
|
-
- `❌ Abort` — 中止,Spec **不写入磁盘**
|
|
2766
|
-
|
|
2767
|
-
**跳过条件:** `--auto` 模式自动选 Proceed,跳过此步骤(适合 CI/全自动流水线)
|
|
2768
|
-
|
|
2769
|
-
---
|
|
2770
|
-
|
|
2771
|
-
### #9 Incremental Build + `--resume`
|
|
2772
|
-
|
|
2773
|
-
**变更:** `core/code-generator.ts`、`cli/index.ts`
|
|
2774
|
-
|
|
2775
|
-
#### CLI 新增选项
|
|
2776
|
-
|
|
2777
|
-
```
|
|
2778
|
-
--resume 续跑模式:跳过 tasks.json 中已标记为 done 的 task
|
|
2779
|
-
```
|
|
2780
|
-
|
|
2781
|
-
#### claude-code `--auto` 增量执行
|
|
2782
|
-
|
|
2783
|
-
之前:`--auto` 模式将所有 tasks 合并成一个 prompt 发送给 `claude -p`
|
|
2784
|
-
|
|
2785
|
-
现在:`--auto` + tasks 文件存在时,改为**逐 task 执行** `claude -p`:
|
|
2786
|
-
- 每个 task 单独一次 `claude -p` 调用,prompt 包含 task 详情 + spec 路径
|
|
2787
|
-
- 每次调用完成后将 task 状态写入 `tasks.json`(`"status": "done"` 或 `"failed"`)
|
|
2788
|
-
- 任一 task 失败不中断整体流程(标记 `failed`,跳过继续)
|
|
2789
|
-
- 支持 `--resume` 跳过已完成 task
|
|
2790
|
-
|
|
2791
|
-
#### api 模式 resume 增强
|
|
2792
|
-
|
|
2793
|
-
- `runApiModeWithTasks` 接收 `options.resume`,在日志中明确区分 "resume" 和普通 checkpoint 恢复
|
|
2794
|
-
- `--resume` 标志传递链:`cli opts.resume` → `generateCode(options)` → `runApiMode(options)` → `runApiModeWithTasks(options)`
|
|
2795
|
-
|
|
2796
|
-
#### 进度条(两种模式通用)
|
|
2797
|
-
|
|
2798
|
-
新增 `printTaskProgress(completed, total, task, mode)` 辅助函数:
|
|
2799
|
-
|
|
2800
|
-
```
|
|
2801
|
-
[████████░░░░░░░░░░░░] 40% → TASK-002 🔧 Implement FavoriteService
|
|
2802
|
-
[████████░░░░░░░░░░░░] 40% ✓ TASK-001 💾 Add schema — already done
|
|
2803
|
-
```
|
|
2804
|
-
|
|
2805
|
-
- 进度 = `已完成 task 数 / 总 task 数`
|
|
2806
|
-
- 每层对应图标:💾 data / ⚙️ infra / 🔧 service / 🌐 api / 🧪 test
|
|
2807
|
-
- `skip` 模式(已完成 task)使用灰色显示
|
|
2808
|
-
|
|
2809
|
-
---
|
|
2810
|
-
|
|
2811
|
-
### 文档
|
|
2812
|
-
|
|
2813
|
-
- `README.md`:
|
|
2814
|
-
- 更新流水线概览图
|
|
2815
|
-
- 新增 `[3.5/6] Approval Gate` 步骤说明和示例
|
|
2816
|
-
- 更新 Step 3 增加 AI diff 预览说明
|
|
2817
|
-
- 更新 Step 5 增加版本化命名、增量构建、进度条说明
|
|
2818
|
-
- `create` 选项表新增 `--resume`
|
|
2819
|
-
- codegen 模式表更新 claude-code 增量执行说明
|
|
2820
|
-
- 项目结构更新(新增 `spec-versioning.ts`、`RELEASE_LOG.md`)
|
|
2821
|
-
- `RELEASE_LOG.md`:本文件,新建
|
|
2822
|
-
|
|
2823
|
-
---
|
|
2824
|
-
|
|
2825
|
-
## [0.3.0] 2026-03-19 — 项目宪法 + 任务分解 + RTK 集成
|
|
2826
|
-
|
|
2827
|
-
### 新功能
|
|
2828
|
-
|
|
2829
|
-
#### `ai-spec init` 命令
|
|
2830
|
-
|
|
2831
|
-
新增独立的 `init` 命令,分析代码库并生成项目宪法(`.ai-spec-constitution.md`)。
|
|
2832
|
-
|
|
2833
|
-
宪法包含 8 个章节:架构规则、命名规范、API 规范、数据层规范、错误处理规范、禁区、测试规范、共享配置文件清单。
|
|
2834
|
-
|
|
2835
|
-
`ai-spec create` 会在 Step 1 自动检测宪法是否存在,不存在时自动运行 init。
|
|
2836
|
-
|
|
2837
|
-
#### Task 分解
|
|
2838
|
-
|
|
2839
|
-
Spec 生成后自动分解为结构化 `tasks.json`,包含:
|
|
2840
|
-
- `id`、`title`、`layer`(data / infra / service / api / test)
|
|
2841
|
-
- `filesToTouch`、`acceptanceCriteria`、`dependencies`、`priority`
|
|
2842
|
-
- `status`(运行时写入:pending / done / failed)
|
|
2843
|
-
|
|
2844
|
-
任务按层级顺序排列:`data → infra → service → api → test`
|
|
2845
|
-
|
|
2846
|
-
Spec + Tasks 通过单次 AI 调用完成(`core/combined-generator.ts`),节省 token。
|
|
2847
|
-
|
|
2848
|
-
`api` 模式代码生成检测到 tasks 文件时自动切换 task-by-task 模式,精度更高。
|
|
2849
|
-
|
|
2850
|
-
#### RTK 集成
|
|
2851
|
-
|
|
2852
|
-
检测 `rtk` binary 是否可用,若可用则在 `claude-code` 模式中自动使用 `rtk claude` 替代 `claude` 执行,减少 claude code 会话中的 token 消耗。
|
|
2853
|
-
|
|
2854
|
-
`--auto` 模式下以 `rtk claude -p` 非交互方式执行。
|
|
2855
|
-
|
|
2856
|
-
### 变更
|
|
2857
|
-
|
|
2858
|
-
- `core/context-loader.ts`:新增宪法文件加载、共享配置文件扫描
|
|
2859
|
-
- `core/task-generator.ts`:新建,包含 `SpecTask` 类型、`TaskGenerator`、`updateTaskStatus`
|
|
2860
|
-
- `core/combined-generator.ts`:新建,Spec + Tasks 合并 AI 调用
|
|
2861
|
-
- `core/constitution-generator.ts`:新建
|
|
2862
|
-
- `core/code-generator.ts`:新增 RTK 检测、task-by-task 模式、断点续传
|
|
2863
|
-
- `cli/index.ts`:新增 `init`、`--skip-tasks`、`--auto`、`--fast` 选项
|
|
2864
|
-
|
|
2865
|
-
---
|
|
2866
|
-
|
|
2867
|
-
## [0.2.0] 2026-03-?? — 多 Provider 支持 + 交互式 model 切换
|
|
2868
|
-
|
|
2869
|
-
### 新功能
|
|
2870
|
-
|
|
2871
|
-
- 支持 9 个 AI Provider:Gemini / Claude / OpenAI / DeepSeek / Qwen / GLM / MiniMax / Doubao / MiMo
|
|
2872
|
-
- `ai-spec model` 命令:交互式 provider + model 切换器
|
|
2873
|
-
- `ai-spec config` 命令:项目级默认配置管理(`.ai-spec.json`)
|
|
2874
|
-
- Provider 自动适配:Qwen3 注入 `enable_thinking: false`;OpenAI o1/o3 使用 `developer` role;MiMo 使用 Anthropic 兼容接口
|
|
2875
|
-
|
|
2876
|
-
### 变更
|
|
2877
|
-
|
|
2878
|
-
- `core/spec-generator.ts`:重构为 `AIProvider` 接口 + 各 provider 实现
|
|
2879
|
-
- `cli/index.ts`:新增 `model`、`config` 命令,`create` 新增 `--codegen-provider`、`--codegen-model` 选项
|
|
2880
|
-
|
|
2881
|
-
---
|
|
2882
|
-
|
|
2883
|
-
## [0.1.0] 2026-03-?? — 初始版本
|
|
2884
|
-
|
|
2885
|
-
### 功能
|
|
2886
|
-
|
|
2887
|
-
- `ai-spec create`:调用 Gemini 生成 Spec → 交互式润色 → Git Worktree → Claude Code 生成代码 → AI 代码审查
|
|
2888
|
-
- `ai-spec review`:独立代码审查命令
|
|
2889
|
-
- 支持 `claude-code` / `api` / `plan` 三种代码生成模式
|
|
2890
|
-
- 项目上下文自动扫描(package.json / Prisma schema / 路由文件)
|
|
2891
|
-
|
|
2892
|
-
</details>
|
|
2893
|
-
|
|
2894
|
-
<details>
|
|
2895
|
-
<summary>English</summary>
|
|
2896
|
-
|
|
2897
|
-
# Release Log
|
|
2898
|
-
|
|
2899
|
-
This section provides an English companion view for the detailed Chinese changelog above. It keeps the same chronological direction while summarizing each version at a higher level for bilingual reading.
|
|
2900
|
-
|
|
2901
|
-
## Version Summary
|
|
2902
|
-
|
|
2903
|
-
- **Unreleased** — Synced README, purpose, and RELEASE_LOG to reflect the latest pipeline, feedback loops, SVG diagrams, and observability narrative.
|
|
2904
|
-
- **0.34.0** — Added a static Harness Dashboard and DSL-to-TypeScript type generation.
|
|
2905
|
-
- **0.33.0** — Introduced two pipeline feedback loops: DSL Gap Loop and Review→DSL Loop.
|
|
2906
|
-
- **0.32.0** — Closed the harness data loop with `trend`, `logs`, and more detailed DSL coverage scoring.
|
|
2907
|
-
- **0.31.0** — Introduced the Harness Engineer layer with `promptHash` and inline self-evaluation during `create`.
|
|
2908
|
-
- **0.30.0** — Improved error-fix dependency ordering and multiline import awareness for frontend context extraction.
|
|
2909
|
-
- **0.29.0** — Performed a broad hardening pass across RunLogger instrumentation, update snapshots, score trend output, and dead-code cleanup.
|
|
2910
|
-
- **0.28.0** — Upgraded review from 2-pass to 3-pass by adding impact assessment and code complexity analysis.
|
|
2911
|
-
- **0.27.0** — Added industrial reliability foundations: provider robustness, snapshot restore, and structured RunLog / RunId support.
|
|
2912
|
-
- **0.26.0** — Fixed stability issues in multi-repo review, parallel batch tolerance, and corrupted tasks JSON recovery.
|
|
2913
|
-
- **0.25.0** — Repaired context extraction for HTTP imports, pagination examples, and false crash detection.
|
|
2914
|
-
- **0.24.0** — Fixed lesson counting, `export default`, `impliesRegistration`, and dependency topological sorting issues.
|
|
2915
|
-
- **0.23.0** — Eliminated a filename hallucination bug by correcting `index.vue` generation toward the actual component name.
|
|
2916
|
-
- **0.22.0** — Strengthened frontend three-layer separation by introducing a `view` layer and fixing API→Store naming hallucinations.
|
|
2917
|
-
- **0.21.0** — Fixed store behavior contract extraction, including `fetchTasks` vs `fetchTaskList` hallucination issues.
|
|
2918
|
-
- **0.20.0** — Added one-command mock integration with `--serve` and `--restore`.
|
|
2919
|
-
- **0.19.0** — Rewrote error parsing, completed behavior contract extraction, and fixed Auto Gate behavior.
|
|
2920
|
-
- **0.18.0** — Added `ai-spec learn`, behavior contract injection, and made Approval Gate a hard gate.
|
|
2921
|
-
- **0.17.0** — Injected the full constitution into generation, improved export caching, and added constitution length warnings.
|
|
2922
|
-
- **0.16.0** — Added spec quality pre-assessment, layered code review, and TDD mode.
|
|
2923
|
-
- **0.15.0** — Added parallel task execution for tasks within the same dependency layer.
|
|
2924
|
-
- **0.14.5** — Added extraction and injection of real frontend pagination patterns.
|
|
2925
|
-
- **0.14.4** — Improved frontend output reliability with route index auto-registration and cross-task function-name consistency.
|
|
2926
|
-
- **0.14.3** — Added the welcome screen.
|
|
2927
|
-
- **0.14.2** — Added Java / Maven / Gradle project context awareness.
|
|
2928
|
-
- **0.14.1** — Fixed a critical bug where non-Node repos incorrectly generated TypeScript-oriented output.
|
|
2929
|
-
- **0.14.0** — Unified frontend framework detection and injected frontend context explicitly in task mode.
|
|
2930
|
-
- **0.13.9** — Added component reuse awareness.
|
|
2931
|
-
- **0.13.8** — Fixed store HTTP hallucinations and HTTP client import hallucinations.
|
|
2932
|
-
- **0.13.6** — Fixed layout hallucinations and route registration reliability.
|
|
2933
|
-
- **0.13.5** — Fixed frontend codegen hallucinations and route convention issues.
|
|
2934
|
-
- **0.13.4** — Fixed MiMo `max_tokens` truncation.
|
|
2935
|
-
- **0.13.3** — Fixed DSL validation false positives.
|
|
2936
|
-
- **0.13.2** — Added API key persistence.
|
|
2937
|
-
- **0.13.1** — Auto-skipped worktree for frontend generation and fixed related bugs.
|
|
2938
|
-
- **0.13.0** — Strengthened context awareness and error-feedback behavior.
|
|
2939
|
-
- **0.12.2** — Added PHP / Lumen backend support.
|
|
2940
|
-
- **0.12.1** — Restored MiMo v2 Pro support.
|
|
2941
|
-
- **0.12.0** — Added constitution consolidation with `ai-spec init --consolidate`.
|
|
2942
|
-
- **0.11.0** — Delivered three high-priority additions: incremental update, OpenAPI export, and multi-language codegen prompts.
|
|
2943
|
-
- **0.10.0** — Added Mock Server support and expanded multi-language backend support.
|
|
2944
|
-
- **0.9.0** — Fixed frontend DSL extraction, decomposition context, and codegen injection precision.
|
|
2945
|
-
- **0.8.0** — Enhanced frontend support and added shared global constitutions across projects.
|
|
2946
|
-
- **0.7.0** — Introduced Phase 4 multi-repo workspace orchestration.
|
|
2947
|
-
- **0.6.0** — Introduced Phase 3 test generation, error feedback, and lesson accumulation.
|
|
2948
|
-
- **0.5.0** — Introduced Phase 2 DSL transformation, schema handling, and validation.
|
|
2949
|
-
- **0.4.0** — Introduced Phase 1 industrial pipeline infrastructure.
|
|
2950
|
-
- **0.3.0** — Added project constitution support, task decomposition, and RTK integration.
|
|
2951
|
-
- **0.2.0** — Added multi-provider support and interactive model switching.
|
|
2952
|
-
- **0.1.0** — Initial release with Spec generation, Git worktree isolation, code generation, review, and basic project context scanning.
|
|
2953
|
-
|
|
2954
|
-
## Evolution Themes
|
|
2955
|
-
|
|
2956
|
-
- **Pipeline structure** — The project evolved from prompt-driven generation into a staged, restartable engineering pipeline.
|
|
2957
|
-
- **Project grounding** — Context extraction, constitutions, DSL, and behavior contracts reduce repository-specific hallucinations.
|
|
2958
|
-
- **Quality loops** — Testing, error feedback, review passes, lesson accumulation, and harness scoring create feedback channels after generation.
|
|
2959
|
-
- **Workspace orchestration** — Multi-repo features extend the system from single-repo coding to contract-aware cross-stack delivery.
|
|
2960
|
-
- **Harness observability** — `promptHash`, `harnessScore`, `logs`, `trend`, and `dashboard` turn runs into measurable engineering data.
|
|
2961
|
-
|
|
2962
|
-
</details>
|