ai-spec-dev 0.42.0 → 0.46.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/README.md +33 -17
  2. package/cli/commands/create.ts +232 -11
  3. package/cli/commands/init.ts +310 -107
  4. package/cli/commands/model.ts +7 -11
  5. package/cli/index.ts +1 -1
  6. package/cli/utils.ts +72 -4
  7. package/core/config-defaults.ts +44 -0
  8. package/core/constitution-generator.ts +2 -1
  9. package/core/dsl-extractor.ts +2 -1
  10. package/core/error-feedback.ts +3 -2
  11. package/core/openapi-exporter.ts +3 -2
  12. package/core/repo-store.ts +95 -0
  13. package/core/reviewer.ts +14 -13
  14. package/core/run-logger.ts +3 -4
  15. package/core/run-snapshot.ts +2 -3
  16. package/core/run-trend.ts +3 -4
  17. package/core/spec-generator.ts +27 -42
  18. package/core/token-budget.ts +3 -8
  19. package/core/vcr.ts +3 -1
  20. package/dist/cli/index.js +919 -519
  21. package/dist/cli/index.js.map +1 -1
  22. package/dist/cli/index.mjs +912 -512
  23. package/dist/cli/index.mjs.map +1 -1
  24. package/dist/index.d.mts +3 -2
  25. package/dist/index.d.ts +3 -2
  26. package/dist/index.js +43 -53
  27. package/dist/index.js.map +1 -1
  28. package/dist/index.mjs +43 -53
  29. package/dist/index.mjs.map +1 -1
  30. package/package.json +1 -1
  31. package/demo-backend/.ai-spec-constitution.md +0 -65
  32. package/demo-backend/package.json +0 -21
  33. package/demo-backend/prisma/schema.prisma +0 -22
  34. package/demo-backend/specs/feature-1-bookmark-id-uuid-title-string-required-url-str-v1.dsl.json +0 -186
  35. package/demo-backend/specs/feature-1-bookmark-id-uuid-title-string-required-url-str-v1.md +0 -211
  36. package/demo-backend/src/controllers/bookmark.controller.test.ts +0 -255
  37. package/demo-backend/src/controllers/bookmark.controller.ts +0 -187
  38. package/demo-backend/src/index.ts +0 -17
  39. package/demo-backend/src/routes/bookmark.routes.test.ts +0 -264
  40. package/demo-backend/src/routes/bookmark.routes.ts +0 -11
  41. package/demo-backend/src/routes/index.ts +0 -8
  42. package/demo-backend/src/services/bookmark.service.test.ts +0 -433
  43. package/demo-backend/src/services/bookmark.service.ts +0 -261
  44. package/demo-backend/tsconfig.json +0 -12
  45. package/demo-frontend/.ai-spec-constitution.md +0 -95
  46. package/demo-frontend/package.json +0 -23
  47. package/demo-frontend/src/App.tsx +0 -12
  48. package/demo-frontend/src/main.tsx +0 -9
  49. package/demo-frontend/tsconfig.json +0 -13
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ai-spec-dev",
3
- "version": "0.42.0",
3
+ "version": "0.46.0",
4
4
  "description": "AI-driven Development Orchestrator SDK & CLI",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -1,65 +0,0 @@
