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,195 @@
|
|
|
1
|
+
# Redis Caching
|
|
2
|
+
|
|
3
|
+
In-memory data store for caching, sessions, and real-time data.
|
|
4
|
+
|
|
5
|
+
## Setup
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install redis ioredis
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Basic Caching
|
|
12
|
+
|
|
13
|
+
```typescript
|
|
14
|
+
import { createClient } from 'redis';
|
|
15
|
+
|
|
16
|
+
const redis = createClient({
|
|
17
|
+
host: 'localhost',
|
|
18
|
+
port: 6379
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
await redis.connect();
|
|
22
|
+
|
|
23
|
+
// Set cache
|
|
24
|
+
await redis.set('user:123', JSON.stringify({ id: '123', name: 'John' }), {
|
|
25
|
+
EX: 3600 // Expire in 1 hour
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
// Get cache
|
|
29
|
+
const cached = await redis.get('user:123');
|
|
30
|
+
const user = JSON.parse(cached || '{}');
|
|
31
|
+
|
|
32
|
+
// Delete cache
|
|
33
|
+
await redis.del('user:123');
|
|
34
|
+
|
|
35
|
+
// Check exists
|
|
36
|
+
const exists = await redis.exists('user:123');
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## Cache-Aside Pattern
|
|
40
|
+
|
|
41
|
+
```typescript
|
|
42
|
+
async function getUser(userId: string) {
|
|
43
|
+
// Check cache first
|
|
44
|
+
const cached = await redis.get(`user:${userId}`);
|
|
45
|
+
if (cached) {
|
|
46
|
+
return JSON.parse(cached);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// Fetch from database
|
|
50
|
+
const user = await db.users.findById(userId);
|
|
51
|
+
|
|
52
|
+
// Store in cache
|
|
53
|
+
if (user) {
|
|
54
|
+
await redis.set(`user:${userId}`, JSON.stringify(user), {
|
|
55
|
+
EX: 3600
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
return user;
|
|
60
|
+
}
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## Cache Invalidation
|
|
64
|
+
|
|
65
|
+
```typescript
|
|
66
|
+
// Invalidate on update
|
|
67
|
+
async function updateUser(userId: string, updates: any) {
|
|
68
|
+
const user = await db.users.update(userId, updates);
|
|
69
|
+
|
|
70
|
+
// Clear cache
|
|
71
|
+
await redis.del(`user:${userId}`);
|
|
72
|
+
|
|
73
|
+
// Clear related caches
|
|
74
|
+
await redis.del(`user:${userId}:posts`);
|
|
75
|
+
|
|
76
|
+
return user;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// Pattern invalidation
|
|
80
|
+
async function invalidateUserCaches(userId: string) {
|
|
81
|
+
const keys = await redis.keys(`user:${userId}:*`);
|
|
82
|
+
if (keys.length > 0) {
|
|
83
|
+
await redis.del(keys);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
## Session Storage
|
|
89
|
+
|
|
90
|
+
```typescript
|
|
91
|
+
import session from 'express-session';
|
|
92
|
+
import RedisStore from 'connect-redis';
|
|
93
|
+
|
|
94
|
+
const redisClient = createClient();
|
|
95
|
+
|
|
96
|
+
const sessionStore = new RedisStore({ client: redisClient });
|
|
97
|
+
|
|
98
|
+
app.use(
|
|
99
|
+
session({
|
|
100
|
+
store: sessionStore,
|
|
101
|
+
secret: process.env.SESSION_SECRET,
|
|
102
|
+
resave: false,
|
|
103
|
+
saveUninitialized: false,
|
|
104
|
+
cookie: {
|
|
105
|
+
httpOnly: true,
|
|
106
|
+
secure: process.env.NODE_ENV === 'production',
|
|
107
|
+
maxAge: 1000 * 60 * 60 * 24 // 24 hours
|
|
108
|
+
}
|
|
109
|
+
})
|
|
110
|
+
);
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
## Lists & Queues
|
|
114
|
+
|
|
115
|
+
```typescript
|
|
116
|
+
// Push to queue
|
|
117
|
+
await redis.lPush('email:queue', JSON.stringify({
|
|
118
|
+
to: 'user@example.com',
|
|
119
|
+
subject: 'Welcome'
|
|
120
|
+
}));
|
|
121
|
+
|
|
122
|
+
// Pop from queue
|
|
123
|
+
const job = await redis.rPop('email:queue');
|
|
124
|
+
|
|
125
|
+
// List length
|
|
126
|
+
const count = await redis.lLen('email:queue');
|
|
127
|
+
|
|
128
|
+
// Get range
|
|
129
|
+
const jobs = await redis.lRange('email:queue', 0, -1);
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
## Sorted Sets (Leaderboards)
|
|
133
|
+
|
|
134
|
+
```typescript
|
|
135
|
+
// Add score
|
|
136
|
+
await redis.zAdd('leaderboard', {
|
|
137
|
+
score: 100,
|
|
138
|
+
member: 'user:123'
|
|
139
|
+
});
|
|
140
|
+
|
|
141
|
+
// Increment score
|
|
142
|
+
await redis.zIncrBy('leaderboard', 10, 'user:123');
|
|
143
|
+
|
|
144
|
+
// Get top 10
|
|
145
|
+
const topPlayers = await redis.zRevRange('leaderboard', 0, 9, {
|
|
146
|
+
WITHSCORES: true
|
|
147
|
+
});
|
|
148
|
+
|
|
149
|
+
// Get rank
|
|
150
|
+
const rank = await redis.zRevRank('leaderboard', 'user:123');
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
## Pub/Sub
|
|
154
|
+
|
|
155
|
+
```typescript
|
|
156
|
+
// Subscriber
|
|
157
|
+
const subscriber = redis.duplicate();
|
|
158
|
+
await subscriber.connect();
|
|
159
|
+
|
|
160
|
+
await subscriber.subscribe('channel:notifications', (message) => {
|
|
161
|
+
console.log('Notification:', message);
|
|
162
|
+
});
|
|
163
|
+
|
|
164
|
+
// Publisher
|
|
165
|
+
await redis.publish('channel:notifications', JSON.stringify({
|
|
166
|
+
type: 'user:created',
|
|
167
|
+
userId: '123'
|
|
168
|
+
}));
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
## Transactions
|
|
172
|
+
|
|
173
|
+
```typescript
|
|
174
|
+
const pipeline = redis.multi();
|
|
175
|
+
|
|
176
|
+
pipeline.set('key1', 'value1');
|
|
177
|
+
pipeline.set('key2', 'value2');
|
|
178
|
+
pipeline.get('key1');
|
|
179
|
+
pipeline.incr('counter');
|
|
180
|
+
|
|
181
|
+
const results = await pipeline.exec();
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
## Best Practices
|
|
185
|
+
|
|
186
|
+
✅ **TTL values** - Always set expiration times
|
|
187
|
+
✅ **Key naming** - Use consistent patterns (entity:id:property)
|
|
188
|
+
✅ **Connection pooling** - Reuse connections
|
|
189
|
+
✅ **Monitoring** - Track hit rates and evictions
|
|
190
|
+
✅ **Persistence** - Enable AOF/RDB for important data
|
|
191
|
+
|
|
192
|
+
## Resources
|
|
193
|
+
|
|
194
|
+
- [Redis Documentation](https://redis.io/documentation)
|
|
195
|
+
- [Redis Node.js Client](https://github.com/luin/ioredis)
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
# Caching Strategies
|
|
2
|
+
|
|
3
|
+
Implementing effective caching.
|
|
4
|
+
|
|
5
|
+
## Cache Invalidation
|
|
6
|
+
|
|
7
|
+
```typescript
|
|
8
|
+
// Time-based expiration
|
|
9
|
+
async function getCachedUser(id: string) {
|
|
10
|
+
const cache = new Map();
|
|
11
|
+
const CacheTTL = 60 * 60 * 1000; // 1 hour
|
|
12
|
+
|
|
13
|
+
const cached = cache.get(id);
|
|
14
|
+
if (cached && Date.now() - cached.timestamp < CacheTTL) {
|
|
15
|
+
return cached.data;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
const user = await db.users.findById(id);
|
|
19
|
+
cache.set(id, { data: user, timestamp: Date.now() });
|
|
20
|
+
return user;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
// Event-based invalidation
|
|
24
|
+
async function updateUser(id: string, data: any) {
|
|
25
|
+
const user = await db.users.update(id, data);
|
|
26
|
+
|
|
27
|
+
// Clear cache
|
|
28
|
+
cache.delete(`user:${id}`);
|
|
29
|
+
cache.delete('users:list');
|
|
30
|
+
|
|
31
|
+
// Publish event
|
|
32
|
+
eventBus.emit('user:updated', user);
|
|
33
|
+
|
|
34
|
+
return user;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// Dependency-based
|
|
38
|
+
const userCache = cache.with('user', {
|
|
39
|
+
expires: 3600,
|
|
40
|
+
dependencies: ['user']
|
|
41
|
+
});
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## Multi-Level Caching
|
|
45
|
+
|
|
46
|
+
```typescript
|
|
47
|
+
// L1: Memory, L2: Redis, L3: Database
|
|
48
|
+
async function getUser(id: string) {
|
|
49
|
+
// L1: Memory cache
|
|
50
|
+
if (memoryCache.has(`user:${id}`)) {
|
|
51
|
+
return memoryCache.get(`user:${id}`);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// L2: Redis
|
|
55
|
+
const cached = await redis.get(`user:${id}`);
|
|
56
|
+
if (cached) {
|
|
57
|
+
const user = JSON.parse(cached);
|
|
58
|
+
memoryCache.set(`user:${id}`, user);
|
|
59
|
+
return user;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// L3: Database
|
|
63
|
+
const user = await db.users.findById(id);
|
|
64
|
+
await redis.set(`user:${id}`, JSON.stringify(user), 'EX', 3600);
|
|
65
|
+
memoryCache.set(`user:${id}`, user);
|
|
66
|
+
|
|
67
|
+
return user;
|
|
68
|
+
}
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
## Cache Warming
|
|
72
|
+
|
|
73
|
+
```typescript
|
|
74
|
+
async function warmCache() {
|
|
75
|
+
const users = await db.users.find({ featured: true });
|
|
76
|
+
|
|
77
|
+
for (const user of users) {
|
|
78
|
+
await redis.set(`user:${user.id}`, JSON.stringify(user), 'EX', 86400);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
console.log('Cache warmed');
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// Run on startup
|
|
85
|
+
app.listen(3000, () => {
|
|
86
|
+
warmCache().catch(console.error);
|
|
87
|
+
});
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
## Best Practices
|
|
91
|
+
|
|
92
|
+
✅ **Cache invalidation** - Know when to clear
|
|
93
|
+
✅ **TTL strategy** - Appropriate expiration
|
|
94
|
+
✅ **Multi-level** - Memory + Redis + DB
|
|
95
|
+
✅ **Monitoring** - Track hit rates
|
|
96
|
+
✅ **Size limits** - Prevent memory bloat
|
|
97
|
+
|
|
98
|
+
## Resources
|
|
99
|
+
|
|
100
|
+
- [Caching Patterns](https://codeahoy.com/2017/08/11/caching-strategies-explained/)
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
# AWS
|
|
2
|
+
|
|
3
|
+
Cloud platform with EC2, S3, Lambda, DynamoDB, and RDS.
|
|
4
|
+
|
|
5
|
+
## Lambda Functions
|
|
6
|
+
|
|
7
|
+
```typescript
|
|
8
|
+
// Basic handler
|
|
9
|
+
export const handler = async (event: any) => {
|
|
10
|
+
return {
|
|
11
|
+
statusCode: 200,
|
|
12
|
+
body: JSON.stringify({ message: 'Hello from Lambda' })
|
|
13
|
+
};
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
// API Gateway integration
|
|
17
|
+
export const apiHandler = async (event: APIGatewayProxyEvent) => {
|
|
18
|
+
const { pathParameters, body } = event;
|
|
19
|
+
const data = JSON.parse(body || '{}');
|
|
20
|
+
|
|
21
|
+
return {
|
|
22
|
+
statusCode: 200,
|
|
23
|
+
headers: { 'Content-Type': 'application/json' },
|
|
24
|
+
body: JSON.stringify({ data })
|
|
25
|
+
};
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
// S3 event trigger
|
|
29
|
+
export const s3Handler = async (event: S3Event) => {
|
|
30
|
+
for (const record of event.Records) {
|
|
31
|
+
const bucket = record.s3.bucket.name;
|
|
32
|
+
const key = record.s3.object.key;
|
|
33
|
+
console.log(`Processing ${bucket}/${key}`);
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## S3 Storage
|
|
39
|
+
|
|
40
|
+
```typescript
|
|
41
|
+
import { S3Client, PutObjectCommand, GetObjectCommand } from '@aws-sdk/client-s3';
|
|
42
|
+
|
|
43
|
+
const s3 = new S3Client({ region: 'us-east-1' });
|
|
44
|
+
|
|
45
|
+
// Upload
|
|
46
|
+
await s3.send(new PutObjectCommand({
|
|
47
|
+
Bucket: 'my-bucket',
|
|
48
|
+
Key: 'path/to/file.txt',
|
|
49
|
+
Body: Buffer.from('content'),
|
|
50
|
+
ContentType: 'text/plain'
|
|
51
|
+
}));
|
|
52
|
+
|
|
53
|
+
// Download
|
|
54
|
+
const response = await s3.send(new GetObjectCommand({
|
|
55
|
+
Bucket: 'my-bucket',
|
|
56
|
+
Key: 'path/to/file.txt'
|
|
57
|
+
}));
|
|
58
|
+
|
|
59
|
+
const body = await response.Body?.transformToString();
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
## DynamoDB
|
|
63
|
+
|
|
64
|
+
```typescript
|
|
65
|
+
import { DynamoDBClient } from '@aws-sdk/client-dynamodb';
|
|
66
|
+
import { DynamoDBDocumentClient, PutCommand, QueryCommand } from '@aws-sdk/lib-dynamodb';
|
|
67
|
+
|
|
68
|
+
const db = DynamoDBDocumentClient.from(new DynamoDBClient({}));
|
|
69
|
+
|
|
70
|
+
// Write
|
|
71
|
+
await db.send(new PutCommand({
|
|
72
|
+
TableName: 'Users',
|
|
73
|
+
Item: {
|
|
74
|
+
userId: 'user-123',
|
|
75
|
+
email: 'user@example.com',
|
|
76
|
+
createdAt: Date.now()
|
|
77
|
+
}
|
|
78
|
+
}));
|
|
79
|
+
|
|
80
|
+
// Query
|
|
81
|
+
const { Items } = await db.send(new QueryCommand({
|
|
82
|
+
TableName: 'Users',
|
|
83
|
+
KeyConditionExpression: 'userId = :id',
|
|
84
|
+
ExpressionAttributeValues: { ':id': 'user-123' }
|
|
85
|
+
}));
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
## RDS (Relational Database)
|
|
89
|
+
|
|
90
|
+
```typescript
|
|
91
|
+
import mysql from 'mysql2/promise';
|
|
92
|
+
|
|
93
|
+
const connection = await mysql.createConnection({
|
|
94
|
+
host: process.env.DB_HOST,
|
|
95
|
+
user: process.env.DB_USER,
|
|
96
|
+
password: process.env.DB_PASSWORD,
|
|
97
|
+
database: process.env.DB_NAME
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
const [rows] = await connection.execute(
|
|
101
|
+
'SELECT * FROM users WHERE id = ?',
|
|
102
|
+
[userId]
|
|
103
|
+
);
|
|
104
|
+
|
|
105
|
+
await connection.execute(
|
|
106
|
+
'INSERT INTO users (email, name) VALUES (?, ?)',
|
|
107
|
+
[email, name]
|
|
108
|
+
);
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
## IAM & Secrets
|
|
112
|
+
|
|
113
|
+
```typescript
|
|
114
|
+
import { SecretsManagerClient, GetSecretValueCommand } from '@aws-sdk/client-secrets-manager';
|
|
115
|
+
|
|
116
|
+
const secrets = new SecretsManagerClient({});
|
|
117
|
+
|
|
118
|
+
const { SecretString } = await secrets.send(new GetSecretValueCommand({
|
|
119
|
+
SecretId: 'my-secret'
|
|
120
|
+
}));
|
|
121
|
+
|
|
122
|
+
const secret = JSON.parse(SecretString || '{}');
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
## CloudFormation
|
|
126
|
+
|
|
127
|
+
```yaml
|
|
128
|
+
AWSTemplateFormatVersion: '2010-09-09'
|
|
129
|
+
Resources:
|
|
130
|
+
MyTable:
|
|
131
|
+
Type: AWS::DynamoDB::Table
|
|
132
|
+
Properties:
|
|
133
|
+
TableName: my-table
|
|
134
|
+
BillingMode: PAY_PER_REQUEST
|
|
135
|
+
AttributeDefinitions:
|
|
136
|
+
- AttributeName: id
|
|
137
|
+
AttributeType: S
|
|
138
|
+
KeySchema:
|
|
139
|
+
- AttributeName: id
|
|
140
|
+
KeyType: HASH
|
|
141
|
+
|
|
142
|
+
MyLambda:
|
|
143
|
+
Type: AWS::Lambda::Function
|
|
144
|
+
Properties:
|
|
145
|
+
FunctionName: my-function
|
|
146
|
+
Runtime: nodejs20.x
|
|
147
|
+
Handler: index.handler
|
|
148
|
+
Code:
|
|
149
|
+
ZipFile: |
|
|
150
|
+
exports.handler = async () => ({ statusCode: 200 });
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
## Best Practices
|
|
154
|
+
|
|
155
|
+
✅ **Use SDK v3** - Modular imports reduce bundle size
|
|
156
|
+
✅ **Connection pooling** - Reuse connections for RDS
|
|
157
|
+
✅ **IAM roles** - Least privilege permissions
|
|
158
|
+
✅ **Environment variables** - Store config in AWS Systems Manager
|
|
159
|
+
✅ **CloudWatch logs** - Monitor function execution
|
|
160
|
+
|
|
161
|
+
## Resources
|
|
162
|
+
|
|
163
|
+
- [AWS SDK for JavaScript](https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/)
|
|
164
|
+
- [Lambda Developer Guide](https://docs.aws.amazon.com/lambda/)
|
|
165
|
+
- [DynamoDB Documentation](https://docs.aws.amazon.com/dynamodb/)
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
# Microsoft Azure
|
|
2
|
+
|
|
3
|
+
Cloud platform with App Service, Functions, Cosmos DB, and SQL Database.
|
|
4
|
+
|
|
5
|
+
## Azure Functions
|
|
6
|
+
|
|
7
|
+
```typescript
|
|
8
|
+
import { AzureFunction, Context, HttpRequest } from '@azure/functions';
|
|
9
|
+
|
|
10
|
+
const httpTrigger: AzureFunction = async (
|
|
11
|
+
context: Context,
|
|
12
|
+
req: HttpRequest
|
|
13
|
+
): Promise<void> => {
|
|
14
|
+
context.log('HTTP trigger function processed a request.');
|
|
15
|
+
|
|
16
|
+
const name = req.query.name || req.body?.name || 'World';
|
|
17
|
+
|
|
18
|
+
context.res = {
|
|
19
|
+
status: 200,
|
|
20
|
+
body: `Hello, ${name}!`
|
|
21
|
+
};
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
export default httpTrigger;
|
|
25
|
+
|
|
26
|
+
// Timer trigger
|
|
27
|
+
const timerTrigger: AzureFunction = async (context: Context) => {
|
|
28
|
+
const timeStamp = new Date().toISOString();
|
|
29
|
+
context.log('Timer trigger function ran!', timeStamp);
|
|
30
|
+
};
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## Cosmos DB
|
|
34
|
+
|
|
35
|
+
```typescript
|
|
36
|
+
import { CosmosClient } from '@azure/cosmos';
|
|
37
|
+
|
|
38
|
+
const client = new CosmosClient({
|
|
39
|
+
endpoint: process.env.COSMOS_ENDPOINT,
|
|
40
|
+
key: process.env.COSMOS_KEY
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
const database = client.database('my-db');
|
|
44
|
+
const container = database.container('users');
|
|
45
|
+
|
|
46
|
+
// Create item
|
|
47
|
+
const { resource: createdItem } = await container.items.create({
|
|
48
|
+
id: 'user-123',
|
|
49
|
+
email: 'user@example.com',
|
|
50
|
+
age: 30
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
// Read item
|
|
54
|
+
const { resource: item } = await container
|
|
55
|
+
.item('user-123', 'user-123')
|
|
56
|
+
.read();
|
|
57
|
+
|
|
58
|
+
// Query
|
|
59
|
+
const { resources: items } = await container.items
|
|
60
|
+
.query('SELECT * FROM c WHERE c.age > @age', { parameters: [{ name: '@age', value: 25 }] })
|
|
61
|
+
.fetchAll();
|
|
62
|
+
|
|
63
|
+
// Update
|
|
64
|
+
await container
|
|
65
|
+
.item('user-123', 'user-123')
|
|
66
|
+
.replace({ ...item, age: 31 });
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
## Azure SQL Database
|
|
70
|
+
|
|
71
|
+
```typescript
|
|
72
|
+
import sql from 'mssql';
|
|
73
|
+
|
|
74
|
+
const config = {
|
|
75
|
+
user: process.env.DB_USER,
|
|
76
|
+
password: process.env.DB_PASSWORD,
|
|
77
|
+
server: process.env.DB_SERVER,
|
|
78
|
+
database: process.env.DB_NAME,
|
|
79
|
+
authentication: {
|
|
80
|
+
type: 'default'
|
|
81
|
+
},
|
|
82
|
+
options: {
|
|
83
|
+
encrypt: true,
|
|
84
|
+
trustServerCertificate: false,
|
|
85
|
+
connectionTimeout: 15000
|
|
86
|
+
}
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
const pool = new sql.ConnectionPool(config);
|
|
90
|
+
await pool.connect();
|
|
91
|
+
|
|
92
|
+
// Query
|
|
93
|
+
const result = await pool.request()
|
|
94
|
+
.input('email', sql.VarChar, 'user@example.com')
|
|
95
|
+
.query('SELECT * FROM Users WHERE email = @email');
|
|
96
|
+
|
|
97
|
+
console.log(result.recordset);
|
|
98
|
+
|
|
99
|
+
// Insert
|
|
100
|
+
await pool.request()
|
|
101
|
+
.input('email', sql.VarChar, 'new@example.com')
|
|
102
|
+
.input('name', sql.VarChar, 'John Doe')
|
|
103
|
+
.query('INSERT INTO Users (email, name) VALUES (@email, @name)');
|
|
104
|
+
|
|
105
|
+
await pool.close();
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
## Blob Storage
|
|
109
|
+
|
|
110
|
+
```typescript
|
|
111
|
+
import { BlobServiceClient } from '@azure/storage-blob';
|
|
112
|
+
|
|
113
|
+
const blobServiceClient = BlobServiceClient.fromConnectionString(
|
|
114
|
+
process.env.STORAGE_CONNECTION_STRING
|
|
115
|
+
);
|
|
116
|
+
|
|
117
|
+
const containerClient = blobServiceClient.getContainerClient('my-container');
|
|
118
|
+
|
|
119
|
+
// Upload blob
|
|
120
|
+
const blockBlobClient = containerClient.getBlockBlobClient('my-blob.txt');
|
|
121
|
+
await blockBlobClient.upload('content', 7);
|
|
122
|
+
|
|
123
|
+
// Download blob
|
|
124
|
+
const downloadBlockBlobResponse = await blockBlobClient.download(0);
|
|
125
|
+
const downloaded = await streamToString(downloadBlockBlobResponse.readableStreamBody);
|
|
126
|
+
|
|
127
|
+
// List blobs
|
|
128
|
+
for await (const blob of containerClient.listBlobsFlat()) {
|
|
129
|
+
console.log(`\t${blob.name}`);
|
|
130
|
+
}
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
## Azure Key Vault
|
|
134
|
+
|
|
135
|
+
```typescript
|
|
136
|
+
import { SecretClient } from '@azure/keyvault-secrets';
|
|
137
|
+
import { DefaultAzureCredential } from '@azure/identity';
|
|
138
|
+
|
|
139
|
+
const vaultUrl = `https://${process.env.VAULT_NAME}.vault.azure.net`;
|
|
140
|
+
const client = new SecretClient(vaultUrl, new DefaultAzureCredential());
|
|
141
|
+
|
|
142
|
+
// Get secret
|
|
143
|
+
const secret = await client.getSecret('my-secret');
|
|
144
|
+
console.log(secret.value);
|
|
145
|
+
|
|
146
|
+
// Set secret
|
|
147
|
+
await client.setSecret('new-secret', 'secret-value');
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
## Application Insights (Monitoring)
|
|
151
|
+
|
|
152
|
+
```typescript
|
|
153
|
+
import appInsights from 'applicationinsights';
|
|
154
|
+
|
|
155
|
+
appInsights.setup(process.env.APPINSIGHTS_INSTRUMENTATION_KEY)
|
|
156
|
+
.setAutoCollectConsole(true)
|
|
157
|
+
.start();
|
|
158
|
+
|
|
159
|
+
const client = appInsights.defaultClient;
|
|
160
|
+
|
|
161
|
+
// Track event
|
|
162
|
+
client.trackEvent({
|
|
163
|
+
name: 'UserLogin',
|
|
164
|
+
properties: { userId: '123', method: 'OAuth' }
|
|
165
|
+
});
|
|
166
|
+
|
|
167
|
+
// Track exception
|
|
168
|
+
try {
|
|
169
|
+
throw new Error('Something went wrong');
|
|
170
|
+
} catch (error) {
|
|
171
|
+
client.trackException({ exception: error });
|
|
172
|
+
}
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
## Best Practices
|
|
176
|
+
|
|
177
|
+
✅ **Use managed identities** - Avoid connection strings in code
|
|
178
|
+
✅ **Cosmos DB partitioning** - Design partition key for scalability
|
|
179
|
+
✅ **Connection pooling** - Reuse SQL connections
|
|
180
|
+
✅ **Application Insights** - Monitor performance and errors
|
|
181
|
+
✅ **Use Azure DevOps** - CI/CD integration
|
|
182
|
+
|
|
183
|
+
## Resources
|
|
184
|
+
|
|
185
|
+
- [Azure Documentation](https://learn.microsoft.com/en-us/azure/)
|
|
186
|
+
- [Cosmos DB Guide](https://learn.microsoft.com/en-us/azure/cosmos-db/)
|
|
187
|
+
- [Azure Functions](https://learn.microsoft.com/en-us/azure/azure-functions/)
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
# Cloudflare
|
|
2
|
+
|
|
3
|
+
Edge computing platform with Workers, KV, and D1 database.
|
|
4
|
+
|
|
5
|
+
## Workers
|
|
6
|
+
|
|
7
|
+
```typescript
|
|
8
|
+
// Basic worker
|
|
9
|
+
export default {
|
|
10
|
+
async fetch(request: Request) {
|
|
11
|
+
return new Response('Hello World!', {
|
|
12
|
+
status: 200,
|
|
13
|
+
headers: { 'Content-Type': 'text/plain' }
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## KV Storage
|
|
20
|
+
|
|
21
|
+
```typescript
|
|
22
|
+
// Store data
|
|
23
|
+
await NAMESPACE.put('key', 'value', { expirationTtl: 3600 });
|
|
24
|
+
|
|
25
|
+
// Retrieve data
|
|
26
|
+
const value = await NAMESPACE.get('key');
|
|
27
|
+
|
|
28
|
+
// Delete
|
|
29
|
+
await NAMESPACE.delete('key');
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## D1 Database
|
|
33
|
+
|
|
34
|
+
```typescript
|
|
35
|
+
// Query database
|
|
36
|
+
const { success, results } = await env.DB.prepare(
|
|
37
|
+
'SELECT * FROM users WHERE id = ?'
|
|
38
|
+
).bind(1).all();
|
|
39
|
+
|
|
40
|
+
// Insert
|
|
41
|
+
await env.DB.prepare(
|
|
42
|
+
'INSERT INTO users (name, email) VALUES (?, ?)'
|
|
43
|
+
).bind('John', 'john@example.com').run();
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
## Routes
|
|
47
|
+
|
|
48
|
+
```toml
|
|
49
|
+
# wrangler.toml
|
|
50
|
+
name = "my-worker"
|
|
51
|
+
main = "src/index.ts"
|
|
52
|
+
compatibility_date = "2024-01-01"
|
|
53
|
+
|
|
54
|
+
[[routes]]
|
|
55
|
+
pattern = "example.com/api/*"
|
|
56
|
+
zone_name = "example.com"
|
|
57
|
+
|
|
58
|
+
[env.production]
|
|
59
|
+
routes = [
|
|
60
|
+
{ pattern = "example.com/*", zone_name = "example.com" }
|
|
61
|
+
]
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
## Best Practices
|
|
65
|
+
|
|
66
|
+
✅ **Use caching** - Reduce origin requests
|
|
67
|
+
✅ **Monitor metrics** - Track performance
|
|
68
|
+
✅ **Secure with authentication** - Use API keys
|
|
69
|
+
✅ **Enable WAF rules** - Protect from attacks
|
|
70
|
+
|
|
71
|
+
## Resources
|
|
72
|
+
|
|
73
|
+
- [Cloudflare Docs](https://developers.cloudflare.com/)
|
|
74
|
+
- [Workers Guide](https://developers.cloudflare.com/workers/)
|