@ketecode/loom 0.0.0-stage → 0.2.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 (851) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +616 -2
  3. package/agents/accessibility-reviewer/AGENT.md +70 -0
  4. package/agents/accessibility-reviewer/evals/triggers.json +15 -0
  5. package/agents/agent-evaluator/AGENT.md +74 -0
  6. package/agents/agent-evaluator/evals/triggers.json +15 -0
  7. package/agents/architect/AGENT.md +82 -0
  8. package/agents/architect/evals/triggers.json +17 -0
  9. package/agents/billing-reviewer/AGENT.md +68 -0
  10. package/agents/billing-reviewer/evals/triggers.json +16 -0
  11. package/agents/code-reviewer/AGENT.md +51 -0
  12. package/agents/code-reviewer/evals/behavior.json +60 -0
  13. package/agents/code-reviewer/evals/triggers.json +14 -0
  14. package/agents/code-simplifier/AGENT.md +74 -0
  15. package/agents/code-simplifier/evals/triggers.json +15 -0
  16. package/agents/cpp-build-resolver/AGENT.md +73 -0
  17. package/agents/cpp-build-resolver/evals/triggers.json +16 -0
  18. package/agents/cpp-reviewer/AGENT.md +59 -0
  19. package/agents/cpp-reviewer/evals/triggers.json +16 -0
  20. package/agents/csharp-build-resolver/AGENT.md +84 -0
  21. package/agents/csharp-build-resolver/evals/triggers.json +17 -0
  22. package/agents/csharp-reviewer/AGENT.md +88 -0
  23. package/agents/csharp-reviewer/evals/triggers.json +17 -0
  24. package/agents/dart-build-resolver/AGENT.md +80 -0
  25. package/agents/dart-build-resolver/evals/triggers.json +17 -0
  26. package/agents/dart-reviewer/AGENT.md +66 -0
  27. package/agents/dart-reviewer/evals/triggers.json +17 -0
  28. package/agents/database-reviewer/AGENT.md +72 -0
  29. package/agents/database-reviewer/evals/triggers.json +16 -0
  30. package/agents/django-reviewer/AGENT.md +61 -0
  31. package/agents/django-reviewer/evals/triggers.json +15 -0
  32. package/agents/doc-updater/AGENT.md +92 -0
  33. package/agents/doc-updater/evals/triggers.json +14 -0
  34. package/agents/e2e-runner/AGENT.md +88 -0
  35. package/agents/e2e-runner/evals/triggers.json +16 -0
  36. package/agents/fastapi-reviewer/AGENT.md +63 -0
  37. package/agents/fastapi-reviewer/evals/triggers.json +15 -0
  38. package/agents/flutter-reviewer/AGENT.md +70 -0
  39. package/agents/flutter-reviewer/evals/triggers.json +15 -0
  40. package/agents/fsharp-build-resolver/AGENT.md +81 -0
  41. package/agents/fsharp-build-resolver/evals/triggers.json +15 -0
  42. package/agents/fsharp-reviewer/AGENT.md +77 -0
  43. package/agents/fsharp-reviewer/evals/triggers.json +15 -0
  44. package/agents/go-build-resolver/AGENT.md +85 -0
  45. package/agents/go-build-resolver/evals/triggers.json +16 -0
  46. package/agents/go-reviewer/AGENT.md +66 -0
  47. package/agents/go-reviewer/evals/triggers.json +16 -0
  48. package/agents/healthcare-reviewer/AGENT.md +65 -0
  49. package/agents/healthcare-reviewer/evals/triggers.json +16 -0
  50. package/agents/i18n-reviewer/AGENT.md +64 -0
  51. package/agents/i18n-reviewer/evals/triggers.json +16 -0
  52. package/agents/inbox-triager/AGENT.md +98 -0
  53. package/agents/inbox-triager/evals/triggers.json +16 -0
  54. package/agents/infra-reviewer/AGENT.md +93 -0
  55. package/agents/infra-reviewer/evals/triggers.json +15 -0
  56. package/agents/java-build-resolver/AGENT.md +82 -0
  57. package/agents/java-build-resolver/evals/triggers.json +16 -0
  58. package/agents/java-reviewer/AGENT.md +64 -0
  59. package/agents/java-reviewer/evals/triggers.json +16 -0
  60. package/agents/kotlin-build-resolver/AGENT.md +89 -0
  61. package/agents/kotlin-build-resolver/evals/triggers.json +16 -0
  62. package/agents/kotlin-reviewer/AGENT.md +75 -0
  63. package/agents/kotlin-reviewer/evals/triggers.json +16 -0
  64. package/agents/mle-reviewer/AGENT.md +68 -0
  65. package/agents/mle-reviewer/evals/triggers.json +16 -0
  66. package/agents/network-config-reviewer/AGENT.md +68 -0
  67. package/agents/network-config-reviewer/evals/triggers.json +17 -0
  68. package/agents/payments-reviewer/AGENT.md +64 -0
  69. package/agents/payments-reviewer/evals/triggers.json +16 -0
  70. package/agents/performance-optimizer/AGENT.md +86 -0
  71. package/agents/performance-optimizer/evals/triggers.json +16 -0
  72. package/agents/perl-build-resolver/AGENT.md +84 -0
  73. package/agents/perl-build-resolver/evals/triggers.json +15 -0
  74. package/agents/perl-reviewer/AGENT.md +77 -0
  75. package/agents/perl-reviewer/evals/triggers.json +15 -0
  76. package/agents/php-build-resolver/AGENT.md +88 -0
  77. package/agents/php-build-resolver/evals/triggers.json +16 -0
  78. package/agents/php-reviewer/AGENT.md +61 -0
  79. package/agents/php-reviewer/evals/triggers.json +15 -0
  80. package/agents/planner/AGENT.md +75 -0
  81. package/agents/planner/evals/triggers.json +17 -0
  82. package/agents/pr-test-analyzer/AGENT.md +82 -0
  83. package/agents/pr-test-analyzer/evals/triggers.json +16 -0
  84. package/agents/python-build-resolver/AGENT.md +87 -0
  85. package/agents/python-build-resolver/evals/triggers.json +16 -0
  86. package/agents/python-reviewer/AGENT.md +63 -0
  87. package/agents/python-reviewer/evals/triggers.json +15 -0
  88. package/agents/rag-reviewer/AGENT.md +71 -0
  89. package/agents/rag-reviewer/evals/triggers.json +16 -0
  90. package/agents/react-reviewer/AGENT.md +70 -0
  91. package/agents/react-reviewer/evals/triggers.json +16 -0
  92. package/agents/refactor-cleaner/AGENT.md +82 -0
  93. package/agents/refactor-cleaner/evals/triggers.json +16 -0
  94. package/agents/ruby-build-resolver/AGENT.md +93 -0
  95. package/agents/ruby-build-resolver/evals/triggers.json +16 -0
  96. package/agents/ruby-reviewer/AGENT.md +62 -0
  97. package/agents/ruby-reviewer/evals/triggers.json +16 -0
  98. package/agents/rust-build-resolver/AGENT.md +98 -0
  99. package/agents/rust-build-resolver/evals/triggers.json +16 -0
  100. package/agents/rust-reviewer/AGENT.md +78 -0
  101. package/agents/rust-reviewer/evals/triggers.json +15 -0
  102. package/agents/security-reviewer/AGENT.md +84 -0
  103. package/agents/security-reviewer/evals/triggers.json +16 -0
  104. package/agents/silent-failure-hunter/AGENT.md +66 -0
  105. package/agents/silent-failure-hunter/evals/triggers.json +16 -0
  106. package/agents/solidity-reviewer/AGENT.md +70 -0
  107. package/agents/solidity-reviewer/evals/triggers.json +16 -0
  108. package/agents/spec-reviewer/AGENT.md +95 -0
  109. package/agents/spec-reviewer/evals/behavior.json +57 -0
  110. package/agents/spec-reviewer/evals/triggers.json +16 -0
  111. package/agents/swift-build-resolver/AGENT.md +85 -0
  112. package/agents/swift-build-resolver/evals/triggers.json +15 -0
  113. package/agents/swift-reviewer/AGENT.md +75 -0
  114. package/agents/swift-reviewer/evals/triggers.json +15 -0
  115. package/agents/task-implementer/AGENT.md +89 -0
  116. package/agents/task-implementer/evals/behavior.json +47 -0
  117. package/agents/task-implementer/evals/triggers.json +16 -0
  118. package/agents/typescript-build-resolver/AGENT.md +76 -0
  119. package/agents/typescript-build-resolver/evals/triggers.json +15 -0
  120. package/agents/typescript-reviewer/AGENT.md +76 -0
  121. package/agents/typescript-reviewer/evals/triggers.json +15 -0
  122. package/agents/vue-reviewer/AGENT.md +75 -0
  123. package/agents/vue-reviewer/evals/triggers.json +15 -0
  124. package/bin/kete-loom.js +723 -0
  125. package/commands/aside.md +19 -0
  126. package/commands/brainstorm.md +25 -0
  127. package/commands/build-fix.md +26 -0
  128. package/commands/campaign.md +19 -0
  129. package/commands/changelog.md +36 -0
  130. package/commands/checkpoint.md +26 -0
  131. package/commands/codemap.md +25 -0
  132. package/commands/commit.md +26 -0
  133. package/commands/debug.md +27 -0
  134. package/commands/deps-audit.md +32 -0
  135. package/commands/dual-review.md +34 -0
  136. package/commands/epic-decompose.md +21 -0
  137. package/commands/explain.md +37 -0
  138. package/commands/feature-dev.md +23 -0
  139. package/commands/finish-branch.md +26 -0
  140. package/commands/fix-bug.md +38 -0
  141. package/commands/hookify.md +23 -0
  142. package/commands/i18n-check.md +39 -0
  143. package/commands/issue-sync.md +22 -0
  144. package/commands/jira.md +19 -0
  145. package/commands/learn.md +23 -0
  146. package/commands/loom.md +21 -0
  147. package/commands/loop.md +20 -0
  148. package/commands/model-route.md +27 -0
  149. package/commands/onboard.md +35 -0
  150. package/commands/orchestrate.md +21 -0
  151. package/commands/plan-feature.md +36 -0
  152. package/commands/postmortem.md +42 -0
  153. package/commands/pr-describe.md +39 -0
  154. package/commands/pr.md +22 -0
  155. package/commands/prd.md +41 -0
  156. package/commands/production-readiness.md +45 -0
  157. package/commands/project-init.md +21 -0
  158. package/commands/refactor-clean.md +24 -0
  159. package/commands/resume-session.md +22 -0
  160. package/commands/review.md +35 -0
  161. package/commands/save-session.md +37 -0
  162. package/commands/security-scan.md +32 -0
  163. package/commands/sessions.md +21 -0
  164. package/commands/skill-create.md +21 -0
  165. package/commands/tdd.md +36 -0
  166. package/commands/test-coverage.md +24 -0
  167. package/commands/threat-model.md +36 -0
  168. package/commands/update-docs.md +25 -0
  169. package/commands/usage-report.md +43 -0
  170. package/commands/verify.md +21 -0
  171. package/hooks/block-dangerous-commands/HOOK.md +30 -0
  172. package/hooks/block-dangerous-commands/cases.json +50 -0
  173. package/hooks/block-dangerous-commands/hook.js +75 -0
  174. package/hooks/block-foreground-servers/HOOK.md +34 -0
  175. package/hooks/block-foreground-servers/cases.json +31 -0
  176. package/hooks/block-foreground-servers/hook.js +41 -0
  177. package/hooks/block-no-verify/HOOK.md +25 -0
  178. package/hooks/block-no-verify/cases.json +30 -0
  179. package/hooks/block-no-verify/hook.js +43 -0
  180. package/hooks/capture-lessons/HOOK.md +24 -0
  181. package/hooks/capture-lessons/hook.js +48 -0
  182. package/hooks/format-on-edit/HOOK.md +24 -0
  183. package/hooks/format-on-edit/hook.js +89 -0
  184. package/hooks/guard-secrets/HOOK.md +19 -0
  185. package/hooks/guard-secrets/cases.json +110 -0
  186. package/hooks/guard-secrets/hook.js +44 -0
  187. package/hooks/load-session-context/HOOK.md +20 -0
  188. package/hooks/load-session-context/hook.js +56 -0
  189. package/hooks/notify-on-stop/HOOK.md +25 -0
  190. package/hooks/notify-on-stop/hook.js +27 -0
  191. package/hooks/protect-files/HOOK.md +24 -0
  192. package/hooks/protect-files/cases.json +27 -0
  193. package/hooks/protect-files/hook.js +39 -0
  194. package/hooks/protect-lint-config/HOOK.md +29 -0
  195. package/hooks/protect-lint-config/cases.json +18 -0
  196. package/hooks/protect-lint-config/fixtures/.eslintrc.json +1 -0
  197. package/hooks/protect-lint-config/fixtures/.golangci.yml +1 -0
  198. package/hooks/protect-lint-config/fixtures/.prettierrc +1 -0
  199. package/hooks/protect-lint-config/fixtures/.rubocop.yml +1 -0
  200. package/hooks/protect-lint-config/fixtures/biome.json +1 -0
  201. package/hooks/protect-lint-config/fixtures/eslint.config.mjs +1 -0
  202. package/hooks/protect-lint-config/fixtures/ruff.toml +1 -0
  203. package/hooks/protect-lint-config/hook.js +25 -0
  204. package/hooks/read-before-edit/HOOK.md +26 -0
  205. package/hooks/read-before-edit/cases.json +15 -0
  206. package/hooks/read-before-edit/hook.js +50 -0
  207. package/hooks/run.js +148 -0
  208. package/hooks/verify-before-stop/HOOK.md +32 -0
  209. package/hooks/verify-before-stop/hook.js +70 -0
  210. package/mcp/atlassian.json +11 -0
  211. package/mcp/chrome-devtools.json +18 -0
  212. package/mcp/clickhouse.json +11 -0
  213. package/mcp/cloudflare.json +11 -0
  214. package/mcp/context7.json +11 -0
  215. package/mcp/exa.json +11 -0
  216. package/mcp/fetch.json +17 -0
  217. package/mcp/figma.json +11 -0
  218. package/mcp/firecrawl.json +11 -0
  219. package/mcp/git.json +17 -0
  220. package/mcp/github.json +11 -0
  221. package/mcp/linear.json +11 -0
  222. package/mcp/memory.json +18 -0
  223. package/mcp/notion.json +11 -0
  224. package/mcp/playwright.json +18 -0
  225. package/mcp/sentry.json +11 -0
  226. package/mcp/stripe.json +11 -0
  227. package/mcp/supabase.json +11 -0
  228. package/mcp/time.json +17 -0
  229. package/mcp/vercel.json +11 -0
  230. package/package.json +61 -4
  231. package/profiles.json +214 -0
  232. package/rules/common.md +21 -0
  233. package/rules/cpp.md +29 -0
  234. package/rules/csharp.md +25 -0
  235. package/rules/dart.md +29 -0
  236. package/rules/fsharp.md +28 -0
  237. package/rules/git.md +26 -0
  238. package/rules/go.md +29 -0
  239. package/rules/java.md +29 -0
  240. package/rules/kotlin.md +27 -0
  241. package/rules/perl.md +26 -0
  242. package/rules/php.md +28 -0
  243. package/rules/python.md +30 -0
  244. package/rules/ruby.md +27 -0
  245. package/rules/rust.md +26 -0
  246. package/rules/security.md +29 -0
  247. package/rules/swift.md +28 -0
  248. package/rules/testing.md +25 -0
  249. package/rules/typescript.md +29 -0
  250. package/rules/use-skills.md +23 -0
  251. package/schemas/skill-frontmatter.schema.json +52 -0
  252. package/scripts/lib/audit.js +96 -0
  253. package/scripts/lib/behavior.js +52 -0
  254. package/scripts/lib/frontmatter.js +65 -0
  255. package/scripts/lib/hooks-install.js +294 -0
  256. package/scripts/lib/i18n.js +51 -0
  257. package/scripts/lib/inventory.js +85 -0
  258. package/scripts/lib/lint.js +180 -0
  259. package/scripts/lib/mcp-install.js +288 -0
  260. package/scripts/lib/profiles.js +128 -0
  261. package/scripts/lib/render.js +92 -0
  262. package/scripts/lib/rules-install.js +118 -0
  263. package/scripts/lib/skills.js +87 -0
  264. package/scripts/lib/targets.js +123 -0
  265. package/skills/accounting-api-integration/SKILL.md +81 -0
  266. package/skills/accounting-api-integration/evals/triggers.json +17 -0
  267. package/skills/accounting-api-integration/references/quickbooks.md +48 -0
  268. package/skills/accounting-api-integration/references/xero.md +45 -0
  269. package/skills/agent-failure-debugging/SKILL.md +92 -0
  270. package/skills/agent-failure-debugging/evals/triggers.json +16 -0
  271. package/skills/agent-harness-design/SKILL.md +125 -0
  272. package/skills/agent-harness-design/evals/triggers.json +21 -0
  273. package/skills/agent-outbound-messaging/SKILL.md +92 -0
  274. package/skills/agent-outbound-messaging/evals/triggers.json +16 -0
  275. package/skills/agent-security/SKILL.md +117 -0
  276. package/skills/agent-security/evals/triggers.json +16 -0
  277. package/skills/agent-security/references/host-configs.md +37 -0
  278. package/skills/ai-media-generation/SKILL.md +89 -0
  279. package/skills/ai-media-generation/evals/triggers.json +16 -0
  280. package/skills/ai-media-generation/references/job-pipeline.md +76 -0
  281. package/skills/angular-patterns/SKILL.md +122 -0
  282. package/skills/angular-patterns/evals/triggers.json +16 -0
  283. package/skills/api-client-integration/SKILL.md +86 -0
  284. package/skills/api-client-integration/evals/triggers.json +16 -0
  285. package/skills/api-client-integration/references/resilience.md +57 -0
  286. package/skills/api-design/SKILL.md +96 -0
  287. package/skills/api-design/evals/triggers.json +18 -0
  288. package/skills/api-design/references/conventions.md +133 -0
  289. package/skills/architecture-decision-records/SKILL.md +98 -0
  290. package/skills/architecture-decision-records/evals/triggers.json +17 -0
  291. package/skills/article-writing/SKILL.md +108 -0
  292. package/skills/article-writing/evals/triggers.json +16 -0
  293. package/skills/aspnet-core-patterns/SKILL.md +149 -0
  294. package/skills/aspnet-core-patterns/evals/triggers.json +16 -0
  295. package/skills/auth-patterns/SKILL.md +104 -0
  296. package/skills/auth-patterns/evals/triggers.json +17 -0
  297. package/skills/auth-patterns/references/oauth-oidc.md +64 -0
  298. package/skills/autonomous-loops/SKILL.md +99 -0
  299. package/skills/autonomous-loops/evals/triggers.json +14 -0
  300. package/skills/aws-patterns/SKILL.md +91 -0
  301. package/skills/aws-patterns/evals/triggers.json +16 -0
  302. package/skills/azure-patterns/SKILL.md +86 -0
  303. package/skills/azure-patterns/evals/triggers.json +16 -0
  304. package/skills/benchmark-methodology/SKILL.md +88 -0
  305. package/skills/benchmark-methodology/evals/triggers.json +16 -0
  306. package/skills/benchmark-methodology/references/language-harnesses.md +130 -0
  307. package/skills/bgp-diagnostics/SKILL.md +84 -0
  308. package/skills/bgp-diagnostics/evals/triggers.json +18 -0
  309. package/skills/bgp-diagnostics/references/bgp-reference.md +81 -0
  310. package/skills/bioinformatics-workflows/SKILL.md +108 -0
  311. package/skills/bioinformatics-workflows/evals/triggers.json +16 -0
  312. package/skills/bioinformatics-workflows/references/commands.md +71 -0
  313. package/skills/bioinformatics-workflows/references/formats.md +24 -0
  314. package/skills/bioinformatics-workflows/references/workflow-managers.md +107 -0
  315. package/skills/blender-automation/SKILL.md +100 -0
  316. package/skills/blender-automation/evals/triggers.json +16 -0
  317. package/skills/blender-automation/references/batch-and-render.md +77 -0
  318. package/skills/blender-automation/references/bpy-inspection.md +91 -0
  319. package/skills/blender-automation/references/rig-and-retarget-checks.md +23 -0
  320. package/skills/brand-strategy/SKILL.md +83 -0
  321. package/skills/brand-strategy/evals/triggers.json +16 -0
  322. package/skills/brand-voice/SKILL.md +112 -0
  323. package/skills/brand-voice/evals/triggers.json +16 -0
  324. package/skills/browser-qa/SKILL.md +99 -0
  325. package/skills/browser-qa/evals/triggers.json +16 -0
  326. package/skills/bun-runtime/SKILL.md +93 -0
  327. package/skills/bun-runtime/evals/triggers.json +16 -0
  328. package/skills/change-impact-analysis/SKILL.md +89 -0
  329. package/skills/change-impact-analysis/evals/triggers.json +16 -0
  330. package/skills/change-impact-analysis/references/graph-commands.md +28 -0
  331. package/skills/cisco-ios-config/SKILL.md +101 -0
  332. package/skills/cisco-ios-config/evals/triggers.json +18 -0
  333. package/skills/cisco-ios-config/references/verification.md +63 -0
  334. package/skills/clickhouse-patterns/SKILL.md +101 -0
  335. package/skills/clickhouse-patterns/evals/triggers.json +18 -0
  336. package/skills/clickhouse-patterns/references/engines-and-views.md +138 -0
  337. package/skills/clinical-decision-support/SKILL.md +90 -0
  338. package/skills/clinical-decision-support/evals/triggers.json +16 -0
  339. package/skills/clinical-decision-support/references/cds-hooks.md +76 -0
  340. package/skills/clinical-decision-support/references/regulatory-boundaries.md +37 -0
  341. package/skills/code-tour/SKILL.md +97 -0
  342. package/skills/code-tour/evals/triggers.json +14 -0
  343. package/skills/codebase-onboarding/SKILL.md +112 -0
  344. package/skills/codebase-onboarding/evals/triggers.json +14 -0
  345. package/skills/cold-outreach-sequences/SKILL.md +90 -0
  346. package/skills/cold-outreach-sequences/evals/triggers.json +16 -0
  347. package/skills/content-repurposing/SKILL.md +82 -0
  348. package/skills/content-repurposing/evals/triggers.json +16 -0
  349. package/skills/context-budget/SKILL.md +84 -0
  350. package/skills/context-budget/evals/triggers.json +14 -0
  351. package/skills/contract-drafting/SKILL.md +96 -0
  352. package/skills/contract-drafting/evals/triggers.json +16 -0
  353. package/skills/contract-drafting/references/term-sheets.md +68 -0
  354. package/skills/contract-first-development/SKILL.md +86 -0
  355. package/skills/contract-first-development/evals/triggers.json +16 -0
  356. package/skills/contract-first-development/references/tooling.md +46 -0
  357. package/skills/conventional-commits/SKILL.md +144 -0
  358. package/skills/conventional-commits/evals/triggers.json +16 -0
  359. package/skills/cpp-patterns/SKILL.md +129 -0
  360. package/skills/cpp-patterns/evals/triggers.json +16 -0
  361. package/skills/cpp-patterns/references/cmake-and-tooling.md +88 -0
  362. package/skills/cpp-patterns/references/undefined-behaviour.md +75 -0
  363. package/skills/cpp-testing/SKILL.md +131 -0
  364. package/skills/cpp-testing/evals/triggers.json +16 -0
  365. package/skills/csharp-patterns/SKILL.md +110 -0
  366. package/skills/csharp-patterns/evals/triggers.json +17 -0
  367. package/skills/csharp-patterns/references/analyzers.md +59 -0
  368. package/skills/csharp-testing/SKILL.md +85 -0
  369. package/skills/csharp-testing/evals/triggers.json +17 -0
  370. package/skills/csharp-testing/references/integration-tests.md +77 -0
  371. package/skills/css-architecture/SKILL.md +143 -0
  372. package/skills/css-architecture/evals/triggers.json +16 -0
  373. package/skills/customs-trade-compliance/SKILL.md +95 -0
  374. package/skills/customs-trade-compliance/evals/triggers.json +16 -0
  375. package/skills/customs-trade-compliance/references/incoterms-2020.md +42 -0
  376. package/skills/dart-patterns/SKILL.md +157 -0
  377. package/skills/dart-patterns/evals/triggers.json +18 -0
  378. package/skills/dart-testing/SKILL.md +164 -0
  379. package/skills/dart-testing/evals/triggers.json +18 -0
  380. package/skills/data-analysis-notebooks/SKILL.md +113 -0
  381. package/skills/data-analysis-notebooks/evals/triggers.json +16 -0
  382. package/skills/data-analysis-notebooks/references/dataframe-pitfalls.md +49 -0
  383. package/skills/data-analysis-notebooks/references/statistics-pitfalls.md +24 -0
  384. package/skills/data-pipelines/SKILL.md +90 -0
  385. package/skills/data-pipelines/evals/triggers.json +16 -0
  386. package/skills/data-pipelines/references/orchestrators.md +64 -0
  387. package/skills/database-migrations/SKILL.md +102 -0
  388. package/skills/database-migrations/evals/triggers.json +16 -0
  389. package/skills/database-migrations/references/recipes.md +98 -0
  390. package/skills/database-migrations/references/tools.md +21 -0
  391. package/skills/dbt-patterns/SKILL.md +96 -0
  392. package/skills/dbt-patterns/evals/triggers.json +16 -0
  393. package/skills/dbt-patterns/references/yaml-examples.md +114 -0
  394. package/skills/decision-council/SKILL.md +98 -0
  395. package/skills/decision-council/evals/triggers.json +16 -0
  396. package/skills/deep-research/SKILL.md +107 -0
  397. package/skills/deep-research/evals/triggers.json +14 -0
  398. package/skills/dependency-audit/SKILL.md +103 -0
  399. package/skills/dependency-audit/evals/triggers.json +16 -0
  400. package/skills/dependency-audit/references/tools.md +124 -0
  401. package/skills/deployment-strategies/SKILL.md +108 -0
  402. package/skills/deployment-strategies/evals/triggers.json +16 -0
  403. package/skills/design-brainstorming/SKILL.md +132 -0
  404. package/skills/design-brainstorming/evals/behavior.json +55 -0
  405. package/skills/design-brainstorming/evals/triggers.json +16 -0
  406. package/skills/design-brainstorming/references/visual-mockups.md +34 -0
  407. package/skills/desktop-app-testing/SKILL.md +104 -0
  408. package/skills/desktop-app-testing/evals/triggers.json +16 -0
  409. package/skills/desktop-app-testing/references/drivers.md +81 -0
  410. package/skills/django-patterns/SKILL.md +123 -0
  411. package/skills/django-patterns/evals/triggers.json +16 -0
  412. package/skills/docker-patterns/SKILL.md +132 -0
  413. package/skills/docker-patterns/evals/triggers.json +16 -0
  414. package/skills/docker-patterns/references/dockerfiles.md +105 -0
  415. package/skills/document-processing/SKILL.md +100 -0
  416. package/skills/document-processing/evals/triggers.json +17 -0
  417. package/skills/document-processing/references/extraction-and-ocr.md +71 -0
  418. package/skills/document-processing/references/forms-and-conversion.md +69 -0
  419. package/skills/document-processing/references/redaction.md +61 -0
  420. package/skills/e2e-testing-playwright/SKILL.md +94 -0
  421. package/skills/e2e-testing-playwright/evals/triggers.json +16 -0
  422. package/skills/e2e-testing-playwright/references/config-and-ci.md +129 -0
  423. package/skills/ef-core-patterns/SKILL.md +117 -0
  424. package/skills/ef-core-patterns/evals/triggers.json +16 -0
  425. package/skills/email-deliverability/SKILL.md +99 -0
  426. package/skills/email-deliverability/evals/triggers.json +17 -0
  427. package/skills/email-deliverability/references/dns-records.md +85 -0
  428. package/skills/energy-procurement/SKILL.md +106 -0
  429. package/skills/energy-procurement/evals/triggers.json +16 -0
  430. package/skills/error-handling-patterns/SKILL.md +112 -0
  431. package/skills/error-handling-patterns/evals/triggers.json +18 -0
  432. package/skills/error-handling-patterns/references/language-idioms.md +49 -0
  433. package/skills/estimation-and-scoping/SKILL.md +97 -0
  434. package/skills/estimation-and-scoping/evals/triggers.json +14 -0
  435. package/skills/evm-dapp-integration/SKILL.md +73 -0
  436. package/skills/evm-dapp-integration/evals/triggers.json +16 -0
  437. package/skills/fastapi-patterns/SKILL.md +127 -0
  438. package/skills/fastapi-patterns/evals/triggers.json +16 -0
  439. package/skills/ffmpeg-media-processing/SKILL.md +94 -0
  440. package/skills/ffmpeg-media-processing/evals/triggers.json +16 -0
  441. package/skills/ffmpeg-media-processing/references/recipes.md +112 -0
  442. package/skills/fhir-integration/SKILL.md +81 -0
  443. package/skills/fhir-integration/evals/triggers.json +16 -0
  444. package/skills/fhir-integration/references/search-and-bundles.md +73 -0
  445. package/skills/fhir-integration/references/smart-on-fhir.md +50 -0
  446. package/skills/finishing-a-branch/SKILL.md +127 -0
  447. package/skills/finishing-a-branch/evals/behavior.json +49 -0
  448. package/skills/finishing-a-branch/evals/triggers.json +16 -0
  449. package/skills/flask-patterns/SKILL.md +132 -0
  450. package/skills/flask-patterns/evals/triggers.json +16 -0
  451. package/skills/flutter-patterns/SKILL.md +99 -0
  452. package/skills/flutter-patterns/evals/triggers.json +16 -0
  453. package/skills/flutterwave-integration/SKILL.md +75 -0
  454. package/skills/flutterwave-integration/evals/triggers.json +16 -0
  455. package/skills/flutterwave-integration/references/api.md +73 -0
  456. package/skills/flutterwave-integration/references/webhooks.md +49 -0
  457. package/skills/freight-carrier-management/SKILL.md +107 -0
  458. package/skills/freight-carrier-management/evals/triggers.json +16 -0
  459. package/skills/fsharp-patterns/SKILL.md +133 -0
  460. package/skills/fsharp-patterns/evals/triggers.json +16 -0
  461. package/skills/fsharp-testing/SKILL.md +136 -0
  462. package/skills/fsharp-testing/evals/triggers.json +16 -0
  463. package/skills/gcp-patterns/SKILL.md +86 -0
  464. package/skills/gcp-patterns/evals/triggers.json +16 -0
  465. package/skills/git-workflow/SKILL.md +114 -0
  466. package/skills/git-workflow/evals/triggers.json +16 -0
  467. package/skills/git-worktrees/SKILL.md +130 -0
  468. package/skills/git-worktrees/evals/behavior.json +56 -0
  469. package/skills/git-worktrees/evals/triggers.json +16 -0
  470. package/skills/github-actions-ci/SKILL.md +117 -0
  471. package/skills/github-actions-ci/evals/triggers.json +16 -0
  472. package/skills/github-api-automation/SKILL.md +101 -0
  473. package/skills/github-api-automation/evals/triggers.json +17 -0
  474. package/skills/go-patterns/SKILL.md +118 -0
  475. package/skills/go-patterns/evals/triggers.json +17 -0
  476. package/skills/go-patterns/references/concurrency.md +162 -0
  477. package/skills/go-testing/SKILL.md +154 -0
  478. package/skills/go-testing/evals/triggers.json +17 -0
  479. package/skills/google-workspace-integration/SKILL.md +65 -0
  480. package/skills/google-workspace-integration/evals/triggers.json +17 -0
  481. package/skills/google-workspace-integration/references/api.md +121 -0
  482. package/skills/harmonyos-arkts/SKILL.md +117 -0
  483. package/skills/harmonyos-arkts/evals/triggers.json +16 -0
  484. package/skills/harmonyos-arkts/references/build-errors.md +42 -0
  485. package/skills/hexagonal-architecture/SKILL.md +89 -0
  486. package/skills/hexagonal-architecture/evals/triggers.json +17 -0
  487. package/skills/hipaa-compliance/SKILL.md +91 -0
  488. package/skills/hipaa-compliance/evals/triggers.json +18 -0
  489. package/skills/hipaa-compliance/references/safeguards.md +68 -0
  490. package/skills/hl7v2-integration/SKILL.md +69 -0
  491. package/skills/hl7v2-integration/evals/triggers.json +16 -0
  492. package/skills/hl7v2-integration/references/messages-and-ack.md +78 -0
  493. package/skills/homelab-network-setup/SKILL.md +125 -0
  494. package/skills/homelab-network-setup/evals/triggers.json +18 -0
  495. package/skills/homelab-network-setup/references/firewall-and-dns.md +45 -0
  496. package/skills/homelab-network-setup/references/wireguard.md +72 -0
  497. package/skills/hubtel-integration/SKILL.md +77 -0
  498. package/skills/hubtel-integration/evals/triggers.json +16 -0
  499. package/skills/hubtel-integration/references/api.md +92 -0
  500. package/skills/i18n-localization/SKILL.md +114 -0
  501. package/skills/i18n-localization/evals/triggers.json +16 -0
  502. package/skills/i18n-localization/references/libraries.md +52 -0
  503. package/skills/implementation-plans/SKILL.md +117 -0
  504. package/skills/implementation-plans/evals/behavior.json +54 -0
  505. package/skills/implementation-plans/evals/triggers.json +16 -0
  506. package/skills/incident-postmortem/SKILL.md +118 -0
  507. package/skills/incident-postmortem/evals/triggers.json +14 -0
  508. package/skills/inventory-demand-planning/SKILL.md +89 -0
  509. package/skills/inventory-demand-planning/evals/triggers.json +16 -0
  510. package/skills/inventory-demand-planning/references/formulas.md +62 -0
  511. package/skills/investor-materials/SKILL.md +127 -0
  512. package/skills/investor-materials/evals/triggers.json +16 -0
  513. package/skills/investor-materials/references/templates.md +74 -0
  514. package/skills/invoicing-and-tax/SKILL.md +84 -0
  515. package/skills/invoicing-and-tax/evals/triggers.json +17 -0
  516. package/skills/invoicing-and-tax/references/e-invoicing.md +24 -0
  517. package/skills/invoicing-and-tax/references/invoice-fields.md +38 -0
  518. package/skills/invoicing-and-tax/references/rounding.md +26 -0
  519. package/skills/ios-platform-features/SKILL.md +99 -0
  520. package/skills/ios-platform-features/evals/triggers.json +16 -0
  521. package/skills/ios-platform-features/references/foundation-models.md +90 -0
  522. package/skills/java-patterns/SKILL.md +141 -0
  523. package/skills/java-patterns/evals/triggers.json +17 -0
  524. package/skills/java-testing/SKILL.md +142 -0
  525. package/skills/java-testing/evals/triggers.json +16 -0
  526. package/skills/jetpack-compose-patterns/SKILL.md +88 -0
  527. package/skills/jetpack-compose-patterns/evals/triggers.json +16 -0
  528. package/skills/jira-integration/SKILL.md +92 -0
  529. package/skills/jira-integration/evals/triggers.json +17 -0
  530. package/skills/jpa-hibernate/SKILL.md +92 -0
  531. package/skills/jpa-hibernate/evals/triggers.json +18 -0
  532. package/skills/jpa-hibernate/references/mapping.md +99 -0
  533. package/skills/jvm-sql-mappers/SKILL.md +98 -0
  534. package/skills/jvm-sql-mappers/evals/triggers.json +16 -0
  535. package/skills/jvm-sql-mappers/references/examples.md +129 -0
  536. package/skills/kotlin-multiplatform/SKILL.md +97 -0
  537. package/skills/kotlin-multiplatform/evals/triggers.json +16 -0
  538. package/skills/kotlin-patterns/SKILL.md +128 -0
  539. package/skills/kotlin-patterns/evals/triggers.json +16 -0
  540. package/skills/kotlin-testing/SKILL.md +117 -0
  541. package/skills/kotlin-testing/evals/triggers.json +16 -0
  542. package/skills/ktor-patterns/SKILL.md +135 -0
  543. package/skills/ktor-patterns/evals/triggers.json +18 -0
  544. package/skills/kubernetes-patterns/SKILL.md +106 -0
  545. package/skills/kubernetes-patterns/evals/triggers.json +16 -0
  546. package/skills/kubernetes-patterns/references/manifests.md +115 -0
  547. package/skills/laravel-patterns/SKILL.md +136 -0
  548. package/skills/laravel-patterns/evals/triggers.json +16 -0
  549. package/skills/linear-integration/SKILL.md +98 -0
  550. package/skills/linear-integration/evals/triggers.json +17 -0
  551. package/skills/literature-review/SKILL.md +109 -0
  552. package/skills/literature-review/evals/triggers.json +16 -0
  553. package/skills/literature-review/references/appraisal.md +41 -0
  554. package/skills/literature-review/references/search-sources.md +39 -0
  555. package/skills/llm-app-patterns/SKILL.md +97 -0
  556. package/skills/llm-app-patterns/evals/triggers.json +17 -0
  557. package/skills/llm-evals/SKILL.md +98 -0
  558. package/skills/llm-evals/evals/triggers.json +16 -0
  559. package/skills/llm-evals/references/graders.md +66 -0
  560. package/skills/logistics-exception-management/SKILL.md +90 -0
  561. package/skills/logistics-exception-management/evals/triggers.json +16 -0
  562. package/skills/manim-animations/SKILL.md +106 -0
  563. package/skills/manim-animations/evals/triggers.json +16 -0
  564. package/skills/market-research/SKILL.md +117 -0
  565. package/skills/market-research/evals/triggers.json +16 -0
  566. package/skills/marketing-campaign/SKILL.md +111 -0
  567. package/skills/marketing-campaign/evals/triggers.json +16 -0
  568. package/skills/mcp-server-patterns/SKILL.md +127 -0
  569. package/skills/mcp-server-patterns/evals/triggers.json +18 -0
  570. package/skills/mcp-server-patterns/references/protocol-notes.md +68 -0
  571. package/skills/metrics-dashboards/SKILL.md +113 -0
  572. package/skills/metrics-dashboards/evals/triggers.json +16 -0
  573. package/skills/ml-experiment-workflow/SKILL.md +125 -0
  574. package/skills/ml-experiment-workflow/evals/triggers.json +16 -0
  575. package/skills/mobile-accessibility/SKILL.md +94 -0
  576. package/skills/mobile-accessibility/evals/triggers.json +16 -0
  577. package/skills/mongodb-patterns/SKILL.md +115 -0
  578. package/skills/mongodb-patterns/evals/triggers.json +18 -0
  579. package/skills/mongodb-patterns/references/indexes-and-aggregation.md +94 -0
  580. package/skills/mpesa-daraja-integration/SKILL.md +70 -0
  581. package/skills/mpesa-daraja-integration/evals/triggers.json +16 -0
  582. package/skills/mpesa-daraja-integration/references/api.md +103 -0
  583. package/skills/mpesa-daraja-integration/references/callbacks.md +74 -0
  584. package/skills/mtn-momo-integration/SKILL.md +66 -0
  585. package/skills/mtn-momo-integration/evals/triggers.json +16 -0
  586. package/skills/mtn-momo-integration/references/api.md +153 -0
  587. package/skills/mtn-momo-integration/references/callbacks.md +92 -0
  588. package/skills/mtn-momo-integration/references/sandbox-and-go-live.md +51 -0
  589. package/skills/mtn-momo-integration/scripts/sandbox-setup.js +79 -0
  590. package/skills/mysql-patterns/SKILL.md +96 -0
  591. package/skills/mysql-patterns/evals/triggers.json +16 -0
  592. package/skills/mysql-patterns/references/explain.md +34 -0
  593. package/skills/mysql-patterns/references/online-ddl.md +41 -0
  594. package/skills/nestjs-patterns/SKILL.md +114 -0
  595. package/skills/nestjs-patterns/evals/triggers.json +16 -0
  596. package/skills/nestjs-patterns/references/testing.md +68 -0
  597. package/skills/network-automation/SKILL.md +107 -0
  598. package/skills/network-automation/evals/triggers.json +18 -0
  599. package/skills/network-automation/references/tool-snippets.md +153 -0
  600. package/skills/network-design/SKILL.md +98 -0
  601. package/skills/network-design/evals/triggers.json +16 -0
  602. package/skills/network-troubleshooting/SKILL.md +152 -0
  603. package/skills/network-troubleshooting/evals/triggers.json +18 -0
  604. package/skills/network-troubleshooting/references/commands.md +33 -0
  605. package/skills/nextjs-patterns/SKILL.md +150 -0
  606. package/skills/nextjs-patterns/evals/triggers.json +18 -0
  607. package/skills/nextjs-patterns/references/caching.md +87 -0
  608. package/skills/node-backend-patterns/SKILL.md +103 -0
  609. package/skills/node-backend-patterns/evals/triggers.json +16 -0
  610. package/skills/node-backend-patterns/references/templates.md +122 -0
  611. package/skills/nuxt-patterns/SKILL.md +103 -0
  612. package/skills/nuxt-patterns/evals/triggers.json +16 -0
  613. package/skills/observability/SKILL.md +125 -0
  614. package/skills/observability/evals/triggers.json +17 -0
  615. package/skills/observability/references/otel-setup.md +87 -0
  616. package/skills/observability/references/slo-alerts.md +70 -0
  617. package/skills/open-source-release/SKILL.md +107 -0
  618. package/skills/open-source-release/evals/triggers.json +15 -0
  619. package/skills/open-source-release/references/history-scrub.md +65 -0
  620. package/skills/parallel-agent-orchestration/SKILL.md +106 -0
  621. package/skills/parallel-agent-orchestration/evals/triggers.json +14 -0
  622. package/skills/patent-research/SKILL.md +94 -0
  623. package/skills/patent-research/evals/triggers.json +16 -0
  624. package/skills/patent-research/references/databases-and-queries.md +52 -0
  625. package/skills/paystack-integration/SKILL.md +59 -0
  626. package/skills/paystack-integration/evals/triggers.json +14 -0
  627. package/skills/paystack-integration/references/api.md +73 -0
  628. package/skills/paystack-integration/references/mobile-money.md +50 -0
  629. package/skills/paystack-integration/references/webhooks.md +80 -0
  630. package/skills/pci-dss-scope/SKILL.md +103 -0
  631. package/skills/pci-dss-scope/evals/triggers.json +18 -0
  632. package/skills/pci-dss-scope/references/saq-and-data.md +36 -0
  633. package/skills/perl-patterns/SKILL.md +135 -0
  634. package/skills/perl-patterns/evals/triggers.json +18 -0
  635. package/skills/perl-testing/SKILL.md +126 -0
  636. package/skills/perl-testing/evals/triggers.json +17 -0
  637. package/skills/php-patterns/SKILL.md +116 -0
  638. package/skills/php-patterns/evals/triggers.json +16 -0
  639. package/skills/php-testing/SKILL.md +123 -0
  640. package/skills/php-testing/evals/triggers.json +16 -0
  641. package/skills/postgres-patterns/SKILL.md +103 -0
  642. package/skills/postgres-patterns/evals/triggers.json +17 -0
  643. package/skills/postgres-patterns/references/explain.md +59 -0
  644. package/skills/postgres-patterns/references/locks.md +53 -0
  645. package/skills/prd-writing/SKILL.md +124 -0
  646. package/skills/prd-writing/evals/triggers.json +15 -0
  647. package/skills/prisma-patterns/SKILL.md +83 -0
  648. package/skills/prisma-patterns/evals/triggers.json +18 -0
  649. package/skills/prisma-patterns/references/prisma-8.md +46 -0
  650. package/skills/prisma-patterns/references/workflow.md +50 -0
  651. package/skills/privacy-compliance/SKILL.md +121 -0
  652. package/skills/privacy-compliance/evals/triggers.json +18 -0
  653. package/skills/privacy-compliance/references/jurisdictions.md +51 -0
  654. package/skills/production-scheduling/SKILL.md +98 -0
  655. package/skills/production-scheduling/evals/triggers.json +16 -0
  656. package/skills/prompt-engineering/SKILL.md +92 -0
  657. package/skills/prompt-engineering/evals/triggers.json +16 -0
  658. package/skills/prospect-research/SKILL.md +87 -0
  659. package/skills/prospect-research/evals/triggers.json +16 -0
  660. package/skills/python-app-distribution/SKILL.md +107 -0
  661. package/skills/python-app-distribution/evals/triggers.json +16 -0
  662. package/skills/python-app-distribution/references/pypi-trusted-publishing.md +55 -0
  663. package/skills/python-app-distribution/references/windows-macos-signing.md +70 -0
  664. package/skills/python-patterns/SKILL.md +107 -0
  665. package/skills/python-patterns/evals/triggers.json +16 -0
  666. package/skills/python-patterns/references/tooling.md +101 -0
  667. package/skills/python-testing/SKILL.md +126 -0
  668. package/skills/python-testing/evals/triggers.json +16 -0
  669. package/skills/python-testing/references/mocking.md +71 -0
  670. package/skills/pytorch-patterns/SKILL.md +139 -0
  671. package/skills/pytorch-patterns/evals/triggers.json +16 -0
  672. package/skills/pytorch-patterns/references/debugging.md +39 -0
  673. package/skills/quality-nonconformance/SKILL.md +107 -0
  674. package/skills/quality-nonconformance/evals/triggers.json +16 -0
  675. package/skills/quality-nonconformance/references/8d-and-capa.md +46 -0
  676. package/skills/quarkus-patterns/SKILL.md +93 -0
  677. package/skills/quarkus-patterns/evals/triggers.json +18 -0
  678. package/skills/rag-pipeline-patterns/SKILL.md +117 -0
  679. package/skills/rag-pipeline-patterns/evals/triggers.json +18 -0
  680. package/skills/rag-pipeline-patterns/references/evaluation.md +37 -0
  681. package/skills/rag-pipeline-patterns/references/retrieval-recipes.md +78 -0
  682. package/skills/rails-patterns/SKILL.md +132 -0
  683. package/skills/rails-patterns/evals/triggers.json +16 -0
  684. package/skills/react-native-patterns/SKILL.md +101 -0
  685. package/skills/react-native-patterns/evals/triggers.json +16 -0
  686. package/skills/react-patterns/SKILL.md +140 -0
  687. package/skills/react-patterns/evals/triggers.json +18 -0
  688. package/skills/react-performance/SKILL.md +107 -0
  689. package/skills/react-performance/evals/triggers.json +18 -0
  690. package/skills/react-testing/SKILL.md +121 -0
  691. package/skills/react-testing/evals/triggers.json +18 -0
  692. package/skills/react-testing/references/msw.md +64 -0
  693. package/skills/react-testing/references/queries.md +41 -0
  694. package/skills/react-testing/references/setup.md +74 -0
  695. package/skills/recommender-systems/SKILL.md +119 -0
  696. package/skills/recommender-systems/evals/triggers.json +16 -0
  697. package/skills/recommender-systems/references/evaluation.md +39 -0
  698. package/skills/redis-patterns/SKILL.md +109 -0
  699. package/skills/redis-patterns/evals/triggers.json +18 -0
  700. package/skills/redis-patterns/references/operations.md +61 -0
  701. package/skills/refactoring-safely/SKILL.md +107 -0
  702. package/skills/refactoring-safely/evals/behavior.json +57 -0
  703. package/skills/refactoring-safely/evals/triggers.json +17 -0
  704. package/skills/release-management/SKILL.md +141 -0
  705. package/skills/release-management/evals/triggers.json +16 -0
  706. package/skills/remotion-video/SKILL.md +91 -0
  707. package/skills/remotion-video/evals/triggers.json +16 -0
  708. package/skills/remotion-video/references/lambda.md +66 -0
  709. package/skills/reproducible-dev-environments/SKILL.md +132 -0
  710. package/skills/reproducible-dev-environments/evals/triggers.json +16 -0
  711. package/skills/responding-to-code-review/SKILL.md +124 -0
  712. package/skills/responding-to-code-review/evals/behavior.json +54 -0
  713. package/skills/responding-to-code-review/evals/triggers.json +16 -0
  714. package/skills/returns-reverse-logistics/SKILL.md +97 -0
  715. package/skills/returns-reverse-logistics/evals/triggers.json +16 -0
  716. package/skills/ruby-patterns/SKILL.md +127 -0
  717. package/skills/ruby-patterns/evals/triggers.json +18 -0
  718. package/skills/ruby-testing/SKILL.md +113 -0
  719. package/skills/ruby-testing/evals/triggers.json +18 -0
  720. package/skills/runbook-writing/SKILL.md +101 -0
  721. package/skills/runbook-writing/evals/triggers.json +14 -0
  722. package/skills/rust-patterns/SKILL.md +118 -0
  723. package/skills/rust-patterns/evals/triggers.json +16 -0
  724. package/skills/rust-patterns/references/cargo-and-clippy.md +105 -0
  725. package/skills/rust-patterns/references/errors-and-traits.md +97 -0
  726. package/skills/rust-testing/SKILL.md +148 -0
  727. package/skills/rust-testing/evals/triggers.json +16 -0
  728. package/skills/rust-testing/references/fakes-proptest-async.md +113 -0
  729. package/skills/search-first/SKILL.md +73 -0
  730. package/skills/search-first/evals/triggers.json +14 -0
  731. package/skills/security-review/SKILL.md +58 -0
  732. package/skills/security-review/evals/behavior.json +56 -0
  733. package/skills/security-review/evals/triggers.json +14 -0
  734. package/skills/security-review/references/checklist.md +54 -0
  735. package/skills/security-review/scripts/scan-secrets.js +79 -0
  736. package/skills/seo-audit/SKILL.md +111 -0
  737. package/skills/seo-audit/evals/triggers.json +16 -0
  738. package/skills/seo-audit/references/checks.md +65 -0
  739. package/skills/session-handoff/SKILL.md +101 -0
  740. package/skills/session-handoff/evals/behavior.json +55 -0
  741. package/skills/session-handoff/evals/triggers.json +14 -0
  742. package/skills/skill-authoring/SKILL.md +98 -0
  743. package/skills/skill-authoring/evals/triggers.json +15 -0
  744. package/skills/skill-authoring/references/frontmatter.md +40 -0
  745. package/skills/skill-authoring/references/pressure-testing.md +87 -0
  746. package/skills/slack-app-integration/SKILL.md +108 -0
  747. package/skills/slack-app-integration/evals/triggers.json +17 -0
  748. package/skills/slide-decks/SKILL.md +107 -0
  749. package/skills/slide-decks/evals/triggers.json +18 -0
  750. package/skills/slide-decks/references/html-decks.md +86 -0
  751. package/skills/slide-decks/references/layouts.md +45 -0
  752. package/skills/slide-decks/references/pptx.md +87 -0
  753. package/skills/smart-contract-security/SKILL.md +110 -0
  754. package/skills/smart-contract-security/evals/triggers.json +16 -0
  755. package/skills/smart-contract-security/references/vulnerability-checklist.md +79 -0
  756. package/skills/social-media-publishing/SKILL.md +84 -0
  757. package/skills/social-media-publishing/evals/triggers.json +17 -0
  758. package/skills/social-media-publishing/references/platform-apis.md +116 -0
  759. package/skills/solidity-patterns/SKILL.md +95 -0
  760. package/skills/solidity-patterns/evals/triggers.json +16 -0
  761. package/skills/spring-boot-patterns/SKILL.md +128 -0
  762. package/skills/spring-boot-patterns/evals/triggers.json +18 -0
  763. package/skills/spring-boot-patterns/references/testing.md +72 -0
  764. package/skills/stripe-integration/SKILL.md +69 -0
  765. package/skills/stripe-integration/evals/triggers.json +16 -0
  766. package/skills/stripe-integration/references/api.md +71 -0
  767. package/skills/stripe-integration/references/billing.md +58 -0
  768. package/skills/stripe-integration/references/webhooks.md +76 -0
  769. package/skills/subagent-driven-development/SKILL.md +109 -0
  770. package/skills/subagent-driven-development/evals/behavior.json +53 -0
  771. package/skills/subagent-driven-development/evals/triggers.json +15 -0
  772. package/skills/subagent-driven-development/references/implementer-brief.md +60 -0
  773. package/skills/subagent-driven-development/references/reviewer-briefs.md +52 -0
  774. package/skills/subscription-billing-ops/SKILL.md +118 -0
  775. package/skills/subscription-billing-ops/evals/triggers.json +17 -0
  776. package/skills/subscription-billing-ops/references/proration.md +47 -0
  777. package/skills/subscription-billing-ops/references/revenue-metrics.md +38 -0
  778. package/skills/svelte-patterns/SKILL.md +122 -0
  779. package/skills/svelte-patterns/evals/triggers.json +16 -0
  780. package/skills/swift-patterns/SKILL.md +113 -0
  781. package/skills/swift-patterns/evals/triggers.json +16 -0
  782. package/skills/swift-patterns/references/concurrency-migration.md +40 -0
  783. package/skills/swift-testing/SKILL.md +121 -0
  784. package/skills/swift-testing/evals/triggers.json +16 -0
  785. package/skills/swift-testing/references/swift-testing-cheatsheet.md +81 -0
  786. package/skills/swiftui-patterns/SKILL.md +102 -0
  787. package/skills/swiftui-patterns/evals/triggers.json +16 -0
  788. package/skills/systematic-debugging/SKILL.md +92 -0
  789. package/skills/systematic-debugging/evals/behavior.json +59 -0
  790. package/skills/systematic-debugging/evals/triggers.json +16 -0
  791. package/skills/systematic-debugging/references/condition-waiting.md +52 -0
  792. package/skills/systematic-debugging/references/root-cause-tracing.md +49 -0
  793. package/skills/systematic-debugging/references/test-pollution.md +46 -0
  794. package/skills/tdd-workflow/SKILL.md +69 -0
  795. package/skills/tdd-workflow/evals/behavior.json +55 -0
  796. package/skills/tdd-workflow/evals/triggers.json +15 -0
  797. package/skills/tdd-workflow/references/testing-anti-patterns.md +87 -0
  798. package/skills/technical-writing/SKILL.md +95 -0
  799. package/skills/technical-writing/evals/triggers.json +14 -0
  800. package/skills/terraform-patterns/SKILL.md +122 -0
  801. package/skills/terraform-patterns/evals/triggers.json +16 -0
  802. package/skills/terraform-patterns/references/backends.md +67 -0
  803. package/skills/test-coverage-improvement/SKILL.md +107 -0
  804. package/skills/test-coverage-improvement/evals/triggers.json +16 -0
  805. package/skills/threat-modeling/SKILL.md +113 -0
  806. package/skills/threat-modeling/evals/triggers.json +16 -0
  807. package/skills/transactional-email/SKILL.md +68 -0
  808. package/skills/transactional-email/evals/triggers.json +17 -0
  809. package/skills/transactional-email/references/providers.md +63 -0
  810. package/skills/typescript-patterns/SKILL.md +122 -0
  811. package/skills/typescript-patterns/evals/triggers.json +16 -0
  812. package/skills/typescript-testing/SKILL.md +101 -0
  813. package/skills/typescript-testing/evals/triggers.json +16 -0
  814. package/skills/ui-demo-recording/SKILL.md +93 -0
  815. package/skills/ui-demo-recording/evals/triggers.json +16 -0
  816. package/skills/ui-demo-recording/references/cursor-and-captions.md +48 -0
  817. package/skills/ui-demo-recording/references/playwright-recording.md +63 -0
  818. package/skills/ui-demo-recording/references/post-processing.md +57 -0
  819. package/skills/ui-design-polish/SKILL.md +113 -0
  820. package/skills/ui-design-polish/evals/triggers.json +18 -0
  821. package/skills/ui-design-polish/references/detail-checklist.md +45 -0
  822. package/skills/ui-design-polish/references/tokens.md +68 -0
  823. package/skills/ui-flow-audit/SKILL.md +112 -0
  824. package/skills/ui-flow-audit/evals/triggers.json +17 -0
  825. package/skills/ui-motion/SKILL.md +103 -0
  826. package/skills/ui-motion/evals/triggers.json +18 -0
  827. package/skills/ui-motion/references/patterns.md +138 -0
  828. package/skills/ui-motion/references/tokens.md +52 -0
  829. package/skills/unicode-text-processing/SKILL.md +103 -0
  830. package/skills/unicode-text-processing/evals/triggers.json +17 -0
  831. package/skills/unicode-text-processing/references/apis.md +89 -0
  832. package/skills/unicode-text-processing/references/script-notes.md +50 -0
  833. package/skills/verification-loop/SKILL.md +70 -0
  834. package/skills/verification-loop/evals/behavior.json +52 -0
  835. package/skills/verification-loop/evals/triggers.json +14 -0
  836. package/skills/verification-loop/scripts/detect-checks.js +102 -0
  837. package/skills/video-editing/SKILL.md +111 -0
  838. package/skills/video-editing/evals/triggers.json +16 -0
  839. package/skills/video-editing/references/edl-and-logging.md +44 -0
  840. package/skills/video-editing/references/ffmpeg-edit-recipes.md +92 -0
  841. package/skills/video-editing/references/resolve-scripting.md +53 -0
  842. package/skills/vite-patterns/SKILL.md +117 -0
  843. package/skills/vite-patterns/evals/triggers.json +16 -0
  844. package/skills/vue-patterns/SKILL.md +104 -0
  845. package/skills/vue-patterns/evals/triggers.json +16 -0
  846. package/skills/web-accessibility/SKILL.md +119 -0
  847. package/skills/web-accessibility/evals/triggers.json +16 -0
  848. package/skills/web-performance/SKILL.md +107 -0
  849. package/skills/web-performance/evals/triggers.json +16 -0
  850. package/skills/web-scraping/SKILL.md +80 -0
  851. package/skills/web-scraping/evals/triggers.json +16 -0
