leniu-dev 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (670) hide show
  1. package/.claude/agents/auto-test-generator.md +315 -0
  2. package/.claude/agents/bug-analyzer.md +103 -0
  3. package/.claude/agents/code-reviewer.md +122 -0
  4. package/.claude/agents/code-scanner.md +145 -0
  5. package/.claude/agents/image-reader.md +154 -0
  6. package/.claude/agents/loki-runner.md +80 -0
  7. package/.claude/agents/mysql-runner.md +81 -0
  8. package/.claude/agents/project-manager.md +159 -0
  9. package/.claude/agents/requirements-analyzer.md +175 -0
  10. package/.claude/agents/task-fetcher.md +75 -0
  11. package/.claude/audio/completed.wav +0 -0
  12. package/.claude/commands/add-todo.md +255 -0
  13. package/.claude/commands/auto-test.md +252 -0
  14. package/.claude/commands/check.md +210 -0
  15. package/.claude/commands/crud.md +454 -0
  16. package/.claude/commands/dev.md +532 -0
  17. package/.claude/commands/init-config.md +154 -0
  18. package/.claude/commands/init-docs.md +681 -0
  19. package/.claude/commands/next.md +281 -0
  20. package/.claude/commands/opsx-apply.md +147 -0
  21. package/.claude/commands/opsx-archive.md +105 -0
  22. package/.claude/commands/opsx-bulk-archive.md +237 -0
  23. package/.claude/commands/opsx-continue.md +109 -0
  24. package/.claude/commands/opsx-explore.md +281 -0
  25. package/.claude/commands/opsx-ff.md +92 -0
  26. package/.claude/commands/opsx-new.md +65 -0
  27. package/.claude/commands/opsx-onboard.md +397 -0
  28. package/.claude/commands/opsx-sync.md +129 -0
  29. package/.claude/commands/opsx-verify.md +159 -0
  30. package/.claude/commands/progress.md +264 -0
  31. package/.claude/commands/release.md +109 -0
  32. package/.claude/commands/start.md +199 -0
  33. package/.claude/commands/sync.md +307 -0
  34. package/.claude/commands/update-status.md +428 -0
  35. package/.claude/docs/Mixin/344/275/277/347/224/250/346/214/207/345/215/227.md +299 -0
  36. package/.claude/docs/README.md +167 -0
  37. package/.claude/docs//345/211/215/347/253/257/345/274/200/345/217/221/346/214/207/345/215/227.md +599 -0
  38. package/.claude/docs//345/220/216/347/253/257/345/274/200/345/217/221/346/214/207/345/215/227.md +726 -0
  39. 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
  40. 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
  41. 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
  42. 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
  43. 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
  44. package/.claude/docs//346/241/206/346/236/266/350/257/264/346/230/216.md +393 -0
  45. package/.claude/docs//350/267/257/347/224/261/351/205/215/347/275/256/346/214/207/345/215/227.md +246 -0
  46. package/.claude/framework-config.json +73 -0
  47. package/.claude/hooks/lib/notify.js +310 -0
  48. package/.claude/hooks/pre-tool-use.js +117 -0
  49. package/.claude/hooks/skill-forced-eval.js +161 -0
  50. package/.claude/hooks/stop.js +55 -0
  51. package/.claude/notify-config.json +9 -0
  52. package/.claude/settings.json +57 -0
  53. package/.claude/skills/add-skill/SKILL.md +488 -0
  54. package/.claude/skills/analyze-requirements/SKILL.md +112 -0
  55. package/.claude/skills/api-development/SKILL.md +315 -0
  56. package/.claude/skills/architecture-design/SKILL.md +152 -0
  57. package/.claude/skills/auto-test/SKILL.md +625 -0
  58. package/.claude/skills/auto-test/references/api-conventions.md +260 -0
  59. package/.claude/skills/backend-annotations/SKILL.md +248 -0
  60. package/.claude/skills/banana-image/CHANGELOG.md +37 -0
  61. package/.claude/skills/banana-image/README.md +146 -0
  62. package/.claude/skills/banana-image/SKILL.md +171 -0
  63. package/.claude/skills/banana-image/assets/logo.png +0 -0
  64. package/.claude/skills/banana-image/references/advanced-usage.md +189 -0
  65. package/.claude/skills/banana-image/scripts/apply_template.py +125 -0
  66. package/.claude/skills/banana-image/scripts/banana_image_exec.ts +412 -0
  67. package/.claude/skills/banana-image/scripts/batch_prep.py +82 -0
  68. package/.claude/skills/banana-image/scripts/package-lock.json +1437 -0
  69. package/.claude/skills/banana-image/scripts/package.json +18 -0
  70. package/.claude/skills/banana-image/scripts/requirements.txt +10 -0
  71. package/.claude/skills/banana-image/templates/poster.json +22 -0
  72. package/.claude/skills/banana-image/templates/product.json +17 -0
  73. package/.claude/skills/banana-image/templates/social.json +22 -0
  74. package/.claude/skills/banana-image/templates/thumbnail.json +17 -0
  75. package/.claude/skills/brainstorm/SKILL.md +216 -0
  76. package/.claude/skills/bug-detective/SKILL.md +295 -0
  77. package/.claude/skills/bug-detective/references/error-patterns.md +242 -0
  78. package/.claude/skills/chrome-cdp/SKILL.md +81 -0
  79. package/.claude/skills/chrome-cdp/scripts/cdp.mjs +838 -0
  80. package/.claude/skills/chrome-cdp/scripts/run-cdp.sh +7 -0
  81. package/.claude/skills/code-patterns/SKILL.md +163 -0
  82. package/.claude/skills/code-patterns/references/leniu-code-patterns.md +87 -0
  83. package/.claude/skills/codex-code-review/SKILL.md +327 -0
  84. package/.claude/skills/collaborating-with-codex/SKILL.md +180 -0
  85. package/.claude/skills/collaborating-with-codex/scripts/codex_bridge.py +275 -0
  86. package/.claude/skills/collaborating-with-gemini/SKILL.md +194 -0
  87. package/.claude/skills/collaborating-with-gemini/scripts/gemini_bridge.py +275 -0
  88. package/.claude/skills/crud-development/SKILL.md +328 -0
  89. package/.claude/skills/data-permission/SKILL.md +221 -0
  90. package/.claude/skills/data-permission/references/custom-data-scope.md +90 -0
  91. package/.claude/skills/database-ops/SKILL.md +210 -0
  92. package/.claude/skills/error-handler/SKILL.md +310 -0
  93. package/.claude/skills/file-oss-management/SKILL.md +260 -0
  94. package/.claude/skills/file-oss-management/references/entities.md +105 -0
  95. package/.claude/skills/file-oss-management/references/service-impl.md +104 -0
  96. package/.claude/skills/fix-bug/SKILL.md +269 -0
  97. package/.claude/skills/git-workflow/SKILL.md +179 -0
  98. package/.claude/skills/jenkins-deploy/SKILL.md +134 -0
  99. package/.claude/skills/jenkins-deploy/assets/env_param.template.json +51 -0
  100. package/.claude/skills/jenkins-deploy/assets/jk_build.py +400 -0
  101. package/.claude/skills/json-serialization/SKILL.md +341 -0
  102. package/.claude/skills/lanhu-design/SKILL.md +99 -0
  103. package/.claude/skills/leniu-api-development/SKILL.md +319 -0
  104. package/.claude/skills/leniu-api-development/references/real-examples.md +273 -0
  105. package/.claude/skills/leniu-architecture-design/SKILL.md +383 -0
  106. package/.claude/skills/leniu-backend-annotations/SKILL.md +277 -0
  107. package/.claude/skills/leniu-brainstorm/SKILL.md +242 -0
  108. package/.claude/skills/leniu-brainstorm/references/business-scenarios.md +162 -0
  109. package/.claude/skills/leniu-code-patterns/SKILL.md +411 -0
  110. package/.claude/skills/leniu-crud-development/SKILL.md +404 -0
  111. package/.claude/skills/leniu-crud-development/references/templates.md +597 -0
  112. package/.claude/skills/leniu-customization-location/SKILL.md +410 -0
  113. package/.claude/skills/leniu-data-permission/SKILL.md +341 -0
  114. package/.claude/skills/leniu-database-ops/SKILL.md +426 -0
  115. package/.claude/skills/leniu-error-handler/SKILL.md +462 -0
  116. package/.claude/skills/leniu-java-concurrent/SKILL.md +400 -0
  117. package/.claude/skills/leniu-java-entity/SKILL.md +237 -0
  118. package/.claude/skills/leniu-java-entity/references/templates.md +237 -0
  119. package/.claude/skills/leniu-java-logging/SKILL.md +229 -0
  120. package/.claude/skills/leniu-java-logging/references/data-mask.md +46 -0
  121. package/.claude/skills/leniu-java-logging/references/logging-scenarios.md +113 -0
  122. package/.claude/skills/leniu-java-mq/SKILL.md +338 -0
  123. package/.claude/skills/leniu-java-mybatis/SKILL.md +267 -0
  124. package/.claude/skills/leniu-java-mybatis/references/report-mapper.md +88 -0
  125. package/.claude/skills/leniu-java-task/SKILL.md +367 -0
  126. package/.claude/skills/leniu-marketing-scenario/SKILL.md +448 -0
  127. package/.claude/skills/leniu-marketing-scenario/references/pay-meal-rules.md +197 -0
  128. package/.claude/skills/leniu-marketing-scenario/references/price-rules.md +286 -0
  129. package/.claude/skills/leniu-marketing-scenario/references/recharge-rules.md +188 -0
  130. package/.claude/skills/leniu-redis-cache/SKILL.md +331 -0
  131. package/.claude/skills/leniu-report-scenario/SKILL.md +508 -0
  132. package/.claude/skills/leniu-report-scenario/references/amount-handling.md +448 -0
  133. package/.claude/skills/leniu-report-scenario/references/analysis-module.md +64 -0
  134. package/.claude/skills/leniu-report-scenario/references/customization-table-fields.md +93 -0
  135. package/.claude/skills/leniu-report-scenario/references/customization.md +356 -0
  136. package/.claude/skills/leniu-report-scenario/references/data-permission.md +182 -0
  137. package/.claude/skills/leniu-report-scenario/references/export.md +553 -0
  138. package/.claude/skills/leniu-report-scenario/references/mealtime.md +197 -0
  139. package/.claude/skills/leniu-report-scenario/references/query-param.md +274 -0
  140. package/.claude/skills/leniu-report-scenario/references/report-tables.md +162 -0
  141. package/.claude/skills/leniu-report-scenario/references/standard-customization.md +112 -0
  142. package/.claude/skills/leniu-report-scenario/references/standard-table-fields.md +113 -0
  143. package/.claude/skills/leniu-report-scenario/references/total-line.md +179 -0
  144. package/.claude/skills/leniu-security-guard/SKILL.md +306 -0
  145. package/.claude/skills/leniu-utils-toolkit/SKILL.md +380 -0
  146. package/.claude/skills/loki-log-query/SKILL.md +430 -0
  147. package/.claude/skills/mysql-debug/SKILL.md +406 -0
  148. package/.claude/skills/performance-doctor/SKILL.md +297 -0
  149. package/.claude/skills/project-navigator/SKILL.md +211 -0
  150. package/.claude/skills/redis-cache/SKILL.md +282 -0
  151. package/.claude/skills/redis-cache/references/listeners.md +23 -0
  152. package/.claude/skills/scheduled-jobs/SKILL.md +277 -0
  153. package/.claude/skills/security-guard/SKILL.md +245 -0
  154. package/.claude/skills/security-guard/references/encrypt-config.md +103 -0
  155. package/.claude/skills/security-guard/references/sensitive-strategies.md +42 -0
  156. package/.claude/skills/sms-mail/SKILL.md +346 -0
  157. package/.claude/skills/sms-mail/references/mail-config.md +88 -0
  158. package/.claude/skills/sms-mail/references/sms-config.md +74 -0
  159. package/.claude/skills/social-login/SKILL.md +328 -0
  160. package/.claude/skills/social-login/references/provider-configs.md +118 -0
  161. package/.claude/skills/store-pc/SKILL.md +366 -0
  162. package/.claude/skills/sync-back-merge/SKILL.md +66 -0
  163. package/.claude/skills/task-tracker/SKILL.md +307 -0
  164. package/.claude/skills/tech-decision/SKILL.md +393 -0
  165. package/.claude/skills/tenant-management/SKILL.md +272 -0
  166. package/.claude/skills/tenant-management/references/tenant-scenarios.md +91 -0
  167. package/.claude/skills/test-development/SKILL.md +301 -0
  168. package/.claude/skills/test-development/references/parameterized-examples.md +119 -0
  169. package/.claude/skills/ui-pc/SKILL.md +438 -0
  170. package/.claude/skills/utils-toolkit/SKILL.md +354 -0
  171. package/.claude/skills/utils-toolkit/references/redis-utils-api.md +56 -0
  172. package/.claude/skills/websocket-sse/SKILL.md +350 -0
  173. package/.claude/skills/workflow-engine/SKILL.md +249 -0
  174. package/.claude/skills/yunxiao-task-management/SKILL.md +401 -0
  175. package/.claude/skills/yunxiao-task-management/templates//346/217/220/346/265/213/345/215/225/346/250/241/346/235/277.html +17 -0
  176. package/.claude/templates/env-config.md +27 -0
  177. package/.claude/templates//345/276/205/345/212/236/346/270/205/345/215/225/346/250/241/346/235/277.md +56 -0
  178. package/.claude/templates//351/234/200/346/261/202/346/226/207/346/241/243/346/250/241/346/235/277.md +85 -0
  179. package/.claude/templates//351/241/271/347/233/256/347/212/266/346/200/201/346/250/241/346/235/277.md +43 -0
  180. package/.codex/skills/add-skill/SKILL.md +488 -0
  181. package/.codex/skills/add-todo/SKILL.md +269 -0
  182. package/.codex/skills/analyze-requirements/SKILL.md +112 -0
  183. package/.codex/skills/api-development/SKILL.md +315 -0
  184. package/.codex/skills/architecture-design/SKILL.md +152 -0
  185. package/.codex/skills/auto-test/SKILL.md +453 -0
  186. package/.codex/skills/auto-test/references/api-conventions.md +260 -0
  187. package/.codex/skills/backend-annotations/SKILL.md +248 -0
  188. package/.codex/skills/banana-image/CHANGELOG.md +37 -0
  189. package/.codex/skills/banana-image/README.md +146 -0
  190. package/.codex/skills/banana-image/SKILL.md +171 -0
  191. package/.codex/skills/banana-image/assets/logo.png +0 -0
  192. package/.codex/skills/banana-image/references/advanced-usage.md +189 -0
  193. package/.codex/skills/banana-image/scripts/apply_template.py +125 -0
  194. package/.codex/skills/banana-image/scripts/banana_image_exec.ts +412 -0
  195. package/.codex/skills/banana-image/scripts/batch_prep.py +82 -0
  196. package/.codex/skills/banana-image/scripts/package-lock.json +1437 -0
  197. package/.codex/skills/banana-image/scripts/package.json +18 -0
  198. package/.codex/skills/banana-image/scripts/requirements.txt +10 -0
  199. package/.codex/skills/banana-image/templates/poster.json +22 -0
  200. package/.codex/skills/banana-image/templates/product.json +17 -0
  201. package/.codex/skills/banana-image/templates/social.json +22 -0
  202. package/.codex/skills/banana-image/templates/thumbnail.json +17 -0
  203. package/.codex/skills/brainstorm/SKILL.md +216 -0
  204. package/.codex/skills/bug-detective/SKILL.md +295 -0
  205. package/.codex/skills/bug-detective/references/error-patterns.md +242 -0
  206. package/.codex/skills/check/SKILL.md +367 -0
  207. package/.codex/skills/code-patterns/SKILL.md +163 -0
  208. package/.codex/skills/code-patterns/references/leniu-code-patterns.md +87 -0
  209. package/.codex/skills/collaborating-with-codex/SKILL.md +180 -0
  210. package/.codex/skills/collaborating-with-codex/scripts/codex_bridge.py +275 -0
  211. package/.codex/skills/collaborating-with-gemini/SKILL.md +194 -0
  212. package/.codex/skills/collaborating-with-gemini/scripts/gemini_bridge.py +275 -0
  213. package/.codex/skills/crud/SKILL.md +265 -0
  214. package/.codex/skills/crud-development/SKILL.md +328 -0
  215. package/.codex/skills/data-permission/SKILL.md +221 -0
  216. package/.codex/skills/data-permission/references/custom-data-scope.md +90 -0
  217. package/.codex/skills/database-ops/SKILL.md +210 -0
  218. package/.codex/skills/dev/SKILL.md +187 -0
  219. package/.codex/skills/error-handler/SKILL.md +310 -0
  220. package/.codex/skills/file-oss-management/SKILL.md +260 -0
  221. package/.codex/skills/file-oss-management/references/entities.md +105 -0
  222. package/.codex/skills/file-oss-management/references/service-impl.md +104 -0
  223. package/.codex/skills/fix-bug/SKILL.md +269 -0
  224. package/.codex/skills/git-workflow/SKILL.md +179 -0
  225. package/.codex/skills/init-docs/SKILL.md +194 -0
  226. package/.codex/skills/jenkins-deploy/SKILL.md +134 -0
  227. package/.codex/skills/json-serialization/SKILL.md +341 -0
  228. package/.codex/skills/lanhu-design/SKILL.md +99 -0
  229. package/.codex/skills/leniu-api-development/SKILL.md +319 -0
  230. package/.codex/skills/leniu-api-development/references/real-examples.md +273 -0
  231. package/.codex/skills/leniu-architecture-design/SKILL.md +383 -0
  232. package/.codex/skills/leniu-backend-annotations/SKILL.md +277 -0
  233. package/.codex/skills/leniu-brainstorm/SKILL.md +242 -0
  234. package/.codex/skills/leniu-brainstorm/references/business-scenarios.md +162 -0
  235. package/.codex/skills/leniu-code-patterns/SKILL.md +411 -0
  236. package/.codex/skills/leniu-crud-development/SKILL.md +404 -0
  237. package/.codex/skills/leniu-crud-development/references/templates.md +597 -0
  238. package/.codex/skills/leniu-customization-location/SKILL.md +410 -0
  239. package/.codex/skills/leniu-data-permission/SKILL.md +341 -0
  240. package/.codex/skills/leniu-database-ops/SKILL.md +426 -0
  241. package/.codex/skills/leniu-error-handler/SKILL.md +462 -0
  242. package/.codex/skills/leniu-java-amount-handling/SKILL.md +461 -0
  243. package/.codex/skills/leniu-java-code-style/SKILL.md +510 -0
  244. package/.codex/skills/leniu-java-concurrent/SKILL.md +400 -0
  245. package/.codex/skills/leniu-java-entity/SKILL.md +237 -0
  246. package/.codex/skills/leniu-java-entity/references/templates.md +237 -0
  247. package/.codex/skills/leniu-java-logging/SKILL.md +229 -0
  248. package/.codex/skills/leniu-java-logging/references/data-mask.md +46 -0
  249. package/.codex/skills/leniu-java-logging/references/logging-scenarios.md +113 -0
  250. package/.codex/skills/leniu-java-mq/SKILL.md +338 -0
  251. package/.codex/skills/leniu-java-mybatis/SKILL.md +267 -0
  252. package/.codex/skills/leniu-java-mybatis/references/report-mapper.md +88 -0
  253. package/.codex/skills/leniu-java-task/SKILL.md +367 -0
  254. package/.codex/skills/leniu-marketing-scenario/SKILL.md +448 -0
  255. package/.codex/skills/leniu-marketing-scenario/references/pay-meal-rules.md +197 -0
  256. package/.codex/skills/leniu-marketing-scenario/references/price-rules.md +286 -0
  257. package/.codex/skills/leniu-marketing-scenario/references/recharge-rules.md +188 -0
  258. package/.codex/skills/leniu-redis-cache/SKILL.md +331 -0
  259. package/.codex/skills/leniu-report-scenario/SKILL.md +508 -0
  260. package/.codex/skills/leniu-report-scenario/references/amount-handling.md +448 -0
  261. package/.codex/skills/leniu-report-scenario/references/analysis-module.md +64 -0
  262. package/.codex/skills/leniu-report-scenario/references/customization-table-fields.md +93 -0
  263. package/.codex/skills/leniu-report-scenario/references/customization.md +356 -0
  264. package/.codex/skills/leniu-report-scenario/references/data-permission.md +182 -0
  265. package/.codex/skills/leniu-report-scenario/references/export.md +553 -0
  266. package/.codex/skills/leniu-report-scenario/references/mealtime.md +197 -0
  267. package/.codex/skills/leniu-report-scenario/references/query-param.md +274 -0
  268. package/.codex/skills/leniu-report-scenario/references/report-tables.md +162 -0
  269. package/.codex/skills/leniu-report-scenario/references/standard-customization.md +112 -0
  270. package/.codex/skills/leniu-report-scenario/references/standard-table-fields.md +113 -0
  271. package/.codex/skills/leniu-report-scenario/references/total-line.md +179 -0
  272. package/.codex/skills/leniu-security-guard/SKILL.md +306 -0
  273. package/.codex/skills/leniu-utils-toolkit/SKILL.md +380 -0
  274. package/.codex/skills/loki-log-query/SKILL.md +430 -0
  275. package/.codex/skills/loki-log-query/environments.json +45 -0
  276. package/.codex/skills/mysql-debug/SKILL.md +406 -0
  277. package/.codex/skills/next/SKILL.md +137 -0
  278. package/.codex/skills/openspec-apply-change/SKILL.md +165 -0
  279. package/.codex/skills/openspec-archive-change/SKILL.md +122 -0
  280. package/.codex/skills/openspec-bulk-archive-change/SKILL.md +254 -0
  281. package/.codex/skills/openspec-continue-change/SKILL.md +126 -0
  282. package/.codex/skills/openspec-explore/SKILL.md +299 -0
  283. package/.codex/skills/openspec-ff-change/SKILL.md +109 -0
  284. package/.codex/skills/openspec-new-change/SKILL.md +82 -0
  285. package/.codex/skills/openspec-onboard/SKILL.md +414 -0
  286. package/.codex/skills/openspec-sync-specs/SKILL.md +146 -0
  287. package/.codex/skills/openspec-verify-change/SKILL.md +176 -0
  288. package/.codex/skills/performance-doctor/SKILL.md +297 -0
  289. package/.codex/skills/progress/SKILL.md +193 -0
  290. package/.codex/skills/project-navigator/SKILL.md +211 -0
  291. package/.codex/skills/redis-cache/SKILL.md +282 -0
  292. package/.codex/skills/redis-cache/references/listeners.md +23 -0
  293. package/.codex/skills/scheduled-jobs/SKILL.md +277 -0
  294. package/.codex/skills/security-guard/SKILL.md +245 -0
  295. package/.codex/skills/security-guard/references/encrypt-config.md +103 -0
  296. package/.codex/skills/security-guard/references/sensitive-strategies.md +42 -0
  297. package/.codex/skills/skill-creator/LICENSE.txt +202 -0
  298. package/.codex/skills/skill-creator/SKILL.md +479 -0
  299. package/.codex/skills/skill-creator/agents/analyzer.md +274 -0
  300. package/.codex/skills/skill-creator/agents/comparator.md +202 -0
  301. package/.codex/skills/skill-creator/agents/grader.md +223 -0
  302. package/.codex/skills/skill-creator/assets/eval_review.html +146 -0
  303. package/.codex/skills/skill-creator/eval-viewer/generate_review.py +471 -0
  304. package/.codex/skills/skill-creator/eval-viewer/viewer.html +1325 -0
  305. package/.codex/skills/skill-creator/references/schemas.md +430 -0
  306. package/.codex/skills/skill-creator/scripts/__init__.py +0 -0
  307. package/.codex/skills/skill-creator/scripts/aggregate_benchmark.py +401 -0
  308. package/.codex/skills/skill-creator/scripts/generate_report.py +326 -0
  309. package/.codex/skills/skill-creator/scripts/improve_description.py +248 -0
  310. package/.codex/skills/skill-creator/scripts/package_skill.py +136 -0
  311. package/.codex/skills/skill-creator/scripts/quick_validate.py +103 -0
  312. package/.codex/skills/skill-creator/scripts/run_eval.py +310 -0
  313. package/.codex/skills/skill-creator/scripts/run_loop.py +332 -0
  314. package/.codex/skills/skill-creator/scripts/utils.py +47 -0
  315. package/.codex/skills/sms-mail/SKILL.md +346 -0
  316. package/.codex/skills/sms-mail/references/mail-config.md +88 -0
  317. package/.codex/skills/sms-mail/references/sms-config.md +74 -0
  318. package/.codex/skills/social-login/SKILL.md +328 -0
  319. package/.codex/skills/social-login/references/provider-configs.md +118 -0
  320. package/.codex/skills/start/SKILL.md +154 -0
  321. package/.codex/skills/store-pc/SKILL.md +366 -0
  322. package/.codex/skills/sync/SKILL.md +149 -0
  323. package/.codex/skills/sync-back-merge/SKILL.md +66 -0
  324. package/.codex/skills/task-tracker/SKILL.md +307 -0
  325. package/.codex/skills/tech-decision/SKILL.md +393 -0
  326. package/.codex/skills/tenant-management/SKILL.md +272 -0
  327. package/.codex/skills/tenant-management/references/tenant-scenarios.md +91 -0
  328. package/.codex/skills/test-development/SKILL.md +301 -0
  329. package/.codex/skills/test-development/references/parameterized-examples.md +119 -0
  330. package/.codex/skills/ui-pc/SKILL.md +438 -0
  331. package/.codex/skills/update-status/SKILL.md +159 -0
  332. package/.codex/skills/utils-toolkit/SKILL.md +354 -0
  333. package/.codex/skills/utils-toolkit/references/redis-utils-api.md +56 -0
  334. package/.codex/skills/websocket-sse/SKILL.md +350 -0
  335. package/.codex/skills/workflow-engine/SKILL.md +249 -0
  336. package/.codex/skills/yunxiao-task-management/SKILL.md +401 -0
  337. package/.codex/skills/yunxiao-task-management/templates//346/217/220/346/265/213/345/215/225/346/250/241/346/235/277.html +17 -0
  338. package/.cursor/agents/bug-analyzer.md +102 -0
  339. package/.cursor/agents/code-reviewer.md +122 -0
  340. package/.cursor/agents/code-scanner.md +145 -0
  341. package/.cursor/agents/image-reader.md +154 -0
  342. package/.cursor/agents/loki-runner.md +80 -0
  343. package/.cursor/agents/mysql-runner.md +81 -0
  344. package/.cursor/agents/project-manager.md +159 -0
  345. package/.cursor/agents/requirements-analyzer.md +141 -0
  346. package/.cursor/agents/task-fetcher.md +75 -0
  347. package/.cursor/audio/completed.wav +0 -0
  348. package/.cursor/commands/opsx-apply.md +152 -0
  349. package/.cursor/commands/opsx-archive.md +157 -0
  350. package/.cursor/commands/opsx-bulk-archive.md +242 -0
  351. package/.cursor/commands/opsx-continue.md +114 -0
  352. package/.cursor/commands/opsx-explore.md +174 -0
  353. package/.cursor/commands/opsx-ff.md +94 -0
  354. package/.cursor/commands/opsx-new.md +69 -0
  355. package/.cursor/commands/opsx-onboard.md +525 -0
  356. package/.cursor/commands/opsx-sync.md +134 -0
  357. package/.cursor/commands/opsx-verify.md +164 -0
  358. package/.cursor/hooks/cursor-pre-tool-use.js +122 -0
  359. package/.cursor/hooks/cursor-skill-eval.js +466 -0
  360. package/.cursor/hooks/lib/notify.js +310 -0
  361. package/.cursor/hooks/stop.js +55 -0
  362. package/.cursor/hooks.json +23 -0
  363. package/.cursor/mcp.json +22 -0
  364. package/.cursor/rules/skill-activation.mdc +99 -0
  365. package/.cursor/skills/add-skill/SKILL.md +488 -0
  366. package/.cursor/skills/analyze-requirements/SKILL.md +112 -0
  367. package/.cursor/skills/api-development/SKILL.md +315 -0
  368. package/.cursor/skills/architecture-design/SKILL.md +152 -0
  369. package/.cursor/skills/auto-test/SKILL.md +453 -0
  370. package/.cursor/skills/auto-test/references/api-conventions.md +260 -0
  371. package/.cursor/skills/backend-annotations/SKILL.md +248 -0
  372. package/.cursor/skills/banana-image/CHANGELOG.md +37 -0
  373. package/.cursor/skills/banana-image/README.md +146 -0
  374. package/.cursor/skills/banana-image/SKILL.md +171 -0
  375. package/.cursor/skills/banana-image/assets/logo.png +0 -0
  376. package/.cursor/skills/banana-image/references/advanced-usage.md +189 -0
  377. package/.cursor/skills/banana-image/scripts/apply_template.py +125 -0
  378. package/.cursor/skills/banana-image/scripts/banana_image_exec.ts +412 -0
  379. package/.cursor/skills/banana-image/scripts/batch_prep.py +82 -0
  380. package/.cursor/skills/banana-image/scripts/package-lock.json +1437 -0
  381. package/.cursor/skills/banana-image/scripts/package.json +18 -0
  382. package/.cursor/skills/banana-image/scripts/requirements.txt +10 -0
  383. package/.cursor/skills/banana-image/templates/poster.json +22 -0
  384. package/.cursor/skills/banana-image/templates/product.json +17 -0
  385. package/.cursor/skills/banana-image/templates/social.json +22 -0
  386. package/.cursor/skills/banana-image/templates/thumbnail.json +17 -0
  387. package/.cursor/skills/brainstorm/SKILL.md +216 -0
  388. package/.cursor/skills/bug-detective/SKILL.md +295 -0
  389. package/.cursor/skills/bug-detective/references/error-patterns.md +242 -0
  390. package/.cursor/skills/code-patterns/SKILL.md +163 -0
  391. package/.cursor/skills/code-patterns/references/leniu-code-patterns.md +87 -0
  392. package/.cursor/skills/collaborating-with-codex/SKILL.md +180 -0
  393. package/.cursor/skills/collaborating-with-codex/scripts/codex_bridge.py +275 -0
  394. package/.cursor/skills/collaborating-with-gemini/SKILL.md +194 -0
  395. package/.cursor/skills/collaborating-with-gemini/scripts/gemini_bridge.py +275 -0
  396. package/.cursor/skills/crud-development/SKILL.md +328 -0
  397. package/.cursor/skills/data-permission/SKILL.md +221 -0
  398. package/.cursor/skills/data-permission/references/custom-data-scope.md +90 -0
  399. package/.cursor/skills/database-ops/SKILL.md +210 -0
  400. package/.cursor/skills/error-handler/SKILL.md +310 -0
  401. package/.cursor/skills/file-oss-management/SKILL.md +260 -0
  402. package/.cursor/skills/file-oss-management/references/entities.md +105 -0
  403. package/.cursor/skills/file-oss-management/references/service-impl.md +104 -0
  404. package/.cursor/skills/fix-bug/SKILL.md +269 -0
  405. package/.cursor/skills/git-workflow/SKILL.md +179 -0
  406. package/.cursor/skills/jenkins-deploy/SKILL.md +134 -0
  407. package/.cursor/skills/json-serialization/SKILL.md +341 -0
  408. package/.cursor/skills/lanhu-design/SKILL.md +99 -0
  409. package/.cursor/skills/leniu-api-development/SKILL.md +319 -0
  410. package/.cursor/skills/leniu-api-development/references/real-examples.md +273 -0
  411. package/.cursor/skills/leniu-architecture-design/SKILL.md +383 -0
  412. package/.cursor/skills/leniu-backend-annotations/SKILL.md +277 -0
  413. package/.cursor/skills/leniu-brainstorm/SKILL.md +242 -0
  414. package/.cursor/skills/leniu-brainstorm/references/business-scenarios.md +162 -0
  415. package/.cursor/skills/leniu-code-patterns/SKILL.md +411 -0
  416. package/.cursor/skills/leniu-crud-development/SKILL.md +404 -0
  417. package/.cursor/skills/leniu-crud-development/references/templates.md +597 -0
  418. package/.cursor/skills/leniu-customization-location/SKILL.md +410 -0
  419. package/.cursor/skills/leniu-data-permission/SKILL.md +341 -0
  420. package/.cursor/skills/leniu-database-ops/SKILL.md +426 -0
  421. package/.cursor/skills/leniu-error-handler/SKILL.md +462 -0
  422. package/.cursor/skills/leniu-java-amount-handling/SKILL.md +461 -0
  423. package/.cursor/skills/leniu-java-code-style/SKILL.md +510 -0
  424. package/.cursor/skills/leniu-java-concurrent/SKILL.md +400 -0
  425. package/.cursor/skills/leniu-java-entity/SKILL.md +237 -0
  426. package/.cursor/skills/leniu-java-entity/references/templates.md +237 -0
  427. package/.cursor/skills/leniu-java-logging/SKILL.md +229 -0
  428. package/.cursor/skills/leniu-java-logging/references/data-mask.md +46 -0
  429. package/.cursor/skills/leniu-java-logging/references/logging-scenarios.md +113 -0
  430. package/.cursor/skills/leniu-java-mq/SKILL.md +338 -0
  431. package/.cursor/skills/leniu-java-mybatis/SKILL.md +267 -0
  432. package/.cursor/skills/leniu-java-mybatis/references/report-mapper.md +88 -0
  433. package/.cursor/skills/leniu-java-task/SKILL.md +367 -0
  434. package/.cursor/skills/leniu-marketing-scenario/SKILL.md +448 -0
  435. package/.cursor/skills/leniu-marketing-scenario/references/pay-meal-rules.md +197 -0
  436. package/.cursor/skills/leniu-marketing-scenario/references/price-rules.md +286 -0
  437. package/.cursor/skills/leniu-marketing-scenario/references/recharge-rules.md +188 -0
  438. package/.cursor/skills/leniu-redis-cache/SKILL.md +331 -0
  439. package/.cursor/skills/leniu-report-scenario/SKILL.md +508 -0
  440. package/.cursor/skills/leniu-report-scenario/references/amount-handling.md +448 -0
  441. package/.cursor/skills/leniu-report-scenario/references/analysis-module.md +64 -0
  442. package/.cursor/skills/leniu-report-scenario/references/customization-table-fields.md +93 -0
  443. package/.cursor/skills/leniu-report-scenario/references/customization.md +356 -0
  444. package/.cursor/skills/leniu-report-scenario/references/data-permission.md +182 -0
  445. package/.cursor/skills/leniu-report-scenario/references/export.md +553 -0
  446. package/.cursor/skills/leniu-report-scenario/references/mealtime.md +197 -0
  447. package/.cursor/skills/leniu-report-scenario/references/query-param.md +274 -0
  448. package/.cursor/skills/leniu-report-scenario/references/report-tables.md +162 -0
  449. package/.cursor/skills/leniu-report-scenario/references/standard-customization.md +112 -0
  450. package/.cursor/skills/leniu-report-scenario/references/standard-table-fields.md +113 -0
  451. package/.cursor/skills/leniu-report-scenario/references/total-line.md +179 -0
  452. package/.cursor/skills/leniu-security-guard/SKILL.md +306 -0
  453. package/.cursor/skills/leniu-utils-toolkit/SKILL.md +380 -0
  454. package/.cursor/skills/loki-log-query/SKILL.md +430 -0
  455. package/.cursor/skills/loki-log-query/environments.json +45 -0
  456. package/.cursor/skills/mysql-debug/SKILL.md +406 -0
  457. package/.cursor/skills/openspec-apply-change/SKILL.md +165 -0
  458. package/.cursor/skills/openspec-archive-change/SKILL.md +122 -0
  459. package/.cursor/skills/openspec-bulk-archive-change/SKILL.md +254 -0
  460. package/.cursor/skills/openspec-continue-change/SKILL.md +126 -0
  461. package/.cursor/skills/openspec-explore/SKILL.md +299 -0
  462. package/.cursor/skills/openspec-ff-change/SKILL.md +109 -0
  463. package/.cursor/skills/openspec-new-change/SKILL.md +82 -0
  464. package/.cursor/skills/openspec-onboard/SKILL.md +414 -0
  465. package/.cursor/skills/openspec-sync-specs/SKILL.md +146 -0
  466. package/.cursor/skills/openspec-verify-change/SKILL.md +176 -0
  467. package/.cursor/skills/performance-doctor/SKILL.md +297 -0
  468. package/.cursor/skills/project-navigator/SKILL.md +211 -0
  469. package/.cursor/skills/redis-cache/SKILL.md +282 -0
  470. package/.cursor/skills/redis-cache/references/listeners.md +23 -0
  471. package/.cursor/skills/scheduled-jobs/SKILL.md +277 -0
  472. package/.cursor/skills/security-guard/SKILL.md +245 -0
  473. package/.cursor/skills/security-guard/references/encrypt-config.md +103 -0
  474. package/.cursor/skills/security-guard/references/sensitive-strategies.md +42 -0
  475. package/.cursor/skills/skill-creator/LICENSE.txt +202 -0
  476. package/.cursor/skills/skill-creator/SKILL.md +479 -0
  477. package/.cursor/skills/skill-creator/agents/analyzer.md +274 -0
  478. package/.cursor/skills/skill-creator/agents/comparator.md +202 -0
  479. package/.cursor/skills/skill-creator/agents/grader.md +223 -0
  480. package/.cursor/skills/skill-creator/assets/eval_review.html +146 -0
  481. package/.cursor/skills/skill-creator/eval-viewer/generate_review.py +471 -0
  482. package/.cursor/skills/skill-creator/eval-viewer/viewer.html +1325 -0
  483. package/.cursor/skills/skill-creator/references/schemas.md +430 -0
  484. package/.cursor/skills/skill-creator/scripts/__init__.py +0 -0
  485. package/.cursor/skills/skill-creator/scripts/aggregate_benchmark.py +401 -0
  486. package/.cursor/skills/skill-creator/scripts/generate_report.py +326 -0
  487. package/.cursor/skills/skill-creator/scripts/improve_description.py +248 -0
  488. package/.cursor/skills/skill-creator/scripts/package_skill.py +136 -0
  489. package/.cursor/skills/skill-creator/scripts/quick_validate.py +103 -0
  490. package/.cursor/skills/skill-creator/scripts/run_eval.py +310 -0
  491. package/.cursor/skills/skill-creator/scripts/run_loop.py +332 -0
  492. package/.cursor/skills/skill-creator/scripts/utils.py +47 -0
  493. package/.cursor/skills/sms-mail/SKILL.md +346 -0
  494. package/.cursor/skills/sms-mail/references/mail-config.md +88 -0
  495. package/.cursor/skills/sms-mail/references/sms-config.md +74 -0
  496. package/.cursor/skills/social-login/SKILL.md +328 -0
  497. package/.cursor/skills/social-login/references/provider-configs.md +118 -0
  498. package/.cursor/skills/store-pc/SKILL.md +366 -0
  499. package/.cursor/skills/sync-back-merge/SKILL.md +66 -0
  500. package/.cursor/skills/task-tracker/SKILL.md +307 -0
  501. package/.cursor/skills/tech-decision/SKILL.md +393 -0
  502. package/.cursor/skills/tenant-management/SKILL.md +272 -0
  503. package/.cursor/skills/tenant-management/references/tenant-scenarios.md +91 -0
  504. package/.cursor/skills/test-development/SKILL.md +301 -0
  505. package/.cursor/skills/test-development/references/parameterized-examples.md +119 -0
  506. package/.cursor/skills/ui-pc/SKILL.md +438 -0
  507. package/.cursor/skills/utils-toolkit/SKILL.md +354 -0
  508. package/.cursor/skills/utils-toolkit/references/redis-utils-api.md +56 -0
  509. package/.cursor/skills/websocket-sse/SKILL.md +350 -0
  510. package/.cursor/skills/workflow-engine/SKILL.md +249 -0
  511. package/.cursor/skills/yunxiao-task-management/SKILL.md +401 -0
  512. package/.cursor/skills/yunxiao-task-management/templates//346/217/220/346/265/213/345/215/225/346/250/241/346/235/277.html +17 -0
  513. package/.cursor/templates/env-config.md +27 -0
  514. package/AGENTS.md +275 -0
  515. package/CLAUDE.md +285 -0
  516. package/README.md +104 -0
  517. package/bin/index.js +3069 -0
  518. package/init.sh +178 -0
  519. package/package.json +40 -0
  520. package/scripts/build-skills.js +180 -0
  521. package/src/platform-map.json +100 -0
  522. package/src/skills/add-skill/SKILL.md +488 -0
  523. package/src/skills/add-todo/SKILL.md +269 -0
  524. package/src/skills/analyze-requirements/SKILL.md +112 -0
  525. package/src/skills/api-development/SKILL.md +315 -0
  526. package/src/skills/architecture-design/SKILL.md +152 -0
  527. package/src/skills/backend-annotations/SKILL.md +248 -0
  528. package/src/skills/banana-image/CHANGELOG.md +37 -0
  529. package/src/skills/banana-image/README.md +146 -0
  530. package/src/skills/banana-image/SKILL.md +171 -0
  531. package/src/skills/banana-image/assets/logo.png +0 -0
  532. package/src/skills/banana-image/references/advanced-usage.md +189 -0
  533. package/src/skills/banana-image/scripts/apply_template.py +125 -0
  534. package/src/skills/banana-image/scripts/banana_image_exec.ts +412 -0
  535. package/src/skills/banana-image/scripts/batch_prep.py +82 -0
  536. package/src/skills/banana-image/scripts/package-lock.json +1437 -0
  537. package/src/skills/banana-image/scripts/package.json +18 -0
  538. package/src/skills/banana-image/scripts/requirements.txt +10 -0
  539. package/src/skills/banana-image/templates/poster.json +22 -0
  540. package/src/skills/banana-image/templates/product.json +17 -0
  541. package/src/skills/banana-image/templates/social.json +22 -0
  542. package/src/skills/banana-image/templates/thumbnail.json +17 -0
  543. package/src/skills/brainstorm/SKILL.md +216 -0
  544. package/src/skills/bug-detective/SKILL.md +295 -0
  545. package/src/skills/bug-detective/references/error-patterns.md +242 -0
  546. package/src/skills/check/SKILL.md +367 -0
  547. package/src/skills/code-patterns/SKILL.md +163 -0
  548. package/src/skills/code-patterns/references/leniu-code-patterns.md +87 -0
  549. package/src/skills/codex-code-review/SKILL.md +327 -0
  550. package/src/skills/collaborating-with-codex/SKILL.md +180 -0
  551. package/src/skills/collaborating-with-codex/scripts/codex_bridge.py +275 -0
  552. package/src/skills/collaborating-with-gemini/SKILL.md +194 -0
  553. package/src/skills/collaborating-with-gemini/scripts/gemini_bridge.py +275 -0
  554. package/src/skills/crud/SKILL.md +265 -0
  555. package/src/skills/crud-development/SKILL.md +328 -0
  556. package/src/skills/data-permission/SKILL.md +221 -0
  557. package/src/skills/data-permission/references/custom-data-scope.md +90 -0
  558. package/src/skills/database-ops/SKILL.md +210 -0
  559. package/src/skills/dev/SKILL.md +187 -0
  560. package/src/skills/error-handler/SKILL.md +310 -0
  561. package/src/skills/file-oss-management/SKILL.md +260 -0
  562. package/src/skills/file-oss-management/references/entities.md +105 -0
  563. package/src/skills/file-oss-management/references/service-impl.md +104 -0
  564. package/src/skills/fix-bug/SKILL.md +269 -0
  565. package/src/skills/git-workflow/SKILL.md +179 -0
  566. package/src/skills/init-docs/SKILL.md +194 -0
  567. package/src/skills/json-serialization/SKILL.md +341 -0
  568. package/src/skills/leniu-api-development/SKILL.md +319 -0
  569. package/src/skills/leniu-api-development/references/real-examples.md +273 -0
  570. package/src/skills/leniu-architecture-design/SKILL.md +383 -0
  571. package/src/skills/leniu-backend-annotations/SKILL.md +277 -0
  572. package/src/skills/leniu-brainstorm/SKILL.md +242 -0
  573. package/src/skills/leniu-brainstorm/references/business-scenarios.md +162 -0
  574. package/src/skills/leniu-code-patterns/SKILL.md +411 -0
  575. package/src/skills/leniu-crud-development/SKILL.md +404 -0
  576. package/src/skills/leniu-crud-development/references/templates.md +597 -0
  577. package/src/skills/leniu-customization-location/SKILL.md +410 -0
  578. package/src/skills/leniu-data-permission/SKILL.md +341 -0
  579. package/src/skills/leniu-database-ops/SKILL.md +426 -0
  580. package/src/skills/leniu-error-handler/SKILL.md +462 -0
  581. package/src/skills/leniu-java-amount-handling/SKILL.md +461 -0
  582. package/src/skills/leniu-java-code-style/SKILL.md +510 -0
  583. package/src/skills/leniu-java-concurrent/SKILL.md +400 -0
  584. package/src/skills/leniu-java-entity/SKILL.md +237 -0
  585. package/src/skills/leniu-java-entity/references/templates.md +237 -0
  586. package/src/skills/leniu-java-export/SKILL.md +570 -0
  587. package/src/skills/leniu-java-logging/SKILL.md +229 -0
  588. package/src/skills/leniu-java-logging/references/data-mask.md +46 -0
  589. package/src/skills/leniu-java-logging/references/logging-scenarios.md +113 -0
  590. package/src/skills/leniu-java-mq/SKILL.md +338 -0
  591. package/src/skills/leniu-java-mybatis/SKILL.md +267 -0
  592. package/src/skills/leniu-java-mybatis/references/report-mapper.md +88 -0
  593. package/src/skills/leniu-java-report-query-param/SKILL.md +291 -0
  594. package/src/skills/leniu-java-task/SKILL.md +367 -0
  595. package/src/skills/leniu-java-total-line/SKILL.md +196 -0
  596. package/src/skills/leniu-marketing-price-rule-customizer/SKILL.md +301 -0
  597. package/src/skills/leniu-marketing-recharge-rule-customizer/SKILL.md +285 -0
  598. package/src/skills/leniu-mealtime/SKILL.md +215 -0
  599. package/src/skills/leniu-redis-cache/SKILL.md +331 -0
  600. package/src/skills/leniu-report-customization/SKILL.md +415 -0
  601. package/src/skills/leniu-report-customization/references/table-fields.md +93 -0
  602. package/src/skills/leniu-report-standard-customization/SKILL.md +391 -0
  603. package/src/skills/leniu-report-standard-customization/references/analysis-module.md +64 -0
  604. package/src/skills/leniu-report-standard-customization/references/table-fields.md +113 -0
  605. package/src/skills/leniu-security-guard/SKILL.md +306 -0
  606. package/src/skills/leniu-utils-toolkit/SKILL.md +380 -0
  607. package/src/skills/loki-log-query/SKILL.md +400 -0
  608. package/src/skills/loki-log-query/environments.json +45 -0
  609. package/src/skills/mysql-debug/SKILL.md +400 -0
  610. package/src/skills/next/SKILL.md +137 -0
  611. package/src/skills/openspec-apply-change/SKILL.md +165 -0
  612. package/src/skills/openspec-archive-change/SKILL.md +122 -0
  613. package/src/skills/openspec-bulk-archive-change/SKILL.md +254 -0
  614. package/src/skills/openspec-continue-change/SKILL.md +126 -0
  615. package/src/skills/openspec-explore/SKILL.md +299 -0
  616. package/src/skills/openspec-ff-change/SKILL.md +109 -0
  617. package/src/skills/openspec-new-change/SKILL.md +82 -0
  618. package/src/skills/openspec-onboard/SKILL.md +414 -0
  619. package/src/skills/openspec-sync-specs/SKILL.md +146 -0
  620. package/src/skills/openspec-verify-change/SKILL.md +176 -0
  621. package/src/skills/performance-doctor/SKILL.md +297 -0
  622. package/src/skills/progress/SKILL.md +193 -0
  623. package/src/skills/project-navigator/SKILL.md +211 -0
  624. package/src/skills/redis-cache/SKILL.md +282 -0
  625. package/src/skills/redis-cache/references/listeners.md +23 -0
  626. package/src/skills/scheduled-jobs/SKILL.md +277 -0
  627. package/src/skills/security-guard/SKILL.md +245 -0
  628. package/src/skills/security-guard/references/encrypt-config.md +103 -0
  629. package/src/skills/security-guard/references/sensitive-strategies.md +42 -0
  630. package/src/skills/skill-creator/LICENSE.txt +202 -0
  631. package/src/skills/skill-creator/SKILL.md +479 -0
  632. package/src/skills/skill-creator/agents/analyzer.md +274 -0
  633. package/src/skills/skill-creator/agents/comparator.md +202 -0
  634. package/src/skills/skill-creator/agents/grader.md +223 -0
  635. package/src/skills/skill-creator/assets/eval_review.html +146 -0
  636. package/src/skills/skill-creator/eval-viewer/generate_review.py +471 -0
  637. package/src/skills/skill-creator/eval-viewer/viewer.html +1325 -0
  638. package/src/skills/skill-creator/references/schemas.md +430 -0
  639. package/src/skills/skill-creator/scripts/__init__.py +0 -0
  640. package/src/skills/skill-creator/scripts/aggregate_benchmark.py +401 -0
  641. package/src/skills/skill-creator/scripts/generate_report.py +326 -0
  642. package/src/skills/skill-creator/scripts/improve_description.py +248 -0
  643. package/src/skills/skill-creator/scripts/package_skill.py +136 -0
  644. package/src/skills/skill-creator/scripts/quick_validate.py +103 -0
  645. package/src/skills/skill-creator/scripts/run_eval.py +310 -0
  646. package/src/skills/skill-creator/scripts/run_loop.py +332 -0
  647. package/src/skills/skill-creator/scripts/utils.py +47 -0
  648. package/src/skills/sms-mail/SKILL.md +346 -0
  649. package/src/skills/sms-mail/references/mail-config.md +88 -0
  650. package/src/skills/sms-mail/references/sms-config.md +74 -0
  651. package/src/skills/social-login/SKILL.md +328 -0
  652. package/src/skills/social-login/references/provider-configs.md +118 -0
  653. package/src/skills/start/SKILL.md +154 -0
  654. package/src/skills/store-pc/SKILL.md +366 -0
  655. package/src/skills/sync/SKILL.md +149 -0
  656. package/src/skills/sync-back-merge/SKILL.md +66 -0
  657. package/src/skills/task-tracker/SKILL.md +307 -0
  658. package/src/skills/tech-decision/SKILL.md +393 -0
  659. package/src/skills/tenant-management/SKILL.md +272 -0
  660. package/src/skills/tenant-management/references/tenant-scenarios.md +91 -0
  661. package/src/skills/test-development/SKILL.md +301 -0
  662. package/src/skills/test-development/references/parameterized-examples.md +119 -0
  663. package/src/skills/ui-pc/SKILL.md +438 -0
  664. package/src/skills/update-status/SKILL.md +159 -0
  665. package/src/skills/utils-toolkit/SKILL.md +354 -0
  666. package/src/skills/utils-toolkit/references/redis-utils-api.md +56 -0
  667. package/src/skills/websocket-sse/SKILL.md +350 -0
  668. package/src/skills/workflow-engine/SKILL.md +249 -0
  669. package/src/skills/yunxiao-task-management/SKILL.md +401 -0
  670. package/src/skills/yunxiao-task-management/templates//346/217/220/346/265/213/345/215/225/346/250/241/346/235/277.html +17 -0
