@olives/devos 2.1.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/.agents/AGENTS.md +316 -0
- package/.agents/README.md +55 -0
- package/.agents/agents/architect.md +18 -0
- package/.agents/agents/dba.md +25 -0
- package/.agents/agents/developer.md +40 -0
- package/.agents/agents/devops.md +18 -0
- package/.agents/agents/memory-manager.md +38 -0
- package/.agents/agents/orchestrator.md +92 -0
- package/.agents/agents/qa.md +53 -0
- package/.agents/agents/release-manager.md +41 -0
- package/.agents/agents/researcher.md +19 -0
- package/.agents/agents/security.md +27 -0
- package/.agents/agents/tester.md +21 -0
- package/.agents/commands/README.md +42 -0
- package/.agents/commands/architect.md +16 -0
- package/.agents/commands/commit.md +15 -0
- package/.agents/commands/deploy.md +18 -0
- package/.agents/commands/fix.md +19 -0
- package/.agents/commands/refactor.md +19 -0
- package/.agents/commands/research.md +19 -0
- package/.agents/commands/review.md +21 -0
- package/.agents/commands/secure.md +23 -0
- package/.agents/commands/status.md +16 -0
- package/.agents/commands/test.md +16 -0
- package/.agents/scripts/commit.sh +73 -0
- package/.agents/scripts/install-hooks.sh +72 -0
- package/.agents/skills/agent-browser/SKILL.md +50 -0
- package/.agents/skills/agent-development/SKILL.md +415 -0
- package/.agents/skills/agent-development/examples/agent-creation-prompt.md +238 -0
- package/.agents/skills/agent-development/examples/complete-agent-examples.md +427 -0
- package/.agents/skills/agent-development/references/agent-creation-system-prompt.md +207 -0
- package/.agents/skills/agent-development/references/system-prompt-design.md +411 -0
- package/.agents/skills/agent-development/references/triggering-examples.md +491 -0
- package/.agents/skills/agent-development/scripts/validate-agent.sh +217 -0
- package/.agents/skills/backend-dev-guidelines/SKILL.md +352 -0
- package/.agents/skills/backend-dev-guidelines/resources/architecture-overview.md +451 -0
- package/.agents/skills/backend-dev-guidelines/resources/async-and-errors.md +307 -0
- package/.agents/skills/backend-dev-guidelines/resources/complete-examples.md +638 -0
- package/.agents/skills/backend-dev-guidelines/resources/configuration.md +275 -0
- package/.agents/skills/backend-dev-guidelines/resources/database-patterns.md +224 -0
- package/.agents/skills/backend-dev-guidelines/resources/middleware-guide.md +213 -0
- package/.agents/skills/backend-dev-guidelines/resources/routing-and-controllers.md +756 -0
- package/.agents/skills/backend-dev-guidelines/resources/sentry-and-monitoring.md +336 -0
- package/.agents/skills/backend-dev-guidelines/resources/services-and-repositories.md +789 -0
- package/.agents/skills/backend-dev-guidelines/resources/testing-guide.md +235 -0
- package/.agents/skills/backend-dev-guidelines/resources/validation-patterns.md +754 -0
- package/.agents/skills/backend-development/SKILL.md +156 -0
- package/.agents/skills/backend-patterns/SKILL.md +562 -0
- package/.agents/skills/brainstorming/SKILL.md +159 -0
- package/.agents/skills/brainstorming/scripts/frame-template.html +213 -0
- package/.agents/skills/brainstorming/scripts/helper.js +167 -0
- package/.agents/skills/brainstorming/scripts/server.cjs +723 -0
- package/.agents/skills/brainstorming/scripts/start-server.sh +209 -0
- package/.agents/skills/brainstorming/scripts/stop-server.sh +120 -0
- package/.agents/skills/brainstorming/spec-document-reviewer-prompt.md +49 -0
- package/.agents/skills/brainstorming/visual-companion.md +291 -0
- package/.agents/skills/code-reviewer/SKILL.md +65 -0
- package/.agents/skills/content-strategy/SKILL.md +365 -0
- package/.agents/skills/content-strategy/evals/evals.json +90 -0
- package/.agents/skills/content-strategy/references/headless-cms.md +194 -0
- package/.agents/skills/deploy-to-vercel/SKILL.md +296 -0
- package/.agents/skills/deploy-to-vercel/resources/deploy-codex.sh +301 -0
- package/.agents/skills/deploy-to-vercel/resources/deploy.sh +301 -0
- package/.agents/skills/deployment-checklist/SKILL.md +119 -0
- package/.agents/skills/design/SKILL.md +170 -0
- package/.agents/skills/design-an-interface/SKILL.md +94 -0
- package/.agents/skills/expose-localhost/SKILL.md +211 -0
- package/.agents/skills/expose-localhost/references/TROUBLESHOOTING.md +27 -0
- package/.agents/skills/find-skills/SKILL.md +142 -0
- package/.agents/skills/frontend-ui-engineering/SKILL.md +328 -0
- package/.agents/skills/git-commit/SKILL.md +124 -0
- package/.agents/skills/git-ops/SKILL.md +53 -0
- package/.agents/skills/git-workflow/SKILL.md +167 -0
- package/.agents/skills/google-agents-cli-adk-code/SKILL.md +72 -0
- package/.agents/skills/google-agents-cli-adk-code/references/adk-python.md +937 -0
- package/.agents/skills/google-agents-cli-adk-code/references/adk-workflows.md +507 -0
- package/.agents/skills/google-agents-cli-workflow/SKILL.md +310 -0
- package/.agents/skills/google-agents-cli-workflow/references/commands.md +12 -0
- package/.agents/skills/google-agents-cli-workflow/references/internals.md +24 -0
- package/.agents/skills/google-agents-cli-workflow/references/samples.md +59 -0
- package/.agents/skills/google-agents-cli-workflow/references/spec-template.md +25 -0
- package/.agents/skills/google-agents-cli-workflow/references/terminology.md +11 -0
- package/.agents/skills/grill-me/SKILL.md +47 -0
- package/.agents/skills/grill-with-docs/SKILL.md +7 -0
- package/.agents/skills/human-checkpoint/SKILL.md +21 -0
- package/.agents/skills/image/SKILL.md +340 -0
- package/.agents/skills/image/evals/evals.json +89 -0
- package/.agents/skills/image/references/ai-image-prompting.md +229 -0
- package/.agents/skills/image-generation/SKILL.md +374 -0
- package/.agents/skills/imagegen/LICENSE.txt +201 -0
- package/.agents/skills/imagegen/SKILL.md +279 -0
- package/.agents/skills/imagegen/agents/openai.yaml +6 -0
- package/.agents/skills/imagegen/assets/imagegen-small.svg +5 -0
- package/.agents/skills/imagegen/assets/imagegen.png +0 -0
- package/.agents/skills/imagegen/references/cli.md +160 -0
- package/.agents/skills/imagegen/references/codex-network.md +33 -0
- package/.agents/skills/imagegen/references/image-api.md +49 -0
- package/.agents/skills/imagegen/references/prompting.md +98 -0
- package/.agents/skills/imagegen/references/sample-prompts.md +376 -0
- package/.agents/skills/imagegen/scripts/image_gen.py +926 -0
- package/.agents/skills/imagegen-frontend-web/SKILL.md +987 -0
- package/.agents/skills/laravel-security/SKILL.md +948 -0
- package/.agents/skills/laravel-specialist/SKILL.md +264 -0
- package/.agents/skills/laravel-specialist/references/eloquent.md +351 -0
- package/.agents/skills/laravel-specialist/references/livewire.md +512 -0
- package/.agents/skills/laravel-specialist/references/queues.md +423 -0
- package/.agents/skills/laravel-specialist/references/routing.md +362 -0
- package/.agents/skills/laravel-specialist/references/testing.md +522 -0
- package/.agents/skills/laravel-tdd/SKILL.md +675 -0
- package/.agents/skills/laravel-verification/SKILL.md +180 -0
- package/.agents/skills/modern-web-guidance/SKILL.md +114 -0
- package/.agents/skills/modern-web-guidance/guides/accessibility/accessibility.md +463 -0
- package/.agents/skills/modern-web-guidance/guides/accessibility/accessible-error-announcement.md +207 -0
- package/.agents/skills/modern-web-guidance/guides/built-in-ai/language-detection.md +89 -0
- package/.agents/skills/modern-web-guidance/guides/built-in-ai/language-model.md +189 -0
- package/.agents/skills/modern-web-guidance/guides/built-in-ai/prompt-api.md +189 -0
- package/.agents/skills/modern-web-guidance/guides/built-in-ai/summarizer.md +154 -0
- package/.agents/skills/modern-web-guidance/guides/built-in-ai/translator.md +162 -0
- package/.agents/skills/modern-web-guidance/guides/css/css.md +527 -0
- package/.agents/skills/modern-web-guidance/guides/css/highlight-text-ranges.md +128 -0
- package/.agents/skills/modern-web-guidance/guides/css-layout/css-layout.md +305 -0
- package/.agents/skills/modern-web-guidance/guides/forms/animated-select-picker.md +178 -0
- package/.agents/skills/modern-web-guidance/guides/forms/autofill-address-form.md +75 -0
- package/.agents/skills/modern-web-guidance/guides/forms/autofill-highlight-inputs.md +45 -0
- package/.agents/skills/modern-web-guidance/guides/forms/autofill-payment-form.md +125 -0
- package/.agents/skills/modern-web-guidance/guides/forms/autofill-sign-in-form.md +135 -0
- package/.agents/skills/modern-web-guidance/guides/forms/autofill-sign-up-form.md +145 -0
- package/.agents/skills/modern-web-guidance/guides/forms/brand-consistent-forms.md +255 -0
- package/.agents/skills/modern-web-guidance/guides/forms/branded-select-styling.md +114 -0
- package/.agents/skills/modern-web-guidance/guides/forms/custom-select-picker-layouts.md +103 -0
- package/.agents/skills/modern-web-guidance/guides/forms/form-fields-automatically-fit-contents.md +121 -0
- package/.agents/skills/modern-web-guidance/guides/forms/forms.md +372 -0
- package/.agents/skills/modern-web-guidance/guides/forms/required-field-feedback.md +214 -0
- package/.agents/skills/modern-web-guidance/guides/forms/rich-media-picker.md +132 -0
- package/.agents/skills/modern-web-guidance/guides/forms/select-menu-interaction.md +180 -0
- package/.agents/skills/modern-web-guidance/guides/forms/validate-input-after-interaction.md +258 -0
- package/.agents/skills/modern-web-guidance/guides/html/html.md +407 -0
- package/.agents/skills/modern-web-guidance/guides/passkeys/passkey-authentication.md +205 -0
- package/.agents/skills/modern-web-guidance/guides/passkeys/passkey-conditional-create.md +134 -0
- package/.agents/skills/modern-web-guidance/guides/passkeys/passkey-management.md +211 -0
- package/.agents/skills/modern-web-guidance/guides/passkeys/passkey-reauthentication.md +128 -0
- package/.agents/skills/modern-web-guidance/guides/passkeys/passkey-registration.md +181 -0
- package/.agents/skills/modern-web-guidance/guides/passkeys/passkeys.md +38 -0
- package/.agents/skills/modern-web-guidance/guides/performance/batch-analytics-events.md +154 -0
- package/.agents/skills/modern-web-guidance/guides/performance/break-up-long-tasks.md +60 -0
- package/.agents/skills/modern-web-guidance/guides/performance/calculate-total-foreground-time.md +69 -0
- package/.agents/skills/modern-web-guidance/guides/performance/conditional-async-dependencies.md +71 -0
- package/.agents/skills/modern-web-guidance/guides/performance/defer-rendering-heavy-content.md +106 -0
- package/.agents/skills/modern-web-guidance/guides/performance/defer-work-until-scroll-ends.md +78 -0
- package/.agents/skills/modern-web-guidance/guides/performance/deprioritize-background-fetches.md +37 -0
- package/.agents/skills/modern-web-guidance/guides/performance/detect-initial-visibility-state.md +99 -0
- package/.agents/skills/modern-web-guidance/guides/performance/efficient-background-processing.md +117 -0
- package/.agents/skills/modern-web-guidance/guides/performance/faster-spa-view-transitions.md +79 -0
- package/.agents/skills/modern-web-guidance/guides/performance/full-session-analytics.md +135 -0
- package/.agents/skills/modern-web-guidance/guides/performance/identify-heavy-scripts.md +69 -0
- package/.agents/skills/modern-web-guidance/guides/performance/identify-inp-causes.md +73 -0
- package/.agents/skills/modern-web-guidance/guides/performance/improve-next-page-load-performance.md +119 -0
- package/.agents/skills/modern-web-guidance/guides/performance/interactions-in-complex-layouts.md +78 -0
- package/.agents/skills/modern-web-guidance/guides/performance/optimize-image-priority.md +61 -0
- package/.agents/skills/modern-web-guidance/guides/performance/optimize-preload-priority.md +41 -0
- package/.agents/skills/modern-web-guidance/guides/performance/optimize-script-priority.md +38 -0
- package/.agents/skills/modern-web-guidance/guides/performance/performance.md +366 -0
- package/.agents/skills/modern-web-guidance/guides/performance/resolution-optimized-pseudo-elements.md +47 -0
- package/.agents/skills/modern-web-guidance/guides/performance/schedule-tasks-by-priority.md +59 -0
- package/.agents/skills/modern-web-guidance/guides/performance/sequence-distributed-events.md +76 -0
- package/.agents/skills/modern-web-guidance/guides/privacy/privacy.md +247 -0
- package/.agents/skills/modern-web-guidance/guides/security/security.md +350 -0
- package/.agents/skills/modern-web-guidance/guides/user-experience/adapt-scrollbar-to-contrast-preferences.md +74 -0
- package/.agents/skills/modern-web-guidance/guides/user-experience/anchor-positioning-tab-underline.md +95 -0
- package/.agents/skills/modern-web-guidance/guides/user-experience/animate-element-entry-exit.md +131 -0
- package/.agents/skills/modern-web-guidance/guides/user-experience/animate-to-from-top-layer.md +140 -0
- package/.agents/skills/modern-web-guidance/guides/user-experience/animate-to-intrinsic-sizes.md +127 -0
- package/.agents/skills/modern-web-guidance/guides/user-experience/apply-webgl-shaders.md +239 -0
- package/.agents/skills/modern-web-guidance/guides/user-experience/calculate-event-differentials.md +85 -0
- package/.agents/skills/modern-web-guidance/guides/user-experience/calculate-with-intrinsic-sizes.md +196 -0
- package/.agents/skills/modern-web-guidance/guides/user-experience/capture-location-agnostic-data.md +63 -0
- package/.agents/skills/modern-web-guidance/guides/user-experience/carousel-slide-effects.md +187 -0
- package/.agents/skills/modern-web-guidance/guides/user-experience/carousel-snap-highlights.md +136 -0
- package/.agents/skills/modern-web-guidance/guides/user-experience/child-state-based-styling.md +101 -0
- package/.agents/skills/modern-web-guidance/guides/user-experience/complex-shapes.md +73 -0
- package/.agents/skills/modern-web-guidance/guides/user-experience/component-specific-light-dark-theme.md +179 -0
- package/.agents/skills/modern-web-guidance/guides/user-experience/consistent-cross-document-transitions.md +226 -0
- package/.agents/skills/modern-web-guidance/guides/user-experience/content-based-styling.md +118 -0
- package/.agents/skills/modern-web-guidance/guides/user-experience/coordinate-global-events.md +79 -0
- package/.agents/skills/modern-web-guidance/guides/user-experience/cross-document-transitions.md +127 -0
- package/.agents/skills/modern-web-guidance/guides/user-experience/custom-button-actions.md +173 -0
- package/.agents/skills/modern-web-guidance/guides/user-experience/customize-scrollbar-color-and-thickness.md +59 -0
- package/.agents/skills/modern-web-guidance/guides/user-experience/dark-mode.md +295 -0
- package/.agents/skills/modern-web-guidance/guides/user-experience/declarative-dialog-popover-control.md +238 -0
- package/.agents/skills/modern-web-guidance/guides/user-experience/deliver-optimized-decorative-images.md +49 -0
- package/.agents/skills/modern-web-guidance/guides/user-experience/design-token-reactivity.md +174 -0
- package/.agents/skills/modern-web-guidance/guides/user-experience/directional-navigation-transitions.md +125 -0
- package/.agents/skills/modern-web-guidance/guides/user-experience/dynamic-sibling-animations.md +54 -0
- package/.agents/skills/modern-web-guidance/guides/user-experience/dynamic-sibling-styling.md +98 -0
- package/.agents/skills/modern-web-guidance/guides/user-experience/export-html-media-from-canvas.md +256 -0
- package/.agents/skills/modern-web-guidance/guides/user-experience/expose-canvas-content-to-browser-features.md +401 -0
- package/.agents/skills/modern-web-guidance/guides/user-experience/flicker-free-client-side-ab-testing.md +168 -0
- package/.agents/skills/modern-web-guidance/guides/user-experience/fluid-scaling.md +78 -0
- package/.agents/skills/modern-web-guidance/guides/user-experience/format-human-readable-durations.md +87 -0
- package/.agents/skills/modern-web-guidance/guides/user-experience/group-element-transitions.md +124 -0
- package/.agents/skills/modern-web-guidance/guides/user-experience/improve-text-layout-and-legibility.md +76 -0
- package/.agents/skills/modern-web-guidance/guides/user-experience/individual-transform-properties.md +92 -0
- package/.agents/skills/modern-web-guidance/guides/user-experience/interactive-content-in-3d-scenes.md +383 -0
- package/.agents/skills/modern-web-guidance/guides/user-experience/interactive-content-reveal.md +118 -0
- package/.agents/skills/modern-web-guidance/guides/user-experience/interest-triggered-action-previews.md +79 -0
- package/.agents/skills/modern-web-guidance/guides/user-experience/interest-triggered-tooltips.md +132 -0
- package/.agents/skills/modern-web-guidance/guides/user-experience/light-dismiss-a-dialog.md +84 -0
- package/.agents/skills/modern-web-guidance/guides/user-experience/manage-recurring-intervals.md +73 -0
- package/.agents/skills/modern-web-guidance/guides/user-experience/model-partial-time-concepts.md +96 -0
- package/.agents/skills/modern-web-guidance/guides/user-experience/move-dom-element-without-losing-state.md +57 -0
- package/.agents/skills/modern-web-guidance/guides/user-experience/navigation-drawer.md +357 -0
- package/.agents/skills/modern-web-guidance/guides/user-experience/overflow-clipping-control.md +180 -0
- package/.agents/skills/modern-web-guidance/guides/user-experience/parallax-scroll-effects.md +230 -0
- package/.agents/skills/modern-web-guidance/guides/user-experience/persistent-app-tours.md +112 -0
- package/.agents/skills/modern-web-guidance/guides/user-experience/persistent-toast-notifications.md +30 -0
- package/.agents/skills/modern-web-guidance/guides/user-experience/persistent-top-layer-ui.md +48 -0
- package/.agents/skills/modern-web-guidance/guides/user-experience/physics-based-easing.md +118 -0
- package/.agents/skills/modern-web-guidance/guides/user-experience/platform-controls-dismiss-dialog.md +38 -0
- package/.agents/skills/modern-web-guidance/guides/user-experience/position-aware-tooltips.md +154 -0
- package/.agents/skills/modern-web-guidance/guides/user-experience/precise-text-alignment.md +99 -0
- package/.agents/skills/modern-web-guidance/guides/user-experience/prevent-text-wrapping.md +62 -0
- package/.agents/skills/modern-web-guidance/guides/user-experience/pull-to-reveal.md +83 -0
- package/.agents/skills/modern-web-guidance/guides/user-experience/reduce-style-repetition.md +87 -0
- package/.agents/skills/modern-web-guidance/guides/user-experience/resilient-context-menus-and-nested-dropdowns.md +102 -0
- package/.agents/skills/modern-web-guidance/guides/user-experience/same-document-transitions.md +177 -0
- package/.agents/skills/modern-web-guidance/guides/user-experience/scroll-entry-exit-effects.md +173 -0
- package/.agents/skills/modern-web-guidance/guides/user-experience/scroll-position-aware-elements.md +128 -0
- package/.agents/skills/modern-web-guidance/guides/user-experience/scroll-progress-indicator.md +133 -0
- package/.agents/skills/modern-web-guidance/guides/user-experience/scroll-snap-realtime-feedback.md +153 -0
- package/.agents/skills/modern-web-guidance/guides/user-experience/scroll-snap-state-sync.md +93 -0
- package/.agents/skills/modern-web-guidance/guides/user-experience/scroll-target-on-load.md +56 -0
- package/.agents/skills/modern-web-guidance/guides/user-experience/scrollability-affordance-hints.md +124 -0
- package/.agents/skills/modern-web-guidance/guides/user-experience/scrollytelling.md +181 -0
- package/.agents/skills/modern-web-guidance/guides/user-experience/search-hidden-content.md +136 -0
- package/.agents/skills/modern-web-guidance/guides/user-experience/shaped-cutouts.md +146 -0
- package/.agents/skills/modern-web-guidance/guides/user-experience/shrinking-header-on-scroll.md +126 -0
- package/.agents/skills/modern-web-guidance/guides/user-experience/size-aware-styling.md +104 -0
- package/.agents/skills/modern-web-guidance/guides/user-experience/soft-edge-content-fade.md +62 -0
- package/.agents/skills/modern-web-guidance/guides/user-experience/stabilize-reactive-state.md +72 -0
- package/.agents/skills/modern-web-guidance/guides/user-experience/stack-drill-down.md +680 -0
- package/.agents/skills/modern-web-guidance/guides/user-experience/style-parent-with-has.md +199 -0
- package/.agents/skills/modern-web-guidance/guides/user-experience/support-global-calendar-systems.md +107 -0
- package/.agents/skills/modern-web-guidance/guides/user-experience/swipe-to-remove.md +527 -0
- package/.agents/skills/modern-web-guidance/guides/user-experience/visually-stable-font-fallbacks.md +49 -0
- package/.agents/skills/modern-web-guidance/guides/user-experience/visually-stable-mixed-fonts.md +61 -0
- package/.agents/skills/modern-web-guidance/guides/user-experience/visually-texture-content.md +76 -0
- package/.agents/skills/modern-web-guidance/guides/webmcp/agentic-forms.md +116 -0
- package/.agents/skills/modern-web-guidance/guides/webmcp/agentic-javascript-tools.md +116 -0
- package/.agents/skills/modern-web-guidance/guides/webmcp/webmcp.md +43 -0
- package/.agents/skills/nextjs-app-router-patterns/SKILL.md +114 -0
- package/.agents/skills/nextjs-app-router-patterns/references/details.md +428 -0
- package/.agents/skills/nextjs-developer/SKILL.md +145 -0
- package/.agents/skills/nextjs-developer/references/app-router.md +311 -0
- package/.agents/skills/nextjs-developer/references/data-fetching.md +482 -0
- package/.agents/skills/nextjs-developer/references/deployment.md +545 -0
- package/.agents/skills/nextjs-developer/references/server-actions.md +462 -0
- package/.agents/skills/nextjs-developer/references/server-components.md +384 -0
- package/.agents/skills/nextjs-supabase-auth/SKILL.md +313 -0
- package/.agents/skills/nodejs-backend-patterns/SKILL.md +45 -0
- package/.agents/skills/nodejs-backend-patterns/references/advanced-patterns.md +430 -0
- package/.agents/skills/nodejs-backend-patterns/references/details.md +599 -0
- package/.agents/skills/performance-engineer/SKILL.md +181 -0
- package/.agents/skills/project-requirements/SKILL.md +43 -0
- package/.agents/skills/qa/SKILL.md +130 -0
- package/.agents/skills/security-review/LICENSE +22 -0
- package/.agents/skills/security-review/SKILL.md +312 -0
- package/.agents/skills/security-review/infrastructure/docker.md +432 -0
- package/.agents/skills/security-review/languages/javascript.md +387 -0
- package/.agents/skills/security-review/languages/python.md +363 -0
- package/.agents/skills/security-review/references/api-security.md +519 -0
- package/.agents/skills/security-review/references/authentication.md +353 -0
- package/.agents/skills/security-review/references/authorization.md +372 -0
- package/.agents/skills/security-review/references/business-logic.md +443 -0
- package/.agents/skills/security-review/references/cryptography.md +329 -0
- package/.agents/skills/security-review/references/csrf.md +398 -0
- package/.agents/skills/security-review/references/data-protection.md +378 -0
- package/.agents/skills/security-review/references/deserialization.md +410 -0
- package/.agents/skills/security-review/references/error-handling.md +436 -0
- package/.agents/skills/security-review/references/file-security.md +457 -0
- package/.agents/skills/security-review/references/injection.md +259 -0
- package/.agents/skills/security-review/references/logging.md +433 -0
- package/.agents/skills/security-review/references/misconfiguration.md +435 -0
- package/.agents/skills/security-review/references/modern-threats.md +475 -0
- package/.agents/skills/security-review/references/ssrf.md +413 -0
- package/.agents/skills/security-review/references/supply-chain.md +405 -0
- package/.agents/skills/security-review/references/xss.md +336 -0
- package/.agents/skills/seo-aeo-best-practices/SKILL.md +37 -0
- package/.agents/skills/seo-aeo-best-practices/references/aeo-considerations.md +159 -0
- package/.agents/skills/seo-aeo-best-practices/references/eeat-principles.md +127 -0
- package/.agents/skills/seo-aeo-best-practices/references/structured-data.md +183 -0
- package/.agents/skills/seo-aeo-best-practices/references/technical-seo.md +188 -0
- package/.agents/skills/seo-geo/.claude-plugin/plugin.json +29 -0
- package/.agents/skills/seo-geo/SKILL.md +250 -0
- package/.agents/skills/seo-geo/examples/opc-skills-case-study.md +330 -0
- package/.agents/skills/seo-geo/references/geo-research.md +319 -0
- package/.agents/skills/seo-geo/references/google-docs-summary.md +65 -0
- package/.agents/skills/seo-geo/references/platform-algorithms.md +354 -0
- package/.agents/skills/seo-geo/references/schema-templates.md +517 -0
- package/.agents/skills/seo-geo/references/seo-checklist.md +249 -0
- package/.agents/skills/seo-geo/references/tools-and-apis.md +313 -0
- package/.agents/skills/seo-geo/scripts/autocomplete_ideas.py +74 -0
- package/.agents/skills/seo-geo/scripts/backlinks.py +37 -0
- package/.agents/skills/seo-geo/scripts/competitor_gap.py +80 -0
- package/.agents/skills/seo-geo/scripts/credential.py +12 -0
- package/.agents/skills/seo-geo/scripts/dataforseo_api.py +104 -0
- package/.agents/skills/seo-geo/scripts/domain_overview.py +44 -0
- package/.agents/skills/seo-geo/scripts/keyword_research.py +38 -0
- package/.agents/skills/seo-geo/scripts/related_keywords.py +84 -0
- package/.agents/skills/seo-geo/scripts/seo_audit.py +151 -0
- package/.agents/skills/seo-geo/scripts/serp_analysis.py +41 -0
- package/.agents/skills/shadcn-ui/README.md +248 -0
- package/.agents/skills/shadcn-ui/SKILL.md +326 -0
- package/.agents/skills/shadcn-ui/examples/auth-layout.tsx +177 -0
- package/.agents/skills/shadcn-ui/examples/data-table.tsx +313 -0
- package/.agents/skills/shadcn-ui/examples/form-pattern.tsx +177 -0
- package/.agents/skills/shadcn-ui/resources/component-catalog.md +481 -0
- package/.agents/skills/shadcn-ui/resources/customization-guide.md +516 -0
- package/.agents/skills/shadcn-ui/resources/migration-guide.md +463 -0
- package/.agents/skills/shadcn-ui/resources/setup-guide.md +412 -0
- package/.agents/skills/shadcn-ui/scripts/verify-setup.sh +134 -0
- package/.agents/skills/skill-creator/LICENSE.txt +202 -0
- package/.agents/skills/skill-creator/SKILL.md +485 -0
- package/.agents/skills/skill-creator/agents/analyzer.md +274 -0
- package/.agents/skills/skill-creator/agents/comparator.md +202 -0
- package/.agents/skills/skill-creator/agents/grader.md +223 -0
- package/.agents/skills/skill-creator/assets/eval_review.html +146 -0
- package/.agents/skills/skill-creator/eval-viewer/generate_review.py +471 -0
- package/.agents/skills/skill-creator/eval-viewer/viewer.html +1325 -0
- package/.agents/skills/skill-creator/references/schemas.md +430 -0
- package/.agents/skills/skill-creator/scripts/__init__.py +0 -0
- package/.agents/skills/skill-creator/scripts/aggregate_benchmark.py +401 -0
- package/.agents/skills/skill-creator/scripts/generate_report.py +326 -0
- package/.agents/skills/skill-creator/scripts/improve_description.py +247 -0
- package/.agents/skills/skill-creator/scripts/package_skill.py +136 -0
- package/.agents/skills/skill-creator/scripts/quick_validate.py +103 -0
- package/.agents/skills/skill-creator/scripts/run_eval.py +310 -0
- package/.agents/skills/skill-creator/scripts/run_loop.py +328 -0
- package/.agents/skills/skill-creator/scripts/utils.py +47 -0
- package/.agents/skills/stacks/SKILL.md +21 -0
- package/.agents/skills/stacks/django.md +187 -0
- package/.agents/skills/stacks/express.md +16 -0
- package/.agents/skills/stacks/fastapi.md +17 -0
- package/.agents/skills/stacks/laravel.md +18 -0
- package/.agents/skills/stacks/nextjs.md +20 -0
- package/.agents/skills/stacks/react-native.md +170 -0
- package/.agents/skills/supabase/CHANGELOG.md +35 -0
- package/.agents/skills/supabase/SKILL.md +135 -0
- package/.agents/skills/supabase/assets/feedback-issue-template.md +17 -0
- package/.agents/skills/supabase/references/skill-feedback.md +17 -0
- package/.agents/skills/supabase-postgres-best-practices/CHANGELOG.md +29 -0
- package/.agents/skills/supabase-postgres-best-practices/SKILL.md +64 -0
- package/.agents/skills/supabase-postgres-best-practices/references/_contributing.md +170 -0
- package/.agents/skills/supabase-postgres-best-practices/references/_sections.md +39 -0
- package/.agents/skills/supabase-postgres-best-practices/references/_template.md +34 -0
- package/.agents/skills/supabase-postgres-best-practices/references/advanced-full-text-search.md +55 -0
- package/.agents/skills/supabase-postgres-best-practices/references/advanced-jsonb-indexing.md +49 -0
- package/.agents/skills/supabase-postgres-best-practices/references/conn-idle-timeout.md +46 -0
- package/.agents/skills/supabase-postgres-best-practices/references/conn-limits.md +44 -0
- package/.agents/skills/supabase-postgres-best-practices/references/conn-pooling.md +41 -0
- package/.agents/skills/supabase-postgres-best-practices/references/conn-prepared-statements.md +46 -0
- package/.agents/skills/supabase-postgres-best-practices/references/data-batch-inserts.md +54 -0
- package/.agents/skills/supabase-postgres-best-practices/references/data-n-plus-one.md +53 -0
- package/.agents/skills/supabase-postgres-best-practices/references/data-pagination.md +50 -0
- package/.agents/skills/supabase-postgres-best-practices/references/data-upsert.md +50 -0
- package/.agents/skills/supabase-postgres-best-practices/references/lock-advisory.md +56 -0
- package/.agents/skills/supabase-postgres-best-practices/references/lock-deadlock-prevention.md +68 -0
- package/.agents/skills/supabase-postgres-best-practices/references/lock-short-transactions.md +50 -0
- package/.agents/skills/supabase-postgres-best-practices/references/lock-skip-locked.md +54 -0
- package/.agents/skills/supabase-postgres-best-practices/references/monitor-explain-analyze.md +45 -0
- package/.agents/skills/supabase-postgres-best-practices/references/monitor-pg-stat-statements.md +55 -0
- package/.agents/skills/supabase-postgres-best-practices/references/monitor-vacuum-analyze.md +55 -0
- package/.agents/skills/supabase-postgres-best-practices/references/query-composite-indexes.md +44 -0
- package/.agents/skills/supabase-postgres-best-practices/references/query-covering-indexes.md +40 -0
- package/.agents/skills/supabase-postgres-best-practices/references/query-index-types.md +48 -0
- package/.agents/skills/supabase-postgres-best-practices/references/query-missing-indexes.md +43 -0
- package/.agents/skills/supabase-postgres-best-practices/references/query-partial-indexes.md +45 -0
- package/.agents/skills/supabase-postgres-best-practices/references/schema-constraints.md +80 -0
- package/.agents/skills/supabase-postgres-best-practices/references/schema-data-types.md +46 -0
- package/.agents/skills/supabase-postgres-best-practices/references/schema-foreign-key-indexes.md +59 -0
- package/.agents/skills/supabase-postgres-best-practices/references/schema-lowercase-identifiers.md +55 -0
- package/.agents/skills/supabase-postgres-best-practices/references/schema-partitioning.md +55 -0
- package/.agents/skills/supabase-postgres-best-practices/references/schema-primary-keys.md +61 -0
- package/.agents/skills/supabase-postgres-best-practices/references/security-privileges.md +54 -0
- package/.agents/skills/supabase-postgres-best-practices/references/security-rls-basics.md +50 -0
- package/.agents/skills/supabase-postgres-best-practices/references/security-rls-performance.md +63 -0
- package/.agents/skills/task-contract/SKILL.md +29 -0
- package/.agents/skills/token-optimization/SKILL.md +40 -0
- package/.agents/skills/ui-designer/SKILL.md +76 -0
- package/.agents/skills/ui-ux-pro-max/SKILL.md +704 -0
- package/.agents/skills/ui-ux-pro-max/data/_sync_all.py +414 -0
- package/.agents/skills/ui-ux-pro-max/data/app-interface.csv +31 -0
- package/.agents/skills/ui-ux-pro-max/data/charts.csv +26 -0
- package/.agents/skills/ui-ux-pro-max/data/colors.csv +162 -0
- package/.agents/skills/ui-ux-pro-max/data/design.csv +1776 -0
- package/.agents/skills/ui-ux-pro-max/data/draft.csv +1779 -0
- package/.agents/skills/ui-ux-pro-max/data/google-fonts.csv +1924 -0
- package/.agents/skills/ui-ux-pro-max/data/icons.csv +106 -0
- package/.agents/skills/ui-ux-pro-max/data/landing.csv +35 -0
- package/.agents/skills/ui-ux-pro-max/data/motion.csv +17 -0
- package/.agents/skills/ui-ux-pro-max/data/products.csv +162 -0
- package/.agents/skills/ui-ux-pro-max/data/react-performance.csv +45 -0
- package/.agents/skills/ui-ux-pro-max/data/stacks/angular.csv +51 -0
- package/.agents/skills/ui-ux-pro-max/data/stacks/astro.csv +54 -0
- package/.agents/skills/ui-ux-pro-max/data/stacks/flutter.csv +53 -0
- package/.agents/skills/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -0
- package/.agents/skills/ui-ux-pro-max/data/stacks/jetpack-compose.csv +53 -0
- package/.agents/skills/ui-ux-pro-max/data/stacks/laravel.csv +51 -0
- package/.agents/skills/ui-ux-pro-max/data/stacks/nextjs.csv +53 -0
- package/.agents/skills/ui-ux-pro-max/data/stacks/nuxt-ui.csv +51 -0
- package/.agents/skills/ui-ux-pro-max/data/stacks/nuxtjs.csv +59 -0
- package/.agents/skills/ui-ux-pro-max/data/stacks/react-native.csv +52 -0
- package/.agents/skills/ui-ux-pro-max/data/stacks/react.csv +54 -0
- package/.agents/skills/ui-ux-pro-max/data/stacks/shadcn.csv +61 -0
- package/.agents/skills/ui-ux-pro-max/data/stacks/svelte.csv +54 -0
- package/.agents/skills/ui-ux-pro-max/data/stacks/swiftui.csv +51 -0
- package/.agents/skills/ui-ux-pro-max/data/stacks/threejs.csv +54 -0
- package/.agents/skills/ui-ux-pro-max/data/stacks/vue.csv +50 -0
- package/.agents/skills/ui-ux-pro-max/data/styles.csv +85 -0
- package/.agents/skills/ui-ux-pro-max/data/typography.csv +74 -0
- package/.agents/skills/ui-ux-pro-max/data/ui-reasoning.csv +162 -0
- package/.agents/skills/ui-ux-pro-max/data/ux-guidelines.csv +100 -0
- package/.agents/skills/ui-ux-pro-max/scripts/core.py +274 -0
- package/.agents/skills/ui-ux-pro-max/scripts/design_system.py +1329 -0
- package/.agents/skills/ui-ux-pro-max/scripts/search.py +127 -0
- package/.agents/skills/vercel-cli-with-tokens/SKILL.md +353 -0
- package/.agents/skills/vercel-composition-patterns/AGENTS.md +946 -0
- package/.agents/skills/vercel-composition-patterns/README.md +60 -0
- package/.agents/skills/vercel-composition-patterns/SKILL.md +89 -0
- package/.agents/skills/vercel-composition-patterns/metadata.json +11 -0
- package/.agents/skills/vercel-composition-patterns/rules/_sections.md +29 -0
- package/.agents/skills/vercel-composition-patterns/rules/_template.md +24 -0
- package/.agents/skills/vercel-composition-patterns/rules/architecture-avoid-boolean-props.md +100 -0
- package/.agents/skills/vercel-composition-patterns/rules/architecture-compound-components.md +112 -0
- package/.agents/skills/vercel-composition-patterns/rules/patterns-children-over-render-props.md +87 -0
- package/.agents/skills/vercel-composition-patterns/rules/patterns-explicit-variants.md +100 -0
- package/.agents/skills/vercel-composition-patterns/rules/react19-no-forwardref.md +42 -0
- package/.agents/skills/vercel-composition-patterns/rules/state-context-interface.md +191 -0
- package/.agents/skills/vercel-composition-patterns/rules/state-decouple-implementation.md +113 -0
- package/.agents/skills/vercel-composition-patterns/rules/state-lift-state.md +125 -0
- package/.agents/skills/vercel-optimize/AGENTS.md +48 -0
- package/.agents/skills/vercel-optimize/CONTRIBUTING.md +41 -0
- package/.agents/skills/vercel-optimize/README.md +91 -0
- package/.agents/skills/vercel-optimize/SKILL.md +322 -0
- package/.agents/skills/vercel-optimize/lib/auth-route.mjs +23 -0
- package/.agents/skills/vercel-optimize/lib/budget-summary.mjs +182 -0
- package/.agents/skills/vercel-optimize/lib/citations.mjs +139 -0
- package/.agents/skills/vercel-optimize/lib/cost-coverage.mjs +143 -0
- package/.agents/skills/vercel-optimize/lib/dedup-recs.mjs +325 -0
- package/.agents/skills/vercel-optimize/lib/deep-dive.mjs +350 -0
- package/.agents/skills/vercel-optimize/lib/display-labels.mjs +185 -0
- package/.agents/skills/vercel-optimize/lib/extract-claims.mjs +550 -0
- package/.agents/skills/vercel-optimize/lib/framework-support.mjs +67 -0
- package/.agents/skills/vercel-optimize/lib/gates/build-minutes-fanout.mjs +69 -0
- package/.agents/skills/vercel-optimize/lib/gates/cold-start.mjs +66 -0
- package/.agents/skills/vercel-optimize/lib/gates/contract.mjs +79 -0
- package/.agents/skills/vercel-optimize/lib/gates/cwv-poor.mjs +87 -0
- package/.agents/skills/vercel-optimize/lib/gates/external-api-slow.mjs +55 -0
- package/.agents/skills/vercel-optimize/lib/gates/hard-gates.mjs +73 -0
- package/.agents/skills/vercel-optimize/lib/gates/index.mjs +45 -0
- package/.agents/skills/vercel-optimize/lib/gates/isr-overrevalidation.mjs +62 -0
- package/.agents/skills/vercel-optimize/lib/gates/middleware-heavy.mjs +51 -0
- package/.agents/skills/vercel-optimize/lib/gates/observability-events-attribution.mjs +56 -0
- package/.agents/skills/vercel-optimize/lib/gates/platform-bot-protection.mjs +115 -0
- package/.agents/skills/vercel-optimize/lib/gates/platform-fluid-compute.mjs +83 -0
- package/.agents/skills/vercel-optimize/lib/gates/region-misconfig.mjs +64 -0
- package/.agents/skills/vercel-optimize/lib/gates/route-errors.mjs +80 -0
- package/.agents/skills/vercel-optimize/lib/gates/scanner-driven.mjs +122 -0
- package/.agents/skills/vercel-optimize/lib/gates/select-candidates.mjs +134 -0
- package/.agents/skills/vercel-optimize/lib/gates/slow-route.mjs +88 -0
- package/.agents/skills/vercel-optimize/lib/gates/types.d.ts +38 -0
- package/.agents/skills/vercel-optimize/lib/gates/uncached-route.mjs +93 -0
- package/.agents/skills/vercel-optimize/lib/gates/usage-spike-triage.mjs +121 -0
- package/.agents/skills/vercel-optimize/lib/grade-recommendation.mjs +155 -0
- package/.agents/skills/vercel-optimize/lib/impact-label.mjs +126 -0
- package/.agents/skills/vercel-optimize/lib/impact-magnitude.mjs +60 -0
- package/.agents/skills/vercel-optimize/lib/investigation-brief.mjs +610 -0
- package/.agents/skills/vercel-optimize/lib/observation-safety.mjs +174 -0
- package/.agents/skills/vercel-optimize/lib/project-facts.mjs +99 -0
- package/.agents/skills/vercel-optimize/lib/queries.mjs +315 -0
- package/.agents/skills/vercel-optimize/lib/reconcile-candidates.mjs +372 -0
- package/.agents/skills/vercel-optimize/lib/render-report.mjs +955 -0
- package/.agents/skills/vercel-optimize/lib/repo-root.mjs +86 -0
- package/.agents/skills/vercel-optimize/lib/route-normalize.mjs +220 -0
- package/.agents/skills/vercel-optimize/lib/sanitizers/bot-protection-certainty.mjs +38 -0
- package/.agents/skills/vercel-optimize/lib/sanitizers/cache-tag-invalidation-certainty.mjs +30 -0
- package/.agents/skills/vercel-optimize/lib/sanitizers/count-correct.mjs +52 -0
- package/.agents/skills/vercel-optimize/lib/sanitizers/function-duration-invocations.mjs +38 -0
- package/.agents/skills/vercel-optimize/lib/sanitizers/index.mjs +79 -0
- package/.agents/skills/vercel-optimize/lib/sanitizers/middleware-conflict.mjs +36 -0
- package/.agents/skills/vercel-optimize/lib/sanitizers/missing-citation.mjs +16 -0
- package/.agents/skills/vercel-optimize/lib/sanitizers/pre-release.mjs +74 -0
- package/.agents/skills/vercel-optimize/lib/sanitizers/rate-limit.mjs +67 -0
- package/.agents/skills/vercel-optimize/lib/sanitizers/rendering-mode-mislabel.mjs +38 -0
- package/.agents/skills/vercel-optimize/lib/sanitizers/undeclared-dep.mjs +78 -0
- package/.agents/skills/vercel-optimize/lib/sanitizers/vercel-directive-strip.mjs +37 -0
- package/.agents/skills/vercel-optimize/lib/sanitizers/window-units.mjs +32 -0
- package/.agents/skills/vercel-optimize/lib/scanners/cache-components-suspense-dedupe.mjs +109 -0
- package/.agents/skills/vercel-optimize/lib/scanners/edge-heavy-import.mjs +94 -0
- package/.agents/skills/vercel-optimize/lib/scanners/force-dynamic.mjs +42 -0
- package/.agents/skills/vercel-optimize/lib/scanners/headers-in-page.mjs +44 -0
- package/.agents/skills/vercel-optimize/lib/scanners/index.mjs +35 -0
- package/.agents/skills/vercel-optimize/lib/scanners/large-static-asset.mjs +92 -0
- package/.agents/skills/vercel-optimize/lib/scanners/max-age-without-s-maxage.mjs +42 -0
- package/.agents/skills/vercel-optimize/lib/scanners/middleware-broad-matcher.mjs +55 -0
- package/.agents/skills/vercel-optimize/lib/scanners/missing-cache-headers.mjs +90 -0
- package/.agents/skills/vercel-optimize/lib/scanners/prisma-include-tree.mjs +42 -0
- package/.agents/skills/vercel-optimize/lib/scanners/region-pin-in-config.mjs +88 -0
- package/.agents/skills/vercel-optimize/lib/scanners/source-maps-production.mjs +36 -0
- package/.agents/skills/vercel-optimize/lib/scanners/sveltekit-prerender-missing.mjs +43 -0
- package/.agents/skills/vercel-optimize/lib/scanners/turbo-force-bypass.mjs +129 -0
- package/.agents/skills/vercel-optimize/lib/scanners/unoptimized-image.mjs +113 -0
- package/.agents/skills/vercel-optimize/lib/scanners/use-cache-date-stamp.mjs +106 -0
- package/.agents/skills/vercel-optimize/lib/support-topics.mjs +355 -0
- package/.agents/skills/vercel-optimize/lib/throttle.mjs +273 -0
- package/.agents/skills/vercel-optimize/lib/util.mjs +17 -0
- package/.agents/skills/vercel-optimize/lib/vercel.mjs +864 -0
- package/.agents/skills/vercel-optimize/lib/verify-claim.mjs +1296 -0
- package/.agents/skills/vercel-optimize/lib/workspace-resolver.mjs +521 -0
- package/.agents/skills/vercel-optimize/metadata.json +14 -0
- package/.agents/skills/vercel-optimize/references/candidates.md +176 -0
- package/.agents/skills/vercel-optimize/references/data-collection.md +218 -0
- package/.agents/skills/vercel-optimize/references/docs-library.json +683 -0
- package/.agents/skills/vercel-optimize/references/doctrine.md +105 -0
- package/.agents/skills/vercel-optimize/references/observability-plus.md +108 -0
- package/.agents/skills/vercel-optimize/references/playbooks/README.md +53 -0
- package/.agents/skills/vercel-optimize/references/playbooks/ai-application.md +32 -0
- package/.agents/skills/vercel-optimize/references/playbooks/api-service.md +30 -0
- package/.agents/skills/vercel-optimize/references/playbooks/content-site.md +30 -0
- package/.agents/skills/vercel-optimize/references/playbooks/ecommerce.md +30 -0
- package/.agents/skills/vercel-optimize/references/playbooks/marketing.md +30 -0
- package/.agents/skills/vercel-optimize/references/playbooks/saas.md +31 -0
- package/.agents/skills/vercel-optimize/references/playbooks/sveltekit.md +75 -0
- package/.agents/skills/vercel-optimize/references/recommendations.md +203 -0
- package/.agents/skills/vercel-optimize/references/scanner-patterns.md +251 -0
- package/.agents/skills/vercel-optimize/references/scoring.md +205 -0
- package/.agents/skills/vercel-optimize/references/support-topics/README.md +46 -0
- package/.agents/skills/vercel-optimize/references/support-topics/astro-edge-middleware-scope.md +22 -0
- package/.agents/skills/vercel-optimize/references/support-topics/astro-output-mode-and-isr.md +22 -0
- package/.agents/skills/vercel-optimize/references/support-topics/auth-preserving-parallelization.md +22 -0
- package/.agents/skills/vercel-optimize/references/support-topics/bot-protection-product-guardrails.md +22 -0
- package/.agents/skills/vercel-optimize/references/support-topics/build-minutes-monorepo-fanout.md +23 -0
- package/.agents/skills/vercel-optimize/references/support-topics/cache-components-static-shell-boundaries.md +22 -0
- package/.agents/skills/vercel-optimize/references/support-topics/cache-components-suspense-dedupe-pitfall.md +23 -0
- package/.agents/skills/vercel-optimize/references/support-topics/cdn-cache-auth-safety.md +22 -0
- package/.agents/skills/vercel-optimize/references/support-topics/cold-start-initialization-bundle.md +22 -0
- package/.agents/skills/vercel-optimize/references/support-topics/core-web-vitals-client-bottlenecks.md +22 -0
- package/.agents/skills/vercel-optimize/references/support-topics/database-egress-pooling-region.md +22 -0
- package/.agents/skills/vercel-optimize/references/support-topics/dynamic-rendering-traps.md +22 -0
- package/.agents/skills/vercel-optimize/references/support-topics/external-api-critical-path-platform.md +22 -0
- package/.agents/skills/vercel-optimize/references/support-topics/external-api-critical-path.md +22 -0
- package/.agents/skills/vercel-optimize/references/support-topics/fast-data-transfer-payloads.md +22 -0
- package/.agents/skills/vercel-optimize/references/support-topics/fluid-compute-caveats.md +22 -0
- package/.agents/skills/vercel-optimize/references/support-topics/function-duration-io-and-after.md +22 -0
- package/.agents/skills/vercel-optimize/references/support-topics/function-invocation-reduction.md +22 -0
- package/.agents/skills/vercel-optimize/references/support-topics/function-region-misconfiguration-ttfb.md +23 -0
- package/.agents/skills/vercel-optimize/references/support-topics/image-optimization-cost-control.md +22 -0
- package/.agents/skills/vercel-optimize/references/support-topics/isr-revalidation-static-generation.md +22 -0
- package/.agents/skills/vercel-optimize/references/support-topics/middleware-proxy-edge-cost.md +22 -0
- package/.agents/skills/vercel-optimize/references/support-topics/next-fetch-revalidate-floor.md +22 -0
- package/.agents/skills/vercel-optimize/references/support-topics/next-font-cls-self-hosting.md +23 -0
- package/.agents/skills/vercel-optimize/references/support-topics/next-heavy-ui-lazy-load-boundaries.md +23 -0
- package/.agents/skills/vercel-optimize/references/support-topics/next-image-lcp-preload-sizes.md +23 -0
- package/.agents/skills/vercel-optimize/references/support-topics/next-route-handler-get-cache-defaults.md +22 -0
- package/.agents/skills/vercel-optimize/references/support-topics/next-script-third-party-strategy.md +23 -0
- package/.agents/skills/vercel-optimize/references/support-topics/nextjs-version-cache-semantics.md +22 -0
- package/.agents/skills/vercel-optimize/references/support-topics/not-found-catchall-request-waste.md +23 -0
- package/.agents/skills/vercel-optimize/references/support-topics/nuxt-route-rules-cache-isr.md +22 -0
- package/.agents/skills/vercel-optimize/references/support-topics/observability-events-cost-attribution.md +22 -0
- package/.agents/skills/vercel-optimize/references/support-topics/post-response-work-waituntil.md +22 -0
- package/.agents/skills/vercel-optimize/references/support-topics/route-error-durable-offload.md +22 -0
- package/.agents/skills/vercel-optimize/references/support-topics/route-error-runtime-limits.md +22 -0
- package/.agents/skills/vercel-optimize/references/support-topics/runtime-cache-reusable-data.md +22 -0
- package/.agents/skills/vercel-optimize/references/support-topics/sveltekit-isr-prerender-safety.md +22 -0
- package/.agents/skills/vercel-optimize/references/support-topics/sveltekit-split-cold-start-tradeoff.md +22 -0
- package/.agents/skills/vercel-optimize/references/support-topics/usage-spike-triage.md +22 -0
- package/.agents/skills/vercel-optimize/references/support-topics/use-cache-date-stamp-isr-write-amplifier.md +23 -0
- package/.agents/skills/vercel-optimize/references/support-topics/use-cache-remote-shared-origin-data.md +22 -0
- package/.agents/skills/vercel-optimize/references/support-topics/workflow-resumable-stream-routes.md +23 -0
- package/.agents/skills/vercel-optimize/references/verification.md +102 -0
- package/.agents/skills/vercel-optimize/references/voice.md +76 -0
- package/.agents/skills/vercel-optimize/scripts/budget-summary.mjs +56 -0
- package/.agents/skills/vercel-optimize/scripts/build-docs.mjs +74 -0
- package/.agents/skills/vercel-optimize/scripts/check-citations.mjs +81 -0
- package/.agents/skills/vercel-optimize/scripts/check-docs-fresh.mjs +93 -0
- package/.agents/skills/vercel-optimize/scripts/collect-signals.mjs +576 -0
- package/.agents/skills/vercel-optimize/scripts/collect-sub-agent-outputs.mjs +296 -0
- package/.agents/skills/vercel-optimize/scripts/deep-dive.mjs +319 -0
- package/.agents/skills/vercel-optimize/scripts/gate-investigations.mjs +166 -0
- package/.agents/skills/vercel-optimize/scripts/merge-signals.mjs +192 -0
- package/.agents/skills/vercel-optimize/scripts/prepare-investigation-brief.mjs +231 -0
- package/.agents/skills/vercel-optimize/scripts/reconcile-candidates.mjs +62 -0
- package/.agents/skills/vercel-optimize/scripts/render-report.mjs +437 -0
- package/.agents/skills/vercel-optimize/scripts/scan-codebase.mjs +313 -0
- package/.agents/skills/vercel-optimize/scripts/verify-and-regen.mjs +346 -0
- package/.agents/skills/vercel-optimize/scripts/verify-finding.mjs +19 -0
- package/.agents/skills/vercel-react-best-practices/AGENTS.md +3810 -0
- package/.agents/skills/vercel-react-best-practices/README.md +123 -0
- package/.agents/skills/vercel-react-best-practices/SKILL.md +149 -0
- package/.agents/skills/vercel-react-best-practices/metadata.json +15 -0
- package/.agents/skills/vercel-react-best-practices/rules/_sections.md +46 -0
- package/.agents/skills/vercel-react-best-practices/rules/_template.md +28 -0
- package/.agents/skills/vercel-react-best-practices/rules/advanced-effect-event-deps.md +56 -0
- package/.agents/skills/vercel-react-best-practices/rules/advanced-event-handler-refs.md +55 -0
- package/.agents/skills/vercel-react-best-practices/rules/advanced-init-once.md +42 -0
- package/.agents/skills/vercel-react-best-practices/rules/advanced-use-latest.md +39 -0
- package/.agents/skills/vercel-react-best-practices/rules/async-api-routes.md +38 -0
- package/.agents/skills/vercel-react-best-practices/rules/async-cheap-condition-before-await.md +37 -0
- package/.agents/skills/vercel-react-best-practices/rules/async-defer-await.md +82 -0
- package/.agents/skills/vercel-react-best-practices/rules/async-dependencies.md +51 -0
- package/.agents/skills/vercel-react-best-practices/rules/async-parallel.md +28 -0
- package/.agents/skills/vercel-react-best-practices/rules/async-suspense-boundaries.md +99 -0
- package/.agents/skills/vercel-react-best-practices/rules/bundle-analyzable-paths.md +63 -0
- package/.agents/skills/vercel-react-best-practices/rules/bundle-barrel-imports.md +60 -0
- package/.agents/skills/vercel-react-best-practices/rules/bundle-conditional.md +31 -0
- package/.agents/skills/vercel-react-best-practices/rules/bundle-defer-third-party.md +49 -0
- package/.agents/skills/vercel-react-best-practices/rules/bundle-dynamic-imports.md +35 -0
- package/.agents/skills/vercel-react-best-practices/rules/bundle-preload.md +50 -0
- package/.agents/skills/vercel-react-best-practices/rules/client-event-listeners.md +74 -0
- package/.agents/skills/vercel-react-best-practices/rules/client-localstorage-schema.md +71 -0
- package/.agents/skills/vercel-react-best-practices/rules/client-passive-event-listeners.md +48 -0
- package/.agents/skills/vercel-react-best-practices/rules/client-swr-dedup.md +56 -0
- package/.agents/skills/vercel-react-best-practices/rules/js-batch-dom-css.md +107 -0
- package/.agents/skills/vercel-react-best-practices/rules/js-cache-function-results.md +80 -0
- package/.agents/skills/vercel-react-best-practices/rules/js-cache-property-access.md +28 -0
- package/.agents/skills/vercel-react-best-practices/rules/js-cache-storage.md +70 -0
- package/.agents/skills/vercel-react-best-practices/rules/js-combine-iterations.md +32 -0
- package/.agents/skills/vercel-react-best-practices/rules/js-early-exit.md +50 -0
- package/.agents/skills/vercel-react-best-practices/rules/js-flatmap-filter.md +60 -0
- package/.agents/skills/vercel-react-best-practices/rules/js-hoist-regexp.md +45 -0
- package/.agents/skills/vercel-react-best-practices/rules/js-index-maps.md +37 -0
- package/.agents/skills/vercel-react-best-practices/rules/js-length-check-first.md +49 -0
- package/.agents/skills/vercel-react-best-practices/rules/js-min-max-loop.md +82 -0
- package/.agents/skills/vercel-react-best-practices/rules/js-request-idle-callback.md +105 -0
- package/.agents/skills/vercel-react-best-practices/rules/js-set-map-lookups.md +24 -0
- package/.agents/skills/vercel-react-best-practices/rules/js-tosorted-immutable.md +57 -0
- package/.agents/skills/vercel-react-best-practices/rules/rendering-activity.md +26 -0
- package/.agents/skills/vercel-react-best-practices/rules/rendering-animate-svg-wrapper.md +47 -0
- package/.agents/skills/vercel-react-best-practices/rules/rendering-conditional-render.md +40 -0
- package/.agents/skills/vercel-react-best-practices/rules/rendering-content-visibility.md +38 -0
- package/.agents/skills/vercel-react-best-practices/rules/rendering-hoist-jsx.md +46 -0
- package/.agents/skills/vercel-react-best-practices/rules/rendering-hydration-no-flicker.md +82 -0
- package/.agents/skills/vercel-react-best-practices/rules/rendering-hydration-suppress-warning.md +30 -0
- package/.agents/skills/vercel-react-best-practices/rules/rendering-resource-hints.md +85 -0
- package/.agents/skills/vercel-react-best-practices/rules/rendering-script-defer-async.md +68 -0
- package/.agents/skills/vercel-react-best-practices/rules/rendering-svg-precision.md +28 -0
- package/.agents/skills/vercel-react-best-practices/rules/rendering-usetransition-loading.md +75 -0
- package/.agents/skills/vercel-react-best-practices/rules/rerender-defer-reads.md +39 -0
- package/.agents/skills/vercel-react-best-practices/rules/rerender-dependencies.md +45 -0
- package/.agents/skills/vercel-react-best-practices/rules/rerender-derived-state-no-effect.md +40 -0
- package/.agents/skills/vercel-react-best-practices/rules/rerender-derived-state.md +29 -0
- package/.agents/skills/vercel-react-best-practices/rules/rerender-functional-setstate.md +74 -0
- package/.agents/skills/vercel-react-best-practices/rules/rerender-lazy-state-init.md +58 -0
- package/.agents/skills/vercel-react-best-practices/rules/rerender-memo-with-default-value.md +38 -0
- package/.agents/skills/vercel-react-best-practices/rules/rerender-memo.md +44 -0
- package/.agents/skills/vercel-react-best-practices/rules/rerender-move-effect-to-event.md +45 -0
- package/.agents/skills/vercel-react-best-practices/rules/rerender-no-inline-components.md +82 -0
- package/.agents/skills/vercel-react-best-practices/rules/rerender-simple-expression-in-memo.md +35 -0
- package/.agents/skills/vercel-react-best-practices/rules/rerender-split-combined-hooks.md +64 -0
- package/.agents/skills/vercel-react-best-practices/rules/rerender-transitions.md +40 -0
- package/.agents/skills/vercel-react-best-practices/rules/rerender-use-deferred-value.md +59 -0
- package/.agents/skills/vercel-react-best-practices/rules/rerender-use-ref-transient-values.md +73 -0
- package/.agents/skills/vercel-react-best-practices/rules/server-after-nonblocking.md +73 -0
- package/.agents/skills/vercel-react-best-practices/rules/server-auth-actions.md +96 -0
- package/.agents/skills/vercel-react-best-practices/rules/server-cache-lru.md +41 -0
- package/.agents/skills/vercel-react-best-practices/rules/server-cache-react.md +76 -0
- package/.agents/skills/vercel-react-best-practices/rules/server-dedup-props.md +65 -0
- package/.agents/skills/vercel-react-best-practices/rules/server-hoist-static-io.md +149 -0
- package/.agents/skills/vercel-react-best-practices/rules/server-no-shared-module-state.md +50 -0
- package/.agents/skills/vercel-react-best-practices/rules/server-parallel-fetching.md +83 -0
- package/.agents/skills/vercel-react-best-practices/rules/server-parallel-nested-fetching.md +34 -0
- package/.agents/skills/vercel-react-best-practices/rules/server-serialization.md +38 -0
- package/.agents/skills/vercel-react-native-skills/AGENTS.md +2897 -0
- package/.agents/skills/vercel-react-native-skills/README.md +165 -0
- package/.agents/skills/vercel-react-native-skills/SKILL.md +121 -0
- package/.agents/skills/vercel-react-native-skills/metadata.json +16 -0
- package/.agents/skills/vercel-react-native-skills/rules/_sections.md +86 -0
- package/.agents/skills/vercel-react-native-skills/rules/_template.md +28 -0
- package/.agents/skills/vercel-react-native-skills/rules/animation-derived-value.md +53 -0
- package/.agents/skills/vercel-react-native-skills/rules/animation-gesture-detector-press.md +95 -0
- package/.agents/skills/vercel-react-native-skills/rules/animation-gpu-properties.md +65 -0
- package/.agents/skills/vercel-react-native-skills/rules/design-system-compound-components.md +66 -0
- package/.agents/skills/vercel-react-native-skills/rules/fonts-config-plugin.md +71 -0
- package/.agents/skills/vercel-react-native-skills/rules/imports-design-system-folder.md +68 -0
- package/.agents/skills/vercel-react-native-skills/rules/js-hoist-intl.md +61 -0
- package/.agents/skills/vercel-react-native-skills/rules/list-performance-callbacks.md +44 -0
- package/.agents/skills/vercel-react-native-skills/rules/list-performance-function-references.md +132 -0
- package/.agents/skills/vercel-react-native-skills/rules/list-performance-images.md +53 -0
- package/.agents/skills/vercel-react-native-skills/rules/list-performance-inline-objects.md +97 -0
- package/.agents/skills/vercel-react-native-skills/rules/list-performance-item-expensive.md +94 -0
- package/.agents/skills/vercel-react-native-skills/rules/list-performance-item-memo.md +82 -0
- package/.agents/skills/vercel-react-native-skills/rules/list-performance-item-types.md +104 -0
- package/.agents/skills/vercel-react-native-skills/rules/list-performance-virtualize.md +67 -0
- package/.agents/skills/vercel-react-native-skills/rules/monorepo-native-deps-in-app.md +46 -0
- package/.agents/skills/vercel-react-native-skills/rules/monorepo-single-dependency-versions.md +63 -0
- package/.agents/skills/vercel-react-native-skills/rules/navigation-native-navigators.md +188 -0
- package/.agents/skills/vercel-react-native-skills/rules/react-compiler-destructure-functions.md +50 -0
- package/.agents/skills/vercel-react-native-skills/rules/react-compiler-reanimated-shared-values.md +48 -0
- package/.agents/skills/vercel-react-native-skills/rules/react-state-dispatcher.md +91 -0
- package/.agents/skills/vercel-react-native-skills/rules/react-state-fallback.md +56 -0
- package/.agents/skills/vercel-react-native-skills/rules/react-state-minimize.md +65 -0
- package/.agents/skills/vercel-react-native-skills/rules/rendering-no-falsy-and.md +74 -0
- package/.agents/skills/vercel-react-native-skills/rules/rendering-text-in-text-component.md +36 -0
- package/.agents/skills/vercel-react-native-skills/rules/scroll-position-no-state.md +82 -0
- package/.agents/skills/vercel-react-native-skills/rules/state-ground-truth.md +80 -0
- package/.agents/skills/vercel-react-native-skills/rules/ui-expo-image.md +66 -0
- package/.agents/skills/vercel-react-native-skills/rules/ui-image-gallery.md +104 -0
- package/.agents/skills/vercel-react-native-skills/rules/ui-measure-views.md +78 -0
- package/.agents/skills/vercel-react-native-skills/rules/ui-menus.md +174 -0
- package/.agents/skills/vercel-react-native-skills/rules/ui-native-modals.md +77 -0
- package/.agents/skills/vercel-react-native-skills/rules/ui-pressable.md +61 -0
- package/.agents/skills/vercel-react-native-skills/rules/ui-safe-area-scroll.md +65 -0
- package/.agents/skills/vercel-react-native-skills/rules/ui-scrollview-content-inset.md +45 -0
- package/.agents/skills/vercel-react-native-skills/rules/ui-styling.md +87 -0
- package/.agents/skills/vercel-react-view-transitions/AGENTS.md +955 -0
- package/.agents/skills/vercel-react-view-transitions/README.md +42 -0
- package/.agents/skills/vercel-react-view-transitions/SKILL.md +320 -0
- package/.agents/skills/vercel-react-view-transitions/metadata.json +12 -0
- package/.agents/skills/vercel-react-view-transitions/references/css-recipes.md +242 -0
- package/.agents/skills/vercel-react-view-transitions/references/implementation.md +182 -0
- package/.agents/skills/vercel-react-view-transitions/references/nextjs.md +176 -0
- package/.agents/skills/vercel-react-view-transitions/references/patterns.md +262 -0
- package/.agents/skills/web-design-guidelines/SKILL.md +39 -0
- package/.agents/skills/workflow-metrics/SKILL.md +18 -0
- package/.agents/skills/writing-guidelines/SKILL.md +39 -0
- package/CODING_STANDARDS.md +49 -0
- package/LICENSE +21 -0
- package/README.md +556 -0
- package/VERSION +1 -0
- package/bin/devos.js +893 -0
- package/docs/.gitkeep +0 -0
- package/docs/ARCHITECTURE.md +114 -0
- package/docs/CHANGELOG.md +61 -0
- package/docs/CURRENT_STATE.md +39 -0
- package/docs/FIELD_REPORT_2026-08-20.md +130 -0
- package/docs/GETTING_STARTED.md +130 -0
- package/docs/LESSONS.md +24 -0
- package/docs/PRE_COMMIT_HOOK.md +152 -0
- package/docs/SLASH_COMMANDS.md +116 -0
- package/docs/TUTORIAL.md +75 -0
- package/package.json +54 -0
- package/scripts/smoke-test.js +167 -0
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
# Web Privacy Guidelines for Developers
|
|
2
|
+
|
|
3
|
+
Web application developers must treat privacy as a foundational architectural requirement, not just a legal compliance checkbox. As the web ecosystem shifts away from passive tracking toward explicit, user-consented interactions, building privacy-preserving applications is critical for user trust and security.
|
|
4
|
+
|
|
5
|
+
This document provides high-level principles and detailed, actionable guidelines with code examples for web developers.
|
|
6
|
+
|
|
7
|
+
## High-Level Overview
|
|
8
|
+
|
|
9
|
+
These core themes should guide your approach to privacy in web development:
|
|
10
|
+
|
|
11
|
+
1. **Automation Asymmetry & Privacy Labor**: Do not offload the burden of protecting privacy to the user (privacy labor). Avoid overwhelming users with complex consent dialogs (automation asymmetry). Users have limited time and attention; offloading privacy choices to them is often ineffective and causes fatigue. Systems should be privacy-protective by default.
|
|
12
|
+
2. **Data Minimization**: "If you don't have the data, you can't lose it." Collect only the bare minimum required for the immediate task. Reducing data storage reduces the risk of breach and builds user trust.
|
|
13
|
+
3. **Purpose Limitation**: Data collected for one purpose must not be used for another without fresh consent. Repurposing data without explicit agreement violates the trust relationship with the user.
|
|
14
|
+
4. **Transparency by Default**: Be honest and clear about why data is collected, where it goes, and how long it is kept. Transparency builds trust and can be a unique selling point for your application.
|
|
15
|
+
5. **Trustworthy Agency**: Treat your application as an agent acting in the user's best interest. This means protecting them from intrusive behaviors, unnecessary data exposure, and acting as a loyal fiduciary to the user rather than serving third-party interests.
|
|
16
|
+
|
|
17
|
+
## Detailed Guidelines
|
|
18
|
+
|
|
19
|
+
### 1. Data Minimization and Purpose Limitation
|
|
20
|
+
|
|
21
|
+
Reducing the amount of data collected and strictly limiting its use is the most effective way to protect user privacy.
|
|
22
|
+
|
|
23
|
+
#### DOs:
|
|
24
|
+
* **DO** collect data at the lowest granularity necessary. If you only need to know if a user is in a certain age bracket (e.g., 18-34), ask for the bracket, not the exact date of birth.
|
|
25
|
+
* **DO** provide guest checkout options for e-commerce to avoid forced account creation, which reduces data collection and cart abandonment.
|
|
26
|
+
* **DO** delete data as soon as the purpose for its collection has been fulfilled.
|
|
27
|
+
* **DO** use techniques like "fuzzing" or adding noise to data (Differential Privacy) when gathering aggregate statistics.
|
|
28
|
+
|
|
29
|
+
#### DON'Ts:
|
|
30
|
+
* **DON'T** collect data speculatively "just in case" it might be useful in the future.
|
|
31
|
+
* **DON'T** reuse data collected for one purpose (e.g., security verification) for another (e.g., marketing) without explicit user consent.
|
|
32
|
+
|
|
33
|
+
#### Code Examples:
|
|
34
|
+
|
|
35
|
+
**Fuzzing Data Collection (HTML/JS)**
|
|
36
|
+
Instead of asking for exact age:
|
|
37
|
+
```html
|
|
38
|
+
<label for="age-bracket">Age Bracket:</label>
|
|
39
|
+
<select id="age-bracket" name="age-bracket">
|
|
40
|
+
<option value="18-34">18-34</option>
|
|
41
|
+
<option value="35-49">35-49</option>
|
|
42
|
+
<option value="50+">50+</option>
|
|
43
|
+
</select>
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
### 2. Transparency and Trust
|
|
47
|
+
|
|
48
|
+
Build trust by being open about your data practices and providing easy ways for users to control their data.
|
|
49
|
+
|
|
50
|
+
#### DOs:
|
|
51
|
+
* **DO** provide inline explanations for why data is requested. Place the explanation directly next to the input field.
|
|
52
|
+
* **DO** provide a clear reason and context *before* requesting powerful browser permissions (e.g., camera, location).
|
|
53
|
+
* **DO** consider using the **Page Embedded Permission Control (PEPC)** `<permission>` element, if supported, to make permission requests declarative, user-initiated, and act as data mediators.
|
|
54
|
+
* **DO** use the `Clear-Site-Data` header when a user logs out to ensure no lingering data remains in the browser.
|
|
55
|
+
* **DO** make it as easy to opt-out or delete an account as it was to sign up.
|
|
56
|
+
|
|
57
|
+
#### DON'Ts:
|
|
58
|
+
* **DON'T** bury data collection explanations in long, complex privacy policies.
|
|
59
|
+
* **DON'T** use deceptive patterns (dark patterns) to trick users into giving consent.
|
|
60
|
+
|
|
61
|
+
#### Code Examples:
|
|
62
|
+
|
|
63
|
+
**Inline Transparency (HTML)**
|
|
64
|
+
```html
|
|
65
|
+
<div>
|
|
66
|
+
<label for="phone">Phone Number (Optional)</label>
|
|
67
|
+
<input id="phone" type="tel" name="phone">
|
|
68
|
+
<a href="#phone-help">Why do we ask for this?</a>
|
|
69
|
+
<aside id="phone-help">
|
|
70
|
+
We only use your phone number to send two-factor authentication codes for account security.
|
|
71
|
+
</aside>
|
|
72
|
+
</div>
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
**Clear-Site-Data on Logout (HTTP Response)**
|
|
76
|
+
```http
|
|
77
|
+
HTTP/1.1 200 OK
|
|
78
|
+
Clear-Site-Data: "*"
|
|
79
|
+
```
|
|
80
|
+
*Note: If clearing the cache, avoid sending this on the main navigation page to prevent blocking UI rendering on slow devices; trigger it via a subresource.*
|
|
81
|
+
|
|
82
|
+
**Page Embedded Permission Control (HTML)**
|
|
83
|
+
```html
|
|
84
|
+
<!-- Declarative permission element with fallback -->
|
|
85
|
+
<permission type="geolocation" onpromptdismiss="updateMap()">
|
|
86
|
+
<!-- Fallback for unsupported browsers -->
|
|
87
|
+
<button onclick="navigator.geolocation.getCurrentPosition(updateMap)">
|
|
88
|
+
Use my location
|
|
89
|
+
</button>
|
|
90
|
+
</permission>
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
### 3. Security and Data Handling for Privacy
|
|
94
|
+
|
|
95
|
+
Privacy relies on a foundation of secure coding. Vulnerabilities in the application or insecure storage directly lead to privacy violations.
|
|
96
|
+
|
|
97
|
+
#### DOs:
|
|
98
|
+
* **DO** scrub Personally Identifiable Information (PII) from application logs. Use automated masking for emails, tokens, and IDs.
|
|
99
|
+
* **DO** use `HttpOnly` flags for cookies storing session identifiers to prevent other scripts from accessing them.
|
|
100
|
+
* **DO** implement rate limiting on sensitive endpoints (e.g., user search or profile views) to prevent bulk data scraping.
|
|
101
|
+
* **DO** use **CHIPS (Cookies Having Independent Partitioned State)** by appending the `Partitioned` attribute for 1:1 embeds that do not share state across top-level sites.
|
|
102
|
+
|
|
103
|
+
#### DON'Ts:
|
|
104
|
+
* **DON'T** store sensitive tokens or PII in `localStorage`, as it is accessible by any embedded script.
|
|
105
|
+
* **DON'T** rely on unpartitioned `SameSite=None` cookies.
|
|
106
|
+
|
|
107
|
+
#### Code Examples:
|
|
108
|
+
|
|
109
|
+
**Secure Session Cookie (HTTP)**
|
|
110
|
+
```http
|
|
111
|
+
Set-Cookie: session_id=xyz123; Secure; HttpOnly; SameSite=Lax
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
**CHIPS Cookie (HTTP)**
|
|
115
|
+
```http
|
|
116
|
+
Set-Cookie: theme_pref=dark; SameSite=None; Secure; Path=/; Partitioned; HttpOnly
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
### 4. Third-Party Audits and Mitigations
|
|
120
|
+
|
|
121
|
+
Third-party scripts and resources are a common source of privacy leaks. You are responsible for the third parties you bring into your application.
|
|
122
|
+
|
|
123
|
+
#### DOs:
|
|
124
|
+
* **DO** conduct regular technical audits of network requests using DevTools or HAR files to identify what data third parties are collecting.
|
|
125
|
+
* **DO** use the **Façade Pattern** for heavy embeds (like YouTube or TikTok). Display a static thumbnail and load the interactive iframe only after the user clicks.
|
|
126
|
+
* **DO** use privacy-preserving options for embeds when available (e.g., `youtube-nocookie.com`).
|
|
127
|
+
* **DO** replace heavy social sharing SDKs with simple, static HTML links that do not track users.
|
|
128
|
+
* **DO** use the **Federated Credential Management API (FedCM)** to mediate "Sign-In" flows natively, preventing IdP tracking of Relying Parties prior to user consent.
|
|
129
|
+
|
|
130
|
+
#### DON'Ts:
|
|
131
|
+
* **DON'T** assume a third party is privacy-safe just because it is popular.
|
|
132
|
+
* **DON'T** load third-party scripts on pages where sensitive data (like checkout or health info) is handled unless strictly necessary.
|
|
133
|
+
|
|
134
|
+
#### Code Examples:
|
|
135
|
+
|
|
136
|
+
**Privacy-Preserving Social Sharing (HTML)**
|
|
137
|
+
```html
|
|
138
|
+
<!-- No JS SDK required -->
|
|
139
|
+
<a href="https://x.com/intent/tweet?text=Check%20this%20out&url=https%3A%2F%2Fexample.com"
|
|
140
|
+
rel="noopener" target="_blank">
|
|
141
|
+
Share on X
|
|
142
|
+
</a>
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
**Video Façade Pattern (HTML/JS)**
|
|
146
|
+
```html
|
|
147
|
+
<div id="video-container" data-video-id="abc123">
|
|
148
|
+
<img src="https://img.youtube.com/vi/abc123/maxresdefault.jpg" alt="Play Video" id="play-btn">
|
|
149
|
+
</div>
|
|
150
|
+
|
|
151
|
+
<script>
|
|
152
|
+
document.getElementById('play-btn').addEventListener('click', function() {
|
|
153
|
+
const container = document.getElementById('video-container');
|
|
154
|
+
const videoId = container.dataset.videoId;
|
|
155
|
+
container.innerHTML = `<iframe src="https://www.youtube-nocookie.com/embed/${videoId}?autoplay=1" allowfullscreen></iframe>`;
|
|
156
|
+
});
|
|
157
|
+
</script>
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
**FedCM Sign-In (JavaScript)**
|
|
161
|
+
```javascript
|
|
162
|
+
try {
|
|
163
|
+
const credential = await navigator.credentials.get({
|
|
164
|
+
identity: {
|
|
165
|
+
providers: [{
|
|
166
|
+
configURL: "https://idp.example/fedcm.json",
|
|
167
|
+
clientId: "rp-client-id-123",
|
|
168
|
+
nonce: "a_secure_random_nonce_value"
|
|
169
|
+
}]
|
|
170
|
+
}
|
|
171
|
+
});
|
|
172
|
+
authenticateWithBackend(credential.token);
|
|
173
|
+
} catch (error) {
|
|
174
|
+
// Handle FedCM login failure
|
|
175
|
+
}
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
### 5. Privacy-Preserving Headers
|
|
179
|
+
|
|
180
|
+
Use standard HTTP headers to instruct the browser to enforce privacy boundaries.
|
|
181
|
+
|
|
182
|
+
#### DOs:
|
|
183
|
+
* **DO** use `Permissions-Policy` to disable powerful features (like camera, microphone, geolocation) by default, enabling them only where required.
|
|
184
|
+
* **DO** set a strict `Referrer-Policy` to prevent leaking sensitive URL parameters to third parties.
|
|
185
|
+
|
|
186
|
+
#### Code Examples:
|
|
187
|
+
|
|
188
|
+
**Strict Referrer Policy (HTTP)**
|
|
189
|
+
```http
|
|
190
|
+
Referrer-Policy: strict-origin-when-cross-origin
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
**Defensive Permissions Policy (HTTP)**
|
|
194
|
+
Disables powerful features for all origins by default.
|
|
195
|
+
```http
|
|
196
|
+
Permissions-Policy: geolocation=(), camera=(), microphone=(), accelerometer=()
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
### 6. Fingerprinting and User-Agent Reduction
|
|
200
|
+
|
|
201
|
+
Avoid techniques that attempt to uniquely identify users covertly based on their device configuration. Fingerprinting takes away user control because it relies on unchanging characteristics and happens invisibly, preventing users from opting out or clearing their identifier.
|
|
202
|
+
|
|
203
|
+
#### DOs:
|
|
204
|
+
* **DO** use **Feature Detection** instead of User-Agent sniffing to determine if a browser supports a capability.
|
|
205
|
+
* **DO** use **User-Agent Client Hints** (UA-CH) if supported by the browser, when specific device targeting is required.
|
|
206
|
+
|
|
207
|
+
#### DON'Ts:
|
|
208
|
+
* **DON'T** use canvas rendering, font lists, or audio/video device enumerations to build a device fingerprint.
|
|
209
|
+
* **DON'T** rely on the full granularity of the traditional `navigator.userAgent` string.
|
|
210
|
+
|
|
211
|
+
#### Code Examples:
|
|
212
|
+
|
|
213
|
+
**Feature Detection (JavaScript)**
|
|
214
|
+
```javascript
|
|
215
|
+
// GOOD: Check if the API exists
|
|
216
|
+
if ('IntersectionObserver' in window) {
|
|
217
|
+
const observer = new IntersectionObserver(...);
|
|
218
|
+
} else {
|
|
219
|
+
// Fallback
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
// BAD: Sniffing UA
|
|
223
|
+
// if (navigator.userAgent.includes("Chrome/100")) ...
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
**User-Agent Client Hints (JavaScript)**
|
|
227
|
+
```javascript
|
|
228
|
+
if (navigator.userAgentData) {
|
|
229
|
+
navigator.userAgentData.getHighEntropyValues(["platformVersion", "architecture"])
|
|
230
|
+
.then(ua => {
|
|
231
|
+
console.log(ua.platformVersion);
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
### 7. Data Rights and User Control
|
|
237
|
+
|
|
238
|
+
Empower users to exercise their rights over their personal data.
|
|
239
|
+
|
|
240
|
+
#### DOs:
|
|
241
|
+
* **DO** provide clear mechanisms for users to **access** all data you have collected about them.
|
|
242
|
+
* **DO** implement automated or easy manual flows for **data deletion** (erasure).
|
|
243
|
+
* **DO** allow users to correct inaccurate information associated with their identity.
|
|
244
|
+
|
|
245
|
+
#### DON'Ts:
|
|
246
|
+
* **DON'T** make the deletion process difficult or require users to contact support if sign-up was automated.
|
|
247
|
+
* **DON'T** retaliate against users who exercise their data rights by denying access to non-dependent services.
|
|
@@ -0,0 +1,350 @@
|
|
|
1
|
+
# Web Security
|
|
2
|
+
|
|
3
|
+
Guidelines for implementing preventative security measures on the web safely and incrementally.
|
|
4
|
+
|
|
5
|
+
**NOTE**: This skill covers standard web platform defenses, focusing mostly on the browser. Applications still require comprehensive server-side security, authorization models, and input validation.
|
|
6
|
+
|
|
7
|
+
## Table of Contents
|
|
8
|
+
|
|
9
|
+
- When to apply this skill
|
|
10
|
+
- Phase 1: Quick Wins & Obvious Anti-Patterns
|
|
11
|
+
- 1.1 Secure Contexts
|
|
12
|
+
- 1.2 Avoid Dangerous DOM Sinks
|
|
13
|
+
- 1.3 Secure Cookies
|
|
14
|
+
- 1.4 Clickjacking Protection (Frame-Ancestors & X-Frame-Options)
|
|
15
|
+
- 1.5 Secure Window Messaging (postMessage)
|
|
16
|
+
- Phase 2: Discovery & Data Collection (Prerequisites)
|
|
17
|
+
- 2.1 Inspect the Application
|
|
18
|
+
- 2.2 Deploy Report-Only Policies
|
|
19
|
+
- 2.3 Data Hygiene for Reports
|
|
20
|
+
- 2.4 Automated Discovery via Browser APIs and DevTools
|
|
21
|
+
- Phase 3: Interpreting Results & Enforcement
|
|
22
|
+
- Core enforcement (data-driven rollouts)
|
|
23
|
+
- 3.1 Analyzing CSP Reports
|
|
24
|
+
- 3.2 Transitioning to CSP Enforcement
|
|
25
|
+
- 3.3 Trusted Types Enforcement
|
|
26
|
+
- 3.4 Cross-Origin Opener Policy (COOP)
|
|
27
|
+
- 3.5 Cross-Origin Resource Policy (CORP)
|
|
28
|
+
- 3.6 Cross-Origin Isolation
|
|
29
|
+
- 3.7 Fetch Metadata (Resource Isolation)
|
|
30
|
+
- Companion policies (deploy in parallel)
|
|
31
|
+
- HTTP Strict Transport Security (HSTS)
|
|
32
|
+
- X-Content-Type-Options
|
|
33
|
+
- Referrer Policy
|
|
34
|
+
- Permissions Policy
|
|
35
|
+
- Subresource Integrity (SRI)
|
|
36
|
+
- Cross-Origin Resource Sharing (CORS)
|
|
37
|
+
- Clear-Site-Data (Logout)
|
|
38
|
+
|
|
39
|
+
## When to apply this skill
|
|
40
|
+
|
|
41
|
+
The right starting point depends on the application:
|
|
42
|
+
|
|
43
|
+
- **Retrofitting an existing app**: Always start at Phase 1. Strict policies applied without discovery will break the app. Treat Phase 2 (report-only) as a prerequisite for any Phase 3 enforcement.
|
|
44
|
+
- **Greenfield app or new feature**: You can adopt Phase 3 enforced policies directly, but still wire up reporting from day one.
|
|
45
|
+
- **SaaS template / framework defaults**: Ship Phase 1 hygiene and Phase 3 policies enabled by default, with Phase 2 reporting on so downstream users can detect regressions.
|
|
46
|
+
|
|
47
|
+
If you are unsure which case applies, default to Phase 1 → 2 → 3 in order.
|
|
48
|
+
|
|
49
|
+
**Focusing on Leverage**: While Phase 1 and 2 establish baseline hygiene and data gathering, Phase 3 core enforcement represents the highest-leverage security work. Specifically, Injection/XSS mitigation through CSP (§3.2) and Trusted Types (§3.3) addresses the largest practical threat, while companion policies and isolation defenses provide important defense-in-depth.
|
|
50
|
+
|
|
51
|
+
## Phase 1: Quick Wins & Obvious Anti-Patterns
|
|
52
|
+
|
|
53
|
+
Before attempting to deploy global security policies, focus on code-level hygiene and immediate fixes that do not risk breaking the application.
|
|
54
|
+
|
|
55
|
+
### 1.1 Secure Contexts
|
|
56
|
+
- **DO**: Deliver resources over HTTPS to protect against both passive and active network attackers.
|
|
57
|
+
- **DO**: Serve a header like `Strict-Transport-Security: max-age=31536000; includeSubDomains; preload` to force HTTPS whenever possible.
|
|
58
|
+
- **TIP**: In production rollout, start with a short `max-age` (e.g., 300 seconds) and incrementally increase to 1 year. A misconfigured HSTS with a long max-age can render the site permanently inaccessible until the cache expires in every browser that saw it.
|
|
59
|
+
|
|
60
|
+
### 1.2 Avoid Dangerous DOM Sinks
|
|
61
|
+
- **DO**: Prefer `textContent` or `innerText` over `innerHTML` when setting text content.
|
|
62
|
+
- **DO**: Use `setHTML` (part of the Sanitizer API) when available to safely insert HTML.
|
|
63
|
+
- **DO NOT**: Use `innerHTML` or `setHTMLUnsafe` with untrusted or unsanitized input.
|
|
64
|
+
- **DO**: Use DOMParser or create elements programmatically (`document.createElement`) instead of concatenating HTML strings.
|
|
65
|
+
|
|
66
|
+
**Dangerous sinks to grep for**: `innerHTML`, `outerHTML`, `document.write`, `eval`, `setTimeout` with a string argument, `script.src`.
|
|
67
|
+
|
|
68
|
+
**Code Pattern:**
|
|
69
|
+
```javascript
|
|
70
|
+
// Unsafe
|
|
71
|
+
element.innerHTML = `Hello, ${untrustedName}!`;
|
|
72
|
+
|
|
73
|
+
// Safe
|
|
74
|
+
element.textContent = `Hello, ${untrustedName}!`;
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
Trusted Types can enforce this pattern at runtime by blocking string assignments to dangerous sinks. Deploying it is a CSP enforcement step with real breakage risk — see §3.3.
|
|
78
|
+
|
|
79
|
+
### 1.3 Secure Cookies
|
|
80
|
+
Ensure new cookies are configured securely by default.
|
|
81
|
+
- **DO**: Prefer naming cookies with the `__Host-` prefix when they'll only be used by one domain. This requires the `Secure` and `Path=/` attributes to be set, and the `Domain` attribute to be omitted. This protects against same-site and network attackers.
|
|
82
|
+
- **DO**: Prefer naming cookies with the `__Secure-` prefix when `__Host-` isn't appropriate. This requires the `Secure` attribute, and protects against network attackers.
|
|
83
|
+
- **DO**: Explicitly set `SameSite=Lax` for standard first-party cookies.
|
|
84
|
+
- **DO**: If your application will be embedded as an iframe in third-party contexts, use `SameSite=None; Secure; Partitioned`.
|
|
85
|
+
- **DO NOT**: Rely on unpartitioned `SameSite=None` — these are being systematically blocked for tracking prevention.
|
|
86
|
+
|
|
87
|
+
```http
|
|
88
|
+
Set-Cookie: __Host-session_id=value; SameSite=Lax; HttpOnly; Secure; Path=/
|
|
89
|
+
Set-Cookie: third_party_var=value; SameSite=None; Secure; Partitioned
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
### 1.4 Clickjacking Protection (Frame-Ancestors & X-Frame-Options)
|
|
93
|
+
Clickjacking protection is easy to deploy, carries extremely low risk of breaking legitimate functionality, and provides immediate defense against malicious UI redressing.
|
|
94
|
+
- **DO**: Set the `X-Frame-Options: SAMEORIGIN` header to prevent other sites from embedding your pages in an iframe (or use `DENY` if you should never be embedded).
|
|
95
|
+
- **DO**: For fine-grained control, use `frame-ancestors 'self'` (or specified trusted domains) in your CSP header.
|
|
96
|
+
|
|
97
|
+
```http
|
|
98
|
+
X-Frame-Options: SAMEORIGIN
|
|
99
|
+
Content-Security-Policy: frame-ancestors 'self' https://trusted-partner.com;
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
### 1.5 Secure Window Messaging (postMessage)
|
|
103
|
+
If your application communicates with other origins using `window.postMessage`, you must strictly validate the sender and receiver.
|
|
104
|
+
- **DO**: Always validate the `event.origin` of incoming messages on the receiver side using strict equality against a list of trusted origins. Do **not** trust wildcards (`*`) or unverified payloads.
|
|
105
|
+
- **DO**: Always specify a target origin (rather than the wildcard `*`) when calling `postMessage` to send sensitive data, ensuring only the intended origin can receive it.
|
|
106
|
+
- **DO**: Validate and sanitize the properties of incoming message payloads before performing operations or writing them to DOM sinks. Manual JSON serialization is unnecessary as `postMessage` handles object cloning internally.
|
|
107
|
+
|
|
108
|
+
```javascript
|
|
109
|
+
// Receiver (Safe - traditional string check)
|
|
110
|
+
window.addEventListener('message', (event) => {
|
|
111
|
+
if (event.origin !== 'https://trusted-origin.com') return;
|
|
112
|
+
const data = event.data;
|
|
113
|
+
if (data && data.action === 'update') {
|
|
114
|
+
// Process data safely
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
// Sender (Safe)
|
|
119
|
+
targetWindow.postMessage({ action: 'update' }, 'https://trusted-origin.com');
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
## Phase 2: Discovery & Data Collection (Prerequisites)
|
|
123
|
+
|
|
124
|
+
Do not blindly apply strict policies to an existing application. You must first understand the application's constraints by collecting data.
|
|
125
|
+
|
|
126
|
+
### 2.1 Inspect the Application
|
|
127
|
+
Before turning anything on, gather facts:
|
|
128
|
+
- **Grep for existing security headers** in server config, middleware, CDN/edge config, and meta tags: `Content-Security-Policy`, `Strict-Transport-Security`, `X-Frame-Options`, `X-Content-Type-Options`, `Permissions-Policy`, `Cross-Origin-*`, `Access-Control-*`, `Timing-Allow-Origin`, `Reporting-Endpoints`.
|
|
129
|
+
- **Enumerate inline scripts and styles** in server-rendered templates and static HTML — these will need nonces, hashes, or refactoring.
|
|
130
|
+
- **List third-party script origins** loaded by the app (analytics, ads, tag managers, CDNs). These dictate what `script-src` must allow or whether `'strict-dynamic'` is viable.
|
|
131
|
+
- **Identify popup-dependent flows**: OAuth, payment gateways, SSO. These constrain COOP choices.
|
|
132
|
+
- **Identify cross-origin embeds and embedders**: iframes the app loads, and sites that embed the app. These constrain COEP/CORP/`frame-ancestors`.
|
|
133
|
+
- **Enumerate required browser features**: List any features (camera, geolocation, microphone, fullscreen) used by the app or embedded third-party widgets to inform `Permissions-Policy`.
|
|
134
|
+
- **Identify dynamic dependencies**: Check if third-party scripts are versioned or if they receive silent updates, determining if `SRI` can be used.
|
|
135
|
+
- **Map cross-site integrations**: List all incoming Webhooks, cross-site APIs, or SSO redirect endpoints so `Fetch Metadata` resource isolation policies don't break them.
|
|
136
|
+
|
|
137
|
+
### 2.2 Deploy Report-Only Policies
|
|
138
|
+
Use "Report-Only" headers to identify potential breakages before they happen.
|
|
139
|
+
- **DO**: Use report-only headers to dry-run policies without enforcement. Standard report-only headers include:
|
|
140
|
+
- `Content-Security-Policy-Report-Only` for CSP rules.
|
|
141
|
+
- `Cross-Origin-Opener-Policy-Report-Only` for COOP isolation.
|
|
142
|
+
- `Cross-Origin-Embedder-Policy-Report-Only` for COEP isolation.
|
|
143
|
+
- `Document-Policy-Report-Only` for document features.
|
|
144
|
+
- **DO**: Define a `Reporting-Endpoints` header so violations have somewhere to go, and reference its name from `report-to`. Recommend setting an endpoint named `default`, which will automatically capture deprecation and crash reports.
|
|
145
|
+
- **DO**: Run report-only for long enough to cover real traffic patterns (typically days to weeks), not just synthetic testing.
|
|
146
|
+
|
|
147
|
+
**Example headers:**
|
|
148
|
+
```http
|
|
149
|
+
Reporting-Endpoints: default="https://reports.example/default", main-endpoint="https://reports.example/main"
|
|
150
|
+
Content-Security-Policy-Report-Only: script-src 'nonce-{RANDOM}' 'strict-dynamic' 'report-sample'; object-src 'none'; base-uri 'none'; report-to main-endpoint;
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
The `'strict-dynamic'`, `https:`, and `'unsafe-inline'` tokens together form a backwards-compatibility ladder: modern browsers honor `'strict-dynamic'` (nonce-propagating) and ignore the others; older browsers fall back to `https:`; very old browsers fall back to `'unsafe-inline'`. The fallbacks are harmless on any browser that supports a stricter token.
|
|
154
|
+
|
|
155
|
+
**Managing report false-positives**: Reporting endpoints receive a significant volume of false-positive violation reports caused by client-side middleware, aggressive browser extensions, ancient browsers, web crawlers, or antivirus scanners. When analyzing report-only logs, focus on high-frequency patterns from modern user-agents and filter out noise before making deployment decisions. Specifically:
|
|
156
|
+
- **Filter out noise**: Ignore reports sent by old browsers with known bugs triggering spurious violations, reports for markup known to be injected by popular browser extensions or client-side middleware (like identical reports seen across many distinct applications), and reports that do not contain enough information to debug.
|
|
157
|
+
- **Ignore low-volume reports**: If a policy is deployed, a low violation volume often indicates a false positive that can be safely ignored.
|
|
158
|
+
- **Leverage `'report-sample'`**: Always include `'report-sample'` in your `script-src` directives. This instructs the browser to include the first 40 characters of the violating script or inline code snippet in the violation report, which makes debugging much easier.
|
|
159
|
+
|
|
160
|
+
### 2.3 Data Hygiene for Reports
|
|
161
|
+
- **DO NOT**: Include sensitive data (PII, authentication tokens, session identifiers, query strings with secrets) in logs or violation reports. Mask or omit them at the edge before they reach the reporting endpoint.
|
|
162
|
+
|
|
163
|
+
### 2.4 Automated Discovery via Browser APIs and DevTools
|
|
164
|
+
- **Reporting API**: Use `Reporting-Endpoints` in combination with report-only headers (e.g., `Content-Security-Policy-Report-Only`, `Document-Policy-Report-Only`) to have the browser automatically post violations to your server.
|
|
165
|
+
- **Browser DevTools**: Use the **Issues Tab** in modern browsers (e.g., Chrome DevTools). It automatically surfaces blocked resources, mixed content, third-party cookie deprecation warnings, and feature policy violations without you having to crawl the codebase manually.
|
|
166
|
+
|
|
167
|
+
## Phase 3: Interpreting Results & Enforcement
|
|
168
|
+
|
|
169
|
+
After collecting data, decide how to proceed with enforcement. Phase 3 has two tracks that run in parallel, not in sequence:
|
|
170
|
+
|
|
171
|
+
- **Core enforcement (data-driven rollouts)** — high-breakage-risk policies that depend on Phase 2 report-only data. These are the rollouts you stage and watch.
|
|
172
|
+
- **Companion policies (deploy in parallel)** — lower-risk headers that can be turned on alongside or before the core work, with little or no Phase 2 discovery required.
|
|
173
|
+
|
|
174
|
+
### Core enforcement (data-driven rollouts)
|
|
175
|
+
|
|
176
|
+
#### 3.1 Analyzing CSP Reports
|
|
177
|
+
|
|
178
|
+
When reviewing CSP violation reports, first separate the noise (per §2.2) from legitimate application issues. For violations that appear to be caused by an incompatibility in your application (usually those where the "Sample" or "Blocked URI" seem like legitimate scripts or assets that might be present in your markup):
|
|
179
|
+
- **Code Search**: Search your codebase for the offending script source, URL, or hash to see if it is present in your code, dynamic server templates, or static HTML files.
|
|
180
|
+
- **Console Auditing**: Open the page that triggered the violation (the "Document URI" in the report) using the same browser, and check the developer tools/console for CSP violations while exercising as much application functionality as possible (some violations only trigger on specific user interactions).
|
|
181
|
+
|
|
182
|
+
Once filtered and triaged, analyze the reports against the following common scenarios:
|
|
183
|
+
|
|
184
|
+
- **Scenario**: Many violations for inline scripts.
|
|
185
|
+
- **Condition**: The app uses a framework that relies on inline scripts.
|
|
186
|
+
- **Decision**: Implement Nonces (server-rendered) or Hashes (static) before enforcing.
|
|
187
|
+
- **Scenario**: Violations for third-party analytics scripts.
|
|
188
|
+
- **Condition**: The scripts are required.
|
|
189
|
+
- **Decision**: Use `'strict-dynamic'` with a per-request nonce so the analytics loader can attach its dependencies. Do **not** add the analytics origin to a URL allowlist — domain allowlists are bypassable via open redirects, JSONP, and dependency injection on the listed origin.
|
|
190
|
+
- **Scenario**: Trusted Types violations on specific sinks.
|
|
191
|
+
- **Condition**: Legacy code paths still write strings to `innerHTML` etc.
|
|
192
|
+
- **Decision**: Refactor those sinks (per §1.2) or route them through a Trusted Types policy (§3.3) before enforcing.
|
|
193
|
+
|
|
194
|
+
#### 3.2 Transitioning to CSP Enforcement
|
|
195
|
+
Only move to enforced mode when:
|
|
196
|
+
1. Violations in the report-only logs have dropped to near zero or are accounted for.
|
|
197
|
+
2. Reporting remains wired up after the switch — keep `report-to` on the enforced header so regressions are visible.
|
|
198
|
+
|
|
199
|
+
**Key directives to set:**
|
|
200
|
+
- `script-src` with nonces or hashes — this is the core directive of any CSP and the primary mechanism to prevent XSS.
|
|
201
|
+
- `base-uri 'none'` to block `<base>` hijacking. Legacy directives like `object-src 'none'` can be omitted in modern, post-Flash web environments.
|
|
202
|
+
- *Optional but potentially breaking*: `default-src 'self'` is sometimes used as a fallback for unspecified fetch directives, but it dramatically complicates deployment and has little security value beyond `script-src`. It is generally safer to focus on robust `script-src` enforcement first.
|
|
203
|
+
- *Optional*: `form-action 'self'` prevents form submissions to attacker-controlled origins.
|
|
204
|
+
- *Optional*: `upgrade-insecure-requests` auto-upgrades subresource HTTP loads to HTTPS, though modern browsers largely auto-upgrade mixed content anyway.
|
|
205
|
+
|
|
206
|
+
**Enforced Header Example (CSP with reporting):**
|
|
207
|
+
```http
|
|
208
|
+
Reporting-Endpoints: main-endpoint="https://reports.example/main"
|
|
209
|
+
Content-Security-Policy: script-src 'nonce-{RANDOM}' 'strict-dynamic' 'report-sample'; object-src 'none'; base-uri 'none'; report-to main-endpoint;
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
HTML for nonce-based CSP:
|
|
213
|
+
```html
|
|
214
|
+
<script nonce="{RANDOM}" src="https://example.com/script.js"></script>
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
For static/cached HTML (SPAs) where a per-response nonce is not possible, use hash-based CSP: hash each inline script and list the hashes in `script-src`.
|
|
218
|
+
|
|
219
|
+
**Avoid**: URL allowlists like `script-src https://cdn.example.com` — they are easily bypassed by open redirects, JSONP endpoints, and dependency injection on the allowed origin.
|
|
220
|
+
|
|
221
|
+
#### 3.3 Trusted Types Enforcement
|
|
222
|
+
Trusted Types enforces the §1.2 source-level guidance at runtime: once enabled, the browser blocks string assignments to dangerous sinks unless they pass through a named policy.
|
|
223
|
+
|
|
224
|
+
- **Incremental Rollout Strategy**: While full enforcement carries real breakage risk, you do not need to do everything at once. A highly viable approach is to define and roll out a policy for a small portion of the application under refactoring, and slowly expand its usage as you replace sinks. This simplifies eventual global enforcement without short-term breakage risk.
|
|
225
|
+
- **Prerequisite**: Trusted Types requires framework cooperation. If the app's framework (or any third-party widget that writes to DOM sinks) does not produce `TrustedHTML` / `TrustedScript` values, the policy cannot be enforced without breaking that code. Audit framework support before starting the report-only rollout.
|
|
226
|
+
- **Prerequisite**: The code-level sink refactor from Phase 1 is a prerequisite for complete Trusted Types enforcement. (Standard CSP `script-src` enforcement, by contrast, does not police DOM sinks and can be deployed without refactoring them.)
|
|
227
|
+
- **DO**: Roll out via `Content-Security-Policy-Report-Only: require-trusted-types-for 'script'` first to find every offending sink.
|
|
228
|
+
- **DO**: Define a single named policy that performs sanitization (or escaping) and route all sink writes through it.
|
|
229
|
+
- **DO**: Move to full global `Content-Security-Policy: require-trusted-types-for 'script'` enforcement once the policy has been successfully integrated and violations in report-only logs drop to zero.
|
|
230
|
+
|
|
231
|
+
```javascript
|
|
232
|
+
if (window.trustedTypes && trustedTypes.createPolicy) {
|
|
233
|
+
const policy = trustedTypes.createPolicy('escapePolicy', {
|
|
234
|
+
createHTML: str => str.replace(/</g, '<').replace(/>/g, '>')
|
|
235
|
+
});
|
|
236
|
+
el.innerHTML = policy.createHTML(untrustedString);
|
|
237
|
+
}
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
#### 3.4 Cross-Origin Opener Policy (COOP)
|
|
241
|
+
|
|
242
|
+
Lowest-risk of the three. Deploy if the app is **not** an OAuth provider, payment processor, or otherwise expected to be reached from an opener.
|
|
243
|
+
|
|
244
|
+
- **DO**: Use `Cross-Origin-Opener-Policy: same-origin-allow-popups` — prevents a malicious opener from mounting XS-leaks attacks while still allowing OAuth and payment flows that *the app itself* initiates.
|
|
245
|
+
- **DO NOT**: Jump straight to `same-origin` unless you have explicitly verified that no integrations rely on cross-origin `window.opener` access.
|
|
246
|
+
|
|
247
|
+
#### 3.5 Cross-Origin Resource Policy (CORP)
|
|
248
|
+
|
|
249
|
+
Set CORP explicitly on each response based on whether it should be embeddable in other contexts. Two core benefits: it protects resources from malicious cross-origin reads, and ensures compatibility when pages request stronger client-side isolation.
|
|
250
|
+
|
|
251
|
+
- **DO**: Default to `Cross-Origin-Resource-Policy: same-origin` for app-internal resources (authenticated data, user session JSON, restricted internal scripts).
|
|
252
|
+
- **DO**: Use `same-site` for endpoints utilized across subdomains of the same eTLD+1.
|
|
253
|
+
- **DO**: Provide `cross-origin` exclusively for resources created for generic embedding or widely cached delivery (e.g., static shared assets or public CDNs).
|
|
254
|
+
|
|
255
|
+
#### 3.6 Cross-Origin Isolation
|
|
256
|
+
|
|
257
|
+
Highest deployment breakage risk. You only need to deploy this infrastructure if the application requires features relying on `SharedArrayBuffer` (e.g., WebAssembly multi-threading or shared memory architectures). If not required, skip this policy group.
|
|
258
|
+
|
|
259
|
+
- **Preferred path (Chromium environments)**: Enable `Document-Isolation-Policy: isolate-and-credentialless`. This provides client-side isolation comparable to COEP while instructing the browser to strip cookies and authentication credentials from non-CORS cross-origin resource fetches rather than blocking them outright. Note that this is supported primarily in Chrome (142+) and other vendors have not yet shown interest, so evaluate carefully based on your target audience. Apps that need to *block* cross-origin resources lacking explicit CORP opt-in (rather than load them with credentials stripped) can adopt `isolate-and-require-corp` instead. This is stricter and harder to deploy — it requires the same subresource audit as the cross-browser path below.
|
|
260
|
+
- **Cross-browser path (Complex enforcement)**: Require `Cross-Origin-Opener-Policy: same-origin` coupled with `Cross-Origin-Embedder-Policy: require-corp`. Every embedded subresource (images, styles, external media) MUST serve an explicit `Cross-Origin-Resource-Policy` header or the browser will prevent it from loading.
|
|
261
|
+
|
|
262
|
+
```http
|
|
263
|
+
Cross-Origin-Opener-Policy: same-origin
|
|
264
|
+
Cross-Origin-Embedder-Policy: require-corp
|
|
265
|
+
Cross-Origin-Resource-Policy: same-origin
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
#### 3.7 Fetch Metadata (Resource Isolation)
|
|
269
|
+
Server-side enforcement that uses `Sec-Fetch-*` request headers to reject suspicious cross-site requests. Requires the cross-site integration mapping from §2.1 before enforcing.
|
|
270
|
+
|
|
271
|
+
- **DO**: Implement a server-side resource isolation policy that checks `Sec-Fetch-*` headers and rejects `cross-site` requests for non-navigational endpoints.
|
|
272
|
+
- **DO**: Reject disallowed requests *before* authentication or authorization checks, so the response does not leak timing information about whether a resource or session exists.
|
|
273
|
+
- **DO**: Include `Vary: Sec-Fetch-Dest, Sec-Fetch-Mode, Sec-Fetch-Site` to prevent intermediate caches (CDNs) from serving cached responses to attackers.
|
|
274
|
+
- **CAUTION**: `same-site` trusts every subdomain under your eTLD+1. If any subdomain hosts user-generated content, a legacy app, or otherwise untrusted code, drop `same-site` from the allowlist and accept only `same-origin` and `none`.
|
|
275
|
+
- **CAUTION**: Misconfiguring these checks will block legitimate API requests coming from cross-site integrations, SSO handlers, or Webhooks. Ensure you log and test your `Sec-Fetch-*` constraints beforehand.
|
|
276
|
+
|
|
277
|
+
```javascript
|
|
278
|
+
app.use((req, res, next) => {
|
|
279
|
+
const site = req.get('Sec-Fetch-Site');
|
|
280
|
+
const mode = req.get('Sec-Fetch-Mode');
|
|
281
|
+
const dest = req.get('Sec-Fetch-Dest');
|
|
282
|
+
|
|
283
|
+
if (!site) return next(); // Fallback for legacy browsers
|
|
284
|
+
|
|
285
|
+
if (['same-origin', 'same-site', 'none'].includes(site)) return next();
|
|
286
|
+
|
|
287
|
+
// Allow standard navigate GET requests (link clicks)
|
|
288
|
+
if (site === 'cross-site' && mode === 'navigate' && req.method === 'GET' && !['object', 'embed'].includes(dest)) {
|
|
289
|
+
return next();
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
res.status(403).send('Forbidden');
|
|
293
|
+
});
|
|
294
|
+
```
|
|
295
|
+
|
|
296
|
+
### Companion policies (deploy in parallel)
|
|
297
|
+
|
|
298
|
+
These carry significantly lower breakage risk than the core enforcement track. They can be deployed alongside — or before — the CSP and isolation rollouts.
|
|
299
|
+
|
|
300
|
+
#### HTTP Strict Transport Security (HSTS)
|
|
301
|
+
- **DO**: `Strict-Transport-Security: max-age=31536000; includeSubDomains; preload` to force HTTPS.
|
|
302
|
+
- **TIP**: In production rollout, start with a short `max-age` (e.g., 300 seconds) and incrementally increase to 1 year. A misconfigured HSTS with a long max-age can render the site permanently inaccessible until the cache expires in every browser that saw it.
|
|
303
|
+
|
|
304
|
+
#### X-Content-Type-Options
|
|
305
|
+
- **DO**: Set `X-Content-Type-Options: nosniff` to block MIME-type sniffing.
|
|
306
|
+
- **DO**: Ensure the server serves correct `Content-Type` headers for all resources (`application/javascript` for scripts, `application/json` for APIs, `text/html` for documents, etc.) so the browser can strictly enforce the `nosniff` constraint.
|
|
307
|
+
|
|
308
|
+
#### Referrer Policy
|
|
309
|
+
- **DO**: Use `Referrer-Policy: strict-origin-when-cross-origin` as a safe default.
|
|
310
|
+
|
|
311
|
+
#### Permissions Policy
|
|
312
|
+
- **DO**: Disable unused browser features (camera, geolocation, microphone) for the page and iframes using Structured Fields syntax.
|
|
313
|
+
- **DO**: When delegating features to an iframe, use the `allow` attribute in HTML *in addition* to the header.
|
|
314
|
+
- **CAUTION**: Unintentionally blocking a delegated feature will cause silent failures in third-party widgets (like embedded video players or payment gateways). Audit third-party dependencies before blocking.
|
|
315
|
+
|
|
316
|
+
```http
|
|
317
|
+
Permissions-Policy: camera=(), geolocation=(), microphone=()
|
|
318
|
+
```
|
|
319
|
+
|
|
320
|
+
```html
|
|
321
|
+
<iframe src="https://trusted-video.com/player" allow="fullscreen; camera"></iframe>
|
|
322
|
+
```
|
|
323
|
+
|
|
324
|
+
#### Subresource Integrity (SRI)
|
|
325
|
+
- **DO**: Use the `integrity` attribute with a cryptographic hash (preferring `sha256` or `sha512`) when loading third-party scripts, combined with `crossorigin="anonymous"`.
|
|
326
|
+
- **DO**: Ensure the server/CDN sends an appropriate `Access-Control-Allow-Origin` header so the browser can compute the hash.
|
|
327
|
+
- **DO NOT**: Use SRI for dynamic or unversioned assets — silent updates will cause script execution to fail. SRI is strictly for immutable, versioned assets.
|
|
328
|
+
|
|
329
|
+
```html
|
|
330
|
+
<script src="https://cdn.example.com/lib.js" integrity="sha256-H8df...39v" crossorigin="anonymous"></script>
|
|
331
|
+
```
|
|
332
|
+
|
|
333
|
+
#### Cross-Origin Resource Sharing (CORS)
|
|
334
|
+
CORS is a permission grant, not a defense — it tells the browser which cross-origin reads to allow. The risk is misconfiguring it as too permissive.
|
|
335
|
+
|
|
336
|
+
- **DO**: Validate the `Origin` header on the server and set `Access-Control-Allow-Origin` dynamically to specific origins (rather than wildcard `*`).
|
|
337
|
+
- **DO NOT**: Use wildcard `*` for `Access-Control-Allow-Origin` if `Access-Control-Allow-Credentials: true` is required — the browser will reject the response.
|
|
338
|
+
- **DO**: Handle preflight (`OPTIONS`) requests by returning appropriate headers before processing data.
|
|
339
|
+
|
|
340
|
+
```http
|
|
341
|
+
Access-Control-Allow-Origin: https://trusted-app.com
|
|
342
|
+
Access-Control-Allow-Credentials: true
|
|
343
|
+
```
|
|
344
|
+
|
|
345
|
+
#### Clear-Site-Data (Logout)
|
|
346
|
+
- **DO**: Use `Clear-Site-Data` on logout endpoints to ensure complete session termination.
|
|
347
|
+
|
|
348
|
+
```http
|
|
349
|
+
Clear-Site-Data: "cookies", "storage", "cache"
|
|
350
|
+
```
|