opencode-agent-kit 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (361) hide show
  1. package/README.md +796 -0
  2. package/bin/commands/init.mjs +221 -0
  3. package/bin/init.mjs +21 -0
  4. package/package.json +22 -0
  5. package/template/.opencode/agent-docs/backend/README.md +0 -0
  6. package/template/.opencode/agent-docs/backend/node/BACKEND_PATTERNS.md +82 -0
  7. package/template/.opencode/agent-docs/backend/node/BACKEND_QUICK_START.md +49 -0
  8. package/template/.opencode/agent-docs/frontend/next/README.md +0 -0
  9. package/template/.opencode/agent-docs/frontend/nuxt/API_PATTERNS.md +807 -0
  10. package/template/.opencode/agent-docs/frontend/nuxt/CHEATSHEET.md +676 -0
  11. package/template/.opencode/agent-docs/frontend/nuxt/COMPLETION_REPORT.md +613 -0
  12. package/template/.opencode/agent-docs/frontend/nuxt/EXAMPLES.md +956 -0
  13. package/template/.opencode/agent-docs/frontend/nuxt/INDEX.md +596 -0
  14. package/template/.opencode/agent-docs/frontend/nuxt/MCP_GUIDE.md +881 -0
  15. package/template/.opencode/agent-docs/frontend/nuxt/MENTOR_CURRICULUM_30_DAYS.md +256 -0
  16. package/template/.opencode/agent-docs/frontend/nuxt/MENTOR_CURRICULUM_CHECKLIST.md +156 -0
  17. package/template/.opencode/agent-docs/frontend/nuxt/MENTOR_WEEKLY_ASSIGNMENTS.md +191 -0
  18. package/template/.opencode/agent-docs/frontend/nuxt/QUICK_START.md +509 -0
  19. package/template/.opencode/agent-docs/frontend/nuxt/README.md +506 -0
  20. package/template/.opencode/agent-docs/frontend/nuxt/README_AGENTS.md +140 -0
  21. package/template/.opencode/agent-docs/frontend/nuxt/README_DOCS.md +65 -0
  22. package/template/.opencode/agent-docs/frontend/nuxt/SUMMARY.md +474 -0
  23. package/template/.opencode/agent-docs/frontend/nuxt/TEAM_OPERATING_GUIDE.md +54 -0
  24. package/template/.opencode/agent-docs/frontend/nuxt/TESTING_GUIDE.md +904 -0
  25. package/template/.opencode/agent-docs/frontend/nuxt/WORKFLOWS.md +758 -0
  26. package/template/.opencode/agent-docs/frontend/react/API_PATTERNS.md +187 -0
  27. package/template/.opencode/agent-docs/frontend/react/CHEATSHEET.md +87 -0
  28. package/template/.opencode/agent-docs/frontend/react/INDEX.md +45 -0
  29. package/template/.opencode/agent-docs/frontend/react/QUICK_START.md +43 -0
  30. package/template/.opencode/agent-docs/frontend/react/README.md +159 -0
  31. package/template/.opencode/agent-docs/frontend/vue/README.md +0 -0
  32. package/template/.opencode/agent-docs/mobile/android/README.md +45 -0
  33. package/template/.opencode/agent-docs/mobile/flutter/README.md +44 -0
  34. package/template/.opencode/agents/android-developer.md +418 -0
  35. package/template/.opencode/agents/code-igniter-3-fullstack.md +345 -0
  36. package/template/.opencode/agents/code-reviewer.md +517 -0
  37. package/template/.opencode/agents/database-specialist.md +455 -0
  38. package/template/.opencode/agents/devops-specialist.md +562 -0
  39. package/template/.opencode/agents/flutter-developer.md +556 -0
  40. package/template/.opencode/agents/it-leader.md +911 -0
  41. package/template/.opencode/agents/laravel-advanced.md +691 -0
  42. package/template/.opencode/agents/node-backend-developer.md +343 -0
  43. package/template/.opencode/agents/nuxt-frontend-developer-mentor.md +402 -0
  44. package/template/.opencode/agents/nuxt-frontend-developer.md +1573 -0
  45. package/template/.opencode/agents/react-frontend-developer.md +1017 -0
  46. package/template/.opencode/agents/seo-specialist.md +681 -0
  47. package/template/.opencode/agents/ui-ux-designer.md +783 -0
  48. package/template/.opencode/commands/android-build/command.md +25 -0
  49. package/template/.opencode/commands/android-test/command.md +23 -0
  50. package/template/.opencode/commands/build-fix.md +29 -0
  51. package/template/.opencode/commands/checkpoint.md +74 -0
  52. package/template/.opencode/commands/code-review.md +40 -0
  53. package/template/.opencode/commands/e2e.md +363 -0
  54. package/template/.opencode/commands/eval.md +120 -0
  55. package/template/.opencode/commands/evolve.md +193 -0
  56. package/template/.opencode/commands/flutter-build/command.md +25 -0
  57. package/template/.opencode/commands/flutter-test/command.md +24 -0
  58. package/template/.opencode/commands/go-build.md +183 -0
  59. package/template/.opencode/commands/go-review.md +148 -0
  60. package/template/.opencode/commands/go-test.md +268 -0
  61. package/template/.opencode/commands/gpc-release/command.md +30 -0
  62. package/template/.opencode/commands/instinct-export.md +91 -0
  63. package/template/.opencode/commands/instinct-import.md +142 -0
  64. package/template/.opencode/commands/instinct-status.md +86 -0
  65. package/template/.opencode/commands/learn.md +70 -0
  66. package/template/.opencode/commands/multi-backend.md +158 -0
  67. package/template/.opencode/commands/multi-execute.md +310 -0
  68. package/template/.opencode/commands/multi-frontend.md +158 -0
  69. package/template/.opencode/commands/multi-plan.md +261 -0
  70. package/template/.opencode/commands/multi-workflow.md +183 -0
  71. package/template/.opencode/commands/orchestrate.md +172 -0
  72. package/template/.opencode/commands/plan.md +113 -0
  73. package/template/.opencode/commands/pm2.md +271 -0
  74. package/template/.opencode/commands/python-review.md +297 -0
  75. package/template/.opencode/commands/refactor-clean.md +28 -0
  76. package/template/.opencode/commands/sessions.md +305 -0
  77. package/template/.opencode/commands/setup-pm.md +80 -0
  78. package/template/.opencode/commands/skill-create.md +174 -0
  79. package/template/.opencode/commands/tdd.md +326 -0
  80. package/template/.opencode/commands/test-coverage.md +27 -0
  81. package/template/.opencode/commands/update-codemaps.md +17 -0
  82. package/template/.opencode/commands/update-docs.md +31 -0
  83. package/template/.opencode/commands/verify.md +59 -0
  84. package/template/.opencode/config.example.json +309 -0
  85. package/template/.opencode/config.json +341 -0
  86. package/template/.opencode/contexts/dev.md +20 -0
  87. package/template/.opencode/contexts/research.md +26 -0
  88. package/template/.opencode/contexts/review.md +22 -0
  89. package/template/.opencode/hooks/hooks.json +169 -0
  90. package/template/.opencode/instructions/INSTRUCTIONS.md +388 -0
  91. package/template/.opencode/package.json +5 -0
  92. package/template/.opencode/rules/README.md +82 -0
  93. package/template/.opencode/rules/android/gradle.md +62 -0
  94. package/template/.opencode/rules/android/testing.md +27 -0
  95. package/template/.opencode/rules/common/agents.md +49 -0
  96. package/template/.opencode/rules/common/coding-style.md +48 -0
  97. package/template/.opencode/rules/common/git-workflow.md +45 -0
  98. package/template/.opencode/rules/common/hooks.md +30 -0
  99. package/template/.opencode/rules/common/patterns.md +31 -0
  100. package/template/.opencode/rules/common/performance.md +55 -0
  101. package/template/.opencode/rules/common/security.md +29 -0
  102. package/template/.opencode/rules/common/testing.md +29 -0
  103. package/template/.opencode/rules/flutter/state-management.md +57 -0
  104. package/template/.opencode/rules/flutter/testing.md +42 -0
  105. package/template/.opencode/rules/golang/coding-style.md +26 -0
  106. package/template/.opencode/rules/golang/hooks.md +11 -0
  107. package/template/.opencode/rules/golang/patterns.md +39 -0
  108. package/template/.opencode/rules/golang/security.md +28 -0
  109. package/template/.opencode/rules/golang/testing.md +25 -0
  110. package/template/.opencode/rules/mobile/performance.md +36 -0
  111. package/template/.opencode/rules/python/coding-style.md +37 -0
  112. package/template/.opencode/rules/python/hooks.md +14 -0
  113. package/template/.opencode/rules/python/patterns.md +34 -0
  114. package/template/.opencode/rules/python/security.md +25 -0
  115. package/template/.opencode/rules/python/testing.md +33 -0
  116. package/template/.opencode/rules/typescript/coding-style.md +58 -0
  117. package/template/.opencode/rules/typescript/hooks.md +15 -0
  118. package/template/.opencode/rules/typescript/patterns.md +45 -0
  119. package/template/.opencode/rules/typescript/security.md +21 -0
  120. package/template/.opencode/rules/typescript/testing.md +11 -0
  121. package/template/.opencode/skills/api-documentation/SKILL.md +188 -0
  122. package/template/.opencode/skills/backend-patterns/SKILL.md +587 -0
  123. package/template/.opencode/skills/building-components/SKILL.md +37 -0
  124. package/template/.opencode/skills/building-components/references/accessibility.mdx +819 -0
  125. package/template/.opencode/skills/building-components/references/as-child.mdx +324 -0
  126. package/template/.opencode/skills/building-components/references/composition.mdx +239 -0
  127. package/template/.opencode/skills/building-components/references/data-attributes.mdx +413 -0
  128. package/template/.opencode/skills/building-components/references/definitions.mdx +258 -0
  129. package/template/.opencode/skills/building-components/references/design-tokens.mdx +57 -0
  130. package/template/.opencode/skills/building-components/references/docs.mdx +155 -0
  131. package/template/.opencode/skills/building-components/references/marketplaces.mdx +144 -0
  132. package/template/.opencode/skills/building-components/references/npm.mdx +166 -0
  133. package/template/.opencode/skills/building-components/references/polymorphism.mdx +583 -0
  134. package/template/.opencode/skills/building-components/references/principles.mdx +61 -0
  135. package/template/.opencode/skills/building-components/references/registry.mdx +169 -0
  136. package/template/.opencode/skills/building-components/references/state.mdx +99 -0
  137. package/template/.opencode/skills/building-components/references/styling.mdx +286 -0
  138. package/template/.opencode/skills/building-components/references/types.mdx +191 -0
  139. package/template/.opencode/skills/clickhouse-io/SKILL.md +429 -0
  140. package/template/.opencode/skills/coding-standards/SKILL.md +520 -0
  141. package/template/.opencode/skills/configure-ecc/SKILL.md +298 -0
  142. package/template/.opencode/skills/continuous-learning/SKILL.md +110 -0
  143. package/template/.opencode/skills/continuous-learning/config.json +18 -0
  144. package/template/.opencode/skills/continuous-learning/evaluate-session.sh +60 -0
  145. package/template/.opencode/skills/continuous-learning-v2/SKILL.md +284 -0
  146. package/template/.opencode/skills/continuous-learning-v2/agents/observer.md +137 -0
  147. package/template/.opencode/skills/continuous-learning-v2/agents/start-observer.sh +134 -0
  148. package/template/.opencode/skills/continuous-learning-v2/config.json +41 -0
  149. package/template/.opencode/skills/continuous-learning-v2/hooks/observe.sh +153 -0
  150. package/template/.opencode/skills/continuous-learning-v2/scripts/instinct-cli.py +489 -0
  151. package/template/.opencode/skills/continuous-learning-v2/scripts/test_parse_instinct.py +82 -0
  152. package/template/.opencode/skills/dart-add-unit-test/SKILL.md +122 -0
  153. package/template/.opencode/skills/dart-build-cli-app/SKILL.md +185 -0
  154. package/template/.opencode/skills/dart-collect-coverage/SKILL.md +141 -0
  155. package/template/.opencode/skills/dart-fix-runtime-errors/SKILL.md +166 -0
  156. package/template/.opencode/skills/dart-generate-test-mocks/SKILL.md +155 -0
  157. package/template/.opencode/skills/dart-migrate-to-checks-package/SKILL.md +126 -0
  158. package/template/.opencode/skills/dart-resolve-package-conflicts/SKILL.md +116 -0
  159. package/template/.opencode/skills/dart-run-static-analysis/SKILL.md +104 -0
  160. package/template/.opencode/skills/dart-use-pattern-matching/SKILL.md +146 -0
  161. package/template/.opencode/skills/django-patterns/SKILL.md +733 -0
  162. package/template/.opencode/skills/django-security/SKILL.md +592 -0
  163. package/template/.opencode/skills/django-tdd/SKILL.md +728 -0
  164. package/template/.opencode/skills/django-verification/SKILL.md +460 -0
  165. package/template/.opencode/skills/eval-harness/SKILL.md +227 -0
  166. package/template/.opencode/skills/firebase-basics/SKILL.md +103 -0
  167. package/template/.opencode/skills/firebase-basics/references/additional-skills.md +113 -0
  168. package/template/.opencode/skills/firebase-basics/references/cli-usage.md +31 -0
  169. package/template/.opencode/skills/firebase-basics/references/client-library-usage.md +45 -0
  170. package/template/.opencode/skills/firebase-basics/references/core-concepts.md +61 -0
  171. package/template/.opencode/skills/firebase-basics/references/iac-usage.md +40 -0
  172. package/template/.opencode/skills/firebase-basics/references/iam-security.md +74 -0
  173. package/template/.opencode/skills/firebase-basics/references/mcp-usage.md +63 -0
  174. package/template/.opencode/skills/flutter/SKILL.md +292 -0
  175. package/template/.opencode/skills/flutter-add-integration-test/SKILL.md +163 -0
  176. package/template/.opencode/skills/flutter-add-widget-preview/SKILL.md +145 -0
  177. package/template/.opencode/skills/flutter-add-widget-test/SKILL.md +154 -0
  178. package/template/.opencode/skills/flutter-apply-architecture-best-practices/SKILL.md +162 -0
  179. package/template/.opencode/skills/flutter-build-responsive-layout/SKILL.md +139 -0
  180. package/template/.opencode/skills/flutter-fix-layout-issues/SKILL.md +130 -0
  181. package/template/.opencode/skills/flutter-implement-json-serialization/SKILL.md +153 -0
  182. package/template/.opencode/skills/flutter-setup-declarative-routing/SKILL.md +255 -0
  183. package/template/.opencode/skills/flutter-setup-localization/SKILL.md +210 -0
  184. package/template/.opencode/skills/flutter-use-http-package/SKILL.md +174 -0
  185. package/template/.opencode/skills/frontend-design/SKILL.md +89 -0
  186. package/template/.opencode/skills/frontend-patterns/SKILL.md +631 -0
  187. package/template/.opencode/skills/golang-patterns/SKILL.md +673 -0
  188. package/template/.opencode/skills/golang-testing/SKILL.md +719 -0
  189. package/template/.opencode/skills/impeccable/SKILL.md +165 -0
  190. package/template/.opencode/skills/impeccable/agents/impeccable-asset-producer.md +101 -0
  191. package/template/.opencode/skills/impeccable/reference/adapt.md +190 -0
  192. package/template/.opencode/skills/impeccable/reference/animate.md +175 -0
  193. package/template/.opencode/skills/impeccable/reference/audit.md +133 -0
  194. package/template/.opencode/skills/impeccable/reference/bolder.md +113 -0
  195. package/template/.opencode/skills/impeccable/reference/brand.md +118 -0
  196. package/template/.opencode/skills/impeccable/reference/clarify.md +174 -0
  197. package/template/.opencode/skills/impeccable/reference/codex.md +105 -0
  198. package/template/.opencode/skills/impeccable/reference/cognitive-load.md +106 -0
  199. package/template/.opencode/skills/impeccable/reference/color-and-contrast.md +105 -0
  200. package/template/.opencode/skills/impeccable/reference/colorize.md +154 -0
  201. package/template/.opencode/skills/impeccable/reference/craft.md +123 -0
  202. package/template/.opencode/skills/impeccable/reference/critique.md +273 -0
  203. package/template/.opencode/skills/impeccable/reference/delight.md +302 -0
  204. package/template/.opencode/skills/impeccable/reference/distill.md +111 -0
  205. package/template/.opencode/skills/impeccable/reference/document.md +427 -0
  206. package/template/.opencode/skills/impeccable/reference/extract.md +69 -0
  207. package/template/.opencode/skills/impeccable/reference/harden.md +347 -0
  208. package/template/.opencode/skills/impeccable/reference/heuristics-scoring.md +234 -0
  209. package/template/.opencode/skills/impeccable/reference/interaction-design.md +195 -0
  210. package/template/.opencode/skills/impeccable/reference/layout.md +141 -0
  211. package/template/.opencode/skills/impeccable/reference/live.md +622 -0
  212. package/template/.opencode/skills/impeccable/reference/motion-design.md +109 -0
  213. package/template/.opencode/skills/impeccable/reference/onboard.md +234 -0
  214. package/template/.opencode/skills/impeccable/reference/optimize.md +258 -0
  215. package/template/.opencode/skills/impeccable/reference/overdrive.md +130 -0
  216. package/template/.opencode/skills/impeccable/reference/personas.md +179 -0
  217. package/template/.opencode/skills/impeccable/reference/polish.md +242 -0
  218. package/template/.opencode/skills/impeccable/reference/product.md +62 -0
  219. package/template/.opencode/skills/impeccable/reference/quieter.md +99 -0
  220. package/template/.opencode/skills/impeccable/reference/responsive-design.md +114 -0
  221. package/template/.opencode/skills/impeccable/reference/shape.md +165 -0
  222. package/template/.opencode/skills/impeccable/reference/spatial-design.md +100 -0
  223. package/template/.opencode/skills/impeccable/reference/teach.md +156 -0
  224. package/template/.opencode/skills/impeccable/reference/typeset.md +124 -0
  225. package/template/.opencode/skills/impeccable/reference/typography.md +159 -0
  226. package/template/.opencode/skills/impeccable/reference/ux-writing.md +107 -0
  227. package/template/.opencode/skills/impeccable/scripts/cleanup-deprecated.mjs +284 -0
  228. package/template/.opencode/skills/impeccable/scripts/command-metadata.json +94 -0
  229. package/template/.opencode/skills/impeccable/scripts/critique-storage.mjs +242 -0
  230. package/template/.opencode/skills/impeccable/scripts/design-parser.mjs +820 -0
  231. package/template/.opencode/skills/impeccable/scripts/detect-csp.mjs +198 -0
  232. package/template/.opencode/skills/impeccable/scripts/detect.mjs +21 -0
  233. package/template/.opencode/skills/impeccable/scripts/impeccable-paths.mjs +110 -0
  234. package/template/.opencode/skills/impeccable/scripts/is-generated.mjs +69 -0
  235. package/template/.opencode/skills/impeccable/scripts/live-accept.mjs +595 -0
  236. package/template/.opencode/skills/impeccable/scripts/live-browser-session.js +123 -0
  237. package/template/.opencode/skills/impeccable/scripts/live-browser.js +4860 -0
  238. package/template/.opencode/skills/impeccable/scripts/live-complete.mjs +75 -0
  239. package/template/.opencode/skills/impeccable/scripts/live-completion.mjs +18 -0
  240. package/template/.opencode/skills/impeccable/scripts/live-inject.mjs +446 -0
  241. package/template/.opencode/skills/impeccable/scripts/live-poll.mjs +200 -0
  242. package/template/.opencode/skills/impeccable/scripts/live-resume.mjs +48 -0
  243. package/template/.opencode/skills/impeccable/scripts/live-server.mjs +838 -0
  244. package/template/.opencode/skills/impeccable/scripts/live-session-store.mjs +254 -0
  245. package/template/.opencode/skills/impeccable/scripts/live-status.mjs +47 -0
  246. package/template/.opencode/skills/impeccable/scripts/live-wrap.mjs +632 -0
  247. package/template/.opencode/skills/impeccable/scripts/live.mjs +247 -0
  248. package/template/.opencode/skills/impeccable/scripts/load-context.mjs +141 -0
  249. package/template/.opencode/skills/impeccable/scripts/modern-screenshot.umd.js +14 -0
  250. package/template/.opencode/skills/impeccable/scripts/pin.mjs +214 -0
  251. package/template/.opencode/skills/iterative-retrieval/SKILL.md +202 -0
  252. package/template/.opencode/skills/java-coding-standards/SKILL.md +138 -0
  253. package/template/.opencode/skills/jetpack-compose/.skillfish.json +10 -0
  254. package/template/.opencode/skills/jetpack-compose/SKILL.md +420 -0
  255. package/template/.opencode/skills/jpa-patterns/SKILL.md +141 -0
  256. package/template/.opencode/skills/nutrient-document-processing/SKILL.md +165 -0
  257. package/template/.opencode/skills/nuxt-ui/SKILL.md +334 -0
  258. package/template/.opencode/skills/nuxt-ui/references/components.md +377 -0
  259. package/template/.opencode/skills/nuxt-ui/references/composables.md +127 -0
  260. package/template/.opencode/skills/nuxt-ui/references/layouts/chat.md +266 -0
  261. package/template/.opencode/skills/nuxt-ui/references/layouts/dashboard.md +220 -0
  262. package/template/.opencode/skills/nuxt-ui/references/layouts/docs.md +141 -0
  263. package/template/.opencode/skills/nuxt-ui/references/layouts/editor.md +168 -0
  264. package/template/.opencode/skills/nuxt-ui/references/layouts/page.md +260 -0
  265. package/template/.opencode/skills/nuxt-ui/references/theming.md +427 -0
  266. package/template/.opencode/skills/postgres-patterns/SKILL.md +146 -0
  267. package/template/.opencode/skills/project-guidelines-example/SKILL.md +345 -0
  268. package/template/.opencode/skills/python-patterns/SKILL.md +749 -0
  269. package/template/.opencode/skills/python-testing/SKILL.md +815 -0
  270. package/template/.opencode/skills/security-review/SKILL.md +494 -0
  271. package/template/.opencode/skills/security-review/cloud-infrastructure-security.md +361 -0
  272. package/template/.opencode/skills/shadcn-ui/README.md +248 -0
  273. package/template/.opencode/skills/shadcn-ui/SKILL.md +326 -0
  274. package/template/.opencode/skills/shadcn-ui/examples/auth-layout.tsx +177 -0
  275. package/template/.opencode/skills/shadcn-ui/examples/data-table.tsx +313 -0
  276. package/template/.opencode/skills/shadcn-ui/examples/form-pattern.tsx +177 -0
  277. package/template/.opencode/skills/shadcn-ui/resources/component-catalog.md +481 -0
  278. package/template/.opencode/skills/shadcn-ui/resources/customization-guide.md +516 -0
  279. package/template/.opencode/skills/shadcn-ui/resources/migration-guide.md +463 -0
  280. package/template/.opencode/skills/shadcn-ui/resources/setup-guide.md +412 -0
  281. package/template/.opencode/skills/shadcn-ui/scripts/verify-setup.sh +134 -0
  282. package/template/.opencode/skills/springboot-patterns/SKILL.md +304 -0
  283. package/template/.opencode/skills/springboot-security/SKILL.md +119 -0
  284. package/template/.opencode/skills/springboot-tdd/SKILL.md +157 -0
  285. package/template/.opencode/skills/springboot-verification/SKILL.md +100 -0
  286. package/template/.opencode/skills/strategic-compact/SKILL.md +63 -0
  287. package/template/.opencode/skills/strategic-compact/suggest-compact.sh +52 -0
  288. package/template/.opencode/skills/tdd-workflow/SKILL.md +409 -0
  289. package/template/.opencode/skills/vercel-composition-patterns/AGENTS.md +946 -0
  290. package/template/.opencode/skills/vercel-composition-patterns/SKILL.md +89 -0
  291. package/template/.opencode/skills/vercel-composition-patterns/rules/architecture-avoid-boolean-props.md +100 -0
  292. package/template/.opencode/skills/vercel-composition-patterns/rules/architecture-compound-components.md +112 -0
  293. package/template/.opencode/skills/vercel-composition-patterns/rules/patterns-children-over-render-props.md +87 -0
  294. package/template/.opencode/skills/vercel-composition-patterns/rules/patterns-explicit-variants.md +100 -0
  295. package/template/.opencode/skills/vercel-composition-patterns/rules/react19-no-forwardref.md +42 -0
  296. package/template/.opencode/skills/vercel-composition-patterns/rules/state-context-interface.md +191 -0
  297. package/template/.opencode/skills/vercel-composition-patterns/rules/state-decouple-implementation.md +113 -0
  298. package/template/.opencode/skills/vercel-composition-patterns/rules/state-lift-state.md +125 -0
  299. package/template/.opencode/skills/vercel-react-best-practices/AGENTS.md +2934 -0
  300. package/template/.opencode/skills/vercel-react-best-practices/SKILL.md +136 -0
  301. package/template/.opencode/skills/vercel-react-best-practices/rules/advanced-event-handler-refs.md +55 -0
  302. package/template/.opencode/skills/vercel-react-best-practices/rules/advanced-init-once.md +42 -0
  303. package/template/.opencode/skills/vercel-react-best-practices/rules/advanced-use-latest.md +39 -0
  304. package/template/.opencode/skills/vercel-react-best-practices/rules/async-api-routes.md +38 -0
  305. package/template/.opencode/skills/vercel-react-best-practices/rules/async-defer-await.md +80 -0
  306. package/template/.opencode/skills/vercel-react-best-practices/rules/async-dependencies.md +51 -0
  307. package/template/.opencode/skills/vercel-react-best-practices/rules/async-parallel.md +28 -0
  308. package/template/.opencode/skills/vercel-react-best-practices/rules/async-suspense-boundaries.md +99 -0
  309. package/template/.opencode/skills/vercel-react-best-practices/rules/bundle-barrel-imports.md +59 -0
  310. package/template/.opencode/skills/vercel-react-best-practices/rules/bundle-conditional.md +31 -0
  311. package/template/.opencode/skills/vercel-react-best-practices/rules/bundle-defer-third-party.md +49 -0
  312. package/template/.opencode/skills/vercel-react-best-practices/rules/bundle-dynamic-imports.md +35 -0
  313. package/template/.opencode/skills/vercel-react-best-practices/rules/bundle-preload.md +50 -0
  314. package/template/.opencode/skills/vercel-react-best-practices/rules/client-event-listeners.md +74 -0
  315. package/template/.opencode/skills/vercel-react-best-practices/rules/client-localstorage-schema.md +71 -0
  316. package/template/.opencode/skills/vercel-react-best-practices/rules/client-passive-event-listeners.md +48 -0
  317. package/template/.opencode/skills/vercel-react-best-practices/rules/client-swr-dedup.md +56 -0
  318. package/template/.opencode/skills/vercel-react-best-practices/rules/js-batch-dom-css.md +107 -0
  319. package/template/.opencode/skills/vercel-react-best-practices/rules/js-cache-function-results.md +80 -0
  320. package/template/.opencode/skills/vercel-react-best-practices/rules/js-cache-property-access.md +28 -0
  321. package/template/.opencode/skills/vercel-react-best-practices/rules/js-cache-storage.md +70 -0
  322. package/template/.opencode/skills/vercel-react-best-practices/rules/js-combine-iterations.md +32 -0
  323. package/template/.opencode/skills/vercel-react-best-practices/rules/js-early-exit.md +50 -0
  324. package/template/.opencode/skills/vercel-react-best-practices/rules/js-hoist-regexp.md +45 -0
  325. package/template/.opencode/skills/vercel-react-best-practices/rules/js-index-maps.md +37 -0
  326. package/template/.opencode/skills/vercel-react-best-practices/rules/js-length-check-first.md +49 -0
  327. package/template/.opencode/skills/vercel-react-best-practices/rules/js-min-max-loop.md +82 -0
  328. package/template/.opencode/skills/vercel-react-best-practices/rules/js-set-map-lookups.md +24 -0
  329. package/template/.opencode/skills/vercel-react-best-practices/rules/js-tosorted-immutable.md +57 -0
  330. package/template/.opencode/skills/vercel-react-best-practices/rules/rendering-activity.md +26 -0
  331. package/template/.opencode/skills/vercel-react-best-practices/rules/rendering-animate-svg-wrapper.md +47 -0
  332. package/template/.opencode/skills/vercel-react-best-practices/rules/rendering-conditional-render.md +40 -0
  333. package/template/.opencode/skills/vercel-react-best-practices/rules/rendering-content-visibility.md +38 -0
  334. package/template/.opencode/skills/vercel-react-best-practices/rules/rendering-hoist-jsx.md +46 -0
  335. package/template/.opencode/skills/vercel-react-best-practices/rules/rendering-hydration-no-flicker.md +82 -0
  336. package/template/.opencode/skills/vercel-react-best-practices/rules/rendering-hydration-suppress-warning.md +30 -0
  337. package/template/.opencode/skills/vercel-react-best-practices/rules/rendering-svg-precision.md +28 -0
  338. package/template/.opencode/skills/vercel-react-best-practices/rules/rendering-usetransition-loading.md +75 -0
  339. package/template/.opencode/skills/vercel-react-best-practices/rules/rerender-defer-reads.md +39 -0
  340. package/template/.opencode/skills/vercel-react-best-practices/rules/rerender-dependencies.md +45 -0
  341. package/template/.opencode/skills/vercel-react-best-practices/rules/rerender-derived-state-no-effect.md +40 -0
  342. package/template/.opencode/skills/vercel-react-best-practices/rules/rerender-derived-state.md +29 -0
  343. package/template/.opencode/skills/vercel-react-best-practices/rules/rerender-functional-setstate.md +74 -0
  344. package/template/.opencode/skills/vercel-react-best-practices/rules/rerender-lazy-state-init.md +58 -0
  345. package/template/.opencode/skills/vercel-react-best-practices/rules/rerender-memo-with-default-value.md +38 -0
  346. package/template/.opencode/skills/vercel-react-best-practices/rules/rerender-memo.md +44 -0
  347. package/template/.opencode/skills/vercel-react-best-practices/rules/rerender-move-effect-to-event.md +45 -0
  348. package/template/.opencode/skills/vercel-react-best-practices/rules/rerender-simple-expression-in-memo.md +35 -0
  349. package/template/.opencode/skills/vercel-react-best-practices/rules/rerender-transitions.md +40 -0
  350. package/template/.opencode/skills/vercel-react-best-practices/rules/rerender-use-ref-transient-values.md +73 -0
  351. package/template/.opencode/skills/vercel-react-best-practices/rules/server-after-nonblocking.md +73 -0
  352. package/template/.opencode/skills/vercel-react-best-practices/rules/server-auth-actions.md +96 -0
  353. package/template/.opencode/skills/vercel-react-best-practices/rules/server-cache-lru.md +41 -0
  354. package/template/.opencode/skills/vercel-react-best-practices/rules/server-cache-react.md +76 -0
  355. package/template/.opencode/skills/vercel-react-best-practices/rules/server-dedup-props.md +65 -0
  356. package/template/.opencode/skills/vercel-react-best-practices/rules/server-parallel-fetching.md +83 -0
  357. package/template/.opencode/skills/vercel-react-best-practices/rules/server-serialization.md +38 -0
  358. package/template/.opencode/skills/verification-loop/SKILL.md +120 -0
  359. package/template/.opencode/skills/web-design-guidelines/SKILL.md +39 -0
  360. package/template/AGENTS.md +32 -0
  361. package/template/opencode.json +354 -0
