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.
Files changed (378) hide show
  1. package/bin/cli.mjs +324 -0
  2. package/package.json +34 -0
  3. package/template/.agent/instructions/commands.md +48 -0
  4. package/template/.agent/instructions/patterns.md +61 -0
  5. package/template/.agent/instructions/structure.md +29 -0
  6. package/template/.agent/instructions/tech-stack.md +43 -0
  7. package/template/.agent/instructions/workflow.md +41 -0
  8. package/template/.agent/kit-sync.md +15 -0
  9. package/template/.agent/rules/boundary-not-placeholder.md +146 -0
  10. package/template/.agent/rules/completion-checklist.md +48 -0
  11. package/template/.agent/rules/decision-classification.md +103 -0
  12. package/template/.agent/rules/extensibility.md +47 -0
  13. package/template/.agent/rules/question-vs-command.md +81 -0
  14. package/template/.agent/rules/security-first.md +43 -0
  15. package/template/.agent/rules/specificity-standards.md +54 -0
  16. package/template/.agent/rules/tdd-contract-first.md +57 -0
  17. package/template/.agent/rules/vertical-slices.md +42 -0
  18. package/template/.agent/skill-library/MANIFEST.md +480 -0
  19. package/template/.agent/skill-library/README.md +38 -0
  20. package/template/.agent/skill-library/meta/brand-guidelines/SKILL.md +73 -0
  21. package/template/.agent/skill-library/meta/claude-code/README.md +9 -0
  22. package/template/.agent/skill-library/meta/claude-code/agent-development/SKILL.md +415 -0
  23. package/template/.agent/skill-library/meta/claude-code/hook-development/SKILL.md +712 -0
  24. package/template/.agent/skill-library/meta/claude-code/plugin-structure/SKILL.md +476 -0
  25. package/template/.agent/skill-library/meta/git-advanced/SKILL.md +972 -0
  26. package/template/.agent/skill-library/meta/mcp-builder/SKILL.md +236 -0
  27. package/template/.agent/skill-library/meta/product-marketing-context/SKILL.md +241 -0
  28. package/template/.agent/skill-library/meta/regex-patterns/SKILL.md +751 -0
  29. package/template/.agent/skill-library/meta/tmux-processes/SKILL.md +210 -0
  30. package/template/.agent/skill-library/meta/using-tmux-for-interactive-commands/SKILL.md +178 -0
  31. package/template/.agent/skill-library/stack/3d/threejs-pro/SKILL.md +300 -0
  32. package/template/.agent/skill-library/stack/ai/ai-sdk/SKILL.md +77 -0
  33. package/template/.agent/skill-library/stack/ai/langchain/SKILL.md +530 -0
  34. package/template/.agent/skill-library/stack/ai/ollama/SKILL.md +321 -0
  35. package/template/.agent/skill-library/stack/ai/openai-sdk/SKILL.md +549 -0
  36. package/template/.agent/skill-library/stack/analytics/google-analytics/SKILL.md +153 -0
  37. package/template/.agent/skill-library/stack/api/graphql/SKILL.md +1061 -0
  38. package/template/.agent/skill-library/stack/api/trpc/SKILL.md +576 -0
  39. package/template/.agent/skill-library/stack/auth/authjs/SKILL.md +569 -0
  40. package/template/.agent/skill-library/stack/auth/clerk/SKILL.md +590 -0
  41. package/template/.agent/skill-library/stack/auth/firebase-auth/SKILL.md +734 -0
  42. package/template/.agent/skill-library/stack/cms/payload-cms/SKILL.md +573 -0
  43. package/template/.agent/skill-library/stack/cms/shopify/SKILL.md +1193 -0
  44. package/template/.agent/skill-library/stack/cms/wordpress/SKILL.md +1104 -0
  45. package/template/.agent/skill-library/stack/css/sass-scss/SKILL.md +1121 -0
  46. package/template/.agent/skill-library/stack/css/tailwind-css-patterns/SKILL.md +863 -0
  47. package/template/.agent/skill-library/stack/css/tailwind-design-system/SKILL.md +490 -0
  48. package/template/.agent/skill-library/stack/css/vanilla-css/SKILL.md +1078 -0
  49. package/template/.agent/skill-library/stack/databases/clickhouse/SKILL.md +311 -0
  50. package/template/.agent/skill-library/stack/databases/influxdb/SKILL.md +280 -0
  51. package/template/.agent/skill-library/stack/databases/lancedb/SKILL.md +415 -0
  52. package/template/.agent/skill-library/stack/databases/mongodb/SKILL.md +1169 -0
  53. package/template/.agent/skill-library/stack/databases/neo4j/SKILL.md +839 -0
  54. package/template/.agent/skill-library/stack/databases/pgvector/SKILL.md +241 -0
  55. package/template/.agent/skill-library/stack/databases/pinecone/SKILL.md +212 -0
  56. package/template/.agent/skill-library/stack/databases/postgresql/SKILL.md +658 -0
  57. package/template/.agent/skill-library/stack/databases/qdrant/SKILL.md +312 -0
  58. package/template/.agent/skill-library/stack/databases/redis/SKILL.md +1079 -0
  59. package/template/.agent/skill-library/stack/databases/spacetimedb/SKILL.md +532 -0
  60. package/template/.agent/skill-library/stack/databases/sqlite/SKILL.md +1132 -0
  61. package/template/.agent/skill-library/stack/databases/supabase/SKILL.md +640 -0
  62. package/template/.agent/skill-library/stack/databases/surrealdb-expert/SKILL.md +945 -0
  63. package/template/.agent/skill-library/stack/databases/timescaledb/SKILL.md +745 -0
  64. package/template/.agent/skill-library/stack/databases/weaviate/SKILL.md +218 -0
  65. package/template/.agent/skill-library/stack/devops/github-actions/SKILL.md +554 -0
  66. package/template/.agent/skill-library/stack/devops/kubernetes/SKILL.md +950 -0
  67. package/template/.agent/skill-library/stack/devops/nginx/SKILL.md +841 -0
  68. package/template/.agent/skill-library/stack/devops/terraform/SKILL.md +860 -0
  69. package/template/.agent/skill-library/stack/email/resend/SKILL.md +391 -0
  70. package/template/.agent/skill-library/stack/engines/godot/SKILL.md +488 -0
  71. package/template/.agent/skill-library/stack/extensions/chrome-extension/SKILL.md +375 -0
  72. package/template/.agent/skill-library/stack/extensions/vscode-extension/SKILL.md +453 -0
  73. package/template/.agent/skill-library/stack/frameworks/astro-framework/SKILL.md +162 -0
  74. package/template/.agent/skill-library/stack/frameworks/electron/SKILL.md +1286 -0
  75. package/template/.agent/skill-library/stack/frameworks/fastapi/SKILL.md +650 -0
  76. package/template/.agent/skill-library/stack/frameworks/hono/SKILL.md +90 -0
  77. package/template/.agent/skill-library/stack/frameworks/nestjs/SKILL.md +878 -0
  78. package/template/.agent/skill-library/stack/frameworks/nextjs/SKILL.md +635 -0
  79. package/template/.agent/skill-library/stack/frameworks/nuxt/SKILL.md +564 -0
  80. package/template/.agent/skill-library/stack/frameworks/sveltekit/SKILL.md +614 -0
  81. package/template/.agent/skill-library/stack/frameworks/tauri/SKILL.md +920 -0
  82. package/template/.agent/skill-library/stack/gamedev/godot/SKILL.md +1032 -0
  83. package/template/.agent/skill-library/stack/gamedev/unity/SKILL.md +1175 -0
  84. package/template/.agent/skill-library/stack/hosting/aws/SKILL.md +467 -0
  85. package/template/.agent/skill-library/stack/hosting/cloudflare/SKILL.md +201 -0
  86. package/template/.agent/skill-library/stack/hosting/docker-expert/SKILL.md +409 -0
  87. package/template/.agent/skill-library/stack/hosting/vercel/SKILL.md +484 -0
  88. package/template/.agent/skill-library/stack/languages/bash-scripting/SKILL.md +773 -0
  89. package/template/.agent/skill-library/stack/languages/c-cpp/SKILL.md +712 -0
  90. package/template/.agent/skill-library/stack/languages/gdscript/SKILL.md +789 -0
  91. package/template/.agent/skill-library/stack/languages/go/SKILL.md +664 -0
  92. package/template/.agent/skill-library/stack/languages/java/SKILL.md +778 -0
  93. package/template/.agent/skill-library/stack/languages/kotlin/SKILL.md +665 -0
  94. package/template/.agent/skill-library/stack/languages/python/SKILL.md +678 -0
  95. package/template/.agent/skill-library/stack/languages/rust/SKILL.md +673 -0
  96. package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/SKILL.md +141 -0
  97. package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/advanced-generics.md +90 -0
  98. package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/branded-types.md +57 -0
  99. package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/builder-pattern.md +71 -0
  100. package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/common-pitfalls.md +135 -0
  101. package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/conditional-types.md +27 -0
  102. package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/decorators.md +98 -0
  103. package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/discriminated-unions.md +62 -0
  104. package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/mapped-types.md +53 -0
  105. package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/performance-best-practices.md +104 -0
  106. package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/template-literal-types.md +49 -0
  107. package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/testing-types.md +112 -0
  108. package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/type-guards.md +70 -0
  109. package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/type-inference.md +101 -0
  110. package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/utility-types.md +98 -0
  111. package/template/.agent/skill-library/stack/languages/vanilla-javascript/SKILL.md +803 -0
  112. package/template/.agent/skill-library/stack/messaging/kafka/SKILL.md +235 -0
  113. package/template/.agent/skill-library/stack/mobile/expo-react-native/SKILL.md +665 -0
  114. package/template/.agent/skill-library/stack/mobile/flutter/SKILL.md +316 -0
  115. package/template/.agent/skill-library/stack/mobile/react-native/SKILL.md +337 -0
  116. package/template/.agent/skill-library/stack/monitoring/posthog/SKILL.md +396 -0
  117. package/template/.agent/skill-library/stack/monitoring/sentry/SKILL.md +509 -0
  118. package/template/.agent/skill-library/stack/observability/datadog/SKILL.md +179 -0
  119. package/template/.agent/skill-library/stack/observability/distributed-tracing/SKILL.md +140 -0
  120. package/template/.agent/skill-library/stack/observability/logging-best-practices/SKILL.md +168 -0
  121. package/template/.agent/skill-library/stack/observability/opentelemetry/SKILL.md +164 -0
  122. package/template/.agent/skill-library/stack/observability/prometheus-grafana/SKILL.md +246 -0
  123. package/template/.agent/skill-library/stack/observability/python-observability/SKILL.md +158 -0
  124. package/template/.agent/skill-library/stack/orm/drizzle-orm/SKILL.md +613 -0
  125. package/template/.agent/skill-library/stack/orm/prisma/SKILL.md +744 -0
  126. package/template/.agent/skill-library/stack/payments/lemonsqueezy/SKILL.md +393 -0
  127. package/template/.agent/skill-library/stack/payments/stripe-integration/SKILL.md +457 -0
  128. package/template/.agent/skill-library/stack/queue/bullmq/SKILL.md +385 -0
  129. package/template/.agent/skill-library/stack/queue/inngest/SKILL.md +438 -0
  130. package/template/.agent/skill-library/stack/realtime/socketio/SKILL.md +595 -0
  131. package/template/.agent/skill-library/stack/search/elasticsearch/SKILL.md +248 -0
  132. package/template/.agent/skill-library/stack/search/meilisearch/SKILL.md +385 -0
  133. package/template/.agent/skill-library/stack/security/crypto-patterns/SKILL.md +437 -0
  134. package/template/.agent/skill-library/stack/security/csp-cors-headers/SKILL.md +588 -0
  135. package/template/.agent/skill-library/stack/security/dependency-auditing/SKILL.md +560 -0
  136. package/template/.agent/skill-library/stack/security/input-sanitization/SKILL.md +430 -0
  137. package/template/.agent/skill-library/stack/security/owasp-web-security/SKILL.md +421 -0
  138. package/template/.agent/skill-library/stack/state/tanstack-query/SKILL.md +637 -0
  139. package/template/.agent/skill-library/stack/state/zustand/SKILL.md +483 -0
  140. package/template/.agent/skill-library/stack/storage/aws-s3/SKILL.md +415 -0
  141. package/template/.agent/skill-library/stack/testing/playwright/SKILL.md +641 -0
  142. package/template/.agent/skill-library/stack/testing/storybook/SKILL.md +923 -0
  143. package/template/.agent/skill-library/stack/testing/testing-library/SKILL.md +872 -0
  144. package/template/.agent/skill-library/stack/testing/vitest/SKILL.md +714 -0
  145. package/template/.agent/skill-library/stack/ui/react-best-practices/SKILL.md +877 -0
  146. package/template/.agent/skill-library/stack/ui/react-composition-patterns/SKILL.md +1107 -0
  147. package/template/.agent/skill-library/stack/ui/react-flow/SKILL.md +425 -0
  148. package/template/.agent/skill-library/stack/ui/shadcn-ui/SKILL.md +703 -0
  149. package/template/.agent/skill-library/surface/api/api-caching/SKILL.md +458 -0
  150. package/template/.agent/skill-library/surface/api/api-documentation-openapi/SKILL.md +697 -0
  151. package/template/.agent/skill-library/surface/api/api-error-handling/SKILL.md +478 -0
  152. package/template/.agent/skill-library/surface/api/api-security-checklist/SKILL.md +147 -0
  153. package/template/.agent/skill-library/surface/api/api-versioning/SKILL.md +420 -0
  154. package/template/.agent/skill-library/surface/api/email-best-practices/SKILL.md +59 -0
  155. package/template/.agent/skill-library/surface/api/rate-limiting-abuse-protection/SKILL.md +147 -0
  156. package/template/.agent/skill-library/surface/api/rest-api-design/SKILL.md +478 -0
  157. package/template/.agent/skill-library/surface/api/webhook-design/SKILL.md +752 -0
  158. package/template/.agent/skill-library/surface/cli/cli-configuration-management/SKILL.md +445 -0
  159. package/template/.agent/skill-library/surface/cli/cli-error-diagnostics/SKILL.md +515 -0
  160. package/template/.agent/skill-library/surface/cli/cli-shell-integration/SKILL.md +479 -0
  161. package/template/.agent/skill-library/surface/cli/cli-ux-design/SKILL.md +477 -0
  162. package/template/.agent/skill-library/surface/desktop/desktop-app-distribution/SKILL.md +416 -0
  163. package/template/.agent/skill-library/surface/desktop/desktop-security-sandboxing/SKILL.md +407 -0
  164. package/template/.agent/skill-library/surface/desktop/desktop-ux-conventions/SKILL.md +361 -0
  165. package/template/.agent/skill-library/surface/desktop/native-os-integration/SKILL.md +563 -0
  166. package/template/.agent/skill-library/surface/extension/browser-extension-patterns/SKILL.md +482 -0
  167. package/template/.agent/skill-library/surface/extension/plugin-architecture-design/SKILL.md +632 -0
  168. package/template/.agent/skill-library/surface/extension/vscode-extension-development/SKILL.md +728 -0
  169. package/template/.agent/skill-library/surface/mobile/app-store-submission/SKILL.md +304 -0
  170. package/template/.agent/skill-library/surface/mobile/mobile-offline-sync/SKILL.md +443 -0
  171. package/template/.agent/skill-library/surface/mobile/mobile-responsive-patterns/SKILL.md +432 -0
  172. package/template/.agent/skill-library/surface/mobile/push-notifications/SKILL.md +495 -0
  173. package/template/.agent/skill-library/surface/web/accessibility-compliance/SKILL.md +827 -0
  174. package/template/.agent/skill-library/surface/web/ai-seo/SKILL.md +398 -0
  175. package/template/.agent/skill-library/surface/web/ai-seo/references/content-patterns.md +285 -0
  176. package/template/.agent/skill-library/surface/web/ai-seo/references/platform-ranking-factors.md +152 -0
  177. package/template/.agent/skill-library/surface/web/analytics-tracking/SKILL.md +309 -0
  178. package/template/.agent/skill-library/surface/web/analytics-tracking/references/event-library.md +260 -0
  179. package/template/.agent/skill-library/surface/web/analytics-tracking/references/ga4-implementation.md +300 -0
  180. package/template/.agent/skill-library/surface/web/analytics-tracking/references/gtm-implementation.md +390 -0
  181. package/template/.agent/skill-library/surface/web/authentication-ui-flows/SKILL.md +530 -0
  182. package/template/.agent/skill-library/surface/web/dark-mode-theming/SKILL.md +516 -0
  183. package/template/.agent/skill-library/surface/web/design-reference-data/SKILL.md +105 -0
  184. package/template/.agent/skill-library/surface/web/design-reference-data/data/charts.csv +26 -0
  185. package/template/.agent/skill-library/surface/web/design-reference-data/data/colors.csv +97 -0
  186. package/template/.agent/skill-library/surface/web/design-reference-data/data/landing.csv +31 -0
  187. package/template/.agent/skill-library/surface/web/design-reference-data/data/styles.csv +59 -0
  188. package/template/.agent/skill-library/surface/web/design-reference-data/data/typography.csv +58 -0
  189. package/template/.agent/skill-library/surface/web/design-reference-data/data/ux-guidelines.csv +100 -0
  190. package/template/.agent/skill-library/surface/web/design-reference-data/scripts/core.py +258 -0
  191. package/template/.agent/skill-library/surface/web/design-reference-data/scripts/design_system.py +1067 -0
  192. package/template/.agent/skill-library/surface/web/design-reference-data/scripts/search.py +106 -0
  193. package/template/.agent/skill-library/surface/web/form-handling-validation/SKILL.md +675 -0
  194. package/template/.agent/skill-library/surface/web/frontend-design/SKILL.md +1393 -0
  195. package/template/.agent/skill-library/surface/web/frontend-design/templates/cppn-hero.tsx +299 -0
  196. package/template/.agent/skill-library/surface/web/frontend-design/templates/wave-hero.tsx +875 -0
  197. package/template/.agent/skill-library/surface/web/frontend-verification/SKILL.md +111 -0
  198. package/template/.agent/skill-library/surface/web/frontend-verification/scripts/ux_audit.py +739 -0
  199. package/template/.agent/skill-library/surface/web/i18n-localization/SKILL.md +154 -0
  200. package/template/.agent/skill-library/surface/web/offline-first-pwa/SKILL.md +657 -0
  201. package/template/.agent/skill-library/surface/web/page-cro/SKILL.md +182 -0
  202. package/template/.agent/skill-library/surface/web/page-cro/references/experiments.md +248 -0
  203. package/template/.agent/skill-library/surface/web/programmatic-seo/SKILL.md +238 -0
  204. package/template/.agent/skill-library/surface/web/programmatic-seo/references/playbooks.md +308 -0
  205. package/template/.agent/skill-library/surface/web/schema-markup/SKILL.md +179 -0
  206. package/template/.agent/skill-library/surface/web/schema-markup/references/schema-examples.md +398 -0
  207. package/template/.agent/skill-library/surface/web/seo-audit/SKILL.md +394 -0
  208. package/template/.agent/skill-library/surface/web/seo-audit/references/ai-writing-detection.md +200 -0
  209. package/template/.agent/skill-library/surface/web/web-performance-optimization/SKILL.md +646 -0
  210. package/template/.agent/skill-library/surface/web/web-scraping/SKILL.md +58 -0
  211. package/template/.agent/skills/accessibility/SKILL.md +522 -0
  212. package/template/.agent/skills/accessibility/references/WCAG.md +162 -0
  213. package/template/.agent/skills/adversarial-review/SKILL.md +90 -0
  214. package/template/.agent/skills/antigravity-workflows/SKILL.md +81 -0
  215. package/template/.agent/skills/antigravity-workflows/resources/implementation-playbook.md +36 -0
  216. package/template/.agent/skills/api-design-principles/SKILL.md +37 -0
  217. package/template/.agent/skills/api-design-principles/assets/api-design-checklist.md +155 -0
  218. package/template/.agent/skills/api-design-principles/assets/rest-api-template.py +182 -0
  219. package/template/.agent/skills/api-design-principles/references/graphql-schema-design.md +583 -0
  220. package/template/.agent/skills/api-design-principles/references/rest-best-practices.md +408 -0
  221. package/template/.agent/skills/api-design-principles/resources/implementation-playbook.md +513 -0
  222. package/template/.agent/skills/api-versioning/SKILL.md +420 -0
  223. package/template/.agent/skills/architecture-mapping/SKILL.md +219 -0
  224. package/template/.agent/skills/bootstrap-agents/SKILL.md +259 -0
  225. package/template/.agent/skills/brainstorming/SKILL.md +236 -0
  226. package/template/.agent/skills/brand-guidelines/SKILL.md +44 -0
  227. package/template/.agent/skills/clean-code/SKILL.md +94 -0
  228. package/template/.agent/skills/code-review-pro/SKILL.md +152 -0
  229. package/template/.agent/skills/concise-planning/SKILL.md +68 -0
  230. package/template/.agent/skills/cross-layer-consistency/SKILL.md +117 -0
  231. package/template/.agent/skills/database-schema-design/SKILL.md +429 -0
  232. package/template/.agent/skills/deployment-procedures/SKILL.md +241 -0
  233. package/template/.agent/skills/design-anti-cliche/SKILL.md +159 -0
  234. package/template/.agent/skills/design-direction/SKILL.md +45 -0
  235. package/template/.agent/skills/error-handling-patterns/SKILL.md +721 -0
  236. package/template/.agent/skills/find-skills/SKILL.md +145 -0
  237. package/template/.agent/skills/git-advanced/SKILL.md +972 -0
  238. package/template/.agent/skills/git-workflow/SKILL.md +420 -0
  239. package/template/.agent/skills/idea-extraction/SKILL.md +271 -0
  240. package/template/.agent/skills/logging-best-practices/SKILL.md +851 -0
  241. package/template/.agent/skills/migration-management/SKILL.md +384 -0
  242. package/template/.agent/skills/minimalist-surgical-development/SKILL.md +69 -0
  243. package/template/.agent/skills/parallel-agents/SKILL.md +165 -0
  244. package/template/.agent/skills/parallel-debugging/SKILL.md +135 -0
  245. package/template/.agent/skills/parallel-feature-development/SKILL.md +166 -0
  246. package/template/.agent/skills/performance-budgeting/SKILL.md +144 -0
  247. package/template/.agent/skills/pipeline-rubrics/SKILL.md +51 -0
  248. package/template/.agent/skills/pipeline-rubrics/references/architecture-rubric.md +19 -0
  249. package/template/.agent/skills/pipeline-rubrics/references/be-rubric.md +21 -0
  250. package/template/.agent/skills/pipeline-rubrics/references/fe-rubric.md +20 -0
  251. package/template/.agent/skills/pipeline-rubrics/references/ia-rubric.md +19 -0
  252. package/template/.agent/skills/pipeline-rubrics/references/scoring.md +28 -0
  253. package/template/.agent/skills/pipeline-rubrics/references/vision-rubric.md +11 -0
  254. package/template/.agent/skills/prd-templates/SKILL.md +88 -0
  255. package/template/.agent/skills/prd-templates/references/architecture-design-template.md +88 -0
  256. package/template/.agent/skills/prd-templates/references/be-spec-template.md +101 -0
  257. package/template/.agent/skills/prd-templates/references/data-placement-template.md +74 -0
  258. package/template/.agent/skills/prd-templates/references/decomposition-templates.md +211 -0
  259. package/template/.agent/skills/prd-templates/references/design-system-decisions.md +198 -0
  260. package/template/.agent/skills/prd-templates/references/engineering-standards-template.md +124 -0
  261. package/template/.agent/skills/prd-templates/references/fe-classification-procedures.md +47 -0
  262. package/template/.agent/skills/prd-templates/references/fe-spec-template.md +84 -0
  263. package/template/.agent/skills/prd-templates/references/infrastructure-report-template.md +71 -0
  264. package/template/.agent/skills/prd-templates/references/operational-templates.md +116 -0
  265. package/template/.agent/skills/prd-templates/references/placeholder-guard-template.md +21 -0
  266. package/template/.agent/skills/prd-templates/references/surface-model.md +61 -0
  267. package/template/.agent/skills/prd-templates/references/vision-template.md +66 -0
  268. package/template/.agent/skills/prompt-engineer/README.md +659 -0
  269. package/template/.agent/skills/prompt-engineer/SKILL.md +249 -0
  270. package/template/.agent/skills/regex-patterns/SKILL.md +751 -0
  271. package/template/.agent/skills/resolve-ambiguity/SKILL.md +278 -0
  272. package/template/.agent/skills/rest-api-design/SKILL.md +478 -0
  273. package/template/.agent/skills/security-scanning-security-hardening/SKILL.md +231 -0
  274. package/template/.agent/skills/session-continuity/SKILL.md +730 -0
  275. package/template/.agent/skills/session-continuity/protocols/01-session-resumption.md +38 -0
  276. package/template/.agent/skills/session-continuity/protocols/02-progress-generation.md +85 -0
  277. package/template/.agent/skills/session-continuity/protocols/03-progress-update.md +70 -0
  278. package/template/.agent/skills/session-continuity/protocols/04-pattern-extraction.md +60 -0
  279. package/template/.agent/skills/session-continuity/protocols/05-session-close.md +37 -0
  280. package/template/.agent/skills/session-continuity/protocols/06-decision-analysis.md +84 -0
  281. package/template/.agent/skills/session-continuity/protocols/07-spec-pipeline-generation.md +48 -0
  282. package/template/.agent/skills/session-continuity/protocols/08-spec-pipeline-update.md +43 -0
  283. package/template/.agent/skills/session-continuity/protocols/09-parallel-claim.md +122 -0
  284. package/template/.agent/skills/session-continuity/protocols/10-placeholder-verification-gate.md +104 -0
  285. package/template/.agent/skills/session-continuity/protocols/ambiguity-gates.md +48 -0
  286. package/template/.agent/skills/skill-creator/LICENSE.txt +202 -0
  287. package/template/.agent/skills/skill-creator/README.md +270 -0
  288. package/template/.agent/skills/skill-creator/SKILL.md +590 -0
  289. package/template/.agent/skills/skill-creator/references/output-patterns.md +82 -0
  290. package/template/.agent/skills/skill-creator/references/workflows.md +28 -0
  291. package/template/.agent/skills/skill-creator/scripts/init_skill.py +303 -0
  292. package/template/.agent/skills/skill-creator/scripts/package_skill.py +110 -0
  293. package/template/.agent/skills/skill-creator/scripts/quick_validate.py +95 -0
  294. package/template/.agent/skills/spec-writing/SKILL.md +110 -0
  295. package/template/.agent/skills/systematic-debugging/CREATION-LOG.md +119 -0
  296. package/template/.agent/skills/systematic-debugging/SKILL.md +297 -0
  297. package/template/.agent/skills/systematic-debugging/condition-based-waiting-example.ts +158 -0
  298. package/template/.agent/skills/systematic-debugging/condition-based-waiting.md +115 -0
  299. package/template/.agent/skills/systematic-debugging/defense-in-depth.md +122 -0
  300. package/template/.agent/skills/systematic-debugging/find-polluter.sh +63 -0
  301. package/template/.agent/skills/systematic-debugging/root-cause-tracing.md +169 -0
  302. package/template/.agent/skills/systematic-debugging/test-academic.md +14 -0
  303. package/template/.agent/skills/systematic-debugging/test-pressure-1.md +58 -0
  304. package/template/.agent/skills/systematic-debugging/test-pressure-2.md +68 -0
  305. package/template/.agent/skills/systematic-debugging/test-pressure-3.md +69 -0
  306. package/template/.agent/skills/tdd-workflow/SKILL.md +409 -0
  307. package/template/.agent/skills/tech-stack-catalog/SKILL.md +49 -0
  308. package/template/.agent/skills/tech-stack-catalog/references/constraint-questions.md +21 -0
  309. package/template/.agent/skills/tech-stack-catalog/references/dev-tooling-decisions.md +37 -0
  310. package/template/.agent/skills/tech-stack-catalog/references/surface-decision-tables.md +69 -0
  311. package/template/.agent/skills/technical-writer/SKILL.md +242 -0
  312. package/template/.agent/skills/testing-strategist/SKILL.md +932 -0
  313. package/template/.agent/skills/verification-before-completion/SKILL.md +145 -0
  314. package/template/.agent/skills/workflow-automation/SKILL.md +73 -0
  315. package/template/.agent/workflows/audit-ambiguity-execute.md +165 -0
  316. package/template/.agent/workflows/audit-ambiguity-rubrics.md +83 -0
  317. package/template/.agent/workflows/audit-ambiguity.md +64 -0
  318. package/template/.agent/workflows/bootstrap-agents-fill.md +201 -0
  319. package/template/.agent/workflows/bootstrap-agents-provision.md +197 -0
  320. package/template/.agent/workflows/bootstrap-agents.md +66 -0
  321. package/template/.agent/workflows/create-prd-architecture.md +119 -0
  322. package/template/.agent/workflows/create-prd-compile.md +138 -0
  323. package/template/.agent/workflows/create-prd-design-system.md +135 -0
  324. package/template/.agent/workflows/create-prd-security.md +113 -0
  325. package/template/.agent/workflows/create-prd-stack.md +91 -0
  326. package/template/.agent/workflows/create-prd.md +168 -0
  327. package/template/.agent/workflows/decompose-architecture-structure.md +82 -0
  328. package/template/.agent/workflows/decompose-architecture-validate.md +119 -0
  329. package/template/.agent/workflows/decompose-architecture.md +111 -0
  330. package/template/.agent/workflows/evolve-contract.md +98 -0
  331. package/template/.agent/workflows/evolve-feature-cascade.md +140 -0
  332. package/template/.agent/workflows/evolve-feature-classify.md +116 -0
  333. package/template/.agent/workflows/evolve-feature.md +56 -0
  334. package/template/.agent/workflows/ideate-discover.md +144 -0
  335. package/template/.agent/workflows/ideate-extract.md +129 -0
  336. package/template/.agent/workflows/ideate-validate.md +117 -0
  337. package/template/.agent/workflows/ideate.md +113 -0
  338. package/template/.agent/workflows/implement-slice-setup.md +113 -0
  339. package/template/.agent/workflows/implement-slice-tdd.md +198 -0
  340. package/template/.agent/workflows/implement-slice.md +50 -0
  341. package/template/.agent/workflows/plan-phase.md +202 -0
  342. package/template/.agent/workflows/propagate-decision-apply.md +135 -0
  343. package/template/.agent/workflows/propagate-decision-scan.md +147 -0
  344. package/template/.agent/workflows/propagate-decision.md +56 -0
  345. package/template/.agent/workflows/remediate-pipeline-assess.md +138 -0
  346. package/template/.agent/workflows/remediate-pipeline-execute.md +135 -0
  347. package/template/.agent/workflows/remediate-pipeline.md +55 -0
  348. package/template/.agent/workflows/resolve-ambiguity.md +82 -0
  349. package/template/.agent/workflows/sync-kit.md +209 -0
  350. package/template/.agent/workflows/update-architecture-map.md +74 -0
  351. package/template/.agent/workflows/validate-phase.md +219 -0
  352. package/template/.agent/workflows/verify-infrastructure.md +207 -0
  353. package/template/.agent/workflows/write-architecture-spec-deepen.md +139 -0
  354. package/template/.agent/workflows/write-architecture-spec-design.md +202 -0
  355. package/template/.agent/workflows/write-architecture-spec.md +63 -0
  356. package/template/.agent/workflows/write-be-spec-classify.md +165 -0
  357. package/template/.agent/workflows/write-be-spec-write.md +98 -0
  358. package/template/.agent/workflows/write-be-spec.md +76 -0
  359. package/template/.agent/workflows/write-fe-spec-classify.md +170 -0
  360. package/template/.agent/workflows/write-fe-spec-write.md +94 -0
  361. package/template/.agent/workflows/write-fe-spec.md +71 -0
  362. package/template/AGENTS.md +176 -0
  363. package/template/GEMINI.md +177 -0
  364. package/template/docs/README.md +187 -0
  365. package/template/docs/audits/.gitkeep +0 -0
  366. package/template/docs/audits/README.md +10 -0
  367. package/template/docs/plans/.gitkeep +0 -0
  368. package/template/docs/plans/README.md +21 -0
  369. package/template/docs/plans/be/.gitkeep +0 -0
  370. package/template/docs/plans/be/README.md +11 -0
  371. package/template/docs/plans/fe/.gitkeep +0 -0
  372. package/template/docs/plans/fe/README.md +11 -0
  373. package/template/docs/plans/ia/.gitkeep +0 -0
  374. package/template/docs/plans/ia/README.md +17 -0
  375. package/template/docs/plans/ia/deep-dives/.gitkeep +0 -0
  376. package/template/docs/plans/ia/deep-dives/README.md +5 -0
  377. package/template/docs/plans/phases/.gitkeep +0 -0
  378. 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