1
- # Project Constitution
2
-
3
- ## 1. 架构规则 (Architecture Rules)
4
- - **分层架构**:项目采用三层架构 `routes → controllers → services → database`。
5
- - **禁止跨层调用**:
6
- - `routes` 层仅负责定义路由和中间件,不能包含业务逻辑。
7
- - `controllers` 层负责接收请求、调用 `services` 和返回响应,不能直接操作数据库。
8
- - `services` 层封装核心业务逻辑,是唯一允许直接调用数据访问层(如 Prisma)的层级。
9
- - **模块组织**:功能模块按领域划分,每个模块包含独立的 `routes.ts`, `controller.ts`, `service.ts` 文件。
10
-
11
- ## 2. 命名规范 (Naming Conventions)
12
- - **文件命名**:使用 `kebab-case`(如 `user-profile.controller.ts`)。
13
- - **变量/函数**:使用 `camelCase`(如 `getUserById`)。
14
- - **类/接口**:使用 `PascalCase`(如 `UserService`)。
15
- - **路由路径**:使用 `kebab-case`,资源名词复数(如 `/api/v1/user-profiles`)。
16
-
17
- ## 3. API 规范 (API Patterns)
18
- - **路由前缀**:
19
- - 客户端 API:`/api/v1/...`
20
- - 管理端 API:`/api/v1/admin/...`
21
- - **统一响应结构**:
22
- ```json
23
- {
24
- "code": 200,
25
- "message": "success",
26
- "data": {}
27
- }
28
- ```
29
- - **错误码规范**:
30
- - `400`:客户端请求错误(参数错误、验证失败)
31
- - `401`:未认证
32
- - `403`:无权限
33
- - `404`:资源不存在
34
- - `500`:服务器内部错误
35
- - **认证/鉴权**:使用 `auth.middleware.ts` 保护需要认证的路由,位于 `middleware/` 目录。
36
-
37
- ## 4. 数据层规范 (Data Layer Rules)
38
- - **数据库访问**:仅允许在 `service` 层使用 Prisma Client 进行数据库操作。
39
- - **模型命名**:Prisma model 使用 `PascalCase`(如 `UserProfile`),表名使用 `snake_case`(如 `user_profiles`)。
40
- - **事务处理**:复杂业务逻辑使用 Prisma 的 `$transaction` API 保证数据一致性。
41
-
42
- ## 5. 错误处理规范 (Error Handling Patterns)
43
- - **统一错误中间件**:使用 `error.middleware.ts` 捕获所有错误,位于 `middleware/` 目录。
44
- - **错误抛出**:在 `service` 或 `controller` 中抛出 `AppError`(自定义错误类,包含 `code` 和 `message`)。
45
- - **已知错误码**:
46
- - `VALIDATION_ERROR` (400)
47
- - `UNAUTHORIZED` (401)
48
- - `FORBIDDEN` (403)
49
- - `NOT_FOUND` (404)
50
- - `INTERNAL_ERROR` (500)
51
-
52
- ## 6. 禁区 (Red Lines — Never Violate)
53
- - [ ] **禁止**在 `controller` 或 `route` 层直接操作数据库(必须通过 `service`)。
54
- - [ ] **禁止**创建重复的配置文件(如错误码、路由定义),必须追加到现有文件。
55
- - [ ] **禁止**使用 `any` 类型,必须定义明确的接口或类型。
56
- - [ ] **禁止**提交未通过 `vitest` 测试的代码。
57
-
58
- ## 7. 测试规范 (Testing Rules)
59
- - **测试文件位置**:与源文件同目录,命名规则为 `*.test.ts` 或 `*.spec.ts`。
60
- - **测试覆盖**:必须为所有 `service` 和 `controller` 方法编写单元测试,关键业务流程需包含集成测试。
61
- - **测试框架**:使用 `vitest` 进行单元测试和集成测试,使用 `supertest` 进行 HTTP 接口测试。
62
-
63
- ## 8. 共享配置文件清单 (Shared Config Files — Append-Only)
64
-
65
- (No shared config files detected — will be populated on first run)
@@ -1,21 +0,0 @@
1
- {
2
- "name": "demo-backend",
3
- "version": "0.1.0",
4
- "private": true,
5
- "scripts": {
6
- "dev": "ts-node src/index.ts",
7
- "build": "tsc",
8
- "test": "vitest run"
9
- },
10
- "dependencies": {
11
- "express": "^4.18.2",
12
- "cors": "^2.8.5"
13
- },
14
- "devDependencies": {
15
- "typescript": "^5.7.0",
16
- "@types/express": "^4.17.21",
17
- "@types/cors": "^2.8.17",
18
- "ts-node": "^10.9.2",
19
- "vitest": "^2.1.0"
20
- }
21
- }
@@ -1,22 +0,0 @@
1
- // This is your Prisma schema file,
2
- // learn more about it in the docs: https://pris.ly/d/prisma-schema
3
-
4
- generator client {
5
- provider = "prisma-client-js"
6
- }
7
-
8
- datasource db {
9
- provider = "postgresql"
10
- url = env("DATABASE_URL")
11
- }
12
-
13
- model Bookmark {
14
- id String @id @default(uuid())
15
- title String
16
- url String
17
- tags String[]
18
- createdAt DateTime @default(now())
19
- updatedAt DateTime @updatedAt
20
-
21
- @@map("bookmarks")
22
- }
@@ -1,186 +0,0 @@
1
- {
2
- "version": "1.0",
3
- "feature": {
4
- "id": "bookmark-management-system",
5
- "title": "Bookmark 管理系统",
6
- "description": "实现个人书签管理系统,支持创建、查看、编辑、删除网页书签,通过标签分类和分页浏览。"
7
- },
8
- "models": [
9
- {
10
- "name": "Bookmark",
11
- "description": "书签数据模型,包含标题、URL和标签等信息",
12
- "fields": [
13
- {
14
- "name": "id",
15
- "type": "String",
16
- "required": true,
17
- "unique": true,
18
- "description": ""
19
- },
20
- {
21
- "name": "title",
22
- "type": "String",
23
- "required": true,
24
- "unique": false,
25
- "description": "书签标题"
26
- },
27
- {
28
- "name": "url",
29
- "type": "String",
30
- "required": true,
31
- "unique": false,
32
- "description": "书签URL,需为有效URL格式"
33
- },
34
- {
35
- "name": "tags",
36
- "type": "String[]",
37
- "required": false,
38
- "unique": false,
39
- "description": "标签数组"
40
- },
41
- {
42
- "name": "createdAt",
43
- "type": "DateTime",
44
- "required": true,
45
- "unique": false,
46
- "description": "创建时间"
47
- },
48
- {
49
- "name": "updatedAt",
50
- "type": "DateTime",
51
- "required": true,
52
- "unique": false,
53
- "description": "更新时间"
54
- }
55
- ],
56
- "relations": []
57
- }
58
- ],
59
- "endpoints": [
60
- {
61
- "id": "EP-001",
62
- "method": "GET",
63
- "path": "/api/v1/bookmarks",
64
- "description": "获取书签分页列表",
65
- "auth": false,
66
- "request": {
67
- "body": {},
68
- "query": {
69
- "limit": "integer (positive, default 20)",
70
- "offset": "integer (non-negative, default 0)"
71
- },
72
- "params": {}
73
- },
74
- "successStatus": 200,
75
- "successDescription": "返回书签数组及总数",
76
- "errors": [
77
- {
78
- "status": 400,
79
- "code": "VALIDATION_ERROR",
80
- "description": "查询参数验证失败,如 limit 或 offset 无效"
81
- },
82
- {
83
- "status": 500,
84
- "code": "INTERNAL_ERROR",
85
- "description": "服务器内部错误"
86
- }
87
- ]
88
- },
89
- {
90
- "id": "EP-002",
91
- "method": "POST",
92
- "path": "/api/v1/bookmarks",
93
- "description": "创建新书签",
94
- "auth": false,
95
- "request": {
96
- "body": {
97
- "title": "string (required, non-empty)",
98
- "url": "string (required, valid URL format)",
99
- "tags": "string array (optional)"
100
- },
101
- "query": {},
102
- "params": {}
103
- },
104
- "successStatus": 201,
105
- "successDescription": "返回新创建的书签信息",
106
- "errors": [
107
- {
108
- "status": 400,
109
- "code": "VALIDATION_ERROR",
110
- "description": "请求体验证失败,如 title 为空或 url 格式无效"
111
- },
112
- {
113
- "status": 500,
114
- "code": "INTERNAL_ERROR",
115
- "description": "服务器内部错误"
116
- }
117
- ]
118
- },
119
- {
120
- "id": "EP-003",
121
- "method": "PUT",
122
- "path": "/api/v1/bookmarks/:id",
123
- "description": "全量更新指定书签",
124
- "auth": false,
125
- "request": {
126
- "body": {
127
- "title": "string (required)",
128
- "url": "string (required, valid URL format)",
129
- "tags": "string array (required)"
130
- },
131
- "query": {},
132
- "params": {
133
- "id": "string (UUID format)"
134
- }
135
- },
136
- "successStatus": 200,
137
- "successDescription": "返回更新后的书签信息",
138
- "errors": [
139
- {
140
- "status": 400,
141
- "code": "VALIDATION_ERROR",
142
- "description": "请求体验证失败"
143
- },
144
- {
145
- "status": 404,
146
- "code": "NOT_FOUND",
147
- "description": "书签未找到"
148
- },
149
- {
150
- "status": 500,
151
- "code": "INTERNAL_ERROR",
152
- "description": "服务器内部错误"
153
- }
154
- ]
155
- },
156
- {
157
- "id": "EP-004",
158
- "method": "DELETE",
159
- "path": "/api/v1/bookmarks/:id",
160
- "description": "删除指定书签",
161
- "auth": false,
162
- "request": {
163
- "body": {},
164
- "query": {},
165
- "params": {
166
- "id": "string (UUID format)"
167
- }
168
- },
169
- "successStatus": 204,
170
- "successDescription": "无响应体",
171
- "errors": [
172
- {
173
- "status": 404,
174
- "code": "NOT_FOUND",
175
- "description": "书签未找到"
176
- },
177
- {
178
- "status": 500,
179
- "code": "INTERNAL_ERROR",
180
- "description": "服务器内部错误"
181
- }
182
- ]
183
- }
184
- ],
185
- "behaviors": []
186
- }
@@ -1,211 +0,0 @@
1
- # Feature Spec: Bookmark 管理系统
2
-
3
- ## 1. 功能概述 (Overview)
4
- 本功能旨在实现一个基础的个人书签管理系统。它允许用户创建、查看、编辑和删除网页书签,并支持通过标签进行简单分类和分页浏览,解决了个人或团队对常用网页链接进行集中存储和快速检索的需求。
5
-
6
- ## 2. 背景与动机 (Background)
7
- - **当前问题**:用户或团队成员可能通过浏览器书签栏、笔记软件或聊天记录零散地保存网页链接,缺乏统一的管理界面,难以共享、检索和分类。
8
- - **构建理由**:作为系统的基础数据管理功能,为后续可能的搜索、分享、高级分类等功能奠定数据基础。
9
- - **用户价值**:提供一个集中、结构化的界面来管理个人或项目相关的网页资源,提升信息获取效率。
10
-
11
- ## 3. 用户故事 (User Stories)
12
- - 作为 **用户**,我希望能 **创建一个新的书签(包含标题、URL和标签)**,以便 **保存我感兴趣的网页链接**。
13
- - 作为 **用户**,我希望能 **以分页列表的形式查看所有书签**,以便 **高效地浏览和找到目标书签**。
14
- - 作为 **用户**,我希望能 **编辑已保存书签的信息**,以便 **修正错误或更新信息**。
15
- - 作为 **用户**,我希望能 **删除不再需要的书签**,以便 **保持列表的整洁和相关性**。
16
-
17
- ## 4. 功能需求 (Functional Requirements)
18
-
19
- ### 4.1 核心功能
20
- - [ ] **Bookmark 数据模型**:实现包含 `id` (UUID), `title` (必填字符串), `url` (必填,需为有效URL格式), `tags` (字符串数组), `createdAt`, `updatedAt` 字段的模型。
21
- - [ ] **分页列表接口**:提供 `GET /api/v1/bookmarks` 接口,支持 `limit` 和 `offset` 查询参数进行分页,返回书签数组及总数。
22
- - [ ] **创建书签接口**:提供 `POST /api/v1/bookmarks` 接口,接收 `{ title, url, tags? }` 请求体,创建并返回新书签。
23
- - [ ] **更新书签接口**:提供 `PUT /api/v1/bookmarks/:id` 接口,接收完整书签信息,更新指定ID的书签。
24
- - [ ] **删除书签接口**:提供 `DELETE /api/v1/bookmarks/:id` 接口,删除指定ID的书签。
25
- - [ ] **排序**:所有列表查询结果默认按 `createdAt` 字段倒序排列。
26
-
27
- ### 4.2 边界条件与错误处理
28
- - **输入验证**:
29
- - `title`: 必填,非空字符串。
30
- - `url`: 必填,需符合标准URL格式(可通过正则或URL构造函数验证)。
31
- - `tags`: 可选,若提供则必须为字符串数组。
32
- - `id` (路径参数): 必须为有效的UUID格式。
33
- - `limit` (查询参数): 可选,正整数,默认20。
34
- - `offset` (查询参数): 可选,非负整数,默认0。
35
- - **错误场景**:
36
- - 请求体验证失败:返回 `400` 状态码,并在响应 `message` 中说明具体错误。
37
- - 根据 `id` 查找不到资源(更新、删除、后续可能的获取详情):返回 `404` 状态码。
38
- - 服务器内部错误:返回 `500` 状态码。
39
- - **权限控制**:本次实现为简化版本,暂不涉及用户认证与鉴权,所有接口均为公开访问。未来可集成 `auth.middleware.ts` 进行保护。
40
-
41
- ## 5. API 设计 (API Design)
42
-
43
- ### 接口列表
44
- | Method | Endpoint | Auth Required | Description |
45
- |--------|----------|:-------------:|-------------|
46
- | GET | /api/v1/bookmarks | ❌ | 获取书签分页列表 |
47
- | POST | /api/v1/bookmarks | ❌ | 创建新书签 |
48
- | PUT | /api/v1/bookmarks/:id | ❌ | 全量更新指定书签 |
49
- | DELETE | /api/v1/bookmarks/:id | ❌ | 删除指定书签 |
50
-
51
- ### 请求/响应示例
52
-
53
- **获取书签列表**
54
-
55
- ```
56
- GET /api/v1/bookmarks?limit=2&offset=0
57
- ```
58
-
59
- 成功响应 (200):
60
- ```json
61
- {
62
- "code": 200,
63
- "message": "success",
64
- "data": {
65
- "bookmarks": [
66
- {
67
- "id": "550e8400-e29b-41d4-a716-446655440000",
68
- "title": "Example Domain",
69
- "url": "https://example.com",
70
- "tags": ["example", "test"],
71
- "createdAt": "2023-10-27T10:00:00.000Z",
72
- "updatedAt": "2023-10-27T10:00:00.000Z"
73
- }
74
- ],
75
- "total": 10
76
- }
77
- }
78
- ```
79
-
80
- **创建书签**
81
-
82
- ```
83
- POST /api/v1/bookmarks
84
- Content-Type: application/json
85
- ```
86
-
87
- 请求体:
88
- ```json
89
- {
90
- "title": "GitHub",
91
- "url": "https://github.com",
92
- "tags": ["code", "repository"]
93
- }
94
- ```
95
-
96
- 成功响应 (201):
97
- ```json
98
- {
99
- "code": 201,
100
- "message": "success",
101
- "data": {
102
- "id": "6ba7b810-9dad-11d1-80b4-00c04fd430c8",
103
- "title": "GitHub",
104
- "url": "https://github.com",
105
- "tags": ["code", "repository"],
106
- "createdAt": "2023-10-27T11:00:00.000Z",
107
- "updatedAt": "2023-10-27T11:00:00.000Z"
108
- }
109
- }
110
- ```
111
-
112
- 错误响应 (400 - URL格式无效):
113
- ```json
114
- {
115
- "code": 400,
116
- "message": "Validation failed: \"url\" must be a valid URL"
117
- }
118
- ```
119
-
120
- **更新书签**
121
-
122
- ```
123
- PUT /api/v1/bookmarks/6ba7b810-9dad-11d1-80b4-00c04fd430c8
124
- Content-Type: application/json
125
- ```
126
-
127
- 请求体:
128
- ```json
129
- {
130
- "title": "GitHub: Let’s build from here",
131
- "url": "https://github.com",
132
- "tags": ["code", "repository", "dev"]
133
- }
134
- ```
135
-
136
- 成功响应 (200):
137
- ```json
138
- {
139
- "code": 200,
140
- "message": "success",
141
- "data": {
142
- "id": "6ba7b810-9dad-11d1-80b4-00c04fd430c8",
143
- "title": "GitHub: Let’s build from here",
144
- "url": "https://github.com",
145
- "tags": ["code", "repository", "dev"],
146
- "createdAt": "2023-10-27T11:00:00.000Z",
147
- "updatedAt": "2023-10-27T11:05:00.000Z"
148
- }
149
- }
150
- ```
151
-
152
- 错误响应 (404):
153
- ```json
154
- {
155
- "code": 404,
156
- "message": "Bookmark not found"
157
- }
158
- ```
159
-
160
- **删除书签**
161
-
162
- ```
163
- DELETE /api/v1/bookmarks/6ba7b810-9dad-11d1-80b4-00c04fd430c8
164
- ```
165
-
166
- 成功响应 (204 No Content):无响应体。
167
-
168
- 错误响应 (404):
169
- ```json
170
- {
171
- "code": 404,
172
- "message": "Bookmark not found"
173
- }
174
- ```
175
-
176
- ## 6. 数据模型 (Data Model)
177
- ```prisma
178
- model Bookmark {
179
- id String @id @default(uuid())
180
- title String
181
- url String
182
- tags String[]
183
- createdAt DateTime @default(now())
184
- updatedAt DateTime @updatedAt
185
-
186
- @@map("bookmarks")
187
- }
188
- ```
189
-
190
- ## 7. 非功能性需求 (Non-functional Requirements)
191
- - **性能**: 单次列表查询(带分页)响应时间应 < 200ms。预期支持数百条书签的并发读写。
192
- - **安全**: 对用户输入的 `url` 和 `title` 进行基本的清理,防止 XSS 等注入攻击(可在 service 层或通过中间件处理)。未来集成认证后,需确保用户只能操作自己的书签。
193
- - **可靠性**: `POST` 和 `PUT` 操作应保证幂等性(通过业务逻辑或数据库约束)。对于 `PUT` 操作,需先检查资源是否存在。
194
- - **可维护性**: 在关键业务路径(如创建、更新、删除)记录 `info` 级别日志。记录 `error` 级别日志并关联请求上下文。监控 API 的请求量、错误率和响应时间。
195
-
196
- ## 8. 实施要点 (Implementation Notes)
197
- - **集成点**: 完全基于现有 Express + TypeScript + Prisma 技术栈。需与 `error.middleware.ts` 集成以处理 `AppError`。
198
- - **实施顺序**:
199
- 1. **数据模型**: 在 `prisma/schema.prisma` 中添加 `Bookmark` 模型,并运行迁移。
200
- 2. **服务层 (`service.ts`)**: 实现核心业务逻辑(CRUD、分页查询、输入验证)。
201
- 3. **控制器层 (`controller.ts`)**: 处理 HTTP 请求,调用 service,构造响应。
202
- 4. **路由层 (`routes.ts`)**: 定义 API 端点,将请求映射到控制器方法。
203
- 5. **测试**: 为 service 和 controller 编写单元测试,为 API 编写集成测试。
204
- - **技术注意事项**:
205
- - 使用 Zod 或类似库在 service 层进行严格的输入验证。
206
- - 分页查询使用 Prisma 的 `skip` 和 `take`,计数使用 `count` 方法。
207
- - 严格遵循项目的三层架构 (`routes → controllers → services → database`),禁止跨层调用。
208
- - **测试要点**:
209
- - **Service 单测**: 验证 `createBookmark` 对无效 URL 的拒绝,`getBookmarks` 分页逻辑的正确性。
210
- - **Controller 单测**: 验证对 service 的调用和对 HTTP 响应(状态码、格式)的正确构造。
211
- - **API 集成测试**: 使用 `supertest` 模拟完整的 HTTP 请求流程,覆盖成功和错误场景(400, 404)。