ai-engineering-init 1.4.2 → 1.5.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 (132) hide show
  1. package/.claude/skills/leniu-java-export/SKILL.md +389 -95
  2. package/.codex/skills/leniu-java-export/SKILL.md +389 -95
  3. package/.cursor/skills/bug-detective/SKILL.md +19 -19
  4. package/.cursor/skills/leniu-java-export/SKILL.md +389 -95
  5. package/.cursor/skills/project-navigator/SKILL.md +164 -258
  6. package/package.json +7 -1
  7. package/scripts/build-skills.js +180 -0
  8. package/src/platform-map.json +56 -0
  9. package/src/skills/add-skill/SKILL.md +488 -0
  10. package/src/skills/add-todo/SKILL.md +269 -0
  11. package/src/skills/api-development/SKILL.md +266 -0
  12. package/src/skills/architecture-design/SKILL.md +262 -0
  13. package/src/skills/backend-annotations/SKILL.md +302 -0
  14. package/src/skills/banana-image/CHANGELOG.md +37 -0
  15. package/src/skills/banana-image/README.md +146 -0
  16. package/src/skills/banana-image/SKILL.md +171 -0
  17. package/src/skills/banana-image/assets/logo.png +0 -0
  18. package/src/skills/banana-image/references/advanced-usage.md +189 -0
  19. package/src/skills/banana-image/scripts/apply_template.py +125 -0
  20. package/src/skills/banana-image/scripts/banana_image_exec.ts +412 -0
  21. package/src/skills/banana-image/scripts/batch_prep.py +82 -0
  22. package/src/skills/banana-image/scripts/package-lock.json +1437 -0
  23. package/src/skills/banana-image/scripts/package.json +18 -0
  24. package/src/skills/banana-image/scripts/requirements.txt +10 -0
  25. package/src/skills/banana-image/templates/poster.json +22 -0
  26. package/src/skills/banana-image/templates/product.json +17 -0
  27. package/src/skills/banana-image/templates/social.json +22 -0
  28. package/src/skills/banana-image/templates/thumbnail.json +17 -0
  29. package/src/skills/brainstorm/SKILL.md +216 -0
  30. package/src/skills/bug-detective/SKILL.md +256 -0
  31. package/src/skills/bug-detective/references/error-patterns.md +242 -0
  32. package/src/skills/check/SKILL.md +367 -0
  33. package/src/skills/code-patterns/SKILL.md +280 -0
  34. package/src/skills/code-patterns/references/leniu-code-patterns.md +87 -0
  35. package/src/skills/codex-code-review/SKILL.md +135 -0
  36. package/src/skills/collaborating-with-codex/SKILL.md +174 -0
  37. package/src/skills/collaborating-with-codex/scripts/codex_bridge.py +275 -0
  38. package/src/skills/collaborating-with-gemini/SKILL.md +194 -0
  39. package/src/skills/collaborating-with-gemini/scripts/gemini_bridge.py +275 -0
  40. package/src/skills/crud/SKILL.md +265 -0
  41. package/src/skills/crud-development/SKILL.md +409 -0
  42. package/src/skills/data-permission/SKILL.md +292 -0
  43. package/src/skills/data-permission/references/custom-data-scope.md +90 -0
  44. package/src/skills/database-ops/SKILL.md +407 -0
  45. package/src/skills/dev/SKILL.md +187 -0
  46. package/src/skills/error-handler/SKILL.md +371 -0
  47. package/src/skills/file-oss-management/SKILL.md +255 -0
  48. package/src/skills/file-oss-management/references/entities.md +105 -0
  49. package/src/skills/file-oss-management/references/service-impl.md +104 -0
  50. package/src/skills/git-workflow/SKILL.md +397 -0
  51. package/src/skills/init-docs/SKILL.md +194 -0
  52. package/src/skills/json-serialization/SKILL.md +357 -0
  53. package/src/skills/leniu-api-development/SKILL.md +319 -0
  54. package/src/skills/leniu-api-development/references/real-examples.md +273 -0
  55. package/src/skills/leniu-architecture-design/SKILL.md +383 -0
  56. package/src/skills/leniu-backend-annotations/SKILL.md +277 -0
  57. package/src/skills/leniu-brainstorm/SKILL.md +242 -0
  58. package/src/skills/leniu-brainstorm/references/business-scenarios.md +162 -0
  59. package/src/skills/leniu-code-patterns/SKILL.md +411 -0
  60. package/src/skills/leniu-crud-development/SKILL.md +404 -0
  61. package/src/skills/leniu-crud-development/references/templates.md +597 -0
  62. package/src/skills/leniu-customization-location/SKILL.md +410 -0
  63. package/src/skills/leniu-data-permission/SKILL.md +341 -0
  64. package/src/skills/leniu-database-ops/SKILL.md +426 -0
  65. package/src/skills/leniu-error-handler/SKILL.md +462 -0
  66. package/src/skills/leniu-java-amount-handling/SKILL.md +461 -0
  67. package/src/skills/leniu-java-code-style/SKILL.md +510 -0
  68. package/src/skills/leniu-java-concurrent/SKILL.md +400 -0
  69. package/src/skills/leniu-java-entity/SKILL.md +237 -0
  70. package/src/skills/leniu-java-entity/references/templates.md +237 -0
  71. package/src/skills/leniu-java-export/SKILL.md +570 -0
  72. package/src/skills/leniu-java-logging/SKILL.md +229 -0
  73. package/src/skills/leniu-java-logging/references/data-mask.md +46 -0
  74. package/src/skills/leniu-java-logging/references/logging-scenarios.md +113 -0
  75. package/src/skills/leniu-java-mq/SKILL.md +338 -0
  76. package/src/skills/leniu-java-mybatis/SKILL.md +267 -0
  77. package/src/skills/leniu-java-mybatis/references/report-mapper.md +88 -0
  78. package/src/skills/leniu-java-report-query-param/SKILL.md +291 -0
  79. package/src/skills/leniu-java-task/SKILL.md +367 -0
  80. package/src/skills/leniu-java-total-line/SKILL.md +196 -0
  81. package/src/skills/leniu-marketing-price-rule-customizer/SKILL.md +301 -0
  82. package/src/skills/leniu-marketing-recharge-rule-customizer/SKILL.md +285 -0
  83. package/src/skills/leniu-mealtime/SKILL.md +215 -0
  84. package/src/skills/leniu-redis-cache/SKILL.md +331 -0
  85. package/src/skills/leniu-report-customization/SKILL.md +335 -0
  86. package/src/skills/leniu-report-customization/references/table-fields.md +93 -0
  87. package/src/skills/leniu-report-standard-customization/SKILL.md +328 -0
  88. package/src/skills/leniu-report-standard-customization/references/analysis-module.md +64 -0
  89. package/src/skills/leniu-report-standard-customization/references/table-fields.md +113 -0
  90. package/src/skills/leniu-security-guard/SKILL.md +306 -0
  91. package/src/skills/leniu-utils-toolkit/SKILL.md +380 -0
  92. package/src/skills/mysql-debug/SKILL.md +364 -0
  93. package/src/skills/next/SKILL.md +137 -0
  94. package/src/skills/openspec-apply-change/SKILL.md +165 -0
  95. package/src/skills/openspec-archive-change/SKILL.md +122 -0
  96. package/src/skills/openspec-bulk-archive-change/SKILL.md +254 -0
  97. package/src/skills/openspec-continue-change/SKILL.md +126 -0
  98. package/src/skills/openspec-explore/SKILL.md +299 -0
  99. package/src/skills/openspec-ff-change/SKILL.md +109 -0
  100. package/src/skills/openspec-new-change/SKILL.md +82 -0
  101. package/src/skills/openspec-onboard/SKILL.md +414 -0
  102. package/src/skills/openspec-sync-specs/SKILL.md +146 -0
  103. package/src/skills/openspec-verify-change/SKILL.md +176 -0
  104. package/src/skills/performance-doctor/SKILL.md +303 -0
  105. package/src/skills/progress/SKILL.md +193 -0
  106. package/src/skills/project-navigator/SKILL.md +211 -0
  107. package/src/skills/redis-cache/SKILL.md +333 -0
  108. package/src/skills/redis-cache/references/listeners.md +23 -0
  109. package/src/skills/scheduled-jobs/SKILL.md +314 -0
  110. package/src/skills/security-guard/SKILL.md +353 -0
  111. package/src/skills/security-guard/references/encrypt-config.md +103 -0
  112. package/src/skills/security-guard/references/sensitive-strategies.md +42 -0
  113. package/src/skills/sms-mail/SKILL.md +308 -0
  114. package/src/skills/sms-mail/references/mail-config.md +88 -0
  115. package/src/skills/sms-mail/references/sms-config.md +74 -0
  116. package/src/skills/social-login/SKILL.md +266 -0
  117. package/src/skills/social-login/references/provider-configs.md +118 -0
  118. package/src/skills/start/SKILL.md +154 -0
  119. package/src/skills/store-pc/SKILL.md +366 -0
  120. package/src/skills/sync/SKILL.md +149 -0
  121. package/src/skills/task-tracker/SKILL.md +307 -0
  122. package/src/skills/tech-decision/SKILL.md +393 -0
  123. package/src/skills/tenant-management/SKILL.md +288 -0
  124. package/src/skills/tenant-management/references/tenant-scenarios.md +91 -0
  125. package/src/skills/test-development/SKILL.md +301 -0
  126. package/src/skills/test-development/references/parameterized-examples.md +119 -0
  127. package/src/skills/ui-pc/SKILL.md +438 -0
  128. package/src/skills/update-status/SKILL.md +159 -0
  129. package/src/skills/utils-toolkit/SKILL.md +362 -0
  130. package/src/skills/utils-toolkit/references/redis-utils-api.md +56 -0
  131. package/src/skills/websocket-sse/SKILL.md +271 -0
  132. package/src/skills/workflow-engine/SKILL.md +321 -0
