@llryiop/avatar-boot-cli 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.
Files changed (77) hide show
  1. package/README.md +309 -0
  2. package/bin/cli.js +3 -0
  3. package/docs/plans/2026-03-12-avatar-boot-cli-design.md +73 -0
  4. package/docs/plans/2026-03-12-avatar-boot-cli-plan.md +681 -0
  5. package/package.json +28 -0
  6. package/src/index.js +78 -0
  7. package/src/prompts.js +78 -0
  8. package/src/template.js +37 -0
  9. package/src/transform.js +172 -0
  10. package/src/utils.js +34 -0
  11. package/templates/.claude/rules/architecture-redlines.md +146 -0
  12. package/templates/.claude/rules/code-review-standards.md +137 -0
  13. package/templates/.claude/rules/coding-standards.md +56 -0
  14. package/templates/.claude/rules/git-commit.md +59 -0
  15. package/templates/.claude/rules/layered-architecture.md +201 -0
  16. package/templates/.claude/rules/mybatis-plus.md +263 -0
  17. package/templates/.claude/rules/tech-stack.md +41 -0
  18. package/templates/.claude/rules/version.md +467 -0
  19. package/templates/.claude/settings.local.json +18 -0
  20. package/templates/.claude/skills/ai-tool-guide/SKILL.md +314 -0
  21. package/templates/.claude/skills/api-design/SKILL.md +200 -0
  22. package/templates/.claude/skills/api-doc-generator/SKILL.md +380 -0
  23. package/templates/.claude/skills/api-service-module-creator/SKILL.md +1114 -0
  24. package/templates/.claude/skills/avatar-boot-starter-feign/SKILL.md +243 -0
  25. package/templates/.claude/skills/avatar-boot-starter-job/SKILL.md +437 -0
  26. package/templates/.claude/skills/avatar-boot-starter-kafka/SKILL.md +580 -0
  27. package/templates/.claude/skills/avatar-boot-starter-mysql/SKILL.md +572 -0
  28. package/templates/.claude/skills/avatar-boot-starter-nacos/SKILL.md +901 -0
  29. package/templates/.claude/skills/avatar-boot-starter-oss/SKILL.md +594 -0
  30. package/templates/.claude/skills/avatar-boot-starter-redis/SKILL.md +586 -0
  31. package/templates/.claude/skills/avatar-boot-starter-rocketmq/SKILL.md +662 -0
  32. package/templates/.claude/skills/avatar-boot-starter-web/SKILL.md +1007 -0
  33. package/templates/.claude/skills/changelog-generator/SKILL.md +114 -0
  34. package/templates/.claude/skills/code-review/SKILL.md +239 -0
  35. package/templates/.claude/skills/crud-generator/SKILL.md +824 -0
  36. package/templates/.claude/skills/database-design/SKILL.md +377 -0
  37. package/templates/.claude/skills/deployment-config/SKILL.md +277 -0
  38. package/templates/.claude/skills/incident-analysis/SKILL.md +241 -0
  39. package/templates/.claude/skills/integration-test-generator/SKILL.md +496 -0
  40. package/templates/.claude/skills/prompt-engineering/SKILL.md +249 -0
  41. package/templates/.claude/skills/requirement-management/SKILL.md +244 -0
  42. package/templates/.claude/skills/security-audit/SKILL.md +330 -0
  43. package/templates/.claude/skills/test-case-design/SKILL.md +257 -0
  44. package/templates/.claude/skills/testing-workflow/SKILL.md +68 -0
  45. package/templates/.claude/skills/troubleshooting/SKILL.md +240 -0
  46. package/templates/CLAUDE.md +173 -0
  47. package/templates/README.md +303 -0
  48. package/templates/avatar-scaffold-api/pom.xml +41 -0
  49. package/templates/avatar-scaffold-api/src/main/java/com/iflytek/avatar/login/api/LoginFeignClient.java +40 -0
  50. package/templates/avatar-scaffold-api/src/main/java/com/iflytek/avatar/login/constant/LoginConstant.java +21 -0
  51. package/templates/avatar-scaffold-api/src/main/java/com/iflytek/avatar/login/dto/request/LoginRequest.java +17 -0
  52. package/templates/avatar-scaffold-api/src/main/java/com/iflytek/avatar/login/dto/request/RefreshTokenRequest.java +14 -0
  53. package/templates/avatar-scaffold-api/src/main/java/com/iflytek/avatar/login/dto/response/LoginResponse.java +31 -0
  54. package/templates/avatar-scaffold-api/src/main/java/com/iflytek/avatar/login/dto/response/TokenInfoResponse.java +25 -0
  55. package/templates/avatar-scaffold-api/src/main/java/com/iflytek/avatar/login/enums/LoginTypeEnum.java +23 -0
  56. package/templates/avatar-scaffold-api/src/main/java/com/iflytek/avatar/login/exception/LoginException.java +23 -0
  57. package/templates/avatar-scaffold-service/k8s-app/Dockerfile +14 -0
  58. package/templates/avatar-scaffold-service/k8s-app/Dockerfile-arm64 +14 -0
  59. package/templates/avatar-scaffold-service/packaging/assembly.xml +16 -0
  60. package/templates/avatar-scaffold-service/pom.xml +150 -0
  61. package/templates/avatar-scaffold-service/src/main/java/com/iflytek/avatar/Application.java +21 -0
  62. package/templates/avatar-scaffold-service/src/main/java/com/iflytek/avatar/login/config/LoginConfig.java +20 -0
  63. package/templates/avatar-scaffold-service/src/main/java/com/iflytek/avatar/login/controller/LoginController.java +37 -0
  64. package/templates/avatar-scaffold-service/src/main/java/com/iflytek/avatar/login/converter/LoginConverter.java +54 -0
  65. package/templates/avatar-scaffold-service/src/main/java/com/iflytek/avatar/login/feign/DemoFeign.java +21 -0
  66. package/templates/avatar-scaffold-service/src/main/java/com/iflytek/avatar/login/repository/entity/UserLoginEntity.java +33 -0
  67. package/templates/avatar-scaffold-service/src/main/java/com/iflytek/avatar/login/repository/entity/UserTokenEntity.java +39 -0
  68. package/templates/avatar-scaffold-service/src/main/java/com/iflytek/avatar/login/repository/mapper/UserLoginMapper.java +20 -0
  69. package/templates/avatar-scaffold-service/src/main/java/com/iflytek/avatar/login/service/LoginService.java +22 -0
  70. package/templates/avatar-scaffold-service/src/main/java/com/iflytek/avatar/login/service/impl/LoginServiceImpl.java +43 -0
  71. package/templates/avatar-scaffold-service/src/main/java/com/iflytek/avatar/login/utils/LoginUtils.java +31 -0
  72. package/templates/avatar-scaffold-service/src/main/resources/application-dev.yaml +29 -0
  73. package/templates/avatar-scaffold-service/src/main/resources/application-local.yaml +61 -0
  74. package/templates/avatar-scaffold-service/src/main/resources/application-prod.yaml +28 -0
  75. package/templates/avatar-scaffold-service/src/main/resources/application-test.yaml +28 -0
  76. package/templates/avatar-scaffold-service/src/main/resources/application.yaml +12 -0
  77. package/templates/pom.xml +98 -0
