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,203 @@
|
|
|
1
|
+
# Monitoring & Observability
|
|
2
|
+
|
|
3
|
+
Application performance monitoring, metrics, and alerting.
|
|
4
|
+
|
|
5
|
+
## Prometheus
|
|
6
|
+
|
|
7
|
+
```yaml
|
|
8
|
+
# prometheus.yml
|
|
9
|
+
global:
|
|
10
|
+
scrape_interval: 15s
|
|
11
|
+
|
|
12
|
+
scrape_configs:
|
|
13
|
+
- job_name: 'nodejs-app'
|
|
14
|
+
static_configs:
|
|
15
|
+
- targets: ['localhost:9090']
|
|
16
|
+
|
|
17
|
+
- job_name: 'database'
|
|
18
|
+
static_configs:
|
|
19
|
+
- targets: ['localhost:9187']
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## Application Metrics
|
|
23
|
+
|
|
24
|
+
```typescript
|
|
25
|
+
import promClient from 'prom-client';
|
|
26
|
+
import express from 'express';
|
|
27
|
+
|
|
28
|
+
// Create metrics
|
|
29
|
+
const httpRequestDuration = new promClient.Histogram({
|
|
30
|
+
name: 'http_request_duration_seconds',
|
|
31
|
+
help: 'Duration of HTTP requests in seconds',
|
|
32
|
+
labelNames: ['method', 'route', 'status_code']
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
const activeConnections = new promClient.Gauge({
|
|
36
|
+
name: 'active_connections',
|
|
37
|
+
help: 'Number of active connections'
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
// Middleware
|
|
41
|
+
app.use((req, res, next) => {
|
|
42
|
+
const start = Date.now();
|
|
43
|
+
|
|
44
|
+
res.on('finish', () => {
|
|
45
|
+
const duration = (Date.now() - start) / 1000;
|
|
46
|
+
httpRequestDuration
|
|
47
|
+
.labels(req.method, req.route?.path, res.statusCode)
|
|
48
|
+
.observe(duration);
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
next();
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
// Metrics endpoint
|
|
55
|
+
app.get('/metrics', async (req, res) => {
|
|
56
|
+
res.set('Content-Type', promClient.register.contentType);
|
|
57
|
+
res.end(await promClient.register.metrics());
|
|
58
|
+
});
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
## Grafana Dashboards
|
|
62
|
+
|
|
63
|
+
```json
|
|
64
|
+
{
|
|
65
|
+
"dashboard": {
|
|
66
|
+
"title": "Application Metrics",
|
|
67
|
+
"panels": [
|
|
68
|
+
{
|
|
69
|
+
"title": "Request Rate",
|
|
70
|
+
"targets": [
|
|
71
|
+
{
|
|
72
|
+
"expr": "rate(http_request_duration_seconds_count[5m])"
|
|
73
|
+
}
|
|
74
|
+
]
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
"title": "Error Rate",
|
|
78
|
+
"targets": [
|
|
79
|
+
{
|
|
80
|
+
"expr": "rate(http_request_duration_seconds_count{status_code=~\"5..\"}[5m])"
|
|
81
|
+
}
|
|
82
|
+
]
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
"title": "Response Time",
|
|
86
|
+
"targets": [
|
|
87
|
+
{
|
|
88
|
+
"expr": "histogram_quantile(0.95, http_request_duration_seconds_bucket)"
|
|
89
|
+
}
|
|
90
|
+
]
|
|
91
|
+
}
|
|
92
|
+
]
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
## DataDog Integration
|
|
98
|
+
|
|
99
|
+
```typescript
|
|
100
|
+
import StatsD from 'node-dogstatsd';
|
|
101
|
+
|
|
102
|
+
const dogstatsd = new StatsD.StatsD({
|
|
103
|
+
host: 'localhost',
|
|
104
|
+
port: 8125,
|
|
105
|
+
prefix: 'myapp.'
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
// Track metrics
|
|
109
|
+
dogstatsd.gauge('user.active', 42);
|
|
110
|
+
dogstatsd.increment('requests.total');
|
|
111
|
+
dogstatsd.histogram('response.time', 0.234);
|
|
112
|
+
|
|
113
|
+
// Tags
|
|
114
|
+
dogstatsd.increment('api.calls', 1, {
|
|
115
|
+
tags: ['endpoint:/users', 'status:success']
|
|
116
|
+
});
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
## Custom Alerts
|
|
120
|
+
|
|
121
|
+
```yaml
|
|
122
|
+
# alert.yml
|
|
123
|
+
groups:
|
|
124
|
+
- name: application
|
|
125
|
+
rules:
|
|
126
|
+
- alert: HighErrorRate
|
|
127
|
+
expr: rate(errors_total[5m]) > 0.05
|
|
128
|
+
for: 5m
|
|
129
|
+
annotations:
|
|
130
|
+
summary: "High error rate detected"
|
|
131
|
+
description: "Error rate is {{ $value }}"
|
|
132
|
+
|
|
133
|
+
- alert: HighLatency
|
|
134
|
+
expr: histogram_quantile(0.95, response_time) > 1
|
|
135
|
+
for: 10m
|
|
136
|
+
annotations:
|
|
137
|
+
summary: "High latency detected"
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
## Logging with ELK
|
|
141
|
+
|
|
142
|
+
```typescript
|
|
143
|
+
import winston from 'winston';
|
|
144
|
+
|
|
145
|
+
const logger = winston.createLogger({
|
|
146
|
+
level: 'info',
|
|
147
|
+
format: winston.format.json(),
|
|
148
|
+
transports: [
|
|
149
|
+
new winston.transports.Console(),
|
|
150
|
+
new winston.transports.File({
|
|
151
|
+
filename: 'error.log',
|
|
152
|
+
level: 'error'
|
|
153
|
+
}),
|
|
154
|
+
new winston.transports.File({ filename: 'combined.log' })
|
|
155
|
+
]
|
|
156
|
+
});
|
|
157
|
+
|
|
158
|
+
logger.info('Server started', { port: 3000 });
|
|
159
|
+
logger.error('Database connection failed', { code: 'ECONNREFUSED' });
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
## Health Checks
|
|
163
|
+
|
|
164
|
+
```typescript
|
|
165
|
+
app.get('/health', async (req, res) => {
|
|
166
|
+
const health = {
|
|
167
|
+
status: 'OK',
|
|
168
|
+
timestamp: new Date().toISOString(),
|
|
169
|
+
checks: {
|
|
170
|
+
database: await checkDatabase(),
|
|
171
|
+
redis: await checkRedis(),
|
|
172
|
+
uptime: process.uptime()
|
|
173
|
+
}
|
|
174
|
+
};
|
|
175
|
+
|
|
176
|
+
const statusCode = Object.values(health.checks).every(Boolean) ? 200 : 503;
|
|
177
|
+
|
|
178
|
+
res.status(statusCode).json(health);
|
|
179
|
+
});
|
|
180
|
+
|
|
181
|
+
async function checkDatabase() {
|
|
182
|
+
try {
|
|
183
|
+
await db.raw('SELECT 1');
|
|
184
|
+
return true;
|
|
185
|
+
} catch {
|
|
186
|
+
return false;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
## Best Practices
|
|
192
|
+
|
|
193
|
+
✅ **Structured logging** - Use JSON format
|
|
194
|
+
✅ **Meaningful metrics** - Track business metrics
|
|
195
|
+
✅ **Alert thresholds** - Set based on SLOs
|
|
196
|
+
✅ **Retention policies** - Balance cost and history
|
|
197
|
+
✅ **Distributed tracing** - Track requests across services
|
|
198
|
+
|
|
199
|
+
## Resources
|
|
200
|
+
|
|
201
|
+
- [Prometheus Docs](https://prometheus.io/docs/)
|
|
202
|
+
- [Grafana](https://grafana.com/)
|
|
203
|
+
- [DataDog](https://www.datadoghq.com/)
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
# Pulumi
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
Define cloud infrastructure as TypeScript/Python/Go code instead of YAML. Pulumi uses real programming languages for IaC.
|
|
5
|
+
|
|
6
|
+
## Setup
|
|
7
|
+
|
|
8
|
+
```bash
|
|
9
|
+
curl -fsSL https://get.pulumi.com | sh
|
|
10
|
+
pulumi login
|
|
11
|
+
mkdir infra && cd infra
|
|
12
|
+
pulumi new aws-typescript
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## S3 + CloudFront
|
|
16
|
+
|
|
17
|
+
```typescript
|
|
18
|
+
import * as aws from '@pulumi/aws';
|
|
19
|
+
import * as pulumi from '@pulumi/pulumi';
|
|
20
|
+
|
|
21
|
+
const bucket = new aws.s3.BucketV2('site-assets', {
|
|
22
|
+
tags: { Environment: pulumi.getStack() }
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
new aws.s3.BucketPublicAccessBlock('site-block', {
|
|
26
|
+
bucket: bucket.id,
|
|
27
|
+
blockPublicAcls: true,
|
|
28
|
+
blockPublicPolicy: true,
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
const distribution = new aws.cloudfront.Distribution('cdn', {
|
|
32
|
+
origins: [{
|
|
33
|
+
domainName: bucket.bucketRegionalDomainName,
|
|
34
|
+
originId: 'S3Origin',
|
|
35
|
+
}],
|
|
36
|
+
enabled: true,
|
|
37
|
+
defaultCacheBehavior: {
|
|
38
|
+
targetOriginId: 'S3Origin',
|
|
39
|
+
viewerProtocolPolicy: 'redirect-to-https',
|
|
40
|
+
allowedMethods: ['GET', 'HEAD'],
|
|
41
|
+
cachedMethods: ['GET', 'HEAD'],
|
|
42
|
+
forwardedValues: { queryString: false, cookies: { forward: 'none' } },
|
|
43
|
+
},
|
|
44
|
+
restrictions: { geoRestriction: { restrictionType: 'none' } },
|
|
45
|
+
viewerCertificate: { cloudfrontDefaultCertificate: true },
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
export const cdnUrl = distribution.domainName;
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## ECS Fargate Service
|
|
52
|
+
|
|
53
|
+
```typescript
|
|
54
|
+
import * as awsx from '@pulumi/awsx';
|
|
55
|
+
|
|
56
|
+
const repo = new awsx.ecr.Repository('app');
|
|
57
|
+
const image = new awsx.ecr.Image('app-image', { repositoryUrl: repo.url, context: '../app' });
|
|
58
|
+
|
|
59
|
+
const cluster = new aws.ecs.Cluster('cluster');
|
|
60
|
+
const lb = new awsx.lb.ApplicationLoadBalancer('alb');
|
|
61
|
+
|
|
62
|
+
const service = new awsx.ecs.FargateService('app', {
|
|
63
|
+
cluster: cluster.arn,
|
|
64
|
+
taskDefinitionArgs: {
|
|
65
|
+
container: {
|
|
66
|
+
name: 'app',
|
|
67
|
+
image: image.imageUri,
|
|
68
|
+
cpu: 256, memory: 512,
|
|
69
|
+
portMappings: [lb.defaultTargetGroup],
|
|
70
|
+
}
|
|
71
|
+
},
|
|
72
|
+
desiredCount: 2,
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
export const url = lb.loadBalancer.dnsName;
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
## Deploy
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
pulumi preview # show changes
|
|
82
|
+
pulumi up # deploy
|
|
83
|
+
pulumi destroy # tear down
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
## Best Practices
|
|
87
|
+
- Use `pulumi.Config` for environment-specific values
|
|
88
|
+
- Store secrets with `config.requireSecret()` (encrypted in state)
|
|
89
|
+
- Use stack references to share outputs between stacks
|
|
90
|
+
- Create component resources for reusable infrastructure patterns
|
|
91
|
+
|
|
92
|
+
## Resources
|
|
93
|
+
- [Pulumi docs](https://www.pulumi.com/docs/)
|
|
94
|
+
- [Pulumi AWS examples](https://www.pulumi.com/registry/packages/aws/)
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
# Secrets Management
|
|
2
|
+
|
|
3
|
+
Secure storage and retrieval of API keys, credentials, and tokens.
|
|
4
|
+
|
|
5
|
+
## Environment Variables
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
# .env.local
|
|
9
|
+
DATABASE_URL=postgresql://user:pass@localhost/db
|
|
10
|
+
API_KEY=sk-1234567890
|
|
11
|
+
STRIPE_SECRET=sk_live_...
|
|
12
|
+
|
|
13
|
+
# .env.production
|
|
14
|
+
DATABASE_URL=${DB_PROD_URL}
|
|
15
|
+
API_KEY=${API_KEY_PROD}
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
```typescript
|
|
19
|
+
// next.config.ts - expose public vars
|
|
20
|
+
const nextConfig = {
|
|
21
|
+
env: {
|
|
22
|
+
NEXT_PUBLIC_API_URL: process.env.NEXT_PUBLIC_API_URL
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## AWS Secrets Manager
|
|
28
|
+
|
|
29
|
+
```typescript
|
|
30
|
+
import { SecretsManagerClient, GetSecretValueCommand } from '@aws-sdk/client-secrets-manager';
|
|
31
|
+
|
|
32
|
+
const client = new SecretsManagerClient({ region: 'us-east-1' });
|
|
33
|
+
|
|
34
|
+
async function getSecret(secretName: string) {
|
|
35
|
+
try {
|
|
36
|
+
const command = new GetSecretValueCommand({ SecretId: secretName });
|
|
37
|
+
const response = await client.send(command);
|
|
38
|
+
|
|
39
|
+
return response.SecretString ? JSON.parse(response.SecretString) : response.SecretBinary;
|
|
40
|
+
} catch (error) {
|
|
41
|
+
console.error('Error retrieving secret:', error);
|
|
42
|
+
throw error;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// Usage
|
|
47
|
+
const dbCredentials = await getSecret('prod/database');
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
## HashiCorp Vault
|
|
51
|
+
|
|
52
|
+
```typescript
|
|
53
|
+
import * as Vault from 'node-vault';
|
|
54
|
+
|
|
55
|
+
const vault = new Vault({
|
|
56
|
+
endpoint: 'http://localhost:8200',
|
|
57
|
+
token: process.env.VAULT_TOKEN
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
// Read secret
|
|
61
|
+
const secret = await vault.read('secret/data/prod/database');
|
|
62
|
+
console.log(secret.data.data.username);
|
|
63
|
+
|
|
64
|
+
// Write secret
|
|
65
|
+
await vault.write('secret/data/prod/api-key', {
|
|
66
|
+
data: {
|
|
67
|
+
key: 'sk-1234567890',
|
|
68
|
+
name: 'production-key'
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
// Create dynamic database credentials
|
|
73
|
+
const creds = await vault.read('database/creds/my-role');
|
|
74
|
+
console.log(creds.data.username, creds.data.password);
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
## Sealed Secrets (Kubernetes)
|
|
78
|
+
|
|
79
|
+
```yaml
|
|
80
|
+
# Install Sealed Secrets
|
|
81
|
+
kubectl apply -f https://github.com/bitnami-labs/sealed-secrets/releases/download/v0.18.0/controller.yaml
|
|
82
|
+
|
|
83
|
+
# Seal a secret
|
|
84
|
+
echo -n mypassword | kubectl create secret generic mysecret --dry-run=client --from-file=password=/dev/stdin -o yaml | kubeseal -f -
|
|
85
|
+
|
|
86
|
+
# Apply sealed secret
|
|
87
|
+
kubectl apply -f my-sealed-secret.yaml
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
#!/bin/bash
|
|
92
|
+
# Script to rotate secrets
|
|
93
|
+
for secret in $(vault list secret/metadata/prod); do
|
|
94
|
+
echo "Rotating $secret"
|
|
95
|
+
vault write "secret/data/prod/$secret" @"./new-${secret}.json"
|
|
96
|
+
done
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
## Node.js dotenv
|
|
100
|
+
|
|
101
|
+
```typescript
|
|
102
|
+
import dotenv from 'dotenv';
|
|
103
|
+
import path from 'path';
|
|
104
|
+
|
|
105
|
+
// Load based on NODE_ENV
|
|
106
|
+
const envFile = `.env.${process.env.NODE_ENV || 'development'}`;
|
|
107
|
+
dotenv.config({ path: path.resolve(process.cwd(), envFile) });
|
|
108
|
+
|
|
109
|
+
// Access variables
|
|
110
|
+
const dbUrl = process.env.DATABASE_URL;
|
|
111
|
+
const apiKey = process.env.API_KEY;
|
|
112
|
+
|
|
113
|
+
// Type-safe config
|
|
114
|
+
interface Config {
|
|
115
|
+
database: {
|
|
116
|
+
url: string;
|
|
117
|
+
};
|
|
118
|
+
api: {
|
|
119
|
+
key: string;
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
const config: Config = {
|
|
124
|
+
database: {
|
|
125
|
+
url: process.env.DATABASE_URL!
|
|
126
|
+
},
|
|
127
|
+
api: {
|
|
128
|
+
key: process.env.API_KEY!
|
|
129
|
+
}
|
|
130
|
+
};
|
|
131
|
+
|
|
132
|
+
export default config;
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
## GitHub Secrets
|
|
136
|
+
|
|
137
|
+
```yaml
|
|
138
|
+
# .github/workflows/deploy.yml
|
|
139
|
+
name: Deploy
|
|
140
|
+
on: [push]
|
|
141
|
+
|
|
142
|
+
jobs:
|
|
143
|
+
deploy:
|
|
144
|
+
runs-on: ubuntu-latest
|
|
145
|
+
steps:
|
|
146
|
+
- uses: actions/checkout@v3
|
|
147
|
+
- name: Deploy
|
|
148
|
+
env:
|
|
149
|
+
DATABASE_URL: ${{ secrets.DATABASE_URL }}
|
|
150
|
+
API_KEY: ${{ secrets.API_KEY }}
|
|
151
|
+
run: npm run deploy
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
## Best Practices
|
|
155
|
+
|
|
156
|
+
✅ **Never commit secrets** - Use .gitignore
|
|
157
|
+
✅ **Rotate regularly** - Change keys periodically
|
|
158
|
+
✅ **Least privilege** - Grant minimal access
|
|
159
|
+
✅ **Audit access** - Log who accessed what
|
|
160
|
+
✅ **Separate by environment** - Dev, staging, prod keys
|
|
161
|
+
|
|
162
|
+
## Resources
|
|
163
|
+
|
|
164
|
+
- [AWS Secrets Manager](https://docs.aws.amazon.com/secretsmanager/)
|
|
165
|
+
- [HashiCorp Vault](https://www.vaultproject.io/)
|
|
166
|
+
- [Sealed Secrets](https://github.com/bitnami-labs/sealed-secrets)
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
# Terraform Infrastructure-as-Code
|
|
2
|
+
|
|
3
|
+
Declarative infrastructure provisioning across cloud providers.
|
|
4
|
+
|
|
5
|
+
## Setup
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
brew install terraform
|
|
9
|
+
terraform version
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
## AWS Example
|
|
13
|
+
|
|
14
|
+
```hcl
|
|
15
|
+
terraform {
|
|
16
|
+
required_providers {
|
|
17
|
+
aws = {
|
|
18
|
+
source = "hashicorp/aws"
|
|
19
|
+
version = "~> 5.0"
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
provider "aws" {
|
|
25
|
+
region = "us-east-1"
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
# VPC
|
|
29
|
+
resource "aws_vpc" "main" {
|
|
30
|
+
cidr_block = "10.0.0.0/16"
|
|
31
|
+
enable_dns_hostnames = true
|
|
32
|
+
|
|
33
|
+
tags = {
|
|
34
|
+
Name = "main-vpc"
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
# Subnet
|
|
39
|
+
resource "aws_subnet" "main" {
|
|
40
|
+
vpc_id = aws_vpc.main.id
|
|
41
|
+
cidr_block = "10.0.1.0/24"
|
|
42
|
+
availability_zone = "us-east-1a"
|
|
43
|
+
|
|
44
|
+
tags = {
|
|
45
|
+
Name = "main-subnet"
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
# Security Group
|
|
50
|
+
resource "aws_security_group" "app" {
|
|
51
|
+
vpc_id = aws_vpc.main.id
|
|
52
|
+
|
|
53
|
+
ingress {
|
|
54
|
+
from_port = 80
|
|
55
|
+
to_port = 80
|
|
56
|
+
protocol = "tcp"
|
|
57
|
+
cidr_blocks = ["0.0.0.0/0"]
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
ingress {
|
|
61
|
+
from_port = 443
|
|
62
|
+
to_port = 443
|
|
63
|
+
protocol = "tcp"
|
|
64
|
+
cidr_blocks = ["0.0.0.0/0"]
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
egress {
|
|
68
|
+
from_port = 0
|
|
69
|
+
to_port = 0
|
|
70
|
+
protocol = "-1"
|
|
71
|
+
cidr_blocks = ["0.0.0.0/0"]
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
# EC2 Instance
|
|
76
|
+
resource "aws_instance" "app" {
|
|
77
|
+
ami = "ami-0c55b159cbfafe1f0"
|
|
78
|
+
instance_type = "t3.micro"
|
|
79
|
+
subnet_id = aws_subnet.main.id
|
|
80
|
+
vpc_security_group_ids = [aws_security_group.app.id]
|
|
81
|
+
|
|
82
|
+
tags = {
|
|
83
|
+
Name = "app-server"
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
# RDS Database
|
|
88
|
+
resource "aws_db_instance" "postgres" {
|
|
89
|
+
identifier = "my-postgres-db"
|
|
90
|
+
engine = "postgres"
|
|
91
|
+
engine_version = "14.7"
|
|
92
|
+
instance_class = "db.t3.micro"
|
|
93
|
+
|
|
94
|
+
db_name = "myapp"
|
|
95
|
+
username = "admin"
|
|
96
|
+
password = var.db_password
|
|
97
|
+
|
|
98
|
+
allocated_storage = 20
|
|
99
|
+
skip_final_snapshot = true
|
|
100
|
+
|
|
101
|
+
vpc_security_group_ids = [aws_security_group.app.id]
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
# Outputs
|
|
105
|
+
output "instance_public_ip" {
|
|
106
|
+
value = aws_instance.app.public_ip
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
output "database_endpoint" {
|
|
110
|
+
value = aws_db_instance.postgres.endpoint
|
|
111
|
+
}
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
## Variables
|
|
115
|
+
|
|
116
|
+
```hcl
|
|
117
|
+
# variables.tf
|
|
118
|
+
variable "region" {
|
|
119
|
+
description = "AWS region"
|
|
120
|
+
type = string
|
|
121
|
+
default = "us-east-1"
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
variable "environment" {
|
|
125
|
+
description = "Environment name"
|
|
126
|
+
type = string
|
|
127
|
+
validation {
|
|
128
|
+
condition = contains(["dev", "staging", "prod"], var.environment)
|
|
129
|
+
error_message = "Environment must be dev, staging, or prod."
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
variable "db_password" {
|
|
134
|
+
description = "Database password"
|
|
135
|
+
type = string
|
|
136
|
+
sensitive = true
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
variable "instance_count" {
|
|
140
|
+
description = "Number of instances"
|
|
141
|
+
type = number
|
|
142
|
+
default = 1
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
variable "tags" {
|
|
146
|
+
description = "Common tags"
|
|
147
|
+
type = map(string)
|
|
148
|
+
default = {
|
|
149
|
+
Terraform = "true"
|
|
150
|
+
Environment = "production"
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
## Modules
|
|
156
|
+
|
|
157
|
+
```hcl
|
|
158
|
+
# main.tf
|
|
159
|
+
module "networking" {
|
|
160
|
+
source = "./modules/networking"
|
|
161
|
+
|
|
162
|
+
vpc_cidr = "10.0.0.0/16"
|
|
163
|
+
subnet_cidrs = ["10.0.1.0/24", "10.0.2.0/24"]
|
|
164
|
+
environment = var.environment
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
module "database" {
|
|
168
|
+
source = "./modules/database"
|
|
169
|
+
|
|
170
|
+
engine = "postgres"
|
|
171
|
+
instance_class = "db.t3.micro"
|
|
172
|
+
allocated_storage = 20
|
|
173
|
+
db_name = "myapp"
|
|
174
|
+
db_password = var.db_password
|
|
175
|
+
security_group_id = module.networking.security_group_id
|
|
176
|
+
}
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
## State Management
|
|
180
|
+
|
|
181
|
+
```bash
|
|
182
|
+
# Initialize Terraform
|
|
183
|
+
terraform init
|
|
184
|
+
|
|
185
|
+
# Plan changes
|
|
186
|
+
terraform plan -var-file="prod.tfvars"
|
|
187
|
+
|
|
188
|
+
# Apply changes
|
|
189
|
+
terraform apply -var-file="prod.tfvars" -auto-approve
|
|
190
|
+
|
|
191
|
+
# Destroy resources
|
|
192
|
+
terraform destroy -var-file="prod.tfvars"
|
|
193
|
+
|
|
194
|
+
# View state
|
|
195
|
+
terraform state show aws_instance.app
|
|
196
|
+
terraform state list
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
## Remote State
|
|
200
|
+
|
|
201
|
+
```hcl
|
|
202
|
+
# backend.tf
|
|
203
|
+
terraform {
|
|
204
|
+
backend "s3" {
|
|
205
|
+
bucket = "my-terraform-state"
|
|
206
|
+
key = "prod/terraform.tfstate"
|
|
207
|
+
region = "us-east-1"
|
|
208
|
+
encrypt = true
|
|
209
|
+
dynamodb_table = "terraform-locks"
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
## Best Practices
|
|
215
|
+
|
|
216
|
+
✅ **Use modules** - Organize code logically
|
|
217
|
+
✅ **Version state** - Store in remote backends
|
|
218
|
+
✅ **Use variables** - Separate config from code
|
|
219
|
+
✅ **Plan before apply** - Review changes
|
|
220
|
+
✅ **Lock state** - Prevent concurrent modifications
|
|
221
|
+
|
|
222
|
+
## Resources
|
|
223
|
+
|
|
224
|
+
- [Terraform Documentation](https://www.terraform.io/docs)
|
|
225
|
+
- [AWS Provider](https://registry.terraform.io/providers/hashicorp/aws/latest/docs)
|
|
226
|
+
- [Registry](https://registry.terraform.io/)
|