@@ -0,0 +1,272 @@
1
+ ---
2
+ name: tenant-management
3
+ description: |
4
+ 通用多租户架构设计指南。涵盖字段隔离、Schema 隔离、物理隔离三种模式的对比与实现要点。
5
+ 触发场景:
6
+ - 设计多租户 SaaS 系统架构
7
+ - 选择租户隔离方案
8
+ - 处理跨租户数据操作
9
+ - 定时任务遍历所有租户
10
+ - 配置 Redis / 缓存租户隔离
11
+ 触发词:多租户、租户隔离、SaaS、tenantId、跨租户、租户切换、数据隔离、Schema隔离、物理隔离、字段隔离
12
+ 注意:如果项目有专属技能(如 `leniu-data-permission` 或 `leniu-tenant`),优先使用专属版本。
13
+ ---
14
+
15
+ # 多租户架构设计指南
16
+
17
+ > 通用模板。如果项目有专属技能,优先使用。
18
+
19
+ ## 设计原则
20
+
21
+ 1. **隔离性**:租户数据必须完全隔离,不可跨租户访问。
22
+ 2. **透明性**:业务代码尽量不感知多租户,由框架层自动处理。
23
+ 3. **可扩展**:新增租户不需要改代码,配置即可上线。
24
+ 4. **运维友好**:备份恢复、数据迁移应以租户为单位。
25
+
26
+ ---
27
+
28
+ ## 三种隔离模式对比
29
+
30
+ | 维度 | 字段隔离 | Schema 隔离 | 物理隔离(独立库) |
31
+ |------|---------|------------|-----------------|
32
+ | **实现方式** | 每张表加 `tenant_id` 字段 | 每个租户独立 Schema | 每个租户独立数据库 |
33
+ | **隔离强度** | 低(逻辑隔离) | 中(Schema 级) | 高(物理隔离) |
34
+ | **数据安全** | 依赖应用层正确过滤 | 数据库级隔离 | 最安全 |
35
+ | **资源利用** | 高(共享一切) | 中(共享实例) | 低(独占资源) |
36
+ | **扩展性** | 单库上限制约 | 单实例 Schema 数限制 | 水平扩展灵活 |
37
+ | **运维复杂度** | 低 | 中 | 高 |
38
+ | **备份恢复** | 复杂(需过滤) | 简单(按 Schema) | 最简单(按库) |
39
+ | **租户定制** | 困难 | 可支持 | 完全独立 |
40
+ | **成本** | 最低 | 中等 | 最高 |
41
+ | **适用场景** | 中小 SaaS、租户量大 | 中等规模、需一定隔离 | 大客户、强合规需求 |
42
+
43
+ ---
44
+
45
+ ## 实现模式
46
+
47
+ ### 模式一:字段隔离(最常见)
48
+
49
+ ```java
50
+ // 1. Entity 携带 tenant_id
51
+ public class [你的租户基类] extends [你的基础Entity] {
52
+ private String tenantId;
53
+ }
54
+
55
+ @TableName("biz_order")
56
+ public class BizOrder extends [你的租户基类] {
57
+ private Long id;
58
+ private String orderNo;
59
+ }
60
+
61
+ // 2. 数据库表必须含 tenant_id
62
+ // CREATE TABLE biz_order (
63
+ // id BIGINT NOT NULL,
64
+ // tenant_id VARCHAR(20) DEFAULT '000000' COMMENT '租户ID',
65
+ // order_no VARCHAR(64) NOT NULL,
66
+ // PRIMARY KEY (id),
67
+ // KEY idx_tenant_id (tenant_id)
68
+ // );
69
+
70
+ // 3. MyBatis 拦截器自动追加条件
71
+ // SELECT * FROM biz_order WHERE tenant_id = '000001' AND ...
72
+ // INSERT INTO biz_order (tenant_id, ...) VALUES ('000001', ...)
73
+ ```
74
+
75
+ **核心工具类模式**:
76
+
77
+ ```java
78
+ public class [你的租户工具类] {
79
+
80
+ // 获取当前租户ID(从请求上下文/ThreadLocal)
81
+ public static String getTenantId() { ... }
82
+
83
+ // 忽略租户过滤(查全量数据)
84
+ public static <T> T ignore(Supplier<T> supplier) {
85
+ // 临时关闭拦截器的租户条件追加
86
+ try {
87
+ setIgnore(true);
88
+ return supplier.get();
89
+ } finally {
90
+ setIgnore(false);
91
+ }
92
+ }
93
+
94
+ // 切换到指定租户执行
95
+ public static void dynamic(String tenantId, Runnable runnable) {
96
+ String original = getTenantId();
97
+ try {
98
+ setTenantId(tenantId);
99
+ runnable.run();
100
+ } finally {
101
+ setTenantId(original);
102
+ }
103
+ }
104
+
105
+ // 带返回值的租户切换
106
+ public static <T> T dynamic(String tenantId, Supplier<T> supplier) {
107
+ String original = getTenantId();
108
+ try {
109
+ setTenantId(tenantId);
110
+ return supplier.get();
111
+ } finally {
112
+ setTenantId(original);
113
+ }
114
+ }
115
+ }
116
+ ```
117
+
118
+ **配置排除表**(不需要租户过滤的共享表):
119
+
120
+ ```yaml
121
+ tenant:
122
+ enable: true
123
+ excludes:
124
+ - sys_menu
125
+ - sys_dict_type
126
+ - sys_dict_data
127
+ - sys_config
128
+ ```
129
+
130
+ ### 模式二:Schema 隔离
131
+
132
+ ```java
133
+ // 动态数据源 / 动态 Schema 切换
134
+ public class TenantSchemaResolver {
135
+ public String resolveSchema(String tenantId) {
136
+ return "tenant_" + tenantId; // tenant_000001, tenant_000002
137
+ }
138
+ }
139
+
140
+ // 通过 AbstractRoutingDataSource 或 MyBatis 拦截器切换 Schema
141
+ // SET search_path TO tenant_000001; (PostgreSQL)
142
+ // USE tenant_000001; (MySQL)
143
+ ```
144
+
145
+ ### 模式三:物理隔离(独立库)
146
+
147
+ ```java
148
+ // 每个租户对应独立的数据源配置
149
+ // 通过 AbstractRoutingDataSource 或动态数据源框架切换
150
+
151
+ public class TenantDataSourceRouter extends AbstractRoutingDataSource {
152
+ @Override
153
+ protected Object determineCurrentLookupKey() {
154
+ return [你的租户工具类].getTenantId();
155
+ }
156
+ }
157
+
158
+ // 典型用法
159
+ [你的租户工具类].doInTenant(tenantId, () -> {
160
+ // 自动路由到该租户的数据库
161
+ orderMapper.insert(order);
162
+ });
163
+
164
+ [你的租户工具类].doInSystem(() -> {
165
+ // 路由到系统公共库
166
+ configMapper.selectList(null);
167
+ });
168
+ ```
169
+
170
+ ---
171
+
172
+ ## 常见场景
173
+
174
+ ### 场景 1:管理员查看所有租户数据
175
+
176
+ ```java
177
+ public List<UserVo> listAllTenantUsers() {
178
+ return [你的租户工具类].ignore(() -> userMapper.selectVoList(null));
179
+ }
180
+ ```
181
+
182
+ ### 场景 2:跨租户数据同步
183
+
184
+ ```java
185
+ public void syncConfigToAllTenants(Config config) {
186
+ List<String> tenantIds = [你的租户工具类].ignore(() ->
187
+ tenantMapper.selectList(null).stream()
188
+ .map(Tenant::getTenantId).collect(Collectors.toList())
189
+ );
190
+ for (String tenantId : tenantIds) {
191
+ [你的租户工具类].dynamic(tenantId, () -> {
192
+ configMapper.insertOrUpdate(config);
193
+ });
194
+ }
195
+ }
196
+ ```
197
+
198
+ ### 场景 3:定时任务遍历所有租户
199
+
200
+ ```java
201
+ @Scheduled(cron = "0 0 2 * * ?")
202
+ public void cleanupExpiredOrders() {
203
+ List<Tenant> tenants = [你的租户工具类].ignore(() ->
204
+ tenantMapper.selectByStatus("ACTIVE")
205
+ );
206
+ for (Tenant tenant : tenants) {
207
+ try {
208
+ [你的租户工具类].dynamic(tenant.getTenantId(), () -> {
209
+ orderMapper.deleteExpired(30);
210
+ });
211
+ } catch (Exception e) {
212
+ log.error("清理租户 {} 订单失败: {}", tenant.getTenantId(), e.getMessage());
213
+ }
214
+ }
215
+ }
216
+ ```
217
+
218
+ ### 场景 4:Redis 缓存隔离
219
+
220
+ ```
221
+ 原始 Key: user:info:1001
222
+ 实际 Key: 000000:user:info:1001 (租户 000000)
223
+ 实际 Key: 000001:user:info:1001 (租户 000001)
224
+ ```
225
+
226
+ 全局缓存(不隔离):使用特定前缀标识全局 Key。
227
+
228
+ ---
229
+
230
+ ## 选型建议
231
+
232
+ | 维度 | 字段隔离 | Schema 隔离 | 物理隔离 |
233
+ |------|---------|------------|---------|
234
+ | 租户数量 | 大量(100+) | 中等(10-100) | 少量(<20) |
235
+ | 数据量级 | 单租户数据量小 | 中等 | 大 |
236
+ | 合规要求 | 一般 | 中等 | 严格(金融、政务) |
237
+ | 预算 | 有限 | 中等 | 充足 |
238
+ | 定制化 | 几乎不需要 | 少量 | 高度定制 |
239
+
240
+ ---
241
+
242
+ ## 常见错误
243
+
244
+ ```java
245
+ // 1. Entity 忘记继承租户基类 / 表缺少 tenant_id(字段隔离模式)
246
+ public class BizOrder extends BaseEntity { } // 缺少 tenantId
247
+ // 表中也没有 tenant_id 字段 -> 数据不隔离
248
+
249
+ // 2. 手动设置租户后忘记清理
250
+ [你的租户工具类].setTenantId("000001");
251
+ userMapper.insert(user);
252
+ // 忘记恢复原租户ID -> 后续请求使用错误租户
253
+ // 应使用 dynamic() 方法(自动恢复)
254
+
255
+ // 3. 事务中切换租户(字段隔离模式下可能数据错乱)
256
+ @Transactional
257
+ public void wrongMethod() {
258
+ orderMapper.insert(order); // 租户 A
259
+ [你的租户工具类].dynamic("B", () -> logMapper.insert(log)); // 租户 B
260
+ // 如果回滚,租户 B 的数据不会回滚(不同事务)
261
+ }
262
+ // 应使用独立事务
263
+ @Transactional(propagation = Propagation.REQUIRES_NEW)
264
+ public void saveToOtherTenant(String tenantId, Log log) { ... }
265
+
266
+ // 4. 共享表未排除租户过滤
267
+ // sys_dict_type 等共享表被加上 tenant_id 条件 -> 查不到数据
268
+ // 应在配置中排除这些表
269
+
270
+ // 5. 物理隔离模式下使用 tenant_id 字段(画蛇添足)
271
+ // 物理隔离已通过数据源区分租户,表中不需要 tenant_id
272
+ ```
@@ -0,0 +1,91 @@
1
+ # 多租户扩展场景
2
+
3
+ ## 统计所有租户数据
4
+
5
+ ```java
6
+ public List<TenantOrderStats> getTenantOrderStats() {
7
+ return TenantHelper.ignore(() -> {
8
+ return orderMapper.selectMaps(
9
+ new QueryWrapper<Order>()
10
+ .select("tenant_id", "COUNT(*) as order_count", "SUM(amount) as total_amount")
11
+ .groupBy("tenant_id")
12
+ ).stream().map(map -> {
13
+ TenantOrderStats stats = new TenantOrderStats();
14
+ stats.setTenantId((String) map.get("tenant_id"));
15
+ stats.setOrderCount(((Number) map.get("order_count")).longValue());
16
+ stats.setTotalAmount((BigDecimal) map.get("total_amount"));
17
+ return stats;
18
+ }).collect(Collectors.toList());
19
+ });
20
+ }
21
+ ```
22
+
23
+ ## 定时任务完整模板
24
+
25
+ ```java
26
+ @Service
27
+ @RequiredArgsConstructor
28
+ public class OrderCleanupJob {
29
+
30
+ private final OrderMapper orderMapper;
31
+ private final SysTenantMapper tenantMapper;
32
+
33
+ @Scheduled(cron = "0 0 2 * * ?")
34
+ public void cleanupExpiredOrders() {
35
+ // 1. 获取所有启用的租户
36
+ List<SysTenant> tenants = TenantHelper.ignore(() -> {
37
+ return tenantMapper.selectList(
38
+ Wrappers.<SysTenant>lambdaQuery()
39
+ .eq(SysTenant::getStatus, "0")
40
+ );
41
+ });
42
+
43
+ // 2. 逐个租户处理
44
+ for (SysTenant tenant : tenants) {
45
+ try {
46
+ TenantHelper.dynamic(tenant.getTenantId(), () -> {
47
+ orderMapper.delete(
48
+ Wrappers.<Order>lambdaQuery()
49
+ .eq(Order::getStatus, "CANCELLED")
50
+ .lt(Order::getCreateTime, DateUtils.addDays(new Date(), -30))
51
+ );
52
+ });
53
+ } catch (Exception e) {
54
+ log.error("清理租户 {} 订单失败: {}", tenant.getTenantId(), e.getMessage());
55
+ }
56
+ }
57
+ }
58
+ }
59
+ ```
60
+
61
+ ## 跨租户数据同步完整模板
62
+
63
+ ```java
64
+ @Service
65
+ @RequiredArgsConstructor
66
+ public class DataSyncServiceImpl implements IDataSyncService {
67
+
68
+ private final SysConfigMapper configMapper;
69
+ private final SysTenantMapper tenantMapper;
70
+
71
+ public void syncConfigToAllTenants(SysConfig config) {
72
+ List<String> tenantIds = TenantHelper.ignore(() -> {
73
+ return tenantMapper.selectList(null)
74
+ .stream()
75
+ .map(SysTenant::getTenantId)
76
+ .collect(Collectors.toList());
77
+ });
78
+
79
+ for (String tenantId : tenantIds) {
80
+ TenantHelper.dynamic(tenantId, () -> {
81
+ SysConfig existing = configMapper.selectByKey(config.getConfigKey());
82
+ if (existing == null) {
83
+ configMapper.insert(config);
84
+ } else {
85
+ configMapper.updateById(config);
86
+ }
87
+ });
88
+ }
89
+ }
90
+ }
91
+ ```
@@ -0,0 +1,301 @@
1
+ ---
2
+ name: test-development
3
+ description: |
4
+ 测试开发技能,编写单元测试、集成测试、Controller测试。基于 JUnit5 + Spring Boot Test + Mockito 标准测试框架。
5
+
6
+ 触发场景:
7
+ - 编写单元测试(工具类、枚举、POJO)
8
+ - 编写 Spring 集成测试(Service、Controller、Mapper)
9
+ - Mock 外部依赖
10
+ - 参数化测试
11
+ - 测试数据构造
12
+ - 测试覆盖率提升
13
+
14
+ 触发词:测试、单元测试、集成测试、@Test、JUnit5、JUnit、Mockito、Mock、断言、test、测试用例、测试覆盖率、测试数据、@SpringBootTest、@Mock、@MockBean、Assertions、测试类、测试方法、@ParameterizedTest、参数化测试、@BeforeEach、@AfterEach、@DisplayName
15
+
16
+ 注意:本项目使用标准的 JUnit5 + Spring Boot Test,没有自定义测试基类。
17
+ ---
18
+
19
+ # 测试开发规范
20
+
21
+ ## 测试分层策略
22
+
23
+ | 层次 | 测试类型 | 启动 Spring | 执行速度 |
24
+ |------|---------|------------|---------|
25
+ | 单元测试 | 工具类/枚举/POJO | 否 | < 1s |
26
+ | 集成测试 | Service/Controller/Mapper | 是(`@SpringBootTest`) | 5-10s |
27
+
28
+ ## 测试文件位置
29
+
30
+ ```
31
+ src/test/java/org/dromara/test/ # 通用测试
32
+ src/test/java/org/dromara/{模块}/ # 模块测试(与源码包路径一致)
33
+ ```
34
+
35
+ **重要**:`@SpringBootTest` 只能在 SpringBoot 主包下使用(需包含 main 方法和 yml 配置)。
36
+
37
+ ---
38
+
39
+ ## 1. 单元测试(纯 JUnit5,无 Spring)
40
+
41
+ ```java
42
+ package org.dromara.test;
43
+
44
+ import org.junit.jupiter.api.Assertions;
45
+ import org.junit.jupiter.api.DisplayName;
46
+ import org.junit.jupiter.api.Test;
47
+
48
+ @DisplayName("StringUtils 测试")
49
+ public class StringUtilsTest {
50
+
51
+ @Test
52
+ @DisplayName("测试 isBlank 方法")
53
+ public void testIsBlank() {
54
+ Assertions.assertTrue(StringUtils.isBlank(null));
55
+ Assertions.assertTrue(StringUtils.isBlank(""));
56
+ Assertions.assertFalse(StringUtils.isBlank("hello"));
57
+ }
58
+
59
+ @Test
60
+ @DisplayName("测试异常抛出")
61
+ public void testThrowsException() {
62
+ Assertions.assertThrows(NullPointerException.class, () -> {
63
+ String str = null;
64
+ str.length();
65
+ });
66
+ }
67
+ }
68
+ ```
69
+
70
+ ---
71
+
72
+ ## 2. Service 集成测试
73
+
74
+ ```java
75
+ @SpringBootTest
76
+ @Transactional // 测试后自动回滚,不污染数据库
77
+ @DisplayName("TestDemo Service 测试")
78
+ public class TestDemoServiceTest {
79
+
80
+ @Autowired
81
+ private ITestDemoService testDemoService;
82
+
83
+ @Test
84
+ @DisplayName("测试添加数据")
85
+ public void testAdd() {
86
+ // Arrange
87
+ TestDemoBo bo = new TestDemoBo();
88
+ bo.setDeptId(103L);
89
+ bo.setUserId(1L);
90
+ bo.setTestKey("测试数据");
91
+ bo.setValue("test_value");
92
+
93
+ // Act
94
+ Boolean result = testDemoService.insertByBo(bo);
95
+
96
+ // Assert
97
+ Assertions.assertTrue(result);
98
+ }
99
+
100
+ @Test
101
+ @DisplayName("测试查询详情")
102
+ public void testGetById() {
103
+ TestDemoBo bo = new TestDemoBo();
104
+ bo.setTestKey("测试查询");
105
+ bo.setValue("test_query");
106
+ testDemoService.insertByBo(bo);
107
+
108
+ TestDemoVo vo = testDemoService.queryById(bo.getId());
109
+ Assertions.assertNotNull(vo);
110
+ Assertions.assertEquals("测试查询", vo.getTestKey());
111
+ }
112
+ }
113
+ ```
114
+
115
+ ### Mock 外部依赖
116
+
117
+ ```java
118
+ @SpringBootTest
119
+ @DisplayName("订单服务测试")
120
+ public class OrderServiceTest {
121
+
122
+ @Autowired
123
+ private IOrderService orderService;
124
+
125
+ @MockBean
126
+ private IPaymentService paymentService;
127
+
128
+ @Test
129
+ @DisplayName("测试订单支付(Mock 支付服务)")
130
+ public void testPayOrder() {
131
+ Long orderId = 123L;
132
+ Mockito.when(paymentService.pay(orderId)).thenReturn(true);
133
+
134
+ Boolean success = orderService.payOrder(orderId);
135
+
136
+ Assertions.assertTrue(success);
137
+ Mockito.verify(paymentService, Mockito.times(1)).pay(orderId);
138
+ }
139
+ }
140
+ ```
141
+
142
+ ---
143
+
144
+ ## 3. Controller 测试
145
+
146
+ ```java
147
+ @SpringBootTest
148
+ @AutoConfigureMockMvc
149
+ @DisplayName("TestDemo Controller 测试")
150
+ public class TestDemoControllerTest {
151
+
152
+ @Autowired
153
+ private MockMvc mockMvc;
154
+
155
+ @Test
156
+ @DisplayName("测试分页查询")
157
+ public void testPageList() throws Exception {
158
+ mockMvc.perform(get("/demo/demo/list")
159
+ .param("pageNum", "1")
160
+ .param("pageSize", "10"))
161
+ .andExpect(status().isOk())
162
+ .andExpect(jsonPath("$.code").value(200));
163
+ }
164
+
165
+ @Test
166
+ @DisplayName("测试添加数据")
167
+ public void testAdd() throws Exception {
168
+ String requestBody = """
169
+ {
170
+ "deptId": 103,
171
+ "userId": 1,
172
+ "testKey": "测试数据",
173
+ "value": "test_value"
174
+ }
175
+ """;
176
+
177
+ mockMvc.perform(post("/demo/demo")
178
+ .contentType(MediaType.APPLICATION_JSON)
179
+ .content(requestBody))
180
+ .andExpect(status().isOk())
181
+ .andExpect(jsonPath("$.code").value(200));
182
+ }
183
+ }
184
+ ```
185
+
186
+ ---
187
+
188
+ ## 4. 参数化测试
189
+
190
+ ```java
191
+ @DisplayName("参数化测试")
192
+ public class ParamUnitTest {
193
+
194
+ @ParameterizedTest
195
+ @ValueSource(strings = {"t1", "t2", "t3"})
196
+ public void testValueSource(String str) {
197
+ Assertions.assertNotNull(str);
198
+ }
199
+
200
+ @ParameterizedTest
201
+ @EnumSource(UserType.class)
202
+ public void testEnumSource(UserType type) {
203
+ Assertions.assertNotNull(type);
204
+ }
205
+
206
+ @ParameterizedTest
207
+ @CsvSource({"1, Banner, 横幅广告", "2, Popup, 弹窗广告"})
208
+ public void testCsvData(String code, String name, String desc) {
209
+ Assertions.assertNotNull(code);
210
+ }
211
+
212
+ @ParameterizedTest
213
+ @MethodSource("getParam")
214
+ public void testMethodSource(String str) {
215
+ Assertions.assertNotNull(str);
216
+ }
217
+
218
+ public static Stream<String> getParam() {
219
+ return Stream.of("t1", "t2", "t3");
220
+ }
221
+ }
222
+ ```
223
+
224
+ > 更多参数化测试示例详见 `references/parameterized-examples.md`
225
+
226
+ ---
227
+
228
+ ## 5. 异常测试
229
+
230
+ ```java
231
+ @Test
232
+ @DisplayName("测试 key 为空抛出异常")
233
+ public void testAdd_ThrowsException() {
234
+ TestDemoBo bo = new TestDemoBo();
235
+ // 不设置必填字段
236
+
237
+ ServiceException exception = Assertions.assertThrows(
238
+ ServiceException.class,
239
+ () -> testDemoService.insertByBo(bo)
240
+ );
241
+ Assertions.assertTrue(exception.getMessage().contains("key键不能为空"));
242
+ }
243
+ ```
244
+
245
+ ---
246
+
247
+ ## 6. 测试标签(@Tag)
248
+
249
+ ```java
250
+ @Test @Tag("dev") public void testDev() { }
251
+ @Test @Tag("prod") public void testProd() { }
252
+ ```
253
+
254
+ ```bash
255
+ mvn test -Dgroups=dev # 运行 dev 标签
256
+ mvn test -DexcludedGroups=prod # 排除 prod 标签
257
+ ```
258
+
259
+ ---
260
+
261
+ ## 运行测试
262
+
263
+ ```bash
264
+ mvn test # 运行所有测试
265
+ mvn test -Dtest=AdServiceTest # 运行单个测试类
266
+ mvn test -Dtest=AdServiceTest#testAddAd # 运行单个方法
267
+ mvn clean install -DskipTests # 跳过测试
268
+ ```
269
+
270
+ ---
271
+
272
+ ## 开发检查清单
273
+
274
+ ### 命名规范
275
+
276
+ - [ ] 测试类:`{被测试类名}Test`
277
+ - [ ] 测试方法:`test{功能}`
278
+ - [ ] 使用 `@DisplayName` 添加中文描述
279
+ - [ ] 位于 `src/test/java`,包路径与源码一致
280
+
281
+ ### 注解选择
282
+
283
+ | 场景 | 注解组合 |
284
+ |------|---------|
285
+ | 工具类/枚举/POJO | 不加 `@SpringBootTest` |
286
+ | Service 测试 | `@SpringBootTest` + `@Transactional` |
287
+ | Controller 测试 | `@SpringBootTest` + `@AutoConfigureMockMvc` |
288
+ | Mock Spring Bean | `@MockBean` |
289
+ | Mock(纯单元测试) | `@Mock` + `@InjectMocks` |
290
+
291
+ ### 常见错误
292
+
293
+ | 错误 | 正确做法 |
294
+ |------|---------|
295
+ | 测试在 `src/main/java` | 放到 `src/test/java` |
296
+ | 缺少 `@DisplayName` | 必须添加描述 |
297
+ | 需要注入但没加 `@SpringBootTest` | 加上注解 |
298
+ | `@SpringBootTest` 在非主包下 | 确保在主类同包或子包 |
299
+ | Mock 后不验证调用 | `Mockito.verify()` |
300
+ | 测试方法相互依赖 | 每个测试独立 |
301
+ | Service 测试不加 `@Transactional` | 加上防止污染数据库 |