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.
- package/README.md +796 -0
- package/bin/commands/init.mjs +221 -0
- package/bin/init.mjs +21 -0
- package/package.json +22 -0
- package/template/.opencode/agent-docs/backend/README.md +0 -0
- package/template/.opencode/agent-docs/backend/node/BACKEND_PATTERNS.md +82 -0
- package/template/.opencode/agent-docs/backend/node/BACKEND_QUICK_START.md +49 -0
- package/template/.opencode/agent-docs/frontend/next/README.md +0 -0
- package/template/.opencode/agent-docs/frontend/nuxt/API_PATTERNS.md +807 -0
- package/template/.opencode/agent-docs/frontend/nuxt/CHEATSHEET.md +676 -0
- package/template/.opencode/agent-docs/frontend/nuxt/COMPLETION_REPORT.md +613 -0
- package/template/.opencode/agent-docs/frontend/nuxt/EXAMPLES.md +956 -0
- package/template/.opencode/agent-docs/frontend/nuxt/INDEX.md +596 -0
- package/template/.opencode/agent-docs/frontend/nuxt/MCP_GUIDE.md +881 -0
- package/template/.opencode/agent-docs/frontend/nuxt/MENTOR_CURRICULUM_30_DAYS.md +256 -0
- package/template/.opencode/agent-docs/frontend/nuxt/MENTOR_CURRICULUM_CHECKLIST.md +156 -0
- package/template/.opencode/agent-docs/frontend/nuxt/MENTOR_WEEKLY_ASSIGNMENTS.md +191 -0
- package/template/.opencode/agent-docs/frontend/nuxt/QUICK_START.md +509 -0
- package/template/.opencode/agent-docs/frontend/nuxt/README.md +506 -0
- package/template/.opencode/agent-docs/frontend/nuxt/README_AGENTS.md +140 -0
- package/template/.opencode/agent-docs/frontend/nuxt/README_DOCS.md +65 -0
- package/template/.opencode/agent-docs/frontend/nuxt/SUMMARY.md +474 -0
- package/template/.opencode/agent-docs/frontend/nuxt/TEAM_OPERATING_GUIDE.md +54 -0
- package/template/.opencode/agent-docs/frontend/nuxt/TESTING_GUIDE.md +904 -0
- package/template/.opencode/agent-docs/frontend/nuxt/WORKFLOWS.md +758 -0
- package/template/.opencode/agent-docs/frontend/react/API_PATTERNS.md +187 -0
- package/template/.opencode/agent-docs/frontend/react/CHEATSHEET.md +87 -0
- package/template/.opencode/agent-docs/frontend/react/INDEX.md +45 -0
- package/template/.opencode/agent-docs/frontend/react/QUICK_START.md +43 -0
- package/template/.opencode/agent-docs/frontend/react/README.md +159 -0
- package/template/.opencode/agent-docs/frontend/vue/README.md +0 -0
- package/template/.opencode/agent-docs/mobile/android/README.md +45 -0
- package/template/.opencode/agent-docs/mobile/flutter/README.md +44 -0
- package/template/.opencode/agents/android-developer.md +418 -0
- package/template/.opencode/agents/code-igniter-3-fullstack.md +345 -0
- package/template/.opencode/agents/code-reviewer.md +517 -0
- package/template/.opencode/agents/database-specialist.md +455 -0
- package/template/.opencode/agents/devops-specialist.md +562 -0
- package/template/.opencode/agents/flutter-developer.md +556 -0
- package/template/.opencode/agents/it-leader.md +911 -0
- package/template/.opencode/agents/laravel-advanced.md +691 -0
- package/template/.opencode/agents/node-backend-developer.md +343 -0
- package/template/.opencode/agents/nuxt-frontend-developer-mentor.md +402 -0
- package/template/.opencode/agents/nuxt-frontend-developer.md +1573 -0
- package/template/.opencode/agents/react-frontend-developer.md +1017 -0
- package/template/.opencode/agents/seo-specialist.md +681 -0
- package/template/.opencode/agents/ui-ux-designer.md +783 -0
- package/template/.opencode/commands/android-build/command.md +25 -0
- package/template/.opencode/commands/android-test/command.md +23 -0
- package/template/.opencode/commands/build-fix.md +29 -0
- package/template/.opencode/commands/checkpoint.md +74 -0
- package/template/.opencode/commands/code-review.md +40 -0
- package/template/.opencode/commands/e2e.md +363 -0
- package/template/.opencode/commands/eval.md +120 -0
- package/template/.opencode/commands/evolve.md +193 -0
- package/template/.opencode/commands/flutter-build/command.md +25 -0
- package/template/.opencode/commands/flutter-test/command.md +24 -0
- package/template/.opencode/commands/go-build.md +183 -0
- package/template/.opencode/commands/go-review.md +148 -0
- package/template/.opencode/commands/go-test.md +268 -0
- package/template/.opencode/commands/gpc-release/command.md +30 -0
- package/template/.opencode/commands/instinct-export.md +91 -0
- package/template/.opencode/commands/instinct-import.md +142 -0
- package/template/.opencode/commands/instinct-status.md +86 -0
- package/template/.opencode/commands/learn.md +70 -0
- package/template/.opencode/commands/multi-backend.md +158 -0
- package/template/.opencode/commands/multi-execute.md +310 -0
- package/template/.opencode/commands/multi-frontend.md +158 -0
- package/template/.opencode/commands/multi-plan.md +261 -0
- package/template/.opencode/commands/multi-workflow.md +183 -0
- package/template/.opencode/commands/orchestrate.md +172 -0
- package/template/.opencode/commands/plan.md +113 -0
- package/template/.opencode/commands/pm2.md +271 -0
- package/template/.opencode/commands/python-review.md +297 -0
- package/template/.opencode/commands/refactor-clean.md +28 -0
- package/template/.opencode/commands/sessions.md +305 -0
- package/template/.opencode/commands/setup-pm.md +80 -0
- package/template/.opencode/commands/skill-create.md +174 -0
- package/template/.opencode/commands/tdd.md +326 -0
- package/template/.opencode/commands/test-coverage.md +27 -0
- package/template/.opencode/commands/update-codemaps.md +17 -0
- package/template/.opencode/commands/update-docs.md +31 -0
- package/template/.opencode/commands/verify.md +59 -0
- package/template/.opencode/config.example.json +309 -0
- package/template/.opencode/config.json +341 -0
- package/template/.opencode/contexts/dev.md +20 -0
- package/template/.opencode/contexts/research.md +26 -0
- package/template/.opencode/contexts/review.md +22 -0
- package/template/.opencode/hooks/hooks.json +169 -0
- package/template/.opencode/instructions/INSTRUCTIONS.md +388 -0
- package/template/.opencode/package.json +5 -0
- package/template/.opencode/rules/README.md +82 -0
- package/template/.opencode/rules/android/gradle.md +62 -0
- package/template/.opencode/rules/android/testing.md +27 -0
- package/template/.opencode/rules/common/agents.md +49 -0
- package/template/.opencode/rules/common/coding-style.md +48 -0
- package/template/.opencode/rules/common/git-workflow.md +45 -0
- package/template/.opencode/rules/common/hooks.md +30 -0
- package/template/.opencode/rules/common/patterns.md +31 -0
- package/template/.opencode/rules/common/performance.md +55 -0
- package/template/.opencode/rules/common/security.md +29 -0
- package/template/.opencode/rules/common/testing.md +29 -0
- package/template/.opencode/rules/flutter/state-management.md +57 -0
- package/template/.opencode/rules/flutter/testing.md +42 -0
- package/template/.opencode/rules/golang/coding-style.md +26 -0
- package/template/.opencode/rules/golang/hooks.md +11 -0
- package/template/.opencode/rules/golang/patterns.md +39 -0
- package/template/.opencode/rules/golang/security.md +28 -0
- package/template/.opencode/rules/golang/testing.md +25 -0
- package/template/.opencode/rules/mobile/performance.md +36 -0
- package/template/.opencode/rules/python/coding-style.md +37 -0
- package/template/.opencode/rules/python/hooks.md +14 -0
- package/template/.opencode/rules/python/patterns.md +34 -0
- package/template/.opencode/rules/python/security.md +25 -0
- package/template/.opencode/rules/python/testing.md +33 -0
- package/template/.opencode/rules/typescript/coding-style.md +58 -0
- package/template/.opencode/rules/typescript/hooks.md +15 -0
- package/template/.opencode/rules/typescript/patterns.md +45 -0
- package/template/.opencode/rules/typescript/security.md +21 -0
- package/template/.opencode/rules/typescript/testing.md +11 -0
- package/template/.opencode/skills/api-documentation/SKILL.md +188 -0
- package/template/.opencode/skills/backend-patterns/SKILL.md +587 -0
- package/template/.opencode/skills/building-components/SKILL.md +37 -0
- package/template/.opencode/skills/building-components/references/accessibility.mdx +819 -0
- package/template/.opencode/skills/building-components/references/as-child.mdx +324 -0
- package/template/.opencode/skills/building-components/references/composition.mdx +239 -0
- package/template/.opencode/skills/building-components/references/data-attributes.mdx +413 -0
- package/template/.opencode/skills/building-components/references/definitions.mdx +258 -0
- package/template/.opencode/skills/building-components/references/design-tokens.mdx +57 -0
- package/template/.opencode/skills/building-components/references/docs.mdx +155 -0
- package/template/.opencode/skills/building-components/references/marketplaces.mdx +144 -0
- package/template/.opencode/skills/building-components/references/npm.mdx +166 -0
- package/template/.opencode/skills/building-components/references/polymorphism.mdx +583 -0
- package/template/.opencode/skills/building-components/references/principles.mdx +61 -0
- package/template/.opencode/skills/building-components/references/registry.mdx +169 -0
- package/template/.opencode/skills/building-components/references/state.mdx +99 -0
- package/template/.opencode/skills/building-components/references/styling.mdx +286 -0
- package/template/.opencode/skills/building-components/references/types.mdx +191 -0
- package/template/.opencode/skills/clickhouse-io/SKILL.md +429 -0
- package/template/.opencode/skills/coding-standards/SKILL.md +520 -0
- package/template/.opencode/skills/configure-ecc/SKILL.md +298 -0
- package/template/.opencode/skills/continuous-learning/SKILL.md +110 -0
- package/template/.opencode/skills/continuous-learning/config.json +18 -0
- package/template/.opencode/skills/continuous-learning/evaluate-session.sh +60 -0
- package/template/.opencode/skills/continuous-learning-v2/SKILL.md +284 -0
- package/template/.opencode/skills/continuous-learning-v2/agents/observer.md +137 -0
- package/template/.opencode/skills/continuous-learning-v2/agents/start-observer.sh +134 -0
- package/template/.opencode/skills/continuous-learning-v2/config.json +41 -0
- package/template/.opencode/skills/continuous-learning-v2/hooks/observe.sh +153 -0
- package/template/.opencode/skills/continuous-learning-v2/scripts/instinct-cli.py +489 -0
- package/template/.opencode/skills/continuous-learning-v2/scripts/test_parse_instinct.py +82 -0
- package/template/.opencode/skills/dart-add-unit-test/SKILL.md +122 -0
- package/template/.opencode/skills/dart-build-cli-app/SKILL.md +185 -0
- package/template/.opencode/skills/dart-collect-coverage/SKILL.md +141 -0
- package/template/.opencode/skills/dart-fix-runtime-errors/SKILL.md +166 -0
- package/template/.opencode/skills/dart-generate-test-mocks/SKILL.md +155 -0
- package/template/.opencode/skills/dart-migrate-to-checks-package/SKILL.md +126 -0
- package/template/.opencode/skills/dart-resolve-package-conflicts/SKILL.md +116 -0
- package/template/.opencode/skills/dart-run-static-analysis/SKILL.md +104 -0
- package/template/.opencode/skills/dart-use-pattern-matching/SKILL.md +146 -0
- package/template/.opencode/skills/django-patterns/SKILL.md +733 -0
- package/template/.opencode/skills/django-security/SKILL.md +592 -0
- package/template/.opencode/skills/django-tdd/SKILL.md +728 -0
- package/template/.opencode/skills/django-verification/SKILL.md +460 -0
- package/template/.opencode/skills/eval-harness/SKILL.md +227 -0
- package/template/.opencode/skills/firebase-basics/SKILL.md +103 -0
- package/template/.opencode/skills/firebase-basics/references/additional-skills.md +113 -0
- package/template/.opencode/skills/firebase-basics/references/cli-usage.md +31 -0
- package/template/.opencode/skills/firebase-basics/references/client-library-usage.md +45 -0
- package/template/.opencode/skills/firebase-basics/references/core-concepts.md +61 -0
- package/template/.opencode/skills/firebase-basics/references/iac-usage.md +40 -0
- package/template/.opencode/skills/firebase-basics/references/iam-security.md +74 -0
- package/template/.opencode/skills/firebase-basics/references/mcp-usage.md +63 -0
- package/template/.opencode/skills/flutter/SKILL.md +292 -0
- package/template/.opencode/skills/flutter-add-integration-test/SKILL.md +163 -0
- package/template/.opencode/skills/flutter-add-widget-preview/SKILL.md +145 -0
- package/template/.opencode/skills/flutter-add-widget-test/SKILL.md +154 -0
- package/template/.opencode/skills/flutter-apply-architecture-best-practices/SKILL.md +162 -0
- package/template/.opencode/skills/flutter-build-responsive-layout/SKILL.md +139 -0
- package/template/.opencode/skills/flutter-fix-layout-issues/SKILL.md +130 -0
- package/template/.opencode/skills/flutter-implement-json-serialization/SKILL.md +153 -0
- package/template/.opencode/skills/flutter-setup-declarative-routing/SKILL.md +255 -0
- package/template/.opencode/skills/flutter-setup-localization/SKILL.md +210 -0
- package/template/.opencode/skills/flutter-use-http-package/SKILL.md +174 -0
- package/template/.opencode/skills/frontend-design/SKILL.md +89 -0
- package/template/.opencode/skills/frontend-patterns/SKILL.md +631 -0
- package/template/.opencode/skills/golang-patterns/SKILL.md +673 -0
- package/template/.opencode/skills/golang-testing/SKILL.md +719 -0
- package/template/.opencode/skills/impeccable/SKILL.md +165 -0
- package/template/.opencode/skills/impeccable/agents/impeccable-asset-producer.md +101 -0
- package/template/.opencode/skills/impeccable/reference/adapt.md +190 -0
- package/template/.opencode/skills/impeccable/reference/animate.md +175 -0
- package/template/.opencode/skills/impeccable/reference/audit.md +133 -0
- package/template/.opencode/skills/impeccable/reference/bolder.md +113 -0
- package/template/.opencode/skills/impeccable/reference/brand.md +118 -0
- package/template/.opencode/skills/impeccable/reference/clarify.md +174 -0
- package/template/.opencode/skills/impeccable/reference/codex.md +105 -0
- package/template/.opencode/skills/impeccable/reference/cognitive-load.md +106 -0
- package/template/.opencode/skills/impeccable/reference/color-and-contrast.md +105 -0
- package/template/.opencode/skills/impeccable/reference/colorize.md +154 -0
- package/template/.opencode/skills/impeccable/reference/craft.md +123 -0
- package/template/.opencode/skills/impeccable/reference/critique.md +273 -0
- package/template/.opencode/skills/impeccable/reference/delight.md +302 -0
- package/template/.opencode/skills/impeccable/reference/distill.md +111 -0
- package/template/.opencode/skills/impeccable/reference/document.md +427 -0
- package/template/.opencode/skills/impeccable/reference/extract.md +69 -0
- package/template/.opencode/skills/impeccable/reference/harden.md +347 -0
- package/template/.opencode/skills/impeccable/reference/heuristics-scoring.md +234 -0
- package/template/.opencode/skills/impeccable/reference/interaction-design.md +195 -0
- package/template/.opencode/skills/impeccable/reference/layout.md +141 -0
- package/template/.opencode/skills/impeccable/reference/live.md +622 -0
- package/template/.opencode/skills/impeccable/reference/motion-design.md +109 -0
- package/template/.opencode/skills/impeccable/reference/onboard.md +234 -0
- package/template/.opencode/skills/impeccable/reference/optimize.md +258 -0
- package/template/.opencode/skills/impeccable/reference/overdrive.md +130 -0
- package/template/.opencode/skills/impeccable/reference/personas.md +179 -0
- package/template/.opencode/skills/impeccable/reference/polish.md +242 -0
- package/template/.opencode/skills/impeccable/reference/product.md +62 -0
- package/template/.opencode/skills/impeccable/reference/quieter.md +99 -0
- package/template/.opencode/skills/impeccable/reference/responsive-design.md +114 -0
- package/template/.opencode/skills/impeccable/reference/shape.md +165 -0
- package/template/.opencode/skills/impeccable/reference/spatial-design.md +100 -0
- package/template/.opencode/skills/impeccable/reference/teach.md +156 -0
- package/template/.opencode/skills/impeccable/reference/typeset.md +124 -0
- package/template/.opencode/skills/impeccable/reference/typography.md +159 -0
- package/template/.opencode/skills/impeccable/reference/ux-writing.md +107 -0
- package/template/.opencode/skills/impeccable/scripts/cleanup-deprecated.mjs +284 -0
- package/template/.opencode/skills/impeccable/scripts/command-metadata.json +94 -0
- package/template/.opencode/skills/impeccable/scripts/critique-storage.mjs +242 -0
- package/template/.opencode/skills/impeccable/scripts/design-parser.mjs +820 -0
- package/template/.opencode/skills/impeccable/scripts/detect-csp.mjs +198 -0
- package/template/.opencode/skills/impeccable/scripts/detect.mjs +21 -0
- package/template/.opencode/skills/impeccable/scripts/impeccable-paths.mjs +110 -0
- package/template/.opencode/skills/impeccable/scripts/is-generated.mjs +69 -0
- package/template/.opencode/skills/impeccable/scripts/live-accept.mjs +595 -0
- package/template/.opencode/skills/impeccable/scripts/live-browser-session.js +123 -0
- package/template/.opencode/skills/impeccable/scripts/live-browser.js +4860 -0
- package/template/.opencode/skills/impeccable/scripts/live-complete.mjs +75 -0
- package/template/.opencode/skills/impeccable/scripts/live-completion.mjs +18 -0
- package/template/.opencode/skills/impeccable/scripts/live-inject.mjs +446 -0
- package/template/.opencode/skills/impeccable/scripts/live-poll.mjs +200 -0
- package/template/.opencode/skills/impeccable/scripts/live-resume.mjs +48 -0
- package/template/.opencode/skills/impeccable/scripts/live-server.mjs +838 -0
- package/template/.opencode/skills/impeccable/scripts/live-session-store.mjs +254 -0
- package/template/.opencode/skills/impeccable/scripts/live-status.mjs +47 -0
- package/template/.opencode/skills/impeccable/scripts/live-wrap.mjs +632 -0
- package/template/.opencode/skills/impeccable/scripts/live.mjs +247 -0
- package/template/.opencode/skills/impeccable/scripts/load-context.mjs +141 -0
- package/template/.opencode/skills/impeccable/scripts/modern-screenshot.umd.js +14 -0
- package/template/.opencode/skills/impeccable/scripts/pin.mjs +214 -0
- package/template/.opencode/skills/iterative-retrieval/SKILL.md +202 -0
- package/template/.opencode/skills/java-coding-standards/SKILL.md +138 -0
- package/template/.opencode/skills/jetpack-compose/.skillfish.json +10 -0
- package/template/.opencode/skills/jetpack-compose/SKILL.md +420 -0
- package/template/.opencode/skills/jpa-patterns/SKILL.md +141 -0
- package/template/.opencode/skills/nutrient-document-processing/SKILL.md +165 -0
- package/template/.opencode/skills/nuxt-ui/SKILL.md +334 -0
- package/template/.opencode/skills/nuxt-ui/references/components.md +377 -0
- package/template/.opencode/skills/nuxt-ui/references/composables.md +127 -0
- package/template/.opencode/skills/nuxt-ui/references/layouts/chat.md +266 -0
- package/template/.opencode/skills/nuxt-ui/references/layouts/dashboard.md +220 -0
- package/template/.opencode/skills/nuxt-ui/references/layouts/docs.md +141 -0
- package/template/.opencode/skills/nuxt-ui/references/layouts/editor.md +168 -0
- package/template/.opencode/skills/nuxt-ui/references/layouts/page.md +260 -0
- package/template/.opencode/skills/nuxt-ui/references/theming.md +427 -0
- package/template/.opencode/skills/postgres-patterns/SKILL.md +146 -0
- package/template/.opencode/skills/project-guidelines-example/SKILL.md +345 -0
- package/template/.opencode/skills/python-patterns/SKILL.md +749 -0
- package/template/.opencode/skills/python-testing/SKILL.md +815 -0
- package/template/.opencode/skills/security-review/SKILL.md +494 -0
- package/template/.opencode/skills/security-review/cloud-infrastructure-security.md +361 -0
- package/template/.opencode/skills/shadcn-ui/README.md +248 -0
- package/template/.opencode/skills/shadcn-ui/SKILL.md +326 -0
- package/template/.opencode/skills/shadcn-ui/examples/auth-layout.tsx +177 -0
- package/template/.opencode/skills/shadcn-ui/examples/data-table.tsx +313 -0
- package/template/.opencode/skills/shadcn-ui/examples/form-pattern.tsx +177 -0
- package/template/.opencode/skills/shadcn-ui/resources/component-catalog.md +481 -0
- package/template/.opencode/skills/shadcn-ui/resources/customization-guide.md +516 -0
- package/template/.opencode/skills/shadcn-ui/resources/migration-guide.md +463 -0
- package/template/.opencode/skills/shadcn-ui/resources/setup-guide.md +412 -0
- package/template/.opencode/skills/shadcn-ui/scripts/verify-setup.sh +134 -0
- package/template/.opencode/skills/springboot-patterns/SKILL.md +304 -0
- package/template/.opencode/skills/springboot-security/SKILL.md +119 -0
- package/template/.opencode/skills/springboot-tdd/SKILL.md +157 -0
- package/template/.opencode/skills/springboot-verification/SKILL.md +100 -0
- package/template/.opencode/skills/strategic-compact/SKILL.md +63 -0
- package/template/.opencode/skills/strategic-compact/suggest-compact.sh +52 -0
- package/template/.opencode/skills/tdd-workflow/SKILL.md +409 -0
- package/template/.opencode/skills/vercel-composition-patterns/AGENTS.md +946 -0
- package/template/.opencode/skills/vercel-composition-patterns/SKILL.md +89 -0
- package/template/.opencode/skills/vercel-composition-patterns/rules/architecture-avoid-boolean-props.md +100 -0
- package/template/.opencode/skills/vercel-composition-patterns/rules/architecture-compound-components.md +112 -0
- package/template/.opencode/skills/vercel-composition-patterns/rules/patterns-children-over-render-props.md +87 -0
- package/template/.opencode/skills/vercel-composition-patterns/rules/patterns-explicit-variants.md +100 -0
- package/template/.opencode/skills/vercel-composition-patterns/rules/react19-no-forwardref.md +42 -0
- package/template/.opencode/skills/vercel-composition-patterns/rules/state-context-interface.md +191 -0
- package/template/.opencode/skills/vercel-composition-patterns/rules/state-decouple-implementation.md +113 -0
- package/template/.opencode/skills/vercel-composition-patterns/rules/state-lift-state.md +125 -0
- package/template/.opencode/skills/vercel-react-best-practices/AGENTS.md +2934 -0
- package/template/.opencode/skills/vercel-react-best-practices/SKILL.md +136 -0
- package/template/.opencode/skills/vercel-react-best-practices/rules/advanced-event-handler-refs.md +55 -0
- package/template/.opencode/skills/vercel-react-best-practices/rules/advanced-init-once.md +42 -0
- package/template/.opencode/skills/vercel-react-best-practices/rules/advanced-use-latest.md +39 -0
- package/template/.opencode/skills/vercel-react-best-practices/rules/async-api-routes.md +38 -0
- package/template/.opencode/skills/vercel-react-best-practices/rules/async-defer-await.md +80 -0
- package/template/.opencode/skills/vercel-react-best-practices/rules/async-dependencies.md +51 -0
- package/template/.opencode/skills/vercel-react-best-practices/rules/async-parallel.md +28 -0
- package/template/.opencode/skills/vercel-react-best-practices/rules/async-suspense-boundaries.md +99 -0
- package/template/.opencode/skills/vercel-react-best-practices/rules/bundle-barrel-imports.md +59 -0
- package/template/.opencode/skills/vercel-react-best-practices/rules/bundle-conditional.md +31 -0
- package/template/.opencode/skills/vercel-react-best-practices/rules/bundle-defer-third-party.md +49 -0
- package/template/.opencode/skills/vercel-react-best-practices/rules/bundle-dynamic-imports.md +35 -0
- package/template/.opencode/skills/vercel-react-best-practices/rules/bundle-preload.md +50 -0
- package/template/.opencode/skills/vercel-react-best-practices/rules/client-event-listeners.md +74 -0
- package/template/.opencode/skills/vercel-react-best-practices/rules/client-localstorage-schema.md +71 -0
- package/template/.opencode/skills/vercel-react-best-practices/rules/client-passive-event-listeners.md +48 -0
- package/template/.opencode/skills/vercel-react-best-practices/rules/client-swr-dedup.md +56 -0
- package/template/.opencode/skills/vercel-react-best-practices/rules/js-batch-dom-css.md +107 -0
- package/template/.opencode/skills/vercel-react-best-practices/rules/js-cache-function-results.md +80 -0
- package/template/.opencode/skills/vercel-react-best-practices/rules/js-cache-property-access.md +28 -0
- package/template/.opencode/skills/vercel-react-best-practices/rules/js-cache-storage.md +70 -0
- package/template/.opencode/skills/vercel-react-best-practices/rules/js-combine-iterations.md +32 -0
- package/template/.opencode/skills/vercel-react-best-practices/rules/js-early-exit.md +50 -0
- package/template/.opencode/skills/vercel-react-best-practices/rules/js-hoist-regexp.md +45 -0
- package/template/.opencode/skills/vercel-react-best-practices/rules/js-index-maps.md +37 -0
- package/template/.opencode/skills/vercel-react-best-practices/rules/js-length-check-first.md +49 -0
- package/template/.opencode/skills/vercel-react-best-practices/rules/js-min-max-loop.md +82 -0
- package/template/.opencode/skills/vercel-react-best-practices/rules/js-set-map-lookups.md +24 -0
- package/template/.opencode/skills/vercel-react-best-practices/rules/js-tosorted-immutable.md +57 -0
- package/template/.opencode/skills/vercel-react-best-practices/rules/rendering-activity.md +26 -0
- package/template/.opencode/skills/vercel-react-best-practices/rules/rendering-animate-svg-wrapper.md +47 -0
- package/template/.opencode/skills/vercel-react-best-practices/rules/rendering-conditional-render.md +40 -0
- package/template/.opencode/skills/vercel-react-best-practices/rules/rendering-content-visibility.md +38 -0
- package/template/.opencode/skills/vercel-react-best-practices/rules/rendering-hoist-jsx.md +46 -0
- package/template/.opencode/skills/vercel-react-best-practices/rules/rendering-hydration-no-flicker.md +82 -0
- package/template/.opencode/skills/vercel-react-best-practices/rules/rendering-hydration-suppress-warning.md +30 -0
- package/template/.opencode/skills/vercel-react-best-practices/rules/rendering-svg-precision.md +28 -0
- package/template/.opencode/skills/vercel-react-best-practices/rules/rendering-usetransition-loading.md +75 -0
- package/template/.opencode/skills/vercel-react-best-practices/rules/rerender-defer-reads.md +39 -0
- package/template/.opencode/skills/vercel-react-best-practices/rules/rerender-dependencies.md +45 -0
- package/template/.opencode/skills/vercel-react-best-practices/rules/rerender-derived-state-no-effect.md +40 -0
- package/template/.opencode/skills/vercel-react-best-practices/rules/rerender-derived-state.md +29 -0
- package/template/.opencode/skills/vercel-react-best-practices/rules/rerender-functional-setstate.md +74 -0
- package/template/.opencode/skills/vercel-react-best-practices/rules/rerender-lazy-state-init.md +58 -0
- package/template/.opencode/skills/vercel-react-best-practices/rules/rerender-memo-with-default-value.md +38 -0
- package/template/.opencode/skills/vercel-react-best-practices/rules/rerender-memo.md +44 -0
- package/template/.opencode/skills/vercel-react-best-practices/rules/rerender-move-effect-to-event.md +45 -0
- package/template/.opencode/skills/vercel-react-best-practices/rules/rerender-simple-expression-in-memo.md +35 -0
- package/template/.opencode/skills/vercel-react-best-practices/rules/rerender-transitions.md +40 -0
- package/template/.opencode/skills/vercel-react-best-practices/rules/rerender-use-ref-transient-values.md +73 -0
- package/template/.opencode/skills/vercel-react-best-practices/rules/server-after-nonblocking.md +73 -0
- package/template/.opencode/skills/vercel-react-best-practices/rules/server-auth-actions.md +96 -0
- package/template/.opencode/skills/vercel-react-best-practices/rules/server-cache-lru.md +41 -0
- package/template/.opencode/skills/vercel-react-best-practices/rules/server-cache-react.md +76 -0
- package/template/.opencode/skills/vercel-react-best-practices/rules/server-dedup-props.md +65 -0
- package/template/.opencode/skills/vercel-react-best-practices/rules/server-parallel-fetching.md +83 -0
- package/template/.opencode/skills/vercel-react-best-practices/rules/server-serialization.md +38 -0
- package/template/.opencode/skills/verification-loop/SKILL.md +120 -0
- package/template/.opencode/skills/web-design-guidelines/SKILL.md +39 -0
- package/template/AGENTS.md +32 -0
- 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)*
|