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,212 @@
|
|
|
1
|
+
# OWASP Security Top 10
|
|
2
|
+
|
|
3
|
+
Common vulnerabilities and how to prevent them.
|
|
4
|
+
|
|
5
|
+
## Injection
|
|
6
|
+
|
|
7
|
+
```typescript
|
|
8
|
+
// Bad: SQL injection
|
|
9
|
+
const user = await db.query(`SELECT * FROM users WHERE email = '${email}'`);
|
|
10
|
+
|
|
11
|
+
// Good: Parameterized queries
|
|
12
|
+
const user = await db.query('SELECT * FROM users WHERE email = ?', [email]);
|
|
13
|
+
|
|
14
|
+
// Good: ORM usage
|
|
15
|
+
const user = await User.findOne({ email });
|
|
16
|
+
|
|
17
|
+
// Bad: Command injection
|
|
18
|
+
const result = execSync(`ffmpeg -i ${userInput}.mp4`);
|
|
19
|
+
|
|
20
|
+
// Good: Use array form
|
|
21
|
+
const result = spawnSync('ffmpeg', ['-i', userInput + '.mp4']);
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## Broken Authentication
|
|
25
|
+
|
|
26
|
+
```typescript
|
|
27
|
+
// Good: Hash passwords
|
|
28
|
+
import bcrypt from 'bcrypt';
|
|
29
|
+
|
|
30
|
+
const hash = await bcrypt.hash(password, 10);
|
|
31
|
+
await db.users.create({ email, password: hash });
|
|
32
|
+
|
|
33
|
+
// Good: Session management
|
|
34
|
+
import session from 'express-session';
|
|
35
|
+
|
|
36
|
+
app.use(session({
|
|
37
|
+
secret: process.env.SESSION_SECRET,
|
|
38
|
+
resave: false,
|
|
39
|
+
saveUninitialized: false,
|
|
40
|
+
cookie: {
|
|
41
|
+
httpOnly: true,
|
|
42
|
+
secure: true, // HTTPS only
|
|
43
|
+
sameSite: 'strict',
|
|
44
|
+
maxAge: 1000 * 60 * 60 * 24 // 24 hours
|
|
45
|
+
}
|
|
46
|
+
}));
|
|
47
|
+
|
|
48
|
+
// Good: MFA
|
|
49
|
+
import speakeasy from 'speakeasy';
|
|
50
|
+
|
|
51
|
+
const secret = speakeasy.generateSecret({ name: 'MyApp' });
|
|
52
|
+
const verified = speakeasy.totp.verify({
|
|
53
|
+
secret: user.totpSecret,
|
|
54
|
+
encoding: 'base32',
|
|
55
|
+
token: userToken,
|
|
56
|
+
window: 2
|
|
57
|
+
});
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
## Sensitive Data Exposure
|
|
61
|
+
|
|
62
|
+
```typescript
|
|
63
|
+
// Bad: Logging passwords
|
|
64
|
+
console.log('User:', { password: user.password });
|
|
65
|
+
|
|
66
|
+
// Good: Don't log sensitive data
|
|
67
|
+
console.log('User:', { id: user.id, email: user.email });
|
|
68
|
+
|
|
69
|
+
// Good: Encrypt sensitive data
|
|
70
|
+
import crypto from 'crypto';
|
|
71
|
+
|
|
72
|
+
function encrypt(data: string, key: string): string {
|
|
73
|
+
const iv = crypto.randomBytes(16);
|
|
74
|
+
const cipher = crypto.createCipheriv('aes-256-gcm', Buffer.from(key), iv);
|
|
75
|
+
|
|
76
|
+
let encrypted = cipher.update(data, 'utf8', 'hex');
|
|
77
|
+
encrypted += cipher.final('hex');
|
|
78
|
+
|
|
79
|
+
return iv.toString('hex') + encrypted;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// Good: HTTPS only
|
|
83
|
+
app.use((req, res, next) => {
|
|
84
|
+
if (!req.secure) {
|
|
85
|
+
return res.redirect(301, `https://${req.host}${req.url}`);
|
|
86
|
+
}
|
|
87
|
+
next();
|
|
88
|
+
});
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
## XML External Entities (XXE)
|
|
92
|
+
|
|
93
|
+
```typescript
|
|
94
|
+
// Bad: Parse untrusted XML
|
|
95
|
+
const xmlDoc = new DOMParser().parseFromString(userXml, 'text/xml');
|
|
96
|
+
|
|
97
|
+
// Good: Disable external entities
|
|
98
|
+
const options = {
|
|
99
|
+
resolveExternalEntities: false,
|
|
100
|
+
noent: false,
|
|
101
|
+
nocdata: true
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
const xmlDoc = parseXml(userXml, options);
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
## Broken Access Control
|
|
108
|
+
|
|
109
|
+
```typescript
|
|
110
|
+
// Bad: No authorization check
|
|
111
|
+
app.get('/api/users/:id', async (req, res) => {
|
|
112
|
+
const user = await db.users.findById(req.params.id);
|
|
113
|
+
res.json(user);
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
// Good: Check authorization
|
|
117
|
+
app.get('/api/users/:id', async (req, res) => {
|
|
118
|
+
const userId = req.params.id;
|
|
119
|
+
const currentUser = req.user;
|
|
120
|
+
|
|
121
|
+
// Only allow users to see their own data
|
|
122
|
+
if (currentUser.id !== userId && currentUser.role !== 'admin') {
|
|
123
|
+
return res.status(403).json({ error: 'Forbidden' });
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
const user = await db.users.findById(userId);
|
|
127
|
+
res.json(user);
|
|
128
|
+
});
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
## Security Misconfiguration
|
|
132
|
+
|
|
133
|
+
```typescript
|
|
134
|
+
// Good: Set security headers
|
|
135
|
+
import helmet from 'helmet';
|
|
136
|
+
|
|
137
|
+
app.use(helmet());
|
|
138
|
+
|
|
139
|
+
// Good: Disable debug mode in production
|
|
140
|
+
if (process.env.NODE_ENV === 'production') {
|
|
141
|
+
app.set('env', 'production');
|
|
142
|
+
app.disable('x-powered-by');
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
// Good: Validate environment
|
|
146
|
+
const requiredEnvVars = [
|
|
147
|
+
'DATABASE_URL',
|
|
148
|
+
'JWT_SECRET',
|
|
149
|
+
'SESSION_SECRET'
|
|
150
|
+
];
|
|
151
|
+
|
|
152
|
+
requiredEnvVars.forEach(envVar => {
|
|
153
|
+
if (!process.env[envVar]) {
|
|
154
|
+
throw new Error(`Missing required env var: ${envVar}`);
|
|
155
|
+
}
|
|
156
|
+
});
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
## Cross-Site Scripting (XSS)
|
|
160
|
+
|
|
161
|
+
```typescript
|
|
162
|
+
// Bad: Raw HTML
|
|
163
|
+
res.send(`<h1>${title}</h1>`);
|
|
164
|
+
|
|
165
|
+
// Good: Escape output
|
|
166
|
+
import { escapeHtml } from 'lodash';
|
|
167
|
+
|
|
168
|
+
res.send(`<h1>${escapeHtml(title)}</h1>`);
|
|
169
|
+
|
|
170
|
+
// Good: React escapes by default
|
|
171
|
+
<h1>{title}</h1> {/* Safe */}
|
|
172
|
+
|
|
173
|
+
// Good: Content Security Policy
|
|
174
|
+
app.use(helmet.contentSecurityPolicy({
|
|
175
|
+
directives: {
|
|
176
|
+
defaultSrc: ["'self'"],
|
|
177
|
+
styleSrc: ["'self'", "'unsafe-inline'"],
|
|
178
|
+
scriptSrc: ["'self'"]
|
|
179
|
+
}
|
|
180
|
+
}));
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
## Insecure Deserialization
|
|
184
|
+
|
|
185
|
+
```typescript
|
|
186
|
+
// Bad: Deserialize untrusted data
|
|
187
|
+
const obj = JSON.parse(userInput);
|
|
188
|
+
|
|
189
|
+
// Good: Validate schema
|
|
190
|
+
import { z } from 'zod';
|
|
191
|
+
|
|
192
|
+
const schema = z.object({
|
|
193
|
+
name: z.string(),
|
|
194
|
+
email: z.string().email()
|
|
195
|
+
});
|
|
196
|
+
|
|
197
|
+
const validated = schema.parse(JSON.parse(userInput));
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
## Best Practices
|
|
201
|
+
|
|
202
|
+
✅ **Input validation** - Always validate user input
|
|
203
|
+
✅ **Output encoding** - Escape data before displaying
|
|
204
|
+
✅ **Error handling** - Don't expose sensitive info in errors
|
|
205
|
+
✅ **Security headers** - Use helmet.js
|
|
206
|
+
✅ **HTTPS** - Always use HTTPS in production
|
|
207
|
+
✅ **Secrets rotation** - Regularly change API keys
|
|
208
|
+
|
|
209
|
+
## Resources
|
|
210
|
+
|
|
211
|
+
- [OWASP Top 10](https://owasp.org/www-project-top-ten/)
|
|
212
|
+
- [OWASP Cheat Sheets](https://cheatsheetseries.owasp.org/)
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# Secrets Rotation
|
|
2
|
+
|
|
3
|
+
Automating secret updates and rotation.
|
|
4
|
+
|
|
5
|
+
## Rotation Strategy
|
|
6
|
+
|
|
7
|
+
```typescript
|
|
8
|
+
interface SecretMetadata {
|
|
9
|
+
name: string;
|
|
10
|
+
createdAt: Date;
|
|
11
|
+
rotatedAt: Date;
|
|
12
|
+
expiresAt: Date;
|
|
13
|
+
status: 'active' | 'rotating' | 'expired';
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
async function rotateSecret(secretName: string) {
|
|
17
|
+
// Create new secret
|
|
18
|
+
const newSecret = generateSecureSecret();
|
|
19
|
+
|
|
20
|
+
// Store new secret with metadata
|
|
21
|
+
await vault.write(`secret/${secretName}-new`, {
|
|
22
|
+
value: newSecret,
|
|
23
|
+
createdAt: new Date(),
|
|
24
|
+
expiresAt: new Date(Date.now() + 30 * 24 * 60 * 60 * 1000)
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
// Double-write period (both old and new work)
|
|
28
|
+
// Update application to accept both
|
|
29
|
+
|
|
30
|
+
// After validation, retire old secret
|
|
31
|
+
await vault.delete(`secret/${secretName}`);
|
|
32
|
+
|
|
33
|
+
// Rename new to current
|
|
34
|
+
await vault.rename(`secret/${secretName}-new`, `secret/${secretName}`);
|
|
35
|
+
}
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## Automated Rotation
|
|
39
|
+
|
|
40
|
+
```typescript
|
|
41
|
+
import cron from 'node-cron';
|
|
42
|
+
|
|
43
|
+
// Rotate secrets monthly
|
|
44
|
+
cron.schedule('0 0 1 * *', async () => {
|
|
45
|
+
const secrets = ['API_KEY', 'DB_PASSWORD', 'JWT_SECRET'];
|
|
46
|
+
|
|
47
|
+
for (const secret of secrets) {
|
|
48
|
+
await rotateSecret(secret);
|
|
49
|
+
console.log(`Rotated ${secret}`);
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## Best Practices
|
|
55
|
+
|
|
56
|
+
✅ **Regular rotation** - Monthly minimum
|
|
57
|
+
✅ **Double-write period** - Gradual transition
|
|
58
|
+
✅ **Audit logging** - Track all rotations
|
|
59
|
+
✅ **Automation** - Scheduled rotation
|
|
60
|
+
✅ **Monitoring** - Alert on rotation failures
|
|
61
|
+
|
|
62
|
+
## Resources
|
|
63
|
+
|
|
64
|
+
- [Secrets Management](https://www.vaultproject.io/docs/secrets/rotation)
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
# Content SEO
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
Optimize content for search intent, keyword targeting, and organic traffic growth.
|
|
5
|
+
|
|
6
|
+
## Keyword Research Structure
|
|
7
|
+
|
|
8
|
+
```typescript
|
|
9
|
+
interface KeywordData {
|
|
10
|
+
keyword: string;
|
|
11
|
+
intent: 'informational' | 'navigational' | 'commercial' | 'transactional';
|
|
12
|
+
volume: number;
|
|
13
|
+
difficulty: number;
|
|
14
|
+
cpc: number;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
// Content cluster approach
|
|
18
|
+
const pillarPage = { keyword: 'project management software', type: 'pillar' };
|
|
19
|
+
const clusterPages = [
|
|
20
|
+
{ keyword: 'project management software for small teams', type: 'cluster' },
|
|
21
|
+
{ keyword: 'project management software free', type: 'cluster' },
|
|
22
|
+
{ keyword: 'best project management tools 2024', type: 'cluster' },
|
|
23
|
+
];
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## SEO-Optimized Blog Post Structure
|
|
27
|
+
|
|
28
|
+
```tsx
|
|
29
|
+
// app/blog/[slug]/page.tsx
|
|
30
|
+
export default function BlogPost({ post }: { post: Post }) {
|
|
31
|
+
return (
|
|
32
|
+
<article className="max-w-prose mx-auto">
|
|
33
|
+
{/* H1 — includes primary keyword */}
|
|
34
|
+
<h1 className="text-4xl font-bold">{post.title}</h1>
|
|
35
|
+
|
|
36
|
+
{/* Author, date, reading time */}
|
|
37
|
+
<div className="text-gray-500 text-sm mt-2">
|
|
38
|
+
By {post.author} · {formatDate(post.publishedAt)} · {post.readingTime} min read
|
|
39
|
+
</div>
|
|
40
|
+
|
|
41
|
+
{/* Table of contents for long posts */}
|
|
42
|
+
<TableOfContents headings={post.headings} />
|
|
43
|
+
|
|
44
|
+
{/* Content with proper heading hierarchy H2 → H3 */}
|
|
45
|
+
<div
|
|
46
|
+
className="prose prose-lg mt-8"
|
|
47
|
+
dangerouslySetInnerHTML={{ __html: post.content }}
|
|
48
|
+
/>
|
|
49
|
+
|
|
50
|
+
{/* Internal links to related posts */}
|
|
51
|
+
<RelatedPosts posts={post.relatedPosts} />
|
|
52
|
+
</article>
|
|
53
|
+
);
|
|
54
|
+
}
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
## Internal Linking Strategy
|
|
58
|
+
|
|
59
|
+
```typescript
|
|
60
|
+
// Auto-suggest internal links based on keyword matching
|
|
61
|
+
async function findRelatedContent(currentSlug: string, keywords: string[]) {
|
|
62
|
+
return prisma.post.findMany({
|
|
63
|
+
where: {
|
|
64
|
+
slug: { not: currentSlug },
|
|
65
|
+
OR: keywords.map(kw => ({ title: { contains: kw, mode: 'insensitive' } })),
|
|
66
|
+
},
|
|
67
|
+
take: 5,
|
|
68
|
+
select: { slug: true, title: true },
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
## Content Quality Checklist
|
|
74
|
+
```
|
|
75
|
+
✅ Primary keyword in title, H1, first 100 words, URL
|
|
76
|
+
✅ Target keyword density: 1-2% (natural use, not stuffing)
|
|
77
|
+
✅ H2/H3 headings use related keywords and questions
|
|
78
|
+
✅ Images have descriptive alt text with keywords
|
|
79
|
+
✅ Internal links to 3+ related pages
|
|
80
|
+
✅ External links to authoritative sources
|
|
81
|
+
✅ Content matches search intent (informational = how-to, transactional = buy now)
|
|
82
|
+
✅ Word count appropriate for competition (check top 3 rankings)
|
|
83
|
+
✅ Meta description includes keyword and CTA
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
## Best Practices
|
|
87
|
+
- Write for humans first, optimize for search second
|
|
88
|
+
- Use question-based H2s (How to..., What is..., Why...)
|
|
89
|
+
- Update content annually to maintain rankings
|
|
90
|
+
- Focus on topics with genuine user demand, not just high volume
|
|
91
|
+
|
|
92
|
+
## Resources
|
|
93
|
+
- [Ahrefs blog](https://ahrefs.com/blog)
|
|
94
|
+
- [Search Engine Land](https://searchengineland.com)
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
# Technical SEO
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
Optimize crawlability, indexability, and page speed for better search engine rankings.
|
|
5
|
+
|
|
6
|
+
## Next.js Metadata API
|
|
7
|
+
|
|
8
|
+
```typescript
|
|
9
|
+
// app/page.tsx
|
|
10
|
+
import type { Metadata } from 'next';
|
|
11
|
+
|
|
12
|
+
export const metadata: Metadata = {
|
|
13
|
+
title: 'Page Title | Site Name',
|
|
14
|
+
description: 'Compelling description under 160 characters with target keyword.',
|
|
15
|
+
keywords: ['keyword1', 'keyword2'],
|
|
16
|
+
openGraph: {
|
|
17
|
+
title: 'Page Title',
|
|
18
|
+
description: 'Description for social sharing',
|
|
19
|
+
url: 'https://example.com/page',
|
|
20
|
+
siteName: 'Site Name',
|
|
21
|
+
images: [{ url: '/og-image.png', width: 1200, height: 630 }],
|
|
22
|
+
type: 'website',
|
|
23
|
+
},
|
|
24
|
+
twitter: { card: 'summary_large_image', title: 'Page Title', description: '...' },
|
|
25
|
+
alternates: { canonical: 'https://example.com/page' },
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
// Dynamic metadata for product pages
|
|
29
|
+
export async function generateMetadata({ params }: Props): Promise<Metadata> {
|
|
30
|
+
const product = await getProduct(params.slug);
|
|
31
|
+
return {
|
|
32
|
+
title: `${product.name} | Shop`,
|
|
33
|
+
description: product.description.slice(0, 160),
|
|
34
|
+
openGraph: { images: [{ url: product.imageUrl }] },
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## Sitemap (Next.js)
|
|
40
|
+
|
|
41
|
+
```typescript
|
|
42
|
+
// app/sitemap.ts
|
|
43
|
+
import { MetadataRoute } from 'next';
|
|
44
|
+
import { prisma } from '@/lib/db';
|
|
45
|
+
|
|
46
|
+
export default async function sitemap(): Promise<MetadataRoute.Sitemap> {
|
|
47
|
+
const posts = await prisma.post.findMany({ select: { slug: true, updatedAt: true } });
|
|
48
|
+
|
|
49
|
+
return [
|
|
50
|
+
{ url: 'https://example.com', lastModified: new Date(), changeFrequency: 'weekly', priority: 1 },
|
|
51
|
+
{ url: 'https://example.com/pricing', lastModified: new Date(), changeFrequency: 'monthly', priority: 0.8 },
|
|
52
|
+
...posts.map(post => ({
|
|
53
|
+
url: `https://example.com/blog/${post.slug}`,
|
|
54
|
+
lastModified: post.updatedAt,
|
|
55
|
+
changeFrequency: 'weekly' as const,
|
|
56
|
+
priority: 0.6,
|
|
57
|
+
})),
|
|
58
|
+
];
|
|
59
|
+
}
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
## Structured Data (JSON-LD)
|
|
63
|
+
|
|
64
|
+
```tsx
|
|
65
|
+
// Article structured data
|
|
66
|
+
export function ArticleSchema({ article }: { article: Article }) {
|
|
67
|
+
const schema = {
|
|
68
|
+
'@context': 'https://schema.org',
|
|
69
|
+
'@type': 'Article',
|
|
70
|
+
headline: article.title,
|
|
71
|
+
datePublished: article.publishedAt,
|
|
72
|
+
dateModified: article.updatedAt,
|
|
73
|
+
author: { '@type': 'Person', name: article.author.name },
|
|
74
|
+
image: article.coverImage,
|
|
75
|
+
description: article.excerpt,
|
|
76
|
+
};
|
|
77
|
+
return <script type="application/ld+json" dangerouslySetInnerHTML={{ __html: JSON.stringify(schema) }} />;
|
|
78
|
+
}
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
## robots.txt
|
|
82
|
+
|
|
83
|
+
```typescript
|
|
84
|
+
// app/robots.ts
|
|
85
|
+
export default function robots() {
|
|
86
|
+
return {
|
|
87
|
+
rules: { userAgent: '*', allow: '/', disallow: ['/api/', '/admin/'] },
|
|
88
|
+
sitemap: 'https://example.com/sitemap.xml',
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
## Best Practices
|
|
94
|
+
- Use canonical URLs to prevent duplicate content penalties
|
|
95
|
+
- Keep title tags under 60 chars, meta descriptions under 160
|
|
96
|
+
- Generate XML sitemaps and submit to Google Search Console
|
|
97
|
+
- Ensure Core Web Vitals pass — Google uses them as ranking signals
|
|
98
|
+
|
|
99
|
+
## Resources
|
|
100
|
+
- [Google Search Central](https://developers.google.com/search)
|
|
101
|
+
- [Next.js metadata docs](https://nextjs.org/docs/app/building-your-application/optimizing/metadata)
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
# Serverless Framework
|
|
2
|
+
|
|
3
|
+
Framework for building and deploying serverless applications across AWS, Azure, GCP, and Kubernetes.
|
|
4
|
+
|
|
5
|
+
## Setup
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install -g serverless
|
|
9
|
+
npm install --save-dev serverless aws-sdk
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
## serverless.yml
|
|
13
|
+
|
|
14
|
+
```yaml
|
|
15
|
+
service: my-api
|
|
16
|
+
|
|
17
|
+
frameworkVersion: '4'
|
|
18
|
+
|
|
19
|
+
provider:
|
|
20
|
+
name: aws
|
|
21
|
+
runtime: nodejs20.x
|
|
22
|
+
region: us-east-1
|
|
23
|
+
environment:
|
|
24
|
+
TABLE_NAME: users
|
|
25
|
+
STAGE: ${self:provider.stage}
|
|
26
|
+
|
|
27
|
+
plugins:
|
|
28
|
+
- serverless-dynamodb-local
|
|
29
|
+
- serverless-offline
|
|
30
|
+
|
|
31
|
+
functions:
|
|
32
|
+
getUser:
|
|
33
|
+
handler: handlers/getUser.handler
|
|
34
|
+
events:
|
|
35
|
+
- http:
|
|
36
|
+
path: users/{id}
|
|
37
|
+
method: get
|
|
38
|
+
cors: true
|
|
39
|
+
|
|
40
|
+
createUser:
|
|
41
|
+
handler: handlers/createUser.handler
|
|
42
|
+
events:
|
|
43
|
+
- http:
|
|
44
|
+
path: users
|
|
45
|
+
method: post
|
|
46
|
+
cors: true
|
|
47
|
+
|
|
48
|
+
processEvent:
|
|
49
|
+
handler: handlers/processEvent.handler
|
|
50
|
+
events:
|
|
51
|
+
- stream:
|
|
52
|
+
type: dynamodb
|
|
53
|
+
arn:
|
|
54
|
+
Fn::GetAtt: [UsersTable, StreamArn]
|
|
55
|
+
batchSize: 100
|
|
56
|
+
|
|
57
|
+
resources:
|
|
58
|
+
Resources:
|
|
59
|
+
UsersTable:
|
|
60
|
+
Type: AWS::DynamoDB::Table
|
|
61
|
+
Properties:
|
|
62
|
+
TableName: ${self:provider.environment.TABLE_NAME}
|
|
63
|
+
BillingMode: PAY_PER_REQUEST
|
|
64
|
+
AttributeDefinitions:
|
|
65
|
+
- AttributeName: id
|
|
66
|
+
AttributeType: S
|
|
67
|
+
KeySchema:
|
|
68
|
+
- AttributeName: id
|
|
69
|
+
KeyType: HASH
|
|
70
|
+
StreamSpecification:
|
|
71
|
+
StreamViewType: NEW_AND_OLD_IMAGES
|
|
72
|
+
|
|
73
|
+
package:
|
|
74
|
+
patterns:
|
|
75
|
+
- '!node_modules/**'
|
|
76
|
+
- '!.git/**'
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
## Handler Functions
|
|
80
|
+
|
|
81
|
+
```typescript
|
|
82
|
+
// handlers/getUser.ts
|
|
83
|
+
import { APIGatewayProxyHandler } from 'aws-lambda';
|
|
84
|
+
import { DynamoDBDocumentClient, GetCommand } from '@aws-sdk/lib-dynamodb';
|
|
85
|
+
import { DynamoDBClient } from '@aws-sdk/client-dynamodb';
|
|
86
|
+
|
|
87
|
+
const db = DynamoDBDocumentClient.from(new DynamoDBClient({}));
|
|
88
|
+
|
|
89
|
+
export const handler: APIGatewayProxyHandler = async (event) => {
|
|
90
|
+
const { id } = event.pathParameters || {};
|
|
91
|
+
|
|
92
|
+
try {
|
|
93
|
+
const { Item } = await db.send(new GetCommand({
|
|
94
|
+
TableName: process.env.TABLE_NAME,
|
|
95
|
+
Key: { id }
|
|
96
|
+
}));
|
|
97
|
+
|
|
98
|
+
return {
|
|
99
|
+
statusCode: 200,
|
|
100
|
+
body: JSON.stringify(Item)
|
|
101
|
+
};
|
|
102
|
+
} catch (error) {
|
|
103
|
+
return {
|
|
104
|
+
statusCode: 500,
|
|
105
|
+
body: JSON.stringify({ error: 'Failed to fetch user' })
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
};
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
## Environment Management
|
|
112
|
+
|
|
113
|
+
```bash
|
|
114
|
+
# Deploy to dev
|
|
115
|
+
serverless deploy --stage dev
|
|
116
|
+
|
|
117
|
+
# Deploy to production
|
|
118
|
+
serverless deploy --stage prod
|
|
119
|
+
|
|
120
|
+
# View logs
|
|
121
|
+
serverless logs -f getUser --stage prod
|
|
122
|
+
|
|
123
|
+
# Remove stack
|
|
124
|
+
serverless remove --stage dev
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
## Local Development
|
|
128
|
+
|
|
129
|
+
```bash
|
|
130
|
+
# Install local DynamoDB
|
|
131
|
+
npm install -D serverless-dynamodb-local
|
|
132
|
+
|
|
133
|
+
# Start offline
|
|
134
|
+
serverless offline start --stage local
|
|
135
|
+
|
|
136
|
+
# With DynamoDB local
|
|
137
|
+
serverless dynamodb start
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
## Best Practices
|
|
141
|
+
|
|
142
|
+
✅ **Use environment variables** - Manage config per stage
|
|
143
|
+
✅ **Minimize cold starts** - Bundle efficiently, use provisioned concurrency
|
|
144
|
+
✅ **Error handling** - Return proper HTTP status codes
|
|
145
|
+
✅ **Logging** - Use structured logging for CloudWatch
|
|
146
|
+
✅ **Testing** - Test handlers locally before deployment
|
|
147
|
+
|
|
148
|
+
## Resources
|
|
149
|
+
|
|
150
|
+
- [Serverless Framework Docs](https://www.serverless.com/framework/docs)
|
|
151
|
+
- [AWS Lambda Best Practices](https://docs.aws.amazon.com/lambda/latest/dg/best-practices.html)
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# Production-Ready Skill Implementation
|
|
2
|
+
|
|
3
|
+
## Setup & Installation
|
|
4
|
+
|
|
5
|
+
Detailed installation and configuration steps for the technology.
|
|
6
|
+
|
|
7
|
+
## Core Concepts
|
|
8
|
+
|
|
9
|
+
Fundamental patterns and approaches.
|
|
10
|
+
|
|
11
|
+
## Implementation Examples
|
|
12
|
+
|
|
13
|
+
```typescript
|
|
14
|
+
// Real production code examples
|
|
15
|
+
// with error handling and best practices
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## Advanced Patterns
|
|
19
|
+
|
|
20
|
+
Complex scenarios and optimization techniques.
|
|
21
|
+
|
|
22
|
+
## Performance Optimization
|
|
23
|
+
|
|
24
|
+
Tips for maximizing efficiency and speed.
|
|
25
|
+
|
|
26
|
+
## Security Considerations
|
|
27
|
+
|
|
28
|
+
Security best practices specific to this technology.
|
|
29
|
+
|
|
30
|
+
## Testing
|
|
31
|
+
|
|
32
|
+
How to properly test this feature.
|
|
33
|
+
|
|
34
|
+
## Monitoring & Debugging
|
|
35
|
+
|
|
36
|
+
Tools and techniques for production support.
|
|
37
|
+
|
|
38
|
+
## Best Practices
|
|
39
|
+
|
|
40
|
+
✅ Key recommendations
|
|
41
|
+
✅ Common pitfalls to avoid
|
|
42
|
+
✅ Performance considerations
|
|
43
|
+
✅ Security measures
|
|
44
|
+
✅ Production readiness
|
|
45
|
+
|
|
46
|
+
## Resources
|
|
47
|
+
|
|
48
|
+
- Official documentation
|
|
49
|
+
- Community guides
|
|
50
|
+
- Performance benchmarks
|