@@ -0,0 +1,141 @@
1
+ ---
2
+ name: java-patterns
3
+ description: Idiomatic modern Java (17 and 21 LTS and later) for writing and restructuring code with records, sealed interfaces, switch pattern matching, Optional, streams, checked versus unchecked exceptions, immutable collections, virtual threads and a standard Maven or Gradle layout. Use when writing new Java classes, modernising pre-17 Java code, choosing between a record, enum or sealed hierarchy, or deciding how to run blocking work concurrently on the JVM.
4
+ license: MIT
5
+ compatibility: Any Agent Skills host. Needs a JDK 17 or newer and the project's Maven or Gradle build.
6
+ metadata:
7
+ kete-loom/version: "0.1.0"
8
+ kete-loom/category: coding
9
+ kete-loom/risk: writes-files
10
+ kete-loom/requires: "java"
11
+ kete-loom/owner: "Kete-org"
12
+ ---
13
+
14
+ # Modern Java patterns
15
+
16
+ Write Java that the compiler checks for you: model data with types, make illegal states unrepresentable, and keep mutation local.
17
+
18
+ ## 0. Before you write
19
+
20
+ 1. Find the language level the build actually uses: `maven.compiler.release` or `<release>` in `pom.xml`, or `java { toolchain { languageVersion = ... } }` / `options.release` in `build.gradle(.kts)`. Use only features that level allows. Never raise it without asking the user.
21
+ 2. Match the codebase: if it already uses Lombok, Vavr, Guava or a null-annotation library (JSpecify, JetBrains, Checker Framework), follow that convention rather than mixing styles.
22
+ 3. Feature floor, by release: records (16), sealed classes (17), pattern matching for `switch` and record patterns (21), virtual threads (21), unnamed variables `_` (22), scoped values (25). Preview features need `--enable-preview`; don't introduce them unless the project already does.
23
+
24
+ ## 1. Model data
25
+
26
+ | Need | Use |
27
+ |---|---|
28
+ | Immutable value with fields, equality by value | `record` |
29
+ | Fixed set of constants | `enum` |
30
+ | One of several shapes with different data | `sealed interface` + `record` implementations |
31
+ | Mutable entity with identity (JPA entity, builder state) | ordinary class |
32
+
33
+ - Validate in the record's compact constructor and copy mutable inputs: `this.items = List.copyOf(items);`.
34
+ - A record's `equals`, `hashCode` and `toString` are generated. If a record holds an array, they compare by reference; prefer a `List`.
35
+ - Don't use records for JPA entities: they need a no-arg constructor, mutability and proxying.
36
+ - Keep sealed hierarchies in one package (or one module) and list `permits` only when the subtypes live in other files.
37
+
38
+ ```java
39
+ sealed interface Payment permits Card, MobileMoney, Cash {}
40
+ record Card(String last4, Money amount) implements Payment {}
41
+ record MobileMoney(String msisdn, Money amount) implements Payment {}
42
+ record Cash(Money amount) implements Payment {}
43
+
44
+ String describe(Payment p) {
45
+ return switch (p) { // exhaustive: no default needed
46
+ case Card c -> "card ending " + c.last4();
47
+ case MobileMoney(var msisdn, var amt) -> "MoMo " + msisdn;
48
+ case Cash cash -> "cash";
49
+ };
50
+ }
51
+ ```
52
+
53
+ Leave `default` out of a switch over a sealed type, so adding a subtype becomes a compile error at every switch that must handle it.
54
+
55
+ ## 2. Null and Optional
56
+
57
+ 1. Return `Optional<T>` from methods where "no result" is a normal outcome (lookups). Never return `null` from a method declared to return `Optional`.
58
+ 2. Don't use `Optional` for fields, parameters or collection elements. Return an empty collection, never `null`.
59
+ 3. Consume with `map`, `filter`, `orElse`, `orElseGet` (when the default is expensive), `orElseThrow`. Avoid `isPresent()` + `get()`.
60
+ 4. Check arguments at public boundaries: `Objects.requireNonNull(x, "x")`.
61
+ 5. `Map.get` returns `null` for missing keys; use `getOrDefault`, `computeIfAbsent` or `containsKey` deliberately.
62
+
63
+ ## 3. Collections and streams
64
+
65
+ - Prefer `List.of`, `Set.of`, `Map.of` and `List.copyOf` for immutable results. They reject `null` elements and throw on mutation.
66
+ - `stream().toList()` (16+) returns an unmodifiable list; `Collectors.toList()` makes no such promise. Pick deliberately when callers mutate the result.
67
+ - Use a stream when the pipeline reads clearly (filter, map, collect). Use a loop when you need early exit with side effects, checked exceptions, or index arithmetic.
68
+ - Never mutate shared state from inside `map` or `forEach` in a stream. Collect instead.
69
+ - `Collectors.toMap` throws on duplicate keys; pass a merge function when duplicates are possible.
70
+ - Don't add `.parallel()` without measuring; it runs on the common ForkJoinPool and rarely helps I/O-bound work.
71
+
72
+ ## 4. Exceptions
73
+
74
+ 1. Throw unchecked exceptions for programming errors and for failures callers can't reasonably recover from. Use checked exceptions only when the caller must handle the case.
75
+ 2. Never swallow: an empty `catch`, or `catch (Exception e) { log.error(e.getMessage()); }`, hides the stack trace. Log the exception object, or rethrow wrapped with the cause: `throw new OrderException("charge failed for " + id, e);`.
76
+ 3. Catch the narrowest type. Don't catch `Throwable` or `Error`.
77
+ 4. Use try-with-resources for anything `AutoCloseable` (streams, JDBC connections, `ExecutorService` on 19+).
78
+ 5. On `InterruptedException`, restore the flag (`Thread.currentThread().interrupt()`) before rethrowing or returning.
79
+
80
+ ## 5. Immutability and equality
81
+
82
+ - Make fields `final` by default. Expose no setters unless a framework needs them.
83
+ - If you override `equals`, override `hashCode` with the same fields. Never use mutable fields in either for objects stored in a `HashSet` or as `HashMap` keys.
84
+ - Compare strings and boxed numbers with `equals`, never `==`. Compare `BigDecimal` values with `compareTo`, because `equals` also compares scale.
85
+ - Use `BigDecimal` (or integer minor units) for money, never `double`.
86
+
87
+ ## 6. Concurrency
88
+
89
+ Choose by workload:
90
+
91
+ | Workload | Use |
92
+ |---|---|
93
+ | Many blocking tasks (HTTP calls, JDBC, file I/O) on 21+ | virtual threads: `Executors.newVirtualThreadPerTaskExecutor()` |
94
+ | CPU-bound work | a fixed pool sized near `Runtime.getRuntime().availableProcessors()` |
95
+ | Composing async results | `CompletableFuture` with an explicit executor |
96
+ | Shared counters / maps | `AtomicLong`, `LongAdder`, `ConcurrentHashMap` |
97
+
98
+ ```java
99
+ try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {
100
+ List<Future<Quote>> futures = suppliers.stream()
101
+ .map(s -> executor.submit(() -> s.fetchQuote(order)))
102
+ .toList();
103
+ // close() waits for all tasks
104
+ }
105
+ ```
106
+
107
+ Virtual thread rules:
108
+
109
+ 1. Create one per task; never pool them.
110
+ 2. Limit access to scarce resources (database connections, rate-limited APIs) with a `Semaphore`, not by shrinking a pool.
111
+ 3. Avoid large `ThreadLocal` caches; with millions of threads they multiply memory.
112
+ 4. On JDK 21 to 23, blocking inside `synchronized` pins the carrier thread; use `ReentrantLock` around blocking calls. JDK 24+ removed most of that pinning (JEP 491).
113
+ 5. Virtual threads don't make CPU-bound code faster.
114
+
115
+ General rules: guard every piece of shared mutable state with one lock or make it immutable; never call `Thread.stop`; never block inside a `CompletableFuture` callback on the common pool; give threads and executors names for diagnostics.
116
+
117
+ ## 7. Build layout
118
+
119
+ - Maven and Gradle share the layout: `src/main/java`, `src/main/resources`, `src/test/java`, `src/test/resources`. Packages follow reversed domain names (`com.example.orders`).
120
+ - Use the wrapper the repo ships (`./mvnw`, `./gradlew`), never a globally installed version.
121
+ - Set the language level with `release` (Maven `maven.compiler.release`, Gradle toolchains) rather than `source`/`target`, so the compiler also checks the JDK API level.
122
+ - Pin dependency versions in one place: Maven `<dependencyManagement>` or a BOM; Gradle version catalogs (`gradle/libs.versions.toml`) or platforms.
123
+ - Common commands: `./mvnw -q verify`, `./gradlew build`, `./mvnw dependency:tree`, `./gradlew dependencies --configuration runtimeClasspath`.
124
+
125
+ ## Never
126
+
127
+ - Return `null` for a collection or an `Optional`.
128
+ - Use raw types (`List` instead of `List<String>`).
129
+ - Catch an exception just to log and continue as if it succeeded.
130
+ - Add a dependency for something the JDK already does (`java.net.http.HttpClient`, `java.time`, `HexFormat`).
131
+ - Use `java.util.Date` or `Calendar` in new code; use `java.time` (`Instant`, `LocalDate`, `ZonedDateTime`).
132
+
133
+ ## Stop and ask the user
134
+
135
+ - Before raising the Java release level, adding Lombok, or enabling preview features.
136
+ - Before changing a public API's signature that other modules or services call.
137
+ - When moving existing thread-pool code to virtual threads in a service that holds locks or `ThreadLocal` state you can't fully trace.
138
+
139
+ ## Finish
140
+
141
+ Compile and run the tests with the project's build command. Report what changed, the Java level you targeted, and anything you left on an older pattern on purpose.
@@ -0,0 +1,17 @@
1
+ {
2
+ "should_trigger": [
3
+ "Convert these Java DTO classes to records and use a sealed interface for the payment types",
4
+ "What's the idiomatic way to handle a lookup that may return nothing in Java 21, Optional or null?",
5
+ "Our Spring service makes 200 blocking HTTP calls per request, should I use virtual threads?",
6
+ "Modernise this Java 8 code to Java 17: switch expressions, streams, immutable collections",
7
+ "Should this Java hierarchy be an enum, a record or a sealed interface?"
8
+ ],
9
+ "should_not_trigger": [
10
+ "Write JUnit 5 tests with Mockito for the OrderService class",
11
+ "Maven fails with 'package javax.annotation does not exist' after upgrading to JDK 21, fix the build",
12
+ "Review my Java pull request for resource leaks and equals/hashCode bugs",
13
+ "Convert this Java data class to an idiomatic Kotlin data class",
14
+ "Set up Spring Boot auto-configuration and a REST controller for orders",
15
+ "Map this JPA entity with a lazy OneToMany and fix the N+1 queries in the order list"
16
+ ]
17
+ }
@@ -0,0 +1,142 @@
1
+ ---
2
+ name: java-testing
3
+ description: Writes and repairs JVM tests in Java with JUnit Jupiter, AssertJ assertions, Mockito mocks, parameterized cases, Testcontainers-backed integration tests and Spring Boot test slices, and tracks down flaky tests. Use when adding unit or integration tests to a Java project, choosing between a mock and a real database container, speeding up a slow Java test suite, or diagnosing a JUnit test that passes locally and fails in CI.
4
+ license: MIT
5
+ compatibility: Any Agent Skills host. Needs a JDK and the project's Maven or Gradle build; Testcontainers needs a running Docker-compatible engine.
6
+ metadata:
7
+ kete-loom/version: "0.1.0"
8
+ kete-loom/category: testing
9
+ kete-loom/risk: runs-commands
10
+ kete-loom/requires: "java"
11
+ kete-loom/owner: "Kete-org"
12
+ ---
13
+
14
+ # Java testing
15
+
16
+ Tests that state behaviour, fail for one reason, and run the same way on every machine.
17
+
18
+ ## 0. Before you start
19
+
20
+ 1. Find the test stack in the build file: `junit-jupiter` (JUnit 5, or JUnit 6 which needs Java 17+), `junit:junit` (JUnit 4), `assertj-core`, `mockito-core` / `mockito-junit-jupiter`, `org.testcontainers`, `spring-boot-starter-test`. Use what is there; don't add a second assertion or mocking library.
21
+ 2. Find how tests run: `./mvnw test` (Surefire, unit), `./mvnw verify` (Failsafe, `*IT` classes), `./gradlew test`. Run one class with `./mvnw test -Dtest=OrderServiceTest` or `./gradlew test --tests 'com.example.OrderServiceTest'`.
22
+ 3. Run the suite once and record the result. If it already fails, stop and tell the user which tests fail before you change anything.
23
+
24
+ ## 1. Pick the test level
25
+
26
+ | What you're testing | Level | Tools |
27
+ |---|---|---|
28
+ | Pure logic, value objects, mappers | unit | JUnit + AssertJ, no mocks |
29
+ | A class with collaborators you own | unit | Mockito for the collaborators at the boundary |
30
+ | SQL, migrations, repository queries | integration | Testcontainers with the real database engine |
31
+ | HTTP layer only (Spring) | slice | `@WebMvcTest` + `MockMvc` |
32
+ | JPA repositories only (Spring) | slice | `@DataJpaTest` + Testcontainers |
33
+ | Whole service wiring | integration | `@SpringBootTest`, used sparingly |
34
+
35
+ Rules: don't mock what you don't own (wrap the third-party client and mock the wrapper, or use a fake server); don't mock value objects or records; don't test a database with H2 when production runs PostgreSQL or MySQL, because dialect differences hide bugs.
36
+
37
+ ## 2. Write the test
38
+
39
+ ```java
40
+ class PriceCalculatorTest {
41
+ private final PriceCalculator calc = new PriceCalculator(new FixedTaxRate("0.15"));
42
+
43
+ @Test
44
+ void appliesTaxToSubtotal() {
45
+ Money total = calc.total(List.of(item("10.00"), item("5.00")));
46
+ assertThat(total).isEqualTo(Money.of("17.25"));
47
+ }
48
+
49
+ @ParameterizedTest
50
+ @CsvSource({"0, 0.00", "1, 1.15", "100, 115.00"})
51
+ void scalesLinearly(int qty, String expected) {
52
+ assertThat(calc.total(List.of(item("1.00", qty)))).isEqualTo(Money.of(expected));
53
+ }
54
+
55
+ @Test
56
+ void rejectsEmptyCart() {
57
+ assertThatThrownBy(() -> calc.total(List.of()))
58
+ .isInstanceOf(IllegalArgumentException.class)
59
+ .hasMessageContaining("empty");
60
+ }
61
+ }
62
+ ```
63
+
64
+ - One behaviour per test; name it for the behaviour (`rejectsEmptyCart`), or use `@DisplayName`.
65
+ - Arrange, act, assert, in that order, with no logic (loops, ifs) in the test.
66
+ - Prefer AssertJ (`assertThat(list).containsExactly(...)`, `extracting`, `satisfies`) over bare `assertTrue`, so failures print the values.
67
+ - Parameterize instead of copy-pasting: `@ValueSource`, `@CsvSource`, `@MethodSource`, `@EnumSource`.
68
+ - Test classes and methods can be package-private in JUnit Jupiter; don't add `public`.
69
+
70
+ ## 3. Mockito
71
+
72
+ ```java
73
+ @ExtendWith(MockitoExtension.class)
74
+ class CheckoutServiceTest {
75
+ @Mock PaymentGateway gateway;
76
+ @InjectMocks CheckoutService service;
77
+
78
+ @Test
79
+ void chargesOnceForOrderTotal() {
80
+ when(gateway.charge(any())).thenReturn(ChargeResult.ok("ref-1"));
81
+ service.checkout(order("25.50"));
82
+ verify(gateway).charge(argThat(c -> c.amount().equals(Money.of("25.50"))));
83
+ verifyNoMoreInteractions(gateway);
84
+ }
85
+ }
86
+ ```
87
+
88
+ - `MockitoExtension` uses strict stubs: an unused `when(...)` fails the test. Remove the stub rather than switching to lenient.
89
+ - Stub return values for queries; `verify` only commands (calls whose side effect is the point).
90
+ - Use `ArgumentCaptor` when you need to assert several fields of an argument.
91
+ - Mockito 5 uses the inline mock maker by default, so final classes and records can be mocked; mock them only when there is no simpler real instance.
92
+ - On JDK 21+, Mockito's self-attaching agent prints a dynamic agent loading warning; the fix is to pass the `mockito-core` jar as `-javaagent` in the Surefire `argLine` or Gradle `jvmArgs`. Check Mockito's current docs for the exact snippet.
93
+
94
+ ## 4. Integration tests with Testcontainers
95
+
96
+ ```java
97
+ @Testcontainers
98
+ class OrderRepositoryIT {
99
+ @Container
100
+ static PostgreSQLContainer db = new PostgreSQLContainer("postgres:16-alpine");
101
+ // connect with db.getJdbcUrl(), db.getUsername(), db.getPassword()
102
+ }
103
+ ```
104
+
105
+ - Testcontainers 2.x renamed module artifacts (`org.testcontainers:testcontainers-postgresql`) and moved classes (`org.testcontainers.postgresql.PostgreSQLContainer`, no type parameter); 1.x uses `org.testcontainers:postgresql` and `org.testcontainers.containers.PostgreSQLContainer<?>`. Match the version in the build file.
106
+ - Pin the image tag to the version production runs; never use `latest`.
107
+ - `static` containers start once per class; instance containers restart per test (slow).
108
+ - In Spring Boot 3.1+, annotate the container field with `@ServiceConnection` instead of wiring `@DynamicPropertySource` by hand.
109
+ - With `@DataJpaTest`, if the test still connects to an embedded database, add `@AutoConfigureTestDatabase(replace = Replace.NONE)`.
110
+ - Run the real migrations (Flyway, Liquibase) against the container so schema and code are tested together.
111
+ - Clean data between tests (truncate tables, or a transaction rolled back per test) so order doesn't matter.
112
+ - If Docker isn't available, stop and tell the user; don't fall back to H2 silently.
113
+
114
+ ## 5. Flaky tests
115
+
116
+ Reproduce first: rerun the single test many times (a `@RepeatedTest(50)` locally, or a loop over the single-test command), then the whole class, then with the CI's JVM flags and parallelism.
117
+
118
+ | Symptom | Usual cause | Fix |
119
+ |---|---|---|
120
+ | Fails only with other tests | shared static state, leftover DB rows, test order | reset state in `@BeforeEach`; isolate data |
121
+ | Fails on slow CI | `Thread.sleep` waits, fixed timeouts | poll with Awaitility (`await().atMost(...).until(...)`) |
122
+ | Fails near midnight or in other zones | `LocalDate.now()`, default time zone | inject a `java.time.Clock`; use `Clock.fixed` in tests |
123
+ | Fails on assertion order | `HashMap`/`HashSet` iteration | `containsExactlyInAnyOrder`, or sort |
124
+ | Port already in use | hard-coded ports | random ports; Testcontainers mapped ports |
125
+
126
+ Never fix flakiness by adding retries, raising timeouts blindly, or `@Disabled`. If you can't find the cause, report what you tried and leave the test enabled.
127
+
128
+ ## 6. Coverage and speed
129
+
130
+ - If the project uses JaCoCo, run its report goal and look at uncovered branches in the code you changed, not the global number.
131
+ - Keep unit tests free of Spring context and containers. Reuse one Spring context across tests by keeping configuration identical; each distinct `@MockBean`/`@MockitoBean` set forces a new context.
132
+
133
+ ## Never
134
+
135
+ - Delete, skip or weaken an existing test to make the suite pass without the user's agreement.
136
+ - Assert on log output or `toString()` when a real return value or state is available.
137
+ - Use `Thread.sleep` to wait for asynchronous work.
138
+ - Leave `System.out.println` debugging in tests.
139
+
140
+ ## Finish
141
+
142
+ Run the test command for the classes you touched, then the full suite. Report the tests added or changed, the command and its result, and any flaky test you could not fix.
@@ -0,0 +1,16 @@
1
+ {
2
+ "should_trigger": [
3
+ "Write JUnit 5 tests with Mockito for the OrderService class",
4
+ "Replace H2 with Testcontainers PostgreSQL in our Java repository tests",
5
+ "This JUnit test passes on my laptop but fails randomly in the CI pipeline, help me find out why",
6
+ "Turn these five copy-pasted Java test methods into a parameterized test with AssertJ assertions",
7
+ "Mockito says UnnecessaryStubbingException in my CheckoutServiceTest, what's wrong?"
8
+ ],
9
+ "should_not_trigger": [
10
+ "Convert these Java DTO classes to records and use a sealed interface for the payment types",
11
+ "Gradle build fails: Could not resolve org.junit.jupiter:junit-jupiter after bumping versions",
12
+ "Write Playwright end-to-end tests for the checkout page",
13
+ "Add pytest fixtures and parametrize the tests for the billing module",
14
+ "Write Kotest specs with MockK for the Kotlin payment service"
15
+ ]
16
+ }
@@ -0,0 +1,88 @@
1
+ ---
2
+ name: jetpack-compose-patterns
3
+ description: Android Jetpack Compose UI work centred on hoisting state into stateless composables, understanding recomposition, stability and strong skipping, choosing the right side-effect API (LaunchedEffect, DisposableEffect, rememberUpdatedState, derivedStateOf, snapshotFlow), exposing ViewModel state with collectAsStateWithLifecycle, type-safe Navigation Compose routes, and lazy-list and baseline-profile performance. Use when writing or restructuring Compose screens on Android, debugging excessive recomposition or janky LazyColumn scrolling, wiring a ViewModel to a composable, or setting up Compose navigation.
4
+ license: MIT
5
+ compatibility: Any Agent Skills host. Needs a JDK and the project's Gradle wrapper (./gradlew); device runs need the Android SDK and an emulator or device.
6
+ metadata:
7
+ kete-loom/version: "0.1.0"
8
+ kete-loom/category: coding
9
+ kete-loom/risk: runs-commands
10
+ kete-loom/requires: "java"
11
+ kete-loom/owner: "Kete-org"
12
+ ---
13
+
14
+ # Jetpack Compose patterns
15
+
16
+ Write Compose UI where state lives in one place, composables skip when their inputs didn't change, and effects run exactly when intended. Kotlin language features, coroutines and Flow belong to `kotlin-patterns`; sharing code with iOS belongs to `kotlin-multiplatform`.
17
+
18
+ ## 0. Before you write
19
+
20
+ 1. Read the module's `build.gradle.kts` and `gradle/libs.versions.toml`: Kotlin version, Compose BOM, whether the `org.jetbrains.kotlin.plugin.compose` compiler plugin is applied (Kotlin 2.0+), and which navigation library is used (`androidx.navigation:navigation-compose` or Navigation 3).
21
+ 2. Find the project's DI (Hilt, Koin, manual) and how ViewModels are obtained (`hiltViewModel()`, `viewModel()`, `koinViewModel()`). Follow it.
22
+ 3. Build once (`./gradlew :app:assembleDebug` or the project's task) and run unit tests; record the result.
23
+
24
+ ## 1. State hoisting
25
+
26
+ - Split each screen into a **stateful** route composable (gets the ViewModel, collects state) and a **stateless** screen composable that takes `state` and event lambdas: `ProfileScreen(state, onNameChange, onSave)`.
27
+ - Hoist state to the lowest common owner of everything that reads or writes it. UI-only state (scroll, expanded, focus) can stay in the composable with `remember` / `rememberSaveable`.
28
+ - Use `rememberSaveable` for state that must survive configuration change and process death (text input, selected tab).
29
+ - Every reusable composable takes `modifier: Modifier = Modifier` as its first optional parameter and applies it to its root, once.
30
+ - Never pass a ViewModel or `NavController` down into leaf composables; pass state and lambdas.
31
+
32
+ ## 2. Recomposition and stability
33
+
34
+ - Since Kotlin 2.0.20 strong skipping is on by default: composables with unstable parameters can still skip, but unstable parameters are compared by instance (`===`), stable ones by `equals`. So a new `List` instance with the same contents still recomposes.
35
+ - Make UI state classes immutable `data class`es with `val`s. Use `kotlinx.collections.immutable` (`ImmutableList`) or mark classes `@Immutable` / `@Stable` only when the promise is true.
36
+ - Read state as late as possible: pass a lambda (`{ scrollState.value }`) or use lambda-based modifiers (`Modifier.offset { }`, `graphicsLayer { }`) for values that change every frame, so only layout or draw re-runs.
37
+ - Use `derivedStateOf` when a frequently changing state produces a rarely changing result (`showButton = listState.firstVisibleItemIndex > 0`). Don't use it for a simple combination of two states.
38
+ - `remember(key) { expensive() }` for work inside composition; never sort, filter or format large data directly in a composable body.
39
+ - Check with Layout Inspector recomposition counts, and the Compose compiler reports (`composeCompiler { reportsDestination = ... }`) when stability is in doubt.
40
+
41
+ ## 3. Side effects
42
+
43
+ | Need | API |
44
+ |---|---|
45
+ | Run suspend work when entering composition or when a key changes | `LaunchedEffect(key)` |
46
+ | Register / unregister a listener or observer | `DisposableEffect(key) { ...; onDispose { } }` |
47
+ | Use the latest lambda inside a long-running effect without restarting it | `rememberUpdatedState(onTimeout)` |
48
+ | Launch coroutines from callbacks (click handlers) | `rememberCoroutineScope()` |
49
+ | Turn Compose state into a Flow | `snapshotFlow { state.value }` |
50
+ | Publish Compose state to non-Compose code after every successful composition | `SideEffect` |
51
+
52
+ Rules: keys must be the values that should restart the effect, never `Unit` when the effect reads a changing parameter. One-off events (navigate, snackbar) come from the ViewModel as state or a `Channel`/`Flow` collected in a `LaunchedEffect`, never by calling navigation inside composition.
53
+
54
+ ## 4. ViewModel and lifecycle
55
+
56
+ - The ViewModel exposes one `StateFlow<UiState>` built with `stateIn(viewModelScope, SharingStarted.WhileSubscribed(5_000), initial)` or a `MutableStateFlow` it updates.
57
+ - Collect it with `collectAsStateWithLifecycle()` (from `androidx.lifecycle:lifecycle-runtime-compose`), not `collectAsState()`, so collection stops when the app is in the background.
58
+ - Business logic, network and database work live in the ViewModel and repositories, never in composables.
59
+ - Use `SavedStateHandle` for navigation arguments and small state that must survive process death.
60
+
61
+ ## 5. Navigation
62
+
63
+ - Navigation Compose 2.8+: define routes as `@Serializable` objects and data classes, `composable<Profile> { entry -> entry.toRoute<Profile>() }`, and navigate with `navController.navigate(Profile(id))`. Don't build string routes by hand in new code.
64
+ - Navigation 3 (stable since late 2025) keeps the back stack as your own state. Use it only if the project already does or the user chooses it.
65
+ - Pass IDs, not objects. Load data in the destination's ViewModel via `SavedStateHandle`.
66
+ - Keep the `NavController` / back stack at the top-level `NavHost`; leaf screens receive `onNavigateToX` lambdas.
67
+ - Handle system back with `BackHandler` only where you must intercept it (unsaved changes).
68
+
69
+ ## 6. Performance
70
+
71
+ - Measure in a **release** build (R8 on, not debuggable); debug Compose is much slower.
72
+ - `LazyColumn` / `LazyRow`: give items a stable `key = { it.id }` and a `contentType` when rows differ. Never nest a vertically scrolling lazy list inside a `Column` with `verticalScroll`.
73
+ - Avoid allocating in item content: hoist `Modifier` chains and formatters, `remember` them.
74
+ - Add a Baseline Profile (`androidx.baselineprofile` plugin and a Macrobenchmark module) for startup and scroll paths in production apps.
75
+ - Use Macrobenchmark `FrameTimingMetric` to prove a jank fix.
76
+
77
+ **Stop and ask the user** before switching navigation libraries, raising `minSdk`, or upgrading Kotlin or the Compose BOM as part of an unrelated change.
78
+
79
+ ## Never
80
+
81
+ - Never launch coroutines, navigate or write to state directly in a composable body.
82
+ - Never use `collectAsState()` for ViewModel state on Android when lifecycle-aware collection is available.
83
+ - Never annotate a class `@Stable` or `@Immutable` that has mutable public state.
84
+ - Never use `Unit` as an effect key when the effect depends on a parameter.
85
+
86
+ ## Report back
87
+
88
+ End with: composables and ViewModels changed, where each new piece of state lives, Gradle tasks run with results, and whether you checked recomposition or frame timing (and how).
@@ -0,0 +1,16 @@
1
+ {
2
+ "should_trigger": [
3
+ "My Compose LazyColumn recomposes every row when one item is liked",
4
+ "Should I use LaunchedEffect or DisposableEffect to register this location listener in a composable?",
5
+ "Hoist the state out of this Compose text field so the ViewModel owns it",
6
+ "Switch our NavHost to type-safe @Serializable routes",
7
+ "collectAsState vs collectAsStateWithLifecycle for my ViewModel StateFlow"
8
+ ],
9
+ "should_not_trigger": [
10
+ "Use Compose Multiplatform so the same UI runs on iOS and Android",
11
+ "Write a coroutine Flow that debounces search queries in plain Kotlin",
12
+ "Fix this Gradle build failure: Unresolved reference in the Kotlin module",
13
+ "Build a SwiftUI list with lazy loading of images",
14
+ "Review this Kotlin pull request for unsafe !! and leaked coroutine scopes"
15
+ ]
16
+ }
@@ -0,0 +1,92 @@
1
+ ---
2
+ name: jira-integration
3
+ description: Connects code to Jira Cloud through the REST API v3, from picking basic auth with an Atlassian API token or OAuth 2.0 (3LO) with a cloudId, through enhanced JQL search on /rest/api/3/search/jql with nextPageToken paging, creating issues with Atlassian Document Format bodies, looking up custom field IDs and running workflow transitions, to registering webhooks and coping with 429 burst and points-based quotas. Use when building a Jira sync, bot or importer, moving off the removed /rest/api/3/search endpoint, setting custom fields or transitions from code, or handling Jira webhooks and rate limits.
4
+ license: MIT
5
+ compatibility: Any Agent Skills host. Live calls need network access to <site>.atlassian.net or api.atlassian.com. Covers Jira Cloud only; Jira Data Center and Server have a different API surface and auth.
6
+ metadata:
7
+ kete-loom/version: "0.1.0"
8
+ kete-loom/category: integrations
9
+ kete-loom/risk: network
10
+ kete-loom/requires: "curl"
11
+ kete-loom/owner: "Kete-org"
12
+ ---
13
+
14
+ # Jira Cloud integration
15
+
16
+ Build a Jira integration that authenticates with the right credential, finds issues with paged JQL, writes fields Jira accepts, moves issues through the real workflow, and slows down when Jira says so.
17
+
18
+ ## Ground rules
19
+
20
+ 1. **Jira Cloud, REST v3.** Base URL `https://<site>.atlassian.net/rest/api/3/` for API-token calls, or `https://api.atlassian.com/ex/jira/{cloudId}/rest/api/3/` for OAuth 2.0 and scoped tokens. If the user is on Data Center or Server, stop: this skill does not cover it.
21
+ 2. **Credentials from the environment.** Never commit an API token or client secret, never log the `Authorization` header.
22
+ 3. **Never hard-code IDs** for custom fields, issue types or transitions. They differ per site and per project; look them up and cache them.
23
+ 4. **People are account IDs.** Set assignee and reporter with `accountId`; usernames and email lookups are not reliable in Cloud.
24
+ 5. **Text fields in v3 are ADF** (Atlassian Document Format) JSON, not plain strings or wiki markup.
25
+
26
+ ## Choose the auth
27
+
28
+ | Situation | Use |
29
+ |---|---|
30
+ | Script or internal service for one site | Basic auth: `email:api_token` base64-encoded in `Authorization: Basic ...`. Tokens are created at id.atlassian.com, expire (1 to 365 days) and act as that user |
31
+ | Narrower internal access | A scoped API token, called through `api.atlassian.com/ex/jira/{cloudId}` |
32
+ | App other people's sites install, acting as each user | OAuth 2.0 (3LO) |
33
+ | Code running inside Jira (UI, triggers) | Forge app; out of scope here |
34
+
35
+ Use a dedicated service account for shared integrations, not a person's token. Stop and ask the user before using an admin's token.
36
+
37
+ ### OAuth 2.0 (3LO)
38
+
39
+ 1. Register the app in the Atlassian developer console; add the Jira API scopes you need (classic `read:jira-work`, `write:jira-work`, `read:jira-user`, or granular scopes) plus `offline_access` for refresh tokens.
40
+ 2. Send the user to `https://auth.atlassian.com/authorize?audience=api.atlassian.com&client_id=...&scope=...&redirect_uri=...&state=...&response_type=code&prompt=consent`. Check `state` on return.
41
+ 3. Exchange the code at `POST https://auth.atlassian.com/oauth/token`. Refresh tokens rotate: store the new refresh token every time you refresh.
42
+ 4. `GET https://api.atlassian.com/oauth/token/accessible-resources` lists the sites the token can reach; store each `id` as the `cloudId` and call `api.atlassian.com/ex/jira/{cloudId}/...`.
43
+
44
+ ## Search with JQL
45
+
46
+ - `GET/POST /rest/api/3/search` was removed from Jira Cloud. Use `POST /rest/api/3/search/jql` with `{ "jql": "...", "fields": [...], "maxResults": 100, "nextPageToken": "..." }`.
47
+ - Always pass `fields` explicitly; ask for only what you use.
48
+ - Page by sending back `nextPageToken` until the response has none (or `isLast` is true). There is no `startAt` and no `total`; for a count, use `POST /rest/api/3/search/approximate-count`.
49
+ - Always bound JQL (`project = ABC AND updated >= -1d ORDER BY updated ASC`). An unbounded query on a large site is slow and burns quota.
50
+ - Quote values with spaces or reserved words, and build JQL from validated values, never by pasting user input into the string.
51
+ - For incremental sync, store the last `updated` you processed and query `updated >= "<timestamp>"`, then dedupe by issue ID (JQL date precision is minutes).
52
+
53
+ ## Create and update issues
54
+
55
+ 1. Discover fields for the target: `GET /rest/api/3/issue/createmeta/{projectIdOrKey}/issuetypes` then `.../issuetypes/{issueTypeId}` for required fields and allowed values. `GET /rest/api/3/field` maps custom field names to IDs (`customfield_10042`); cache by name, look up once per site.
56
+ 2. `POST /rest/api/3/issue` with `fields`: `project: {key}`, `issuetype: {id}`, `summary`, `description` as ADF, plus required custom fields in their type's shape (select: `{ "value": "High" }` or `{ "id": "..." }`; user: `{ "accountId": "..." }`; number and date as plain values).
57
+ 3. Minimal ADF: `{"type":"doc","version":1,"content":[{"type":"paragraph","content":[{"type":"text","text":"..."}]}]}`.
58
+ 4. Update with `PUT /rest/api/3/issue/{key}` using `fields` (set) or `update` (add/remove on multi-value fields such as labels). Add `notifyUsers=false` only if the user asks; it needs the Administer Jira or Administer Projects permission.
59
+ 5. Comments: `POST /rest/api/3/issue/{key}/comment` with an ADF `body`.
60
+ 6. Make creates idempotent yourself: Jira has no idempotency key. Store your external ID in an issue property or a label and search for it before creating.
61
+ 7. Read the 400 response `errors` object; it names each field that failed.
62
+
63
+ ## Transitions
64
+
65
+ 1. `GET /rest/api/3/issue/{key}/transitions` lists transitions available **now** for that issue and user (add `expand=transitions.fields` to see screen fields).
66
+ 2. Pick by target status (`to.name` or `to.id`), not by transition name or a hard-coded ID; workflows differ per project.
67
+ 3. `POST /rest/api/3/issue/{key}/transitions` with `{ "transition": { "id": "31" }, "fields": { "resolution": { "name": "Done" } } }` when the screen requires fields.
68
+ 4. If the target is not listed, the workflow does not allow it from the current status or the user lacks permission. Report that; do not try other transitions to get there unless the user asks.
69
+
70
+ ## Webhooks
71
+
72
+ - Admin-created webhooks (Jira settings or `/rest/webhooks/1.0/webhook`): set a `secret`; Jira then sends `X-Hub-Signature: sha256=<hex HMAC of the raw body>`. Verify on the raw bytes with a constant-time compare.
73
+ - OAuth 2.0 and Connect apps register dynamic webhooks with `POST /rest/api/3/webhook` (JQL filter limited to fields such as `project`, `issuetype`, `status`, `assignee`). They expire after 30 days: refresh with `PUT /rest/api/3/webhook/refresh` and `{ "webhookIds": [...] }` on a schedule. An OAuth app can register 5 per user per site. OAuth apps receive a JWT in `Authorization` signed with the client secret; verify it.
74
+ - Jira retries failed deliveries (408, 409, 425, 429, 5xx, timeouts) up to five times. Dedupe on `X-Atlassian-Webhook-Identifier`; `X-Atlassian-Webhook-Retry` gives the attempt number.
75
+ - Acknowledge fast and process from a queue. The payload may be stale; re-fetch the issue if you need current state.
76
+
77
+ ## Rate limits
78
+
79
+ - Jira returns `429` with `Retry-After` (seconds) and `RateLimit-Reason` (`jira-burst-based`, `jira-quota-global-based`, `jira-quota-tenant-based`, `jira-per-issue-on-write`). Watch `X-RateLimit-NearLimit: true`.
80
+ - Limits: per-second burst limits per endpoint, an hourly points quota for apps (enforced from March 2026; API-token traffic stays under burst limits), and per-issue write limits (20 writes per 2 seconds, 100 per 30 seconds on one issue).
81
+ - Wait at least `Retry-After`, then exponential backoff with jitter, capped at a few retries; retry only idempotent requests. On quota reasons pause all calls; on burst slow that endpoint; on per-issue space out writes to that issue.
82
+ - Batch where Jira offers it (bulk create `POST /rest/api/3/issue/bulk`, up to 50 issues) and fetch only needed fields.
83
+
84
+ ## Stop and ask the user
85
+
86
+ - Before bulk edits, bulk transitions or deletes on more than a handful of issues; show the JQL and the count first.
87
+ - Before creating webhooks, custom fields or workflow changes on a production site.
88
+ - If required fields or the workflow make the requested change impossible, rather than guessing values.
89
+
90
+ ## Before you finish
91
+
92
+ Test against a sandbox site or a throwaway project: a search that spans more than one page, a create with every required custom field, a transition that needs a screen field, a duplicate create (no second issue), a webhook with a bad signature (rejected), and a forced 429 handled with backoff. Atlassian's REST v3 reference at developer.atlassian.com is the final word on endpoints and payloads.
@@ -0,0 +1,17 @@
1
+ {
2
+ "should_trigger": [
3
+ "Our Jira sync broke because /rest/api/3/search now returns 410, move it to the new JQL search endpoint",
4
+ "Create Jira issues from our support tool and fill the Severity custom field from code",
5
+ "Move a Jira ticket to Done through the REST API when the related PR merges",
6
+ "Set up OAuth 2.0 3LO so customers can connect their Jira Cloud site to our app",
7
+ "The Jira importer keeps getting 429 with RateLimit-Reason jira-burst-based, add proper backoff",
8
+ "Verify the X-Hub-Signature on webhooks coming from our Jira Cloud admin webhook"
9
+ ],
10
+ "should_not_trigger": [
11
+ "Create Linear issues from our error tracker using the GraphQL API",
12
+ "Write a JQL filter in the Jira UI that shows my team's overdue bugs",
13
+ "Estimate how many sprints the checkout rewrite will take",
14
+ "Open a GitHub issue automatically when the nightly job fails",
15
+ "Write the incident postmortem for last night's outage"
16
+ ]
17
+ }
@@ -0,0 +1,92 @@
1
+ ---
2
+ name: jpa-hibernate
3
+ description: Jakarta Persistence and Hibernate ORM data-layer rules for entity and association mapping, LAZY-by-default fetch plans, finding and fixing N+1 selects with JOIN FETCH, entity graphs or batch fetching, transaction scope and LazyInitializationException, @Version optimistic locking, and evolving the schema through Flyway or Liquibase rather than ddl-auto. Use when mapping JPA entities, chasing slow or repeated SQL from Hibernate, fixing lazy loading or stale-update errors, or adding a database migration in a Java or Kotlin JVM project.
4
+ license: MIT
5
+ compatibility: Any Agent Skills host. Needs a JDK and the project's build wrapper. Written for Jakarta Persistence 3.x with Hibernate ORM 6.x; applies under Spring Boot, Quarkus or plain Jakarta EE.
6
+ metadata:
7
+ kete-loom/version: "0.1.0"
8
+ kete-loom/category: data
9
+ kete-loom/risk: runs-commands
10
+ kete-loom/requires: "java"
11
+ kete-loom/owner: "Kete-org"
12
+ ---
13
+
14
+ # JPA and Hibernate
15
+
16
+ Hibernate hides SQL, which is why most of its bugs are invisible until production. Make the SQL visible, load exactly what each use case needs, and let migrations own the schema. Mapping examples are in `references/mapping.md`.
17
+
18
+ ## 0. Before you start
19
+
20
+ 1. Find the Hibernate version (Hibernate 6 uses `jakarta.persistence`; 5 and older use `javax.persistence`) and the framework (Spring Data JPA, Quarkus Panache, plain `EntityManager`).
21
+ 2. Find the migration tool: `db/migration/V*__*.sql` (Flyway) or a `db.changelog-master` file (Liquibase). If neither exists and the schema comes from `ddl-auto`, tell the user and propose adding one before changing tables.
22
+ 3. Turn on SQL logging in dev or tests so you can count statements: `spring.jpa.show-sql=true` / `quarkus.hibernate-orm.log.sql=true`, or log `org.hibernate.SQL` at DEBUG. Add `hibernate.generate_statistics=true` when chasing N+1.
23
+
24
+ ## 1. Entity mapping rules
25
+
26
+ - Every entity has a surrogate id. Use `GenerationType.SEQUENCE` (or `IDENTITY` on MySQL). `IDENTITY` disables JDBC insert batching; prefer sequences where the database supports them.
27
+ - `equals`/`hashCode`: base them on a natural business key, or on the id with a constant `hashCode()` (`getClass().hashCode()`). Never include associations or lazy fields. In Kotlin, never use a `data class` for an entity.
28
+ - Map enums with `@Enumerated(EnumType.STRING)`, never the default `ORDINAL`.
29
+ - Money: `BigDecimal` with explicit `precision` and `scale`, or integer minor units. Never `double`.
30
+ - Time: `Instant` or `OffsetDateTime` for points in time; store in UTC (`hibernate.jdbc.time_zone=UTC`; in Spring Boot `spring.jpa.properties.hibernate.jdbc.time_zone=UTC`).
31
+ - Entities need a no-arg constructor (protected is fine) and must not be `final` if they are proxied lazily (Kotlin: use the `kotlin-jpa` and `allopen` compiler plugins).
32
+
33
+ ## 2. Associations and fetch strategy
34
+
35
+ - **Make every association LAZY.** `@ManyToOne` and `@OneToOne` are EAGER by default: always write `fetch = FetchType.LAZY`. Collections are already lazy.
36
+ - Prefer unidirectional `@ManyToOne` from child to parent. Add the `@OneToMany(mappedBy = ...)` side only when you really navigate it, and keep both sides in sync with helper methods (`addItem`, `removeItem`).
37
+ - Avoid `@ManyToMany` when the join has attributes or might gain them; model the join table as its own entity.
38
+ - Use `Set` or `List` deliberately: fetching two `List` collections with `JOIN FETCH` in one query throws `MultipleBagFetchException`. Fetch one collection per query, or use `Set`.
39
+ - `cascade = ALL` and `orphanRemoval = true` belong only on true parent-owned children (order → order lines), never on references to shared entities (order → customer).
40
+
41
+ ## 3. Finding and fixing N+1
42
+
43
+ Symptom: one query for the list, then one more per row. Confirm by counting statements in the SQL log or statistics before changing anything.
44
+
45
+ Fix with the narrowest tool:
46
+
47
+ 1. **Fetch join** for a use case that always needs the association: `select o from Order o join fetch o.customer where o.status = :s`.
48
+ 2. **Entity graph** to choose fetches per query without rewriting JPQL: `@EntityGraph(attributePaths = {"customer", "lines"})` on a Spring Data method, or a `jakarta.persistence.fetchgraph` hint.
49
+ 3. **Batch fetching** to turn N queries into N/size: `@BatchSize(size = 50)` on the association or `hibernate.default_batch_fetch_size=50` globally. Good default for collections you can't fetch-join.
50
+ 4. **DTO projection** for read-only screens: `select new com.acme.OrderRow(o.id, c.name) from Order o join o.customer c`, or a Spring Data interface/record projection. No entities, no dirty checking, no lazy surprises.
51
+
52
+ Don't fix N+1 by switching to `FetchType.EAGER`; that loads the association everywhere and often causes more queries.
53
+
54
+ Paging with collection fetch joins makes Hibernate load every row and page in memory (it logs a warning about applying the limit in memory). Page the ids first, then fetch the entities with their collections by id. Set `hibernate.query.fail_on_pagination_over_collection_fetch=true` so this fails in tests instead of silently loading everything.
55
+
56
+ ## 4. Transactions and lazy loading
57
+
58
+ - Load and use entities inside one transaction, at the service layer. `LazyInitializationException` means a lazy field was touched after the session closed; fix it by fetching what the use case needs (section 3) or mapping to a DTO inside the transaction.
59
+ - **Do not** fix it with `hibernate.enable_lazy_load_no_trans` or by enabling open-session-in-view; both hide extra queries and run them outside a transaction. In Spring Boot set `spring.jpa.open-in-view=false`.
60
+ - Changes to managed entities are flushed automatically at commit (dirty checking). Calling `save()` on an already managed entity is unnecessary.
61
+ - Use read-only transactions for queries (`@Transactional(readOnly = true)` in Spring) so Hibernate skips dirty checking.
62
+ - Bulk `update`/`delete` JPQL bypasses the persistence context; clear it afterwards (`@Modifying(clearAutomatically = true)` in Spring Data) or reload entities.
63
+ - For large batch jobs: set `hibernate.jdbc.batch_size`, and `flush()` plus `clear()` every N entities so memory stays flat.
64
+
65
+ ## 5. Optimistic locking
66
+
67
+ - Add `@Version private long version;` (or `Long`/`Integer`) to entities edited concurrently by users or jobs. Hibernate adds `where version = ?` to updates and throws `OptimisticLockException` (Spring: `ObjectOptimisticLockingFailureException`) when another transaction got there first.
68
+ - Expose the version to clients (an `ETag` header or a field in the DTO) and send it back on update, so a stale form fails instead of overwriting someone's change. Map the exception to HTTP 409 or 412.
69
+ - Retry only when the operation is safe to repeat (for example a counter increment), reloading the entity each time, with a small retry limit.
70
+ - Use pessimistic locks (`LockModeType.PESSIMISTIC_WRITE`, `select ... for update`) only for short critical sections such as allocating stock, and always inside a transaction with a lock timeout.
71
+ - Never set the version field by hand.
72
+
73
+ ## 6. Migrations (Flyway or Liquibase)
74
+
75
+ - The schema is owned by migrations. Set schema generation (`spring.jpa.hibernate.ddl-auto`; Quarkus `quarkus.hibernate-orm.schema-management.strategy`, called `database.generation` before 3.23) to `validate` or `none` everywhere except throwaway local experiments.
76
+ - Flyway: versioned files `V<version>__<description>.sql` under `db/migration`, applied in order and checksummed. **Never edit a migration that has run anywhere shared**; add a new one. Repeatable `R__` scripts are for views and functions.
77
+ - Liquibase: changesets identified by `id` + `author` + file; same rule, never change an applied changeset.
78
+ - Write backward-compatible migrations so old and new app versions can run during a rolling deploy (expand, migrate data, then contract in a later release). Example: add a nullable column, backfill, then add `NOT NULL` later.
79
+ - Add indexes for every foreign key and for columns in frequent `where`/`order by`. On large PostgreSQL tables use `create index concurrently` (in Flyway, put it in its own migration so it runs outside a transaction; Flyway cannot mix it with transactional statements; if the migration hangs on Flyway's lock, set `flyway.postgresql.transactional.lock=false`).
80
+ - **Stop and ask the user** before any migration that drops or renames columns or tables, rewrites a large table, or deletes data.
81
+ - Test migrations against the real database engine (Testcontainers), not H2, and run `validate` in CI.
82
+
83
+ ## Never
84
+
85
+ - EAGER fetching to silence a lazy loading error, or `enable_lazy_load_no_trans`.
86
+ - `ddl-auto=update` in production, or editing an applied migration.
87
+ - Entities serialised directly to JSON.
88
+ - `ORDINAL` enums, `double` money, or `equals` over lazy associations.
89
+
90
+ ## Before you finish
91
+
92
+ Run the test suite with SQL logging on for the changed queries. Report: entities and mappings changed, the statement count before and after for any N+1 fix, migrations added (file names), whether they are backward compatible, and the final test counts.