claudeinone-cli 1.0.1 → 1.0.3
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/dist/index.js +16 -1
- package/kit/.claude/.ck.json +9 -0
- package/kit/.claude/.ckignore +12 -0
- package/kit/.claude/agents/accessibility-auditor.md +46 -0
- package/kit/.claude/agents/api-designer.md +43 -0
- package/kit/.claude/agents/backend-developer.md +54 -0
- package/kit/.claude/agents/brainstormer.md +33 -0
- package/kit/.claude/agents/campaign-manager.md +36 -0
- package/kit/.claude/agents/code-reviewer.md +39 -0
- package/kit/.claude/agents/content-creator.md +38 -0
- package/kit/.claude/agents/copywriter.md +42 -0
- package/kit/.claude/agents/database-admin.md +37 -0
- package/kit/.claude/agents/debugger.md +46 -0
- package/kit/.claude/agents/devops-engineer.md +41 -0
- package/kit/.claude/agents/docs-manager.md +33 -0
- package/kit/.claude/agents/email-wizard.md +40 -0
- package/kit/.claude/agents/frontend-developer.md +52 -0
- package/kit/.claude/agents/fullstack-developer.md +55 -0
- package/kit/.claude/agents/git-manager.md +40 -0
- package/kit/.claude/agents/i18n-specialist.md +46 -0
- package/kit/.claude/agents/integration-specialist.md +48 -0
- package/kit/.claude/agents/journal-writer.md +39 -0
- package/kit/.claude/agents/mcp-manager.md +57 -0
- package/kit/.claude/agents/mobile-developer.md +38 -0
- package/kit/.claude/agents/performance-optimizer.md +38 -0
- package/kit/.claude/agents/planner.md +56 -0
- package/kit/.claude/agents/project-manager.md +34 -0
- package/kit/.claude/agents/refactorer.md +43 -0
- package/kit/.claude/agents/researcher.md +45 -0
- package/kit/.claude/agents/risk-analyst.md +33 -0
- package/kit/.claude/agents/scalability-consultant.md +39 -0
- package/kit/.claude/agents/scout.md +25 -0
- package/kit/.claude/agents/security-auditor.md +42 -0
- package/kit/.claude/agents/seo-specialist.md +44 -0
- package/kit/.claude/agents/skill-creator.md +64 -0
- package/kit/.claude/agents/social-media-manager.md +35 -0
- package/kit/.claude/agents/systems-designer.md +35 -0
- package/kit/.claude/agents/technology-strategist.md +43 -0
- package/kit/.claude/agents/tester.md +40 -0
- package/kit/.claude/agents/ui-ux-designer.md +40 -0
- package/kit/.claude/commands/co/ask.md +29 -0
- package/kit/.claude/commands/co/bootstrap-auto-fast.md +28 -0
- package/kit/.claude/commands/co/bootstrap-auto-parallel.md +29 -0
- package/kit/.claude/commands/co/bootstrap-auto.md +30 -0
- package/kit/.claude/commands/co/bootstrap.md +31 -0
- package/kit/.claude/commands/co/brainstorm.md +27 -0
- package/kit/.claude/commands/co/campaign.md +28 -0
- package/kit/.claude/commands/co/changelog.md +25 -0
- package/kit/.claude/commands/co/checkpoint.md +25 -0
- package/kit/.claude/commands/co/ci.md +26 -0
- package/kit/.claude/commands/co/ck-help.md +24 -0
- package/kit/.claude/commands/co/coding-level.md +24 -0
- package/kit/.claude/commands/co/content-cro.md +26 -0
- package/kit/.claude/commands/co/content-enhance.md +26 -0
- package/kit/.claude/commands/co/content-fast.md +24 -0
- package/kit/.claude/commands/co/content-good.md +26 -0
- package/kit/.claude/commands/co/cook.md +33 -0
- package/kit/.claude/commands/co/debug.md +26 -0
- package/kit/.claude/commands/co/deploy.md +25 -0
- package/kit/.claude/commands/co/design-3d.md +27 -0
- package/kit/.claude/commands/co/design-describe.md +25 -0
- package/kit/.claude/commands/co/design-fast.md +25 -0
- package/kit/.claude/commands/co/design-good.md +28 -0
- package/kit/.claude/commands/co/design-screenshot.md +26 -0
- package/kit/.claude/commands/co/design-video.md +26 -0
- package/kit/.claude/commands/co/docker.md +24 -0
- package/kit/.claude/commands/co/docs-api.md +25 -0
- package/kit/.claude/commands/co/docs-init.md +26 -0
- package/kit/.claude/commands/co/docs-readme.md +24 -0
- package/kit/.claude/commands/co/docs-summarize.md +25 -0
- package/kit/.claude/commands/co/docs-update.md +25 -0
- package/kit/.claude/commands/co/env-check.md +25 -0
- package/kit/.claude/commands/co/fix-ci.md +29 -0
- package/kit/.claude/commands/co/fix-fast.md +28 -0
- package/kit/.claude/commands/co/fix-hard.md +33 -0
- package/kit/.claude/commands/co/fix-logs.md +28 -0
- package/kit/.claude/commands/co/fix-types.md +28 -0
- package/kit/.claude/commands/co/fix-ui.md +28 -0
- package/kit/.claude/commands/co/fix.md +27 -0
- package/kit/.claude/commands/co/git-cm.md +26 -0
- package/kit/.claude/commands/co/git-cp.md +26 -0
- package/kit/.claude/commands/co/git-pr.md +26 -0
- package/kit/.claude/commands/co/index.md +24 -0
- package/kit/.claude/commands/co/integrate-polar.md +29 -0
- package/kit/.claude/commands/co/integrate-sepay.md +29 -0
- package/kit/.claude/commands/co/journal.md +27 -0
- package/kit/.claude/commands/co/k8s.md +24 -0
- package/kit/.claude/commands/co/kanban.md +25 -0
- package/kit/.claude/commands/co/lint-fix.md +24 -0
- package/kit/.claude/commands/co/load.md +25 -0
- package/kit/.claude/commands/co/migrate.md +28 -0
- package/kit/.claude/commands/co/mock.md +26 -0
- package/kit/.claude/commands/co/mode.md +24 -0
- package/kit/.claude/commands/co/monitor.md +25 -0
- package/kit/.claude/commands/co/new-feature.md +27 -0
- package/kit/.claude/commands/co/optimize.md +26 -0
- package/kit/.claude/commands/co/plan-archive.md +24 -0
- package/kit/.claude/commands/co/plan-ci.md +28 -0
- package/kit/.claude/commands/co/plan-cro.md +27 -0
- package/kit/.claude/commands/co/plan-fast.md +24 -0
- package/kit/.claude/commands/co/plan-hard.md +27 -0
- package/kit/.claude/commands/co/plan-parallel.md +25 -0
- package/kit/.claude/commands/co/plan-two.md +29 -0
- package/kit/.claude/commands/co/plan-validate.md +27 -0
- package/kit/.claude/commands/co/plan.md +27 -0
- package/kit/.claude/commands/co/pr.md +25 -0
- package/kit/.claude/commands/co/preview.md +26 -0
- package/kit/.claude/commands/co/refactor.md +25 -0
- package/kit/.claude/commands/co/release.md +25 -0
- package/kit/.claude/commands/co/review-a11y.md +24 -0
- package/kit/.claude/commands/co/review-codebase-parallel.md +27 -0
- package/kit/.claude/commands/co/review-codebase.md +27 -0
- package/kit/.claude/commands/co/review-perf.md +24 -0
- package/kit/.claude/commands/co/review-security.md +25 -0
- package/kit/.claude/commands/co/scaffold.md +25 -0
- package/kit/.claude/commands/co/scout.md +26 -0
- package/kit/.claude/commands/co/secure.md +26 -0
- package/kit/.claude/commands/co/seed.md +25 -0
- package/kit/.claude/commands/co/seo-audit.md +24 -0
- package/kit/.claude/commands/co/seo-keywords.md +25 -0
- package/kit/.claude/commands/co/skill-create.md +29 -0
- package/kit/.claude/commands/co/skill-fix-logs.md +28 -0
- package/kit/.claude/commands/co/slide-create.md +24 -0
- package/kit/.claude/commands/co/spawn.md +24 -0
- package/kit/.claude/commands/co/terraform.md +24 -0
- package/kit/.claude/commands/co/test-gen.md +24 -0
- package/kit/.claude/commands/co/test-ui.md +27 -0
- package/kit/.claude/commands/co/test.md +26 -0
- package/kit/.claude/commands/co/use-mcp.md +25 -0
- package/kit/.claude/commands/co/video-script.md +25 -0
- package/kit/.claude/commands/co/watzup.md +25 -0
- package/kit/.claude/commands/co/worktree.md +25 -0
- package/kit/.claude/commands/co/write-blog.md +25 -0
- package/kit/.claude/commands/co/write-copy.md +24 -0
- package/kit/.claude/commands/co/write-email.md +25 -0
- package/kit/.claude/commands/content/content-cro.md +26 -0
- package/kit/.claude/commands/content/content-enhance.md +26 -0
- package/kit/.claude/commands/content/content-fast.md +24 -0
- package/kit/.claude/commands/content/content-good.md +26 -0
- package/kit/.claude/commands/content/enhance.md +26 -0
- package/kit/.claude/commands/content/good.md +26 -0
- package/kit/.claude/commands/core/ask.md +29 -0
- package/kit/.claude/commands/core/bootstrap-auto-fast.md +28 -0
- package/kit/.claude/commands/core/bootstrap-auto-parallel.md +29 -0
- package/kit/.claude/commands/core/bootstrap-auto.md +30 -0
- package/kit/.claude/commands/core/bootstrap.md +31 -0
- package/kit/.claude/commands/core/ck-help.md +24 -0
- package/kit/.claude/commands/core/coding-level.md +24 -0
- package/kit/.claude/commands/core/cook.md +33 -0
- package/kit/.claude/commands/core/debug.md +26 -0
- package/kit/.claude/commands/core/journal.md +27 -0
- package/kit/.claude/commands/core/kanban.md +25 -0
- package/kit/.claude/commands/core/preview.md +26 -0
- package/kit/.claude/commands/core/scout.md +26 -0
- package/kit/.claude/commands/core/test-ui.md +27 -0
- package/kit/.claude/commands/core/test.md +26 -0
- package/kit/.claude/commands/core/use-mcp.md +25 -0
- package/kit/.claude/commands/core/watzup.md +25 -0
- package/kit/.claude/commands/core/worktree.md +25 -0
- package/kit/.claude/commands/design/3d.md +27 -0
- package/kit/.claude/commands/design/design-3d.md +27 -0
- package/kit/.claude/commands/design/design-describe.md +25 -0
- package/kit/.claude/commands/design/design-fast.md +25 -0
- package/kit/.claude/commands/design/design-good.md +28 -0
- package/kit/.claude/commands/design/design-screenshot.md +26 -0
- package/kit/.claude/commands/design/design-video.md +26 -0
- package/kit/.claude/commands/design/good.md +28 -0
- package/kit/.claude/commands/design/video.md +26 -0
- package/kit/.claude/commands/docs/docs-init.md +26 -0
- package/kit/.claude/commands/docs/docs-summarize.md +25 -0
- package/kit/.claude/commands/docs/docs-update.md +25 -0
- package/kit/.claude/commands/docs/init.md +26 -0
- package/kit/.claude/commands/docs/summarize.md +25 -0
- package/kit/.claude/commands/fix/ci.md +29 -0
- package/kit/.claude/commands/fix/fast.md +28 -0
- package/kit/.claude/commands/fix/fix-ci.md +29 -0
- package/kit/.claude/commands/fix/fix-fast.md +28 -0
- package/kit/.claude/commands/fix/fix-hard.md +33 -0
- package/kit/.claude/commands/fix/fix-logs.md +28 -0
- package/kit/.claude/commands/fix/fix-types.md +28 -0
- package/kit/.claude/commands/fix/fix-ui.md +28 -0
- package/kit/.claude/commands/fix/hard.md +33 -0
- package/kit/.claude/commands/fix/logs.md +28 -0
- package/kit/.claude/commands/fix/types.md +28 -0
- package/kit/.claude/commands/fix/ui.md +28 -0
- package/kit/.claude/commands/git/cp.md +26 -0
- package/kit/.claude/commands/git/git-cm.md +26 -0
- package/kit/.claude/commands/git/git-cp.md +26 -0
- package/kit/.claude/commands/git/git-pr.md +26 -0
- package/kit/.claude/commands/integrate/integrate-polar.md +29 -0
- package/kit/.claude/commands/integrate/integrate-sepay.md +29 -0
- package/kit/.claude/commands/integrate/sepay.md +29 -0
- package/kit/.claude/commands/plan/ci.md +28 -0
- package/kit/.claude/commands/plan/cro.md +27 -0
- package/kit/.claude/commands/plan/hard.md +27 -0
- package/kit/.claude/commands/plan/plan-archive.md +24 -0
- package/kit/.claude/commands/plan/plan-ci.md +28 -0
- package/kit/.claude/commands/plan/plan-cro.md +27 -0
- package/kit/.claude/commands/plan/plan-fast.md +24 -0
- package/kit/.claude/commands/plan/plan-hard.md +27 -0
- package/kit/.claude/commands/plan/plan-parallel.md +25 -0
- package/kit/.claude/commands/plan/plan-two.md +29 -0
- package/kit/.claude/commands/plan/plan-validate.md +27 -0
- package/kit/.claude/commands/plan/plan.md +27 -0
- package/kit/.claude/commands/plan/validate.md +27 -0
- package/kit/.claude/commands/skill/fix-logs.md +28 -0
- package/kit/.claude/commands/skill/skill-create.md +29 -0
- package/kit/.claude/commands/skill/skill-fix-logs.md +28 -0
- package/kit/.claude/settings.json +16 -0
- package/kit/.claude/skills/ai-anthropic.md +100 -0
- package/kit/.claude/skills/ai-context-engineering.md +113 -0
- package/kit/.claude/skills/ai-gemini.md +152 -0
- package/kit/.claude/skills/ai-langchain.md +93 -0
- package/kit/.claude/skills/ai-llamaindex.md +179 -0
- package/kit/.claude/skills/ai-mcp-builder.md +101 -0
- package/kit/.claude/skills/ai-openai.md +250 -0
- package/kit/.claude/skills/ai-prompt-engineering.md +173 -0
- package/kit/.claude/skills/ai-rag.md +91 -0
- package/kit/.claude/skills/ai-vectordb.md +215 -0
- package/kit/.claude/skills/analytics-segment.md +161 -0
- package/kit/.claude/skills/api-caching.md +103 -0
- package/kit/.claude/skills/api-documentation.md +50 -0
- package/kit/.claude/skills/api-graphql.md +234 -0
- package/kit/.claude/skills/api-openapi.md +116 -0
- package/kit/.claude/skills/api-pagination-filtering.md +239 -0
- package/kit/.claude/skills/api-rate-limiting.md +179 -0
- package/kit/.claude/skills/api-rest-advanced.md +50 -0
- package/kit/.claude/skills/api-rest.md +217 -0
- package/kit/.claude/skills/api-trpc.md +173 -0
- package/kit/.claude/skills/api-versioning.md +70 -0
- package/kit/.claude/skills/api-webhooks.md +226 -0
- package/kit/.claude/skills/arch-clean-code.md +226 -0
- package/kit/.claude/skills/arch-clean.md +91 -0
- package/kit/.claude/skills/arch-cqrs.md +229 -0
- package/kit/.claude/skills/arch-ddd.md +85 -0
- package/kit/.claude/skills/arch-event-driven.md +189 -0
- package/kit/.claude/skills/arch-microservices.md +80 -0
- package/kit/.claude/skills/arch-monorepo.md +87 -0
- package/kit/.claude/skills/arch-multi-tenant.md +81 -0
- package/kit/.claude/skills/arch-serverless.md +86 -0
- package/kit/.claude/skills/auth-clerk.md +97 -0
- package/kit/.claude/skills/auth-jwt.md +143 -0
- package/kit/.claude/skills/auth-lucia.md +93 -0
- package/kit/.claude/skills/auth-nextauth.md +446 -0
- package/kit/.claude/skills/auth-oauth.md +208 -0
- package/kit/.claude/skills/auth-oauth2.md +110 -0
- package/kit/.claude/skills/auth-passkeys.md +109 -0
- package/kit/.claude/skills/auth-session.md +88 -0
- package/kit/.claude/skills/backend-dotnet.md +414 -0
- package/kit/.claude/skills/backend-express.md +129 -0
- package/kit/.claude/skills/backend-fastify.md +104 -0
- package/kit/.claude/skills/backend-go.md +205 -0
- package/kit/.claude/skills/backend-graphql.md +149 -0
- package/kit/.claude/skills/backend-grpc.md +382 -0
- package/kit/.claude/skills/backend-hono.md +95 -0
- package/kit/.claude/skills/backend-java-spring.md +198 -0
- package/kit/.claude/skills/backend-nodejs-express.md +165 -0
- package/kit/.claude/skills/backend-nodejs.md +143 -0
- package/kit/.claude/skills/backend-php-laravel.md +156 -0
- package/kit/.claude/skills/backend-python-django.md +200 -0
- package/kit/.claude/skills/backend-python-fastapi.md +169 -0
- package/kit/.claude/skills/backend-ruby-rails.md +190 -0
- package/kit/.claude/skills/backend-rust.md +182 -0
- package/kit/.claude/skills/backend-websockets.md +392 -0
- package/kit/.claude/skills/cache-redis.md +195 -0
- package/kit/.claude/skills/caching-strategies.md +100 -0
- package/kit/.claude/skills/cloud-aws.md +165 -0
- package/kit/.claude/skills/cloud-azure.md +187 -0
- package/kit/.claude/skills/cloud-cloudflare.md +74 -0
- package/kit/.claude/skills/cloud-fly.md +94 -0
- package/kit/.claude/skills/cloud-gcp.md +160 -0
- package/kit/.claude/skills/cloud-railway.md +92 -0
- package/kit/.claude/skills/cloud-render.md +70 -0
- package/kit/.claude/skills/cloud-serverless.md +68 -0
- package/kit/.claude/skills/cloud-vercel.md +76 -0
- package/kit/.claude/skills/component-patterns.md +50 -0
- package/kit/.claude/skills/content-management.md +197 -0
- package/kit/.claude/skills/cors-security.md +50 -0
- package/kit/.claude/skills/data-csv-excel.md +210 -0
- package/kit/.claude/skills/database-optimization.md +196 -0
- package/kit/.claude/skills/databases-transactions.md +68 -0
- package/kit/.claude/skills/db-cassandra.md +89 -0
- package/kit/.claude/skills/db-drizzle.md +363 -0
- package/kit/.claude/skills/db-dynamodb.md +83 -0
- package/kit/.claude/skills/db-elasticsearch.md +105 -0
- package/kit/.claude/skills/db-firebase-firestore.md +191 -0
- package/kit/.claude/skills/db-mongodb.md +198 -0
- package/kit/.claude/skills/db-mysql.md +50 -0
- package/kit/.claude/skills/db-neon.md +72 -0
- package/kit/.claude/skills/db-planetscale.md +76 -0
- package/kit/.claude/skills/db-postgresql.md +50 -0
- package/kit/.claude/skills/db-prisma.md +414 -0
- package/kit/.claude/skills/db-redis.md +50 -0
- package/kit/.claude/skills/db-sqlite.md +149 -0
- package/kit/.claude/skills/db-supabase.md +445 -0
- package/kit/.claude/skills/devops-ci-cd.md +271 -0
- package/kit/.claude/skills/devops-database-backup.md +77 -0
- package/kit/.claude/skills/devops-docker.md +93 -0
- package/kit/.claude/skills/devops-github-actions.md +82 -0
- package/kit/.claude/skills/devops-health-checks.md +50 -0
- package/kit/.claude/skills/devops-kubernetes.md +109 -0
- package/kit/.claude/skills/devops-logging.md +163 -0
- package/kit/.claude/skills/devops-monitoring.md +203 -0
- package/kit/.claude/skills/devops-pulumi.md +94 -0
- package/kit/.claude/skills/devops-secrets.md +166 -0
- package/kit/.claude/skills/devops-terraform.md +226 -0
- package/kit/.claude/skills/error-boundaries.md +84 -0
- package/kit/.claude/skills/file-storage.md +50 -0
- package/kit/.claude/skills/frontend-angular.md +104 -0
- package/kit/.claude/skills/frontend-astro.md +94 -0
- package/kit/.claude/skills/frontend-bundle-analysis.md +147 -0
- package/kit/.claude/skills/frontend-forms.md +134 -0
- package/kit/.claude/skills/frontend-htmx.md +86 -0
- package/kit/.claude/skills/frontend-nextjs.md +188 -0
- package/kit/.claude/skills/frontend-pwa.md +105 -0
- package/kit/.claude/skills/frontend-react-hooks.md +238 -0
- package/kit/.claude/skills/frontend-react.md +129 -0
- package/kit/.claude/skills/frontend-remix-advanced.md +106 -0
- package/kit/.claude/skills/frontend-remix.md +101 -0
- package/kit/.claude/skills/frontend-solid.md +99 -0
- package/kit/.claude/skills/frontend-state-management.md +134 -0
- package/kit/.claude/skills/frontend-state.md +106 -0
- package/kit/.claude/skills/frontend-svelte.md +121 -0
- package/kit/.claude/skills/frontend-testing.md +100 -0
- package/kit/.claude/skills/frontend-vite.md +94 -0
- package/kit/.claude/skills/frontend-vue.md +133 -0
- package/kit/.claude/skills/frontend-webpack.md +93 -0
- package/kit/.claude/skills/functional-programming.md +50 -0
- package/kit/.claude/skills/hooks-custom.md +50 -0
- package/kit/.claude/skills/http-server.md +50 -0
- package/kit/.claude/skills/i18n-general.md +89 -0
- package/kit/.claude/skills/i18n-localization.md +191 -0
- package/kit/.claude/skills/i18n-nextjs.md +127 -0
- package/kit/.claude/skills/infrastructure-docker-compose.md +77 -0
- package/kit/.claude/skills/infrastructure-serverless.md +177 -0
- package/kit/.claude/skills/jwt-tokens.md +50 -0
- package/kit/.claude/skills/logging-winston.md +106 -0
- package/kit/.claude/skills/messaging-kafka.md +102 -0
- package/kit/.claude/skills/messaging-rabbitmq.md +50 -0
- package/kit/.claude/skills/mobile-capacitor.md +109 -0
- package/kit/.claude/skills/mobile-expo.md +101 -0
- package/kit/.claude/skills/mobile-flutter.md +259 -0
- package/kit/.claude/skills/mobile-react-native.md +238 -0
- package/kit/.claude/skills/monitoring-apm.md +50 -0
- package/kit/.claude/skills/monitoring-error-tracking.md +217 -0
- package/kit/.claude/skills/nodejs-streams.md +168 -0
- package/kit/.claude/skills/oauth-integration.md +50 -0
- package/kit/.claude/skills/patterns-dependency-injection.md +218 -0
- package/kit/.claude/skills/patterns-factory-singleton.md +209 -0
- package/kit/.claude/skills/patterns-observer-pubsub.md +210 -0
- package/kit/.claude/skills/payment-lemonsqueezy.md +101 -0
- package/kit/.claude/skills/payment-square.md +178 -0
- package/kit/.claude/skills/payment-stripe.md +206 -0
- package/kit/.claude/skills/perf-bundle.md +100 -0
- package/kit/.claude/skills/perf-web-vitals.md +102 -0
- package/kit/.claude/skills/performance-database-connection-pooling.md +67 -0
- package/kit/.claude/skills/performance-metrics.md +73 -0
- package/kit/.claude/skills/performance-optimization.md +208 -0
- package/kit/.claude/skills/performance-web-vitals.md +169 -0
- package/kit/.claude/skills/rate-limiting.md +77 -0
- package/kit/.claude/skills/reactive-programming.md +50 -0
- package/kit/.claude/skills/realtime-database.md +50 -0
- package/kit/.claude/skills/realtime-subscriptions.md +218 -0
- package/kit/.claude/skills/saas-ab-testing.md +90 -0
- package/kit/.claude/skills/saas-analytics.md +113 -0
- package/kit/.claude/skills/saas-billing.md +106 -0
- package/kit/.claude/skills/saas-email.md +88 -0
- package/kit/.claude/skills/saas-feature-flags.md +83 -0
- package/kit/.claude/skills/saas-onboarding.md +96 -0
- package/kit/.claude/skills/saas-user-onboarding.md +207 -0
- package/kit/.claude/skills/security-encryption.md +216 -0
- package/kit/.claude/skills/security-owasp.md +212 -0
- package/kit/.claude/skills/security-secrets-rotation.md +64 -0
- package/kit/.claude/skills/seo-content.md +94 -0
- package/kit/.claude/skills/seo-technical.md +101 -0
- package/kit/.claude/skills/serverless-framework.md +151 -0
- package/kit/.claude/skills/sharding-scaling.md +50 -0
- package/kit/.claude/skills/styling-css-modules.md +219 -0
- package/kit/.claude/skills/styling-styled-components.md +206 -0
- package/kit/.claude/skills/styling-tailwind.md +206 -0
- package/kit/.claude/skills/test-e2e.md +86 -0
- package/kit/.claude/skills/test-integration.md +216 -0
- package/kit/.claude/skills/test-performance.md +162 -0
- package/kit/.claude/skills/test-tdd.md +170 -0
- package/kit/.claude/skills/test-unit.md +301 -0
- package/kit/.claude/skills/testing-accessibility.md +117 -0
- package/kit/.claude/skills/testing-contract.md +75 -0
- package/kit/.claude/skills/testing-e2e-advanced.md +50 -0
- package/kit/.claude/skills/testing-load-stress.md +79 -0
- package/kit/.claude/skills/testing-mutation.md +92 -0
- package/kit/.claude/skills/testing-snapshot.md +50 -0
- package/kit/.claude/skills/testing-vitest.md +172 -0
- package/kit/.claude/skills/tooling-biome.md +91 -0
- package/kit/.claude/skills/tooling-build-tools.md +166 -0
- package/kit/.claude/skills/tooling-bun.md +94 -0
- package/kit/.claude/skills/tooling-eslint.md +103 -0
- package/kit/.claude/skills/tooling-git.md +79 -0
- package/kit/.claude/skills/tooling-monorepo.md +162 -0
- package/kit/.claude/skills/tooling-testing-frameworks.md +207 -0
- package/kit/.claude/skills/tooling-typescript.md +156 -0
- package/kit/.claude/skills/ui-a11y.md +106 -0
- package/kit/.claude/skills/ui-framer.md +106 -0
- package/kit/.claude/skills/ui-gsap.md +102 -0
- package/kit/.claude/skills/ui-radix.md +82 -0
- package/kit/.claude/skills/ui-shadcn.md +463 -0
- package/kit/.claude/skills/ui-tailwind.md +98 -0
- package/kit/.claude/skills/ui-threejs.md +110 -0
- package/kit/.claude/skills/ui-tokens.md +97 -0
- package/kit/.claude/skills/utilities-date-time.md +170 -0
- package/kit/.claude/skills/validation-schemas.md +110 -0
- package/kit/.claude/skills/version-control-git.md +144 -0
- package/kit/.claude/skills/web-accessibility-wcag.md +102 -0
- package/kit/.claude/skills/web-astro.md +197 -0
- package/kit/.claude/skills/web-html-css.md +224 -0
- package/kit/.claude/skills/web-htmx.md +99 -0
- package/kit/.claude/skills/web-nextjs-advanced.md +202 -0
- package/kit/.claude/skills/web-remix.md +194 -0
- package/kit/.claude/skills/web-seo.md +99 -0
- package/kit/.claude/skills/web-svelte.md +234 -0
- package/kit/.claude/skills/websocket-server.md +50 -0
- package/kit/.claude/skills/writing-marketing.md +89 -0
- package/kit/.claude/skills/writing-technical.md +119 -0
- package/kit/CLAUDE.md +206 -0
- package/kit/README.md +150 -0
- package/kit/SKILLS_INDEX.md +188 -0
- package/kit/docs/README.md +3 -0
- package/kit/journals/README.md +3 -0
- package/kit/plans/README.md +3 -0
- package/package.json +3 -1
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
# Content Management Systems
|
|
2
|
+
|
|
3
|
+
Building and managing content with headless CMS or self-hosted solutions.
|
|
4
|
+
|
|
5
|
+
## Headless CMS with Strapi
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install strapi @strapi/strapi @strapi/plugin-users-permissions
|
|
9
|
+
npx strapi new my-cms
|
|
10
|
+
cd my-cms
|
|
11
|
+
npx strapi develop
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
```typescript
|
|
15
|
+
// Create content type via API
|
|
16
|
+
const strapiClient = axios.create({
|
|
17
|
+
baseURL: 'http://localhost:1337/api',
|
|
18
|
+
headers: {
|
|
19
|
+
Authorization: `Bearer ${process.env.STRAPI_TOKEN}`
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
// Create post
|
|
24
|
+
const response = await strapiClient.post('/posts', {
|
|
25
|
+
data: {
|
|
26
|
+
title: 'My Post',
|
|
27
|
+
content: 'Post content',
|
|
28
|
+
published: true
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
// Query posts
|
|
33
|
+
const posts = await strapiClient.get('/posts?populate=author');
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## Contentful Integration
|
|
37
|
+
|
|
38
|
+
```typescript
|
|
39
|
+
import { createClient } from 'contentful';
|
|
40
|
+
|
|
41
|
+
const client = createClient({
|
|
42
|
+
space: process.env.CONTENTFUL_SPACE_ID,
|
|
43
|
+
accessToken: process.env.CONTENTFUL_ACCESS_TOKEN
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
// Fetch content
|
|
47
|
+
const entries = await client.getEntries({
|
|
48
|
+
content_type: 'blogPost',
|
|
49
|
+
limit: 10,
|
|
50
|
+
order: '-sys.createdAt'
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
entries.items.forEach(item => {
|
|
54
|
+
console.log(item.fields.title);
|
|
55
|
+
console.log(item.fields.body);
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
// Fetch single entry
|
|
59
|
+
const entry = await client.getEntry(entryId);
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
## Next.js with Markdown
|
|
63
|
+
|
|
64
|
+
```typescript
|
|
65
|
+
// pages/blog/[slug].tsx
|
|
66
|
+
import { MDXRemote, MDXRemoteSerializeResult } from 'next-mdx-remote';
|
|
67
|
+
import { serialize } from 'next-mdx-remote/serialize';
|
|
68
|
+
import fs from 'fs';
|
|
69
|
+
import path from 'path';
|
|
70
|
+
|
|
71
|
+
interface PostProps {
|
|
72
|
+
source: MDXRemoteSerializeResult;
|
|
73
|
+
frontmatter: Record<string, any>;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
export async function getStaticProps({ params }: any) {
|
|
77
|
+
const postPath = path.join(process.cwd(), 'posts', `${params.slug}.mdx`);
|
|
78
|
+
const source = fs.readFileSync(postPath, 'utf-8');
|
|
79
|
+
|
|
80
|
+
// Parse frontmatter
|
|
81
|
+
const { data: frontmatter, content } = matter(source);
|
|
82
|
+
|
|
83
|
+
// Serialize MDX
|
|
84
|
+
const mdxSource = await serialize(content);
|
|
85
|
+
|
|
86
|
+
return {
|
|
87
|
+
props: {
|
|
88
|
+
source: mdxSource,
|
|
89
|
+
frontmatter
|
|
90
|
+
}
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
export default function Post({ source, frontmatter }: PostProps) {
|
|
95
|
+
return (
|
|
96
|
+
<article>
|
|
97
|
+
<h1>{frontmatter.title}</h1>
|
|
98
|
+
<MDXRemote {...source} />
|
|
99
|
+
</article>
|
|
100
|
+
);
|
|
101
|
+
}
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
## Rich Text Editor
|
|
105
|
+
|
|
106
|
+
```typescript
|
|
107
|
+
import { EditorState, convertToRaw, convertFromRaw } from 'draft-js';
|
|
108
|
+
import 'draft-js/dist/Draft.css';
|
|
109
|
+
|
|
110
|
+
function RichTextEditor({ content, onChange }: any) {
|
|
111
|
+
const [editorState, setEditorState] = useState(() => {
|
|
112
|
+
if (content) {
|
|
113
|
+
const contentState = convertFromRaw(content);
|
|
114
|
+
return EditorState.createWithContent(contentState);
|
|
115
|
+
}
|
|
116
|
+
return EditorState.createEmpty();
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
const handleChange = (state: EditorState) => {
|
|
120
|
+
setEditorState(state);
|
|
121
|
+
|
|
122
|
+
// Serialize to JSON
|
|
123
|
+
const contentState = state.getCurrentContent();
|
|
124
|
+
const raw = convertToRaw(contentState);
|
|
125
|
+
onChange(raw);
|
|
126
|
+
};
|
|
127
|
+
|
|
128
|
+
return (
|
|
129
|
+
<Editor
|
|
130
|
+
editorState={editorState}
|
|
131
|
+
onChange={handleChange}
|
|
132
|
+
/>
|
|
133
|
+
);
|
|
134
|
+
}
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
## Blog Platform Features
|
|
138
|
+
|
|
139
|
+
```typescript
|
|
140
|
+
// Full-text search
|
|
141
|
+
const SearchPosts = async (query: string) => {
|
|
142
|
+
return await db.posts.find({
|
|
143
|
+
$or: [
|
|
144
|
+
{ title: { $regex: query, $options: 'i' } },
|
|
145
|
+
{ content: { $regex: query, $options: 'i' } }
|
|
146
|
+
]
|
|
147
|
+
});
|
|
148
|
+
};
|
|
149
|
+
|
|
150
|
+
// Category filtering
|
|
151
|
+
const PostsByCategory = async (category: string) => {
|
|
152
|
+
return await db.posts.find({ category });
|
|
153
|
+
};
|
|
154
|
+
|
|
155
|
+
// Pagination
|
|
156
|
+
const getPaginatedPosts = async (page: number, pageSize: number) => {
|
|
157
|
+
const skip = (page - 1) * pageSize;
|
|
158
|
+
return await db.posts
|
|
159
|
+
.find()
|
|
160
|
+
.skip(skip)
|
|
161
|
+
.limit(pageSize)
|
|
162
|
+
.sort({ publishedAt: -1 });
|
|
163
|
+
};
|
|
164
|
+
|
|
165
|
+
// Comments
|
|
166
|
+
interface Comment {
|
|
167
|
+
id: string;
|
|
168
|
+
postId: string;
|
|
169
|
+
userId: string;
|
|
170
|
+
content: string;
|
|
171
|
+
createdAt: Date;
|
|
172
|
+
parentId?: string; // For nested replies
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
const addComment = async (postId: string, userId: string, content: string) => {
|
|
176
|
+
return await db.comments.create({
|
|
177
|
+
postId,
|
|
178
|
+
userId,
|
|
179
|
+
content,
|
|
180
|
+
createdAt: new Date()
|
|
181
|
+
});
|
|
182
|
+
};
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
## Best Practices
|
|
186
|
+
|
|
187
|
+
✅ **Markdown for content** - Version control friendly
|
|
188
|
+
✅ **Caching** - Cache rendered content
|
|
189
|
+
✅ **Search** - Full-text indexing
|
|
190
|
+
✅ **Comments moderation** - Review before publishing
|
|
191
|
+
✅ **Media storage** - Use CDN for images/videos
|
|
192
|
+
|
|
193
|
+
## Resources
|
|
194
|
+
|
|
195
|
+
- [Strapi Documentation](https://docs.strapi.io/)
|
|
196
|
+
- [Contentful CMS](https://www.contentful.com/)
|
|
197
|
+
- [Next.js MDX](https://nextjs.org/docs/advanced-features/using-mdx)
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# Production-Ready Skill Implementation
|
|
2
|
+
|
|
3
|
+
## Setup & Installation
|
|
4
|
+
|
|
5
|
+
Detailed installation and configuration steps for the technology.
|
|
6
|
+
|
|
7
|
+
## Core Concepts
|
|
8
|
+
|
|
9
|
+
Fundamental patterns and approaches.
|
|
10
|
+
|
|
11
|
+
## Implementation Examples
|
|
12
|
+
|
|
13
|
+
```typescript
|
|
14
|
+
// Real production code examples
|
|
15
|
+
// with error handling and best practices
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## Advanced Patterns
|
|
19
|
+
|
|
20
|
+
Complex scenarios and optimization techniques.
|
|
21
|
+
|
|
22
|
+
## Performance Optimization
|
|
23
|
+
|
|
24
|
+
Tips for maximizing efficiency and speed.
|
|
25
|
+
|
|
26
|
+
## Security Considerations
|
|
27
|
+
|
|
28
|
+
Security best practices specific to this technology.
|
|
29
|
+
|
|
30
|
+
## Testing
|
|
31
|
+
|
|
32
|
+
How to properly test this feature.
|
|
33
|
+
|
|
34
|
+
## Monitoring & Debugging
|
|
35
|
+
|
|
36
|
+
Tools and techniques for production support.
|
|
37
|
+
|
|
38
|
+
## Best Practices
|
|
39
|
+
|
|
40
|
+
✅ Key recommendations
|
|
41
|
+
✅ Common pitfalls to avoid
|
|
42
|
+
✅ Performance considerations
|
|
43
|
+
✅ Security measures
|
|
44
|
+
✅ Production readiness
|
|
45
|
+
|
|
46
|
+
## Resources
|
|
47
|
+
|
|
48
|
+
- Official documentation
|
|
49
|
+
- Community guides
|
|
50
|
+
- Performance benchmarks
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
# CSV & Excel Processing
|
|
2
|
+
|
|
3
|
+
Reading, writing, and manipulating spreadsheet files.
|
|
4
|
+
|
|
5
|
+
## CSV Handling
|
|
6
|
+
|
|
7
|
+
```typescript
|
|
8
|
+
import { parse } from 'csv-parse';
|
|
9
|
+
import { stringify } from 'csv-stringify';
|
|
10
|
+
import fs from 'fs';
|
|
11
|
+
|
|
12
|
+
// Read CSV
|
|
13
|
+
const parser = fs.createReadStream('data.csv')
|
|
14
|
+
.pipe(parse({
|
|
15
|
+
columns: true,
|
|
16
|
+
skip_empty_lines: true,
|
|
17
|
+
trim: true
|
|
18
|
+
}));
|
|
19
|
+
|
|
20
|
+
const records: any[] = [];
|
|
21
|
+
for await (const record of parser) {
|
|
22
|
+
records.push(record);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
console.log(records);
|
|
26
|
+
|
|
27
|
+
// Write CSV
|
|
28
|
+
const output = fs.createWriteStream('output.csv');
|
|
29
|
+
const stringifier = stringify({
|
|
30
|
+
columns: ['id', 'name', 'email'],
|
|
31
|
+
header: true
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
stringifier.pipe(output);
|
|
35
|
+
|
|
36
|
+
records.forEach(record => {
|
|
37
|
+
stringifier.write({
|
|
38
|
+
id: record.id,
|
|
39
|
+
name: record.name,
|
|
40
|
+
email: record.email
|
|
41
|
+
});
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
stringifier.end();
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
## Excel Files (XLSX)
|
|
48
|
+
|
|
49
|
+
```typescript
|
|
50
|
+
import ExcelJS from 'exceljs';
|
|
51
|
+
|
|
52
|
+
// Read Excel
|
|
53
|
+
const workbook = new ExcelJS.Workbook();
|
|
54
|
+
await workbook.xlsx.readFile('data.xlsx');
|
|
55
|
+
|
|
56
|
+
const worksheet = workbook.getWorksheet(1);
|
|
57
|
+
const rows: any[] = [];
|
|
58
|
+
|
|
59
|
+
worksheet.eachRow((row, rowNumber) => {
|
|
60
|
+
if (rowNumber > 1) { // Skip header
|
|
61
|
+
rows.push({
|
|
62
|
+
id: row.getCell(1).value,
|
|
63
|
+
name: row.getCell(2).value,
|
|
64
|
+
email: row.getCell(3).value
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
// Write Excel
|
|
70
|
+
const newWorkbook = new ExcelJS.Workbook();
|
|
71
|
+
const newWorksheet = newWorkbook.addWorksheet('Data');
|
|
72
|
+
|
|
73
|
+
// Add headers
|
|
74
|
+
newWorksheet.columns = [
|
|
75
|
+
{ header: 'ID', key: 'id', width: 10 },
|
|
76
|
+
{ header: 'Name', key: 'name', width: 30 },
|
|
77
|
+
{ header: 'Email', key: 'email', width: 40 }
|
|
78
|
+
];
|
|
79
|
+
|
|
80
|
+
// Add data
|
|
81
|
+
rows.forEach(row => {
|
|
82
|
+
newWorksheet.addRow(row);
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
// Style
|
|
86
|
+
newWorksheet.getRow(1).font = { bold: true };
|
|
87
|
+
newWorksheet.getRow(1).fill = {
|
|
88
|
+
type: 'pattern',
|
|
89
|
+
pattern: 'solid',
|
|
90
|
+
fgColor: { argb: 'FFD3D3D3' }
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
await newWorkbook.xlsx.writeFile('output.xlsx');
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
## Data Transformation
|
|
97
|
+
|
|
98
|
+
```typescript
|
|
99
|
+
// Pipeline for data processing
|
|
100
|
+
async function processImport(filePath: string) {
|
|
101
|
+
const records = await readCSV(filePath);
|
|
102
|
+
|
|
103
|
+
// Transform
|
|
104
|
+
const transformed = records
|
|
105
|
+
.map(record => ({
|
|
106
|
+
...record,
|
|
107
|
+
email: record.email.toLowerCase().trim(),
|
|
108
|
+
name: record.name.toUpperCase(),
|
|
109
|
+
createdAt: new Date()
|
|
110
|
+
}))
|
|
111
|
+
.filter(record => record.email.includes('@'))
|
|
112
|
+
.filter((record, index, arr) =>
|
|
113
|
+
arr.findIndex(r => r.email === record.email) === index
|
|
114
|
+
); // Deduplicate
|
|
115
|
+
|
|
116
|
+
// Validate
|
|
117
|
+
const validated = transformed.filter(record => {
|
|
118
|
+
const errors: string[] = [];
|
|
119
|
+
|
|
120
|
+
if (!record.email.match(/^[^\s@]+@[^\s@]+\.[^\s@]+$/)) {
|
|
121
|
+
errors.push('Invalid email');
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
if (record.name.length < 2) {
|
|
125
|
+
errors.push('Name too short');
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
if (errors.length > 0) {
|
|
129
|
+
console.warn(`Row invalid: ${errors.join(', ')}`);
|
|
130
|
+
return false;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
return true;
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
// Store in database
|
|
137
|
+
await db.users.createMany(validated);
|
|
138
|
+
|
|
139
|
+
return {
|
|
140
|
+
total: records.length,
|
|
141
|
+
valid: validated.length,
|
|
142
|
+
invalid: records.length - validated.length
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
## Streaming Large Files
|
|
148
|
+
|
|
149
|
+
```typescript
|
|
150
|
+
import { createReadStream } from 'fs';
|
|
151
|
+
import { parse } from 'csv-parse';
|
|
152
|
+
|
|
153
|
+
// Stream processing for large files
|
|
154
|
+
async function processLargeCSV(filePath: string) {
|
|
155
|
+
const stream = createReadStream(filePath)
|
|
156
|
+
.pipe(parse({ columns: true, batchSize: 1000 }));
|
|
157
|
+
|
|
158
|
+
for await (const records of stream) {
|
|
159
|
+
// Process batch of 1000 records
|
|
160
|
+
await db.users.createMany(records);
|
|
161
|
+
console.log(`Processed ${records.length} records`);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
## Excel with Formulas
|
|
167
|
+
|
|
168
|
+
```typescript
|
|
169
|
+
import ExcelJS from 'exceljs';
|
|
170
|
+
|
|
171
|
+
const workbook = new ExcelJS.Workbook();
|
|
172
|
+
const worksheet = workbook.addWorksheet('Summary');
|
|
173
|
+
|
|
174
|
+
// Data
|
|
175
|
+
worksheet.columns = [
|
|
176
|
+
{ header: 'Item', key: 'item' },
|
|
177
|
+
{ header: 'Price', key: 'price' },
|
|
178
|
+
{ header: 'Quantity', key: 'quantity' },
|
|
179
|
+
{ header: 'Total', key: 'total' }
|
|
180
|
+
];
|
|
181
|
+
|
|
182
|
+
worksheet.addRows([
|
|
183
|
+
{ item: 'Widget', price: 10, quantity: 5, total: '=B2*C2' },
|
|
184
|
+
{ item: 'Gadget', price: 20, quantity: 3, total: '=B3*C3' }
|
|
185
|
+
]);
|
|
186
|
+
|
|
187
|
+
// Add summary row
|
|
188
|
+
worksheet.addRow({
|
|
189
|
+
item: 'Total',
|
|
190
|
+
price: null,
|
|
191
|
+
quantity: '=SUM(C2:C3)',
|
|
192
|
+
total: '=SUM(D2:D3)'
|
|
193
|
+
});
|
|
194
|
+
|
|
195
|
+
await workbook.xlsx.writeFile('report.xlsx');
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
## Best Practices
|
|
199
|
+
|
|
200
|
+
✅ **Stream large files** - Avoid loading entire file in memory
|
|
201
|
+
✅ **Validate data** - Check before storing
|
|
202
|
+
✅ **Batch operations** - Process in chunks
|
|
203
|
+
✅ **Error handling** - Log invalid rows
|
|
204
|
+
✅ **Consistent format** - Normalize data during import
|
|
205
|
+
|
|
206
|
+
## Resources
|
|
207
|
+
|
|
208
|
+
- [csv-parse Documentation](https://csv.js.org/parse/)
|
|
209
|
+
- [ExcelJS](https://github.com/exceljs/exceljs)
|
|
210
|
+
- [SheetJS](https://sheetjs.com/)
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
# Database Query Optimization
|
|
2
|
+
|
|
3
|
+
Techniques for improving database performance.
|
|
4
|
+
|
|
5
|
+
## Indexes
|
|
6
|
+
|
|
7
|
+
```sql
|
|
8
|
+
-- Create indexes on frequently queried columns
|
|
9
|
+
CREATE INDEX idx_users_email ON users(email);
|
|
10
|
+
CREATE INDEX idx_posts_user_id ON posts(user_id);
|
|
11
|
+
|
|
12
|
+
-- Composite index for multi-column queries
|
|
13
|
+
CREATE INDEX idx_orders_user_date ON orders(user_id, created_at DESC);
|
|
14
|
+
|
|
15
|
+
-- Full-text index
|
|
16
|
+
CREATE FULLTEXT INDEX idx_articles_content ON articles(title, content);
|
|
17
|
+
|
|
18
|
+
-- Check index usage
|
|
19
|
+
EXPLAIN ANALYZE
|
|
20
|
+
SELECT * FROM users WHERE email = 'user@example.com';
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## Query Analysis
|
|
24
|
+
|
|
25
|
+
```typescript
|
|
26
|
+
// Analyze slow queries
|
|
27
|
+
import { db } from './db';
|
|
28
|
+
|
|
29
|
+
// Enable query logging
|
|
30
|
+
db.logger.setLogLevel('query');
|
|
31
|
+
|
|
32
|
+
// Use explain to see execution plan
|
|
33
|
+
const plan = await db.connection.explain(`
|
|
34
|
+
SELECT u.*, COUNT(p.id) as post_count
|
|
35
|
+
FROM users u
|
|
36
|
+
LEFT JOIN posts p ON u.id = p.user_id
|
|
37
|
+
WHERE u.status = 'active'
|
|
38
|
+
GROUP BY u.id
|
|
39
|
+
`);
|
|
40
|
+
|
|
41
|
+
console.log('Query plan:', plan);
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## N+1 Problem
|
|
45
|
+
|
|
46
|
+
```typescript
|
|
47
|
+
// Bad: N+1 queries
|
|
48
|
+
const users = await db.users.find(); // 1 query
|
|
49
|
+
for (const user of users) {
|
|
50
|
+
user.posts = await db.posts.find({ userId: user.id }); // N queries
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// Good: Single query with join
|
|
54
|
+
const users = await db.users.find({
|
|
55
|
+
include: { posts: true }
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
// Good: Use pagination
|
|
59
|
+
const users = await db.users.find({
|
|
60
|
+
include: {
|
|
61
|
+
posts: {
|
|
62
|
+
select: { id: true, title: true }, // Only needed fields
|
|
63
|
+
take: 5 // Limit related records
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
## Connection Pooling
|
|
70
|
+
|
|
71
|
+
```typescript
|
|
72
|
+
import { Pool } from 'pg';
|
|
73
|
+
|
|
74
|
+
const pool = new Pool({
|
|
75
|
+
max: 20, // Maximum connections
|
|
76
|
+
min: 5, // Minimum connections
|
|
77
|
+
idleTimeoutMillis: 30000,
|
|
78
|
+
connectionTimeoutMillis: 2000
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
// Use pool for queries
|
|
82
|
+
const result = await pool.query('SELECT * FROM users WHERE id = $1', [userId]);
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
## Denormalization
|
|
86
|
+
|
|
87
|
+
```typescript
|
|
88
|
+
// Normalized schema (slow queries)
|
|
89
|
+
users (id, email, name)
|
|
90
|
+
posts (id, user_id, content)
|
|
91
|
+
comments (id, post_id, user_id, text)
|
|
92
|
+
|
|
93
|
+
// Query requires 3 joins
|
|
94
|
+
SELECT u.name, COUNT(c.id) as comment_count
|
|
95
|
+
FROM users u
|
|
96
|
+
JOIN posts p ON u.id = p.user_id
|
|
97
|
+
LEFT JOIN comments c ON p.id = c.post_id
|
|
98
|
+
GROUP BY u.id
|
|
99
|
+
|
|
100
|
+
// Denormalized schema (faster queries)
|
|
101
|
+
posts (id, user_id, user_name, comment_count)
|
|
102
|
+
|
|
103
|
+
// Query is direct
|
|
104
|
+
SELECT user_name, comment_count FROM posts
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
## Query Caching
|
|
108
|
+
|
|
109
|
+
```typescript
|
|
110
|
+
import { redis } from './redis';
|
|
111
|
+
|
|
112
|
+
async function getUserWithCache(userId: string) {
|
|
113
|
+
const cacheKey = `user:${userId}`;
|
|
114
|
+
|
|
115
|
+
// Check cache
|
|
116
|
+
let user = await redis.get(cacheKey);
|
|
117
|
+
if (user) return JSON.parse(user);
|
|
118
|
+
|
|
119
|
+
// Query database
|
|
120
|
+
user = await db.users.findById(userId);
|
|
121
|
+
|
|
122
|
+
// Store in cache (1 hour TTL)
|
|
123
|
+
await redis.setex(cacheKey, 3600, JSON.stringify(user));
|
|
124
|
+
|
|
125
|
+
return user;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
// Invalidate on update
|
|
129
|
+
async function updateUser(userId: string, data: any) {
|
|
130
|
+
const user = await db.users.update(userId, data);
|
|
131
|
+
|
|
132
|
+
// Clear cache
|
|
133
|
+
await redis.del(`user:${userId}`);
|
|
134
|
+
|
|
135
|
+
return user;
|
|
136
|
+
}
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
## Batch Operations
|
|
140
|
+
|
|
141
|
+
```typescript
|
|
142
|
+
// Bad: Individual inserts
|
|
143
|
+
for (const item of items) {
|
|
144
|
+
await db.items.create(item); // N queries
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// Good: Batch insert
|
|
148
|
+
await db.items.createMany(items); // 1 query
|
|
149
|
+
|
|
150
|
+
// Good: Batch update
|
|
151
|
+
await db.items.updateMany(
|
|
152
|
+
{ status: 'pending' },
|
|
153
|
+
{ status: 'active' }
|
|
154
|
+
);
|
|
155
|
+
|
|
156
|
+
// Good: Upsert
|
|
157
|
+
await db.items.upsertMany(
|
|
158
|
+
items,
|
|
159
|
+
{ upsertFields: ['externalId'] }
|
|
160
|
+
);
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
## Partitioning & Sharding
|
|
164
|
+
|
|
165
|
+
```sql
|
|
166
|
+
-- Partition by date (time-series data)
|
|
167
|
+
CREATE TABLE logs (
|
|
168
|
+
id INT,
|
|
169
|
+
timestamp TIMESTAMP,
|
|
170
|
+
message TEXT
|
|
171
|
+
) PARTITION BY RANGE (YEAR(timestamp)) (
|
|
172
|
+
PARTITION p2023 VALUES LESS THAN (2024),
|
|
173
|
+
PARTITION p2024 VALUES LESS THAN (2025),
|
|
174
|
+
PARTITION p_future VALUES LESS THAN MAXVALUE
|
|
175
|
+
);
|
|
176
|
+
|
|
177
|
+
-- Shard by user_id (horizontal scaling)
|
|
178
|
+
-- Each shard holds data for subset of users
|
|
179
|
+
-- Shard 1: users 1-1M
|
|
180
|
+
-- Shard 2: users 1M-2M
|
|
181
|
+
-- etc.
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
## Best Practices
|
|
185
|
+
|
|
186
|
+
✅ **Index strategically** - Only on frequently queried columns
|
|
187
|
+
✅ **Avoid N+1** - Eager load related data
|
|
188
|
+
✅ **Monitor slow queries** - Log and analyze slow operations
|
|
189
|
+
✅ **Use pagination** - Don't fetch all rows
|
|
190
|
+
✅ **Denormalize carefully** - Trade consistency for performance
|
|
191
|
+
|
|
192
|
+
## Resources
|
|
193
|
+
|
|
194
|
+
- [PostgreSQL Query Performance](https://www.postgresql.org/docs/current/performance.html)
|
|
195
|
+
- [MySQL Optimization](https://dev.mysql.com/doc/refman/8.0/en/optimization.html)
|
|
196
|
+
- [Database Design for Performance](https://www.sqlshack.com/query-optimization-performance-tuning/)
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
# Database Transactions
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
Transactions ensure ACID guarantees — multiple operations succeed together or roll back entirely.
|
|
5
|
+
|
|
6
|
+
## Prisma Transactions
|
|
7
|
+
|
|
8
|
+
```typescript
|
|
9
|
+
// Sequential transaction (use result of one in the next)
|
|
10
|
+
async function transferFunds(fromId: string, toId: string, amount: number) {
|
|
11
|
+
return prisma.$transaction(async (tx) => {
|
|
12
|
+
const from = await tx.account.findUniqueOrThrow({ where: { id: fromId } });
|
|
13
|
+
if (from.balance < amount) throw new Error('Insufficient funds');
|
|
14
|
+
|
|
15
|
+
await tx.account.update({ where: { id: fromId }, data: { balance: { decrement: amount } } });
|
|
16
|
+
await tx.account.update({ where: { id: toId }, data: { balance: { increment: amount } } });
|
|
17
|
+
await tx.transaction.create({ data: { fromId, toId, amount } });
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
// Batch transaction
|
|
22
|
+
const [user, profile] = await prisma.$transaction([
|
|
23
|
+
prisma.user.create({ data: { email, name } }),
|
|
24
|
+
prisma.profile.create({ data: { bio, userId: id } }),
|
|
25
|
+
]);
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## Raw SQL Transactions
|
|
29
|
+
|
|
30
|
+
```typescript
|
|
31
|
+
import { Pool } from 'pg';
|
|
32
|
+
const pool = new Pool({ connectionString: process.env.DATABASE_URL });
|
|
33
|
+
|
|
34
|
+
async function atomicOperation() {
|
|
35
|
+
const client = await pool.connect();
|
|
36
|
+
try {
|
|
37
|
+
await client.query('BEGIN');
|
|
38
|
+
await client.query('INSERT INTO orders (user_id, total) VALUES ($1, $2)', [userId, total]);
|
|
39
|
+
await client.query('UPDATE inventory SET qty = qty - $1 WHERE id = $2', [qty, productId]);
|
|
40
|
+
await client.query('COMMIT');
|
|
41
|
+
} catch (err) {
|
|
42
|
+
await client.query('ROLLBACK');
|
|
43
|
+
throw err;
|
|
44
|
+
} finally {
|
|
45
|
+
client.release();
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
## Optimistic Locking
|
|
51
|
+
|
|
52
|
+
```typescript
|
|
53
|
+
// Use version field to detect concurrent updates
|
|
54
|
+
const updated = await prisma.post.updateMany({
|
|
55
|
+
where: { id: post.id, version: post.version },
|
|
56
|
+
data: { title: newTitle, version: { increment: 1 } }
|
|
57
|
+
});
|
|
58
|
+
if (updated.count === 0) throw new Error('Concurrent update — please retry');
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
## Best Practices
|
|
62
|
+
- Keep transactions short — long ones hold locks and block others
|
|
63
|
+
- Never do HTTP calls inside a transaction
|
|
64
|
+
- Use optimistic locking for high-contention data
|
|
65
|
+
- Set transaction timeout: `SET statement_timeout = '5s'`
|
|
66
|
+
|
|
67
|
+
## Resources
|
|
68
|
+
- [Prisma transactions](https://www.prisma.io/docs/concepts/components/prisma-client/transactions)
|