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,588 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: csp-cors-headers
|
|
3
|
+
description: "Content Security Policy, CORS, and security headers configuration for web applications. Use when setting up CSP directives, configuring cross-origin requests, implementing nonce-based policies, or adding security headers (HSTS, X-Frame-Options, Referrer-Policy, Permissions-Policy) in Express, Next.js, Astro, or nginx."
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# CSP, CORS, and Security Headers
|
|
8
|
+
|
|
9
|
+
**Status**: Production Ready
|
|
10
|
+
**Last Updated**: 2026-02-17
|
|
11
|
+
**Dependencies**: None (standalone skill)
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## Use This Skill When
|
|
16
|
+
|
|
17
|
+
- Configuring Content Security Policy for a web application
|
|
18
|
+
- Setting up CORS for API endpoints consumed by different origins
|
|
19
|
+
- Adding security headers to HTTP responses
|
|
20
|
+
- Debugging CSP violations or CORS errors
|
|
21
|
+
- Implementing nonce-based CSP for inline scripts
|
|
22
|
+
- Configuring HSTS, X-Frame-Options, or Permissions-Policy
|
|
23
|
+
|
|
24
|
+
## Do Not Use This Skill When
|
|
25
|
+
|
|
26
|
+
- You need application-level security patterns (use owasp-web-security skill)
|
|
27
|
+
- You need encryption or token management (use crypto-patterns skill)
|
|
28
|
+
- You need rate limiting or abuse protection (use rate-limiting skill)
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## Content Security Policy (CSP)
|
|
33
|
+
|
|
34
|
+
CSP controls which resources the browser is allowed to load. It is the primary
|
|
35
|
+
defense against XSS, clickjacking, and data injection attacks.
|
|
36
|
+
|
|
37
|
+
### CSP Directives Reference
|
|
38
|
+
|
|
39
|
+
| Directive | Controls | Example |
|
|
40
|
+
|-----------|----------|---------|
|
|
41
|
+
| `default-src` | Fallback for all resource types | `default-src 'self'` |
|
|
42
|
+
| `script-src` | JavaScript sources | `script-src 'self' 'nonce-abc123'` |
|
|
43
|
+
| `style-src` | CSS sources | `style-src 'self' 'unsafe-inline'` |
|
|
44
|
+
| `img-src` | Image sources | `img-src 'self' data: https:` |
|
|
45
|
+
| `connect-src` | XHR, Fetch, WebSocket targets | `connect-src 'self' https://api.example.com` |
|
|
46
|
+
| `font-src` | Web font sources | `font-src 'self' https://fonts.gstatic.com` |
|
|
47
|
+
| `frame-src` | iframe sources | `frame-src 'none'` |
|
|
48
|
+
| `frame-ancestors` | Who can embed this page | `frame-ancestors 'none'` |
|
|
49
|
+
| `media-src` | Audio and video sources | `media-src 'self'` |
|
|
50
|
+
| `object-src` | Plugin sources (Flash, etc.) | `object-src 'none'` |
|
|
51
|
+
| `base-uri` | Allowed base URLs | `base-uri 'self'` |
|
|
52
|
+
| `form-action` | Form submission targets | `form-action 'self'` |
|
|
53
|
+
| `worker-src` | Web Worker sources | `worker-src 'self' blob:` |
|
|
54
|
+
| `manifest-src` | Web App Manifest source | `manifest-src 'self'` |
|
|
55
|
+
| `report-uri` | Where to send violation reports (deprecated) | `report-uri /csp-report` |
|
|
56
|
+
| `report-to` | Reporting API endpoint name | `report-to csp-endpoint` |
|
|
57
|
+
|
|
58
|
+
### CSP Source Values
|
|
59
|
+
|
|
60
|
+
| Value | Meaning |
|
|
61
|
+
|-------|---------|
|
|
62
|
+
| `'self'` | Same origin only |
|
|
63
|
+
| `'none'` | Block everything |
|
|
64
|
+
| `'unsafe-inline'` | Allow inline scripts/styles (avoid if possible) |
|
|
65
|
+
| `'unsafe-eval'` | Allow eval() and similar (avoid) |
|
|
66
|
+
| `'nonce-{base64}'` | Allow specific inline elements with matching nonce |
|
|
67
|
+
| `'strict-dynamic'` | Trust scripts loaded by already-trusted scripts |
|
|
68
|
+
| `https:` | Any HTTPS URL |
|
|
69
|
+
| `data:` | Data URIs (use sparingly) |
|
|
70
|
+
| `blob:` | Blob URIs |
|
|
71
|
+
| `*.example.com` | Wildcard subdomain |
|
|
72
|
+
|
|
73
|
+
### Strict CSP (Recommended)
|
|
74
|
+
|
|
75
|
+
```
|
|
76
|
+
Content-Security-Policy:
|
|
77
|
+
default-src 'self';
|
|
78
|
+
script-src 'self' 'nonce-{RANDOM}' 'strict-dynamic';
|
|
79
|
+
style-src 'self' 'nonce-{RANDOM}';
|
|
80
|
+
img-src 'self' data: https:;
|
|
81
|
+
font-src 'self';
|
|
82
|
+
connect-src 'self' https://api.example.com;
|
|
83
|
+
frame-src 'none';
|
|
84
|
+
frame-ancestors 'none';
|
|
85
|
+
object-src 'none';
|
|
86
|
+
base-uri 'self';
|
|
87
|
+
form-action 'self';
|
|
88
|
+
upgrade-insecure-requests;
|
|
89
|
+
report-to csp-endpoint
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
### Nonce-Based CSP
|
|
93
|
+
|
|
94
|
+
Every page load generates a unique nonce. Only inline scripts/styles with the
|
|
95
|
+
matching nonce attribute are allowed to execute.
|
|
96
|
+
|
|
97
|
+
```typescript
|
|
98
|
+
// Express middleware for nonce-based CSP
|
|
99
|
+
import crypto from "crypto";
|
|
100
|
+
import { RequestHandler } from "express";
|
|
101
|
+
|
|
102
|
+
export const cspMiddleware: RequestHandler = (req, res, next) => {
|
|
103
|
+
// Generate a unique nonce per request
|
|
104
|
+
const nonce = crypto.randomBytes(16).toString("base64");
|
|
105
|
+
res.locals.cspNonce = nonce;
|
|
106
|
+
|
|
107
|
+
const csp = [
|
|
108
|
+
"default-src 'self'",
|
|
109
|
+
`script-src 'self' 'nonce-${nonce}' 'strict-dynamic'`,
|
|
110
|
+
`style-src 'self' 'nonce-${nonce}'`,
|
|
111
|
+
"img-src 'self' data: https:",
|
|
112
|
+
"font-src 'self' https://fonts.gstatic.com",
|
|
113
|
+
"connect-src 'self' https://api.example.com",
|
|
114
|
+
"frame-src 'none'",
|
|
115
|
+
"frame-ancestors 'none'",
|
|
116
|
+
"object-src 'none'",
|
|
117
|
+
"base-uri 'self'",
|
|
118
|
+
"form-action 'self'",
|
|
119
|
+
"upgrade-insecure-requests",
|
|
120
|
+
].join("; ");
|
|
121
|
+
|
|
122
|
+
res.setHeader("Content-Security-Policy", csp);
|
|
123
|
+
next();
|
|
124
|
+
};
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
```html
|
|
128
|
+
<!-- Using the nonce in HTML -->
|
|
129
|
+
<script nonce="<%= cspNonce %>">
|
|
130
|
+
// This inline script will execute because it has the matching nonce
|
|
131
|
+
console.log("Allowed by CSP");
|
|
132
|
+
</script>
|
|
133
|
+
|
|
134
|
+
<script>
|
|
135
|
+
// This inline script will be BLOCKED -- no nonce
|
|
136
|
+
console.log("Blocked by CSP");
|
|
137
|
+
</script>
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
### CSP Reporting
|
|
141
|
+
|
|
142
|
+
```typescript
|
|
143
|
+
// Report-To header for CSP violation reports
|
|
144
|
+
app.use((req, res, next) => {
|
|
145
|
+
res.setHeader("Report-To", JSON.stringify({
|
|
146
|
+
group: "csp-endpoint",
|
|
147
|
+
max_age: 86400,
|
|
148
|
+
endpoints: [{ url: "/api/csp-report" }],
|
|
149
|
+
}));
|
|
150
|
+
next();
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
// CSP report handler
|
|
154
|
+
app.post("/api/csp-report", express.json({ type: "application/csp-report" }), (req, res) => {
|
|
155
|
+
const report = req.body["csp-report"];
|
|
156
|
+
logger.warn({
|
|
157
|
+
type: "csp-violation",
|
|
158
|
+
blockedUri: report["blocked-uri"],
|
|
159
|
+
violatedDirective: report["violated-directive"],
|
|
160
|
+
documentUri: report["document-uri"],
|
|
161
|
+
sourceFile: report["source-file"],
|
|
162
|
+
lineNumber: report["line-number"],
|
|
163
|
+
});
|
|
164
|
+
res.status(204).end();
|
|
165
|
+
});
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
---
|
|
169
|
+
|
|
170
|
+
## CORS (Cross-Origin Resource Sharing)
|
|
171
|
+
|
|
172
|
+
CORS controls which origins can make requests to your API from a browser.
|
|
173
|
+
|
|
174
|
+
### How CORS Works
|
|
175
|
+
|
|
176
|
+
1. Browser sends request with `Origin` header
|
|
177
|
+
2. For "simple" requests (GET, HEAD, POST with standard content types): server
|
|
178
|
+
responds with `Access-Control-Allow-Origin`
|
|
179
|
+
3. For "preflighted" requests (PUT, DELETE, custom headers, JSON content type):
|
|
180
|
+
browser sends OPTIONS request first, server responds with CORS headers
|
|
181
|
+
|
|
182
|
+
### CORS Headers Reference
|
|
183
|
+
|
|
184
|
+
| Header | Purpose | Example |
|
|
185
|
+
|--------|---------|---------|
|
|
186
|
+
| `Access-Control-Allow-Origin` | Allowed origins | `https://app.example.com` |
|
|
187
|
+
| `Access-Control-Allow-Methods` | Allowed HTTP methods | `GET, POST, PUT, DELETE` |
|
|
188
|
+
| `Access-Control-Allow-Headers` | Allowed request headers | `Content-Type, Authorization` |
|
|
189
|
+
| `Access-Control-Allow-Credentials` | Allow cookies/auth | `true` |
|
|
190
|
+
| `Access-Control-Expose-Headers` | Headers readable by client | `X-Request-Id` |
|
|
191
|
+
| `Access-Control-Max-Age` | Preflight cache duration (seconds) | `86400` |
|
|
192
|
+
|
|
193
|
+
### Express CORS Configuration
|
|
194
|
+
|
|
195
|
+
```typescript
|
|
196
|
+
import cors from "cors";
|
|
197
|
+
|
|
198
|
+
// Strict CORS -- specific origins only
|
|
199
|
+
const ALLOWED_ORIGINS = [
|
|
200
|
+
"https://app.example.com",
|
|
201
|
+
"https://admin.example.com",
|
|
202
|
+
];
|
|
203
|
+
|
|
204
|
+
app.use(cors({
|
|
205
|
+
origin: (origin, callback) => {
|
|
206
|
+
// Allow requests with no origin (server-to-server, curl)
|
|
207
|
+
if (!origin) {
|
|
208
|
+
return callback(null, true);
|
|
209
|
+
}
|
|
210
|
+
if (ALLOWED_ORIGINS.includes(origin)) {
|
|
211
|
+
return callback(null, true);
|
|
212
|
+
}
|
|
213
|
+
callback(new Error("Not allowed by CORS"));
|
|
214
|
+
},
|
|
215
|
+
methods: ["GET", "POST", "PUT", "DELETE", "PATCH"],
|
|
216
|
+
allowedHeaders: ["Content-Type", "Authorization", "X-Request-Id"],
|
|
217
|
+
exposedHeaders: ["X-Request-Id", "X-RateLimit-Remaining"],
|
|
218
|
+
credentials: true, // Allow cookies
|
|
219
|
+
maxAge: 86400, // Cache preflight for 24 hours
|
|
220
|
+
}));
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
```typescript
|
|
224
|
+
// Per-route CORS (when different routes need different policies)
|
|
225
|
+
import cors from "cors";
|
|
226
|
+
|
|
227
|
+
const publicCors = cors({ origin: "*", credentials: false });
|
|
228
|
+
const privateCors = cors({
|
|
229
|
+
origin: ALLOWED_ORIGINS,
|
|
230
|
+
credentials: true,
|
|
231
|
+
});
|
|
232
|
+
|
|
233
|
+
app.get("/api/public/status", publicCors, statusHandler);
|
|
234
|
+
app.get("/api/user/profile", privateCors, profileHandler);
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
### CORS Anti-Patterns
|
|
238
|
+
|
|
239
|
+
| Anti-Pattern | Risk | Fix |
|
|
240
|
+
|-------------|------|-----|
|
|
241
|
+
| `Access-Control-Allow-Origin: *` with credentials | Browsers reject this combination | Specify exact origins |
|
|
242
|
+
| Reflecting the Origin header without validation | Any site can make requests | Validate against allowlist |
|
|
243
|
+
| Wildcard `*` on authenticated endpoints | Any origin can read responses | Restrict to known origins |
|
|
244
|
+
| Not handling preflight (OPTIONS) | PUT/DELETE/JSON requests fail | Configure CORS middleware properly |
|
|
245
|
+
| Overly broad `Access-Control-Allow-Headers` | Expands attack surface | List only needed headers |
|
|
246
|
+
|
|
247
|
+
---
|
|
248
|
+
|
|
249
|
+
## Security Headers
|
|
250
|
+
|
|
251
|
+
### Complete Security Headers Configuration
|
|
252
|
+
|
|
253
|
+
```typescript
|
|
254
|
+
// Express middleware -- all security headers in one place
|
|
255
|
+
import { RequestHandler } from "express";
|
|
256
|
+
|
|
257
|
+
export const securityHeaders: RequestHandler = (req, res, next) => {
|
|
258
|
+
// Prevent clickjacking
|
|
259
|
+
res.setHeader("X-Frame-Options", "DENY");
|
|
260
|
+
|
|
261
|
+
// Prevent MIME type sniffing
|
|
262
|
+
res.setHeader("X-Content-Type-Options", "nosniff");
|
|
263
|
+
|
|
264
|
+
// Control referrer information
|
|
265
|
+
res.setHeader("Referrer-Policy", "strict-origin-when-cross-origin");
|
|
266
|
+
|
|
267
|
+
// HTTP Strict Transport Security (2 years, include subdomains, preload)
|
|
268
|
+
res.setHeader(
|
|
269
|
+
"Strict-Transport-Security",
|
|
270
|
+
"max-age=63072000; includeSubDomains; preload"
|
|
271
|
+
);
|
|
272
|
+
|
|
273
|
+
// Permissions Policy (disable unused browser features)
|
|
274
|
+
res.setHeader(
|
|
275
|
+
"Permissions-Policy",
|
|
276
|
+
"camera=(), microphone=(), geolocation=(), payment=(self), usb=()"
|
|
277
|
+
);
|
|
278
|
+
|
|
279
|
+
// Prevent XSS in older browsers (modern browsers use CSP instead)
|
|
280
|
+
res.setHeader("X-XSS-Protection", "0");
|
|
281
|
+
|
|
282
|
+
// Cross-Origin policies
|
|
283
|
+
res.setHeader("Cross-Origin-Opener-Policy", "same-origin");
|
|
284
|
+
res.setHeader("Cross-Origin-Embedder-Policy", "require-corp");
|
|
285
|
+
res.setHeader("Cross-Origin-Resource-Policy", "same-origin");
|
|
286
|
+
|
|
287
|
+
next();
|
|
288
|
+
};
|
|
289
|
+
|
|
290
|
+
app.use(securityHeaders);
|
|
291
|
+
```
|
|
292
|
+
|
|
293
|
+
### Header Details
|
|
294
|
+
|
|
295
|
+
#### HSTS (HTTP Strict Transport Security)
|
|
296
|
+
|
|
297
|
+
Forces browsers to use HTTPS for all future requests to the domain.
|
|
298
|
+
|
|
299
|
+
```
|
|
300
|
+
Strict-Transport-Security: max-age=63072000; includeSubDomains; preload
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
- `max-age=63072000` -- Remember for 2 years
|
|
304
|
+
- `includeSubDomains` -- Apply to all subdomains
|
|
305
|
+
- `preload` -- Submit to browser preload list (permanent HTTPS)
|
|
306
|
+
|
|
307
|
+
**Warning**: Only add `preload` after confirming ALL subdomains support HTTPS.
|
|
308
|
+
Preload list inclusion is difficult to reverse.
|
|
309
|
+
|
|
310
|
+
#### X-Frame-Options
|
|
311
|
+
|
|
312
|
+
Prevents the page from being embedded in iframes (clickjacking defense).
|
|
313
|
+
|
|
314
|
+
| Value | Meaning |
|
|
315
|
+
|-------|---------|
|
|
316
|
+
| `DENY` | Never allow framing |
|
|
317
|
+
| `SAMEORIGIN` | Allow framing by same origin only |
|
|
318
|
+
| `ALLOW-FROM https://example.com` | Allow specific origin (deprecated, use CSP frame-ancestors) |
|
|
319
|
+
|
|
320
|
+
**Recommendation**: Use `DENY` and CSP `frame-ancestors 'none'` together.
|
|
321
|
+
|
|
322
|
+
#### Referrer-Policy
|
|
323
|
+
|
|
324
|
+
Controls how much referrer information is sent with requests.
|
|
325
|
+
|
|
326
|
+
| Value | Behavior |
|
|
327
|
+
|-------|----------|
|
|
328
|
+
| `no-referrer` | Never send referrer |
|
|
329
|
+
| `same-origin` | Send referrer only for same-origin requests |
|
|
330
|
+
| `strict-origin` | Send origin (not path) for same-protocol requests |
|
|
331
|
+
| `strict-origin-when-cross-origin` | Full URL for same-origin, origin only for cross-origin (recommended) |
|
|
332
|
+
|
|
333
|
+
#### Permissions-Policy
|
|
334
|
+
|
|
335
|
+
Disable or restrict browser features your application does not use.
|
|
336
|
+
|
|
337
|
+
```
|
|
338
|
+
Permissions-Policy: camera=(), microphone=(), geolocation=(), payment=(self), usb=(), bluetooth=(), accelerometer=(), gyroscope=()
|
|
339
|
+
```
|
|
340
|
+
|
|
341
|
+
- `()` -- Disabled entirely
|
|
342
|
+
- `(self)` -- Allowed for same origin only
|
|
343
|
+
- `(self "https://partner.com")` -- Allowed for same origin and specific partner
|
|
344
|
+
|
|
345
|
+
---
|
|
346
|
+
|
|
347
|
+
## Framework-Specific Configuration
|
|
348
|
+
|
|
349
|
+
### Astro
|
|
350
|
+
|
|
351
|
+
```typescript
|
|
352
|
+
// astro.config.mjs
|
|
353
|
+
import { defineConfig } from "astro/config";
|
|
354
|
+
|
|
355
|
+
export default defineConfig({
|
|
356
|
+
server: {
|
|
357
|
+
headers: {
|
|
358
|
+
"X-Frame-Options": "DENY",
|
|
359
|
+
"X-Content-Type-Options": "nosniff",
|
|
360
|
+
"Referrer-Policy": "strict-origin-when-cross-origin",
|
|
361
|
+
"Permissions-Policy": "camera=(), microphone=(), geolocation=()",
|
|
362
|
+
},
|
|
363
|
+
},
|
|
364
|
+
});
|
|
365
|
+
```
|
|
366
|
+
|
|
367
|
+
```typescript
|
|
368
|
+
// src/middleware.ts (Astro middleware for dynamic CSP nonces)
|
|
369
|
+
import { defineMiddleware } from "astro:middleware";
|
|
370
|
+
import crypto from "crypto";
|
|
371
|
+
|
|
372
|
+
export const onRequest = defineMiddleware(async (context, next) => {
|
|
373
|
+
const nonce = crypto.randomBytes(16).toString("base64");
|
|
374
|
+
context.locals.nonce = nonce;
|
|
375
|
+
|
|
376
|
+
const response = await next();
|
|
377
|
+
|
|
378
|
+
// Clone response to add headers
|
|
379
|
+
const newResponse = new Response(response.body, response);
|
|
380
|
+
|
|
381
|
+
newResponse.headers.set(
|
|
382
|
+
"Content-Security-Policy",
|
|
383
|
+
[
|
|
384
|
+
"default-src 'self'",
|
|
385
|
+
`script-src 'self' 'nonce-${nonce}' 'strict-dynamic'`,
|
|
386
|
+
`style-src 'self' 'nonce-${nonce}'`,
|
|
387
|
+
"img-src 'self' data: https:",
|
|
388
|
+
"connect-src 'self'",
|
|
389
|
+
"frame-ancestors 'none'",
|
|
390
|
+
"object-src 'none'",
|
|
391
|
+
"base-uri 'self'",
|
|
392
|
+
].join("; ")
|
|
393
|
+
);
|
|
394
|
+
|
|
395
|
+
newResponse.headers.set("X-Frame-Options", "DENY");
|
|
396
|
+
newResponse.headers.set("X-Content-Type-Options", "nosniff");
|
|
397
|
+
newResponse.headers.set("Referrer-Policy", "strict-origin-when-cross-origin");
|
|
398
|
+
newResponse.headers.set(
|
|
399
|
+
"Strict-Transport-Security",
|
|
400
|
+
"max-age=63072000; includeSubDomains; preload"
|
|
401
|
+
);
|
|
402
|
+
|
|
403
|
+
return newResponse;
|
|
404
|
+
});
|
|
405
|
+
```
|
|
406
|
+
|
|
407
|
+
### Next.js
|
|
408
|
+
|
|
409
|
+
```typescript
|
|
410
|
+
// next.config.js
|
|
411
|
+
const securityHeaders = [
|
|
412
|
+
{ key: "X-Frame-Options", value: "DENY" },
|
|
413
|
+
{ key: "X-Content-Type-Options", value: "nosniff" },
|
|
414
|
+
{ key: "Referrer-Policy", value: "strict-origin-when-cross-origin" },
|
|
415
|
+
{ key: "Strict-Transport-Security", value: "max-age=63072000; includeSubDomains; preload" },
|
|
416
|
+
{ key: "Permissions-Policy", value: "camera=(), microphone=(), geolocation=()" },
|
|
417
|
+
];
|
|
418
|
+
|
|
419
|
+
module.exports = {
|
|
420
|
+
async headers() {
|
|
421
|
+
return [
|
|
422
|
+
{
|
|
423
|
+
source: "/(.*)",
|
|
424
|
+
headers: securityHeaders,
|
|
425
|
+
},
|
|
426
|
+
];
|
|
427
|
+
},
|
|
428
|
+
};
|
|
429
|
+
```
|
|
430
|
+
|
|
431
|
+
```typescript
|
|
432
|
+
// middleware.ts (Next.js middleware for nonce-based CSP)
|
|
433
|
+
import { NextResponse } from "next/server";
|
|
434
|
+
import type { NextRequest } from "next/server";
|
|
435
|
+
|
|
436
|
+
export function middleware(request: NextRequest) {
|
|
437
|
+
const nonce = Buffer.from(crypto.randomUUID()).toString("base64");
|
|
438
|
+
const response = NextResponse.next();
|
|
439
|
+
|
|
440
|
+
const csp = [
|
|
441
|
+
"default-src 'self'",
|
|
442
|
+
`script-src 'self' 'nonce-${nonce}' 'strict-dynamic'`,
|
|
443
|
+
`style-src 'self' 'nonce-${nonce}'`,
|
|
444
|
+
"img-src 'self' data: https:",
|
|
445
|
+
"connect-src 'self'",
|
|
446
|
+
"frame-ancestors 'none'",
|
|
447
|
+
"object-src 'none'",
|
|
448
|
+
"base-uri 'self'",
|
|
449
|
+
].join("; ");
|
|
450
|
+
|
|
451
|
+
response.headers.set("Content-Security-Policy", csp);
|
|
452
|
+
response.headers.set("x-nonce", nonce);
|
|
453
|
+
|
|
454
|
+
return response;
|
|
455
|
+
}
|
|
456
|
+
```
|
|
457
|
+
|
|
458
|
+
### nginx
|
|
459
|
+
|
|
460
|
+
```nginx
|
|
461
|
+
server {
|
|
462
|
+
listen 443 ssl http2;
|
|
463
|
+
server_name example.com;
|
|
464
|
+
|
|
465
|
+
# Security headers
|
|
466
|
+
add_header X-Frame-Options "DENY" always;
|
|
467
|
+
add_header X-Content-Type-Options "nosniff" always;
|
|
468
|
+
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
|
|
469
|
+
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
|
|
470
|
+
add_header Permissions-Policy "camera=(), microphone=(), geolocation=()" always;
|
|
471
|
+
add_header Cross-Origin-Opener-Policy "same-origin" always;
|
|
472
|
+
add_header Cross-Origin-Embedder-Policy "require-corp" always;
|
|
473
|
+
|
|
474
|
+
# CSP (static -- for dynamic nonces, use application-level middleware)
|
|
475
|
+
add_header Content-Security-Policy "default-src 'self'; script-src 'self'; style-src 'self'; img-src 'self' data: https:; frame-ancestors 'none'; object-src 'none'; base-uri 'self'" always;
|
|
476
|
+
|
|
477
|
+
# CORS for API endpoints
|
|
478
|
+
location /api/ {
|
|
479
|
+
if ($request_method = 'OPTIONS') {
|
|
480
|
+
add_header Access-Control-Allow-Origin "https://app.example.com" always;
|
|
481
|
+
add_header Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS" always;
|
|
482
|
+
add_header Access-Control-Allow-Headers "Content-Type, Authorization" always;
|
|
483
|
+
add_header Access-Control-Max-Age 86400;
|
|
484
|
+
add_header Content-Length 0;
|
|
485
|
+
return 204;
|
|
486
|
+
}
|
|
487
|
+
|
|
488
|
+
add_header Access-Control-Allow-Origin "https://app.example.com" always;
|
|
489
|
+
add_header Access-Control-Allow-Credentials "true" always;
|
|
490
|
+
proxy_pass http://backend;
|
|
491
|
+
}
|
|
492
|
+
|
|
493
|
+
# Remove server version
|
|
494
|
+
server_tokens off;
|
|
495
|
+
}
|
|
496
|
+
```
|
|
497
|
+
|
|
498
|
+
### Cloudflare (via _headers file)
|
|
499
|
+
|
|
500
|
+
```
|
|
501
|
+
# _headers file for Cloudflare Pages
|
|
502
|
+
/*
|
|
503
|
+
X-Frame-Options: DENY
|
|
504
|
+
X-Content-Type-Options: nosniff
|
|
505
|
+
Referrer-Policy: strict-origin-when-cross-origin
|
|
506
|
+
Strict-Transport-Security: max-age=63072000; includeSubDomains; preload
|
|
507
|
+
Permissions-Policy: camera=(), microphone=(), geolocation=()
|
|
508
|
+
Content-Security-Policy: default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:; connect-src 'self' https://api.example.com; frame-ancestors 'none'; object-src 'none'; base-uri 'self'
|
|
509
|
+
```
|
|
510
|
+
|
|
511
|
+
---
|
|
512
|
+
|
|
513
|
+
## Debugging Common Issues
|
|
514
|
+
|
|
515
|
+
### CSP Violations
|
|
516
|
+
|
|
517
|
+
**Symptom**: Scripts or styles not loading, console shows "Refused to execute inline script"
|
|
518
|
+
|
|
519
|
+
```
|
|
520
|
+
Check browser DevTools Console for CSP violation messages.
|
|
521
|
+
Each message tells you which directive blocked which resource.
|
|
522
|
+
```
|
|
523
|
+
|
|
524
|
+
**Fix Strategy**:
|
|
525
|
+
1. Start with `Content-Security-Policy-Report-Only` to log without blocking
|
|
526
|
+
2. Add the necessary sources to the appropriate directive
|
|
527
|
+
3. Prefer nonces over `'unsafe-inline'`
|
|
528
|
+
4. Use `'strict-dynamic'` to trust script-loaded scripts
|
|
529
|
+
|
|
530
|
+
### CORS Errors
|
|
531
|
+
|
|
532
|
+
**Symptom**: "Access to fetch at X from origin Y has been blocked by CORS policy"
|
|
533
|
+
|
|
534
|
+
| Error Message | Cause | Fix |
|
|
535
|
+
|--------------|-------|-----|
|
|
536
|
+
| "No Access-Control-Allow-Origin header" | Server not sending CORS headers | Add CORS middleware |
|
|
537
|
+
| "not included in the Access-Control-Allow-Origin" | Origin not in allowlist | Add origin to allowlist |
|
|
538
|
+
| "Response to preflight does not have HTTP ok status" | OPTIONS handler missing | Handle OPTIONS requests |
|
|
539
|
+
| "Credentials flag is true, but Access-Control-Allow-Credentials is not true" | credentials: true without header | Set `Access-Control-Allow-Credentials: true` |
|
|
540
|
+
| "Cannot use wildcard with credentials" | `*` origin with credentials | Use specific origins, not `*` |
|
|
541
|
+
|
|
542
|
+
### HSTS Issues
|
|
543
|
+
|
|
544
|
+
**Warning**: HSTS with `preload` is difficult to undo. Test without `preload` first.
|
|
545
|
+
|
|
546
|
+
```
|
|
547
|
+
# Test HSTS without preload
|
|
548
|
+
Strict-Transport-Security: max-age=300
|
|
549
|
+
# Then increase gradually
|
|
550
|
+
Strict-Transport-Security: max-age=86400
|
|
551
|
+
# Then add includeSubDomains
|
|
552
|
+
Strict-Transport-Security: max-age=86400; includeSubDomains
|
|
553
|
+
# Finally, add preload after thorough testing
|
|
554
|
+
Strict-Transport-Security: max-age=63072000; includeSubDomains; preload
|
|
555
|
+
```
|
|
556
|
+
|
|
557
|
+
---
|
|
558
|
+
|
|
559
|
+
## Validation Checklist
|
|
560
|
+
|
|
561
|
+
- [ ] CSP blocks inline scripts without nonces
|
|
562
|
+
- [ ] CSP blocks all object/plugin embeds (`object-src 'none'`)
|
|
563
|
+
- [ ] CSP prevents clickjacking (`frame-ancestors 'none'`)
|
|
564
|
+
- [ ] CORS only allows specific, known origins
|
|
565
|
+
- [ ] CORS preflight is handled for non-simple requests
|
|
566
|
+
- [ ] HSTS is set with a long max-age (minimum 1 year for production)
|
|
567
|
+
- [ ] X-Frame-Options is set to DENY
|
|
568
|
+
- [ ] X-Content-Type-Options is set to nosniff
|
|
569
|
+
- [ ] Referrer-Policy restricts information leakage
|
|
570
|
+
- [ ] Permissions-Policy disables unused browser APIs
|
|
571
|
+
- [ ] Server version headers are removed
|
|
572
|
+
- [ ] CSP report-to is configured for violation monitoring
|
|
573
|
+
- [ ] All headers include the `always` flag in nginx
|
|
574
|
+
|
|
575
|
+
---
|
|
576
|
+
|
|
577
|
+
## References
|
|
578
|
+
|
|
579
|
+
- **MDN CSP Guide**: https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP
|
|
580
|
+
- **MDN CORS Guide**: https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS
|
|
581
|
+
- **CSP Evaluator (Google)**: https://csp-evaluator.withgoogle.com/
|
|
582
|
+
- **Security Headers Scanner**: https://securityheaders.com/
|
|
583
|
+
- **OWASP Secure Headers Project**: https://owasp.org/www-project-secure-headers/
|
|
584
|
+
- **HSTS Preload List**: https://hstspreload.org/
|
|
585
|
+
|
|
586
|
+
---
|
|
587
|
+
|
|
588
|
+
**Last verified**: 2026-02-17 | **Skill version**: 1.0.0
|