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,371 @@
1
+ ---
2
+ name: error-handler
3
+ description: |
4
+ 后端异常处理规范。包含 ServiceException 用法、全局异常处理器、参数校验、日志规范、错误码设计。
5
+
6
+ 触发场景:
7
+ - 抛出业务异常(ServiceException)
8
+ - 全局异常处理器配置
9
+ - 参数校验异常处理
10
+ - 日志记录规范
11
+ - 错误码设计与国际化
12
+ - 事务异常处理
13
+
14
+ 触发词:异常、ServiceException、throw、错误处理、全局异常、@Validated、参数校验、日志、log、错误码、事务、@Transactional、try-catch、异常捕获
15
+
16
+ 注意:
17
+ - 如果是安全相关(认证授权、数据脱敏),请使用 security-guard。
18
+ - 如果是数据权限(@DataPermission),请使用 data-permission。
19
+ ---
20
+
21
+ # 后端异常处理指南
22
+
23
+ > 本项目是纯后端项目,本文档专注于 Java 后端异常处理规范。
24
+
25
+ ---
26
+
27
+ ## 快速索引
28
+
29
+ | 场景 | 推荐方式 |
30
+ |------|---------|
31
+ | 业务异常 | `throw new ServiceException("msg")` |
32
+ | 带参数异常 | `throw new ServiceException("用户 {} 不存在", userId)` |
33
+ | 带错误码 | `throw new ServiceException("msg", 200101)` |
34
+ | 参数校验 | `@Validated(AddGroup.class)` |
35
+ | 日志记录 | `log.error("msg: {}", e.getMessage(), e)` |
36
+
37
+ ---
38
+
39
+ ## 1. 业务异常 - ServiceException
40
+
41
+ ### 基本用法
42
+
43
+ ```java
44
+ import org.dromara.common.core.exception.ServiceException;
45
+
46
+ // ✅ 基本用法:抛出业务异常
47
+ throw new ServiceException("用户不存在");
48
+
49
+ // ✅ 带占位符(支持 {} 占位符,使用 Hutool StrFormatter)
50
+ throw new ServiceException("用户 {} 不存在", userId);
51
+ throw new ServiceException("订单 {} 状态 {} 无法支付", orderId, status);
52
+
53
+ // ✅ 带错误码(第二个参数是 Integer code)
54
+ throw new ServiceException("用户不存在", 200101);
55
+
56
+ // ✅ 条件抛出(手动检查)
57
+ if (ObjectUtil.isNull(user)) {
58
+ throw new ServiceException("用户不存在");
59
+ }
60
+
61
+ // ✅ 参数校验
62
+ if (StringUtils.isBlank(bo.getName())) {
63
+ throw new ServiceException("名称不能为空");
64
+ }
65
+ ```
66
+
67
+ ### ServiceException 完整 API
68
+
69
+ > **🔴 重要**:ServiceException **没有静态工厂方法**(如 `of()`)和条件检查方法(如 `throwIf()`, `notNull()`),必须使用 `new` 关键字创建异常对象。
70
+
71
+ | 构造函数 | 说明 | 示例 |
72
+ |---------|------|------|
73
+ | `new ServiceException(String message)` | 只有错误消息 | `new ServiceException("操作失败")` |
74
+ | `new ServiceException(String message, Object... args)` | 带占位符参数 | `new ServiceException("用户{}不存在", userId)` |
75
+ | `new ServiceException(String message, Integer code)` | 带错误码 | `new ServiceException("用户不存在", 200101)` |
76
+
77
+ **链式调用方法**:
78
+ - `setMessage(String message)`: 设置错误消息
79
+ - `setDetailMessage(String detailMessage)`: 设置详细错误(用于内部调试)
80
+
81
+ **源码位置**: `ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/exception/ServiceException.java`
82
+
83
+ ---
84
+
85
+ ## 2. 全局异常处理器
86
+
87
+ 框架已提供全局异常处理器,自动捕获并处理各类异常。
88
+
89
+ **位置**: `ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/handler/GlobalExceptionHandler.java`
90
+
91
+ ### 异常处理映射
92
+
93
+ > **注意**:所有异常的 HTTP 响应状态码均为 200,错误码通过 `R.code` 字段返回。
94
+
95
+ | 异常类型 | 处理方式 | R.code |
96
+ |---------|---------|--------|
97
+ | `ServiceException` | 返回业务错误信息 | 自定义 code 或 500 |
98
+ | `BindException` | 返回参数绑定错误 | 500 |
99
+ | `ConstraintViolationException` | 返回参数校验错误 | 500 |
100
+ | `MethodArgumentNotValidException` | 返回参数校验错误 | 500 |
101
+ | `HandlerMethodValidationException` | 返回 @Validated 校验错误 | 500 |
102
+ | `HttpRequestMethodNotSupportedException` | 请求方式不支持 | 405 |
103
+ | `NoHandlerFoundException` | 路由不存在 | 404 |
104
+ | `JsonParseException` | JSON 解析失败 | 400 |
105
+ | `HttpMessageNotReadableException` | 请求参数格式错误 | 400 |
106
+ | `ExpressionException` | SpEL 表达式解析失败 | 500 |
107
+ | `RuntimeException` / `Exception` | 系统错误 | 500 |
108
+
109
+ ---
110
+
111
+ ## 3. 参数校验
112
+
113
+ ### 使用 @Validated 自动校验
114
+
115
+ ```java
116
+ import org.dromara.common.core.validate.AddGroup;
117
+ import org.dromara.common.core.validate.EditGroup;
118
+
119
+ // Controller 层校验
120
+ @PostMapping
121
+ public R<Long> add(@Validated(AddGroup.class) @RequestBody XxxBo bo) {
122
+ // 参数校验失败会自动抛出异常
123
+ // 全局异常处理器会自动捕获并返回错误信息
124
+ return R.ok(xxxService.insert(bo));
125
+ }
126
+
127
+ @PutMapping
128
+ public R<Void> edit(@Validated(EditGroup.class) @RequestBody XxxBo bo) {
129
+ return toAjax(xxxService.update(bo));
130
+ }
131
+ ```
132
+
133
+ ### BO 类校验注解
134
+
135
+ ```java
136
+ public class XxxBo extends BaseEntity {
137
+
138
+ @NotNull(message = "ID不能为空", groups = { EditGroup.class })
139
+ private Long id;
140
+
141
+ @NotBlank(message = "名称不能为空", groups = { AddGroup.class, EditGroup.class })
142
+ @Size(max = 100, message = "名称长度不能超过100个字符")
143
+ private String name;
144
+
145
+ @Email(message = "邮箱格式不正确")
146
+ private String email;
147
+
148
+ @Pattern(regexp = "^1[3-9]\\d{9}$", message = "手机号格式不正确")
149
+ private String phone;
150
+
151
+ @Min(value = 0, message = "数量不能小于0")
152
+ @Max(value = 9999, message = "数量不能大于9999")
153
+ private Integer count;
154
+ }
155
+ ```
156
+
157
+ ### 手动校验(Service 层)
158
+
159
+ ```java
160
+ import org.dromara.common.core.utils.ValidatorUtils;
161
+
162
+ // 手动触发校验
163
+ ValidatorUtils.validate(bo, AddGroup.class);
164
+ ValidatorUtils.validate(bo, EditGroup.class);
165
+ ```
166
+
167
+ ---
168
+
169
+ ## 4. 日志规范
170
+
171
+ ### 日志级别
172
+
173
+ | 级别 | 使用场景 | 示例 |
174
+ |------|---------|------|
175
+ | ERROR | 系统错误、业务异常 | 数据库连接失败、第三方接口超时 |
176
+ | WARN | 警告信息、潜在问题 | 缓存未命中、重试操作 |
177
+ | INFO | 重要业务流程、操作记录 | 用户登录、订单创建 |
178
+ | DEBUG | 开发调试信息 | 方法入参、中间变量 |
179
+ | TRACE | 详细追踪信息 | 循环内部数据 |
180
+
181
+ ### 日志最佳实践
182
+
183
+ ```java
184
+ import lombok.extern.slf4j.Slf4j;
185
+
186
+ @Slf4j
187
+ @Service
188
+ public class XxxServiceImpl implements IXxxService {
189
+
190
+ // ✅ 好的:使用占位符(性能更好)
191
+ log.info("处理订单: {}, 状态: {}", orderId, status);
192
+
193
+ // ❌ 不好:字符串拼接(每次都会拼接,即使日志级别不输出)
194
+ log.info("处理订单: " + orderId + ", 状态: " + status);
195
+
196
+ // ✅ 好的:异常日志带堆栈(第三个参数传异常对象)
197
+ log.error("处理失败: {}", e.getMessage(), e);
198
+
199
+ // ❌ 不好:只记录消息,丢失堆栈
200
+ log.error("处理失败: {}", e.getMessage());
201
+
202
+ // ✅ 好的:判断日志级别(避免不必要的序列化开销)
203
+ if (log.isDebugEnabled()) {
204
+ log.debug("详细数据: {}", JsonUtils.toJsonString(data));
205
+ }
206
+
207
+ // ✅ 好的:敏感信息脱敏
208
+ log.info("用户登录,手机: {}", DesensitizedUtil.mobilePhone(phone));
209
+
210
+ // ❌ 不好:记录敏感信息
211
+ log.info("用户登录,手机: {}", phone);
212
+ }
213
+ ```
214
+
215
+ ### Service 层日志示例
216
+
217
+ ```java
218
+ @Slf4j
219
+ @RequiredArgsConstructor
220
+ @Service
221
+ public class SysUserServiceImpl implements ISysUserService {
222
+
223
+ private final SysUserMapper baseMapper;
224
+
225
+ @Override
226
+ @Transactional(rollbackFor = Exception.class)
227
+ public Long insertUser(SysUserBo bo) {
228
+ log.info("开始新增用户,用户名: {}", bo.getUserName());
229
+
230
+ // 1. 业务校验
231
+ SysUser existUser = baseMapper.selectUserByUserName(bo.getUserName());
232
+ if (ObjectUtil.isNotNull(existUser)) {
233
+ throw new ServiceException("用户名 {} 已存在", bo.getUserName());
234
+ }
235
+
236
+ // 2. 执行插入
237
+ SysUser user = MapstructUtils.convert(bo, SysUser.class);
238
+ baseMapper.insert(user);
239
+
240
+ log.info("新增用户成功,用户ID: {}, 用户名: {}", user.getUserId(), user.getUserName());
241
+ return user.getUserId();
242
+ }
243
+
244
+ @Override
245
+ public SysUserVo selectUserById(Long userId) {
246
+ SysUser user = baseMapper.selectById(userId);
247
+ if (ObjectUtil.isNull(user)) {
248
+ throw new ServiceException("用户 {} 不存在", userId);
249
+ }
250
+ return MapstructUtils.convert(user, SysUserVo.class);
251
+ }
252
+ }
253
+ ```
254
+
255
+ ---
256
+
257
+ ## 5. 错误码设计
258
+
259
+ ### 错误码规范
260
+
261
+ ```java
262
+ // 格式: 模块(2位) + 类型(2位) + 序号(2位)
263
+ // 模块: 10-系统, 20-用户, 30-订单, 40-商品
264
+ // 类型: 01-参数错误, 02-业务错误, 03-权限错误, 04-系统错误
265
+
266
+ public class ErrorCode {
267
+ // 通用错误
268
+ public static final int SUCCESS = 200;
269
+ public static final int ERROR = 500;
270
+ public static final int UNAUTHORIZED = 401;
271
+ public static final int FORBIDDEN = 403;
272
+
273
+ // 用户模块 20xxxx
274
+ public static final int USER_NOT_FOUND = 200201; // 用户不存在
275
+ public static final int USER_PASSWORD_ERROR = 200202; // 密码错误
276
+ public static final int USER_DISABLED = 200203; // 用户已禁用
277
+
278
+ // 订单模块 30xxxx
279
+ public static final int ORDER_NOT_FOUND = 300201; // 订单不存在
280
+ public static final int ORDER_STATUS_ERROR = 300202; // 订单状态错误
281
+ }
282
+
283
+ // 使用示例
284
+ throw new ServiceException("用户不存在", ErrorCode.USER_NOT_FOUND);
285
+ ```
286
+
287
+ ### 错误消息国际化
288
+
289
+ ```java
290
+ import org.dromara.common.core.utils.MessageUtils;
291
+
292
+ // 使用 MessageUtils.message() 获取国际化消息
293
+ throw new ServiceException(MessageUtils.message("user.not.exists"));
294
+
295
+ // 带参数的国际化消息
296
+ throw new ServiceException(MessageUtils.message("user.password.retry.limit.exceed", maxRetryCount));
297
+ ```
298
+
299
+ ---
300
+
301
+ ## 6. 用户友好提示
302
+
303
+ ### 错误提示规范
304
+
305
+ ```java
306
+ // ✅ 好的:用户友好提示
307
+ throw new ServiceException("订单已发货,无法取消");
308
+ throw new ServiceException("库存不足,请减少购买数量");
309
+ throw new ServiceException("验证码已过期,请重新获取");
310
+ throw new ServiceException("该用户名已被注册,请换一个试试");
311
+
312
+ // ❌ 不好:技术术语
313
+ throw new ServiceException("order.status.invalid");
314
+ throw new ServiceException("NullPointerException at line 123");
315
+ throw new ServiceException("数据库连接失败");
316
+ throw new ServiceException("Duplicate entry for key 'uk_username'");
317
+ ```
318
+
319
+ ---
320
+
321
+ ## 7. 事务异常处理
322
+
323
+ ```java
324
+ @Transactional(rollbackFor = Exception.class) // 所有异常都回滚
325
+ public void batchOperation() {
326
+ // 业务逻辑
327
+ }
328
+
329
+ // ✅ 好的:指定回滚异常类型
330
+ @Transactional(rollbackFor = Exception.class)
331
+
332
+ // ❌ 不好:使用默认(只回滚 RuntimeException)
333
+ @Transactional
334
+ ```
335
+
336
+ ---
337
+
338
+ ## 错误处理检查清单
339
+
340
+ - [ ] 业务异常使用 `new ServiceException()`(不是 `ServiceException.of()`)
341
+ - [ ] 条件检查使用 `if + ObjectUtil.isNull()` 判断
342
+ - [ ] 参数校验使用 `@Validated(XxxGroup.class)`
343
+ - [ ] 事务方法添加 `@Transactional(rollbackFor = Exception.class)`
344
+ - [ ] 日志记录异常堆栈:`log.error("msg: {}", e.getMessage(), e)`
345
+ - [ ] 日志使用占位符 `{}`,不使用字符串拼接
346
+ - [ ] 敏感信息脱敏后再记录日志
347
+ - [ ] 重要操作记录 INFO 日志
348
+ - [ ] 错误提示使用用户友好语言
349
+
350
+ ---
351
+
352
+ ## 快速对照表
353
+
354
+ | ❌ 错误写法 | ✅ 正确写法 |
355
+ |-----------|-----------|
356
+ | `throw ServiceException.of("msg")` | `throw new ServiceException("msg")` |
357
+ | `ServiceException.throwIf(cond, "msg")` | `if (cond) { throw new ServiceException("msg"); }` |
358
+ | `ServiceException.notNull(obj, "msg")` | `if (ObjectUtil.isNull(obj)) { throw new ServiceException("msg"); }` |
359
+ | `log.error("失败: " + e.getMessage())` | `log.error("失败: {}", e.getMessage(), e)` |
360
+ | `@Transactional` | `@Transactional(rollbackFor = Exception.class)` |
361
+ | `throw new ServiceException("DB error")` | `throw new ServiceException("数据保存失败,请重试")` |
362
+
363
+ ---
364
+
365
+ ## 相关技能
366
+
367
+ | 需要了解 | 激活 Skill |
368
+ |---------|-----------|
369
+ | Java 异常规范 | `java-exception` |
370
+ | Service 层规范 | `java-service` |
371
+ | Controller 层规范 | `java-controller` |