@@ -0,0 +1,427 @@
1
+ # Theming
2
+
3
+ ## Semantic colors
4
+
5
+ | Color | Default | Purpose |
6
+ |---|---|---|
7
+ | `primary` | green | CTAs, active states, brand |
8
+ | `secondary` | blue | Secondary actions |
9
+ | `success` | green | Success messages |
10
+ | `info` | blue | Informational |
11
+ | `warning` | yellow | Warnings |
12
+ | `error` | red | Errors, destructive actions |
13
+ | `neutral` | slate | Text, borders, disabled |
14
+
15
+ ## Configuring colors
16
+
17
+ ```ts
18
+ // Nuxt — app.config.ts
19
+ export default defineAppConfig({
20
+ ui: {
21
+ colors: {
22
+ primary: 'indigo',
23
+ secondary: 'violet',
24
+ success: 'emerald',
25
+ error: 'rose',
26
+ neutral: 'zinc'
27
+ }
28
+ }
29
+ })
30
+ ```
31
+
32
+ ```ts
33
+ // Vue — vite.config.ts
34
+ ui({
35
+ ui: {
36
+ colors: { primary: 'indigo', secondary: 'violet', neutral: 'zinc' }
37
+ }
38
+ })
39
+ ```
40
+
41
+ You can only use colors that exist in your theme — either [Tailwind's default colors](https://tailwindcss.com/docs/colors) or custom colors defined with `@theme`.
42
+
43
+ ## Adding custom colors
44
+
45
+ 1. Define all 11 shades in CSS:
46
+
47
+ ```css
48
+ /* assets/css/main.css */
49
+ @theme static {
50
+ --color-brand-50: #fef2f2;
51
+ --color-brand-100: #fee2e2;
52
+ --color-brand-200: #fecaca;
53
+ --color-brand-300: #fca5a5;
54
+ --color-brand-400: #f87171;
55
+ --color-brand-500: #ef4444;
56
+ --color-brand-600: #dc2626;
57
+ --color-brand-700: #b91c1c;
58
+ --color-brand-800: #991b1b;
59
+ --color-brand-900: #7f1d1d;
60
+ --color-brand-950: #450a0a;
61
+ }
62
+ ```
63
+
64
+ 2. Assign it as a semantic color value: `ui: { colors: { primary: 'brand' } }`
65
+
66
+ You can only use colors that have all shades defined — either from Tailwind's defaults or custom `@theme` definitions.
67
+
68
+ ### Extending with new semantic color names
69
+
70
+ If you need a new semantic color beyond the defaults (e.g., `tertiary`), register it in `theme.colors`:
71
+
72
+ ```ts
73
+ // Nuxt — nuxt.config.ts
74
+ export default defineNuxtConfig({
75
+ ui: {
76
+ theme: {
77
+ colors: ['primary', 'secondary', 'tertiary', 'info', 'success', 'warning', 'error']
78
+ }
79
+ }
80
+ })
81
+ ```
82
+
83
+ ```ts
84
+ // Vue — vite.config.ts
85
+ ui({
86
+ theme: {
87
+ colors: ['primary', 'secondary', 'tertiary', 'info', 'success', 'warning', 'error']
88
+ }
89
+ })
90
+ ```
91
+
92
+ Then assign it: `ui: { colors: { tertiary: 'indigo' } }` and use it via the `color` prop: `<UButton color="tertiary">`.
93
+
94
+ ## CSS utilities
95
+
96
+ ### Text
97
+
98
+ | Class | Use | Light value | Dark value |
99
+ |---|---|---|---|
100
+ | `text-default` | Body text | `neutral-700` | `neutral-200` |
101
+ | `text-muted` | Secondary text | `neutral-500` | `neutral-400` |
102
+ | `text-dimmed` | Placeholders, hints | `neutral-400` | `neutral-500` |
103
+ | `text-toned` | Subtitles | `neutral-600` | `neutral-300` |
104
+ | `text-highlighted` | Headings, emphasis | `neutral-900` | `white` |
105
+ | `text-inverted` | On dark/light backgrounds | `white` | `neutral-900` |
106
+
107
+ ### Background
108
+
109
+ | Class | Use | Light value | Dark value |
110
+ |---|---|---|---|
111
+ | `bg-default` | Page background | `white` | `neutral-900` |
112
+ | `bg-muted` | Subtle sections | `neutral-50` | `neutral-800` |
113
+ | `bg-elevated` | Cards, modals | `neutral-100` | `neutral-800` |
114
+ | `bg-accented` | Hover states | `neutral-200` | `neutral-700` |
115
+ | `bg-inverted` | Inverted sections | `neutral-900` | `white` |
116
+
117
+ ### Border
118
+
119
+ | Class | Use | Light value | Dark value |
120
+ |---|---|---|---|
121
+ | `border-default` | Default borders | `neutral-200` | `neutral-800` |
122
+ | `border-muted` | Subtle borders | `neutral-200` | `neutral-700` |
123
+ | `border-accented` | Emphasized borders | `neutral-300` | `neutral-700` |
124
+ | `border-inverted` | Inverted borders | `neutral-900` | `white` |
125
+
126
+ ### Semantic color utilities
127
+
128
+ Each semantic color (`primary`, `secondary`, `success`, `info`, `warning`, `error`) is available as a Tailwind utility: `text-primary`, `bg-primary`, `border-primary`, `ring-primary`, etc.
129
+
130
+ They resolve to shade **500** in light mode and shade **400** in dark mode (via `--ui-<color>` CSS variables). This is generated at runtime by the colors plugin — you don't need to write dark-mode variants manually.
131
+
132
+ To adjust which shade is used, override `--ui-primary` (or any semantic color) in your `main.css`:
133
+
134
+ ```css
135
+ :root { --ui-primary: var(--ui-color-primary-600); }
136
+ .dark { --ui-primary: var(--ui-color-primary-300); }
137
+ ```
138
+
139
+ ### CSS variables
140
+
141
+ All customizable in `main.css`:
142
+
143
+ ```css
144
+ :root {
145
+ --ui-radius: 0.25rem; /* base radius for all components */
146
+ --ui-container: 80rem; /* UContainer max-width */
147
+ --ui-header-height: 4rem; /* UHeader height */
148
+ --ui-primary: var(--ui-color-primary-500); /* adjust shade used */
149
+ }
150
+
151
+ .dark {
152
+ --ui-primary: var(--ui-color-primary-400);
153
+ }
154
+ ```
155
+
156
+ ### Solid colors (black/white)
157
+
158
+ ```css
159
+ :root { --ui-primary: black; }
160
+ .dark { --ui-primary: white; }
161
+ ```
162
+
163
+ ## Component theme customization
164
+
165
+ ### How it works
166
+
167
+ Components are styled with [Tailwind Variants](https://www.tailwind-variants.org/). The theme defines:
168
+
169
+ - **`slots`** — named style targets (e.g., `root`, `base`, `label`, `leadingIcon`)
170
+ - **`variants`** — styles applied based on props (e.g., `color`, `variant`, `size`)
171
+ - **`compoundVariants`** — styles for specific prop combinations (e.g., `color: 'primary'` + `variant: 'outline'`)
172
+ - **`defaultVariants`** — default prop values when none are specified
173
+
174
+ ### Override priority
175
+
176
+ **`ui` prop / `class` prop > global config > theme defaults**
177
+
178
+ The `ui` prop overrides slots **after** variants are computed. If the `size: 'md'` variant applies `size-5` to `trailingIcon`, and you set `:ui="{ trailingIcon: 'size-3' }"`, the `size-3` wins.
179
+
180
+ Tailwind Variants uses [tailwind-merge](https://github.com/dcastil/tailwind-merge) under the hood so conflicting classes are resolved automatically.
181
+
182
+ ### Understanding the generated theme
183
+
184
+ Every component's full resolved theme is generated at build time. Always read this file before customizing a component — it shows exactly what classes are applied where.
185
+
186
+ - **Nuxt**: `.nuxt/ui/<component>.ts`
187
+ - **Vue**: `node_modules/.nuxt-ui/ui/<component>.ts`
188
+
189
+ For example, the card theme:
190
+
191
+ ```ts
192
+ {
193
+ slots: {
194
+ root: "rounded-lg overflow-hidden",
195
+ header: "p-4 sm:px-6",
196
+ body: "p-4 sm:p-6",
197
+ footer: "p-4 sm:px-6"
198
+ },
199
+ variants: {
200
+ variant: {
201
+ outline: { root: "bg-default ring ring-default divide-y divide-default" },
202
+ soft: { root: "bg-elevated/50 divide-y divide-default" }
203
+ }
204
+ },
205
+ defaultVariants: { variant: "outline" }
206
+ }
207
+ ```
208
+
209
+ ### Global config
210
+
211
+ Override the theme for all instances of a component:
212
+
213
+ ```ts
214
+ // Nuxt — app.config.ts
215
+ export default defineAppConfig({
216
+ ui: {
217
+ button: {
218
+ slots: {
219
+ base: 'font-bold rounded-full'
220
+ },
221
+ variants: {
222
+ size: {
223
+ md: { leadingIcon: 'size-4' }
224
+ }
225
+ },
226
+ compoundVariants: [{
227
+ color: 'neutral',
228
+ variant: 'outline',
229
+ class: { base: 'ring-2' }
230
+ }],
231
+ defaultVariants: {
232
+ color: 'neutral',
233
+ variant: 'outline'
234
+ }
235
+ }
236
+ }
237
+ })
238
+ ```
239
+
240
+ ```ts
241
+ // Vue — vite.config.ts
242
+ ui({
243
+ ui: {
244
+ button: {
245
+ slots: { base: 'font-bold rounded-full' },
246
+ defaultVariants: { color: 'neutral', variant: 'outline' }
247
+ }
248
+ }
249
+ })
250
+ ```
251
+
252
+ ### Per-instance (`ui` prop)
253
+
254
+ Overrides slots after variant computation:
255
+
256
+ ```vue
257
+ <UButton :ui="{ base: 'font-mono', trailingIcon: 'size-3 rotate-90' }" />
258
+ <UCard :ui="{ root: 'shadow-xl', body: 'p-8' }" />
259
+ ```
260
+
261
+ ### Per-instance (`class` prop)
262
+
263
+ Overrides the `root` or `base` slot:
264
+
265
+ ```vue
266
+ <UButton class="rounded-none">Square</UButton>
267
+ ```
268
+
269
+ Components without slots (e.g., `UContainer`, `USkeleton`, `UMain`) only have the `class` prop.
270
+
271
+ ### Theme structure patterns
272
+
273
+ **Slots-based** (most components — `slots` is an object in the generated theme):
274
+
275
+ ```ts
276
+ // global config
277
+ ui: {
278
+ button: {
279
+ slots: { base: 'font-bold' }
280
+ }
281
+ }
282
+ // per instance
283
+ <UButton :ui="{ base: 'font-bold' }" />
284
+ ```
285
+
286
+ **Flat base** (`base` is a top-level string in the generated theme):
287
+
288
+ ```ts
289
+ // global config
290
+ ui: {
291
+ container: {
292
+ base: 'max-w-lg'
293
+ }
294
+ }
295
+ // per instance — class prop only
296
+ <UContainer class="max-w-lg" />
297
+ ```
298
+
299
+ Always check the generated theme file to see which pattern applies.
300
+
301
+ ## Dark mode
302
+
303
+ ```ts
304
+ const colorMode = useColorMode()
305
+ colorMode.preference = 'dark' // 'light', 'dark', 'system'
306
+ ```
307
+
308
+ ```vue
309
+ <UColorModeButton /> <!-- Toggle -->
310
+ <UColorModeSelect /> <!-- Dropdown -->
311
+ ```
312
+
313
+ ## Fonts
314
+
315
+ ```css
316
+ /* assets/css/main.css */
317
+ @theme {
318
+ --font-sans: 'Public Sans', system-ui, sans-serif;
319
+ --font-mono: 'JetBrains Mono', monospace;
320
+ }
321
+ ```
322
+
323
+ In Nuxt, fonts defined with `@theme` are automatically loaded by the `@nuxt/fonts` module.
324
+
325
+ ## Brand customization playbook
326
+
327
+ Follow these steps to fully rebrand Nuxt UI (e.g., "make a Ghibli theme", "match our corporate brand"):
328
+
329
+ ### Step 1 — Define the color palette
330
+
331
+ Pick colors that match the brand. Map them to semantic roles:
332
+
333
+ ```ts
334
+ // app.config.ts (Nuxt) or vite.config.ts (Vue)
335
+ ui: {
336
+ colors: {
337
+ primary: 'emerald', // brand accent
338
+ secondary: 'amber', // secondary accent
339
+ success: 'green',
340
+ info: 'sky',
341
+ warning: 'orange',
342
+ error: 'rose',
343
+ neutral: 'stone' // affects all text, borders, backgrounds
344
+ }
345
+ }
346
+ ```
347
+
348
+ If no Tailwind default color fits, define custom shades in CSS (see [Adding custom colors](#adding-custom-colors)):
349
+
350
+ ```css
351
+ @theme static {
352
+ --color-forest-50: #f0fdf4;
353
+ /* ... all 11 shades (50–950) ... */
354
+ --color-forest-950: #052e16;
355
+ }
356
+ ```
357
+
358
+ Then use it: `primary: 'forest'`.
359
+
360
+ ### Step 2 — Set fonts
361
+
362
+ ```css
363
+ /* assets/css/main.css */
364
+ @theme {
365
+ --font-sans: 'Quicksand', system-ui, sans-serif;
366
+ }
367
+ ```
368
+
369
+ ### Step 3 — Adjust CSS variables
370
+
371
+ ```css
372
+ :root {
373
+ --ui-radius: 0.75rem; /* rounder = softer/playful, smaller = sharper/corporate */
374
+ --ui-primary: var(--ui-color-primary-600); /* adjust which shade is used */
375
+ }
376
+
377
+ .dark {
378
+ --ui-primary: var(--ui-color-primary-400);
379
+ }
380
+ ```
381
+
382
+ ### Step 4 — Override key components globally
383
+
384
+ Read the generated theme files to find slot names, then apply global overrides:
385
+
386
+ ```ts
387
+ // app.config.ts (Nuxt) or vite.config.ts (Vue)
388
+ ui: {
389
+ // ... colors from Step 1
390
+ button: {
391
+ slots: {
392
+ base: 'rounded-full font-semibold'
393
+ },
394
+ defaultVariants: {
395
+ variant: 'soft'
396
+ }
397
+ },
398
+ card: {
399
+ slots: {
400
+ root: 'rounded-2xl shadow-lg'
401
+ }
402
+ },
403
+ badge: {
404
+ slots: {
405
+ base: 'rounded-full'
406
+ }
407
+ }
408
+ }
409
+ ```
410
+
411
+ > **Tip**: Read `.nuxt/ui/button.ts` (Nuxt) or `node_modules/.nuxt-ui/ui/button.ts` (Vue) to see all available slots and variants before overriding.
412
+
413
+ ### Step 5 — Verify dark mode
414
+
415
+ Check that both modes look correct. Adjust `--ui-primary` shade per mode and test contrast. Use `useColorMode()` to toggle during development.
416
+
417
+ ### Quick checklist
418
+
419
+ | Step | What to change | Where |
420
+ |---|---|---|
421
+ | Colors | `primary`, `secondary`, `neutral` | `app.config.ts` / `vite.config.ts` |
422
+ | Custom palette | 11 shades per color | `main.css` (`@theme static`) |
423
+ | Fonts | `--font-sans`, `--font-mono` | `main.css` (`@theme`) |
424
+ | Radius | `--ui-radius` | `main.css` (`:root`) |
425
+ | Primary shade | `--ui-primary` | `main.css` (`:root` + `.dark`) |
426
+ | Component shapes | Global slot overrides | `app.config.ts` / `vite.config.ts` |
427
+ | Dark mode | Verify contrast, adjust variables | `main.css` (`.dark`) |
@@ -0,0 +1,146 @@
1
+ ---
2
+ name: postgres-patterns
3
+ description: PostgreSQL database patterns for query optimization, schema design, indexing, and security. Based on Supabase best practices.
4
+ ---
5
+
6
+ # PostgreSQL Patterns
7
+
8
+ Quick reference for PostgreSQL best practices. For detailed guidance, use the `database-reviewer` agent.
9
+
10
+ ## When to Activate
11
+
12
+ - Writing SQL queries or migrations
13
+ - Designing database schemas
14
+ - Troubleshooting slow queries
15
+ - Implementing Row Level Security
16
+ - Setting up connection pooling
17
+
18
+ ## Quick Reference
19
+
20
+ ### Index Cheat Sheet
21
+
22
+ | Query Pattern | Index Type | Example |
23
+ |--------------|------------|---------|
24
+ | `WHERE col = value` | B-tree (default) | `CREATE INDEX idx ON t (col)` |
25
+ | `WHERE col > value` | B-tree | `CREATE INDEX idx ON t (col)` |
26
+ | `WHERE a = x AND b > y` | Composite | `CREATE INDEX idx ON t (a, b)` |
27
+ | `WHERE jsonb @> '{}'` | GIN | `CREATE INDEX idx ON t USING gin (col)` |
28
+ | `WHERE tsv @@ query` | GIN | `CREATE INDEX idx ON t USING gin (col)` |
29
+ | Time-series ranges | BRIN | `CREATE INDEX idx ON t USING brin (col)` |
30
+
31
+ ### Data Type Quick Reference
32
+
33
+ | Use Case | Correct Type | Avoid |
34
+ |----------|-------------|-------|
35
+ | IDs | `bigint` | `int`, random UUID |
36
+ | Strings | `text` | `varchar(255)` |
37
+ | Timestamps | `timestamptz` | `timestamp` |
38
+ | Money | `numeric(10,2)` | `float` |
39
+ | Flags | `boolean` | `varchar`, `int` |
40
+
41
+ ### Common Patterns
42
+
43
+ **Composite Index Order:**
44
+ ```sql
45
+ -- Equality columns first, then range columns
46
+ CREATE INDEX idx ON orders (status, created_at);
47
+ -- Works for: WHERE status = 'pending' AND created_at > '2024-01-01'
48
+ ```
49
+
50
+ **Covering Index:**
51
+ ```sql
52
+ CREATE INDEX idx ON users (email) INCLUDE (name, created_at);
53
+ -- Avoids table lookup for SELECT email, name, created_at
54
+ ```
55
+
56
+ **Partial Index:**
57
+ ```sql
58
+ CREATE INDEX idx ON users (email) WHERE deleted_at IS NULL;
59
+ -- Smaller index, only includes active users
60
+ ```
61
+
62
+ **RLS Policy (Optimized):**
63
+ ```sql
64
+ CREATE POLICY policy ON orders
65
+ USING ((SELECT auth.uid()) = user_id); -- Wrap in SELECT!
66
+ ```
67
+
68
+ **UPSERT:**
69
+ ```sql
70
+ INSERT INTO settings (user_id, key, value)
71
+ VALUES (123, 'theme', 'dark')
72
+ ON CONFLICT (user_id, key)
73
+ DO UPDATE SET value = EXCLUDED.value;
74
+ ```
75
+
76
+ **Cursor Pagination:**
77
+ ```sql
78
+ SELECT * FROM products WHERE id > $last_id ORDER BY id LIMIT 20;
79
+ -- O(1) vs OFFSET which is O(n)
80
+ ```
81
+
82
+ **Queue Processing:**
83
+ ```sql
84
+ UPDATE jobs SET status = 'processing'
85
+ WHERE id = (
86
+ SELECT id FROM jobs WHERE status = 'pending'
87
+ ORDER BY created_at LIMIT 1
88
+ FOR UPDATE SKIP LOCKED
89
+ ) RETURNING *;
90
+ ```
91
+
92
+ ### Anti-Pattern Detection
93
+
94
+ ```sql
95
+ -- Find unindexed foreign keys
96
+ SELECT conrelid::regclass, a.attname
97
+ FROM pg_constraint c
98
+ JOIN pg_attribute a ON a.attrelid = c.conrelid AND a.attnum = ANY(c.conkey)
99
+ WHERE c.contype = 'f'
100
+ AND NOT EXISTS (
101
+ SELECT 1 FROM pg_index i
102
+ WHERE i.indrelid = c.conrelid AND a.attnum = ANY(i.indkey)
103
+ );
104
+
105
+ -- Find slow queries
106
+ SELECT query, mean_exec_time, calls
107
+ FROM pg_stat_statements
108
+ WHERE mean_exec_time > 100
109
+ ORDER BY mean_exec_time DESC;
110
+
111
+ -- Check table bloat
112
+ SELECT relname, n_dead_tup, last_vacuum
113
+ FROM pg_stat_user_tables
114
+ WHERE n_dead_tup > 1000
115
+ ORDER BY n_dead_tup DESC;
116
+ ```
117
+
118
+ ### Configuration Template
119
+
120
+ ```sql
121
+ -- Connection limits (adjust for RAM)
122
+ ALTER SYSTEM SET max_connections = 100;
123
+ ALTER SYSTEM SET work_mem = '8MB';
124
+
125
+ -- Timeouts
126
+ ALTER SYSTEM SET idle_in_transaction_session_timeout = '30s';
127
+ ALTER SYSTEM SET statement_timeout = '30s';
128
+
129
+ -- Monitoring
130
+ CREATE EXTENSION IF NOT EXISTS pg_stat_statements;
131
+
132
+ -- Security defaults
133
+ REVOKE ALL ON SCHEMA public FROM public;
134
+
135
+ SELECT pg_reload_conf();
136
+ ```
137
+
138
+ ## Related
139
+
140
+ - Agent: `database-reviewer` - Full database review workflow
141
+ - Skill: `clickhouse-io` - ClickHouse analytics patterns
142
+ - Skill: `backend-patterns` - API and backend patterns
143
+
144
+ ---
145
+
146
+ *Based on [Supabase Agent Skills](https://github.com/supabase/agent-skills) (MIT License)*