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,400 @@
1
+ ---
2
+ name: leniu-java-concurrent
3
+ description: |
4
+ leniu-tengyun-core / leniu-yunshitang 项目并发处理规范。当编写并发代码时使用此skill,包括线程安全、异步处理、分布式锁规范。
5
+
6
+ 触发场景:
7
+ - 使用CompletableFuture进行异步处理
8
+ - 配置和使用线程池(ThreadPoolExecutor)
9
+ - 处理并发安全问题(Redis分布式锁、数据库唯一索引)
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
+ 触发词:并发、CompletableFuture、线程池、ThreadPool、并发安全、锁、synchronized、volatile、原子类、异步处理、leniu并发、leniu-yunshitang并发、net.xnzn并发
17
+ ---
18
+
19
+ # leniu-tengyun-core 并发处理规范
20
+
21
+ ## 项目特征
22
+
23
+ | 特征 | 说明 |
24
+ |------|------|
25
+ | 包名 | `net.xnzn.*` |
26
+ | 异常类 | `LeException`(禁止使用 ServiceException) |
27
+ | 工具类 | Hutool(CollUtil、StrUtil 等) |
28
+ | 分布式锁 | `RedisUtil.getLock()` / `RedisUtil.setNx()` |
29
+ | JDK | 21(支持虚拟线程,推荐使用标准线程池) |
30
+
31
+ ## 并行查询
32
+
33
+ ### 使用CompletableFuture
34
+
35
+ ```java
36
+ // 并行查询多个数据源
37
+ public XxxVO getData(Long id) {
38
+ // 创建异步任务
39
+ CompletableFuture<TypeA> futureA = CompletableFuture
40
+ .supplyAsync(() -> mapperA.selectById(id));
41
+
42
+ CompletableFuture<TypeB> futureB = CompletableFuture
43
+ .supplyAsync(() -> mapperB.selectById(id));
44
+
45
+ CompletableFuture<TypeC> futureC = CompletableFuture
46
+ .supplyAsync(() -> mapperC.selectById(id));
47
+
48
+ // 等待所有任务完成
49
+ CompletableFuture.allOf(futureA, futureB, futureC).join();
50
+
51
+ // 获取结果
52
+ TypeA resultA = futureA.join();
53
+ TypeB resultB = futureB.join();
54
+ TypeC resultC = futureC.join();
55
+
56
+ // 组装结果(使用 BeanUtil.copyProperties)
57
+ XxxVO vo = new XxxVO();
58
+ BeanUtil.copyProperties(resultA, vo);
59
+ vo.setDataB(resultB);
60
+ vo.setDataC(resultC);
61
+
62
+ return vo;
63
+ }
64
+ ```
65
+
66
+ ### 指定线程池
67
+
68
+ ```java
69
+ @Autowired
70
+ private Executor asyncTaskExecutor;
71
+
72
+ public XxxVO getData(Long id) {
73
+ // 使用指定的线程池
74
+ CompletableFuture<TypeA> futureA = CompletableFuture
75
+ .supplyAsync(() -> mapperA.selectById(id), asyncTaskExecutor);
76
+
77
+ CompletableFuture<TypeB> futureB = CompletableFuture
78
+ .supplyAsync(() -> mapperB.selectById(id), asyncTaskExecutor);
79
+
80
+ // 等待并获取结果
81
+ CompletableFuture.allOf(futureA, futureB).join();
82
+
83
+ TypeA resultA = futureA.join();
84
+ TypeB resultB = futureB.join();
85
+
86
+ return buildVO(resultA, resultB);
87
+ }
88
+ ```
89
+
90
+ ### 报表模块专用线程池(yunshitangTaskExecutor)
91
+
92
+ 云食堂报表模块使用专项线程池,通过 `@Resource(name=...)` 按名称注入:
93
+
94
+ ```java
95
+ @Service
96
+ @Slf4j
97
+ public class ReportSumXxxService {
98
+
99
+ // ✅ 按名称注入报表专用线程池
100
+ @Resource(name = "yunshitangTaskExecutor")
101
+ private AsyncTaskExecutor asyncTaskExecutor;
102
+
103
+ // ✅ 报表查询标准三并发模式:COUNT + LIST + TOTAL
104
+ public ReportBaseTotalVO<XxxVO> pageSummary(XxxParam param) {
105
+ // 1. 获取认证信息和数据权限
106
+ MgrUserAuthPO authPO = mgrAuthApi.getUserAuthPO();
107
+ ReportDataPermissionParam dataPermission =
108
+ reportDataPermissionService.getDataPermission(authPO);
109
+
110
+ // 2. 三并发:count、list、total 同时执行
111
+ CompletableFuture<Long> countFuture = CompletableFuture.supplyAsync(
112
+ () -> reportMapper.listSummary_COUNT(param, authPO, dataPermission),
113
+ asyncTaskExecutor
114
+ );
115
+ CompletableFuture<List<XxxVO>> listFuture = CompletableFuture.supplyAsync(() -> {
116
+ PageMethod.startPage(param.getPage());
117
+ return reportMapper.listSummary(param, authPO, dataPermission);
118
+ }, asyncTaskExecutor);
119
+ CompletableFuture<XxxVO> totalFuture = CompletableFuture.supplyAsync(
120
+ () -> reportMapper.getSummaryTotal(param, authPO, dataPermission),
121
+ asyncTaskExecutor
122
+ );
123
+
124
+ // 3. 等待所有任务完成
125
+ CompletableFuture.allOf(countFuture, listFuture, totalFuture).join();
126
+
127
+ // 4. 组装结果
128
+ PageVO<XxxVO> pageVO = PageVO.of(listFuture.join());
129
+ return new ReportBaseTotalVO<XxxVO>()
130
+ .setResultPage(pageVO)
131
+ .setTotalLine(totalFuture.join());
132
+ }
133
+ }
134
+ ```
135
+
136
+ **注意**:
137
+ - `listSummary_COUNT` 为 Mapper 中专门的 COUNT 方法(命名规范:`listXxx_COUNT`)
138
+ - `PageMethod.startPage()` 必须在 LIST Future 内部调用(同线程)
139
+ - COUNT Future 使用 Mapper 的 COUNT 方法,不走 PageHelper
140
+ - TOTAL Future 查询合计行,只返回数值字段
141
+
142
+ ## 异步执行
143
+
144
+ ### 不等待结果
145
+
146
+ ```java
147
+ // 异步执行,不等待结果
148
+ CompletableFuture.runAsync(() -> {
149
+ // 异步操作
150
+ logService.saveLog(log);
151
+ }, asyncTaskExecutor);
152
+
153
+ // 主线程继续执行
154
+ return result;
155
+ ```
156
+
157
+ ### 异步执行并处理异常
158
+
159
+ ```java
160
+ CompletableFuture.runAsync(() -> {
161
+ try {
162
+ // 异步操作
163
+ notificationService.send(message);
164
+ } catch (Exception e) {
165
+ log.error("异步发送通知失败", e);
166
+ }
167
+ }, asyncTaskExecutor);
168
+ ```
169
+
170
+ ## 线程池配置
171
+
172
+ ### 自定义线程池
173
+
174
+ ```java
175
+ @Configuration
176
+ public class ThreadPoolConfig {
177
+
178
+ @Bean("asyncTaskExecutor")
179
+ public Executor asyncTaskExecutor() {
180
+ ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
181
+ // 核心线程数
182
+ executor.setCorePoolSize(10);
183
+ // 最大线程数
184
+ executor.setMaxPoolSize(20);
185
+ // 队列容量
186
+ executor.setQueueCapacity(200);
187
+ // 线程名称前缀
188
+ executor.setThreadNamePrefix("async-task-");
189
+ // 拒绝策略
190
+ executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
191
+ // 等待所有任务完成后关闭线程池
192
+ executor.setWaitForTasksToCompleteOnShutdown(true);
193
+ // 等待时间
194
+ executor.setAwaitTerminationSeconds(60);
195
+ executor.initialize();
196
+ return executor;
197
+ }
198
+ }
199
+ ```
200
+
201
+ ## 并发安全
202
+
203
+ ### 使用分布式锁(Redisson)
204
+
205
+ ```java
206
+ public void processOrder(Long orderId) {
207
+ String lockKey = "order:process:" + orderId;
208
+
209
+ // 获取Redisson分布式锁
210
+ RLock lock = RedisUtil.getLock(lockKey);
211
+ if (!lock.tryLock()) {
212
+ throw new LeException("订单正在处理中,请稍后重试");
213
+ }
214
+
215
+ try {
216
+ // 业务处理
217
+ doProcess(orderId);
218
+ } finally {
219
+ // 安全释放锁
220
+ if (lock.isHeldByCurrentThread() && lock.isLocked()) {
221
+ lock.unlock();
222
+ }
223
+ }
224
+ }
225
+ ```
226
+
227
+ ### 使用Redis setNx 轻量锁
228
+
229
+ ```java
230
+ public void processOnce(Long tenantId) {
231
+ String key = "task:process:" + tenantId;
232
+ // setNx:设置成功才继续执行,防重入
233
+ boolean ifFirst = RedisUtil.setNx(key, "1", 6);
234
+ if (!ifFirst) {
235
+ throw new LeException("任务正在执行中");
236
+ }
237
+
238
+ try {
239
+ doBusiness();
240
+ } finally {
241
+ RedisUtil.del(key);
242
+ }
243
+ }
244
+ ```
245
+
246
+ ### 使用数据库唯一索引
247
+
248
+ ```java
249
+ @Transactional(rollbackFor = Exception.class)
250
+ public void createOrder(OrderParam param) {
251
+ try {
252
+ // 插入订单(依赖唯一索引防止重复)
253
+ Order order = buildOrder(param);
254
+ orderMapper.insert(order);
255
+ } catch (DuplicateKeyException e) {
256
+ throw new LeException("订单已存在");
257
+ }
258
+ }
259
+ ```
260
+
261
+ ## 常见场景
262
+
263
+ ### 场景1:并行查询多个接口
264
+
265
+ ```java
266
+ public DashboardVO getDashboard(Long userId) {
267
+ // 并行查询多个数据
268
+ CompletableFuture<OrderSummary> orderFuture = CompletableFuture
269
+ .supplyAsync(() -> orderService.getSummary(userId), asyncTaskExecutor);
270
+
271
+ CompletableFuture<PaymentSummary> paymentFuture = CompletableFuture
272
+ .supplyAsync(() -> paymentService.getSummary(userId), asyncTaskExecutor);
273
+
274
+ CompletableFuture<InventorySummary> inventoryFuture = CompletableFuture
275
+ .supplyAsync(() -> inventoryService.getSummary(userId), asyncTaskExecutor);
276
+
277
+ // 等待所有查询完成
278
+ CompletableFuture.allOf(orderFuture, paymentFuture, inventoryFuture).join();
279
+
280
+ // 组装结果
281
+ DashboardVO dashboard = new DashboardVO();
282
+ dashboard.setOrderSummary(orderFuture.join());
283
+ dashboard.setPaymentSummary(paymentFuture.join());
284
+ dashboard.setInventorySummary(inventoryFuture.join());
285
+
286
+ return dashboard;
287
+ }
288
+ ```
289
+
290
+ ### 场景2:批量并行处理
291
+
292
+ ```java
293
+ public void batchProcess(List<Long> ids) {
294
+ // 分批处理,每批100个(使用 Hutool CollUtil)
295
+ int batchSize = 100;
296
+ List<List<Long>> batches = CollUtil.split(ids, batchSize);
297
+
298
+ // 并行处理每批数据
299
+ List<CompletableFuture<Void>> futures = batches.stream()
300
+ .map(batch -> CompletableFuture.runAsync(() -> {
301
+ processBatch(batch);
302
+ }, asyncTaskExecutor))
303
+ .collect(Collectors.toList());
304
+
305
+ // 等待所有批次完成
306
+ CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).join();
307
+
308
+ log.info("批量处理完成,总数:{}", ids.size());
309
+ }
310
+
311
+ private void processBatch(List<Long> batch) {
312
+ for (Long id : batch) {
313
+ try {
314
+ processOne(id);
315
+ } catch (Exception e) {
316
+ log.error("处理失败,id:{}", id, e);
317
+ }
318
+ }
319
+ }
320
+ ```
321
+
322
+ ### 场景3:异步通知(不影响主流程)
323
+
324
+ ```java
325
+ @Transactional(rollbackFor = Exception.class)
326
+ public void createOrder(OrderParam param) {
327
+ // 创建订单
328
+ Order order = buildOrder(param);
329
+ orderMapper.insert(order);
330
+
331
+ // 异步发送通知(不影响主流程)
332
+ CompletableFuture.runAsync(() -> {
333
+ try {
334
+ // 发送短信
335
+ smsService.sendOrderCreated(order);
336
+ // 发送邮件
337
+ emailService.sendOrderCreated(order);
338
+ } catch (Exception e) {
339
+ log.error("发送通知失败,orderId:{}", order.getId(), e);
340
+ }
341
+ }, asyncTaskExecutor);
342
+
343
+ log.info("订单创建成功,orderId:{}", order.getId());
344
+ }
345
+ ```
346
+
347
+ ## 最佳实践
348
+
349
+ ### 1. 指定线程池
350
+
351
+ ```java
352
+ // ✅ 推荐:使用自定义线程池
353
+ CompletableFuture.supplyAsync(() -> doSomething(), asyncTaskExecutor);
354
+
355
+ // ❌ 避免:使用默认ForkJoinPool(可能影响其他业务)
356
+ CompletableFuture.supplyAsync(() -> doSomething());
357
+ ```
358
+
359
+ ### 2. 异常处理
360
+
361
+ ```java
362
+ CompletableFuture<Result> future = CompletableFuture
363
+ .supplyAsync(() -> {
364
+ try {
365
+ return doSomething();
366
+ } catch (Exception e) {
367
+ log.error("异步任务执行失败", e);
368
+ throw new CompletionException(e);
369
+ }
370
+ }, asyncTaskExecutor);
371
+
372
+ // 处理异常(leniu 项目使用 LeException)
373
+ try {
374
+ Result result = future.join();
375
+ } catch (CompletionException e) {
376
+ log.error("获取异步结果失败", e);
377
+ throw new LeException("处理失败");
378
+ }
379
+ ```
380
+
381
+ ### 3. 超时控制
382
+
383
+ ```java
384
+ try {
385
+ // 设置超时时间
386
+ Result result = future.get(5, TimeUnit.SECONDS);
387
+ } catch (TimeoutException e) {
388
+ log.error("异步任务超时", e);
389
+ throw new LeException("处理超时");
390
+ }
391
+ ```
392
+
393
+ ## 常见错误
394
+
395
+ | 错误写法 | 正确写法 | 说明 |
396
+ |---------|---------|------|
397
+ | `throw new ServiceException("msg")` | `throw new LeException("msg")` | leniu 项目异常类不同 |
398
+ | `Lists.partition(ids, batchSize)` | `CollUtil.split(ids, batchSize)` | 使用 Hutool 工具类 |
399
+ | `MapstructUtils.convert(a, B.class)` | `BeanUtil.copyProperties(a, b)` | leniu 使用 Hutool 转换 |
400
+ | `import org.dromara.*` | `import net.xnzn.*` | 包名不同 |