cfsa-antigravity 1.0.0
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/bin/cli.mjs +324 -0
- package/package.json +34 -0
- package/template/.agent/instructions/commands.md +48 -0
- package/template/.agent/instructions/patterns.md +61 -0
- package/template/.agent/instructions/structure.md +29 -0
- package/template/.agent/instructions/tech-stack.md +43 -0
- package/template/.agent/instructions/workflow.md +41 -0
- package/template/.agent/kit-sync.md +15 -0
- package/template/.agent/rules/boundary-not-placeholder.md +146 -0
- package/template/.agent/rules/completion-checklist.md +48 -0
- package/template/.agent/rules/decision-classification.md +103 -0
- package/template/.agent/rules/extensibility.md +47 -0
- package/template/.agent/rules/question-vs-command.md +81 -0
- package/template/.agent/rules/security-first.md +43 -0
- package/template/.agent/rules/specificity-standards.md +54 -0
- package/template/.agent/rules/tdd-contract-first.md +57 -0
- package/template/.agent/rules/vertical-slices.md +42 -0
- package/template/.agent/skill-library/MANIFEST.md +480 -0
- package/template/.agent/skill-library/README.md +38 -0
- package/template/.agent/skill-library/meta/brand-guidelines/SKILL.md +73 -0
- package/template/.agent/skill-library/meta/claude-code/README.md +9 -0
- package/template/.agent/skill-library/meta/claude-code/agent-development/SKILL.md +415 -0
- package/template/.agent/skill-library/meta/claude-code/hook-development/SKILL.md +712 -0
- package/template/.agent/skill-library/meta/claude-code/plugin-structure/SKILL.md +476 -0
- package/template/.agent/skill-library/meta/git-advanced/SKILL.md +972 -0
- package/template/.agent/skill-library/meta/mcp-builder/SKILL.md +236 -0
- package/template/.agent/skill-library/meta/product-marketing-context/SKILL.md +241 -0
- package/template/.agent/skill-library/meta/regex-patterns/SKILL.md +751 -0
- package/template/.agent/skill-library/meta/tmux-processes/SKILL.md +210 -0
- package/template/.agent/skill-library/meta/using-tmux-for-interactive-commands/SKILL.md +178 -0
- package/template/.agent/skill-library/stack/3d/threejs-pro/SKILL.md +300 -0
- package/template/.agent/skill-library/stack/ai/ai-sdk/SKILL.md +77 -0
- package/template/.agent/skill-library/stack/ai/langchain/SKILL.md +530 -0
- package/template/.agent/skill-library/stack/ai/ollama/SKILL.md +321 -0
- package/template/.agent/skill-library/stack/ai/openai-sdk/SKILL.md +549 -0
- package/template/.agent/skill-library/stack/analytics/google-analytics/SKILL.md +153 -0
- package/template/.agent/skill-library/stack/api/graphql/SKILL.md +1061 -0
- package/template/.agent/skill-library/stack/api/trpc/SKILL.md +576 -0
- package/template/.agent/skill-library/stack/auth/authjs/SKILL.md +569 -0
- package/template/.agent/skill-library/stack/auth/clerk/SKILL.md +590 -0
- package/template/.agent/skill-library/stack/auth/firebase-auth/SKILL.md +734 -0
- package/template/.agent/skill-library/stack/cms/payload-cms/SKILL.md +573 -0
- package/template/.agent/skill-library/stack/cms/shopify/SKILL.md +1193 -0
- package/template/.agent/skill-library/stack/cms/wordpress/SKILL.md +1104 -0
- package/template/.agent/skill-library/stack/css/sass-scss/SKILL.md +1121 -0
- package/template/.agent/skill-library/stack/css/tailwind-css-patterns/SKILL.md +863 -0
- package/template/.agent/skill-library/stack/css/tailwind-design-system/SKILL.md +490 -0
- package/template/.agent/skill-library/stack/css/vanilla-css/SKILL.md +1078 -0
- package/template/.agent/skill-library/stack/databases/clickhouse/SKILL.md +311 -0
- package/template/.agent/skill-library/stack/databases/influxdb/SKILL.md +280 -0
- package/template/.agent/skill-library/stack/databases/lancedb/SKILL.md +415 -0
- package/template/.agent/skill-library/stack/databases/mongodb/SKILL.md +1169 -0
- package/template/.agent/skill-library/stack/databases/neo4j/SKILL.md +839 -0
- package/template/.agent/skill-library/stack/databases/pgvector/SKILL.md +241 -0
- package/template/.agent/skill-library/stack/databases/pinecone/SKILL.md +212 -0
- package/template/.agent/skill-library/stack/databases/postgresql/SKILL.md +658 -0
- package/template/.agent/skill-library/stack/databases/qdrant/SKILL.md +312 -0
- package/template/.agent/skill-library/stack/databases/redis/SKILL.md +1079 -0
- package/template/.agent/skill-library/stack/databases/spacetimedb/SKILL.md +532 -0
- package/template/.agent/skill-library/stack/databases/sqlite/SKILL.md +1132 -0
- package/template/.agent/skill-library/stack/databases/supabase/SKILL.md +640 -0
- package/template/.agent/skill-library/stack/databases/surrealdb-expert/SKILL.md +945 -0
- package/template/.agent/skill-library/stack/databases/timescaledb/SKILL.md +745 -0
- package/template/.agent/skill-library/stack/databases/weaviate/SKILL.md +218 -0
- package/template/.agent/skill-library/stack/devops/github-actions/SKILL.md +554 -0
- package/template/.agent/skill-library/stack/devops/kubernetes/SKILL.md +950 -0
- package/template/.agent/skill-library/stack/devops/nginx/SKILL.md +841 -0
- package/template/.agent/skill-library/stack/devops/terraform/SKILL.md +860 -0
- package/template/.agent/skill-library/stack/email/resend/SKILL.md +391 -0
- package/template/.agent/skill-library/stack/engines/godot/SKILL.md +488 -0
- package/template/.agent/skill-library/stack/extensions/chrome-extension/SKILL.md +375 -0
- package/template/.agent/skill-library/stack/extensions/vscode-extension/SKILL.md +453 -0
- package/template/.agent/skill-library/stack/frameworks/astro-framework/SKILL.md +162 -0
- package/template/.agent/skill-library/stack/frameworks/electron/SKILL.md +1286 -0
- package/template/.agent/skill-library/stack/frameworks/fastapi/SKILL.md +650 -0
- package/template/.agent/skill-library/stack/frameworks/hono/SKILL.md +90 -0
- package/template/.agent/skill-library/stack/frameworks/nestjs/SKILL.md +878 -0
- package/template/.agent/skill-library/stack/frameworks/nextjs/SKILL.md +635 -0
- package/template/.agent/skill-library/stack/frameworks/nuxt/SKILL.md +564 -0
- package/template/.agent/skill-library/stack/frameworks/sveltekit/SKILL.md +614 -0
- package/template/.agent/skill-library/stack/frameworks/tauri/SKILL.md +920 -0
- package/template/.agent/skill-library/stack/gamedev/godot/SKILL.md +1032 -0
- package/template/.agent/skill-library/stack/gamedev/unity/SKILL.md +1175 -0
- package/template/.agent/skill-library/stack/hosting/aws/SKILL.md +467 -0
- package/template/.agent/skill-library/stack/hosting/cloudflare/SKILL.md +201 -0
- package/template/.agent/skill-library/stack/hosting/docker-expert/SKILL.md +409 -0
- package/template/.agent/skill-library/stack/hosting/vercel/SKILL.md +484 -0
- package/template/.agent/skill-library/stack/languages/bash-scripting/SKILL.md +773 -0
- package/template/.agent/skill-library/stack/languages/c-cpp/SKILL.md +712 -0
- package/template/.agent/skill-library/stack/languages/gdscript/SKILL.md +789 -0
- package/template/.agent/skill-library/stack/languages/go/SKILL.md +664 -0
- package/template/.agent/skill-library/stack/languages/java/SKILL.md +778 -0
- package/template/.agent/skill-library/stack/languages/kotlin/SKILL.md +665 -0
- package/template/.agent/skill-library/stack/languages/python/SKILL.md +678 -0
- package/template/.agent/skill-library/stack/languages/rust/SKILL.md +673 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/SKILL.md +141 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/advanced-generics.md +90 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/branded-types.md +57 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/builder-pattern.md +71 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/common-pitfalls.md +135 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/conditional-types.md +27 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/decorators.md +98 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/discriminated-unions.md +62 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/mapped-types.md +53 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/performance-best-practices.md +104 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/template-literal-types.md +49 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/testing-types.md +112 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/type-guards.md +70 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/type-inference.md +101 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/utility-types.md +98 -0
- package/template/.agent/skill-library/stack/languages/vanilla-javascript/SKILL.md +803 -0
- package/template/.agent/skill-library/stack/messaging/kafka/SKILL.md +235 -0
- package/template/.agent/skill-library/stack/mobile/expo-react-native/SKILL.md +665 -0
- package/template/.agent/skill-library/stack/mobile/flutter/SKILL.md +316 -0
- package/template/.agent/skill-library/stack/mobile/react-native/SKILL.md +337 -0
- package/template/.agent/skill-library/stack/monitoring/posthog/SKILL.md +396 -0
- package/template/.agent/skill-library/stack/monitoring/sentry/SKILL.md +509 -0
- package/template/.agent/skill-library/stack/observability/datadog/SKILL.md +179 -0
- package/template/.agent/skill-library/stack/observability/distributed-tracing/SKILL.md +140 -0
- package/template/.agent/skill-library/stack/observability/logging-best-practices/SKILL.md +168 -0
- package/template/.agent/skill-library/stack/observability/opentelemetry/SKILL.md +164 -0
- package/template/.agent/skill-library/stack/observability/prometheus-grafana/SKILL.md +246 -0
- package/template/.agent/skill-library/stack/observability/python-observability/SKILL.md +158 -0
- package/template/.agent/skill-library/stack/orm/drizzle-orm/SKILL.md +613 -0
- package/template/.agent/skill-library/stack/orm/prisma/SKILL.md +744 -0
- package/template/.agent/skill-library/stack/payments/lemonsqueezy/SKILL.md +393 -0
- package/template/.agent/skill-library/stack/payments/stripe-integration/SKILL.md +457 -0
- package/template/.agent/skill-library/stack/queue/bullmq/SKILL.md +385 -0
- package/template/.agent/skill-library/stack/queue/inngest/SKILL.md +438 -0
- package/template/.agent/skill-library/stack/realtime/socketio/SKILL.md +595 -0
- package/template/.agent/skill-library/stack/search/elasticsearch/SKILL.md +248 -0
- package/template/.agent/skill-library/stack/search/meilisearch/SKILL.md +385 -0
- package/template/.agent/skill-library/stack/security/crypto-patterns/SKILL.md +437 -0
- package/template/.agent/skill-library/stack/security/csp-cors-headers/SKILL.md +588 -0
- package/template/.agent/skill-library/stack/security/dependency-auditing/SKILL.md +560 -0
- package/template/.agent/skill-library/stack/security/input-sanitization/SKILL.md +430 -0
- package/template/.agent/skill-library/stack/security/owasp-web-security/SKILL.md +421 -0
- package/template/.agent/skill-library/stack/state/tanstack-query/SKILL.md +637 -0
- package/template/.agent/skill-library/stack/state/zustand/SKILL.md +483 -0
- package/template/.agent/skill-library/stack/storage/aws-s3/SKILL.md +415 -0
- package/template/.agent/skill-library/stack/testing/playwright/SKILL.md +641 -0
- package/template/.agent/skill-library/stack/testing/storybook/SKILL.md +923 -0
- package/template/.agent/skill-library/stack/testing/testing-library/SKILL.md +872 -0
- package/template/.agent/skill-library/stack/testing/vitest/SKILL.md +714 -0
- package/template/.agent/skill-library/stack/ui/react-best-practices/SKILL.md +877 -0
- package/template/.agent/skill-library/stack/ui/react-composition-patterns/SKILL.md +1107 -0
- package/template/.agent/skill-library/stack/ui/react-flow/SKILL.md +425 -0
- package/template/.agent/skill-library/stack/ui/shadcn-ui/SKILL.md +703 -0
- package/template/.agent/skill-library/surface/api/api-caching/SKILL.md +458 -0
- package/template/.agent/skill-library/surface/api/api-documentation-openapi/SKILL.md +697 -0
- package/template/.agent/skill-library/surface/api/api-error-handling/SKILL.md +478 -0
- package/template/.agent/skill-library/surface/api/api-security-checklist/SKILL.md +147 -0
- package/template/.agent/skill-library/surface/api/api-versioning/SKILL.md +420 -0
- package/template/.agent/skill-library/surface/api/email-best-practices/SKILL.md +59 -0
- package/template/.agent/skill-library/surface/api/rate-limiting-abuse-protection/SKILL.md +147 -0
- package/template/.agent/skill-library/surface/api/rest-api-design/SKILL.md +478 -0
- package/template/.agent/skill-library/surface/api/webhook-design/SKILL.md +752 -0
- package/template/.agent/skill-library/surface/cli/cli-configuration-management/SKILL.md +445 -0
- package/template/.agent/skill-library/surface/cli/cli-error-diagnostics/SKILL.md +515 -0
- package/template/.agent/skill-library/surface/cli/cli-shell-integration/SKILL.md +479 -0
- package/template/.agent/skill-library/surface/cli/cli-ux-design/SKILL.md +477 -0
- package/template/.agent/skill-library/surface/desktop/desktop-app-distribution/SKILL.md +416 -0
- package/template/.agent/skill-library/surface/desktop/desktop-security-sandboxing/SKILL.md +407 -0
- package/template/.agent/skill-library/surface/desktop/desktop-ux-conventions/SKILL.md +361 -0
- package/template/.agent/skill-library/surface/desktop/native-os-integration/SKILL.md +563 -0
- package/template/.agent/skill-library/surface/extension/browser-extension-patterns/SKILL.md +482 -0
- package/template/.agent/skill-library/surface/extension/plugin-architecture-design/SKILL.md +632 -0
- package/template/.agent/skill-library/surface/extension/vscode-extension-development/SKILL.md +728 -0
- package/template/.agent/skill-library/surface/mobile/app-store-submission/SKILL.md +304 -0
- package/template/.agent/skill-library/surface/mobile/mobile-offline-sync/SKILL.md +443 -0
- package/template/.agent/skill-library/surface/mobile/mobile-responsive-patterns/SKILL.md +432 -0
- package/template/.agent/skill-library/surface/mobile/push-notifications/SKILL.md +495 -0
- package/template/.agent/skill-library/surface/web/accessibility-compliance/SKILL.md +827 -0
- package/template/.agent/skill-library/surface/web/ai-seo/SKILL.md +398 -0
- package/template/.agent/skill-library/surface/web/ai-seo/references/content-patterns.md +285 -0
- package/template/.agent/skill-library/surface/web/ai-seo/references/platform-ranking-factors.md +152 -0
- package/template/.agent/skill-library/surface/web/analytics-tracking/SKILL.md +309 -0
- package/template/.agent/skill-library/surface/web/analytics-tracking/references/event-library.md +260 -0
- package/template/.agent/skill-library/surface/web/analytics-tracking/references/ga4-implementation.md +300 -0
- package/template/.agent/skill-library/surface/web/analytics-tracking/references/gtm-implementation.md +390 -0
- package/template/.agent/skill-library/surface/web/authentication-ui-flows/SKILL.md +530 -0
- package/template/.agent/skill-library/surface/web/dark-mode-theming/SKILL.md +516 -0
- package/template/.agent/skill-library/surface/web/design-reference-data/SKILL.md +105 -0
- package/template/.agent/skill-library/surface/web/design-reference-data/data/charts.csv +26 -0
- package/template/.agent/skill-library/surface/web/design-reference-data/data/colors.csv +97 -0
- package/template/.agent/skill-library/surface/web/design-reference-data/data/landing.csv +31 -0
- package/template/.agent/skill-library/surface/web/design-reference-data/data/styles.csv +59 -0
- package/template/.agent/skill-library/surface/web/design-reference-data/data/typography.csv +58 -0
- package/template/.agent/skill-library/surface/web/design-reference-data/data/ux-guidelines.csv +100 -0
- package/template/.agent/skill-library/surface/web/design-reference-data/scripts/core.py +258 -0
- package/template/.agent/skill-library/surface/web/design-reference-data/scripts/design_system.py +1067 -0
- package/template/.agent/skill-library/surface/web/design-reference-data/scripts/search.py +106 -0
- package/template/.agent/skill-library/surface/web/form-handling-validation/SKILL.md +675 -0
- package/template/.agent/skill-library/surface/web/frontend-design/SKILL.md +1393 -0
- package/template/.agent/skill-library/surface/web/frontend-design/templates/cppn-hero.tsx +299 -0
- package/template/.agent/skill-library/surface/web/frontend-design/templates/wave-hero.tsx +875 -0
- package/template/.agent/skill-library/surface/web/frontend-verification/SKILL.md +111 -0
- package/template/.agent/skill-library/surface/web/frontend-verification/scripts/ux_audit.py +739 -0
- package/template/.agent/skill-library/surface/web/i18n-localization/SKILL.md +154 -0
- package/template/.agent/skill-library/surface/web/offline-first-pwa/SKILL.md +657 -0
- package/template/.agent/skill-library/surface/web/page-cro/SKILL.md +182 -0
- package/template/.agent/skill-library/surface/web/page-cro/references/experiments.md +248 -0
- package/template/.agent/skill-library/surface/web/programmatic-seo/SKILL.md +238 -0
- package/template/.agent/skill-library/surface/web/programmatic-seo/references/playbooks.md +308 -0
- package/template/.agent/skill-library/surface/web/schema-markup/SKILL.md +179 -0
- package/template/.agent/skill-library/surface/web/schema-markup/references/schema-examples.md +398 -0
- package/template/.agent/skill-library/surface/web/seo-audit/SKILL.md +394 -0
- package/template/.agent/skill-library/surface/web/seo-audit/references/ai-writing-detection.md +200 -0
- package/template/.agent/skill-library/surface/web/web-performance-optimization/SKILL.md +646 -0
- package/template/.agent/skill-library/surface/web/web-scraping/SKILL.md +58 -0
- package/template/.agent/skills/accessibility/SKILL.md +522 -0
- package/template/.agent/skills/accessibility/references/WCAG.md +162 -0
- package/template/.agent/skills/adversarial-review/SKILL.md +90 -0
- package/template/.agent/skills/antigravity-workflows/SKILL.md +81 -0
- package/template/.agent/skills/antigravity-workflows/resources/implementation-playbook.md +36 -0
- package/template/.agent/skills/api-design-principles/SKILL.md +37 -0
- package/template/.agent/skills/api-design-principles/assets/api-design-checklist.md +155 -0
- package/template/.agent/skills/api-design-principles/assets/rest-api-template.py +182 -0
- package/template/.agent/skills/api-design-principles/references/graphql-schema-design.md +583 -0
- package/template/.agent/skills/api-design-principles/references/rest-best-practices.md +408 -0
- package/template/.agent/skills/api-design-principles/resources/implementation-playbook.md +513 -0
- package/template/.agent/skills/api-versioning/SKILL.md +420 -0
- package/template/.agent/skills/architecture-mapping/SKILL.md +219 -0
- package/template/.agent/skills/bootstrap-agents/SKILL.md +259 -0
- package/template/.agent/skills/brainstorming/SKILL.md +236 -0
- package/template/.agent/skills/brand-guidelines/SKILL.md +44 -0
- package/template/.agent/skills/clean-code/SKILL.md +94 -0
- package/template/.agent/skills/code-review-pro/SKILL.md +152 -0
- package/template/.agent/skills/concise-planning/SKILL.md +68 -0
- package/template/.agent/skills/cross-layer-consistency/SKILL.md +117 -0
- package/template/.agent/skills/database-schema-design/SKILL.md +429 -0
- package/template/.agent/skills/deployment-procedures/SKILL.md +241 -0
- package/template/.agent/skills/design-anti-cliche/SKILL.md +159 -0
- package/template/.agent/skills/design-direction/SKILL.md +45 -0
- package/template/.agent/skills/error-handling-patterns/SKILL.md +721 -0
- package/template/.agent/skills/find-skills/SKILL.md +145 -0
- package/template/.agent/skills/git-advanced/SKILL.md +972 -0
- package/template/.agent/skills/git-workflow/SKILL.md +420 -0
- package/template/.agent/skills/idea-extraction/SKILL.md +271 -0
- package/template/.agent/skills/logging-best-practices/SKILL.md +851 -0
- package/template/.agent/skills/migration-management/SKILL.md +384 -0
- package/template/.agent/skills/minimalist-surgical-development/SKILL.md +69 -0
- package/template/.agent/skills/parallel-agents/SKILL.md +165 -0
- package/template/.agent/skills/parallel-debugging/SKILL.md +135 -0
- package/template/.agent/skills/parallel-feature-development/SKILL.md +166 -0
- package/template/.agent/skills/performance-budgeting/SKILL.md +144 -0
- package/template/.agent/skills/pipeline-rubrics/SKILL.md +51 -0
- package/template/.agent/skills/pipeline-rubrics/references/architecture-rubric.md +19 -0
- package/template/.agent/skills/pipeline-rubrics/references/be-rubric.md +21 -0
- package/template/.agent/skills/pipeline-rubrics/references/fe-rubric.md +20 -0
- package/template/.agent/skills/pipeline-rubrics/references/ia-rubric.md +19 -0
- package/template/.agent/skills/pipeline-rubrics/references/scoring.md +28 -0
- package/template/.agent/skills/pipeline-rubrics/references/vision-rubric.md +11 -0
- package/template/.agent/skills/prd-templates/SKILL.md +88 -0
- package/template/.agent/skills/prd-templates/references/architecture-design-template.md +88 -0
- package/template/.agent/skills/prd-templates/references/be-spec-template.md +101 -0
- package/template/.agent/skills/prd-templates/references/data-placement-template.md +74 -0
- package/template/.agent/skills/prd-templates/references/decomposition-templates.md +211 -0
- package/template/.agent/skills/prd-templates/references/design-system-decisions.md +198 -0
- package/template/.agent/skills/prd-templates/references/engineering-standards-template.md +124 -0
- package/template/.agent/skills/prd-templates/references/fe-classification-procedures.md +47 -0
- package/template/.agent/skills/prd-templates/references/fe-spec-template.md +84 -0
- package/template/.agent/skills/prd-templates/references/infrastructure-report-template.md +71 -0
- package/template/.agent/skills/prd-templates/references/operational-templates.md +116 -0
- package/template/.agent/skills/prd-templates/references/placeholder-guard-template.md +21 -0
- package/template/.agent/skills/prd-templates/references/surface-model.md +61 -0
- package/template/.agent/skills/prd-templates/references/vision-template.md +66 -0
- package/template/.agent/skills/prompt-engineer/README.md +659 -0
- package/template/.agent/skills/prompt-engineer/SKILL.md +249 -0
- package/template/.agent/skills/regex-patterns/SKILL.md +751 -0
- package/template/.agent/skills/resolve-ambiguity/SKILL.md +278 -0
- package/template/.agent/skills/rest-api-design/SKILL.md +478 -0
- package/template/.agent/skills/security-scanning-security-hardening/SKILL.md +231 -0
- package/template/.agent/skills/session-continuity/SKILL.md +730 -0
- package/template/.agent/skills/session-continuity/protocols/01-session-resumption.md +38 -0
- package/template/.agent/skills/session-continuity/protocols/02-progress-generation.md +85 -0
- package/template/.agent/skills/session-continuity/protocols/03-progress-update.md +70 -0
- package/template/.agent/skills/session-continuity/protocols/04-pattern-extraction.md +60 -0
- package/template/.agent/skills/session-continuity/protocols/05-session-close.md +37 -0
- package/template/.agent/skills/session-continuity/protocols/06-decision-analysis.md +84 -0
- package/template/.agent/skills/session-continuity/protocols/07-spec-pipeline-generation.md +48 -0
- package/template/.agent/skills/session-continuity/protocols/08-spec-pipeline-update.md +43 -0
- package/template/.agent/skills/session-continuity/protocols/09-parallel-claim.md +122 -0
- package/template/.agent/skills/session-continuity/protocols/10-placeholder-verification-gate.md +104 -0
- package/template/.agent/skills/session-continuity/protocols/ambiguity-gates.md +48 -0
- package/template/.agent/skills/skill-creator/LICENSE.txt +202 -0
- package/template/.agent/skills/skill-creator/README.md +270 -0
- package/template/.agent/skills/skill-creator/SKILL.md +590 -0
- package/template/.agent/skills/skill-creator/references/output-patterns.md +82 -0
- package/template/.agent/skills/skill-creator/references/workflows.md +28 -0
- package/template/.agent/skills/skill-creator/scripts/init_skill.py +303 -0
- package/template/.agent/skills/skill-creator/scripts/package_skill.py +110 -0
- package/template/.agent/skills/skill-creator/scripts/quick_validate.py +95 -0
- package/template/.agent/skills/spec-writing/SKILL.md +110 -0
- package/template/.agent/skills/systematic-debugging/CREATION-LOG.md +119 -0
- package/template/.agent/skills/systematic-debugging/SKILL.md +297 -0
- package/template/.agent/skills/systematic-debugging/condition-based-waiting-example.ts +158 -0
- package/template/.agent/skills/systematic-debugging/condition-based-waiting.md +115 -0
- package/template/.agent/skills/systematic-debugging/defense-in-depth.md +122 -0
- package/template/.agent/skills/systematic-debugging/find-polluter.sh +63 -0
- package/template/.agent/skills/systematic-debugging/root-cause-tracing.md +169 -0
- package/template/.agent/skills/systematic-debugging/test-academic.md +14 -0
- package/template/.agent/skills/systematic-debugging/test-pressure-1.md +58 -0
- package/template/.agent/skills/systematic-debugging/test-pressure-2.md +68 -0
- package/template/.agent/skills/systematic-debugging/test-pressure-3.md +69 -0
- package/template/.agent/skills/tdd-workflow/SKILL.md +409 -0
- package/template/.agent/skills/tech-stack-catalog/SKILL.md +49 -0
- package/template/.agent/skills/tech-stack-catalog/references/constraint-questions.md +21 -0
- package/template/.agent/skills/tech-stack-catalog/references/dev-tooling-decisions.md +37 -0
- package/template/.agent/skills/tech-stack-catalog/references/surface-decision-tables.md +69 -0
- package/template/.agent/skills/technical-writer/SKILL.md +242 -0
- package/template/.agent/skills/testing-strategist/SKILL.md +932 -0
- package/template/.agent/skills/verification-before-completion/SKILL.md +145 -0
- package/template/.agent/skills/workflow-automation/SKILL.md +73 -0
- package/template/.agent/workflows/audit-ambiguity-execute.md +165 -0
- package/template/.agent/workflows/audit-ambiguity-rubrics.md +83 -0
- package/template/.agent/workflows/audit-ambiguity.md +64 -0
- package/template/.agent/workflows/bootstrap-agents-fill.md +201 -0
- package/template/.agent/workflows/bootstrap-agents-provision.md +197 -0
- package/template/.agent/workflows/bootstrap-agents.md +66 -0
- package/template/.agent/workflows/create-prd-architecture.md +119 -0
- package/template/.agent/workflows/create-prd-compile.md +138 -0
- package/template/.agent/workflows/create-prd-design-system.md +135 -0
- package/template/.agent/workflows/create-prd-security.md +113 -0
- package/template/.agent/workflows/create-prd-stack.md +91 -0
- package/template/.agent/workflows/create-prd.md +168 -0
- package/template/.agent/workflows/decompose-architecture-structure.md +82 -0
- package/template/.agent/workflows/decompose-architecture-validate.md +119 -0
- package/template/.agent/workflows/decompose-architecture.md +111 -0
- package/template/.agent/workflows/evolve-contract.md +98 -0
- package/template/.agent/workflows/evolve-feature-cascade.md +140 -0
- package/template/.agent/workflows/evolve-feature-classify.md +116 -0
- package/template/.agent/workflows/evolve-feature.md +56 -0
- package/template/.agent/workflows/ideate-discover.md +144 -0
- package/template/.agent/workflows/ideate-extract.md +129 -0
- package/template/.agent/workflows/ideate-validate.md +117 -0
- package/template/.agent/workflows/ideate.md +113 -0
- package/template/.agent/workflows/implement-slice-setup.md +113 -0
- package/template/.agent/workflows/implement-slice-tdd.md +198 -0
- package/template/.agent/workflows/implement-slice.md +50 -0
- package/template/.agent/workflows/plan-phase.md +202 -0
- package/template/.agent/workflows/propagate-decision-apply.md +135 -0
- package/template/.agent/workflows/propagate-decision-scan.md +147 -0
- package/template/.agent/workflows/propagate-decision.md +56 -0
- package/template/.agent/workflows/remediate-pipeline-assess.md +138 -0
- package/template/.agent/workflows/remediate-pipeline-execute.md +135 -0
- package/template/.agent/workflows/remediate-pipeline.md +55 -0
- package/template/.agent/workflows/resolve-ambiguity.md +82 -0
- package/template/.agent/workflows/sync-kit.md +209 -0
- package/template/.agent/workflows/update-architecture-map.md +74 -0
- package/template/.agent/workflows/validate-phase.md +219 -0
- package/template/.agent/workflows/verify-infrastructure.md +207 -0
- package/template/.agent/workflows/write-architecture-spec-deepen.md +139 -0
- package/template/.agent/workflows/write-architecture-spec-design.md +202 -0
- package/template/.agent/workflows/write-architecture-spec.md +63 -0
- package/template/.agent/workflows/write-be-spec-classify.md +165 -0
- package/template/.agent/workflows/write-be-spec-write.md +98 -0
- package/template/.agent/workflows/write-be-spec.md +76 -0
- package/template/.agent/workflows/write-fe-spec-classify.md +170 -0
- package/template/.agent/workflows/write-fe-spec-write.md +94 -0
- package/template/.agent/workflows/write-fe-spec.md +71 -0
- package/template/AGENTS.md +176 -0
- package/template/GEMINI.md +177 -0
- package/template/docs/README.md +187 -0
- package/template/docs/audits/.gitkeep +0 -0
- package/template/docs/audits/README.md +10 -0
- package/template/docs/plans/.gitkeep +0 -0
- package/template/docs/plans/README.md +21 -0
- package/template/docs/plans/be/.gitkeep +0 -0
- package/template/docs/plans/be/README.md +11 -0
- package/template/docs/plans/fe/.gitkeep +0 -0
- package/template/docs/plans/fe/README.md +11 -0
- package/template/docs/plans/ia/.gitkeep +0 -0
- package/template/docs/plans/ia/README.md +17 -0
- package/template/docs/plans/ia/deep-dives/.gitkeep +0 -0
- package/template/docs/plans/ia/deep-dives/README.md +5 -0
- package/template/docs/plans/phases/.gitkeep +0 -0
- package/template/docs/plans/phases/README.md +11 -0
|
@@ -0,0 +1,484 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: vercel
|
|
3
|
+
description: Comprehensive Vercel hosting and deployment skill covering serverless/edge functions, environment variables, preview deployments, caching, headers, redirects, rewrites, monorepo setup, Vercel storage (KV, Blob, Postgres), analytics, ISR, and CI/CD integration. Use when deploying to Vercel or configuring any Vercel platform feature.
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Vercel Hosting
|
|
8
|
+
|
|
9
|
+
Production deployment platform for frontend frameworks with serverless and edge compute, integrated storage, and zero-config CI/CD.
|
|
10
|
+
|
|
11
|
+
## Project Configuration
|
|
12
|
+
|
|
13
|
+
### vercel.json
|
|
14
|
+
|
|
15
|
+
```json
|
|
16
|
+
{
|
|
17
|
+
"buildCommand": "pnpm build",
|
|
18
|
+
"outputDirectory": ".next",
|
|
19
|
+
"installCommand": "pnpm install",
|
|
20
|
+
"framework": "nextjs",
|
|
21
|
+
"regions": ["iad1"],
|
|
22
|
+
"headers": [
|
|
23
|
+
{
|
|
24
|
+
"source": "/api/(.*)",
|
|
25
|
+
"headers": [
|
|
26
|
+
{ "key": "Cache-Control", "value": "no-store" },
|
|
27
|
+
{ "key": "X-Content-Type-Options", "value": "nosniff" }
|
|
28
|
+
]
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
"source": "/(.*)",
|
|
32
|
+
"headers": [
|
|
33
|
+
{ "key": "X-Frame-Options", "value": "DENY" },
|
|
34
|
+
{ "key": "Strict-Transport-Security", "value": "max-age=63072000; includeSubDomains; preload" }
|
|
35
|
+
]
|
|
36
|
+
}
|
|
37
|
+
],
|
|
38
|
+
"redirects": [
|
|
39
|
+
{ "source": "/old-path", "destination": "/new-path", "permanent": true }
|
|
40
|
+
],
|
|
41
|
+
"rewrites": [
|
|
42
|
+
{ "source": "/api/proxy/:path*", "destination": "https://backend.example.com/:path*" }
|
|
43
|
+
]
|
|
44
|
+
}
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
### Framework Detection
|
|
48
|
+
|
|
49
|
+
Vercel auto-detects frameworks. Override with `framework` in vercel.json:
|
|
50
|
+
|
|
51
|
+
| Framework | Value | Output Directory |
|
|
52
|
+
|-----------|-------|-----------------|
|
|
53
|
+
| Next.js | `nextjs` | `.next` |
|
|
54
|
+
| Astro | `astro` | `dist` |
|
|
55
|
+
| SvelteKit | `sveltekit` | `.svelte-kit` |
|
|
56
|
+
| Remix | `remix` | `build` |
|
|
57
|
+
| Vite/React | `vite` | `dist` |
|
|
58
|
+
|
|
59
|
+
## Serverless Functions
|
|
60
|
+
|
|
61
|
+
### API Route (Next.js App Router)
|
|
62
|
+
|
|
63
|
+
```typescript
|
|
64
|
+
// app/api/users/route.ts
|
|
65
|
+
import { NextRequest, NextResponse } from 'next/server';
|
|
66
|
+
|
|
67
|
+
export const runtime = 'nodejs'; // default, or 'edge'
|
|
68
|
+
export const maxDuration = 30; // seconds (Pro: 60, Enterprise: 900)
|
|
69
|
+
export const dynamic = 'force-dynamic';
|
|
70
|
+
|
|
71
|
+
export async function GET(request: NextRequest) {
|
|
72
|
+
const searchParams = request.nextUrl.searchParams;
|
|
73
|
+
const page = parseInt(searchParams.get('page') ?? '1', 10);
|
|
74
|
+
|
|
75
|
+
const users = await db.users.findMany({ skip: (page - 1) * 20, take: 20 });
|
|
76
|
+
return NextResponse.json(users);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
export async function POST(request: NextRequest) {
|
|
80
|
+
const body = await request.json();
|
|
81
|
+
const user = await db.users.create({ data: body });
|
|
82
|
+
return NextResponse.json(user, { status: 201 });
|
|
83
|
+
}
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
### Standalone Serverless Function (non-framework)
|
|
87
|
+
|
|
88
|
+
```typescript
|
|
89
|
+
// api/hello.ts
|
|
90
|
+
import type { VercelRequest, VercelResponse } from '@vercel/node';
|
|
91
|
+
|
|
92
|
+
export default function handler(req: VercelRequest, res: VercelResponse) {
|
|
93
|
+
res.status(200).json({ message: 'Hello from Vercel' });
|
|
94
|
+
}
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
### Function Configuration
|
|
98
|
+
|
|
99
|
+
| Setting | Hobby | Pro | Enterprise |
|
|
100
|
+
|---------|-------|-----|-----------|
|
|
101
|
+
| Max Duration | 10s | 60s | 900s |
|
|
102
|
+
| Memory | 1024 MB | 3009 MB | 3009 MB |
|
|
103
|
+
| Payload Size | 4.5 MB | 4.5 MB | 4.5 MB |
|
|
104
|
+
| Regions | 1 | Multiple | Multiple |
|
|
105
|
+
|
|
106
|
+
## Edge Functions
|
|
107
|
+
|
|
108
|
+
```typescript
|
|
109
|
+
// app/api/geo/route.ts
|
|
110
|
+
import { NextRequest, NextResponse } from 'next/server';
|
|
111
|
+
|
|
112
|
+
export const runtime = 'edge';
|
|
113
|
+
|
|
114
|
+
export async function GET(request: NextRequest) {
|
|
115
|
+
const country = request.geo?.country ?? 'US';
|
|
116
|
+
const city = request.geo?.city ?? 'Unknown';
|
|
117
|
+
|
|
118
|
+
return NextResponse.json({ country, city });
|
|
119
|
+
}
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
**Edge limitations**: No native Node.js modules (fs, net, child_process). No dynamic `require()`. Limited to Web APIs and edge-compatible npm packages. Max 128 KB compressed bundle size after tree shaking.
|
|
123
|
+
|
|
124
|
+
## Edge Middleware
|
|
125
|
+
|
|
126
|
+
```typescript
|
|
127
|
+
// middleware.ts (project root)
|
|
128
|
+
import { NextResponse } from 'next/server';
|
|
129
|
+
import type { NextRequest } from 'next/server';
|
|
130
|
+
|
|
131
|
+
export function middleware(request: NextRequest) {
|
|
132
|
+
// Geo-based redirect
|
|
133
|
+
if (request.geo?.country === 'DE') {
|
|
134
|
+
return NextResponse.redirect(new URL('/de', request.url));
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
// Add custom headers
|
|
138
|
+
const response = NextResponse.next();
|
|
139
|
+
response.headers.set('x-request-id', crypto.randomUUID());
|
|
140
|
+
return response;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
export const config = {
|
|
144
|
+
matcher: ['/((?!_next/static|_next/image|favicon.ico).*)'],
|
|
145
|
+
};
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
## Environment Variables
|
|
149
|
+
|
|
150
|
+
### Configuration Hierarchy
|
|
151
|
+
|
|
152
|
+
| Scope | Available In | Set Via |
|
|
153
|
+
|-------|-------------|---------|
|
|
154
|
+
| `NEXT_PUBLIC_*` | Client + Server | Dashboard, CLI, vercel.json |
|
|
155
|
+
| No prefix | Server only | Dashboard, CLI |
|
|
156
|
+
| `VERCEL_*` | Auto-populated | System (read-only) |
|
|
157
|
+
|
|
158
|
+
### Environment-Specific Variables
|
|
159
|
+
|
|
160
|
+
```bash
|
|
161
|
+
# Set for specific environments
|
|
162
|
+
vercel env add DATABASE_URL production
|
|
163
|
+
vercel env add DATABASE_URL preview
|
|
164
|
+
vercel env add DATABASE_URL development
|
|
165
|
+
|
|
166
|
+
# Pull to local .env
|
|
167
|
+
vercel env pull .env.local
|
|
168
|
+
|
|
169
|
+
# List all
|
|
170
|
+
vercel env ls
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
### System Environment Variables
|
|
174
|
+
|
|
175
|
+
| Variable | Value |
|
|
176
|
+
|----------|-------|
|
|
177
|
+
| `VERCEL` | `1` (always set on Vercel) |
|
|
178
|
+
| `VERCEL_ENV` | `production`, `preview`, or `development` |
|
|
179
|
+
| `VERCEL_URL` | Deployment URL (no protocol) |
|
|
180
|
+
| `VERCEL_GIT_COMMIT_SHA` | Git commit hash |
|
|
181
|
+
| `VERCEL_GIT_COMMIT_REF` | Git branch name |
|
|
182
|
+
|
|
183
|
+
## Caching and ISR
|
|
184
|
+
|
|
185
|
+
### Incremental Static Regeneration
|
|
186
|
+
|
|
187
|
+
```typescript
|
|
188
|
+
// app/products/[id]/page.tsx
|
|
189
|
+
export const revalidate = 60; // revalidate every 60 seconds
|
|
190
|
+
|
|
191
|
+
export async function generateStaticParams() {
|
|
192
|
+
const products = await db.products.findMany();
|
|
193
|
+
return products.map((p) => ({ id: p.id }));
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
export default async function ProductPage({ params }: { params: { id: string } }) {
|
|
197
|
+
const product = await db.products.findUnique({ where: { id: params.id } });
|
|
198
|
+
return <div>{product.name}</div>;
|
|
199
|
+
}
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
### On-Demand Revalidation
|
|
203
|
+
|
|
204
|
+
```typescript
|
|
205
|
+
// app/api/revalidate/route.ts
|
|
206
|
+
import { revalidatePath, revalidateTag } from 'next/cache';
|
|
207
|
+
import { NextRequest, NextResponse } from 'next/server';
|
|
208
|
+
|
|
209
|
+
export async function POST(request: NextRequest) {
|
|
210
|
+
const secret = request.headers.get('x-revalidation-secret');
|
|
211
|
+
if (secret !== process.env.REVALIDATION_SECRET) {
|
|
212
|
+
return NextResponse.json({ error: 'Invalid secret' }, { status: 401 });
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
const { path, tag } = await request.json();
|
|
216
|
+
|
|
217
|
+
if (tag) {
|
|
218
|
+
revalidateTag(tag);
|
|
219
|
+
} else if (path) {
|
|
220
|
+
revalidatePath(path);
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
return NextResponse.json({ revalidated: true, now: Date.now() });
|
|
224
|
+
}
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
### Cache-Control Headers
|
|
228
|
+
|
|
229
|
+
```typescript
|
|
230
|
+
// Manual cache headers for API routes
|
|
231
|
+
export async function GET() {
|
|
232
|
+
const data = await fetchData();
|
|
233
|
+
|
|
234
|
+
return NextResponse.json(data, {
|
|
235
|
+
headers: {
|
|
236
|
+
'Cache-Control': 'public, s-maxage=60, stale-while-revalidate=300',
|
|
237
|
+
},
|
|
238
|
+
});
|
|
239
|
+
}
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
**Cache hierarchy**: `s-maxage` controls Vercel CDN cache. `stale-while-revalidate` serves stale content while refreshing in background. `no-store` disables caching entirely.
|
|
243
|
+
|
|
244
|
+
## Preview Deployments
|
|
245
|
+
|
|
246
|
+
Every push to a non-production branch creates a preview deployment.
|
|
247
|
+
|
|
248
|
+
### Preview Protection
|
|
249
|
+
|
|
250
|
+
```json
|
|
251
|
+
// vercel.json
|
|
252
|
+
{
|
|
253
|
+
"oidcTokenConfig": {
|
|
254
|
+
"enabled": true
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
### Preview Comments
|
|
260
|
+
|
|
261
|
+
Enabled by default on GitHub PRs. Disable per-project in dashboard under Settings > Git > Preview Comments.
|
|
262
|
+
|
|
263
|
+
### Branch-Specific Domains
|
|
264
|
+
|
|
265
|
+
```bash
|
|
266
|
+
# Assign custom domain to branch
|
|
267
|
+
vercel alias set <deployment-url> staging.example.com
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
## Monorepo Setup
|
|
271
|
+
|
|
272
|
+
### Turborepo Configuration
|
|
273
|
+
|
|
274
|
+
```json
|
|
275
|
+
// vercel.json at project root
|
|
276
|
+
{
|
|
277
|
+
"buildCommand": "cd ../.. && npx turbo run build --filter=web",
|
|
278
|
+
"installCommand": "cd ../.. && pnpm install",
|
|
279
|
+
"framework": "nextjs",
|
|
280
|
+
"outputDirectory": ".next"
|
|
281
|
+
}
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
### Root Directory Setting
|
|
285
|
+
|
|
286
|
+
Set in Vercel Dashboard > Project Settings > General > Root Directory. For a monorepo structure:
|
|
287
|
+
|
|
288
|
+
```
|
|
289
|
+
apps/
|
|
290
|
+
web/ ← Root Directory for web project
|
|
291
|
+
docs/ ← Root Directory for docs project
|
|
292
|
+
packages/
|
|
293
|
+
ui/
|
|
294
|
+
config/
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
### Ignored Build Step
|
|
298
|
+
|
|
299
|
+
```bash
|
|
300
|
+
# .vercel/ignore-build.sh — skip builds when no relevant changes
|
|
301
|
+
#!/bin/bash
|
|
302
|
+
git diff --quiet HEAD^ HEAD -- . ../../packages/
|
|
303
|
+
```
|
|
304
|
+
|
|
305
|
+
Or in vercel.json:
|
|
306
|
+
```json
|
|
307
|
+
{
|
|
308
|
+
"ignoreCommand": "git diff --quiet HEAD^ HEAD -- . ../../packages/"
|
|
309
|
+
}
|
|
310
|
+
```
|
|
311
|
+
|
|
312
|
+
## Vercel Storage
|
|
313
|
+
|
|
314
|
+
### Vercel KV (Redis-compatible)
|
|
315
|
+
|
|
316
|
+
```typescript
|
|
317
|
+
import { kv } from '@vercel/kv';
|
|
318
|
+
|
|
319
|
+
// Set
|
|
320
|
+
await kv.set('user:123', { name: 'Alice', email: 'alice@example.com' });
|
|
321
|
+
await kv.set('session:abc', 'data', { ex: 3600 }); // expires in 1 hour
|
|
322
|
+
|
|
323
|
+
// Get
|
|
324
|
+
const user = await kv.get<{ name: string; email: string }>('user:123');
|
|
325
|
+
|
|
326
|
+
// Hash operations
|
|
327
|
+
await kv.hset('config', { theme: 'dark', lang: 'en' });
|
|
328
|
+
const theme = await kv.hget<string>('config', 'theme');
|
|
329
|
+
|
|
330
|
+
// List operations
|
|
331
|
+
await kv.lpush('queue', 'task1', 'task2');
|
|
332
|
+
const task = await kv.rpop('queue');
|
|
333
|
+
```
|
|
334
|
+
|
|
335
|
+
### Vercel Blob
|
|
336
|
+
|
|
337
|
+
```typescript
|
|
338
|
+
import { put, del, list, head } from '@vercel/blob';
|
|
339
|
+
|
|
340
|
+
// Upload
|
|
341
|
+
const blob = await put('avatars/user-123.png', fileBuffer, {
|
|
342
|
+
access: 'public',
|
|
343
|
+
contentType: 'image/png',
|
|
344
|
+
});
|
|
345
|
+
// blob.url → https://abc.public.blob.vercel-storage.com/avatars/user-123.png
|
|
346
|
+
|
|
347
|
+
// List blobs
|
|
348
|
+
const { blobs, cursor } = await list({ prefix: 'avatars/', limit: 100 });
|
|
349
|
+
|
|
350
|
+
// Delete
|
|
351
|
+
await del(blob.url);
|
|
352
|
+
|
|
353
|
+
// Client upload (from browser)
|
|
354
|
+
import { upload } from '@vercel/blob/client';
|
|
355
|
+
|
|
356
|
+
const blob = await upload('avatar.png', file, {
|
|
357
|
+
access: 'public',
|
|
358
|
+
handleUploadUrl: '/api/upload', // server-side handler
|
|
359
|
+
});
|
|
360
|
+
```
|
|
361
|
+
|
|
362
|
+
### Vercel Postgres
|
|
363
|
+
|
|
364
|
+
```typescript
|
|
365
|
+
import { sql } from '@vercel/postgres';
|
|
366
|
+
|
|
367
|
+
// Query
|
|
368
|
+
const { rows } = await sql`SELECT * FROM users WHERE id = ${userId}`;
|
|
369
|
+
|
|
370
|
+
// Insert
|
|
371
|
+
await sql`INSERT INTO users (name, email) VALUES (${name}, ${email})`;
|
|
372
|
+
|
|
373
|
+
// Transaction
|
|
374
|
+
import { db } from '@vercel/postgres';
|
|
375
|
+
|
|
376
|
+
const client = await db.connect();
|
|
377
|
+
try {
|
|
378
|
+
await client.sql`BEGIN`;
|
|
379
|
+
await client.sql`UPDATE accounts SET balance = balance - ${amount} WHERE id = ${from}`;
|
|
380
|
+
await client.sql`UPDATE accounts SET balance = balance + ${amount} WHERE id = ${to}`;
|
|
381
|
+
await client.sql`COMMIT`;
|
|
382
|
+
} catch (e) {
|
|
383
|
+
await client.sql`ROLLBACK`;
|
|
384
|
+
throw e;
|
|
385
|
+
} finally {
|
|
386
|
+
client.release();
|
|
387
|
+
}
|
|
388
|
+
```
|
|
389
|
+
|
|
390
|
+
## Analytics and Speed Insights
|
|
391
|
+
|
|
392
|
+
### Web Analytics
|
|
393
|
+
|
|
394
|
+
```typescript
|
|
395
|
+
// app/layout.tsx
|
|
396
|
+
import { Analytics } from '@vercel/analytics/react';
|
|
397
|
+
|
|
398
|
+
export default function RootLayout({ children }: { children: React.ReactNode }) {
|
|
399
|
+
return (
|
|
400
|
+
<html>
|
|
401
|
+
<body>
|
|
402
|
+
{children}
|
|
403
|
+
<Analytics />
|
|
404
|
+
</body>
|
|
405
|
+
</html>
|
|
406
|
+
);
|
|
407
|
+
}
|
|
408
|
+
```
|
|
409
|
+
|
|
410
|
+
### Speed Insights (Core Web Vitals)
|
|
411
|
+
|
|
412
|
+
```typescript
|
|
413
|
+
import { SpeedInsights } from '@vercel/speed-insights/next';
|
|
414
|
+
|
|
415
|
+
export default function RootLayout({ children }: { children: React.ReactNode }) {
|
|
416
|
+
return (
|
|
417
|
+
<html>
|
|
418
|
+
<body>
|
|
419
|
+
{children}
|
|
420
|
+
<SpeedInsights />
|
|
421
|
+
</body>
|
|
422
|
+
</html>
|
|
423
|
+
);
|
|
424
|
+
}
|
|
425
|
+
```
|
|
426
|
+
|
|
427
|
+
## CLI Commands
|
|
428
|
+
|
|
429
|
+
```bash
|
|
430
|
+
# Deploy
|
|
431
|
+
vercel # preview deployment
|
|
432
|
+
vercel --prod # production deployment
|
|
433
|
+
|
|
434
|
+
# Environment
|
|
435
|
+
vercel env pull # pull env vars to .env.local
|
|
436
|
+
vercel env add KEY # add env var interactively
|
|
437
|
+
vercel env rm KEY # remove env var
|
|
438
|
+
|
|
439
|
+
# Domains
|
|
440
|
+
vercel domains add example.com
|
|
441
|
+
vercel domains inspect example.com
|
|
442
|
+
|
|
443
|
+
# Logs
|
|
444
|
+
vercel logs <deployment-url>
|
|
445
|
+
vercel logs <deployment-url> --follow
|
|
446
|
+
|
|
447
|
+
# Project management
|
|
448
|
+
vercel link # link local project
|
|
449
|
+
vercel project ls # list projects
|
|
450
|
+
```
|
|
451
|
+
|
|
452
|
+
## Anti-Patterns
|
|
453
|
+
|
|
454
|
+
| Anti-Pattern | Correct Approach |
|
|
455
|
+
|-------------|-----------------|
|
|
456
|
+
| Hardcoding `VERCEL_URL` in client code | Use `NEXT_PUBLIC_APP_URL` env var, set per environment |
|
|
457
|
+
| Using serverless functions for WebSockets | Use a dedicated WebSocket service or Vercel's Edge Config |
|
|
458
|
+
| `Cache-Control: max-age=31536000` on API routes | Use `s-maxage` for CDN caching, short `max-age` for browser |
|
|
459
|
+
| Large serverless function bundles (>50 MB) | Tree-shake imports, use dynamic imports, split into smaller functions |
|
|
460
|
+
| Running database migrations in serverless functions | Use build scripts or separate CI/CD step |
|
|
461
|
+
| Storing sessions in serverless function memory | Use Vercel KV or external session store |
|
|
462
|
+
| Ignoring cold start latency | Use edge runtime for latency-sensitive routes, warm critical functions |
|
|
463
|
+
| Deploying without preview testing | Always verify preview deployment before promoting to production |
|
|
464
|
+
|
|
465
|
+
## Decision Guide
|
|
466
|
+
|
|
467
|
+
```
|
|
468
|
+
Need compute?
|
|
469
|
+
├─ < 10ms response, globally distributed → Edge Function (runtime = 'edge')
|
|
470
|
+
├─ Node.js APIs needed (fs, streams, native modules) → Serverless Function (runtime = 'nodejs')
|
|
471
|
+
└─ Long-running (> 60s) → Not suitable for Vercel serverless, use external service
|
|
472
|
+
|
|
473
|
+
Need storage?
|
|
474
|
+
├─ Session data, rate limiting, cache → Vercel KV
|
|
475
|
+
├─ File uploads, images, documents → Vercel Blob
|
|
476
|
+
├─ Relational data → Vercel Postgres
|
|
477
|
+
└─ Configuration, feature flags → Vercel Edge Config
|
|
478
|
+
|
|
479
|
+
Need caching?
|
|
480
|
+
├─ Static pages with periodic updates → ISR (revalidate = N)
|
|
481
|
+
├─ Static pages with webhook-triggered updates → On-demand revalidation
|
|
482
|
+
├─ API responses → Cache-Control with s-maxage
|
|
483
|
+
└─ Dynamic, user-specific content → no-store
|
|
484
|
+
```
|