ai-engineering-init 1.1.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 (313) hide show
  1. package/.claude/agents/code-reviewer.md +139 -0
  2. package/.claude/agents/project-manager.md +159 -0
  3. package/.claude/audio/completed.wav +0 -0
  4. package/.claude/commands/add-todo.md +255 -0
  5. package/.claude/commands/check.md +210 -0
  6. package/.claude/commands/crud.md +454 -0
  7. package/.claude/commands/dev.md +503 -0
  8. package/.claude/commands/init-docs.md +681 -0
  9. package/.claude/commands/next.md +251 -0
  10. package/.claude/commands/progress.md +242 -0
  11. package/.claude/commands/start.md +199 -0
  12. package/.claude/commands/sync.md +307 -0
  13. package/.claude/commands/update-status.md +428 -0
  14. package/.claude/docs/Mixin/344/275/277/347/224/250/346/214/207/345/215/227.md +299 -0
  15. package/.claude/docs/README.md +167 -0
  16. package/.claude/docs//345/211/215/347/253/257/345/274/200/345/217/221/346/214/207/345/215/227.md +599 -0
  17. package/.claude/docs//345/220/216/347/253/257/345/274/200/345/217/221/346/214/207/345/215/227.md +726 -0
  18. package/.claude/docs//345/267/245/344/275/234/346/265/201/345/274/200/345/217/221/346/214/207/345/215/227.md +714 -0
  19. package/.claude/docs//345/267/245/345/205/267/347/261/273/344/275/277/347/224/250/346/214/207/345/215/227.md +463 -0
  20. package/.claude/docs//346/225/260/346/215/256/345/272/223/350/256/276/350/256/241/350/247/204/350/214/203.md +390 -0
  21. package/.claude/docs//346/226/260/345/212/237/350/203/275/345/274/200/345/217/221/346/265/201/347/250/213/350/247/204/350/214/203.md +688 -0
  22. package/.claude/docs//346/226/260/351/241/271/347/233/256/345/274/200/345/217/221/346/265/201/347/250/213.md +365 -0
  23. package/.claude/docs//346/241/206/346/236/266/350/257/264/346/230/216.md +393 -0
  24. package/.claude/docs//350/267/257/347/224/261/351/205/215/347/275/256/346/214/207/345/215/227.md +246 -0
  25. package/.claude/framework-config.json +73 -0
  26. package/.claude/hooks/pre-tool-use.js +117 -0
  27. package/.claude/hooks/skill-forced-eval.js +167 -0
  28. package/.claude/hooks/stop.js +58 -0
  29. package/.claude/settings.json +41 -0
  30. package/.claude/skills/add-skill/SKILL.md +352 -0
  31. package/.claude/skills/api-development/SKILL.md +560 -0
  32. package/.claude/skills/architecture-design/SKILL.md +756 -0
  33. package/.claude/skills/backend-annotations/SKILL.md +674 -0
  34. package/.claude/skills/banana-image/CHANGELOG.md +37 -0
  35. package/.claude/skills/banana-image/README.md +146 -0
  36. package/.claude/skills/banana-image/SKILL.md +164 -0
  37. package/.claude/skills/banana-image/assets/logo.png +0 -0
  38. package/.claude/skills/banana-image/references/advanced-usage.md +189 -0
  39. package/.claude/skills/banana-image/scripts/apply_template.py +125 -0
  40. package/.claude/skills/banana-image/scripts/banana_image_exec.ts +412 -0
  41. package/.claude/skills/banana-image/scripts/batch_prep.py +82 -0
  42. package/.claude/skills/banana-image/scripts/package-lock.json +1437 -0
  43. package/.claude/skills/banana-image/scripts/package.json +18 -0
  44. package/.claude/skills/banana-image/scripts/requirements.txt +10 -0
  45. package/.claude/skills/banana-image/templates/poster.json +22 -0
  46. package/.claude/skills/banana-image/templates/product.json +17 -0
  47. package/.claude/skills/banana-image/templates/social.json +22 -0
  48. package/.claude/skills/banana-image/templates/thumbnail.json +17 -0
  49. package/.claude/skills/brainstorm/SKILL.md +648 -0
  50. package/.claude/skills/bug-detective/SKILL.md +1206 -0
  51. package/.claude/skills/code-patterns/SKILL.md +590 -0
  52. package/.claude/skills/collaborating-with-codex/SKILL.md +174 -0
  53. package/.claude/skills/collaborating-with-codex/scripts/codex_bridge.py +275 -0
  54. package/.claude/skills/collaborating-with-gemini/SKILL.md +194 -0
  55. package/.claude/skills/collaborating-with-gemini/scripts/gemini_bridge.py +275 -0
  56. package/.claude/skills/crud-development/SKILL.md +649 -0
  57. package/.claude/skills/data-permission/SKILL.md +599 -0
  58. package/.claude/skills/database-ops/SKILL.md +407 -0
  59. package/.claude/skills/error-handler/SKILL.md +371 -0
  60. package/.claude/skills/file-oss-management/SKILL.md +863 -0
  61. package/.claude/skills/git-workflow/SKILL.md +375 -0
  62. package/.claude/skills/json-serialization/SKILL.md +357 -0
  63. package/.claude/skills/leniu-api-development/SKILL.md +803 -0
  64. package/.claude/skills/leniu-architecture-design/SKILL.md +598 -0
  65. package/.claude/skills/leniu-backend-annotations/SKILL.md +664 -0
  66. package/.claude/skills/leniu-code-patterns/SKILL.md +365 -0
  67. package/.claude/skills/leniu-crud-development/SKILL.md +1110 -0
  68. package/.claude/skills/leniu-data-permission/SKILL.md +256 -0
  69. package/.claude/skills/leniu-database-ops/SKILL.md +426 -0
  70. package/.claude/skills/leniu-error-handler/SKILL.md +462 -0
  71. package/.claude/skills/leniu-java-amount-handling/SKILL.md +461 -0
  72. package/.claude/skills/leniu-java-code-style/SKILL.md +510 -0
  73. package/.claude/skills/leniu-java-concurrent/SKILL.md +400 -0
  74. package/.claude/skills/leniu-java-entity/SKILL.md +751 -0
  75. package/.claude/skills/leniu-java-export/SKILL.md +560 -0
  76. package/.claude/skills/leniu-java-logging/SKILL.md +832 -0
  77. package/.claude/skills/leniu-java-mq/SKILL.md +338 -0
  78. package/.claude/skills/leniu-java-mybatis/SKILL.md +640 -0
  79. package/.claude/skills/leniu-java-report-query-param/SKILL.md +291 -0
  80. package/.claude/skills/leniu-java-task/SKILL.md +367 -0
  81. package/.claude/skills/leniu-java-total-line/SKILL.md +195 -0
  82. package/.claude/skills/leniu-marketing-price-rule-customizer/SKILL.md +301 -0
  83. package/.claude/skills/leniu-marketing-recharge-rule-customizer/SKILL.md +285 -0
  84. package/.claude/skills/leniu-mealtime/SKILL.md +215 -0
  85. package/.claude/skills/leniu-redis-cache/SKILL.md +316 -0
  86. package/.claude/skills/leniu-security-guard/SKILL.md +520 -0
  87. package/.claude/skills/leniu-utils-toolkit/SKILL.md +380 -0
  88. package/.claude/skills/openspec-apply-change/SKILL.md +156 -0
  89. package/.claude/skills/openspec-archive-change/SKILL.md +114 -0
  90. package/.claude/skills/openspec-bulk-archive-change/SKILL.md +246 -0
  91. package/.claude/skills/openspec-continue-change/SKILL.md +118 -0
  92. package/.claude/skills/openspec-explore/SKILL.md +290 -0
  93. package/.claude/skills/openspec-ff-change/SKILL.md +101 -0
  94. package/.claude/skills/openspec-new-change/SKILL.md +74 -0
  95. package/.claude/skills/openspec-onboard/SKILL.md +529 -0
  96. package/.claude/skills/openspec-sync-specs/SKILL.md +138 -0
  97. package/.claude/skills/openspec-verify-change/SKILL.md +168 -0
  98. package/.claude/skills/performance-doctor/SKILL.md +627 -0
  99. package/.claude/skills/project-navigator/SKILL.md +305 -0
  100. package/.claude/skills/redis-cache/SKILL.md +839 -0
  101. package/.claude/skills/scheduled-jobs/SKILL.md +633 -0
  102. package/.claude/skills/security-guard/SKILL.md +748 -0
  103. package/.claude/skills/sms-mail/SKILL.md +766 -0
  104. package/.claude/skills/social-login/SKILL.md +668 -0
  105. package/.claude/skills/store-pc/SKILL.md +366 -0
  106. package/.claude/skills/task-tracker/SKILL.md +307 -0
  107. package/.claude/skills/tech-decision/SKILL.md +393 -0
  108. package/.claude/skills/tenant-management/SKILL.md +603 -0
  109. package/.claude/skills/test-development/SKILL.md +755 -0
  110. package/.claude/skills/ui-pc/SKILL.md +438 -0
  111. package/.claude/skills/utils-toolkit/SKILL.md +615 -0
  112. package/.claude/skills/websocket-sse/SKILL.md +716 -0
  113. package/.claude/skills/workflow-engine/SKILL.md +676 -0
  114. package/.claude/templates//345/276/205/345/212/236/346/270/205/345/215/225/346/250/241/346/235/277.md +56 -0
  115. package/.claude/templates//351/234/200/346/261/202/346/226/207/346/241/243/346/250/241/346/235/277.md +85 -0
  116. package/.claude/templates//351/241/271/347/233/256/347/212/266/346/200/201/346/250/241/346/235/277.md +43 -0
  117. package/.codex/skills/add-skill/SKILL.md +352 -0
  118. package/.codex/skills/add-todo/SKILL.md +269 -0
  119. package/.codex/skills/api-development/SKILL.md +693 -0
  120. package/.codex/skills/architecture-design/SKILL.md +628 -0
  121. package/.codex/skills/backend-annotations/SKILL.md +664 -0
  122. package/.codex/skills/banana-image/CHANGELOG.md +37 -0
  123. package/.codex/skills/banana-image/README.md +146 -0
  124. package/.codex/skills/banana-image/SKILL.md +164 -0
  125. package/.codex/skills/banana-image/assets/logo.png +0 -0
  126. package/.codex/skills/banana-image/references/advanced-usage.md +189 -0
  127. package/.codex/skills/banana-image/scripts/apply_template.py +125 -0
  128. package/.codex/skills/banana-image/scripts/banana_image_exec.ts +412 -0
  129. package/.codex/skills/banana-image/scripts/batch_prep.py +82 -0
  130. package/.codex/skills/banana-image/scripts/package-lock.json +1437 -0
  131. package/.codex/skills/banana-image/scripts/package.json +18 -0
  132. package/.codex/skills/banana-image/scripts/requirements.txt +10 -0
  133. package/.codex/skills/banana-image/templates/poster.json +22 -0
  134. package/.codex/skills/banana-image/templates/product.json +17 -0
  135. package/.codex/skills/banana-image/templates/social.json +22 -0
  136. package/.codex/skills/banana-image/templates/thumbnail.json +17 -0
  137. package/.codex/skills/brainstorm/SKILL.md +648 -0
  138. package/.codex/skills/bug-detective/SKILL.md +1206 -0
  139. package/.codex/skills/check/SKILL.md +367 -0
  140. package/.codex/skills/code-patterns/SKILL.md +442 -0
  141. package/.codex/skills/collaborating-with-codex/SKILL.md +174 -0
  142. package/.codex/skills/collaborating-with-codex/scripts/codex_bridge.py +275 -0
  143. package/.codex/skills/collaborating-with-gemini/SKILL.md +194 -0
  144. package/.codex/skills/collaborating-with-gemini/scripts/gemini_bridge.py +275 -0
  145. package/.codex/skills/crud/SKILL.md +265 -0
  146. package/.codex/skills/crud-development/SKILL.md +637 -0
  147. package/.codex/skills/data-permission/SKILL.md +591 -0
  148. package/.codex/skills/database-ops/SKILL.md +553 -0
  149. package/.codex/skills/dev/SKILL.md +187 -0
  150. package/.codex/skills/error-handler/SKILL.md +361 -0
  151. package/.codex/skills/file-oss-management/SKILL.md +863 -0
  152. package/.codex/skills/git-workflow/SKILL.md +375 -0
  153. package/.codex/skills/init-docs/SKILL.md +194 -0
  154. package/.codex/skills/json-serialization/SKILL.md +357 -0
  155. package/.codex/skills/leniu-api-development/SKILL.md +803 -0
  156. package/.codex/skills/leniu-architecture-design/SKILL.md +594 -0
  157. package/.codex/skills/leniu-backend-annotations/SKILL.md +662 -0
  158. package/.codex/skills/leniu-code-patterns/SKILL.md +365 -0
  159. package/.codex/skills/leniu-crud-development/SKILL.md +1110 -0
  160. package/.codex/skills/leniu-data-permission/SKILL.md +256 -0
  161. package/.codex/skills/leniu-database-ops/SKILL.md +426 -0
  162. package/.codex/skills/leniu-error-handler/SKILL.md +462 -0
  163. package/.codex/skills/leniu-java-amount-handling/SKILL.md +461 -0
  164. package/.codex/skills/leniu-java-code-style/SKILL.md +510 -0
  165. package/.codex/skills/leniu-java-concurrent/SKILL.md +400 -0
  166. package/.codex/skills/leniu-java-entity/SKILL.md +751 -0
  167. package/.codex/skills/leniu-java-export/SKILL.md +560 -0
  168. package/.codex/skills/leniu-java-logging/SKILL.md +832 -0
  169. package/.codex/skills/leniu-java-mq/SKILL.md +338 -0
  170. package/.codex/skills/leniu-java-mybatis/SKILL.md +640 -0
  171. package/.codex/skills/leniu-java-report-query-param/SKILL.md +291 -0
  172. package/.codex/skills/leniu-java-task/SKILL.md +367 -0
  173. package/.codex/skills/leniu-java-total-line/SKILL.md +195 -0
  174. package/.codex/skills/leniu-marketing-price-rule-customizer/SKILL.md +301 -0
  175. package/.codex/skills/leniu-marketing-recharge-rule-customizer/SKILL.md +285 -0
  176. package/.codex/skills/leniu-mealtime/SKILL.md +215 -0
  177. package/.codex/skills/leniu-redis-cache/SKILL.md +316 -0
  178. package/.codex/skills/leniu-security-guard/SKILL.md +520 -0
  179. package/.codex/skills/leniu-utils-toolkit/SKILL.md +378 -0
  180. package/.codex/skills/next/SKILL.md +137 -0
  181. package/.codex/skills/openspec-apply-change/SKILL.md +156 -0
  182. package/.codex/skills/openspec-archive-change/SKILL.md +114 -0
  183. package/.codex/skills/openspec-bulk-archive-change/SKILL.md +246 -0
  184. package/.codex/skills/openspec-continue-change/SKILL.md +118 -0
  185. package/.codex/skills/openspec-explore/SKILL.md +290 -0
  186. package/.codex/skills/openspec-ff-change/SKILL.md +101 -0
  187. package/.codex/skills/openspec-new-change/SKILL.md +74 -0
  188. package/.codex/skills/openspec-onboard/SKILL.md +529 -0
  189. package/.codex/skills/openspec-sync-specs/SKILL.md +138 -0
  190. package/.codex/skills/openspec-verify-change/SKILL.md +168 -0
  191. package/.codex/skills/performance-doctor/SKILL.md +627 -0
  192. package/.codex/skills/progress/SKILL.md +193 -0
  193. package/.codex/skills/project-navigator/SKILL.md +286 -0
  194. package/.codex/skills/redis-cache/SKILL.md +829 -0
  195. package/.codex/skills/scheduled-jobs/SKILL.md +633 -0
  196. package/.codex/skills/security-guard/SKILL.md +739 -0
  197. package/.codex/skills/sms-mail/SKILL.md +766 -0
  198. package/.codex/skills/social-login/SKILL.md +668 -0
  199. package/.codex/skills/start/SKILL.md +154 -0
  200. package/.codex/skills/store-pc/SKILL.md +491 -0
  201. package/.codex/skills/sync/SKILL.md +149 -0
  202. package/.codex/skills/task-tracker/SKILL.md +307 -0
  203. package/.codex/skills/tech-decision/SKILL.md +393 -0
  204. package/.codex/skills/tenant-management/SKILL.md +603 -0
  205. package/.codex/skills/test-development/SKILL.md +755 -0
  206. package/.codex/skills/ui-pc/SKILL.md +475 -0
  207. package/.codex/skills/update-status/SKILL.md +159 -0
  208. package/.codex/skills/utils-toolkit/SKILL.md +593 -0
  209. package/.codex/skills/websocket-sse/SKILL.md +716 -0
  210. package/.codex/skills/workflow-engine/SKILL.md +676 -0
  211. package/.cursor/agents/code-reviewer.md +139 -0
  212. package/.cursor/agents/project-manager.md +159 -0
  213. package/.cursor/commands/opsx-apply.md +152 -0
  214. package/.cursor/commands/opsx-archive.md +157 -0
  215. package/.cursor/commands/opsx-bulk-archive.md +242 -0
  216. package/.cursor/commands/opsx-continue.md +114 -0
  217. package/.cursor/commands/opsx-explore.md +174 -0
  218. package/.cursor/commands/opsx-ff.md +94 -0
  219. package/.cursor/commands/opsx-new.md +69 -0
  220. package/.cursor/commands/opsx-onboard.md +525 -0
  221. package/.cursor/commands/opsx-sync.md +134 -0
  222. package/.cursor/commands/opsx-verify.md +164 -0
  223. package/.cursor/mcp.json +22 -0
  224. package/.cursor/skills/add-skill/SKILL.md +352 -0
  225. package/.cursor/skills/api-development/SKILL.md +560 -0
  226. package/.cursor/skills/architecture-design/SKILL.md +756 -0
  227. package/.cursor/skills/backend-annotations/SKILL.md +674 -0
  228. package/.cursor/skills/banana-image/CHANGELOG.md +37 -0
  229. package/.cursor/skills/banana-image/README.md +146 -0
  230. package/.cursor/skills/banana-image/SKILL.md +164 -0
  231. package/.cursor/skills/banana-image/assets/logo.png +0 -0
  232. package/.cursor/skills/banana-image/references/advanced-usage.md +189 -0
  233. package/.cursor/skills/banana-image/scripts/apply_template.py +125 -0
  234. package/.cursor/skills/banana-image/scripts/banana_image_exec.ts +412 -0
  235. package/.cursor/skills/banana-image/scripts/batch_prep.py +82 -0
  236. package/.cursor/skills/banana-image/scripts/package-lock.json +1437 -0
  237. package/.cursor/skills/banana-image/scripts/package.json +18 -0
  238. package/.cursor/skills/banana-image/scripts/requirements.txt +10 -0
  239. package/.cursor/skills/banana-image/templates/poster.json +22 -0
  240. package/.cursor/skills/banana-image/templates/product.json +17 -0
  241. package/.cursor/skills/banana-image/templates/social.json +22 -0
  242. package/.cursor/skills/banana-image/templates/thumbnail.json +17 -0
  243. package/.cursor/skills/brainstorm/SKILL.md +648 -0
  244. package/.cursor/skills/bug-detective/SKILL.md +1206 -0
  245. package/.cursor/skills/code-patterns/SKILL.md +590 -0
  246. package/.cursor/skills/collaborating-with-codex/SKILL.md +174 -0
  247. package/.cursor/skills/collaborating-with-codex/scripts/codex_bridge.py +275 -0
  248. package/.cursor/skills/collaborating-with-gemini/SKILL.md +194 -0
  249. package/.cursor/skills/collaborating-with-gemini/scripts/gemini_bridge.py +275 -0
  250. package/.cursor/skills/crud-development/SKILL.md +649 -0
  251. package/.cursor/skills/data-permission/SKILL.md +599 -0
  252. package/.cursor/skills/database-ops/SKILL.md +407 -0
  253. package/.cursor/skills/error-handler/SKILL.md +371 -0
  254. package/.cursor/skills/file-oss-management/SKILL.md +863 -0
  255. package/.cursor/skills/git-workflow/SKILL.md +375 -0
  256. package/.cursor/skills/json-serialization/SKILL.md +357 -0
  257. package/.cursor/skills/leniu-api-development/SKILL.md +803 -0
  258. package/.cursor/skills/leniu-architecture-design/SKILL.md +598 -0
  259. package/.cursor/skills/leniu-backend-annotations/SKILL.md +664 -0
  260. package/.cursor/skills/leniu-code-patterns/SKILL.md +365 -0
  261. package/.cursor/skills/leniu-crud-development/SKILL.md +1110 -0
  262. package/.cursor/skills/leniu-data-permission/SKILL.md +256 -0
  263. package/.cursor/skills/leniu-database-ops/SKILL.md +426 -0
  264. package/.cursor/skills/leniu-error-handler/SKILL.md +462 -0
  265. package/.cursor/skills/leniu-java-amount-handling/SKILL.md +461 -0
  266. package/.cursor/skills/leniu-java-code-style/SKILL.md +510 -0
  267. package/.cursor/skills/leniu-java-concurrent/SKILL.md +400 -0
  268. package/.cursor/skills/leniu-java-entity/SKILL.md +751 -0
  269. package/.cursor/skills/leniu-java-export/SKILL.md +560 -0
  270. package/.cursor/skills/leniu-java-logging/SKILL.md +832 -0
  271. package/.cursor/skills/leniu-java-mq/SKILL.md +338 -0
  272. package/.cursor/skills/leniu-java-mybatis/SKILL.md +640 -0
  273. package/.cursor/skills/leniu-java-report-query-param/SKILL.md +291 -0
  274. package/.cursor/skills/leniu-java-task/SKILL.md +367 -0
  275. package/.cursor/skills/leniu-java-total-line/SKILL.md +195 -0
  276. package/.cursor/skills/leniu-marketing-price-rule-customizer/SKILL.md +301 -0
  277. package/.cursor/skills/leniu-marketing-recharge-rule-customizer/SKILL.md +285 -0
  278. package/.cursor/skills/leniu-mealtime/SKILL.md +215 -0
  279. package/.cursor/skills/leniu-redis-cache/SKILL.md +316 -0
  280. package/.cursor/skills/leniu-security-guard/SKILL.md +520 -0
  281. package/.cursor/skills/leniu-utils-toolkit/SKILL.md +380 -0
  282. package/.cursor/skills/openspec-apply-change/SKILL.md +156 -0
  283. package/.cursor/skills/openspec-archive-change/SKILL.md +114 -0
  284. package/.cursor/skills/openspec-bulk-archive-change/SKILL.md +246 -0
  285. package/.cursor/skills/openspec-continue-change/SKILL.md +118 -0
  286. package/.cursor/skills/openspec-explore/SKILL.md +290 -0
  287. package/.cursor/skills/openspec-ff-change/SKILL.md +101 -0
  288. package/.cursor/skills/openspec-new-change/SKILL.md +74 -0
  289. package/.cursor/skills/openspec-onboard/SKILL.md +529 -0
  290. package/.cursor/skills/openspec-sync-specs/SKILL.md +138 -0
  291. package/.cursor/skills/openspec-verify-change/SKILL.md +168 -0
  292. package/.cursor/skills/performance-doctor/SKILL.md +627 -0
  293. package/.cursor/skills/project-navigator/SKILL.md +305 -0
  294. package/.cursor/skills/redis-cache/SKILL.md +839 -0
  295. package/.cursor/skills/scheduled-jobs/SKILL.md +633 -0
  296. package/.cursor/skills/security-guard/SKILL.md +748 -0
  297. package/.cursor/skills/sms-mail/SKILL.md +766 -0
  298. package/.cursor/skills/social-login/SKILL.md +668 -0
  299. package/.cursor/skills/store-pc/SKILL.md +366 -0
  300. package/.cursor/skills/task-tracker/SKILL.md +307 -0
  301. package/.cursor/skills/tech-decision/SKILL.md +393 -0
  302. package/.cursor/skills/tenant-management/SKILL.md +603 -0
  303. package/.cursor/skills/test-development/SKILL.md +755 -0
  304. package/.cursor/skills/ui-pc/SKILL.md +438 -0
  305. package/.cursor/skills/utils-toolkit/SKILL.md +615 -0
  306. package/.cursor/skills/websocket-sse/SKILL.md +716 -0
  307. package/.cursor/skills/workflow-engine/SKILL.md +676 -0
  308. package/AGENTS.md +669 -0
  309. package/CLAUDE.md +205 -0
  310. package/README.md +205 -0
  311. package/bin/index.js +179 -0
  312. package/init.sh +178 -0
  313. package/package.json +27 -0