@@ -0,0 +1,380 @@
1
+ ---
2
+ name: api-doc-generator
3
+ description: |
4
+ API 文档生成技能。当用户提到以下关键词时触发:
5
+ API doc, Swagger, OpenAPI, 接口文档, SpringDoc,
6
+ 接口说明, API 文档生成, 文档注解
7
+
8
+ 本技能提供 Controller 到 OpenAPI/Swagger 注解的生成指导,
9
+ 包括 SpringDoc 集成配置、常用注解使用、分组文档、
10
+ 代码示例和常见问题排查。
11
+ ---
12
+
13
+ # API 文档生成技能
14
+
15
+ ## 适用场景
16
+
17
+ - 为已有 Controller 生成 OpenAPI 注解
18
+ - 集成 SpringDoc 到 Avatar Boot 项目
19
+ - 配置 API 文档分组
20
+ - 自定义文档展示内容
21
+
22
+ ## SpringDoc 集成
23
+
24
+ ### 依赖配置
25
+
26
+ ```xml
27
+ <!-- pom.xml (api 模块) -->
28
+ <dependency>
29
+ <groupId>org.springdoc</groupId>
30
+ <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
31
+ <version>2.5.0</version>
32
+ </dependency>
33
+ ```
34
+
35
+ ### 基础配置
36
+
37
+ ```yaml
38
+ # application.yml
39
+ springdoc:
40
+ api-docs:
41
+ enabled: true
42
+ path: /v3/api-docs
43
+ swagger-ui:
44
+ enabled: true
45
+ path: /swagger-ui.html
46
+ tags-sorter: alpha
47
+ operations-sorter: alpha
48
+ default-produces-media-type: application/json
49
+ default-consumes-media-type: application/json
50
+ ```
51
+
52
+ ### 全局配置类
53
+
54
+ ```java
55
+ @Configuration
56
+ public class OpenApiConfig {
57
+
58
+ @Bean
59
+ public OpenAPI customOpenAPI() {
60
+ return new OpenAPI()
61
+ .info(new Info()
62
+ .title("Avatar Boot 服务 API 文档")
63
+ .version("1.0.0")
64
+ .description("基于 Avatar Boot 框架的服务接口文档")
65
+ .contact(new Contact()
66
+ .name("开发团队")
67
+ .email("dev@example.com")))
68
+ .externalDocs(new ExternalDocumentation()
69
+ .description("项目文档")
70
+ .url("https://wiki.example.com"));
71
+ }
72
+ }
73
+ ```
74
+
75
+ ## Controller 注解生成
76
+
77
+ ### 完整 Controller 示例
78
+
79
+ ```java
80
+ @Tag(name = "用户管理", description = "用户信息的增删改查接口")
81
+ @RestController
82
+ @RequestMapping("/api/users")
83
+ @RequiredArgsConstructor
84
+ public class UserController {
85
+
86
+ private final UserService userService;
87
+
88
+ @Operation(
89
+ summary = "根据ID查询用户",
90
+ description = "根据用户ID查询用户详细信息,返回脱敏后的数据"
91
+ )
92
+ @ApiResponses({
93
+ @ApiResponse(responseCode = "200", description = "查询成功",
94
+ content = @Content(schema = @Schema(implementation = Result.class))),
95
+ @ApiResponse(responseCode = "200", description = "用户不存在(业务错误码非0)")
96
+ })
97
+ @GetMapping("/{id}")
98
+ public Result<UserInfoVO> getById(
99
+ @Parameter(description = "用户ID", required = true, example = "1")
100
+ @PathVariable Long id) {
101
+ return Result.success(userService.getById(id));
102
+ }
103
+
104
+ @Operation(summary = "创建用户", description = "创建新用户,用户名不可重复")
105
+ @PostMapping
106
+ public Result<Long> create(
107
+ @RequestBody @Valid UserInfoCreateDTO dto) {
108
+ return Result.success(userService.create(dto));
109
+ }
110
+
111
+ @Operation(summary = "更新用户信息")
112
+ @PutMapping("/{id}")
113
+ public Result<Void> update(
114
+ @Parameter(description = "用户ID", required = true)
115
+ @PathVariable Long id,
116
+ @RequestBody @Valid UserInfoUpdateDTO dto) {
117
+ userService.update(id, dto);
118
+ return Result.success();
119
+ }
120
+
121
+ @Operation(summary = "删除用户", description = "逻辑删除用户,关联数据不受影响")
122
+ @DeleteMapping("/{id}")
123
+ public Result<Void> delete(
124
+ @Parameter(description = "用户ID", required = true)
125
+ @PathVariable Long id) {
126
+ userService.delete(id);
127
+ return Result.success();
128
+ }
129
+
130
+ @Operation(summary = "分页查询用户列表")
131
+ @PostMapping("/page")
132
+ public Result<IPage<UserInfoVO>> page(
133
+ @RequestBody @Valid UserInfoPageQueryDTO dto) {
134
+ return Result.success(userService.page(dto));
135
+ }
136
+
137
+ @Operation(summary = "批量删除用户")
138
+ @DeleteMapping("/batch")
139
+ public Result<Void> batchDelete(
140
+ @Parameter(description = "用户ID列表", required = true)
141
+ @RequestBody List<Long> ids) {
142
+ userService.batchDelete(ids);
143
+ return Result.success();
144
+ }
145
+ }
146
+ ```
147
+
148
+ ## 核心注解详解
149
+
150
+ ### @Tag — 接口分组
151
+
152
+ ```java
153
+ // 用在 Controller 类上,定义接口分组
154
+ @Tag(name = "用户管理", description = "用户信息的增删改查接口")
155
+ @RestController
156
+ public class UserController { }
157
+ ```
158
+
159
+ ### @Operation — 接口描述
160
+
161
+ ```java
162
+ @Operation(
163
+ summary = "简要描述(显示在接口列表中)",
164
+ description = "详细描述(展开后显示)",
165
+ deprecated = false, // 是否废弃
166
+ hidden = false // 是否隐藏
167
+ )
168
+ ```
169
+
170
+ ### @Parameter — 参数描述
171
+
172
+ ```java
173
+ // 路径参数
174
+ @Parameter(description = "用户ID", required = true, example = "1")
175
+ @PathVariable Long id
176
+
177
+ // 查询参数
178
+ @Parameter(description = "用户名(模糊匹配)", example = "zhang")
179
+ @RequestParam(required = false) String username
180
+
181
+ // Header 参数
182
+ @Parameter(description = "认证令牌", in = ParameterIn.HEADER, required = true)
183
+ @RequestHeader("Authorization") String token
184
+ ```
185
+
186
+ ### @Schema — 模型描述
187
+
188
+ ```java
189
+ @Data
190
+ @Schema(description = "用户创建请求")
191
+ public class UserInfoCreateDTO {
192
+
193
+ @Schema(description = "用户名", requiredMode = Schema.RequiredMode.REQUIRED,
194
+ example = "zhangsan", maxLength = 50)
195
+ @NotBlank(message = "用户名不能为空")
196
+ private String username;
197
+
198
+ @Schema(description = "手机号", requiredMode = Schema.RequiredMode.REQUIRED,
199
+ example = "13812345678", pattern = "^1[3-9]\\d{9}$")
200
+ @NotBlank(message = "手机号不能为空")
201
+ private String phone;
202
+
203
+ @Schema(description = "邮箱", example = "zhangsan@example.com")
204
+ private String email;
205
+
206
+ @Schema(description = "用户状态", allowableValues = {"0", "1"},
207
+ defaultValue = "1", example = "1")
208
+ private Integer status;
209
+ }
210
+ ```
211
+
212
+ ### @ApiResponse — 响应描述
213
+
214
+ ```java
215
+ @ApiResponses({
216
+ @ApiResponse(responseCode = "200", description = "操作成功",
217
+ content = @Content(
218
+ mediaType = "application/json",
219
+ schema = @Schema(implementation = Result.class),
220
+ examples = @ExampleObject(value = """
221
+ {
222
+ "code": 0,
223
+ "message": "success",
224
+ "data": { "id": 1, "username": "zhangsan" }
225
+ }
226
+ """)
227
+ )),
228
+ @ApiResponse(responseCode = "400", description = "参数校验失败"),
229
+ @ApiResponse(responseCode = "401", description = "未认证"),
230
+ @ApiResponse(responseCode = "403", description = "无权限")
231
+ })
232
+ ```
233
+
234
+ ## 分组文档配置
235
+
236
+ 按模块或业务域对 API 进行分组:
237
+
238
+ ```java
239
+ @Configuration
240
+ public class OpenApiGroupConfig {
241
+
242
+ @Bean
243
+ public GroupedOpenApi userApi() {
244
+ return GroupedOpenApi.builder()
245
+ .group("1-用户管理")
246
+ .pathsToMatch("/api/users/**")
247
+ .build();
248
+ }
249
+
250
+ @Bean
251
+ public GroupedOpenApi orderApi() {
252
+ return GroupedOpenApi.builder()
253
+ .group("2-订单管理")
254
+ .pathsToMatch("/api/orders/**")
255
+ .build();
256
+ }
257
+
258
+ @Bean
259
+ public GroupedOpenApi systemApi() {
260
+ return GroupedOpenApi.builder()
261
+ .group("3-系统管理")
262
+ .pathsToMatch("/api/system/**")
263
+ .packagesToScan("com.example.controller.system")
264
+ .build();
265
+ }
266
+ }
267
+ ```
268
+
269
+ ## Result<T> 泛型文档支持
270
+
271
+ 为了让 SpringDoc 正确解析 `Result<T>` 泛型,确保 Controller 方法的返回类型明确泛型参数:
272
+
273
+ ```java
274
+ // 正确:明确泛型类型
275
+ public Result<UserInfoVO> getById(...)
276
+
277
+ // 正确:分页泛型
278
+ public Result<IPage<UserInfoVO>> page(...)
279
+
280
+ // 错误:原始类型,文档无法推断 data 结构
281
+ public Result getById(...)
282
+ ```
283
+
284
+ ### Result 类注解
285
+
286
+ ```java
287
+ @Data
288
+ @Schema(description = "统一响应结构")
289
+ public class Result<T> {
290
+
291
+ @Schema(description = "业务状态码,0表示成功", example = "0")
292
+ private Integer code;
293
+
294
+ @Schema(description = "响应消息", example = "success")
295
+ private String message;
296
+
297
+ @Schema(description = "响应数据")
298
+ private T data;
299
+ }
300
+ ```
301
+
302
+ ## 生产环境关闭文档
303
+
304
+ ```yaml
305
+ # application-prod.yml
306
+ springdoc:
307
+ api-docs:
308
+ enabled: false
309
+ swagger-ui:
310
+ enabled: false
311
+ ```
312
+
313
+ 或使用条件配置:
314
+
315
+ ```java
316
+ @Configuration
317
+ @Profile("!prod")
318
+ public class OpenApiConfig {
319
+ // 仅在非生产环境加载
320
+ }
321
+ ```
322
+
323
+ ## 文档访问地址
324
+
325
+ ```
326
+ Swagger UI: http://localhost:8080/swagger-ui.html
327
+ OpenAPI JSON: http://localhost:8080/v3/api-docs
328
+ OpenAPI YAML: http://localhost:8080/v3/api-docs.yaml
329
+ 分组文档: http://localhost:8080/v3/api-docs/1-用户管理
330
+ ```
331
+
332
+ ## 最佳实践
333
+
334
+ 1. **中文描述** — `summary` 和 `description` 使用中文,方便团队协作
335
+ 2. **示例值** — 每个字段提供 `example`,便于前端理解和调试
336
+ 3. **枚举说明** — 使用 `allowableValues` 说明枚举值含义
337
+ 4. **分组管理** — 按业务模块分组,方便查找
338
+ 5. **保持同步** — 注解与代码逻辑保持一致,避免文档与实际行为不符
339
+ 6. **生产关闭** — 生产环境必须关闭 Swagger UI
340
+ 7. **版本控制** — API 文档版本与应用版本一致
341
+ 8. **废弃标记** — 废弃接口使用 `@Deprecated` + `deprecated = true`
342
+
343
+ ## 常见问题排查
344
+
345
+ ### Swagger UI 页面空白
346
+
347
+ ```
348
+ 原因: 静态资源路径被拦截
349
+ 解决:
350
+ 1. 检查 Security 配置是否放行 /swagger-ui/** 和 /v3/api-docs/**
351
+ 2. 检查是否有自定义 WebMvcConfigurer 覆盖了资源映射
352
+ ```
353
+
354
+ ### 泛型类型显示为 Object
355
+
356
+ ```
357
+ 原因: 返回类型使用了原始 Result 而非 Result<T>
358
+ 解决:
359
+ 1. Controller 方法返回值明确泛型参数
360
+ 2. 使用 @Schema 注解标注 DTO 字段类型
361
+ ```
362
+
363
+ ### 分页响应结构不正确
364
+
365
+ ```
366
+ 原因: IPage 接口的泛型推断问题
367
+ 解决:
368
+ 1. 使用具体实现类 Page<T> 替代 IPage<T> 作为返回类型
369
+ 2. 或自定义 PageVO<T> 作为响应类型
370
+ ```
371
+
372
+ ### 文档加载缓慢
373
+
374
+ ```
375
+ 原因: 扫描了过多的包路径
376
+ 解决:
377
+ 1. 使用 packagesToScan 限制扫描范围
378
+ 2. 使用 pathsToMatch 限制匹配路径
379
+ 3. 排除不需要文档的内部接口
380
+ ```