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,89 @@
|
|
|
1
|
+
# Apache Cassandra
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
Cassandra is a distributed NoSQL database designed for high write throughput, linear scalability, and no single point of failure.
|
|
5
|
+
|
|
6
|
+
## Setup with cassandra-driver
|
|
7
|
+
|
|
8
|
+
```bash
|
|
9
|
+
npm install cassandra-driver
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
```typescript
|
|
13
|
+
import { Client, auth } from 'cassandra-driver';
|
|
14
|
+
|
|
15
|
+
const client = new Client({
|
|
16
|
+
contactPoints: [process.env.CASSANDRA_HOST!],
|
|
17
|
+
localDataCenter: 'datacenter1',
|
|
18
|
+
credentials: {
|
|
19
|
+
username: process.env.CASSANDRA_USER!,
|
|
20
|
+
password: process.env.CASSANDRA_PASSWORD!,
|
|
21
|
+
},
|
|
22
|
+
keyspace: 'myapp',
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
await client.connect();
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## Schema (CQL)
|
|
29
|
+
|
|
30
|
+
```sql
|
|
31
|
+
CREATE KEYSPACE IF NOT EXISTS myapp
|
|
32
|
+
WITH replication = {'class': 'SimpleStrategy', 'replication_factor': 3};
|
|
33
|
+
|
|
34
|
+
USE myapp;
|
|
35
|
+
|
|
36
|
+
-- Time-series events table (common pattern)
|
|
37
|
+
CREATE TABLE IF NOT EXISTS user_events (
|
|
38
|
+
user_id UUID,
|
|
39
|
+
event_time TIMESTAMP,
|
|
40
|
+
event_type TEXT,
|
|
41
|
+
data TEXT,
|
|
42
|
+
PRIMARY KEY (user_id, event_time)
|
|
43
|
+
) WITH CLUSTERING ORDER BY (event_time DESC);
|
|
44
|
+
|
|
45
|
+
-- Wide row for user timeline
|
|
46
|
+
CREATE TABLE IF NOT EXISTS user_timeline (
|
|
47
|
+
user_id UUID,
|
|
48
|
+
post_id TIMEUUID,
|
|
49
|
+
content TEXT,
|
|
50
|
+
PRIMARY KEY (user_id, post_id)
|
|
51
|
+
) WITH CLUSTERING ORDER BY (post_id DESC);
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## CRUD Operations
|
|
55
|
+
|
|
56
|
+
```typescript
|
|
57
|
+
// Insert
|
|
58
|
+
await client.execute(
|
|
59
|
+
'INSERT INTO user_events (user_id, event_time, event_type, data) VALUES (?, ?, ?, ?)',
|
|
60
|
+
[userId, new Date(), 'login', JSON.stringify({ ip: '127.0.0.1' })],
|
|
61
|
+
{ prepare: true }
|
|
62
|
+
);
|
|
63
|
+
|
|
64
|
+
// Query
|
|
65
|
+
const result = await client.execute(
|
|
66
|
+
'SELECT * FROM user_events WHERE user_id = ? ORDER BY event_time DESC LIMIT 20',
|
|
67
|
+
[userId],
|
|
68
|
+
{ prepare: true }
|
|
69
|
+
);
|
|
70
|
+
const events = result.rows;
|
|
71
|
+
|
|
72
|
+
// Batch write
|
|
73
|
+
const batch = [
|
|
74
|
+
{ query: 'INSERT INTO user_events ...', params: [...] },
|
|
75
|
+
{ query: 'UPDATE user_stats ...', params: [...] },
|
|
76
|
+
];
|
|
77
|
+
await client.batch(batch, { prepare: true });
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
## Best Practices
|
|
81
|
+
- Design tables for query patterns — denormalize heavily
|
|
82
|
+
- Use `prepare: true` for all parameterized queries
|
|
83
|
+
- Partition key determines which node holds data — choose for even distribution
|
|
84
|
+
- Avoid `ALLOW FILTERING` — it causes full table scans
|
|
85
|
+
- Use TTL for time-series or expiring data: `INSERT ... USING TTL 86400`
|
|
86
|
+
|
|
87
|
+
## Resources
|
|
88
|
+
- [cassandra-driver docs](https://docs.datastax.com/en/developer/nodejs-driver/)
|
|
89
|
+
- [Cassandra data modeling](https://cassandra.apache.org/doc/latest/cassandra/data_modeling/)
|
|
@@ -0,0 +1,363 @@
|
|
|
1
|
+
# Drizzle ORM
|
|
2
|
+
|
|
3
|
+
Lightweight TypeScript-first ORM with native async/await support and zero dependencies.
|
|
4
|
+
|
|
5
|
+
## Setup
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install drizzle-orm drizzle-kit
|
|
9
|
+
npm install pg # for PostgreSQL
|
|
10
|
+
npm install -D @types/pg
|
|
11
|
+
|
|
12
|
+
# Initialize schema
|
|
13
|
+
npx drizzle-kit init
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
## Schema Definition
|
|
17
|
+
|
|
18
|
+
```typescript
|
|
19
|
+
import { pgTable, serial, text, varchar, boolean, timestamp, integer, foreignKey } from 'drizzle-orm/pg-core';
|
|
20
|
+
import { relations } from 'drizzle-orm';
|
|
21
|
+
|
|
22
|
+
// Users table
|
|
23
|
+
export const users = pgTable(
|
|
24
|
+
'users',
|
|
25
|
+
{
|
|
26
|
+
id: serial('id').primaryKey(),
|
|
27
|
+
email: varchar('email', { length: 255 }).unique().notNull(),
|
|
28
|
+
name: varchar('name', { length: 255 }).notNull(),
|
|
29
|
+
password: varchar('password', { length: 255 }).notNull(),
|
|
30
|
+
createdAt: timestamp('created_at').defaultNow(),
|
|
31
|
+
updatedAt: timestamp('updated_at').defaultNow()
|
|
32
|
+
},
|
|
33
|
+
(table) => ({
|
|
34
|
+
emailIdx: uniqueIndex('email_idx').on(table.email)
|
|
35
|
+
})
|
|
36
|
+
);
|
|
37
|
+
|
|
38
|
+
// Posts table
|
|
39
|
+
export const posts = pgTable(
|
|
40
|
+
'posts',
|
|
41
|
+
{
|
|
42
|
+
id: serial('id').primaryKey(),
|
|
43
|
+
title: varchar('title', { length: 255 }).notNull(),
|
|
44
|
+
content: text('content'),
|
|
45
|
+
published: boolean('published').default(false),
|
|
46
|
+
authorId: integer('author_id')
|
|
47
|
+
.notNull()
|
|
48
|
+
.references(() => users.id, { onDelete: 'cascade' }),
|
|
49
|
+
createdAt: timestamp('created_at').defaultNow(),
|
|
50
|
+
updatedAt: timestamp('updated_at').defaultNow()
|
|
51
|
+
},
|
|
52
|
+
(table) => ({
|
|
53
|
+
authorIdx: index('author_idx').on(table.authorId)
|
|
54
|
+
})
|
|
55
|
+
);
|
|
56
|
+
|
|
57
|
+
// Relationships
|
|
58
|
+
export const usersRelations = relations(users, ({ many }) => ({
|
|
59
|
+
posts: many(posts)
|
|
60
|
+
}));
|
|
61
|
+
|
|
62
|
+
export const postsRelations = relations(posts, ({ one }) => ({
|
|
63
|
+
author: one(users, {
|
|
64
|
+
fields: [posts.authorId],
|
|
65
|
+
references: [users.id]
|
|
66
|
+
})
|
|
67
|
+
}));
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
## Migrations
|
|
71
|
+
|
|
72
|
+
```bash
|
|
73
|
+
# Generate migration
|
|
74
|
+
npx drizzle-kit generate:pg
|
|
75
|
+
|
|
76
|
+
# Push schema to database
|
|
77
|
+
npx drizzle-kit push:pg
|
|
78
|
+
|
|
79
|
+
# Create migration manually
|
|
80
|
+
npx drizzle-kit up:pg
|
|
81
|
+
|
|
82
|
+
# Drop schema
|
|
83
|
+
npx drizzle-kit drop
|
|
84
|
+
|
|
85
|
+
# View migration status
|
|
86
|
+
npx drizzle-kit status:pg
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
## Database Connection
|
|
90
|
+
|
|
91
|
+
```typescript
|
|
92
|
+
import { drizzle } from 'drizzle-orm/node-postgres';
|
|
93
|
+
import { Pool } from 'pg';
|
|
94
|
+
|
|
95
|
+
// Create connection pool
|
|
96
|
+
const pool = new Pool({
|
|
97
|
+
host: 'localhost',
|
|
98
|
+
port: 5432,
|
|
99
|
+
user: 'user',
|
|
100
|
+
password: 'password',
|
|
101
|
+
database: 'mydb'
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
// Create Drizzle ORM instance
|
|
105
|
+
export const db = drizzle(pool);
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
## Basic Queries
|
|
109
|
+
|
|
110
|
+
```typescript
|
|
111
|
+
import { db } from './db';
|
|
112
|
+
import { users, posts } from './schema';
|
|
113
|
+
import { eq } from 'drizzle-orm';
|
|
114
|
+
|
|
115
|
+
// Create
|
|
116
|
+
const newUser = await db.insert(users).values({
|
|
117
|
+
email: 'john@example.com',
|
|
118
|
+
name: 'John Doe',
|
|
119
|
+
password: 'hashed_password'
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
// Read - single
|
|
123
|
+
const user = await db.select().from(users).where(eq(users.id, 1));
|
|
124
|
+
|
|
125
|
+
// Read - all
|
|
126
|
+
const allUsers = await db.select().from(users);
|
|
127
|
+
|
|
128
|
+
// Read - with condition
|
|
129
|
+
const activeUsers = await db
|
|
130
|
+
.select()
|
|
131
|
+
.from(users)
|
|
132
|
+
.where(eq(users.status, 'active'));
|
|
133
|
+
|
|
134
|
+
// Update
|
|
135
|
+
const updated = await db
|
|
136
|
+
.update(users)
|
|
137
|
+
.set({ name: 'Jane Doe' })
|
|
138
|
+
.where(eq(users.id, 1));
|
|
139
|
+
|
|
140
|
+
// Delete
|
|
141
|
+
await db.delete(users).where(eq(users.id, 1));
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
## Relationships and Joins
|
|
145
|
+
|
|
146
|
+
```typescript
|
|
147
|
+
// Get user with all posts
|
|
148
|
+
const userWithPosts = await db.query.users.findFirst({
|
|
149
|
+
where: eq(users.id, 1),
|
|
150
|
+
with: {
|
|
151
|
+
posts: true
|
|
152
|
+
}
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
// Join syntax
|
|
156
|
+
const postsWithAuthors = await db
|
|
157
|
+
.select({
|
|
158
|
+
postId: posts.id,
|
|
159
|
+
title: posts.title,
|
|
160
|
+
authorName: users.name
|
|
161
|
+
})
|
|
162
|
+
.from(posts)
|
|
163
|
+
.leftJoin(users, eq(posts.authorId, users.id));
|
|
164
|
+
|
|
165
|
+
// Multiple joins
|
|
166
|
+
const postsWithComments = await db
|
|
167
|
+
.select()
|
|
168
|
+
.from(posts)
|
|
169
|
+
.innerJoin(users, eq(posts.authorId, users.id))
|
|
170
|
+
.leftJoin(comments, eq(posts.id, comments.postId));
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
## Filtering and Conditions
|
|
174
|
+
|
|
175
|
+
```typescript
|
|
176
|
+
import { and, or, like, gte, lte, inArray } from 'drizzle-orm';
|
|
177
|
+
|
|
178
|
+
// Multiple conditions (AND)
|
|
179
|
+
const posts = await db
|
|
180
|
+
.select()
|
|
181
|
+
.from(posts)
|
|
182
|
+
.where(
|
|
183
|
+
and(
|
|
184
|
+
eq(posts.published, true),
|
|
185
|
+
gte(posts.createdAt, new Date('2024-01-01'))
|
|
186
|
+
)
|
|
187
|
+
);
|
|
188
|
+
|
|
189
|
+
// OR condition
|
|
190
|
+
const results = await db
|
|
191
|
+
.select()
|
|
192
|
+
.from(users)
|
|
193
|
+
.where(
|
|
194
|
+
or(
|
|
195
|
+
eq(users.email, 'john@example.com'),
|
|
196
|
+
eq(users.email, 'jane@example.com')
|
|
197
|
+
)
|
|
198
|
+
);
|
|
199
|
+
|
|
200
|
+
// LIKE search
|
|
201
|
+
const search = await db
|
|
202
|
+
.select()
|
|
203
|
+
.from(users)
|
|
204
|
+
.where(like(users.name, '%John%'));
|
|
205
|
+
|
|
206
|
+
// IN clause
|
|
207
|
+
const specific = await db
|
|
208
|
+
.select()
|
|
209
|
+
.from(posts)
|
|
210
|
+
.where(inArray(posts.authorId, [1, 2, 3]));
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
## Pagination and Ordering
|
|
214
|
+
|
|
215
|
+
```typescript
|
|
216
|
+
// Pagination
|
|
217
|
+
const pageSize = 10;
|
|
218
|
+
const page = 1;
|
|
219
|
+
|
|
220
|
+
const paginated = await db
|
|
221
|
+
.select()
|
|
222
|
+
.from(posts)
|
|
223
|
+
.limit(pageSize)
|
|
224
|
+
.offset((page - 1) * pageSize)
|
|
225
|
+
.orderBy(posts.createdAt);
|
|
226
|
+
|
|
227
|
+
// Get total count
|
|
228
|
+
const total = await db
|
|
229
|
+
.select({ count: countDistinct(posts.id) })
|
|
230
|
+
.from(posts);
|
|
231
|
+
|
|
232
|
+
const totalPages = Math.ceil(total[0].count / pageSize);
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
## Aggregations
|
|
236
|
+
|
|
237
|
+
```typescript
|
|
238
|
+
import { count, sum, avg, max, min } from 'drizzle-orm';
|
|
239
|
+
|
|
240
|
+
// Count
|
|
241
|
+
const postCount = await db
|
|
242
|
+
.select({ value: count() })
|
|
243
|
+
.from(posts);
|
|
244
|
+
|
|
245
|
+
// With grouping
|
|
246
|
+
const postsByAuthor = await db
|
|
247
|
+
.select({
|
|
248
|
+
authorId: posts.authorId,
|
|
249
|
+
count: count(posts.id)
|
|
250
|
+
})
|
|
251
|
+
.from(posts)
|
|
252
|
+
.groupBy(posts.authorId)
|
|
253
|
+
.orderBy(({ count: cnt }) => desc(cnt));
|
|
254
|
+
|
|
255
|
+
// Aggregations
|
|
256
|
+
const stats = await db
|
|
257
|
+
.select({
|
|
258
|
+
totalPosts: count(posts.id),
|
|
259
|
+
avgLength: avg(posts.content),
|
|
260
|
+
maxLength: max(posts.content)
|
|
261
|
+
})
|
|
262
|
+
.from(posts)
|
|
263
|
+
.where(eq(posts.published, true));
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
## Transactions
|
|
267
|
+
|
|
268
|
+
```typescript
|
|
269
|
+
// Atomic transactions
|
|
270
|
+
const result = await db.transaction(async (tx) => {
|
|
271
|
+
const user = await tx.insert(users).values({
|
|
272
|
+
email: 'john@example.com',
|
|
273
|
+
name: 'John',
|
|
274
|
+
password: 'hash'
|
|
275
|
+
});
|
|
276
|
+
|
|
277
|
+
const post = await tx.insert(posts).values({
|
|
278
|
+
title: 'First Post',
|
|
279
|
+
content: 'Content...',
|
|
280
|
+
authorId: user[0].id
|
|
281
|
+
});
|
|
282
|
+
|
|
283
|
+
return { user, post };
|
|
284
|
+
});
|
|
285
|
+
|
|
286
|
+
// Rollback on error
|
|
287
|
+
try {
|
|
288
|
+
await db.transaction(async (tx) => {
|
|
289
|
+
// Operations
|
|
290
|
+
throw new Error('Rollback!');
|
|
291
|
+
});
|
|
292
|
+
} catch (err) {
|
|
293
|
+
console.log('Transaction rolled back');
|
|
294
|
+
}
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
## Parameterized Queries (SQL Injection Prevention)
|
|
298
|
+
|
|
299
|
+
```typescript
|
|
300
|
+
import { sql } from 'drizzle-orm';
|
|
301
|
+
|
|
302
|
+
// Safe parameter usage
|
|
303
|
+
const email = 'john@example.com';
|
|
304
|
+
const user = await db
|
|
305
|
+
.select()
|
|
306
|
+
.from(users)
|
|
307
|
+
.where(sql`${users.email} = ${email}`);
|
|
308
|
+
|
|
309
|
+
// Raw SQL with parameters
|
|
310
|
+
const query = await db.execute(
|
|
311
|
+
sql`SELECT * FROM ${users} WHERE email = ${email}`
|
|
312
|
+
);
|
|
313
|
+
```
|
|
314
|
+
|
|
315
|
+
## Migrations with Version History
|
|
316
|
+
|
|
317
|
+
```bash
|
|
318
|
+
# Show migrations status
|
|
319
|
+
npx drizzle-kit status:pg --dir ./drizzle
|
|
320
|
+
|
|
321
|
+
# Migrate to specific version
|
|
322
|
+
npx drizzle-kit migrate --migrations ./drizzle
|
|
323
|
+
|
|
324
|
+
# View all migrations
|
|
325
|
+
ls drizzle/migrations/
|
|
326
|
+
```
|
|
327
|
+
|
|
328
|
+
## Best Practices
|
|
329
|
+
|
|
330
|
+
✅ **Type safety** - Full TypeScript support with zero-cost abstractions
|
|
331
|
+
✅ **Minimal ORM** - No magic, explicit queries
|
|
332
|
+
✅ **Auto-migrations** - Generate migrations from schema changes
|
|
333
|
+
✅ **Connection pooling** - Reuse connections efficiently
|
|
334
|
+
✅ **Prepared statements** - SQL injection protected by default
|
|
335
|
+
✅ **Query building** - Composable, chainable queries
|
|
336
|
+
✅ **Relations** - Optional eager loading with `with` syntax
|
|
337
|
+
|
|
338
|
+
## Performance Tips
|
|
339
|
+
|
|
340
|
+
- Use `select()` with specific columns to reduce payload
|
|
341
|
+
- Add indexes to frequently filtered columns
|
|
342
|
+
- Use connection pooling in production
|
|
343
|
+
- Batch inserts: `db.insert().values([...])`
|
|
344
|
+
- Monitor slow queries with database logs
|
|
345
|
+
|
|
346
|
+
## When to Use Drizzle
|
|
347
|
+
|
|
348
|
+
✅ Want lightweight, TypeScript-first ORM
|
|
349
|
+
✅ Need explicit SQL control
|
|
350
|
+
✅ PostgreSQL, MySQL, SQLite projects
|
|
351
|
+
✅ Building serverless apps (Vercel, AWS Lambda)
|
|
352
|
+
✅ Prefer generated migrations
|
|
353
|
+
|
|
354
|
+
❌ Need GraphQL-first tooling (use Prisma)
|
|
355
|
+
❌ Complex stored procedures needed
|
|
356
|
+
❌ Learning ORM for the first time
|
|
357
|
+
|
|
358
|
+
## Resources
|
|
359
|
+
|
|
360
|
+
- [Drizzle Documentation](https://orm.drizzle.team/)
|
|
361
|
+
- [Drizzle ORM API](https://orm.drizzle.team/docs/get-started)
|
|
362
|
+
- [Drizzle Kit](https://orm.drizzle.team/kit-docs/overview)
|
|
363
|
+
- [Examples](https://github.com/drizzle-team/drizzle-orm/tree/main/examples)
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
# DynamoDB
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
AWS DynamoDB is a fully managed NoSQL database optimized for high-scale, predictable-latency workloads.
|
|
5
|
+
|
|
6
|
+
## Setup
|
|
7
|
+
|
|
8
|
+
```bash
|
|
9
|
+
npm install @aws-sdk/client-dynamodb @aws-sdk/lib-dynamodb
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
```typescript
|
|
13
|
+
import { DynamoDBClient } from '@aws-sdk/client-dynamodb';
|
|
14
|
+
import { DynamoDBDocumentClient, GetCommand, PutCommand, QueryCommand, UpdateCommand, DeleteCommand } from '@aws-sdk/lib-dynamodb';
|
|
15
|
+
|
|
16
|
+
const client = new DynamoDBClient({ region: process.env.AWS_REGION ?? 'us-east-1' });
|
|
17
|
+
const db = DynamoDBDocumentClient.from(client);
|
|
18
|
+
const TABLE = process.env.DYNAMODB_TABLE!;
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## CRUD Operations
|
|
22
|
+
|
|
23
|
+
```typescript
|
|
24
|
+
// Create
|
|
25
|
+
await db.send(new PutCommand({
|
|
26
|
+
TableName: TABLE,
|
|
27
|
+
Item: { PK: `USER#${user.id}`, SK: `PROFILE#${user.id}`, ...user, createdAt: new Date().toISOString() },
|
|
28
|
+
ConditionExpression: 'attribute_not_exists(PK)',
|
|
29
|
+
}));
|
|
30
|
+
|
|
31
|
+
// Read
|
|
32
|
+
const result = await db.send(new GetCommand({
|
|
33
|
+
TableName: TABLE,
|
|
34
|
+
Key: { PK: `USER#${id}`, SK: `PROFILE#${id}` }
|
|
35
|
+
}));
|
|
36
|
+
const user = result.Item;
|
|
37
|
+
|
|
38
|
+
// Update
|
|
39
|
+
await db.send(new UpdateCommand({
|
|
40
|
+
TableName: TABLE,
|
|
41
|
+
Key: { PK: `USER#${id}`, SK: `PROFILE#${id}` },
|
|
42
|
+
UpdateExpression: 'SET #name = :name, updatedAt = :now',
|
|
43
|
+
ExpressionAttributeNames: { '#name': 'name' },
|
|
44
|
+
ExpressionAttributeValues: { ':name': newName, ':now': new Date().toISOString() }
|
|
45
|
+
}));
|
|
46
|
+
|
|
47
|
+
// Delete
|
|
48
|
+
await db.send(new DeleteCommand({ TableName: TABLE, Key: { PK: `USER#${id}`, SK: `PROFILE#${id}` } }));
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## Query Pattern
|
|
52
|
+
|
|
53
|
+
```typescript
|
|
54
|
+
// Get all orders for a user
|
|
55
|
+
const result = await db.send(new QueryCommand({
|
|
56
|
+
TableName: TABLE,
|
|
57
|
+
KeyConditionExpression: 'PK = :pk AND begins_with(SK, :prefix)',
|
|
58
|
+
ExpressionAttributeValues: { ':pk': `USER#${userId}`, ':prefix': 'ORDER#' },
|
|
59
|
+
ScanIndexForward: false, // newest first
|
|
60
|
+
Limit: 20,
|
|
61
|
+
}));
|
|
62
|
+
const orders = result.Items ?? [];
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
## Single-Table Design
|
|
66
|
+
|
|
67
|
+
```
|
|
68
|
+
PK | SK | Type
|
|
69
|
+
USER#u1 | PROFILE#u1 | User profile
|
|
70
|
+
USER#u1 | ORDER#2024-01#o1 | Order (date-sortable)
|
|
71
|
+
PRODUCT#p1 | METADATA#p1 | Product
|
|
72
|
+
ORDER#o1 | ITEM#1 | Order line item
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
## Best Practices
|
|
76
|
+
- Design for access patterns first — DynamoDB doesn't support ad-hoc queries
|
|
77
|
+
- Use single-table design to minimize RCUs/WCUs
|
|
78
|
+
- Never scan large tables — always query with a partition key
|
|
79
|
+
- Use TTL attribute for automatic expiry (sessions, caches)
|
|
80
|
+
|
|
81
|
+
## Resources
|
|
82
|
+
- [DynamoDB Developer Guide](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/)
|
|
83
|
+
- [The DynamoDB Book](https://www.dynamodbbook.com/)
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
# Elasticsearch
|
|
2
|
+
|
|
3
|
+
Distributed search and analytics engine.
|
|
4
|
+
|
|
5
|
+
## Setup
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @elastic/elasticsearch
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Indexing
|
|
12
|
+
|
|
13
|
+
```typescript
|
|
14
|
+
import { Client } from '@elastic/elasticsearch';
|
|
15
|
+
|
|
16
|
+
const client = new Client({ node: 'http://localhost:9200' });
|
|
17
|
+
|
|
18
|
+
// Create index with mapping
|
|
19
|
+
await client.indices.create({
|
|
20
|
+
index: 'products',
|
|
21
|
+
body: {
|
|
22
|
+
mappings: {
|
|
23
|
+
properties: {
|
|
24
|
+
name: { type: 'text' },
|
|
25
|
+
description: { type: 'text' },
|
|
26
|
+
price: { type: 'float' },
|
|
27
|
+
category: { type: 'keyword' },
|
|
28
|
+
tags: { type: 'keyword' },
|
|
29
|
+
created_at: { type: 'date' }
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
// Index document
|
|
36
|
+
await client.index({
|
|
37
|
+
index: 'products',
|
|
38
|
+
id: '1',
|
|
39
|
+
document: {
|
|
40
|
+
name: 'Laptop',
|
|
41
|
+
description: 'High-performance laptop',
|
|
42
|
+
price: 999.99,
|
|
43
|
+
category: 'electronics',
|
|
44
|
+
tags: ['computer', 'work'],
|
|
45
|
+
created_at: new Date()
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
// Bulk indexing
|
|
50
|
+
await client.bulk({
|
|
51
|
+
operations: documents.flatMap(doc => [
|
|
52
|
+
{ index: { _index: 'products', _id: doc.id } },
|
|
53
|
+
doc
|
|
54
|
+
])
|
|
55
|
+
});
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
## Searching
|
|
59
|
+
|
|
60
|
+
```typescript
|
|
61
|
+
// Simple search
|
|
62
|
+
const results = await client.search({
|
|
63
|
+
index: 'products',
|
|
64
|
+
query: {
|
|
65
|
+
match: { name: 'laptop' }
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
// Complex query
|
|
70
|
+
const results = await client.search({
|
|
71
|
+
index: 'products',
|
|
72
|
+
query: {
|
|
73
|
+
bool: {
|
|
74
|
+
must: [
|
|
75
|
+
{ match: { name: 'laptop' } }
|
|
76
|
+
],
|
|
77
|
+
filter: [
|
|
78
|
+
{ range: { price: { lte: 1000 } } },
|
|
79
|
+
{ term: { category: 'electronics' } }
|
|
80
|
+
]
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
// Aggregations
|
|
86
|
+
const stats = await client.search({
|
|
87
|
+
index: 'products',
|
|
88
|
+
aggs: {
|
|
89
|
+
avg_price: { avg: { field: 'price' } },
|
|
90
|
+
categories: { terms: { field: 'category' } }
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
## Best Practices
|
|
96
|
+
|
|
97
|
+
✅ **Proper mapping** - Define field types
|
|
98
|
+
✅ **Shard allocation** - Balance shards across nodes
|
|
99
|
+
✅ **Indexing strategy** - Time-based indices
|
|
100
|
+
✅ **Query optimization** - Use filters for performance
|
|
101
|
+
✅ **Monitoring** - Track cluster health
|
|
102
|
+
|
|
103
|
+
## Resources
|
|
104
|
+
|
|
105
|
+
- [Elasticsearch Guide](https://www.elastic.co/guide/index.html)
|