@ifrankwang/openspec-agents 0.118.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 (84) hide show
  1. package/README.md +91 -0
  2. package/assets/agents/openspec-architect.md +61 -0
  3. package/assets/agents/openspec-developer.md +21 -0
  4. package/assets/agents/openspec-main.md +35 -0
  5. package/assets/agents/openspec-reviewer-architecture.md +60 -0
  6. package/assets/agents/openspec-reviewer-maintainability.md +59 -0
  7. package/assets/agents/openspec-reviewer-performance.md +49 -0
  8. package/assets/agents/openspec-reviewer-security.md +51 -0
  9. package/assets/agents/openspec-reviewer-style.md +50 -0
  10. package/assets/agents/openspec-reviewer-task.md +40 -0
  11. package/assets/agents/openspec-reviewer-tool.md +30 -0
  12. package/assets/dashboard/index.html +295 -0
  13. package/assets/skills/api-conventions/SKILL.md +60 -0
  14. package/assets/skills/api-test/SKILL.md +175 -0
  15. package/assets/skills/architecture-evolution/SKILL.md +60 -0
  16. package/assets/skills/db-conventions/SKILL.md +62 -0
  17. package/assets/skills/ddd-architecture/SKILL.md +261 -0
  18. package/assets/skills/environment-cleanup/SKILL.md +44 -0
  19. package/assets/skills/java-api-conventions/SKILL.md +30 -0
  20. package/assets/skills/java-code-maintainability/SKILL.md +62 -0
  21. package/assets/skills/java-code-performance/SKILL.md +49 -0
  22. package/assets/skills/java-code-style/SKILL.md +54 -0
  23. package/assets/skills/java-db-conventions/SKILL.md +44 -0
  24. package/assets/skills/java-ddd-architecture/SKILL.md +533 -0
  25. package/assets/skills/java-dev-practices/SKILL.md +110 -0
  26. package/assets/skills/java-quality-gate/SKILL.md +455 -0
  27. package/assets/skills/java-quality-gate/reference/pmd-rules.md +16 -0
  28. package/assets/skills/java-quality-tool-improve/SKILL.md +142 -0
  29. package/assets/skills/java-security/SKILL.md +59 -0
  30. package/assets/skills/java-technical-debt/SKILL.md +36 -0
  31. package/assets/skills/orchestrator/SKILL.md +65 -0
  32. package/assets/skills/quality-gate/SKILL.md +84 -0
  33. package/assets/skills/security-baseline/SKILL.md +101 -0
  34. package/assets/skills/technical-debt/SKILL.md +78 -0
  35. package/assets/workflows/task.yaml +177 -0
  36. package/package.json +79 -0
  37. package/src/adapters/agent-md.ts +37 -0
  38. package/src/adapters/claude-code/index.ts +35 -0
  39. package/src/adapters/codex/index.ts +161 -0
  40. package/src/adapters/mcp-common/cli.ts +64 -0
  41. package/src/adapters/mcp-common/index.ts +137 -0
  42. package/src/adapters/mcp-common/json-schema.ts +53 -0
  43. package/src/adapters/mcp-common/server.ts +157 -0
  44. package/src/adapters/opencode/agents.ts +80 -0
  45. package/src/adapters/opencode/dashboard.ts +64 -0
  46. package/src/adapters/opencode/index.ts +34 -0
  47. package/src/adapters/opencode/json-schema.ts +60 -0
  48. package/src/adapters/opencode/skills.ts +19 -0
  49. package/src/adapters/opencode/tools.ts +78 -0
  50. package/src/adapters/plugin-common/index.ts +173 -0
  51. package/src/adapters/zcode/index.ts +32 -0
  52. package/src/core/constants.ts +46 -0
  53. package/src/core/dashboard.ts +101 -0
  54. package/src/core/derive.ts +146 -0
  55. package/src/core/exemptions.ts +168 -0
  56. package/src/core/git.ts +373 -0
  57. package/src/core/index.ts +76 -0
  58. package/src/core/namespace.ts +12 -0
  59. package/src/core/paths.ts +23 -0
  60. package/src/core/provider.ts +74 -0
  61. package/src/core/state.ts +357 -0
  62. package/src/core/task-children.ts +59 -0
  63. package/src/core/tasks-md.ts +89 -0
  64. package/src/core/tools/gate.ts +165 -0
  65. package/src/core/tools/lifecycle.ts +645 -0
  66. package/src/core/tools/schemas.ts +363 -0
  67. package/src/core/tools/submit.ts +863 -0
  68. package/src/core/tools/types.ts +129 -0
  69. package/src/core/types.ts +135 -0
  70. package/src/core/views.ts +195 -0
  71. package/src/core/workflow/collector.ts +150 -0
  72. package/src/core/workflow/engine.ts +576 -0
  73. package/src/core/workflow/index.ts +56 -0
  74. package/src/core/workflow/loader.ts +277 -0
  75. package/src/core/workflow/poller.ts +159 -0
  76. package/src/core/workflow/reset.ts +93 -0
  77. package/src/core/workflow/status.ts +1010 -0
  78. package/src/core/workflow/submit.ts +331 -0
  79. package/src/core/workflow/types.ts +100 -0
  80. package/src/core/workflow/writeback.ts +48 -0
  81. package/src/dashboard/page.ts +19 -0
  82. package/src/index.ts +2 -0
  83. package/src/skills/resolve.ts +95 -0
  84. package/src/skills/scan.ts +29 -0
