agent-skill-kit 3.9.135
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/.agent/global.d.ts +80 -0
- package/.agent/rules/GEMINI.md +210 -0
- package/.agent/rules/autopilot.md +287 -0
- package/.agent/rules/code-rules.md +227 -0
- package/.agent/scripts/audit_workflows.ts +23 -0
- package/.agent/scripts/auto_preview.ts +170 -0
- package/.agent/scripts/checklist.ts +180 -0
- package/.agent/scripts/compile-agents.ts +237 -0
- package/.agent/scripts/fix_skills.ts +49 -0
- package/.agent/scripts/session_manager.ts +222 -0
- package/.agent/scripts/skill-audit.ts +255 -0
- package/.agent/scripts/sync_workflows.ts +54 -0
- package/.agent/scripts/utils/colors.ts +58 -0
- package/.agent/scripts/utils/process-manager.ts +131 -0
- package/.agent/scripts/utils/reporter.ts +192 -0
- package/.agent/scripts/utils/runner.ts +128 -0
- package/.agent/scripts/verify_all.ts +243 -0
- package/.agent/scripts/version-sync.ts +256 -0
- package/.agent/skills/SKILL_INDEX.md +129 -0
- package/.agent/skills/agent-browser/AGENTS.md +728 -0
- package/.agent/skills/agent-browser/SKILL.md +193 -0
- package/.agent/skills/agent-browser/rules/_sections.md +15 -0
- package/.agent/skills/agent-browser/rules/_template.md +32 -0
- package/.agent/skills/agent-browser/rules/engineering-spec.md +528 -0
- package/.agent/skills/agent-browser/scripts/browser_cli.ts +52 -0
- package/.agent/skills/agent-browser/scripts/session_manager.ts +166 -0
- package/.agent/skills/ai-artist/AGENTS.md +1082 -0
- package/.agent/skills/ai-artist/SKILL.md +186 -0
- package/.agent/skills/ai-artist/rules/_sections.md +30 -0
- package/.agent/skills/ai-artist/rules/_template.md +32 -0
- package/.agent/skills/ai-artist/rules/domain-code.md +118 -0
- package/.agent/skills/ai-artist/rules/domain-marketing.md +105 -0
- package/.agent/skills/ai-artist/rules/engineering-spec.md +519 -0
- package/.agent/skills/ai-artist/rules/image-prompts.md +195 -0
- package/.agent/skills/ai-artist/rules/model-syntax.md +115 -0
- package/.agent/skills/ai-artist/scripts/prompt_compiler.ts +72 -0
- package/.agent/skills/ai-artist/templates/image-core.txt +1 -0
- package/.agent/skills/ai-artist/templates/llm-core.txt +6 -0
- package/.agent/skills/api-architect/AGENTS.md +1896 -0
- package/.agent/skills/api-architect/SKILL.md +173 -0
- package/.agent/skills/api-architect/rules/_sections.md +35 -0
- package/.agent/skills/api-architect/rules/_template.md +32 -0
- package/.agent/skills/api-architect/rules/api-style.md +115 -0
- package/.agent/skills/api-architect/rules/auth.md +134 -0
- package/.agent/skills/api-architect/rules/documentation.md +131 -0
- package/.agent/skills/api-architect/rules/engineering-spec.md +505 -0
- package/.agent/skills/api-architect/rules/graphql.md +154 -0
- package/.agent/skills/api-architect/rules/rate-limiting.md +76 -0
- package/.agent/skills/api-architect/rules/response.md +138 -0
- package/.agent/skills/api-architect/rules/rest.md +113 -0
- package/.agent/skills/api-architect/rules/security-testing.md +146 -0
- package/.agent/skills/api-architect/rules/trpc.md +129 -0
- package/.agent/skills/api-architect/rules/versioning.md +100 -0
- package/.agent/skills/api-architect/scripts/api_validator.ts +413 -0
- package/.agent/skills/auth-patterns/AGENTS.md +1830 -0
- package/.agent/skills/auth-patterns/SKILL.md +163 -0
- package/.agent/skills/auth-patterns/rules/_sections.md +30 -0
- package/.agent/skills/auth-patterns/rules/_template.md +32 -0
- package/.agent/skills/auth-patterns/rules/engineering-spec.md +515 -0
- package/.agent/skills/auth-patterns/rules/jwt-deep.md +196 -0
- package/.agent/skills/auth-patterns/rules/mfa.md +174 -0
- package/.agent/skills/auth-patterns/rules/oauth2.md +134 -0
- package/.agent/skills/auth-patterns/rules/passkey.md +243 -0
- package/.agent/skills/auth-patterns/rules/rbac-abac.md +206 -0
- package/.agent/skills/auth-patterns/rules/session.md +183 -0
- package/.agent/skills/auth-patterns/scripts/auth_validator.ts +121 -0
- package/.agent/skills/chrome-devtools/AGENTS.md +952 -0
- package/.agent/skills/chrome-devtools/SKILL.md +160 -0
- package/.agent/skills/chrome-devtools/rules/_sections.md +25 -0
- package/.agent/skills/chrome-devtools/rules/_template.md +32 -0
- package/.agent/skills/chrome-devtools/rules/aria-snapshot.md +95 -0
- package/.agent/skills/chrome-devtools/rules/engineering-spec.md +510 -0
- package/.agent/skills/chrome-devtools/rules/scripts-guide.md +174 -0
- package/.agent/skills/chrome-devtools/scripts/aria-snapshot.ts +3 -0
- package/.agent/skills/chrome-devtools/scripts/click.ts +3 -0
- package/.agent/skills/chrome-devtools/scripts/console.ts +3 -0
- package/.agent/skills/chrome-devtools/scripts/core_cli.ts +79 -0
- package/.agent/skills/chrome-devtools/scripts/evaluate.ts +3 -0
- package/.agent/skills/chrome-devtools/scripts/fill.ts +3 -0
- package/.agent/skills/chrome-devtools/scripts/navigate.ts +3 -0
- package/.agent/skills/chrome-devtools/scripts/network.ts +3 -0
- package/.agent/skills/chrome-devtools/scripts/performance.ts +3 -0
- package/.agent/skills/chrome-devtools/scripts/screenshot.ts +3 -0
- package/.agent/skills/chrome-devtools/scripts/select-ref.ts +3 -0
- package/.agent/skills/cicd-pipeline/AGENTS.md +809 -0
- package/.agent/skills/cicd-pipeline/SKILL.md +164 -0
- package/.agent/skills/cicd-pipeline/rules/_sections.md +15 -0
- package/.agent/skills/cicd-pipeline/rules/_template.md +32 -0
- package/.agent/skills/cicd-pipeline/rules/engineering-spec.md +477 -0
- package/.agent/skills/cicd-pipeline/scripts/flag-manager.ts +253 -0
- package/.agent/skills/cicd-pipeline/scripts/pipeline_validator.ts +133 -0
- package/.agent/skills/code-constitution/AGENTS.md +597 -0
- package/.agent/skills/code-constitution/CHANGELOG.md +216 -0
- package/.agent/skills/code-constitution/SKILL.md +191 -0
- package/.agent/skills/code-constitution/VERSION +3 -0
- package/.agent/skills/code-constitution/examples/violation-backend-mutation/after.tsx +59 -0
- package/.agent/skills/code-constitution/examples/violation-backend-mutation/before.tsx +42 -0
- package/.agent/skills/code-constitution/examples/violation-backend-mutation/explanation.md +91 -0
- package/.agent/skills/code-constitution/examples/violation-chart-injection/after.tsx +99 -0
- package/.agent/skills/code-constitution/examples/violation-chart-injection/before.tsx +57 -0
- package/.agent/skills/code-constitution/examples/violation-chart-injection/explanation.md +120 -0
- package/.agent/skills/code-constitution/knowledge/lessons-learned.yaml +3 -0
- package/.agent/skills/code-constitution/metadata/precedence.yaml +117 -0
- package/.agent/skills/code-constitution/metadata/scope-map.yaml +156 -0
- package/.agent/skills/code-constitution/proposals/v1.1-change-proposal-template.md +201 -0
- package/.agent/skills/code-constitution/resources/AUTHORITY_MODEL.md +115 -0
- package/.agent/skills/code-constitution/resources/ENFORCEMENT_GUIDE.md +246 -0
- package/.agent/skills/code-constitution/resources/LOAD_ORDER.md +86 -0
- package/.agent/skills/code-constitution/rules/_sections.md +15 -0
- package/.agent/skills/code-constitution/rules/_template.md +32 -0
- package/.agent/skills/code-constitution/rules/constitution/master-constitution.md +210 -0
- package/.agent/skills/code-constitution/rules/doctrines/architecture/architecture-doctrine.md +188 -0
- package/.agent/skills/code-constitution/rules/doctrines/backend/backend-data-engine-doctrine.md +218 -0
- package/.agent/skills/code-constitution/rules/doctrines/commercial/commercial-guardrails-doctrine.md +196 -0
- package/.agent/skills/code-constitution/rules/doctrines/data/data-integrity-doctrine.md +202 -0
- package/.agent/skills/code-constitution/rules/doctrines/frontend/frontend-mobile-doctrine.md +169 -0
- package/.agent/skills/code-constitution/rules/doctrines/frontend/interaction-patterns-doctrine.md +176 -0
- package/.agent/skills/code-constitution/rules/doctrines/learning/learning-engine-doctrine.md +192 -0
- package/.agent/skills/code-constitution/rules/doctrines/performance/performance-doctrine.md +180 -0
- package/.agent/skills/code-constitution/rules/doctrines/review/code-review-doctrine.md +174 -0
- package/.agent/skills/code-constitution/rules/enforcement/agents/agent-enforcement-protocol.md +218 -0
- package/.agent/skills/code-constitution/rules/enforcement/agents/agent-system-prompt.md +196 -0
- package/.agent/skills/code-constitution/rules/enforcement/checklists/backend-api-review-checklist.md +131 -0
- package/.agent/skills/code-constitution/rules/enforcement/checklists/chart-component-review-checklist.md +147 -0
- package/.agent/skills/code-constitution/rules/enforcement/checklists/frontend-review-checklist.md +194 -0
- package/.agent/skills/code-constitution/rules/enforcement/playbooks/doctrine-violation-playbook.md +236 -0
- package/.agent/skills/code-constitution/rules/engineering-spec.md +561 -0
- package/.agent/skills/code-constitution/scripts/audit_pr.ts +219 -0
- package/.agent/skills/code-constitution/scripts/check_boundaries.ts +134 -0
- package/.agent/skills/code-constitution/scripts/learn.ts +202 -0
- package/.agent/skills/code-constitution/scripts/validate_doctrine.ts +287 -0
- package/.agent/skills/code-craft/AGENTS.md +803 -0
- package/.agent/skills/code-craft/SKILL.md +170 -0
- package/.agent/skills/code-craft/rules/_sections.md +20 -0
- package/.agent/skills/code-craft/rules/_template.md +32 -0
- package/.agent/skills/code-craft/rules/engineering-spec.md +447 -0
- package/.agent/skills/code-craft/rules/verification-scripts.md +83 -0
- package/.agent/skills/code-craft/scripts/code_quality_checker.ts +193 -0
- package/.agent/skills/code-review/AGENTS.md +1664 -0
- package/.agent/skills/code-review/SKILL.md +152 -0
- package/.agent/skills/code-review/rules/_sections.md +15 -0
- package/.agent/skills/code-review/rules/_template.md +32 -0
- package/.agent/skills/code-review/rules/engineering-spec.md +466 -0
- package/.agent/skills/code-review/scripts/lint_runner.ts +213 -0
- package/.agent/skills/code-review/scripts/type_coverage.ts +118 -0
- package/.agent/skills/context-engineering/AGENTS.md +499 -0
- package/.agent/skills/context-engineering/SKILL.md +147 -0
- package/.agent/skills/context-engineering/rules/_sections.md +15 -0
- package/.agent/skills/context-engineering/rules/_template.md +32 -0
- package/.agent/skills/context-engineering/rules/engineering-spec.md +463 -0
- package/.agent/skills/context-engineering/scripts/context_analyzer.ts +127 -0
- package/.agent/skills/copywriting/AGENTS.md +501 -0
- package/.agent/skills/copywriting/SKILL.md +188 -0
- package/.agent/skills/copywriting/rules/_sections.md +15 -0
- package/.agent/skills/copywriting/rules/_template.md +32 -0
- package/.agent/skills/copywriting/rules/engineering-spec.md +465 -0
- package/.agent/skills/copywriting/scripts/copy_validator.ts +185 -0
- package/.agent/skills/data-modeler/AGENTS.md +814 -0
- package/.agent/skills/data-modeler/SKILL.md +195 -0
- package/.agent/skills/data-modeler/rules/_sections.md +15 -0
- package/.agent/skills/data-modeler/rules/_template.md +32 -0
- package/.agent/skills/data-modeler/rules/database-selection.md +124 -0
- package/.agent/skills/data-modeler/rules/engineering-spec.md +479 -0
- package/.agent/skills/data-modeler/rules/indexing.md +166 -0
- package/.agent/skills/data-modeler/rules/migrations.md +176 -0
- package/.agent/skills/data-modeler/rules/optimization.md +161 -0
- package/.agent/skills/data-modeler/rules/orm-selection.md +155 -0
- package/.agent/skills/data-modeler/rules/schema-design.md +162 -0
- package/.agent/skills/data-modeler/scripts/schema_validator.ts +357 -0
- package/.agent/skills/debug-pro/AGENTS.md +798 -0
- package/.agent/skills/debug-pro/SKILL.md +193 -0
- package/.agent/skills/debug-pro/defense-in-depth/SKILL.md +148 -0
- package/.agent/skills/debug-pro/root-cause-tracing/SKILL.md +196 -0
- package/.agent/skills/debug-pro/root-cause-tracing/find-polluter.sh +63 -0
- package/.agent/skills/debug-pro/rules/_sections.md +15 -0
- package/.agent/skills/debug-pro/rules/_template.md +32 -0
- package/.agent/skills/debug-pro/rules/engineering-spec.md +491 -0
- package/.agent/skills/debug-pro/scripts/debug_verifier.ts +148 -0
- package/.agent/skills/debug-pro/verification-before-completion/SKILL.md +160 -0
- package/.agent/skills/design-system/AGENTS.md +4216 -0
- package/.agent/skills/design-system/SKILL.md +186 -0
- package/.agent/skills/design-system/rules/_sections.md +65 -0
- package/.agent/skills/design-system/rules/_template.md +32 -0
- package/.agent/skills/design-system/rules/animation-guide.md +355 -0
- package/.agent/skills/design-system/rules/color-system.md +335 -0
- package/.agent/skills/design-system/rules/color-systems.md +133 -0
- package/.agent/skills/design-system/rules/decision-trees.md +442 -0
- package/.agent/skills/design-system/rules/design-extraction.md +152 -0
- package/.agent/skills/design-system/rules/engineering-spec.md +484 -0
- package/.agent/skills/design-system/rules/motion-design.md +161 -0
- package/.agent/skills/design-system/rules/motion-graphics.md +330 -0
- package/.agent/skills/design-system/rules/spatial-composition.md +184 -0
- package/.agent/skills/design-system/rules/typography-system.md +369 -0
- package/.agent/skills/design-system/rules/typography.md +124 -0
- package/.agent/skills/design-system/rules/ux-psychology.md +565 -0
- package/.agent/skills/design-system/rules/visual-effects.md +407 -0
- package/.agent/skills/design-system/scripts/accessibility_checker.ts +292 -0
- package/.agent/skills/design-system/scripts/ux_audit.ts +356 -0
- package/.agent/skills/doc-templates/AGENTS.md +820 -0
- package/.agent/skills/doc-templates/SKILL.md +260 -0
- package/.agent/skills/doc-templates/rules/_sections.md +20 -0
- package/.agent/skills/doc-templates/rules/_template.md +32 -0
- package/.agent/skills/doc-templates/rules/doc.md +355 -0
- package/.agent/skills/doc-templates/rules/engineering-spec.md +422 -0
- package/.agent/skills/doc-templates/scripts/editor-server.ts +162 -0
- package/.agent/skills/doc-templates/scripts/inject_otel.ts +22 -0
- package/.agent/skills/doc-templates/scripts/kanban-server.ts +171 -0
- package/.agent/skills/doc-templates/scripts/markdown-server.ts +185 -0
- package/.agent/skills/e2e-automation/AGENTS.md +882 -0
- package/.agent/skills/e2e-automation/SKILL.md +175 -0
- package/.agent/skills/e2e-automation/rules/_sections.md +20 -0
- package/.agent/skills/e2e-automation/rules/_template.md +32 -0
- package/.agent/skills/e2e-automation/rules/aria-snapshot.md +185 -0
- package/.agent/skills/e2e-automation/rules/engineering-spec.md +501 -0
- package/.agent/skills/e2e-automation/scripts/playwright_runner.ts +208 -0
- package/.agent/skills/execution-reporter/AGENTS.md +419 -0
- package/.agent/skills/execution-reporter/SKILL.md +152 -0
- package/.agent/skills/execution-reporter/rules/_sections.md +15 -0
- package/.agent/skills/execution-reporter/rules/_template.md +32 -0
- package/.agent/skills/execution-reporter/rules/engineering-spec.md +389 -0
- package/.agent/skills/game-development/2d-games/SKILL.md +140 -0
- package/.agent/skills/game-development/3d-games/SKILL.md +156 -0
- package/.agent/skills/game-development/AGENTS.md +783 -0
- package/.agent/skills/game-development/SKILL.md +178 -0
- package/.agent/skills/game-development/game-art/SKILL.md +207 -0
- package/.agent/skills/game-development/game-audio/SKILL.md +211 -0
- package/.agent/skills/game-development/game-design/SKILL.md +151 -0
- package/.agent/skills/game-development/mobile-games/SKILL.md +130 -0
- package/.agent/skills/game-development/multiplayer/SKILL.md +154 -0
- package/.agent/skills/game-development/pc-games/SKILL.md +167 -0
- package/.agent/skills/game-development/rules/_sections.md +15 -0
- package/.agent/skills/game-development/rules/_template.md +32 -0
- package/.agent/skills/game-development/rules/engineering-spec.md +480 -0
- package/.agent/skills/game-development/vr-ar/SKILL.md +144 -0
- package/.agent/skills/game-development/web-games/SKILL.md +173 -0
- package/.agent/skills/git-workflow/AGENTS.md +554 -0
- package/.agent/skills/git-workflow/SKILL.md +181 -0
- package/.agent/skills/git-workflow/rules/_sections.md +15 -0
- package/.agent/skills/git-workflow/rules/_template.md +32 -0
- package/.agent/skills/git-workflow/rules/engineering-spec.md +518 -0
- package/.agent/skills/gitops/AGENTS.md +921 -0
- package/.agent/skills/gitops/SKILL.md +163 -0
- package/.agent/skills/gitops/rules/_sections.md +25 -0
- package/.agent/skills/gitops/rules/_template.md +32 -0
- package/.agent/skills/gitops/rules/argocd-setup.md +148 -0
- package/.agent/skills/gitops/rules/engineering-spec.md +450 -0
- package/.agent/skills/gitops/rules/sync-policies.md +145 -0
- package/.agent/skills/google-adk-python/AGENTS.md +1054 -0
- package/.agent/skills/google-adk-python/SKILL.md +168 -0
- package/.agent/skills/google-adk-python/rules/_sections.md +25 -0
- package/.agent/skills/google-adk-python/rules/_template.md +32 -0
- package/.agent/skills/google-adk-python/rules/deployment.md +138 -0
- package/.agent/skills/google-adk-python/rules/engineering-spec.md +451 -0
- package/.agent/skills/google-adk-python/rules/multi-agent.md +146 -0
- package/.agent/skills/google-adk-python/rules/tools.md +131 -0
- package/.agent/skills/idea-storm/AGENTS.md +995 -0
- package/.agent/skills/idea-storm/SKILL.md +160 -0
- package/.agent/skills/idea-storm/rules/_sections.md +25 -0
- package/.agent/skills/idea-storm/rules/_template.md +32 -0
- package/.agent/skills/idea-storm/rules/architecture-debate.md +122 -0
- package/.agent/skills/idea-storm/rules/dynamic-questioning.md +374 -0
- package/.agent/skills/idea-storm/rules/engineering-spec.md +466 -0
- package/.agent/skills/knowledge-compiler/SKILL.md +320 -0
- package/.agent/skills/knowledge-graph/AGENTS.md +762 -0
- package/.agent/skills/knowledge-graph/SKILL.md +157 -0
- package/.agent/skills/knowledge-graph/rules/_sections.md +15 -0
- package/.agent/skills/knowledge-graph/rules/_template.md +32 -0
- package/.agent/skills/knowledge-graph/rules/engineering-spec.md +439 -0
- package/.agent/skills/knowledge-linter/SKILL.md +217 -0
- package/.agent/skills/lifecycle-orchestrator/AGENTS.md +989 -0
- package/.agent/skills/lifecycle-orchestrator/SKILL.md +169 -0
- package/.agent/skills/lifecycle-orchestrator/rules/_sections.md +15 -0
- package/.agent/skills/lifecycle-orchestrator/rules/_template.md +32 -0
- package/.agent/skills/lifecycle-orchestrator/rules/engineering-spec.md +525 -0
- package/.agent/skills/lifecycle-orchestrator/scripts/state_manager.ts +189 -0
- package/.agent/skills/mcp-builder/AGENTS.md +1653 -0
- package/.agent/skills/mcp-builder/SKILL.md +166 -0
- package/.agent/skills/mcp-builder/rules/_sections.md +40 -0
- package/.agent/skills/mcp-builder/rules/_template.md +32 -0
- package/.agent/skills/mcp-builder/rules/best-practices.md +157 -0
- package/.agent/skills/mcp-builder/rules/design-principles.md +105 -0
- package/.agent/skills/mcp-builder/rules/engineering-spec.md +473 -0
- package/.agent/skills/mcp-builder/rules/evaluation.md +103 -0
- package/.agent/skills/mcp-builder/rules/python-implementation.md +249 -0
- package/.agent/skills/mcp-builder/rules/quickstart.md +111 -0
- package/.agent/skills/mcp-builder/rules/typescript-implementation.md +280 -0
- package/.agent/skills/mcp-management/AGENTS.md +837 -0
- package/.agent/skills/mcp-management/SKILL.md +164 -0
- package/.agent/skills/mcp-management/rules/_sections.md +25 -0
- package/.agent/skills/mcp-management/rules/_template.md +32 -0
- package/.agent/skills/mcp-management/rules/cli-usage.md +146 -0
- package/.agent/skills/mcp-management/rules/engineering-spec.md +501 -0
- package/.agent/skills/mcp-management/rules/protocol.md +159 -0
- package/.agent/skills/media-processing/AGENTS.md +479 -0
- package/.agent/skills/media-processing/SKILL.md +176 -0
- package/.agent/skills/media-processing/rules/_sections.md +15 -0
- package/.agent/skills/media-processing/rules/_template.md +32 -0
- package/.agent/skills/media-processing/rules/engineering-spec.md +452 -0
- package/.agent/skills/media-processing/scripts/convert-video.ts +155 -0
- package/.agent/skills/media-processing/scripts/optimize-image.ts +127 -0
- package/.agent/skills/mobile-design/AGENTS.md +6531 -0
- package/.agent/skills/mobile-design/SKILL.md +165 -0
- package/.agent/skills/mobile-design/rules/_sections.md +45 -0
- package/.agent/skills/mobile-design/rules/_template.md +32 -0
- package/.agent/skills/mobile-design/rules/decision-trees.md +540 -0
- package/.agent/skills/mobile-design/rules/engineering-spec.md +467 -0
- package/.agent/skills/mobile-design/rules/mobile-backend.md +516 -0
- package/.agent/skills/mobile-design/rules/mobile-color-system.md +436 -0
- package/.agent/skills/mobile-design/rules/mobile-debugging.md +146 -0
- package/.agent/skills/mobile-design/rules/mobile-design-thinking.md +381 -0
- package/.agent/skills/mobile-design/rules/mobile-navigation.md +474 -0
- package/.agent/skills/mobile-design/rules/mobile-performance.md +783 -0
- package/.agent/skills/mobile-design/rules/mobile-testing.md +380 -0
- package/.agent/skills/mobile-design/rules/mobile-typography.md +449 -0
- package/.agent/skills/mobile-design/rules/platform-android.md +682 -0
- package/.agent/skills/mobile-design/rules/platform-ios.md +577 -0
- package/.agent/skills/mobile-design/rules/touch-psychology.md +553 -0
- package/.agent/skills/mobile-design/scripts/mobile_audit.ts +309 -0
- package/.agent/skills/mobile-developer/AGENTS.md +904 -0
- package/.agent/skills/mobile-developer/SKILL.md +194 -0
- package/.agent/skills/mobile-developer/rules/_sections.md +75 -0
- package/.agent/skills/mobile-developer/rules/_template.md +32 -0
- package/.agent/skills/mobile-developer/rules/anti-patterns.md +70 -0
- package/.agent/skills/mobile-developer/rules/app-store-optimization.md +319 -0
- package/.agent/skills/mobile-developer/rules/decision-trees.md +545 -0
- package/.agent/skills/mobile-developer/rules/deep-linking.md +441 -0
- package/.agent/skills/mobile-developer/rules/engineering-spec.md +477 -0
- package/.agent/skills/mobile-developer/rules/flutter.md +475 -0
- package/.agent/skills/mobile-developer/rules/mobile-backend.md +516 -0
- package/.agent/skills/mobile-developer/rules/mobile-color-system.md +444 -0
- package/.agent/skills/mobile-developer/rules/mobile-debugging.md +428 -0
- package/.agent/skills/mobile-developer/rules/mobile-design-thinking.md +367 -0
- package/.agent/skills/mobile-developer/rules/mobile-navigation.md +483 -0
- package/.agent/skills/mobile-developer/rules/mobile-performance.md +778 -0
- package/.agent/skills/mobile-developer/rules/mobile-testing.md +382 -0
- package/.agent/skills/mobile-developer/rules/mobile-typography.md +457 -0
- package/.agent/skills/mobile-developer/rules/native.md +572 -0
- package/.agent/skills/mobile-developer/rules/platform-android.md +676 -0
- package/.agent/skills/mobile-developer/rules/platform-ios.md +571 -0
- package/.agent/skills/mobile-developer/rules/push-notifications.md +599 -0
- package/.agent/skills/mobile-developer/rules/react-native.md +422 -0
- package/.agent/skills/mobile-developer/rules/touch-psychology.md +547 -0
- package/.agent/skills/mobile-developer/scripts/mobile_audit.ts +701 -0
- package/.agent/skills/nextjs-pro/AGENTS.md +3932 -0
- package/.agent/skills/nextjs-pro/SKILL.md +171 -0
- package/.agent/skills/nextjs-pro/rules/_sections.md +50 -0
- package/.agent/skills/nextjs-pro/rules/_template.md +32 -0
- package/.agent/skills/nextjs-pro/rules/advanced-event-handler-refs.md +59 -0
- package/.agent/skills/nextjs-pro/rules/advanced-init-once.md +46 -0
- package/.agent/skills/nextjs-pro/rules/advanced-use-latest.md +43 -0
- package/.agent/skills/nextjs-pro/rules/async-api-routes.md +42 -0
- package/.agent/skills/nextjs-pro/rules/async-defer-await.md +84 -0
- package/.agent/skills/nextjs-pro/rules/async-dependencies.md +55 -0
- package/.agent/skills/nextjs-pro/rules/async-parallel.md +32 -0
- package/.agent/skills/nextjs-pro/rules/async-suspense-boundaries.md +103 -0
- package/.agent/skills/nextjs-pro/rules/bundle-barrel-imports.md +63 -0
- package/.agent/skills/nextjs-pro/rules/bundle-conditional.md +35 -0
- package/.agent/skills/nextjs-pro/rules/bundle-defer-third-party.md +53 -0
- package/.agent/skills/nextjs-pro/rules/bundle-dynamic-imports.md +39 -0
- package/.agent/skills/nextjs-pro/rules/bundle-preload.md +54 -0
- package/.agent/skills/nextjs-pro/rules/client-event-listeners.md +78 -0
- package/.agent/skills/nextjs-pro/rules/client-localstorage-schema.md +75 -0
- package/.agent/skills/nextjs-pro/rules/client-passive-event-listeners.md +52 -0
- package/.agent/skills/nextjs-pro/rules/client-swr-dedup.md +60 -0
- package/.agent/skills/nextjs-pro/rules/engineering-spec.md +440 -0
- package/.agent/skills/nextjs-pro/rules/js-batch-dom-css.md +111 -0
- package/.agent/skills/nextjs-pro/rules/js-cache-function-results.md +84 -0
- package/.agent/skills/nextjs-pro/rules/js-cache-property-access.md +32 -0
- package/.agent/skills/nextjs-pro/rules/js-cache-storage.md +74 -0
- package/.agent/skills/nextjs-pro/rules/js-combine-iterations.md +36 -0
- package/.agent/skills/nextjs-pro/rules/js-early-exit.md +54 -0
- package/.agent/skills/nextjs-pro/rules/js-hoist-regexp.md +49 -0
- package/.agent/skills/nextjs-pro/rules/js-index-maps.md +41 -0
- package/.agent/skills/nextjs-pro/rules/js-length-check-first.md +53 -0
- package/.agent/skills/nextjs-pro/rules/js-min-max-loop.md +86 -0
- package/.agent/skills/nextjs-pro/rules/js-set-map-lookups.md +28 -0
- package/.agent/skills/nextjs-pro/rules/js-tosorted-immutable.md +61 -0
- package/.agent/skills/nextjs-pro/rules/rendering-activity.md +30 -0
- package/.agent/skills/nextjs-pro/rules/rendering-animate-svg-wrapper.md +51 -0
- package/.agent/skills/nextjs-pro/rules/rendering-conditional-render.md +44 -0
- package/.agent/skills/nextjs-pro/rules/rendering-content-visibility.md +42 -0
- package/.agent/skills/nextjs-pro/rules/rendering-hoist-jsx.md +50 -0
- package/.agent/skills/nextjs-pro/rules/rendering-hydration-no-flicker.md +86 -0
- package/.agent/skills/nextjs-pro/rules/rendering-hydration-suppress-warning.md +34 -0
- package/.agent/skills/nextjs-pro/rules/rendering-svg-precision.md +32 -0
- package/.agent/skills/nextjs-pro/rules/rendering-usetransition-loading.md +79 -0
- package/.agent/skills/nextjs-pro/rules/rerender-defer-reads.md +43 -0
- package/.agent/skills/nextjs-pro/rules/rerender-dependencies.md +49 -0
- package/.agent/skills/nextjs-pro/rules/rerender-derived-state-no-effect.md +44 -0
- package/.agent/skills/nextjs-pro/rules/rerender-derived-state.md +33 -0
- package/.agent/skills/nextjs-pro/rules/rerender-functional-setstate.md +78 -0
- package/.agent/skills/nextjs-pro/rules/rerender-lazy-state-init.md +62 -0
- package/.agent/skills/nextjs-pro/rules/rerender-memo-with-default-value.md +42 -0
- package/.agent/skills/nextjs-pro/rules/rerender-memo.md +48 -0
- package/.agent/skills/nextjs-pro/rules/rerender-move-effect-to-event.md +49 -0
- package/.agent/skills/nextjs-pro/rules/rerender-simple-expression-in-memo.md +39 -0
- package/.agent/skills/nextjs-pro/rules/rerender-transitions.md +44 -0
- package/.agent/skills/nextjs-pro/rules/rerender-use-ref-transient-values.md +77 -0
- package/.agent/skills/nextjs-pro/rules/schema.json +34 -0
- package/.agent/skills/nextjs-pro/rules/server-after-nonblocking.md +77 -0
- package/.agent/skills/nextjs-pro/rules/server-auth-actions.md +100 -0
- package/.agent/skills/nextjs-pro/rules/server-cache-lru.md +45 -0
- package/.agent/skills/nextjs-pro/rules/server-cache-react.md +80 -0
- package/.agent/skills/nextjs-pro/rules/server-dedup-props.md +69 -0
- package/.agent/skills/nextjs-pro/rules/server-parallel-fetching.md +87 -0
- package/.agent/skills/nextjs-pro/rules/server-serialization.md +42 -0
- package/.agent/skills/nodejs-pro/AGENTS.md +866 -0
- package/.agent/skills/nodejs-pro/SKILL.md +172 -0
- package/.agent/skills/nodejs-pro/rules/_sections.md +50 -0
- package/.agent/skills/nodejs-pro/rules/_template.md +32 -0
- package/.agent/skills/nodejs-pro/rules/architecture-patterns.md +229 -0
- package/.agent/skills/nodejs-pro/rules/async-patterns.md +246 -0
- package/.agent/skills/nodejs-pro/rules/engineering-spec.md +438 -0
- package/.agent/skills/nodejs-pro/rules/error-handling.md +257 -0
- package/.agent/skills/nodejs-pro/rules/framework-selection.md +220 -0
- package/.agent/skills/nodejs-pro/rules/runtime-modules.md +176 -0
- package/.agent/skills/nodejs-pro/rules/testing-strategy.md +266 -0
- package/.agent/skills/nodejs-pro/rules/validation-security.md +205 -0
- package/.agent/skills/observability/AGENTS.md +607 -0
- package/.agent/skills/observability/SKILL.md +178 -0
- package/.agent/skills/observability/rules/_sections.md +15 -0
- package/.agent/skills/observability/rules/_template.md +32 -0
- package/.agent/skills/observability/rules/engineering-spec.md +440 -0
- package/.agent/skills/offensive-sec/AGENTS.md +849 -0
- package/.agent/skills/offensive-sec/SKILL.md +191 -0
- package/.agent/skills/offensive-sec/rules/_sections.md +15 -0
- package/.agent/skills/offensive-sec/rules/_template.md +32 -0
- package/.agent/skills/offensive-sec/rules/engineering-spec.md +470 -0
- package/.agent/skills/perf-optimizer/AGENTS.md +870 -0
- package/.agent/skills/perf-optimizer/SKILL.md +189 -0
- package/.agent/skills/perf-optimizer/rules/_sections.md +15 -0
- package/.agent/skills/perf-optimizer/rules/_template.md +32 -0
- package/.agent/skills/perf-optimizer/rules/backend-patterns.md +312 -0
- package/.agent/skills/perf-optimizer/rules/engineering-spec.md +428 -0
- package/.agent/skills/perf-optimizer/scripts/lighthouse_audit.ts +201 -0
- package/.agent/skills/problem-checker/AGENTS.md +519 -0
- package/.agent/skills/problem-checker/SKILL.md +189 -0
- package/.agent/skills/problem-checker/rules/_sections.md +15 -0
- package/.agent/skills/problem-checker/rules/_template.md +32 -0
- package/.agent/skills/problem-checker/rules/engineering-spec.md +483 -0
- package/.agent/skills/problem-checker/scripts/check_problems.ts +396 -0
- package/.agent/skills/project-planner/AGENTS.md +2698 -0
- package/.agent/skills/project-planner/SKILL.md +166 -0
- package/.agent/skills/project-planner/rules/_sections.md +15 -0
- package/.agent/skills/project-planner/rules/_template.md +32 -0
- package/.agent/skills/project-planner/rules/engineering-spec.md +420 -0
- package/.agent/skills/python-pro/AGENTS.md +1871 -0
- package/.agent/skills/python-pro/SKILL.md +182 -0
- package/.agent/skills/python-pro/rules/_sections.md +50 -0
- package/.agent/skills/python-pro/rules/_template.md +32 -0
- package/.agent/skills/python-pro/rules/async-patterns.md +168 -0
- package/.agent/skills/python-pro/rules/django-patterns.md +194 -0
- package/.agent/skills/python-pro/rules/engineering-spec.md +442 -0
- package/.agent/skills/python-pro/rules/fastapi-patterns.md +179 -0
- package/.agent/skills/python-pro/rules/framework-selection.md +167 -0
- package/.agent/skills/python-pro/rules/project-structure.md +181 -0
- package/.agent/skills/python-pro/rules/testing-patterns.md +212 -0
- package/.agent/skills/python-pro/rules/type-hints.md +159 -0
- package/.agent/skills/react-pro/AGENTS.md +963 -0
- package/.agent/skills/react-pro/SKILL.md +232 -0
- package/.agent/skills/react-pro/rules/_sections.md +40 -0
- package/.agent/skills/react-pro/rules/_template.md +32 -0
- package/.agent/skills/react-pro/rules/component-patterns.md +145 -0
- package/.agent/skills/react-pro/rules/composition-compound.md +82 -0
- package/.agent/skills/react-pro/rules/data-fetching.md +133 -0
- package/.agent/skills/react-pro/rules/engineering-spec.md +453 -0
- package/.agent/skills/react-pro/rules/error-boundary.md +61 -0
- package/.agent/skills/react-pro/rules/file-organization.md +158 -0
- package/.agent/skills/react-pro/rules/hooks-custom.md +61 -0
- package/.agent/skills/react-pro/rules/mui-styling.md +138 -0
- package/.agent/skills/react-pro/rules/patterns.md +24 -0
- package/.agent/skills/react-pro/rules/performance-optimization.md +65 -0
- package/.agent/skills/react-pro/rules/performance.md +137 -0
- package/.agent/skills/react-pro/rules/react19-hooks.md +85 -0
- package/.agent/skills/react-pro/rules/state-management.md +90 -0
- package/.agent/skills/react-pro/rules/testing-patterns.md +52 -0
- package/.agent/skills/registry.json +1251 -0
- package/.agent/skills/security-scanner/AGENTS.md +851 -0
- package/.agent/skills/security-scanner/SKILL.md +182 -0
- package/.agent/skills/security-scanner/rules/_sections.md +15 -0
- package/.agent/skills/security-scanner/rules/_template.md +32 -0
- package/.agent/skills/security-scanner/rules/auth-patterns.md +281 -0
- package/.agent/skills/security-scanner/rules/checklists.md +186 -0
- package/.agent/skills/security-scanner/rules/engineering-spec.md +440 -0
- package/.agent/skills/security-scanner/scripts/security_scan.ts +513 -0
- package/.agent/skills/seo-optimizer/AGENTS.md +839 -0
- package/.agent/skills/seo-optimizer/SKILL.md +180 -0
- package/.agent/skills/seo-optimizer/rules/_sections.md +15 -0
- package/.agent/skills/seo-optimizer/rules/_template.md +32 -0
- package/.agent/skills/seo-optimizer/rules/engineering-spec.md +433 -0
- package/.agent/skills/seo-optimizer/scripts/geo_checker.ts +109 -0
- package/.agent/skills/seo-optimizer/scripts/seo_checker.ts +308 -0
- package/.agent/skills/server-ops/AGENTS.md +643 -0
- package/.agent/skills/server-ops/SKILL.md +194 -0
- package/.agent/skills/server-ops/rules/_sections.md +15 -0
- package/.agent/skills/server-ops/rules/_template.md +32 -0
- package/.agent/skills/server-ops/rules/engineering-spec.md +450 -0
- package/.agent/skills/shell-script/AGENTS.md +499 -0
- package/.agent/skills/shell-script/SKILL.md +205 -0
- package/.agent/skills/shell-script/rules/_sections.md +15 -0
- package/.agent/skills/shell-script/rules/_template.md +32 -0
- package/.agent/skills/shell-script/rules/engineering-spec.md +463 -0
- package/.agent/skills/skill-generator/SKILL.md +147 -0
- package/.agent/skills/smart-router/SKILL.md +95 -0
- package/.agent/skills/studio/AGENTS.md +636 -0
- package/.agent/skills/studio/SKILL.md +178 -0
- package/.agent/skills/studio/data/charts.csv +26 -0
- package/.agent/skills/studio/data/colors.csv +97 -0
- package/.agent/skills/studio/data/icons.csv +101 -0
- package/.agent/skills/studio/data/landing.csv +31 -0
- package/.agent/skills/studio/data/products.csv +97 -0
- package/.agent/skills/studio/data/prompts.csv +24 -0
- package/.agent/skills/studio/data/react-performance.csv +45 -0
- package/.agent/skills/studio/data/stacks/flutter.csv +52 -0
- package/.agent/skills/studio/data/stacks/html-tailwind.csv +56 -0
- package/.agent/skills/studio/data/stacks/jetpack-compose.csv +53 -0
- package/.agent/skills/studio/data/stacks/nextjs.csv +53 -0
- package/.agent/skills/studio/data/stacks/nuxt-ui.csv +51 -0
- package/.agent/skills/studio/data/stacks/nuxtjs.csv +59 -0
- package/.agent/skills/studio/data/stacks/react-native.csv +52 -0
- package/.agent/skills/studio/data/stacks/react.csv +54 -0
- package/.agent/skills/studio/data/stacks/shadcn.csv +61 -0
- package/.agent/skills/studio/data/stacks/svelte.csv +54 -0
- package/.agent/skills/studio/data/stacks/swiftui.csv +51 -0
- package/.agent/skills/studio/data/stacks/vue.csv +50 -0
- package/.agent/skills/studio/data/styles.csv +59 -0
- package/.agent/skills/studio/data/typography.csv +58 -0
- package/.agent/skills/studio/data/ui-reasoning.csv +101 -0
- package/.agent/skills/studio/data/ux-guidelines.csv +100 -0
- package/.agent/skills/studio/data/web-interface.csv +31 -0
- package/.agent/skills/studio/rules/_sections.md +15 -0
- package/.agent/skills/studio/rules/_template.md +32 -0
- package/.agent/skills/studio/rules/engineering-spec.md +455 -0
- package/.agent/skills/studio/scripts/core.ts +345 -0
- package/.agent/skills/studio/scripts/design_system.ts +953 -0
- package/.agent/skills/studio/scripts/search.ts +197 -0
- package/.agent/skills/studio/scripts/types.ts +147 -0
- package/.agent/skills/studio/scripts/utils/component-specs.ts +154 -0
- package/.agent/skills/studio/scripts/utils/config-loader.ts +165 -0
- package/.agent/skills/studio/scripts/utils/css-templates.ts +169 -0
- package/.agent/skills/studio/scripts/utils/css-validator.ts +95 -0
- package/.agent/skills/studio/scripts/utils/csv-loader.ts +52 -0
- package/.agent/skills/studio/scripts/utils/intelligent-overrides.ts +129 -0
- package/.agent/skills/studio/scripts/utils/page-override-formatter.ts +143 -0
- package/.agent/skills/studio/scripts/utils/page-type-detector.ts +124 -0
- package/.agent/skills/studio/scripts/utils/search-cache.ts +165 -0
- package/.agent/skills/studio/scripts/utils/text-utils.ts +44 -0
- package/.agent/skills/system-design/AGENTS.md +597 -0
- package/.agent/skills/system-design/SKILL.md +153 -0
- package/.agent/skills/system-design/rules/_sections.md +15 -0
- package/.agent/skills/system-design/rules/_template.md +32 -0
- package/.agent/skills/system-design/rules/context-discovery.md +117 -0
- package/.agent/skills/system-design/rules/engineering-spec.md +437 -0
- package/.agent/skills/system-design/rules/examples.md +180 -0
- package/.agent/skills/system-design/rules/pattern-selection.md +130 -0
- package/.agent/skills/system-design/rules/patterns-reference.md +110 -0
- package/.agent/skills/system-design/rules/trade-off-analysis.md +169 -0
- package/.agent/skills/tailwind-kit/AGENTS.md +1135 -0
- package/.agent/skills/tailwind-kit/SKILL.md +171 -0
- package/.agent/skills/tailwind-kit/rules/_sections.md +20 -0
- package/.agent/skills/tailwind-kit/rules/_template.md +32 -0
- package/.agent/skills/tailwind-kit/rules/components.md +232 -0
- package/.agent/skills/tailwind-kit/rules/engineering-spec.md +435 -0
- package/.agent/skills/tailwind-kit/rules/responsive.md +221 -0
- package/.agent/skills/tailwind-kit/rules/v4-config.md +72 -0
- package/.agent/skills/test-architect/AGENTS.md +851 -0
- package/.agent/skills/test-architect/SKILL.md +176 -0
- package/.agent/skills/test-architect/rules/_sections.md +15 -0
- package/.agent/skills/test-architect/rules/_template.md +32 -0
- package/.agent/skills/test-architect/rules/engineering-spec.md +434 -0
- package/.agent/skills/test-architect/scripts/test_runner.ts +265 -0
- package/.agent/skills/typescript-expert/AGENTS.md +1045 -0
- package/.agent/skills/typescript-expert/SKILL.md +200 -0
- package/.agent/skills/typescript-expert/rules/_sections.md +20 -0
- package/.agent/skills/typescript-expert/rules/_template.md +32 -0
- package/.agent/skills/typescript-expert/rules/engineering-spec.md +433 -0
- package/.agent/skills/typescript-expert/rules/tsconfig-strict.json +92 -0
- package/.agent/skills/typescript-expert/rules/typescript-cheatsheet.md +407 -0
- package/.agent/skills/typescript-expert/rules/utility-types.ts +264 -0
- package/.agent/skills/typescript-expert/scripts/ts_diagnostic.ts +321 -0
- package/.agent/skills/vercel-deploy/AGENTS.md +490 -0
- package/.agent/skills/vercel-deploy/SKILL.md +175 -0
- package/.agent/skills/vercel-deploy/rules/_sections.md +15 -0
- package/.agent/skills/vercel-deploy/rules/_template.md +32 -0
- package/.agent/skills/vercel-deploy/rules/engineering-spec.md +463 -0
- package/.agent/skills/vercel-deploy/scripts/deploy.sh +310 -0
- package/.agent/workflows/api.md +377 -0
- package/.agent/workflows/autopilot.md +344 -0
- package/.agent/workflows/build.md +338 -0
- package/.agent/workflows/chronicle.md +279 -0
- package/.agent/workflows/cook.md +217 -0
- package/.agent/workflows/diagnose.md +302 -0
- package/.agent/workflows/fix.md +253 -0
- package/.agent/workflows/game.md +329 -0
- package/.agent/workflows/inspect.md +276 -0
- package/.agent/workflows/knowledge.md +212 -0
- package/.agent/workflows/launch.md +345 -0
- package/.agent/workflows/mobile.md +354 -0
- package/.agent/workflows/monitor.md +239 -0
- package/.agent/workflows/optimize.md +269 -0
- package/.agent/workflows/plan.md +278 -0
- package/.agent/workflows/stage.md +286 -0
- package/.agent/workflows/studio.md +276 -0
- package/.agent/workflows/think.md +262 -0
- package/.agent/workflows/validate.md +289 -0
- package/.agentignore +161 -0
- package/.gitattributes +16 -0
- package/CHANGELOG.md +198 -0
- package/LICENSE +40 -0
- package/README.md +173 -0
- package/docs/SKILL_DESIGN_GUIDE.md +561 -0
- package/docs/The-Complete-Guide-to-Building-Skills-for-Claude.md +1207 -0
- package/docs/WORKFLOW_DESIGN_GUIDE.md +325 -0
- package/package.json +33 -0
- package/tsconfig.json +28 -0
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: migrations
|
|
3
|
+
description: Safe migration strategy — zero-downtime patterns, Prisma + Drizzle commands, rollback plans
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Migration Principles
|
|
7
|
+
|
|
8
|
+
> Safe migration strategy for zero-downtime schema changes.
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## Safe Migration Patterns
|
|
13
|
+
|
|
14
|
+
```
|
|
15
|
+
For zero-downtime changes:
|
|
16
|
+
│
|
|
17
|
+
├── Adding column
|
|
18
|
+
│ └── Add as nullable → backfill → add NOT NULL constraint
|
|
19
|
+
│
|
|
20
|
+
├── Removing column
|
|
21
|
+
│ └── Stop reading → deploy → stop writing → deploy → DROP column
|
|
22
|
+
│
|
|
23
|
+
├── Renaming column
|
|
24
|
+
│ └── Add new column → copy data → deploy app → drop old column
|
|
25
|
+
│
|
|
26
|
+
├── Adding index
|
|
27
|
+
│ └── CREATE INDEX CONCURRENTLY (non-blocking)
|
|
28
|
+
│
|
|
29
|
+
└── Changing column type
|
|
30
|
+
└── Add new column → copy → switch → drop old
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
> **Rule:** Never make breaking changes in one step. Always use multi-phase migrations.
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## Migration Classification
|
|
38
|
+
|
|
39
|
+
| Type | Risk | Strategy |
|
|
40
|
+
|------|------|----------|
|
|
41
|
+
| **Additive** | Low | Add nullable column, add table, add index |
|
|
42
|
+
| **Destructive** | High | Drop column, change type, drop table |
|
|
43
|
+
| **Data migration** | Medium | Backfill, transform, merge |
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
## ORM Migration Commands
|
|
48
|
+
|
|
49
|
+
### Prisma
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
# Generate migration (review SQL before applying)
|
|
53
|
+
npx prisma migrate dev --name add_user_avatar
|
|
54
|
+
|
|
55
|
+
# Apply to production (no generation, just apply)
|
|
56
|
+
npx prisma migrate deploy
|
|
57
|
+
|
|
58
|
+
# Reset database (development only!)
|
|
59
|
+
npx prisma migrate reset
|
|
60
|
+
|
|
61
|
+
# View migration status
|
|
62
|
+
npx prisma migrate status
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
### Drizzle
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
# Generate migration SQL
|
|
69
|
+
npx drizzle-kit generate
|
|
70
|
+
|
|
71
|
+
# Apply migrations
|
|
72
|
+
npx drizzle-kit migrate
|
|
73
|
+
|
|
74
|
+
# Push schema directly (development only)
|
|
75
|
+
npx drizzle-kit push
|
|
76
|
+
|
|
77
|
+
# View DB in browser
|
|
78
|
+
npx drizzle-kit studio
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
---
|
|
82
|
+
|
|
83
|
+
## Multi-Phase Migration Example
|
|
84
|
+
|
|
85
|
+
### Adding NOT NULL Column (Safe)
|
|
86
|
+
|
|
87
|
+
```sql
|
|
88
|
+
-- Phase 1: Add nullable column
|
|
89
|
+
ALTER TABLE users ADD COLUMN avatar_url TEXT;
|
|
90
|
+
|
|
91
|
+
-- Phase 2: Backfill data
|
|
92
|
+
UPDATE users SET avatar_url = 'https://default-avatar.png' WHERE avatar_url IS NULL;
|
|
93
|
+
|
|
94
|
+
-- Phase 3: Add NOT NULL (after backfill complete)
|
|
95
|
+
ALTER TABLE users ALTER COLUMN avatar_url SET NOT NULL;
|
|
96
|
+
ALTER TABLE users ALTER COLUMN avatar_url SET DEFAULT 'https://default-avatar.png';
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
### Renaming Column (Safe)
|
|
100
|
+
|
|
101
|
+
```sql
|
|
102
|
+
-- Phase 1: Add new column
|
|
103
|
+
ALTER TABLE users ADD COLUMN display_name TEXT;
|
|
104
|
+
|
|
105
|
+
-- Phase 2: Copy data
|
|
106
|
+
UPDATE users SET display_name = full_name;
|
|
107
|
+
|
|
108
|
+
-- Phase 3: Deploy app reading from display_name
|
|
109
|
+
-- Phase 4: Drop old column
|
|
110
|
+
ALTER TABLE users DROP COLUMN full_name;
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
---
|
|
114
|
+
|
|
115
|
+
## Rollback Strategy
|
|
116
|
+
|
|
117
|
+
| Migration Type | Rollback Method |
|
|
118
|
+
|---------------|-----------------|
|
|
119
|
+
| Add column | `ALTER TABLE DROP COLUMN` |
|
|
120
|
+
| Add index | `DROP INDEX` |
|
|
121
|
+
| Add table | `DROP TABLE` |
|
|
122
|
+
| Drop column | **Cannot undo** — data lost |
|
|
123
|
+
| Change type | Restore from backup |
|
|
124
|
+
|
|
125
|
+
> **Rule:** Always have a rollback plan. Test rollback in staging before production.
|
|
126
|
+
|
|
127
|
+
---
|
|
128
|
+
|
|
129
|
+
## Serverless Database Features
|
|
130
|
+
|
|
131
|
+
### Neon (Serverless PostgreSQL)
|
|
132
|
+
|
|
133
|
+
| Feature | Benefit | Migration Impact |
|
|
134
|
+
|---------|---------|-----------------|
|
|
135
|
+
| Database branching | Test migrations on branch | Safe preview |
|
|
136
|
+
| Scale to zero | Cost savings | Cold start on reconnect |
|
|
137
|
+
| Point-in-time restore | Recovery | Rollback to any point |
|
|
138
|
+
|
|
139
|
+
### Turso (Edge SQLite)
|
|
140
|
+
|
|
141
|
+
| Feature | Benefit | Migration Impact |
|
|
142
|
+
|---------|---------|-----------------|
|
|
143
|
+
| Edge replication | Low latency globally | Schema changes replicate |
|
|
144
|
+
| Embedded replicas | Local reads | Eventual consistency |
|
|
145
|
+
| SQLite compatible | Simple migrations | No ALTER TABLE limitations |
|
|
146
|
+
|
|
147
|
+
---
|
|
148
|
+
|
|
149
|
+
## Anti-Patterns
|
|
150
|
+
|
|
151
|
+
| ❌ Don't | ✅ Do |
|
|
152
|
+
|---------|-------|
|
|
153
|
+
| Run destructive migration in one step | Use multi-phase migration |
|
|
154
|
+
| Skip testing migration on data copy | Test on staging with production-size data |
|
|
155
|
+
| Lock tables during migration | Use `CONCURRENTLY` for indexes |
|
|
156
|
+
| Run `migrate reset` in production | Only use `migrate deploy` in production |
|
|
157
|
+
| Skip rollback plan | Document rollback before applying |
|
|
158
|
+
|
|
159
|
+
---
|
|
160
|
+
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
---
|
|
164
|
+
|
|
165
|
+
## 🔗 Related
|
|
166
|
+
|
|
167
|
+
| File | When to Read |
|
|
168
|
+
|------|-------------|
|
|
169
|
+
| [schema-design.md](schema-design.md) | Schema before migration |
|
|
170
|
+
| [indexing.md](indexing.md) | Index migrations |
|
|
171
|
+
| [database-selection.md](database-selection.md) | Serverless DB features |
|
|
172
|
+
| [SKILL.md](SKILL.md) | Decision checklist |
|
|
173
|
+
|
|
174
|
+
---
|
|
175
|
+
|
|
176
|
+
⚡ PikaKit v3.9.134
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: optimization
|
|
3
|
+
description: Query optimization — N+1 detection, EXPLAIN ANALYZE, pagination, caching strategies
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Query Optimization
|
|
7
|
+
|
|
8
|
+
> N+1 problem, EXPLAIN ANALYZE, optimization priorities with real examples.
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## N+1 Problem
|
|
13
|
+
|
|
14
|
+
```
|
|
15
|
+
What is N+1?
|
|
16
|
+
├── 1 query to get parent records (e.g., 20 users)
|
|
17
|
+
├── N queries to get related records (20 × posts query)
|
|
18
|
+
└── Result: 21 queries instead of 1–2. Very slow!
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
### Detection & Fix
|
|
22
|
+
|
|
23
|
+
```typescript
|
|
24
|
+
// ❌ N+1 — Prisma (fetching posts separately)
|
|
25
|
+
const users = await prisma.user.findMany();
|
|
26
|
+
for (const user of users) {
|
|
27
|
+
const posts = await prisma.post.findMany({
|
|
28
|
+
where: { authorId: user.id },
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
// Result: 1 + N queries
|
|
32
|
+
|
|
33
|
+
// ✅ Fixed — Prisma (include)
|
|
34
|
+
const users = await prisma.user.findMany({
|
|
35
|
+
include: { posts: true },
|
|
36
|
+
});
|
|
37
|
+
// Result: 2 queries (1 users + 1 posts with IN clause)
|
|
38
|
+
|
|
39
|
+
// ✅ Fixed — Drizzle (explicit join)
|
|
40
|
+
const result = await db
|
|
41
|
+
.select()
|
|
42
|
+
.from(users)
|
|
43
|
+
.leftJoin(posts, eq(posts.authorId, users.id));
|
|
44
|
+
// Result: 1 query with JOIN
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
---
|
|
48
|
+
|
|
49
|
+
## EXPLAIN ANALYZE
|
|
50
|
+
|
|
51
|
+
```sql
|
|
52
|
+
-- Always EXPLAIN ANALYZE before optimizing
|
|
53
|
+
EXPLAIN (ANALYZE, BUFFERS, FORMAT TEXT)
|
|
54
|
+
SELECT u.*, COUNT(p.id) as post_count
|
|
55
|
+
FROM users u
|
|
56
|
+
LEFT JOIN posts p ON p.author_id = u.id
|
|
57
|
+
WHERE u.status = 'active'
|
|
58
|
+
GROUP BY u.id
|
|
59
|
+
ORDER BY post_count DESC
|
|
60
|
+
LIMIT 20;
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
### Reading the Output
|
|
64
|
+
|
|
65
|
+
| Look For | Meaning | Action |
|
|
66
|
+
|----------|---------|--------|
|
|
67
|
+
| `Seq Scan` on large table | Full table scan | Add index |
|
|
68
|
+
| `Nested Loop` with high rows | N+1 at SQL level | Rewrite as JOIN |
|
|
69
|
+
| `Sort` with high cost | Sorting unsorted data | Add index with ORDER |
|
|
70
|
+
| `Hash Join` | Large dataset join | Usually OK; check memory |
|
|
71
|
+
| `actual rows` >> `rows` | Bad row estimate | Run `ANALYZE` on table |
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
## Optimization Priorities
|
|
76
|
+
|
|
77
|
+
| Priority | Action | Impact |
|
|
78
|
+
|----------|--------|--------|
|
|
79
|
+
| 1 | **Add missing indexes** | 10–100x faster |
|
|
80
|
+
| 2 | **Fix N+1 queries** | N → 2 queries |
|
|
81
|
+
| 3 | **Select only needed columns** | Less I/O |
|
|
82
|
+
| 4 | **Use proper JOINs** | Avoid subqueries |
|
|
83
|
+
| 5 | **Paginate at DB level** | Don't fetch all rows |
|
|
84
|
+
| 6 | **Cache hot queries** | Offload DB |
|
|
85
|
+
|
|
86
|
+
---
|
|
87
|
+
|
|
88
|
+
## Pagination Patterns
|
|
89
|
+
|
|
90
|
+
```typescript
|
|
91
|
+
// ❌ Offset pagination (slow on large datasets)
|
|
92
|
+
const page2 = await db.select().from(posts)
|
|
93
|
+
.orderBy(desc(posts.createdAt))
|
|
94
|
+
.offset(20) // DB still scans first 20 rows
|
|
95
|
+
.limit(20);
|
|
96
|
+
|
|
97
|
+
// ✅ Cursor pagination (fast, consistent)
|
|
98
|
+
const page2 = await db.select().from(posts)
|
|
99
|
+
.where(lt(posts.createdAt, lastCursor))
|
|
100
|
+
.orderBy(desc(posts.createdAt))
|
|
101
|
+
.limit(20);
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
| Method | Performance | Use When |
|
|
105
|
+
|--------|------------|----------|
|
|
106
|
+
| Offset | O(offset + limit) | Small datasets, admin panels |
|
|
107
|
+
| Cursor | O(limit) | Large datasets, infinite scroll, APIs |
|
|
108
|
+
|
|
109
|
+
---
|
|
110
|
+
|
|
111
|
+
## Common Slow Patterns
|
|
112
|
+
|
|
113
|
+
```sql
|
|
114
|
+
-- ❌ SELECT * (fetches all columns)
|
|
115
|
+
SELECT * FROM users WHERE id = 1;
|
|
116
|
+
|
|
117
|
+
-- ✅ Select only needed
|
|
118
|
+
SELECT id, name, email FROM users WHERE id = 1;
|
|
119
|
+
|
|
120
|
+
-- ❌ LIKE with leading wildcard (no index)
|
|
121
|
+
SELECT * FROM users WHERE name LIKE '%john%';
|
|
122
|
+
|
|
123
|
+
-- ✅ Full-text search with GIN index
|
|
124
|
+
SELECT * FROM users WHERE to_tsvector('english', name) @@ to_tsquery('john');
|
|
125
|
+
|
|
126
|
+
-- ❌ COUNT(*) on large tables
|
|
127
|
+
SELECT COUNT(*) FROM orders;
|
|
128
|
+
|
|
129
|
+
-- ✅ Approximate count
|
|
130
|
+
SELECT reltuples AS estimate FROM pg_class WHERE relname = 'orders';
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
---
|
|
134
|
+
|
|
135
|
+
## Anti-Patterns
|
|
136
|
+
|
|
137
|
+
| ❌ Don't | ✅ Do |
|
|
138
|
+
|---------|-------|
|
|
139
|
+
| Optimize without EXPLAIN | Always EXPLAIN ANALYZE first |
|
|
140
|
+
| Use SELECT * in production | Select only needed columns |
|
|
141
|
+
| Use offset pagination for large data | Use cursor pagination |
|
|
142
|
+
| Use LIKE '%term%' for search | Use full-text search with GIN |
|
|
143
|
+
| Ignore N+1 queries | Use JOIN or include/loader |
|
|
144
|
+
|
|
145
|
+
---
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
---
|
|
150
|
+
|
|
151
|
+
## 🔗 Related
|
|
152
|
+
|
|
153
|
+
| File | When to Read |
|
|
154
|
+
|------|-------------|
|
|
155
|
+
| [indexing.md](indexing.md) | Create indexes for slow queries |
|
|
156
|
+
| [orm-selection.md](orm-selection.md) | ORM-level N+1 prevention |
|
|
157
|
+
| [SKILL.md](SKILL.md) | Decision checklist |
|
|
158
|
+
|
|
159
|
+
---
|
|
160
|
+
|
|
161
|
+
⚡ PikaKit v3.9.134
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: orm-selection
|
|
3
|
+
description: ORM comparison — Drizzle vs Prisma vs Kysely with code examples, N+1 prevention
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# ORM Selection (2025)
|
|
7
|
+
|
|
8
|
+
> Choose ORM based on deployment, DX needs, and N+1 prevention strategy.
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## Decision Tree
|
|
13
|
+
|
|
14
|
+
```
|
|
15
|
+
What's the context?
|
|
16
|
+
│
|
|
17
|
+
├── Edge deployment / Bundle size matters
|
|
18
|
+
│ └── Drizzle (smallest, SQL-like, edge-ready)
|
|
19
|
+
│
|
|
20
|
+
├── Best DX / Schema-first / Rapid prototyping
|
|
21
|
+
│ └── Prisma (migrations, studio, relations)
|
|
22
|
+
│
|
|
23
|
+
├── Maximum SQL control with type safety
|
|
24
|
+
│ └── Kysely (query builder, no schema file)
|
|
25
|
+
│
|
|
26
|
+
├── Raw SQL needed
|
|
27
|
+
│ └── node-postgres / better-sqlite3 + manual types
|
|
28
|
+
│
|
|
29
|
+
└── Python ecosystem
|
|
30
|
+
└── SQLAlchemy 2.0 (async support)
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## Comparison Matrix
|
|
36
|
+
|
|
37
|
+
| Feature | Drizzle | Prisma | Kysely |
|
|
38
|
+
|---------|---------|--------|--------|
|
|
39
|
+
| Bundle size | ~7 KB | ~2 MB | ~30 KB |
|
|
40
|
+
| Edge-ready | ✅ | ❌ | ✅ |
|
|
41
|
+
| Schema definition | TypeScript | `.prisma` file | None (inferred) |
|
|
42
|
+
| Migrations | `drizzle-kit` | `prisma migrate` | Manual / custom |
|
|
43
|
+
| Relations | Manual joins | `include` API | Manual joins |
|
|
44
|
+
| N+1 prevention | Explicit joins | `include` depth limits | Explicit joins |
|
|
45
|
+
| Type safety | Full (SQL-like) | Full (generated) | Full (inferred) |
|
|
46
|
+
| Studio/GUI | Drizzle Studio | Prisma Studio | None |
|
|
47
|
+
| Learning curve | Medium (SQL knowledge) | Low | Medium |
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
## Code Comparison
|
|
52
|
+
|
|
53
|
+
### Schema Definition
|
|
54
|
+
|
|
55
|
+
```typescript
|
|
56
|
+
// Drizzle — TypeScript schema
|
|
57
|
+
import { pgTable, text, timestamp, uuid } from 'drizzle-orm/pg-core';
|
|
58
|
+
|
|
59
|
+
export const users = pgTable('users', {
|
|
60
|
+
id: uuid('id').defaultRandom().primaryKey(),
|
|
61
|
+
email: text('email').notNull().unique(),
|
|
62
|
+
name: text('name').notNull(),
|
|
63
|
+
createdAt: timestamp('created_at').defaultNow().notNull(),
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
export const posts = pgTable('posts', {
|
|
67
|
+
id: uuid('id').defaultRandom().primaryKey(),
|
|
68
|
+
title: text('title').notNull(),
|
|
69
|
+
authorId: uuid('author_id').references(() => users.id).notNull(),
|
|
70
|
+
});
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
```prisma
|
|
74
|
+
// Prisma — .prisma schema
|
|
75
|
+
model User {
|
|
76
|
+
id String @id @default(cuid())
|
|
77
|
+
email String @unique
|
|
78
|
+
name String
|
|
79
|
+
posts Post[]
|
|
80
|
+
createdAt DateTime @default(now()) @map("created_at")
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
model Post {
|
|
84
|
+
id String @id @default(cuid())
|
|
85
|
+
title String
|
|
86
|
+
author User @relation(fields: [authorId], references: [id])
|
|
87
|
+
authorId String @map("author_id")
|
|
88
|
+
}
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
### Query — Fetch User with Posts
|
|
92
|
+
|
|
93
|
+
```typescript
|
|
94
|
+
// Drizzle — explicit join (no N+1)
|
|
95
|
+
const result = await db
|
|
96
|
+
.select()
|
|
97
|
+
.from(users)
|
|
98
|
+
.leftJoin(posts, eq(posts.authorId, users.id))
|
|
99
|
+
.where(eq(users.id, userId));
|
|
100
|
+
|
|
101
|
+
// Prisma — include (watch for N+1 depth)
|
|
102
|
+
const user = await prisma.user.findUnique({
|
|
103
|
+
where: { id: userId },
|
|
104
|
+
include: { posts: true }, // ⚠️ Limit depth: never nest > 2 levels
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
// Kysely — SQL builder
|
|
108
|
+
const result = await db
|
|
109
|
+
.selectFrom('users')
|
|
110
|
+
.leftJoin('posts', 'posts.author_id', 'users.id')
|
|
111
|
+
.where('users.id', '=', userId)
|
|
112
|
+
.selectAll()
|
|
113
|
+
.execute();
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
---
|
|
117
|
+
|
|
118
|
+
## N+1 Prevention by ORM
|
|
119
|
+
|
|
120
|
+
| ORM | N+1 Risk | Prevention |
|
|
121
|
+
|-----|---------|------------|
|
|
122
|
+
| Drizzle | Low | Explicit `leftJoin` / `innerJoin` |
|
|
123
|
+
| Prisma | Medium | `include` with depth limit; avoid nested `include` > 2 |
|
|
124
|
+
| Kysely | Low | Explicit join queries |
|
|
125
|
+
| Raw SQL | None | You write the JOIN |
|
|
126
|
+
|
|
127
|
+
---
|
|
128
|
+
|
|
129
|
+
## Anti-Patterns
|
|
130
|
+
|
|
131
|
+
| ❌ Don't | ✅ Do |
|
|
132
|
+
|---------|-------|
|
|
133
|
+
| Use Prisma for edge functions | Use Drizzle (smaller bundle) |
|
|
134
|
+
| Nest Prisma `include` 3+ levels | Limit to 2 levels; separate queries |
|
|
135
|
+
| Use raw SQL for CRUD | Use ORM for type safety |
|
|
136
|
+
| Choose ORM without considering deployment | Match ORM to runtime (edge vs Node) |
|
|
137
|
+
|
|
138
|
+
---
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
---
|
|
143
|
+
|
|
144
|
+
## 🔗 Related
|
|
145
|
+
|
|
146
|
+
| File | When to Read |
|
|
147
|
+
|------|-------------|
|
|
148
|
+
| [database-selection.md](database-selection.md) | Choose database first |
|
|
149
|
+
| [schema-design.md](schema-design.md) | Schema patterns after ORM selected |
|
|
150
|
+
| [optimization.md](optimization.md) | N+1 and query optimization |
|
|
151
|
+
| [SKILL.md](SKILL.md) | Decision checklist |
|
|
152
|
+
|
|
153
|
+
---
|
|
154
|
+
|
|
155
|
+
⚡ PikaKit v3.9.134
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: schema-design
|
|
3
|
+
description: Schema design principles — normalization, primary keys, timestamps, relationships, Prisma + Drizzle examples
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Schema Design Principles
|
|
7
|
+
|
|
8
|
+
> Normalization, primary keys, timestamps, relationships with ORM examples.
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## Normalization Decision
|
|
13
|
+
|
|
14
|
+
```
|
|
15
|
+
When to normalize (separate tables):
|
|
16
|
+
├── Data is repeated across rows
|
|
17
|
+
├── Updates would need multiple changes
|
|
18
|
+
├── Relationships are clear (1:N, N:M)
|
|
19
|
+
└── Query patterns use JOINs
|
|
20
|
+
|
|
21
|
+
When to denormalize (embed/duplicate):
|
|
22
|
+
├── Read performance critical (dashboards)
|
|
23
|
+
├── Data rarely changes (audit logs)
|
|
24
|
+
├── Always fetched together (user + profile)
|
|
25
|
+
└── Simpler queries needed (reporting)
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## Primary Key Selection
|
|
31
|
+
|
|
32
|
+
| Type | Use When | Example |
|
|
33
|
+
|------|----------|---------|
|
|
34
|
+
| **UUID v4** | Distributed systems, security | `550e8400-e29b-41d4-a716-446655440000` |
|
|
35
|
+
| **ULID** | UUID + sortable by time | `01ARZ3NDEKTSV4RRFFQ69G5FAV` |
|
|
36
|
+
| **cuid2** | Short, collision-resistant | `clh3am6x20000` |
|
|
37
|
+
| **Auto-increment** | Simple apps, single database | `1, 2, 3...` |
|
|
38
|
+
|
|
39
|
+
> **Default:** Use `cuid()` (Prisma) or `uuid()` (Drizzle) for new projects.
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
## Timestamp Strategy
|
|
44
|
+
|
|
45
|
+
```typescript
|
|
46
|
+
// Drizzle — every table gets these
|
|
47
|
+
import { timestamp } from 'drizzle-orm/pg-core';
|
|
48
|
+
|
|
49
|
+
const timestamps = {
|
|
50
|
+
createdAt: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(),
|
|
51
|
+
updatedAt: timestamp('updated_at', { withTimezone: true }).defaultNow().notNull().$onUpdate(() => new Date()),
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
// Prisma — every model gets these
|
|
55
|
+
// createdAt DateTime @default(now()) @map("created_at")
|
|
56
|
+
// updatedAt DateTime @updatedAt @map("updated_at")
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
> **Rule:** Always use `TIMESTAMPTZ` (with timezone), never `TIMESTAMP`.
|
|
60
|
+
|
|
61
|
+
---
|
|
62
|
+
|
|
63
|
+
## Relationship Patterns
|
|
64
|
+
|
|
65
|
+
| Type | When | Implementation |
|
|
66
|
+
|------|------|----------------|
|
|
67
|
+
| **One-to-One** | Extension data (user → profile) | FK + unique constraint on child |
|
|
68
|
+
| **One-to-Many** | Parent-children (user → posts) | FK on child table |
|
|
69
|
+
| **Many-to-Many** | Both sides have many (posts ↔ tags) | Junction table |
|
|
70
|
+
| **Self-referential** | Tree structures (comments → replies) | FK referencing same table |
|
|
71
|
+
|
|
72
|
+
### Prisma Example (1:N + N:M)
|
|
73
|
+
|
|
74
|
+
```prisma
|
|
75
|
+
model User {
|
|
76
|
+
id String @id @default(cuid())
|
|
77
|
+
posts Post[]
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
model Post {
|
|
81
|
+
id String @id @default(cuid())
|
|
82
|
+
author User @relation(fields: [authorId], references: [id])
|
|
83
|
+
authorId String @map("author_id")
|
|
84
|
+
tags PostTag[]
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
model Tag {
|
|
88
|
+
id String @id @default(cuid())
|
|
89
|
+
name String @unique
|
|
90
|
+
posts PostTag[]
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
model PostTag {
|
|
94
|
+
postId String @map("post_id")
|
|
95
|
+
tagId String @map("tag_id")
|
|
96
|
+
post Post @relation(fields: [postId], references: [id])
|
|
97
|
+
tag Tag @relation(fields: [tagId], references: [id])
|
|
98
|
+
@@id([postId, tagId])
|
|
99
|
+
}
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
---
|
|
103
|
+
|
|
104
|
+
## Foreign Key ON DELETE
|
|
105
|
+
|
|
106
|
+
| Action | Behavior | Use When |
|
|
107
|
+
|--------|----------|----------|
|
|
108
|
+
| `CASCADE` | Delete children with parent | Comments when post deleted |
|
|
109
|
+
| `SET NULL` | Children become orphans | Author deleted, posts remain |
|
|
110
|
+
| `RESTRICT` | Prevent delete if children exist | User has active orders |
|
|
111
|
+
| `SET DEFAULT` | Children get default value | Rare; prefer SET NULL |
|
|
112
|
+
|
|
113
|
+
> **Default:** Use `RESTRICT` for safety. Explicitly choose `CASCADE` only when appropriate.
|
|
114
|
+
|
|
115
|
+
---
|
|
116
|
+
|
|
117
|
+
## Soft Delete Pattern
|
|
118
|
+
|
|
119
|
+
```typescript
|
|
120
|
+
// Drizzle
|
|
121
|
+
export const users = pgTable('users', {
|
|
122
|
+
id: uuid('id').defaultRandom().primaryKey(),
|
|
123
|
+
deletedAt: timestamp('deleted_at', { withTimezone: true }),
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
// Query — exclude soft-deleted
|
|
127
|
+
const activeUsers = await db
|
|
128
|
+
.select()
|
|
129
|
+
.from(users)
|
|
130
|
+
.where(isNull(users.deletedAt));
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
---
|
|
134
|
+
|
|
135
|
+
## Anti-Patterns
|
|
136
|
+
|
|
137
|
+
| ❌ Don't | ✅ Do |
|
|
138
|
+
|---------|-------|
|
|
139
|
+
| Use `TIMESTAMP` without timezone | Use `TIMESTAMPTZ` always |
|
|
140
|
+
| Store JSON when relational fits | Normalize into related tables |
|
|
141
|
+
| Auto-increment IDs in distributed systems | Use UUID/ULID/cuid |
|
|
142
|
+
| Skip `ON DELETE` strategy | Explicitly define for every FK |
|
|
143
|
+
| `CASCADE` delete by default | Default to `RESTRICT`; explicitly choose |
|
|
144
|
+
|
|
145
|
+
---
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
---
|
|
150
|
+
|
|
151
|
+
## 🔗 Related
|
|
152
|
+
|
|
153
|
+
| File | When to Read |
|
|
154
|
+
|------|-------------|
|
|
155
|
+
| [indexing.md](indexing.md) | Index after schema designed |
|
|
156
|
+
| [migrations.md](migrations.md) | Migrate schema changes safely |
|
|
157
|
+
| [orm-selection.md](orm-selection.md) | ORM for schema definition |
|
|
158
|
+
| [SKILL.md](SKILL.md) | Decision checklist |
|
|
159
|
+
|
|
160
|
+
---
|
|
161
|
+
|
|
162
|
+
⚡ PikaKit v3.9.134
|