@alenfitz/spec-copilot 1.0.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/README.md +112 -0
- package/README.zh-CN.md +112 -0
- package/adapters/index.js +218 -0
- package/bin/cli.js +788 -0
- package/commands/spec:apply.md +27 -0
- package/commands/spec:archive.md +29 -0
- package/commands/spec:bootstrap.md +103 -0
- package/commands/spec:fix.md +20 -0
- package/commands/spec:flow.md +100 -0
- package/commands/spec:hotfix.md +26 -0
- package/commands/spec:init.md +82 -0
- package/commands/spec:propose.md +64 -0
- package/commands/spec:review.md +48 -0
- package/commands/spec:smoke.md +40 -0
- package/commands/spec:test.md +28 -0
- package/framework/AGENTS.md.template +221 -0
- package/framework/CHANGELOG.md +159 -0
- package/framework/VERSION +1 -0
- package/framework/changes/templates/log.md +25 -0
- package/framework/changes/templates/spec.md +118 -0
- package/framework/changes/templates/tasks.md +48 -0
- package/framework/knowledge/index.md +48 -0
- package/framework/rules/coding-style.md +74 -0
- package/framework/rules/domain-rules.md +35 -0
- package/framework/rules/project-context.md +43 -0
- package/framework/rules/security.md +38 -0
- package/framework/scripts/install-hooks.sh +41 -0
- package/framework/scripts/spec-gate.sh +122 -0
- package/framework/scripts/spec-lint.sh +197 -0
- package/framework/stack-adapters/_template.md +70 -0
- package/framework/stack-adapters/spring-boot-vue3.md +106 -0
- package/package.json +40 -0
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
# Spring Boot 3 + Vue 3 适配层
|
|
2
|
+
|
|
3
|
+
## 1. 注释规范
|
|
4
|
+
- **Entity 字段**:每个字段必须有 `/** 中文说明 */`,枚举值必须列出(如 `OPEN/CLOSED/CANCELLED`)
|
|
5
|
+
- **Service public 方法**:完整 Javadoc(方法用途、参数含义、返回值说明)
|
|
6
|
+
- **Controller 接口方法**:必须注释接口用途和关键参数含义
|
|
7
|
+
- **Vue 组件**:文件顶部注释说明组件职责;关键 props/emits 注释;复杂业务逻辑行内注释
|
|
8
|
+
- **DTO/VO 非显而易见的字段**:必须加注释
|
|
9
|
+
|
|
10
|
+
## 2. 异常处理
|
|
11
|
+
- 业务异常使用自定义 `BizException`,携带错误码(新项目必须在 T1 脚手架阶段创建此类)
|
|
12
|
+
- 系统异常向上抛出,由 `GlobalExceptionHandler` 兜底
|
|
13
|
+
- 禁止空 catch(吞掉异常)
|
|
14
|
+
- catch 中必须 `log.error("msg", e)` 记录完整堆栈,禁止 `log.error(e.getMessage())`
|
|
15
|
+
|
|
16
|
+
## 3. 日志规范
|
|
17
|
+
- 日志框架:SLF4J + Logback(Spring Boot 默认)
|
|
18
|
+
- Controller 入口打 INFO,含请求关键参数
|
|
19
|
+
- 异常打 ERROR 含完整堆栈
|
|
20
|
+
- 敏感字段脱敏:手机号 `138****1234`、API Key `***`、密码不打印
|
|
21
|
+
|
|
22
|
+
## 4. 配置注入
|
|
23
|
+
- 敏感配置放 `application-local.yml`(gitignore)
|
|
24
|
+
- 通过 `@Value` 或 `@ConfigurationProperties` 注入
|
|
25
|
+
- gitignore 必须包含:`application-local.yml`、`application-prod.yml`
|
|
26
|
+
- 禁止硬编码 API 密钥、AK/SK、数据库密码
|
|
27
|
+
|
|
28
|
+
## 5. 命名约定
|
|
29
|
+
- 类名:大驼峰,见名知意(`DefectService` / `PushJob`)
|
|
30
|
+
- 方法名:小驼峰,动词开头(`getById` / `sendPush`)
|
|
31
|
+
- 常量:全大写下划线分隔(`MAX_RETRY_COUNT`)
|
|
32
|
+
- 禁止拼音、中英混拼命名
|
|
33
|
+
- Vue 组件名:大驼峰 PascalCase,文件名同名(`DefectsView.vue`)
|
|
34
|
+
- 主键命名:`表名_id`(`station_id`、`defect_id`)
|
|
35
|
+
- 外键与被引用表主键名完全一致
|
|
36
|
+
|
|
37
|
+
## 6. 分层架构
|
|
38
|
+
```
|
|
39
|
+
Controller ← 入口层,@Valid 校验 + Result 包装
|
|
40
|
+
↓
|
|
41
|
+
Service ← 业务编排,事务边界 @Transactional
|
|
42
|
+
↓
|
|
43
|
+
Mapper (XML) ← 纯数据访问,复杂查询写 XML,简单查询用 LambdaQueryWrapper
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
## 7. 前端规范
|
|
47
|
+
- 使用 Composition API(setup 语法糖)
|
|
48
|
+
- 跨页面复用数据必须用 Pinia store,禁止在多个组件重复请求同一接口
|
|
49
|
+
- API 调用统一封装到 `src/api/`,禁止在组件内直接 `import axios`
|
|
50
|
+
- 样式优先用 scoped CSS,颜色/尺寸提取为 CSS 变量
|
|
51
|
+
- 使用 Element Plus + zhCn locale
|
|
52
|
+
|
|
53
|
+
## 8. 测试规范
|
|
54
|
+
- 后端:JUnit 5 + MockMvc(Controller 层)/ 直接调用(Service 层)
|
|
55
|
+
- 测试文件位置:`src/spec:test/java/` 对应包路径
|
|
56
|
+
- 测试类命名:`<ClassName>Test.java`
|
|
57
|
+
- 前端:Vitest,文件位置 `src/__tests__/` 或组件同目录 `*.spec.js`
|
|
58
|
+
- 运行命令:`mvn test` / `npm run test`
|
|
59
|
+
|
|
60
|
+
## 9. 常见坑
|
|
61
|
+
|
|
62
|
+
### Lombok 与 Java 21+
|
|
63
|
+
Java 21 以上版本 Lombok(≤1.18.36)编译报 `TypeTag::UNKNOWN` 致命错误。
|
|
64
|
+
解决:移除 Lombok,用原生 getter/setter,日志用 `LoggerFactory.getLogger(X.class)`。
|
|
65
|
+
|
|
66
|
+
### MyBatis-Plus Spring Boot 3
|
|
67
|
+
必须用 `mybatis-plus-spring-boot3-starter`(非旧版 `mybatis-plus-boot-starter`),否则自动配置不生效。
|
|
68
|
+
|
|
69
|
+
### 数据初始化 SQL
|
|
70
|
+
- `schema.sql` 必须用 `CREATE TABLE IF NOT EXISTS`
|
|
71
|
+
- `data.sql` 必须用 `INSERT IGNORE`
|
|
72
|
+
- 日期字段禁止写死(`'2026-03-26'`),必须用 `DATE_SUB(NOW(), INTERVAL N DAY)`
|
|
73
|
+
|
|
74
|
+
### Quartz
|
|
75
|
+
- Job 注入 Spring Bean:继承 `QuartzJobBean`(非 `Job` 接口)并 `@Component`
|
|
76
|
+
- 更新 Trigger:先 `deleteJob` 再 `scheduleJob`,不要用 `unscheduleJob + rescheduleJob`
|
|
77
|
+
|
|
78
|
+
### API 响应格式
|
|
79
|
+
统一返回 `Result<T>`:
|
|
80
|
+
```json
|
|
81
|
+
{ "code": 200, "message": "success", "data": { ... } }
|
|
82
|
+
```
|
|
83
|
+
分页 data 为 MyBatis-Plus `IPage` 结构。
|
|
84
|
+
|
|
85
|
+
## 10. code-quality-reviewer 栈相关检查项
|
|
86
|
+
|
|
87
|
+
### Critical
|
|
88
|
+
- [ ] Grep 是否有硬编码 API Key / 密码(长度>10的字母数字混合串)
|
|
89
|
+
- [ ] Grep 日志是否含 `phone`、`password`、`accessKey` 等敏感字段直接拼接
|
|
90
|
+
- [ ] 并发写共享状态是否加锁
|
|
91
|
+
- [ ] 推送/支付等有副作用的接口是否有幂等键防重
|
|
92
|
+
|
|
93
|
+
### Important
|
|
94
|
+
- [ ] Grep `"OPEN"` `"CLOSED"` `"SUCCESS"` `"FAILED"` 等状态值是否裸出现在业务 if/switch
|
|
95
|
+
- [ ] Grep 是否有空 catch 块
|
|
96
|
+
- [ ] Grep `log.error` 是否都带 `e`(完整堆栈)
|
|
97
|
+
- [ ] Controller 入参是否有 `@Valid` 或手动非空检查
|
|
98
|
+
- [ ] 项目是否存在 BizException 类,业务异常是否统一使用
|
|
99
|
+
- [ ] Grep 是否有拼音命名或单字母变量(循环变量除外)
|
|
100
|
+
- [ ] 前端是否存在多组件重复请求同一接口(应用 Pinia store)
|
|
101
|
+
- [ ] Grep 前端组件是否直接 `import axios`(应走统一 request 封装)
|
|
102
|
+
|
|
103
|
+
### Minor
|
|
104
|
+
- [ ] Entity/Service/Controller 注释抽查(对照本文件 §1)
|
|
105
|
+
- [ ] data.sql 是否存在静态日期字符串
|
|
106
|
+
- [ ] import 是否已清理
|
package/package.json
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@alenfitz/spec-copilot",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Spec-Driven Development Framework — one package, six AI coding tools (opencode, Claude Code, Cursor, Windsurf, GitHub Copilot, Cline)",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"ai-coding",
|
|
7
|
+
"spec-driven",
|
|
8
|
+
"cursor",
|
|
9
|
+
"windsurf",
|
|
10
|
+
"copilot",
|
|
11
|
+
"cline",
|
|
12
|
+
"claude-code",
|
|
13
|
+
"opencode",
|
|
14
|
+
"code-review",
|
|
15
|
+
"specification"
|
|
16
|
+
],
|
|
17
|
+
"license": "MIT",
|
|
18
|
+
"author": "",
|
|
19
|
+
"bin": {
|
|
20
|
+
"spec-copilot": "bin/cli.js"
|
|
21
|
+
},
|
|
22
|
+
"files": [
|
|
23
|
+
"bin/",
|
|
24
|
+
"adapters/",
|
|
25
|
+
"framework/",
|
|
26
|
+
"commands/",
|
|
27
|
+
"README.md",
|
|
28
|
+
"README.zh-CN.md"
|
|
29
|
+
],
|
|
30
|
+
"engines": {
|
|
31
|
+
"node": ">=18.0.0"
|
|
32
|
+
},
|
|
33
|
+
"repository": {
|
|
34
|
+
"type": "git",
|
|
35
|
+
"url": "https://github.com/Alenfitz/spec_copilit"
|
|
36
|
+
},
|
|
37
|
+
"scripts": {
|
|
38
|
+
"test": "node bin/cli.js --help"
|
|
39
|
+
}
|
|
40
|
+
}
|