@@ -0,0 +1,261 @@
1
+ ---
2
+ name: ddd-architecture
3
+ description: DDD 架构规范——四层分层与六边形(Hexagonal)两种包组织风格、层间依赖、各层职责、风格判定、CQRS、聚合设计、Repository 语义、领域事件、值对象、Port/Adapter。方法论本身语言无关。
4
+ capabilities: ["architecture"]
5
+ ---
6
+
7
+ > **项目规范优先**:本 skill 所列约定为推荐标准。若项目已有明确规范且与本 skill 不一致,以项目规范为准。
8
+
9
+ ## 包结构(概念层)
10
+
11
+ 同一套依赖原则有两种包组织方式,均属合法实现,采用哪种由项目声明(见"架构风格判定")。两者不是互斥架构,而是同一依赖方向的两种包组织视角。
12
+
13
+ **方式一:四层分层**
14
+
15
+ ```
16
+ {basePackage}
17
+ ├── domain ← 核心领域逻辑(聚合根、实体、值对象、领域服务、Repository 接口)
18
+ │ ├── model ← 聚合根、实体、值对象(纯业务对象,零外部依赖)
19
+ │ ├── service ← Domain Service
20
+ │ ├── repository ← Repository 接口
21
+ │ └── exception ← 领域异常
22
+ ├── application ← 用例编排(Command/Query 入口、应用层服务)
23
+ │ ├── command ← 写操作命令
24
+ │ ├── query ← 读操作查询
25
+ │ ├── service ← Application Service
26
+ │ └── dto ← 模块间传输 DTO
27
+ ├── infrastructure ← 技术实现(持久化、外部集成、ACL 适配)
28
+ └── interfaces ← 外部访问入口(Controller、API 网关、消息监听)
29
+ ```
30
+
31
+ **方式二:六边形(Hexagonal)**
32
+
33
+ 六边形按"内核 ↔ 适配器"组织,内核承载全部领域与应用逻辑,外部依赖以适配器形式接入:
34
+
35
+ ```
36
+ {basePackage}
37
+ ├── domain ← 内核组成:核心领域逻辑、driven port 接口
38
+ ├── application ← 内核组成:用例编排、driving port 接口
39
+ ├── driving adapter ← 入站适配器:外部访问入口,调用 application 定义的 driving port
40
+ └── driven adapter ← 出站适配器:技术实现,实现 domain 定义的 driven port
41
+ ```
42
+
43
+ - **内核** = domain + application:domain 承载核心领域逻辑(聚合根、实体、值对象、领域服务)并定义 driven port(持久化、外部集成等能力契约);application 承载用例编排(Command/Query 入口、应用层服务)并定义 driving port(外部用例入口契约)
44
+ - **driving adapter(入站)** 对应外部访问入口(API 网关、消息监听等),把外部调用翻译为内核用例
45
+ - **driven adapter(出站)** 对应技术实现(持久化、外部集成、ACL 适配),把内核契约翻译为具体技术调用
46
+
47
+ 四层与六边形的对应关系见"两种风格的双向映射"。
48
+
49
+ ## 层间依赖
50
+
51
+ **四层分层**:
52
+
53
+ ```
54
+ interfaces → application → domain ← infrastructure
55
+ ```
56
+
57
+ 箭头方向即依赖方向:interfaces 依赖 application,application 依赖 domain,infrastructure 实现 domain 定义的 Port/Repository 接口。infrastructure 不依赖 interfaces,interfaces 不直接依赖 infrastructure。
58
+
59
+ **六边形**:
60
+
61
+ ```
62
+ driving adapter → application → domain ← driven adapter
63
+ ```
64
+
65
+ 依赖一律指向内核(domain + application):driving adapter 依赖 application 定义的 driving port(入站端口),driven adapter 实现 domain 定义的 driven port(出站端口)并依赖该接口。adapter 之间无依赖,内核不依赖任何 adapter。依赖倒置只发生在 driven 方向——driven adapter 依赖内核定义的 Port 接口,而非反向。
66
+
67
+ ## 两种风格的双向映射
68
+
69
+ 四层分层与六边形是同一套依赖原则(依赖一律指向内核)的两种包组织视角,对应关系如下:
70
+
71
+ | 四层分层 | 六边形 | 说明 |
72
+ |---------|--------|------|
73
+ | domain + application | 应用内核 | 内核由领域与应用逻辑共同构成,domain 是内核的一部分 |
74
+ | interfaces | driving adapter(入站适配器) | 外部访问入口,调用内核 |
75
+ | infrastructure | driven adapter(出站适配器) | 技术实现,依赖内核定义的 Port 接口 |
76
+
77
+ 依赖方向在两种视角下完全一致:外部入口(interfaces / driving adapter)→ 内核(application → domain)← 技术实现(infrastructure / driven adapter)。
78
+
79
+ ## 架构风格判定
80
+
81
+ 两种风格不是互斥选择,判定项目采用哪种包组织视角,依据以下特征对照:
82
+
83
+ | 识别特征 | 四层分层 | 六边形 |
84
+ |---------|---------|--------|
85
+ | 包组织方式 | 显式 interfaces / application / domain / infrastructure 四层 | 显式内核与适配器边界(adapter/in、adapter/out,或 interfaces/infrastructure 承担 adapter 语义) |
86
+ | Port 接口定义位置 | domain 层 | 内核(domain 定义 driven port,application 定义 driving port) |
87
+ | 外部访问入口定位 | interfaces 层 | driving adapter(入站) |
88
+ | 技术实现定位 | infrastructure 层 | driven adapter(出站) |
89
+
90
+ 混杂场景兜底:项目 design/架构文档已声明架构风格的,以声明为准;未声明时按四层分层认定。Port 定义位置差异(domain 或 application)不单独构成问题;四层风格项目以 interfaces/infrastructure 承担 adapter 语义的组织方式不视为违规。
91
+
92
+ ## 各层职责
93
+
94
+ | 层 | 职责 | 禁止 |
95
+ |----|------|------|
96
+ | interfaces | 参数校验、调用 application、DTO 转换 | 写业务逻辑、直接访问 infrastructure/domain 实体 |
97
+ | application | 编排业务用例、事务边界、协调 domain service | 技术实现细节(SQL、HTTP、LLM 调用) |
98
+ | domain | 核心领域逻辑、聚合根行为、领域服务 | 任何框架依赖 |
99
+ | infrastructure | 技术实现:持久化、外部集成、ACL 转换 | 业务规则判断 |
100
+
101
+ 六边形视角下,interfaces 即 driving adapter(入站适配器),infrastructure 即 driven adapter(出站适配器),职责与禁止项对应不变。
102
+
103
+ ## 通用语言(Ubiquitous Language)
104
+
105
+ 每个 Bounded Context 必须维护一份术语表,记录业务名词及其含义。开发、产品、业务方统一使用此表沟通,代码命名以此为基准。
106
+
107
+ ### 术语表位置
108
+
109
+ ```
110
+ {basePackage}/domain/language.md
111
+ ```
112
+
113
+ ### 术语表格式
114
+
115
+ ```
116
+ # {Bounded Context} — 通用语言
117
+
118
+ | 术语 | 英文名 | 含义 | 代码位置 |
119
+ |------|--------|------|---------|
120
+ | ... | ... | ... | ... |
121
+ ```
122
+
123
+ ### 命名规则
124
+
125
+ - 代码类名、方法名、字段名必须与术语表一致,禁止翻译/缩写
126
+ - 值对象用不可变类型,枚举用枚举类型,实体用引用类型——类型选择本身就是语言表达
127
+ - 跨 Bounded Context 的同一术语含义必须一致
128
+
129
+ ### 命名合理性判据
130
+
131
+ 命名规则与判据分工互补:命名规则定义静态一致性约束——代码命名必须与术语表一致;命名合理性判据是判定标准,识别命名是否体现意图、是否造成混淆、是否出现漂移,修正动作即对一致性约束的执行。
132
+
133
+ - 命名须实际体现概念意图,禁止用泛化命名(如 process/handle/data/info)掩盖真实语义
134
+ - 同义概念全库统一命名,禁止同名不同义或近义不同名造成场景混淆
135
+ - 代码命名偏离术语表即为漂移信号,识别后回溯术语表修正,回归一致性约束
136
+
137
+ ## CQRS 读写分离
138
+
139
+ Command(写)和 Query(读)走不同路径,互不混淆:
140
+
141
+ ```
142
+ Command 路径: Controller → ApplicationCommandService → Domain Model → Repository(写)
143
+ Query 路径: Controller → ApplicationQueryService → 直接查询投影(DTO)
144
+ ```
145
+
146
+ - Command 走 domain 层:调用聚合根行为 → Repository 持久化
147
+ - Query 不走 domain 层:直接映射到查询投影(DTO),禁止加载 domain 实体再转换
148
+ - Command 方法返回简单结果(仅 ID/成功/失败),不返回 domain 实体
149
+ - Query 方法返回值必须是 DTO,禁止返回 Entity 或 PO
150
+ - 同一用例中禁止混用 Command 和 Query 逻辑
151
+
152
+ ## 充血模型
153
+
154
+ Domain 实体必须是充血模型——行为封装在实体内部,禁止仅 getter/setter 的贫血模型。
155
+
156
+ - 业务逻辑不得在 Service 中操作实体状态后再调用 save——改实体自身方法
157
+ - 判定:删掉所有 setter 后业务逻辑是否还能运转?能 → 充血;不能 → 贫血
158
+
159
+ ## 聚合设计
160
+
161
+ | 原则 | 说明 |
162
+ |------|------|
163
+ | 聚合边界 = 事务边界 | 一个事务只修改一个聚合,跨聚合用最终一致性 |
164
+ | 聚合根是唯一入口 | 外部只能通过聚合根方法访问聚合内部 |
165
+ | 跨聚合引用仅 ID | 聚合 A 引用聚合 B 时只存 B 的 ID,不存对象引用 |
166
+ | 聚合内一致性 | 聚合根负责子实体一致性校验,禁止外部直接修改子实体 |
167
+
168
+ ## Repository 领域语义
169
+
170
+ Repository 语义与架构风格无关,四层与六边形均适用:契约(接口)定义在核心(domain),实现落在基础设施/出站侧。
171
+
172
+ Repository 对 domain 层暴露集合语义,不暴露持久化语义:
173
+
174
+ - `findById` 返回 domain 实体,不存在则抛异常——领域层决定不存在语义
175
+ - 查询方法名具领域语义(`findActiveOrdersByCustomerId`),不暴露技术细节
176
+ - 领域查询接口在 domain 层定义,具体实现(含 SQL)在 infrastructure 层
177
+ - 纯查询投影(非 domain 实体)走 CQRS Query 路径,不经过 Repository
178
+
179
+ ## Domain Event
180
+
181
+ Domain Event 语义与架构风格无关,四层与六边形均适用:事件契约定义在 domain/内核,事件处理实现落在 infrastructure/出站侧。
182
+
183
+ - 领域事件定义在 domain 层,事件处理在 infrastructure 层
184
+ - 事件定义为不可变值对象,命名 `{Entity}{PastParticiple}Event`
185
+ - Application Service 在事务提交后发布事件
186
+ - 事件处理类在 infrastructure 层,使用事件总线或消息队列
187
+
188
+ ## Factory
189
+
190
+ - 复杂领域对象创建逻辑归 Factory,不放在构造函数中
191
+ - 简单对象用静态工厂方法
192
+ - 复杂组装用 Domain Factory(domain 层),不依赖外部技术
193
+ - 涉及外部数据/技术实现的创建用 Application Factory(application 层)
194
+
195
+ ## Specification
196
+
197
+ Specification 将业务规则封装为可组合的谓词对象,用于判定候选对象是否满足特定条件:
198
+
199
+ - 接口定义 `isSatisfiedBy(T candidate)` + `and/or/not` 组合方法
200
+ - 原子规则类以 `Spec` 后缀命名
201
+ - 组合通过链式调用,无需额外工厂
202
+ - 入参为领域实体或值对象,不在 Specification 中引入基础设施依赖
203
+
204
+ ## Anti-Corruption Layer
205
+
206
+ 防腐层(ACL)隔离外部模型与领域模型:
207
+
208
+ - ACL 位于 infrastructure 层
209
+ - 输入方向:ACL 将外部模型(第三方 API、遗留系统)转换为领域模型
210
+ - 输出方向:ACL 将领域模型转换为外部模型
211
+ - 约束:领域模型不依赖外部模型,ACL 转换方向仅为 infrastructure → domain
212
+
213
+ 六边形视角下,ACL 属 driven adapter(出站适配器)中的转换组件,方向约束同"adapter → 内核"。
214
+
215
+ ## 外部系统命名隔离
216
+
217
+ 命名基准是领域术语表(见「通用语言」章节),外部系统名不属于领域语言。外部系统(第三方 API、遗留系统、中间件)的命名与模型只允许出现在 infrastructure 层(四层)/ driven adapter(六边形),禁止通过接口契约上浮到内核与外部访问入口。
218
+
219
+ - 接口/方法命名用领域语义:Port 接口名与方法名(如 CustomerQueryPort.queryCustomer)禁止出现外部系统名(如 SapQueryPort、queryFromErp)
220
+ - DTO 命名用领域语义:application/interfaces 层 DTO 类名与字段名(如 CustomerDetailResponse)禁止出现外部系统名(如 SapCustomerResponse、字段 sapOrderNo)
221
+ - 跨层传输的数据须经 ACL/assembler 转换为领域语义对象,外部模型类型禁止出现在内核与 interfaces 层的接口签名中
222
+ - 外部系统名仅限 infrastructure 层实现类、ACL 转换类与配置(如 SapClient、ErpOrderConverter)
223
+
224
+ 六边形视角下,外部系统名仅限 driven adapter(出站适配器)实现类与配置。
225
+
226
+ ## Port / Adapter 模式
227
+
228
+ Port 接口是内核(domain + application)定义的纯业务契约,Adapter 是实现契约的技术适配组件,按方向分两类:
229
+
230
+ - **driving port / driving adapter(入站)**:driving port 由 application 定义(外部用例入口契约),由 application 层应用服务实现;driving adapter 在外部访问入口调用该端口。依赖方向:外部入口 → application。
231
+ - **driven port / driven adapter(出站)**:driven port 由 domain 定义(持久化、外部集成等能力契约),driven adapter 在基础设施/出站侧实现。依赖方向:infrastructure 依赖 domain 的 Port 接口(依赖倒置)。
232
+
233
+ 四层分层下两类分别落在 interfaces 与 infrastructure;六边形下即 adapter/in 与 adapter/out(或由 interfaces/infrastructure 承担 adapter 角色)。
234
+
235
+ ## 共性能力基础设施化
236
+
237
+ 应统一拦截/封装到 Infrastructure 层或框架级能力的横向逻辑,不得分散在各 Controller/Service 中逐点调用。
238
+
239
+ ### 适用场景
240
+
241
+ | 类别 | 示例 | 上收方式 |
242
+ |------|------|---------|
243
+ | 横切关注点 | 鉴权·审计·日志·限流·幂等·事务 | 拦截器 / 过滤器 / AOP |
244
+ | 重复集成封装 | 外部 API 调用、序列化/转换 | 公共 Client/Adapter 基类 |
245
+ | 散落的全局配置 | 超时·重试·线程池·白名单 | 统一配置文件集中管理 |
246
+
247
+ ### 判据
248
+
249
+ 同一逻辑在 ≥2 处独立实现、属横向共性需求(非单点业务上下文特有)、新增场景漏调度即失效 → 必须基础设施化。
250
+
251
+ ## 方案复用与平行实现
252
+
253
+ 同类能力已有既有实现时,新方案须复用或扩展现有实现,禁止另起一套逻辑——引入与既有实现功能重叠的新实现且不改动原实现,导致同类能力多套方案并存。
254
+
255
+ ### 适用场景
256
+
257
+ 已有手工实现的限流基础框架,新方案引入新限流框架且不动原代码——同类能力多套方案并存,维护与认知成本翻倍。
258
+
259
+ ### 判据
260
+
261
+ 同类能力已有既有实现 → 优先复用或扩展既有实现。确需平行引入(新旧并存)时,方案须附带既有实现的迁移方案。
@@ -0,0 +1,44 @@
1
+ ---
2
+ name: environment-cleanup
3
+ description: 隔离环境清理通用规范——停止残留服务、清理隔离容器/数据库、删除隔离扫描分析项目。技术栈无关。
4
+ capabilities: ["cleanup"]
5
+ ---
6
+
7
+ > **项目规范优先**:本 skill 所列约定为推荐标准。若项目已有明确规范且与本 skill 不一致,以项目规范为准。
8
+ > 清理以幂等为原则:无残留即通过,不因重复执行报错或产生副作用。
9
+
10
+ ## 停止残留的服务实例
11
+
12
+ 按项目的启动方式反向停止本次变更启动的服务实例:
13
+
14
+ - 经进程启动的服务:定位本次启动的进程并停止(如按启动命令/端口反查 PID),禁止误杀其他变更或他人启动的进程
15
+ - 经容器编排启动的服务:按本变更的隔离标识停止对应 compose 项目
16
+
17
+ 停止后确认端口监听已释放:监听端口不再有进程响应即视为已停止。
18
+
19
+ ## 清理隔离环境
20
+
21
+ 按本变更的隔离标识确认无残留的隔离资源后再清理:
22
+
23
+ - 隔离容器:按隔离标识确认存在性后停止并移除(无残留容器即通过,不因重复清理报错)
24
+ - 隔离数据库:确认无残留的隔离数据库实例/数据卷后清理;无残留即通过
25
+
26
+ 幂等判据:隔离标识下无残留容器、无残留隔离数据库即为清理完成,重复执行不产生副作用。
27
+
28
+ ## 删除隔离扫描分析项目
29
+
30
+ 本变更的隔离扫描分析项目(如按隔离标识命名的分析项目)在变更结束时删除:
31
+
32
+ 1. 先查询确认项目存在(按隔离标识查询),不存在视为已删除,跳过删除动作
33
+ 2. 确认存在后调用删除接口删除该项目(如平台管理接口的 delete 操作)
34
+ 3. 删除接口返回「不存在」错误视为已删除(幂等:删除动作可重复执行)
35
+
36
+ 删除后如需重新扫描,由「先查询后创建」的逻辑自动重建(创建前先查存在性,不存在才创建,避免重复创建报错),无需人工干预。
37
+
38
+ ## 清理后自检
39
+
40
+ 清理完成后自检以下各项,全部无残留即通过:
41
+
42
+ - 无残留的服务进程(本次启动的进程已停止,端口监听已释放)
43
+ - 无残留的隔离容器(隔离标识下 compose ps 为空)
44
+ - 无残留的隔离扫描分析项目(按隔离标识查询不存在)
@@ -0,0 +1,30 @@
1
+ ---
2
+ name: java-api-conventions
3
+ description: 仅限 Java 后端开发场景。接口层 Java/Spring 实现规范——Spring 注解、Swagger/SpringDoc 注解、R<T> 统一返回、@RestControllerAdvice 异常处理。通用 REST 设计原则见 api-conventions。适用场景同前。
4
+ capabilities: ["api-design", "architecture", "tech-stack-java"]
5
+ ---
6
+
7
+ > **项目规范优先**:本 skill 所列约定为推荐标准。若项目已有明确规范且与本 skill 不一致,以项目规范为准。
8
+ > 本 skill 是 api-conventions 的 Java 实现配套,仅含 Java/Spring 特有实现细节。通用 REST 设计原则见 api-conventions。调用本 skill 须同时加载 api-conventions。
9
+
10
+ ## Controller 层规范
11
+
12
+ | # | 规则 | 说明 |
13
+ |---|------|------|
14
+ | 1 | 必须用 `@RestController` | |
15
+ | 2 | `@Validated` + `jakarta.validation` 校验参数 | 注解加在 DTO 字段上,入口触发校验 |
16
+ | 3 | 统一返回 `R<T>` | 除文件下载等特殊场景外 |
17
+
18
+ ## 统一返回 R<T>
19
+
20
+ 所有接口统一返回 `R<T>` 包装,成功用 `R.success(data)`,失败携带业务错误码与消息。结构约定:
21
+
22
+ - `code`:业务错误码(数字),成功时为 0 或约定成功值
23
+ - `message`:错误描述,支持 `{}` 动态占位参数
24
+ - `data`:业务数据泛型
25
+
26
+ ## 异常响应体系
27
+
28
+ Controller 层不直接处理异常,由全局 `@RestControllerAdvice` 处理器按异常类型映射 HTTP 状态码。
29
+
30
+ 业务错误码作为 `R<T>` 响应体中独立数字字段,与 HTTP 状态码解耦:HTTP 码供客户端/网关判断大类,业务错误码供前端精确分支处理。
@@ -0,0 +1,62 @@
1
+ ---
2
+ name: java-code-maintainability
3
+ description: Java 代码可维护性规范——方法长度、类职责、异常处理、MapStruct 转换、魔法数提取、DRY 禁止、死代码、构建忽略项。仅在 Java 后端项目使用。
4
+ capabilities: ["maintainability", "tech-stack-java"]
5
+ ---
6
+
7
+ > **项目规范优先**:本 skill 所列约定为推荐标准。若项目已有明确规范且与本 skill 不一致,以项目规范为准。
8
+ > 本文列出**最低审查基线**,不限于所列维度。AI 审查时必须结合自身可维护性知识做拓展覆盖,下列任何可能遗漏的可维护性问题均须纳入审查。
9
+
10
+ ## 方法长度
11
+
12
+ - 单方法不超过 50 行(含空行和注释,不含花括号单独行)
13
+ - 超过且逻辑难以理解 → Medium 级别 issue
14
+ - 超过但逻辑清晰可读(如配置方法)→ Low 级别 issue
15
+
16
+ ## 类单一职责
17
+
18
+ - 一个类不超过一个变更原因
19
+ - 明显多职责场景(如同时处理持久化 + 业务逻辑 + 序列化)→ Medium 级别 issue
20
+
21
+ ## 异常处理
22
+
23
+ - 禁止吞掉异常(空 catch 块)→ High 级别 issue
24
+ - 禁止 `catch (Exception e)` 不加区分——优先捕获具体异常类型,多个异常类型分别处理或用多 catch 块 → Medium
25
+ - 使用 try-with-resources 确保资源自动关闭 → High 级别 issue(未关闭资源)
26
+
27
+ ## MapStruct 转换
28
+
29
+ ```java
30
+ @Mapper(componentModel = "spring")
31
+ public interface OrderConverter {
32
+ Order toDomain(OrderPO po);
33
+ OrderPO toPO(Order domain);
34
+ }
35
+ ```
36
+
37
+ - 必须 `componentModel = "spring"`;字段映射用 `@Mapping(source, target)`
38
+ - 禁止手写 PO ↔ Domain 转换逻辑,必须用 MapStruct
39
+
40
+ ## 魔法数提取常量
41
+
42
+ - 业务含义数字须提取为命名常量(`private static final ...`)
43
+ - 数字 0/1/-1 等通用值可不提取,但业务相关值如 `50000000`(高额订单阈值)必须提取
44
+
45
+ ## DRY 违规
46
+
47
+ - 相同语义的代码段在 ≥3 处复用时必须提取为共享函数
48
+ - 违反 → Low+ 级别 issue
49
+
50
+ ## 构建忽略项
51
+
52
+ - 构建产物目录(`target/`、`node_modules/`、`dist/`)不得提交仓库
53
+ - 已在 .gitignore 中配置即可
54
+
55
+ ## 死代码
56
+
57
+ - 未使用的 import / 私有方法 / 字段 / 局部变量 → Low 级别 issue
58
+ - 注释掉的代码:零散行 → Low 级别 issue;注释掉的整段逻辑 → Medium 级别 issue(历史追溯依赖版本控制,注释掉的代码应删除而非保留)
59
+ - 不可达分支 / 失效条件判断 → Medium 级别 issue
60
+ - 未被引用的类 / 接口 → Medium 级别 issue
61
+ - 未使用的依赖 → Low 级别 issue
62
+ - 识别未使用字段/方法时排除框架反射与代码生成场景(如 MapStruct、MyBatis、Lombok)
@@ -0,0 +1,49 @@
1
+ ---
2
+ name: java-code-performance
3
+ description: Java 性能规范——N+1 查询防范、外部调用超时与重试、大文件流式读取、循环优化、对象创建优化、缓存策略、异步处理。仅在 Java 后端项目使用。
4
+ capabilities: ["performance", "tech-stack-java"]
5
+ ---
6
+
7
+ > **项目规范优先**:本 skill 所列约定为推荐标准。若项目已有明确规范且与本 skill 不一致,以项目规范为准。
8
+ > 本文列出**最低审查基线**,不限于所列维度。AI 审查时必须结合自身性能知识做拓展覆盖,下列任何可能遗漏的性能问题均须纳入审查。
9
+
10
+ ## N+1 查询防范
11
+
12
+ - 列表查询必须用 MyBatis `collection`/`association` 嵌套映射或手动批量查询
13
+ - 禁止循环内逐条查询数据库 → Medium 级别 issue
14
+
15
+ ## 外部调用超时与重试
16
+
17
+ - RestTemplate:通过 `SimpleClientHttpRequestFactory` 设 connectTimeout / readTimeout
18
+ - WebClient:通过 `HttpClient.responseTimeout()` / `.option()` 设超时
19
+ - Spring Cloud OpenFeign:`feign.client.config.<service>.connect-timeout` / `read-timeout`
20
+ - LLM 调用:默认超时 120s
21
+ - 所有外部调用必须有重试策略(含退避与熔断),禁止无限重试
22
+ - 所有超时值 > 0,普通 HTTP 建议 10-30s
23
+
24
+ ## 大文件处理
25
+
26
+ - Excel 读取用 SXSSFWorkbook:`new SXSSFWorkbook(new XSSFWorkbook(inputStream), 100)`
27
+ - 禁止直接用 `XSSFWorkbook` 加载全量数据(OOM 风险)
28
+ - 大列表数据用分页查询 + Stream API 处理
29
+
30
+ ## 循环优化
31
+
32
+ - 禁止循环内同步 I/O 调用(数据库、HTTP、LLM)→ High 级别 issue(循环内无超时的同步调用 → Critical)
33
+ - 循环内外部调用应在循环层级之上做批量聚合或异步并发
34
+
35
+ ## 对象创建优化
36
+
37
+ - 避免循环内不必要的对象创建(在循环外创建可复用的对象)
38
+ - 使用 StringBuilder 替代循环内字符串拼接字符串 `s += ...` 模式
39
+
40
+ ## 缓存策略
41
+
42
+ - 频繁访问且变化不频繁的数据应使用缓存(Spring Cache / Caffeine / Redis)
43
+ - 缓存粒度:按业务维度拆分而非全量缓存
44
+ - 注意缓存失效策略与数据一致性约束
45
+
46
+ ## 异步处理
47
+
48
+ - 队列消费:确保线程池大小合理,不超过外部服务承载能力
49
+ - 异步任务须有超时保护和失败处理
@@ -0,0 +1,54 @@
1
+ ---
2
+ name: java-code-style
3
+ description: Java 代码风格规范——Lombok 注解优先、日志约定、Swagger/SpringDoc 注解、.gitignore 必须项、命名约定。仅在 Java 后端项目使用。
4
+ capabilities: ["style", "tech-stack-java"]
5
+ ---
6
+
7
+ > **项目规范优先**:本 skill 所列约定为推荐标准。若项目已有明确规范且与本 skill 不一致,以项目规范为准。
8
+ > 本文列出**最低审查基线**,不限于所列维度。AI 审查时必须结合自身代码风格知识做拓展覆盖,下列任何可能遗漏的代码风格维度均须纳入审查。
9
+
10
+ ## 日志规范
11
+
12
+ - Lombok 存在(pom.xml 中检测到 lombok 依赖)时必须用 `@Slf4j` 替代手动 `LoggerFactory.getLogger()`
13
+ - 检测方法:逐文件扫描 pom.xml 中是否含 `lombok` 依赖,若存在则该项目中所有新写/修改的类须使用 `@Slf4j` 生成 Logger 字段
14
+ - 范围控制:首轮审查仅对 diff 内新增/修改的类提出 issue(Low+ 阻塞),已存在的手动 Logger 按原严重级别正常提交
15
+ - Logger 字段名统一用 `log`
16
+ - 参数化日志:`log.info("order {} status {}", orderId, status)`,禁止字符串拼接构造日志消息
17
+ - 敏感数据(密码、Token、身份证号等)禁止出现在日志输出中
18
+
19
+ ## Lombok 注解使用约束
20
+
21
+ 项目引入 Lombok 时,如下场景必须优先使用 Lombok 注解而非手写等价代码:
22
+ - `@Getter` / `@Setter` — 替代手写 getter/setter(非贫血模型中业务行为不在此限)
23
+ - `@Builder` / `@Data` — 替代手写 builder / 值对象全部模板代码
24
+ - `@Slf4j` / `@Log4j2` — 替代手动 Logger 字段声明
25
+ - `@RequiredArgsConstructor` — 替代构造器注入的手动构造器(已有 DDD 构造器注入约束,此为补充方案)
26
+
27
+ 异常情况:getter/setter 有额外业务逻辑时(如校验、计算),不强制用 `@Getter`/`@Setter`,须手写
28
+
29
+ ## Swagger/SpringDoc 注解
30
+
31
+ 引入 SpringDoc OpenAPI(`springdoc-openapi-starter-webmvc-ui`)后:
32
+ - Controller 类:`@Tag(name = "xxx相关接口")`
33
+ - 接口方法:`@Operation(summary = "xxx")`
34
+ - DTO 字段:`@Schema(description = "xxx")`
35
+
36
+ ## .gitignore
37
+
38
+ 必须包含:
39
+ ```
40
+ target/
41
+ *.log
42
+ .idea/
43
+ *.iml
44
+ .env
45
+ ```
46
+
47
+ ## 命名规范
48
+
49
+ - 类名:PascalCase,业务领域名词
50
+ - 方法名:camelCase,动宾短语
51
+ - 常量:UPPER_SNAKE_CASE(static final 字段)
52
+ - 变量:camelCase,有业务含义
53
+ - 测试类:`{ClassName}Test`
54
+ - 测试方法:`test{MethodName}`
@@ -0,0 +1,44 @@
1
+ ---
2
+ name: java-db-conventions
3
+ description: 仅限 Java 后端开发场景。数据库规范——MyBatisPlus 持久化用法、审计字段自动填充、Flyway 迁移。通用 DB 设计约定见 db-conventions。适用场景同前。
4
+ capabilities: ["db-design", "architecture", "tech-stack-java"]
5
+ ---
6
+
7
+ > **项目规范优先**:本 skill 所列约定为推荐标准。若项目已有明确规范且与本 skill 不一致,以项目规范为准。
8
+ > 本 skill 是 db-conventions 的 Java 实现配套,仅含 Java/Spring 特有实现细节。通用 DB 约定见 db-conventions。调用本 skill 须同时加载 db-conventions。
9
+
10
+ ## 操作人来源
11
+
12
+ 操作人标识从 JWT 还原:`OncePerRequestFilter` 校验 JWT 并将身份写入 SecurityContext,持久化层从中提取填充审计字段 `creator`/`updater`。
13
+
14
+ ## MyBatisPlus 持久化用法
15
+
16
+ | 项 | 约定 |
17
+ |----|------|
18
+ | Mapper 包路径 | `{basePackage}.infrastructure.persistence`(由 `@MapperScan` 显式指定) |
19
+ | Mapper 注解 | 建议标注 `@Mapper` |
20
+ | PO 基类 | infrastructure 层定义 PO 基类统一审计字段,PO 继承之(注意:domain 实体按 DDD 包结构约定,独立于 PO,不继承该基类) |
21
+ | 查询方式 | 优先 `LambdaQueryWrapper` 面向对象方法;仅复杂多表关联/方言特性/Wrapper 难以表达时才写 XML SQL |
22
+ | 避免 | `select *`,防止映射不稳定 |
23
+ | Mapper XML | 语句间保持空行提升可读性 |
24
+ | 枚举映射 | 状态/类别等确定性字段在 DAO 层映射为枚举,经框架层统一枚举处理管道映射 DB TINYINT,业务代码禁止直接判断数值 |
25
+ | JSONB 映射 | 用具体 Java 类型 + typeHandler(需验证 MyBatisPlus 对 PG JSONB 适配,可能需自定义 typeHandler) |
26
+
27
+ 使用 MyBatisPlus 标准 `BaseMapper` + `LambdaQueryWrapper`,不依赖第三方增强框架的自研 Wrapper。
28
+
29
+ ## 审计字段自动填充
30
+
31
+ `creator`/`updater` 由 MyBatisPlus `MetaObjectHandler` 自动填充,业务代码不手动设值:
32
+
33
+ - PO 审计字段标注:`creator` 用 `@TableField(fill = FieldFill.INSERT)`,`updater` 用 `@TableField(fill = FieldFill.INSERT_UPDATE)`
34
+ - 实现 `MetaObjectHandler`,在 `insertFill`/`updateFill` 中从鉴权上下文取操作人标识注入
35
+ - 鉴权上下文由拦截器从 SecurityContext(JWT 还原的身份)提取操作人标识,请求级作用域
36
+ - `created_at`/`updated_at` 同理用 `MetaObjectHandler` 填充,或依赖 DB `DEFAULT now()` / `ON UPDATE`
37
+ - domain 实体不含审计字段,无 MyBatisPlus 注解(零框架依赖);自动填充仅作用于 infrastructure 层 PO
38
+
39
+ ## Flyway 迁移
40
+
41
+ - 脚本命名:`V{version}__{description}.sql`(如 `V1__init_schema.sql`)
42
+ - 脚本位置:`src/main/resources/db/migration/`
43
+ - 表结构变更由 Flyway 版本化管理,迁移脚本即变更记录,不另建 SQL 变更目录
44
+ - test profile 下 Flyway 禁用,测试用 H2(`MODE=PostgreSQL`)