@@ -0,0 +1,229 @@
1
+ ---
2
+ name: leniu-java-logging
3
+ description: |
4
+ leniu-tengyun-core / leniu-yunshitang 项目日志规范。当编写日志代码时使用此 skill。
5
+
6
+ 触发场景:
7
+ - 编写日志记录代码(@Slf4j、log.info/error/debug)
8
+ - 记录异常日志(含完整堆栈)
9
+ - 业务关键路径日志埋点(订单/支付/MQ/定时任务)
10
+ - 配置日志级别和 Logback
11
+ - 敏感信息脱敏处理
12
+
13
+ 触发词:日志、@Slf4j、log.info、log.error、log.debug、日志级别、logback、日志格式、日志脱敏、异常日志
14
+ ---
15
+
16
+ # leniu 日志规范
17
+
18
+ ## 基本规则
19
+
20
+ - 使用 `@Slf4j`(Lombok),禁止直接用 Log4j/Logback API
21
+ - 使用 `{}` 占位符,禁止字符串拼接
22
+ - 异常对象作为 `log.error` 的**最后一个参数**(自动打印堆栈)
23
+ - 日志用**中文**,用 `【模块名】` 前缀便于检索
24
+ - 禁止记录密码、完整手机号等敏感信息
25
+
26
+ ## 日志级别选择
27
+
28
+ | 级别 | 场景 | 示例 |
29
+ |------|------|------|
30
+ | ERROR | 系统错误、需立即处理 | 数据库异常、外部服务失败 |
31
+ | WARN | 非预期但可处理 | 配置缺失用默认值、数据不存在 |
32
+ | INFO | 关键业务节点 | 订单创建/支付成功、定时任务完成 |
33
+ | DEBUG | 开发调试(生产不输出) | 查询参数、中间结果 |
34
+
35
+ ## 模块标识格式
36
+
37
+ ```java
38
+ log.info("【订单】开始创建订单, userId:{}", userId);
39
+ log.info("【支付】支付成功, orderId:{}, transactionId:{}", orderId, txId);
40
+ log.info("【库存】扣减库存, productId:{}, quantity:{}", productId, qty);
41
+ log.error("【远程调用】用户服务调用失败, userId:{}", userId, e);
42
+ ```
43
+
44
+ MQ 消费用方括号:
45
+ ```java
46
+ log.info("[xxx事件]MQ消费:开始");
47
+ log.info("[xxx事件]MQ消费:消息消费完成");
48
+ log.error("[xxx事件]MQ消费:处理异常", e);
49
+ ```
50
+
51
+ ## 异常日志(最重要)
52
+
53
+ ```java
54
+ // ✅ 正确:异常 e 作为最后参数,保留完整堆栈
55
+ try {
56
+ doProcess(orderId);
57
+ } catch (Exception e) {
58
+ log.error("订单处理失败, orderId:{}", orderId, e);
59
+ throw new LeException("订单处理失败");
60
+ }
61
+
62
+ // ✅ 记录案发现场(关键参数 + 上下文)
63
+ try {
64
+ updateStatus(orderId, status);
65
+ } catch (Exception e) {
66
+ log.error("订单状态更新失败, orderId:{}, oldStatus:{}, newStatus:{}",
67
+ orderId, oldStatus, status, e);
68
+ throw new LeException("订单状态更新失败");
69
+ }
70
+
71
+ // ❌ 错误:只记录 message,丢失堆栈
72
+ log.error("处理失败:{}", e.getMessage());
73
+ ```
74
+
75
+ ## 各层日志规范
76
+
77
+ ### Business/Service 层(关键业务)
78
+
79
+ ```java
80
+ @Slf4j
81
+ @Service
82
+ public class OrderService {
83
+
84
+ @Transactional(rollbackFor = Exception.class)
85
+ public Long create(OrderParam param) {
86
+ log.info("【订单】开始创建订单, userId:{}, productId:{}",
87
+ param.getUserId(), param.getProductId());
88
+ try {
89
+ Order order = buildOrder(param);
90
+ orderMapper.insert(order);
91
+ log.info("【订单】订单创建成功, orderId:{}", order.getId());
92
+ return order.getId();
93
+ } catch (Exception e) {
94
+ log.error("【订单】订单创建失败, param:{}", param, e);
95
+ throw new LeException("订单创建失败");
96
+ }
97
+ }
98
+ }
99
+ ```
100
+
101
+ ### 定时任务
102
+
103
+ ```java
104
+ @Slf4j
105
+ @Component
106
+ public class DataSyncJob {
107
+
108
+ @XxlJob("syncDataJob")
109
+ public void syncData() {
110
+ log.info("【定时任务】开始同步数据");
111
+ try {
112
+ int count = doSync();
113
+ log.info("【定时任务】数据同步完成, 同步数量:{}", count);
114
+ } catch (Exception e) {
115
+ log.error("【定时任务】数据同步失败", e);
116
+ }
117
+ }
118
+ }
119
+ ```
120
+
121
+ ### MQ 消费者
122
+
123
+ ```java
124
+ @Slf4j
125
+ @MQMessageListener(group = "order-order-v3-xxx", topic = "order", tag = "order-v3-xxx")
126
+ public class OrderMqListenerXxx implements MQListener<MqPayload<String>> {
127
+
128
+ @Override
129
+ public void onMessage(MqPayload<String> payload) {
130
+ log.info("[xxx事件]MQ消费:开始");
131
+ orderMqHandler.handleMessage(payload, OrderXxxPO.class, OrderMqHandler::handleXxx);
132
+ }
133
+ }
134
+ ```
135
+
136
+ ### 外部调用
137
+
138
+ ```java
139
+ public UserDTO getUserFromRemote(Long userId) {
140
+ log.info("【远程调用】开始调用用户服务, userId:{}", userId);
141
+ try {
142
+ UserDTO user = remoteUserService.getUser(userId);
143
+ log.info("【远程调用】用户服务调用成功, userId:{}", userId);
144
+ return user;
145
+ } catch (Exception e) {
146
+ log.error("【远程调用】用户服务调用失败, userId:{}", userId, e);
147
+ throw new LeException("用户信息获取失败");
148
+ }
149
+ }
150
+ ```
151
+
152
+ ## 性能规则
153
+
154
+ ```java
155
+ // ✅ debug 级别用条件判断或 Lambda(避免无用计算)
156
+ if (log.isDebugEnabled()) {
157
+ log.debug("详细数据: {}", expensiveOperation());
158
+ }
159
+
160
+ // ✅ 批量操作:前后各一条,不在循环内打印
161
+ log.info("开始处理订单, 数量:{}", orders.size());
162
+ int success = 0, fail = 0;
163
+ for (Order order : orders) {
164
+ try { process(order); success++; }
165
+ catch (Exception e) { log.error("订单处理失败, orderId:{}", order.getId(), e); fail++; }
166
+ }
167
+ log.info("订单处理完成, 成功:{}, 失败:{}", success, fail);
168
+
169
+ // ✅ 只记录关键信息,不序列化大对象
170
+ log.info("查询结果数量: {}", orders.size()); // ✅
171
+ // log.info("查询结果: {}", orders); // ❌ 大对象
172
+ ```
173
+
174
+ ## 敏感信息脱敏
175
+
176
+ ```java
177
+ // ❌ 禁止记录:密码、完整手机号、身份证、银行卡
178
+ log.info("用户登录, username:{}, password:{}", username, password);
179
+
180
+ // ✅ 脱敏后记录
181
+ log.info("发送验证码, mobile:{}", maskMobile(mobile)); // 138****1234
182
+ ```
183
+
184
+ 脱敏工具:详见 `references/data-mask.md`
185
+
186
+ ## Logback 配置
187
+
188
+ 配置文件:`core-starter/src/main/resources/logback-spring.xml`
189
+
190
+ | Profile | 作用 |
191
+ |---------|------|
192
+ | `no_log_console` | 不输出到控制台 |
193
+ | `no_log_file` | 不输出到文件 |
194
+
195
+ ```yaml
196
+ # application.yml 日志级别
197
+ logging:
198
+ level:
199
+ net.xnzn.core: INFO # 项目
200
+ com.baomidou.mybatisplus: INFO
201
+ org.springframework: WARN
202
+ ```
203
+
204
+ 开发环境 `net.xnzn.core: DEBUG`,生产环境 `INFO` + `no_log_console`。
205
+
206
+ ## 禁止项
207
+
208
+ ```java
209
+ // ❌ 直接用 Log4j API
210
+ import org.apache.log4j.Logger;
211
+
212
+ // ❌ 字符串拼接
213
+ log.info("userId:" + userId + ", name:" + name);
214
+
215
+ // ❌ 无意义日志
216
+ log.info("进入方法");
217
+ log.info("退出方法");
218
+
219
+ // ❌ 英文日志(项目要求中文)
220
+ log.info("Order created successfully");
221
+
222
+ // ❌ 丢失异常堆栈
223
+ log.error("失败:{}", e.getMessage());
224
+ ```
225
+
226
+ ## 参考文档
227
+
228
+ - 详细场景示例(Controller/分页/远程调用):详见 `references/logging-scenarios.md`
229
+ - 脱敏工具方法:详见 `references/data-mask.md`
@@ -0,0 +1,46 @@
1
+ # 日志脱敏工具方法
2
+
3
+ ```java
4
+ public class DataMaskUtil {
5
+
6
+ /**
7
+ * 手机号脱敏:138****1234
8
+ */
9
+ public static String maskMobile(String mobile) {
10
+ if (StrUtil.isBlank(mobile) || mobile.length() != 11) {
11
+ return mobile;
12
+ }
13
+ return mobile.substring(0, 3) + "****" + mobile.substring(7);
14
+ }
15
+
16
+ /**
17
+ * 身份证脱敏:1234**********5678
18
+ */
19
+ public static String maskIdCard(String idCard) {
20
+ if (StrUtil.isBlank(idCard) || idCard.length() < 8) {
21
+ return idCard;
22
+ }
23
+ return idCard.substring(0, 4) + "**********" + idCard.substring(idCard.length() - 4);
24
+ }
25
+
26
+ /**
27
+ * 银行卡脱敏:6222************8888
28
+ */
29
+ public static String maskBankCard(String bankCard) {
30
+ if (StrUtil.isBlank(bankCard) || bankCard.length() < 8) {
31
+ return bankCard;
32
+ }
33
+ return bankCard.substring(0, 4) + "************" + bankCard.substring(bankCard.length() - 4);
34
+ }
35
+ }
36
+ ```
37
+
38
+ ## 使用示例
39
+
40
+ ```java
41
+ // ❌ 禁止
42
+ log.info("发送验证码, mobile:{}, code:{}", mobile, code);
43
+
44
+ // ✅ 正确
45
+ log.info("发送验证码, mobile:{}", DataMaskUtil.maskMobile(mobile));
46
+ ```
@@ -0,0 +1,113 @@
1
+ # 日志场景详细示例
2
+
3
+ ## Controller 层日志
4
+
5
+ ```java
6
+ @Slf4j
7
+ @RequiresAuthentication
8
+ @RestController
9
+ @RequestMapping("/api/order")
10
+ @Api(value = "订单管理", tags = "订单管理")
11
+ public class OrderController {
12
+
13
+ @Autowired
14
+ private OrderService orderService;
15
+
16
+ @ApiOperation(value = "创建订单")
17
+ @PostMapping("/create")
18
+ public Long create(@Valid @RequestBody LeRequest<OrderParam> request) {
19
+ OrderParam param = request.getContent();
20
+ log.info("【订单】创建订单请求, userId:{}, productId:{}",
21
+ param.getUserId(), param.getProductId());
22
+
23
+ Long orderId = orderService.create(param);
24
+
25
+ log.info("【订单】订单创建成功, orderId:{}", orderId);
26
+ return orderId;
27
+ }
28
+ }
29
+ ```
30
+
31
+ ## 分页查询日志
32
+
33
+ ```java
34
+ @Slf4j
35
+ @Service
36
+ public class OrderService {
37
+
38
+ public Page<OrderVO> pageList(OrderQueryParam param) {
39
+ log.info("【订单】分页查询订单, pageNum:{}, pageSize:{}, keyword:{}",
40
+ param.getPage().getPageNum(),
41
+ param.getPage().getPageSize(),
42
+ param.getKeyword());
43
+
44
+ PageMethod.startPage(param.getPage().getPageNum(), param.getPage().getPageSize());
45
+ List<OrderEntity> records = orderMapper.selectList(buildWrapper(param));
46
+ Page<OrderVO> result = new Page<>(BeanUtil.copyToList(records, OrderVO.class));
47
+
48
+ log.info("【订单】分页查询完成, total:{}", result.getTotal());
49
+ return result;
50
+ }
51
+ }
52
+ ```
53
+
54
+ ## 条件日志输出
55
+
56
+ ```java
57
+ // 对于 debug/trace 级别,使用条件输出
58
+ if (log.isDebugEnabled()) {
59
+ log.debug("详细数据: {}", expensiveOperation());
60
+ }
61
+
62
+ // 或使用 Lambda 形式(推荐)
63
+ log.debug("详细数据: {}", () -> expensiveOperation());
64
+ ```
65
+
66
+ ## Profile 环境配置示例
67
+
68
+ ```yaml
69
+ spring:
70
+ profiles:
71
+ active: dev
72
+
73
+ ---
74
+ # 开发环境
75
+ spring:
76
+ profiles: dev
77
+ logging:
78
+ level:
79
+ net.xnzn.core: DEBUG
80
+
81
+ ---
82
+ # 生产环境
83
+ spring:
84
+ profiles: prod
85
+ logging:
86
+ level:
87
+ net.xnzn.core: INFO
88
+ profiles:
89
+ include: no_log_console
90
+ ```
91
+
92
+ ## Logback 配置示例
93
+
94
+ ```xml
95
+ <?xml version="1.0" encoding="UTF-8"?>
96
+ <configuration>
97
+ <include resource="org/springframework/boot/logging/logback/defaults.xml"/>
98
+ <include resource="org/springframework/boot/logging/logback/console-appender.xml"/>
99
+ <include resource="org/springframework/boot/logging/logback/file-appender.xml"/>
100
+
101
+ <springProfile name="!no_log_console">
102
+ <root level="INFO">
103
+ <appender-ref ref="CONSOLE"/>
104
+ </root>
105
+ </springProfile>
106
+
107
+ <springProfile name="!no_log_file">
108
+ <root level="INFO">
109
+ <appender-ref ref="FILE"/>
110
+ </root>
111
+ </springProfile>
112
+ </configuration>
113
+ ```