@@ -0,0 +1,338 @@
1
+ ---
2
+ name: leniu-java-mq
3
+ description: |
4
+ leniu-tengyun-core / leniu-yunshitang 项目消息队列规范。当使用消息队列(MQ)时使用此skill,包括消息发送、消费和事务消息规范。
5
+
6
+ 触发场景:
7
+ - 使用消息队列发送/消费消息
8
+ - 实现延迟消息(延迟队列)
9
+ - 消息消费失败重试处理
10
+ - 事务消息(保证消息和数据库事务一致性)
11
+
12
+ 适用项目:
13
+ - leniu-tengyun-core:/Users/xujiajun/Developer/gongsi_proj/leniu-api/leniu-tengyun-core
14
+ - leniu-yunshitang:/Users/xujiajun/Developer/gongsi_proj/leniu-api/leniu-tengyun/leniu-yunshitang
15
+
16
+ 触发词:leniu-消息队列、leniu-MQ、leniu-MqUtil、leniu-@MqConsumer、leniu-延迟消息、leniu-消息重试、leniu-事务消息、net.xnzn、leniu-yunshitang
17
+ ---
18
+
19
+ # leniu-tengyun-core 消息队列规范
20
+
21
+ ## 项目特征
22
+
23
+ | 特征 | 说明 |
24
+ |------|------|
25
+ | **包名前缀** | `net.xnzn.core.*` |
26
+ | **JDK 版本** | 21 |
27
+ | **消息工具** | `MqUtil` |
28
+ | **消费者注解** | `@MQMessageListener(group, topic, tag)` |
29
+ | **消费者接口** | `implements MQListener<MqPayload<String>>` |
30
+ | **主题常量** | `LeMqConstant.Topic` |
31
+ | **延迟枚举** | `LeMqConstant.DelayDuration` |
32
+ | **JSON工具** | `JacksonUtil` |
33
+ | **异常类** | `LeException` |
34
+
35
+ ## 核心架构:三层分工
36
+
37
+ ```
38
+ MsgSend(静态工具类)→ Listener(接收消息)→ Handler(分发处理)
39
+ ```
40
+
41
+ | 层 | 职责 | 示例 |
42
+ |----|------|------|
43
+ | **XxxMessageSend** | 静态工具类,封装消息发送逻辑 | `OrderMessageSend` |
44
+ | **XxxMqListenerYyy** | 消费者,接收 MQ 消息并分发到 Handler | `OrderMqListenerAsyncSave` |
45
+ | **XxxMqHandler** | 业务处理,统一处理各类消息 | `OrderMqHandler` |
46
+
47
+ ## 消息发送
48
+
49
+ ### 三种发送方式
50
+
51
+ ```java
52
+ import net.xnzn.core.common.mq.MqUtil;
53
+ import net.xnzn.core.common.constant.LeMqConstant;
54
+ import net.xnzn.core.common.utils.JacksonUtil;
55
+
56
+ // 1. 普通消息(立即发送)
57
+ MqUtil.send(JacksonUtil.writeValueAsString(po), LeMqConstant.Topic.XXX_TOPIC);
58
+
59
+ // 2. 事务消息(在 DB 事务提交后发送,保证一致性)
60
+ MqUtil.sendByTxEnd(JacksonUtil.writeValueAsString(po), LeMqConstant.Topic.XXX_TOPIC);
61
+
62
+ // 3. 延迟消息(指定延迟时长后触发)
63
+ MqUtil.sendDelay(JacksonUtil.writeValueAsString(po), LeMqConstant.Topic.XXX_TOPIC, LeMqConstant.DelayDuration.ONE_MINUTE);
64
+ ```
65
+
66
+ **关键点**:
67
+ - 消息体必须用 `JacksonUtil.writeValueAsString()` 序列化为 **String** 再发送
68
+ - 事务消息用 `sendByTxEnd()`(如 DB 事务回滚则不发送)
69
+ - 延迟时间用 `LeMqConstant.DelayDuration` 枚举(不用 `Duration.ofMinutes()`)
70
+
71
+ ### DelayDuration 枚举(常用值)
72
+
73
+ ```java
74
+ LeMqConstant.DelayDuration.ONE_MINUTE // 1分钟
75
+ LeMqConstant.DelayDuration.THIRTY_MINUTES // 30分钟
76
+ // 其他枚举值参见 LeMqConstant.DelayDuration
77
+ ```
78
+
79
+ ### 消息发送类(静态工具类模式)
80
+
81
+ ```java
82
+ /**
83
+ * 订单消息发送
84
+ * 关键特征:
85
+ * 1. 不是 @Component,是纯静态工具类
86
+ * 2. 私有构造器
87
+ * 3. PO 中包含 traceId 和 tenantId(用于跨线程追踪)
88
+ */
89
+ @Slf4j
90
+ public class XxxMessageSend {
91
+
92
+ private XxxMessageSend() {} // 禁止实例化
93
+
94
+ private static final String MQ_ERROR_LOG = "发送MQ消息失败";
95
+
96
+ /**
97
+ * 普通消息(适用于非事务性发送)
98
+ */
99
+ public static void sendXxxEvent(XxxPO po) {
100
+ log.info("[XxxMQ]发送xxx事件");
101
+ po.setTraceId(LogUtil.getCurrentTraceId());
102
+ po.setTenantId(TenantContextHolder.getTenantId());
103
+ MqUtil.send(JacksonUtil.writeValueAsString(po), LeMqConstant.Topic.XXX_TOPIC);
104
+ }
105
+
106
+ /**
107
+ * 事务消息(在 @Transactional 方法中使用,事务提交后才发送)
108
+ */
109
+ public static void sendXxxEventByTx(XxxPO po) {
110
+ log.info("[XxxMQ]发送xxx事务消息");
111
+ po.setTraceId(LogUtil.getCurrentTraceId());
112
+ po.setTenantId(TenantContextHolder.getTenantId());
113
+ try {
114
+ MqUtil.sendByTxEnd(JacksonUtil.writeValueAsString(po), LeMqConstant.Topic.XXX_TOPIC);
115
+ } catch (Exception e) {
116
+ log.error(MQ_ERROR_LOG, e);
117
+ }
118
+ }
119
+
120
+ /**
121
+ * 延迟消息(超时取消等场景)
122
+ */
123
+ public static void sendXxxDelay(XxxPO po, LeMqConstant.DelayDuration delayDuration) {
124
+ log.info("[XxxMQ]发送xxx延迟消息");
125
+ po.setTraceId(LogUtil.getCurrentTraceId());
126
+ po.setTenantId(TenantContextHolder.getTenantId());
127
+ MqUtil.sendDelay(JacksonUtil.writeValueAsString(po), LeMqConstant.Topic.XXX_TOPIC, delayDuration);
128
+ }
129
+ }
130
+ ```
131
+
132
+ ### PO 消息体规范
133
+
134
+ ```java
135
+ import lombok.Data;
136
+
137
+ /**
138
+ * MQ 消息 PO(Message Payload Object)
139
+ * 必须包含 traceId 和 tenantId 字段
140
+ */
141
+ @Data
142
+ public class XxxPO {
143
+
144
+ /** 链路追踪ID */
145
+ private String traceId;
146
+
147
+ /** 租户ID */
148
+ private String tenantId;
149
+
150
+ /** 业务字段 */
151
+ private Long orderId;
152
+ private String outTradeNo;
153
+ // 其他字段...
154
+ }
155
+ ```
156
+
157
+ ## 消息消费
158
+
159
+ ### Listener 类(真实代码模式)
160
+
161
+ ```java
162
+ import lombok.extern.slf4j.Slf4j;
163
+ import net.xnzn.core.common.mq.MqPayload;
164
+ import net.xnzn.framework.mq.MQListener;
165
+ import net.xnzn.framework.mq.MQMessageListener;
166
+ import org.springframework.beans.factory.annotation.Autowired;
167
+ import org.springframework.context.annotation.Lazy;
168
+
169
+ /**
170
+ * MQ 消费者 Listener
171
+ * @see LeMqConstant.Topic#XXX_TOPIC
172
+ */
173
+ @Slf4j
174
+ @MQMessageListener(
175
+ group = "module-xxx-topic-name", // 消费组,格式:模块名-topic-tag
176
+ topic = "xxx", // Topic 名称
177
+ tag = "xxx-topic-name" // Tag 名称(对应 LeMqConstant.Topic)
178
+ )
179
+ public class XxxMqListenerYyy implements MQListener<MqPayload<String>> {
180
+
181
+ @Autowired
182
+ @Lazy // ⚠️ 必须 @Lazy,避免循环依赖
183
+ private XxxMqHandler xxxMqHandler;
184
+
185
+ @Override
186
+ public void onMessage(MqPayload<String> payload) {
187
+ // 委托给 Handler 处理,使用方法引用
188
+ xxxMqHandler.handleMessage(payload, XxxPO.class, XxxMqHandler::handleXxx);
189
+ }
190
+ }
191
+ ```
192
+
193
+ ### Handler 类(统一处理消息)
194
+
195
+ ```java
196
+ import cn.hutool.core.text.CharSequenceUtil;
197
+ import com.pig4cloud.pigx.common.core.exception.LeException;
198
+ import lombok.extern.slf4j.Slf4j;
199
+ import net.xnzn.core.common.export.util.I18nUtil;
200
+ import net.xnzn.core.common.mq.MqPayload;
201
+ import net.xnzn.core.common.utils.JacksonUtil;
202
+ import net.xnzn.framework.data.tenant.TenantContextHolder;
203
+ import org.springframework.beans.factory.annotation.Autowired;
204
+ import org.springframework.context.annotation.Lazy;
205
+ import org.springframework.stereotype.Service;
206
+
207
+ import java.util.function.BiConsumer;
208
+
209
+ @Slf4j
210
+ @Service
211
+ public class XxxMqHandler {
212
+
213
+ @Lazy
214
+ @Autowired
215
+ private XxxService xxxService;
216
+
217
+ /**
218
+ * 统一处理调用(核心模板方法)
219
+ * 负责:反序列化、设置租户上下文、异常兜底
220
+ */
221
+ public <T> void handleMessage(MqPayload<String> payload, Class<T> clz, BiConsumer<XxxMqHandler, T> handleFunc) {
222
+ I18nUtil.loadDefaultLocale();
223
+ try {
224
+ log.info("[Xxx消息]收到消息 {}", payload);
225
+ T payloadData = JacksonUtil.readValue(payload.getData(), clz);
226
+ if (payloadData != null) {
227
+ TenantContextHolder.setTenantId(payload.getTenantId()); // 设置租户上下文
228
+ handleFunc.accept(this, payloadData);
229
+ } else {
230
+ log.error("[Xxx消息]解析失败");
231
+ }
232
+ } catch (Exception e) {
233
+ log.error("[Xxx消息]处理异常", e);
234
+ }
235
+ }
236
+
237
+ /**
238
+ * 处理 xxx 事件
239
+ */
240
+ public void handleXxx(XxxPO payload) {
241
+ try {
242
+ log.info("[Xxx事件]MQ消费:开始");
243
+ xxxService.processXxx(payload);
244
+ log.info("[Xxx事件]MQ消费:消息消费完成");
245
+ } catch (Exception e) {
246
+ log.error("[Xxx事件]MQ消费:处理异常", e);
247
+ }
248
+ }
249
+ }
250
+ ```
251
+
252
+ ## 常见场景
253
+
254
+ ### 场景1:事务消息(下单后通知)
255
+
256
+ ```java
257
+ @Transactional(rollbackFor = Exception.class)
258
+ public void createOrder(OrderParam param) {
259
+ // 1. 保存订单
260
+ OrderInfo order = OrderInfo.newDefaultInstance();
261
+ order.setCanteenId(param.getCanteenId());
262
+ orderMapper.insert(order);
263
+
264
+ // 2. 事务提交后发送消息(保证一致性)
265
+ OrderPlacedPO po = new OrderPlacedPO();
266
+ po.setOrderInfo(order);
267
+ OrderMessageSend.sendOrderPlacedByTx(po); // 内部使用 sendByTxEnd
268
+
269
+ log.info("订单创建成功,orderId:{}", order.getId());
270
+ }
271
+ ```
272
+
273
+ ### 场景2:延迟消息(订单超时取消)
274
+
275
+ ```java
276
+ public static LocalDateTime sendOrderTimeout(String macOrderId, LeMqConstant.DelayDuration delayDuration) {
277
+ log.info("[订单MQv3]发送未支付订单异步支付超时通知");
278
+ OrderCancelPO po = new OrderCancelPO();
279
+ po.setMacOrderId(macOrderId);
280
+ po.setTenantId(TenantContextHolder.getTenantId());
281
+ po.setTraceId(LogUtil.getCurrentTraceId());
282
+
283
+ // 延迟发送
284
+ MqUtil.sendDelay(JacksonUtil.writeValueAsString(po), LeMqConstant.Topic.ORDER_V3_ASYNC_TIMEOUT, delayDuration);
285
+
286
+ // 返回预计触发时间
287
+ return LocalDateTime.now().plusSeconds(delayDuration.getMilliseconds() / 1000);
288
+ }
289
+ ```
290
+
291
+ ### 场景3:带 Redisson 分布式锁的 MQ 消费
292
+
293
+ ```java
294
+ public void orderAsyncSave(OrderSavePO payload) {
295
+ // 消费时加分布式锁(防止并发处理同一订单)
296
+ RLock lock = RedisUtil.getLock(OrderCacheConstants.orderCacheSaveLockKey(payload.getMacOrderId()));
297
+ lock.lock();
298
+ try {
299
+ log.info("[订单异步保存]MQ消费:开始");
300
+ doSaveOrder(payload);
301
+ log.info("[订单异步保存]MQ消费:消息消费完成");
302
+ } catch (Exception e) {
303
+ log.error("[订单异步保存]MQ消费:处理异常", e);
304
+ } finally {
305
+ // 安全释放锁
306
+ try {
307
+ if (lock.isHeldByCurrentThread() && lock.isLocked()) {
308
+ lock.unlock();
309
+ }
310
+ } catch (Exception e) {
311
+ log.error("解锁异常", e);
312
+ }
313
+ }
314
+ }
315
+ ```
316
+
317
+ ## 日志规范
318
+
319
+ ```java
320
+ // 发送端日志格式
321
+ log.info("[模块MQv3]发送xxx事件");
322
+
323
+ // 消费端日志格式
324
+ log.info("[xxx事件]MQ消费:开始");
325
+ log.info("[xxx事件]MQ消费:消息消费完成");
326
+ log.error("[xxx事件]MQ消费:处理异常", e);
327
+ ```
328
+
329
+ ## 常见错误
330
+
331
+ | 错误写法 | 正确写法 | 说明 |
332
+ |---------|---------|------|
333
+ | `MqUtil.send(dto, topic)` 直接传对象 | `MqUtil.send(JacksonUtil.writeValueAsString(dto), topic)` | 必须先序列化为 String |
334
+ | `@MqConsumer(topic = ...)` | `@MQMessageListener(group, topic, tag)` + `implements MQListener<MqPayload<String>>` | 实际框架注解不同 |
335
+ | `Duration.ofMinutes(30)` | `LeMqConstant.DelayDuration.THIRTY_MINUTES` | 延迟枚举不是 Duration |
336
+ | 忘记在 PO 中设置 `traceId`/`tenantId` | `po.setTraceId(LogUtil.getCurrentTraceId())` | 多租户追踪必须设置 |
337
+ | 消费方法直接 `@Autowired` 服务 | `@Autowired @Lazy` | 避免循环依赖 |
338
+ | 在 MQ 发送类上加 `@Component` | 纯静态工具类(私有构造器,不注入 Spring) | 发送类是静态工具 |