cfsa-antigravity 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/cli.mjs +324 -0
- package/package.json +34 -0
- package/template/.agent/instructions/commands.md +48 -0
- package/template/.agent/instructions/patterns.md +61 -0
- package/template/.agent/instructions/structure.md +29 -0
- package/template/.agent/instructions/tech-stack.md +43 -0
- package/template/.agent/instructions/workflow.md +41 -0
- package/template/.agent/kit-sync.md +15 -0
- package/template/.agent/rules/boundary-not-placeholder.md +146 -0
- package/template/.agent/rules/completion-checklist.md +48 -0
- package/template/.agent/rules/decision-classification.md +103 -0
- package/template/.agent/rules/extensibility.md +47 -0
- package/template/.agent/rules/question-vs-command.md +81 -0
- package/template/.agent/rules/security-first.md +43 -0
- package/template/.agent/rules/specificity-standards.md +54 -0
- package/template/.agent/rules/tdd-contract-first.md +57 -0
- package/template/.agent/rules/vertical-slices.md +42 -0
- package/template/.agent/skill-library/MANIFEST.md +480 -0
- package/template/.agent/skill-library/README.md +38 -0
- package/template/.agent/skill-library/meta/brand-guidelines/SKILL.md +73 -0
- package/template/.agent/skill-library/meta/claude-code/README.md +9 -0
- package/template/.agent/skill-library/meta/claude-code/agent-development/SKILL.md +415 -0
- package/template/.agent/skill-library/meta/claude-code/hook-development/SKILL.md +712 -0
- package/template/.agent/skill-library/meta/claude-code/plugin-structure/SKILL.md +476 -0
- package/template/.agent/skill-library/meta/git-advanced/SKILL.md +972 -0
- package/template/.agent/skill-library/meta/mcp-builder/SKILL.md +236 -0
- package/template/.agent/skill-library/meta/product-marketing-context/SKILL.md +241 -0
- package/template/.agent/skill-library/meta/regex-patterns/SKILL.md +751 -0
- package/template/.agent/skill-library/meta/tmux-processes/SKILL.md +210 -0
- package/template/.agent/skill-library/meta/using-tmux-for-interactive-commands/SKILL.md +178 -0
- package/template/.agent/skill-library/stack/3d/threejs-pro/SKILL.md +300 -0
- package/template/.agent/skill-library/stack/ai/ai-sdk/SKILL.md +77 -0
- package/template/.agent/skill-library/stack/ai/langchain/SKILL.md +530 -0
- package/template/.agent/skill-library/stack/ai/ollama/SKILL.md +321 -0
- package/template/.agent/skill-library/stack/ai/openai-sdk/SKILL.md +549 -0
- package/template/.agent/skill-library/stack/analytics/google-analytics/SKILL.md +153 -0
- package/template/.agent/skill-library/stack/api/graphql/SKILL.md +1061 -0
- package/template/.agent/skill-library/stack/api/trpc/SKILL.md +576 -0
- package/template/.agent/skill-library/stack/auth/authjs/SKILL.md +569 -0
- package/template/.agent/skill-library/stack/auth/clerk/SKILL.md +590 -0
- package/template/.agent/skill-library/stack/auth/firebase-auth/SKILL.md +734 -0
- package/template/.agent/skill-library/stack/cms/payload-cms/SKILL.md +573 -0
- package/template/.agent/skill-library/stack/cms/shopify/SKILL.md +1193 -0
- package/template/.agent/skill-library/stack/cms/wordpress/SKILL.md +1104 -0
- package/template/.agent/skill-library/stack/css/sass-scss/SKILL.md +1121 -0
- package/template/.agent/skill-library/stack/css/tailwind-css-patterns/SKILL.md +863 -0
- package/template/.agent/skill-library/stack/css/tailwind-design-system/SKILL.md +490 -0
- package/template/.agent/skill-library/stack/css/vanilla-css/SKILL.md +1078 -0
- package/template/.agent/skill-library/stack/databases/clickhouse/SKILL.md +311 -0
- package/template/.agent/skill-library/stack/databases/influxdb/SKILL.md +280 -0
- package/template/.agent/skill-library/stack/databases/lancedb/SKILL.md +415 -0
- package/template/.agent/skill-library/stack/databases/mongodb/SKILL.md +1169 -0
- package/template/.agent/skill-library/stack/databases/neo4j/SKILL.md +839 -0
- package/template/.agent/skill-library/stack/databases/pgvector/SKILL.md +241 -0
- package/template/.agent/skill-library/stack/databases/pinecone/SKILL.md +212 -0
- package/template/.agent/skill-library/stack/databases/postgresql/SKILL.md +658 -0
- package/template/.agent/skill-library/stack/databases/qdrant/SKILL.md +312 -0
- package/template/.agent/skill-library/stack/databases/redis/SKILL.md +1079 -0
- package/template/.agent/skill-library/stack/databases/spacetimedb/SKILL.md +532 -0
- package/template/.agent/skill-library/stack/databases/sqlite/SKILL.md +1132 -0
- package/template/.agent/skill-library/stack/databases/supabase/SKILL.md +640 -0
- package/template/.agent/skill-library/stack/databases/surrealdb-expert/SKILL.md +945 -0
- package/template/.agent/skill-library/stack/databases/timescaledb/SKILL.md +745 -0
- package/template/.agent/skill-library/stack/databases/weaviate/SKILL.md +218 -0
- package/template/.agent/skill-library/stack/devops/github-actions/SKILL.md +554 -0
- package/template/.agent/skill-library/stack/devops/kubernetes/SKILL.md +950 -0
- package/template/.agent/skill-library/stack/devops/nginx/SKILL.md +841 -0
- package/template/.agent/skill-library/stack/devops/terraform/SKILL.md +860 -0
- package/template/.agent/skill-library/stack/email/resend/SKILL.md +391 -0
- package/template/.agent/skill-library/stack/engines/godot/SKILL.md +488 -0
- package/template/.agent/skill-library/stack/extensions/chrome-extension/SKILL.md +375 -0
- package/template/.agent/skill-library/stack/extensions/vscode-extension/SKILL.md +453 -0
- package/template/.agent/skill-library/stack/frameworks/astro-framework/SKILL.md +162 -0
- package/template/.agent/skill-library/stack/frameworks/electron/SKILL.md +1286 -0
- package/template/.agent/skill-library/stack/frameworks/fastapi/SKILL.md +650 -0
- package/template/.agent/skill-library/stack/frameworks/hono/SKILL.md +90 -0
- package/template/.agent/skill-library/stack/frameworks/nestjs/SKILL.md +878 -0
- package/template/.agent/skill-library/stack/frameworks/nextjs/SKILL.md +635 -0
- package/template/.agent/skill-library/stack/frameworks/nuxt/SKILL.md +564 -0
- package/template/.agent/skill-library/stack/frameworks/sveltekit/SKILL.md +614 -0
- package/template/.agent/skill-library/stack/frameworks/tauri/SKILL.md +920 -0
- package/template/.agent/skill-library/stack/gamedev/godot/SKILL.md +1032 -0
- package/template/.agent/skill-library/stack/gamedev/unity/SKILL.md +1175 -0
- package/template/.agent/skill-library/stack/hosting/aws/SKILL.md +467 -0
- package/template/.agent/skill-library/stack/hosting/cloudflare/SKILL.md +201 -0
- package/template/.agent/skill-library/stack/hosting/docker-expert/SKILL.md +409 -0
- package/template/.agent/skill-library/stack/hosting/vercel/SKILL.md +484 -0
- package/template/.agent/skill-library/stack/languages/bash-scripting/SKILL.md +773 -0
- package/template/.agent/skill-library/stack/languages/c-cpp/SKILL.md +712 -0
- package/template/.agent/skill-library/stack/languages/gdscript/SKILL.md +789 -0
- package/template/.agent/skill-library/stack/languages/go/SKILL.md +664 -0
- package/template/.agent/skill-library/stack/languages/java/SKILL.md +778 -0
- package/template/.agent/skill-library/stack/languages/kotlin/SKILL.md +665 -0
- package/template/.agent/skill-library/stack/languages/python/SKILL.md +678 -0
- package/template/.agent/skill-library/stack/languages/rust/SKILL.md +673 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/SKILL.md +141 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/advanced-generics.md +90 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/branded-types.md +57 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/builder-pattern.md +71 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/common-pitfalls.md +135 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/conditional-types.md +27 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/decorators.md +98 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/discriminated-unions.md +62 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/mapped-types.md +53 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/performance-best-practices.md +104 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/template-literal-types.md +49 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/testing-types.md +112 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/type-guards.md +70 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/type-inference.md +101 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/utility-types.md +98 -0
- package/template/.agent/skill-library/stack/languages/vanilla-javascript/SKILL.md +803 -0
- package/template/.agent/skill-library/stack/messaging/kafka/SKILL.md +235 -0
- package/template/.agent/skill-library/stack/mobile/expo-react-native/SKILL.md +665 -0
- package/template/.agent/skill-library/stack/mobile/flutter/SKILL.md +316 -0
- package/template/.agent/skill-library/stack/mobile/react-native/SKILL.md +337 -0
- package/template/.agent/skill-library/stack/monitoring/posthog/SKILL.md +396 -0
- package/template/.agent/skill-library/stack/monitoring/sentry/SKILL.md +509 -0
- package/template/.agent/skill-library/stack/observability/datadog/SKILL.md +179 -0
- package/template/.agent/skill-library/stack/observability/distributed-tracing/SKILL.md +140 -0
- package/template/.agent/skill-library/stack/observability/logging-best-practices/SKILL.md +168 -0
- package/template/.agent/skill-library/stack/observability/opentelemetry/SKILL.md +164 -0
- package/template/.agent/skill-library/stack/observability/prometheus-grafana/SKILL.md +246 -0
- package/template/.agent/skill-library/stack/observability/python-observability/SKILL.md +158 -0
- package/template/.agent/skill-library/stack/orm/drizzle-orm/SKILL.md +613 -0
- package/template/.agent/skill-library/stack/orm/prisma/SKILL.md +744 -0
- package/template/.agent/skill-library/stack/payments/lemonsqueezy/SKILL.md +393 -0
- package/template/.agent/skill-library/stack/payments/stripe-integration/SKILL.md +457 -0
- package/template/.agent/skill-library/stack/queue/bullmq/SKILL.md +385 -0
- package/template/.agent/skill-library/stack/queue/inngest/SKILL.md +438 -0
- package/template/.agent/skill-library/stack/realtime/socketio/SKILL.md +595 -0
- package/template/.agent/skill-library/stack/search/elasticsearch/SKILL.md +248 -0
- package/template/.agent/skill-library/stack/search/meilisearch/SKILL.md +385 -0
- package/template/.agent/skill-library/stack/security/crypto-patterns/SKILL.md +437 -0
- package/template/.agent/skill-library/stack/security/csp-cors-headers/SKILL.md +588 -0
- package/template/.agent/skill-library/stack/security/dependency-auditing/SKILL.md +560 -0
- package/template/.agent/skill-library/stack/security/input-sanitization/SKILL.md +430 -0
- package/template/.agent/skill-library/stack/security/owasp-web-security/SKILL.md +421 -0
- package/template/.agent/skill-library/stack/state/tanstack-query/SKILL.md +637 -0
- package/template/.agent/skill-library/stack/state/zustand/SKILL.md +483 -0
- package/template/.agent/skill-library/stack/storage/aws-s3/SKILL.md +415 -0
- package/template/.agent/skill-library/stack/testing/playwright/SKILL.md +641 -0
- package/template/.agent/skill-library/stack/testing/storybook/SKILL.md +923 -0
- package/template/.agent/skill-library/stack/testing/testing-library/SKILL.md +872 -0
- package/template/.agent/skill-library/stack/testing/vitest/SKILL.md +714 -0
- package/template/.agent/skill-library/stack/ui/react-best-practices/SKILL.md +877 -0
- package/template/.agent/skill-library/stack/ui/react-composition-patterns/SKILL.md +1107 -0
- package/template/.agent/skill-library/stack/ui/react-flow/SKILL.md +425 -0
- package/template/.agent/skill-library/stack/ui/shadcn-ui/SKILL.md +703 -0
- package/template/.agent/skill-library/surface/api/api-caching/SKILL.md +458 -0
- package/template/.agent/skill-library/surface/api/api-documentation-openapi/SKILL.md +697 -0
- package/template/.agent/skill-library/surface/api/api-error-handling/SKILL.md +478 -0
- package/template/.agent/skill-library/surface/api/api-security-checklist/SKILL.md +147 -0
- package/template/.agent/skill-library/surface/api/api-versioning/SKILL.md +420 -0
- package/template/.agent/skill-library/surface/api/email-best-practices/SKILL.md +59 -0
- package/template/.agent/skill-library/surface/api/rate-limiting-abuse-protection/SKILL.md +147 -0
- package/template/.agent/skill-library/surface/api/rest-api-design/SKILL.md +478 -0
- package/template/.agent/skill-library/surface/api/webhook-design/SKILL.md +752 -0
- package/template/.agent/skill-library/surface/cli/cli-configuration-management/SKILL.md +445 -0
- package/template/.agent/skill-library/surface/cli/cli-error-diagnostics/SKILL.md +515 -0
- package/template/.agent/skill-library/surface/cli/cli-shell-integration/SKILL.md +479 -0
- package/template/.agent/skill-library/surface/cli/cli-ux-design/SKILL.md +477 -0
- package/template/.agent/skill-library/surface/desktop/desktop-app-distribution/SKILL.md +416 -0
- package/template/.agent/skill-library/surface/desktop/desktop-security-sandboxing/SKILL.md +407 -0
- package/template/.agent/skill-library/surface/desktop/desktop-ux-conventions/SKILL.md +361 -0
- package/template/.agent/skill-library/surface/desktop/native-os-integration/SKILL.md +563 -0
- package/template/.agent/skill-library/surface/extension/browser-extension-patterns/SKILL.md +482 -0
- package/template/.agent/skill-library/surface/extension/plugin-architecture-design/SKILL.md +632 -0
- package/template/.agent/skill-library/surface/extension/vscode-extension-development/SKILL.md +728 -0
- package/template/.agent/skill-library/surface/mobile/app-store-submission/SKILL.md +304 -0
- package/template/.agent/skill-library/surface/mobile/mobile-offline-sync/SKILL.md +443 -0
- package/template/.agent/skill-library/surface/mobile/mobile-responsive-patterns/SKILL.md +432 -0
- package/template/.agent/skill-library/surface/mobile/push-notifications/SKILL.md +495 -0
- package/template/.agent/skill-library/surface/web/accessibility-compliance/SKILL.md +827 -0
- package/template/.agent/skill-library/surface/web/ai-seo/SKILL.md +398 -0
- package/template/.agent/skill-library/surface/web/ai-seo/references/content-patterns.md +285 -0
- package/template/.agent/skill-library/surface/web/ai-seo/references/platform-ranking-factors.md +152 -0
- package/template/.agent/skill-library/surface/web/analytics-tracking/SKILL.md +309 -0
- package/template/.agent/skill-library/surface/web/analytics-tracking/references/event-library.md +260 -0
- package/template/.agent/skill-library/surface/web/analytics-tracking/references/ga4-implementation.md +300 -0
- package/template/.agent/skill-library/surface/web/analytics-tracking/references/gtm-implementation.md +390 -0
- package/template/.agent/skill-library/surface/web/authentication-ui-flows/SKILL.md +530 -0
- package/template/.agent/skill-library/surface/web/dark-mode-theming/SKILL.md +516 -0
- package/template/.agent/skill-library/surface/web/design-reference-data/SKILL.md +105 -0
- package/template/.agent/skill-library/surface/web/design-reference-data/data/charts.csv +26 -0
- package/template/.agent/skill-library/surface/web/design-reference-data/data/colors.csv +97 -0
- package/template/.agent/skill-library/surface/web/design-reference-data/data/landing.csv +31 -0
- package/template/.agent/skill-library/surface/web/design-reference-data/data/styles.csv +59 -0
- package/template/.agent/skill-library/surface/web/design-reference-data/data/typography.csv +58 -0
- package/template/.agent/skill-library/surface/web/design-reference-data/data/ux-guidelines.csv +100 -0
- package/template/.agent/skill-library/surface/web/design-reference-data/scripts/core.py +258 -0
- package/template/.agent/skill-library/surface/web/design-reference-data/scripts/design_system.py +1067 -0
- package/template/.agent/skill-library/surface/web/design-reference-data/scripts/search.py +106 -0
- package/template/.agent/skill-library/surface/web/form-handling-validation/SKILL.md +675 -0
- package/template/.agent/skill-library/surface/web/frontend-design/SKILL.md +1393 -0
- package/template/.agent/skill-library/surface/web/frontend-design/templates/cppn-hero.tsx +299 -0
- package/template/.agent/skill-library/surface/web/frontend-design/templates/wave-hero.tsx +875 -0
- package/template/.agent/skill-library/surface/web/frontend-verification/SKILL.md +111 -0
- package/template/.agent/skill-library/surface/web/frontend-verification/scripts/ux_audit.py +739 -0
- package/template/.agent/skill-library/surface/web/i18n-localization/SKILL.md +154 -0
- package/template/.agent/skill-library/surface/web/offline-first-pwa/SKILL.md +657 -0
- package/template/.agent/skill-library/surface/web/page-cro/SKILL.md +182 -0
- package/template/.agent/skill-library/surface/web/page-cro/references/experiments.md +248 -0
- package/template/.agent/skill-library/surface/web/programmatic-seo/SKILL.md +238 -0
- package/template/.agent/skill-library/surface/web/programmatic-seo/references/playbooks.md +308 -0
- package/template/.agent/skill-library/surface/web/schema-markup/SKILL.md +179 -0
- package/template/.agent/skill-library/surface/web/schema-markup/references/schema-examples.md +398 -0
- package/template/.agent/skill-library/surface/web/seo-audit/SKILL.md +394 -0
- package/template/.agent/skill-library/surface/web/seo-audit/references/ai-writing-detection.md +200 -0
- package/template/.agent/skill-library/surface/web/web-performance-optimization/SKILL.md +646 -0
- package/template/.agent/skill-library/surface/web/web-scraping/SKILL.md +58 -0
- package/template/.agent/skills/accessibility/SKILL.md +522 -0
- package/template/.agent/skills/accessibility/references/WCAG.md +162 -0
- package/template/.agent/skills/adversarial-review/SKILL.md +90 -0
- package/template/.agent/skills/antigravity-workflows/SKILL.md +81 -0
- package/template/.agent/skills/antigravity-workflows/resources/implementation-playbook.md +36 -0
- package/template/.agent/skills/api-design-principles/SKILL.md +37 -0
- package/template/.agent/skills/api-design-principles/assets/api-design-checklist.md +155 -0
- package/template/.agent/skills/api-design-principles/assets/rest-api-template.py +182 -0
- package/template/.agent/skills/api-design-principles/references/graphql-schema-design.md +583 -0
- package/template/.agent/skills/api-design-principles/references/rest-best-practices.md +408 -0
- package/template/.agent/skills/api-design-principles/resources/implementation-playbook.md +513 -0
- package/template/.agent/skills/api-versioning/SKILL.md +420 -0
- package/template/.agent/skills/architecture-mapping/SKILL.md +219 -0
- package/template/.agent/skills/bootstrap-agents/SKILL.md +259 -0
- package/template/.agent/skills/brainstorming/SKILL.md +236 -0
- package/template/.agent/skills/brand-guidelines/SKILL.md +44 -0
- package/template/.agent/skills/clean-code/SKILL.md +94 -0
- package/template/.agent/skills/code-review-pro/SKILL.md +152 -0
- package/template/.agent/skills/concise-planning/SKILL.md +68 -0
- package/template/.agent/skills/cross-layer-consistency/SKILL.md +117 -0
- package/template/.agent/skills/database-schema-design/SKILL.md +429 -0
- package/template/.agent/skills/deployment-procedures/SKILL.md +241 -0
- package/template/.agent/skills/design-anti-cliche/SKILL.md +159 -0
- package/template/.agent/skills/design-direction/SKILL.md +45 -0
- package/template/.agent/skills/error-handling-patterns/SKILL.md +721 -0
- package/template/.agent/skills/find-skills/SKILL.md +145 -0
- package/template/.agent/skills/git-advanced/SKILL.md +972 -0
- package/template/.agent/skills/git-workflow/SKILL.md +420 -0
- package/template/.agent/skills/idea-extraction/SKILL.md +271 -0
- package/template/.agent/skills/logging-best-practices/SKILL.md +851 -0
- package/template/.agent/skills/migration-management/SKILL.md +384 -0
- package/template/.agent/skills/minimalist-surgical-development/SKILL.md +69 -0
- package/template/.agent/skills/parallel-agents/SKILL.md +165 -0
- package/template/.agent/skills/parallel-debugging/SKILL.md +135 -0
- package/template/.agent/skills/parallel-feature-development/SKILL.md +166 -0
- package/template/.agent/skills/performance-budgeting/SKILL.md +144 -0
- package/template/.agent/skills/pipeline-rubrics/SKILL.md +51 -0
- package/template/.agent/skills/pipeline-rubrics/references/architecture-rubric.md +19 -0
- package/template/.agent/skills/pipeline-rubrics/references/be-rubric.md +21 -0
- package/template/.agent/skills/pipeline-rubrics/references/fe-rubric.md +20 -0
- package/template/.agent/skills/pipeline-rubrics/references/ia-rubric.md +19 -0
- package/template/.agent/skills/pipeline-rubrics/references/scoring.md +28 -0
- package/template/.agent/skills/pipeline-rubrics/references/vision-rubric.md +11 -0
- package/template/.agent/skills/prd-templates/SKILL.md +88 -0
- package/template/.agent/skills/prd-templates/references/architecture-design-template.md +88 -0
- package/template/.agent/skills/prd-templates/references/be-spec-template.md +101 -0
- package/template/.agent/skills/prd-templates/references/data-placement-template.md +74 -0
- package/template/.agent/skills/prd-templates/references/decomposition-templates.md +211 -0
- package/template/.agent/skills/prd-templates/references/design-system-decisions.md +198 -0
- package/template/.agent/skills/prd-templates/references/engineering-standards-template.md +124 -0
- package/template/.agent/skills/prd-templates/references/fe-classification-procedures.md +47 -0
- package/template/.agent/skills/prd-templates/references/fe-spec-template.md +84 -0
- package/template/.agent/skills/prd-templates/references/infrastructure-report-template.md +71 -0
- package/template/.agent/skills/prd-templates/references/operational-templates.md +116 -0
- package/template/.agent/skills/prd-templates/references/placeholder-guard-template.md +21 -0
- package/template/.agent/skills/prd-templates/references/surface-model.md +61 -0
- package/template/.agent/skills/prd-templates/references/vision-template.md +66 -0
- package/template/.agent/skills/prompt-engineer/README.md +659 -0
- package/template/.agent/skills/prompt-engineer/SKILL.md +249 -0
- package/template/.agent/skills/regex-patterns/SKILL.md +751 -0
- package/template/.agent/skills/resolve-ambiguity/SKILL.md +278 -0
- package/template/.agent/skills/rest-api-design/SKILL.md +478 -0
- package/template/.agent/skills/security-scanning-security-hardening/SKILL.md +231 -0
- package/template/.agent/skills/session-continuity/SKILL.md +730 -0
- package/template/.agent/skills/session-continuity/protocols/01-session-resumption.md +38 -0
- package/template/.agent/skills/session-continuity/protocols/02-progress-generation.md +85 -0
- package/template/.agent/skills/session-continuity/protocols/03-progress-update.md +70 -0
- package/template/.agent/skills/session-continuity/protocols/04-pattern-extraction.md +60 -0
- package/template/.agent/skills/session-continuity/protocols/05-session-close.md +37 -0
- package/template/.agent/skills/session-continuity/protocols/06-decision-analysis.md +84 -0
- package/template/.agent/skills/session-continuity/protocols/07-spec-pipeline-generation.md +48 -0
- package/template/.agent/skills/session-continuity/protocols/08-spec-pipeline-update.md +43 -0
- package/template/.agent/skills/session-continuity/protocols/09-parallel-claim.md +122 -0
- package/template/.agent/skills/session-continuity/protocols/10-placeholder-verification-gate.md +104 -0
- package/template/.agent/skills/session-continuity/protocols/ambiguity-gates.md +48 -0
- package/template/.agent/skills/skill-creator/LICENSE.txt +202 -0
- package/template/.agent/skills/skill-creator/README.md +270 -0
- package/template/.agent/skills/skill-creator/SKILL.md +590 -0
- package/template/.agent/skills/skill-creator/references/output-patterns.md +82 -0
- package/template/.agent/skills/skill-creator/references/workflows.md +28 -0
- package/template/.agent/skills/skill-creator/scripts/init_skill.py +303 -0
- package/template/.agent/skills/skill-creator/scripts/package_skill.py +110 -0
- package/template/.agent/skills/skill-creator/scripts/quick_validate.py +95 -0
- package/template/.agent/skills/spec-writing/SKILL.md +110 -0
- package/template/.agent/skills/systematic-debugging/CREATION-LOG.md +119 -0
- package/template/.agent/skills/systematic-debugging/SKILL.md +297 -0
- package/template/.agent/skills/systematic-debugging/condition-based-waiting-example.ts +158 -0
- package/template/.agent/skills/systematic-debugging/condition-based-waiting.md +115 -0
- package/template/.agent/skills/systematic-debugging/defense-in-depth.md +122 -0
- package/template/.agent/skills/systematic-debugging/find-polluter.sh +63 -0
- package/template/.agent/skills/systematic-debugging/root-cause-tracing.md +169 -0
- package/template/.agent/skills/systematic-debugging/test-academic.md +14 -0
- package/template/.agent/skills/systematic-debugging/test-pressure-1.md +58 -0
- package/template/.agent/skills/systematic-debugging/test-pressure-2.md +68 -0
- package/template/.agent/skills/systematic-debugging/test-pressure-3.md +69 -0
- package/template/.agent/skills/tdd-workflow/SKILL.md +409 -0
- package/template/.agent/skills/tech-stack-catalog/SKILL.md +49 -0
- package/template/.agent/skills/tech-stack-catalog/references/constraint-questions.md +21 -0
- package/template/.agent/skills/tech-stack-catalog/references/dev-tooling-decisions.md +37 -0
- package/template/.agent/skills/tech-stack-catalog/references/surface-decision-tables.md +69 -0
- package/template/.agent/skills/technical-writer/SKILL.md +242 -0
- package/template/.agent/skills/testing-strategist/SKILL.md +932 -0
- package/template/.agent/skills/verification-before-completion/SKILL.md +145 -0
- package/template/.agent/skills/workflow-automation/SKILL.md +73 -0
- package/template/.agent/workflows/audit-ambiguity-execute.md +165 -0
- package/template/.agent/workflows/audit-ambiguity-rubrics.md +83 -0
- package/template/.agent/workflows/audit-ambiguity.md +64 -0
- package/template/.agent/workflows/bootstrap-agents-fill.md +201 -0
- package/template/.agent/workflows/bootstrap-agents-provision.md +197 -0
- package/template/.agent/workflows/bootstrap-agents.md +66 -0
- package/template/.agent/workflows/create-prd-architecture.md +119 -0
- package/template/.agent/workflows/create-prd-compile.md +138 -0
- package/template/.agent/workflows/create-prd-design-system.md +135 -0
- package/template/.agent/workflows/create-prd-security.md +113 -0
- package/template/.agent/workflows/create-prd-stack.md +91 -0
- package/template/.agent/workflows/create-prd.md +168 -0
- package/template/.agent/workflows/decompose-architecture-structure.md +82 -0
- package/template/.agent/workflows/decompose-architecture-validate.md +119 -0
- package/template/.agent/workflows/decompose-architecture.md +111 -0
- package/template/.agent/workflows/evolve-contract.md +98 -0
- package/template/.agent/workflows/evolve-feature-cascade.md +140 -0
- package/template/.agent/workflows/evolve-feature-classify.md +116 -0
- package/template/.agent/workflows/evolve-feature.md +56 -0
- package/template/.agent/workflows/ideate-discover.md +144 -0
- package/template/.agent/workflows/ideate-extract.md +129 -0
- package/template/.agent/workflows/ideate-validate.md +117 -0
- package/template/.agent/workflows/ideate.md +113 -0
- package/template/.agent/workflows/implement-slice-setup.md +113 -0
- package/template/.agent/workflows/implement-slice-tdd.md +198 -0
- package/template/.agent/workflows/implement-slice.md +50 -0
- package/template/.agent/workflows/plan-phase.md +202 -0
- package/template/.agent/workflows/propagate-decision-apply.md +135 -0
- package/template/.agent/workflows/propagate-decision-scan.md +147 -0
- package/template/.agent/workflows/propagate-decision.md +56 -0
- package/template/.agent/workflows/remediate-pipeline-assess.md +138 -0
- package/template/.agent/workflows/remediate-pipeline-execute.md +135 -0
- package/template/.agent/workflows/remediate-pipeline.md +55 -0
- package/template/.agent/workflows/resolve-ambiguity.md +82 -0
- package/template/.agent/workflows/sync-kit.md +209 -0
- package/template/.agent/workflows/update-architecture-map.md +74 -0
- package/template/.agent/workflows/validate-phase.md +219 -0
- package/template/.agent/workflows/verify-infrastructure.md +207 -0
- package/template/.agent/workflows/write-architecture-spec-deepen.md +139 -0
- package/template/.agent/workflows/write-architecture-spec-design.md +202 -0
- package/template/.agent/workflows/write-architecture-spec.md +63 -0
- package/template/.agent/workflows/write-be-spec-classify.md +165 -0
- package/template/.agent/workflows/write-be-spec-write.md +98 -0
- package/template/.agent/workflows/write-be-spec.md +76 -0
- package/template/.agent/workflows/write-fe-spec-classify.md +170 -0
- package/template/.agent/workflows/write-fe-spec-write.md +94 -0
- package/template/.agent/workflows/write-fe-spec.md +71 -0
- package/template/AGENTS.md +176 -0
- package/template/GEMINI.md +177 -0
- package/template/docs/README.md +187 -0
- package/template/docs/audits/.gitkeep +0 -0
- package/template/docs/audits/README.md +10 -0
- package/template/docs/plans/.gitkeep +0 -0
- package/template/docs/plans/README.md +21 -0
- package/template/docs/plans/be/.gitkeep +0 -0
- package/template/docs/plans/be/README.md +11 -0
- package/template/docs/plans/fe/.gitkeep +0 -0
- package/template/docs/plans/fe/README.md +11 -0
- package/template/docs/plans/ia/.gitkeep +0 -0
- package/template/docs/plans/ia/README.md +17 -0
- package/template/docs/plans/ia/deep-dives/.gitkeep +0 -0
- package/template/docs/plans/ia/deep-dives/README.md +5 -0
- package/template/docs/plans/phases/.gitkeep +0 -0
- package/template/docs/plans/phases/README.md +11 -0
|
@@ -0,0 +1,421 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: owasp-web-security
|
|
3
|
+
description: "OWASP Top 10 (2021) deep dive with vulnerability patterns, exploitation examples, and production fixes across JS/TS, Python, and Go. Use when building web applications, reviewing code for security flaws, or hardening existing systems against injection, broken auth, XSS, and access control attacks."
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# OWASP Top 10 Web Security (2021)
|
|
8
|
+
|
|
9
|
+
**Status**: Production Ready
|
|
10
|
+
**Last Updated**: 2026-02-17
|
|
11
|
+
**Dependencies**: None (standalone skill)
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## Use This Skill When
|
|
16
|
+
|
|
17
|
+
- Building or reviewing web application security
|
|
18
|
+
- Auditing code for OWASP Top 10 vulnerabilities
|
|
19
|
+
- Implementing security controls for production systems
|
|
20
|
+
- Performing threat modeling against common attack vectors
|
|
21
|
+
|
|
22
|
+
## Do Not Use This Skill When
|
|
23
|
+
|
|
24
|
+
- You need infrastructure-level security (use cloud-hardening skills instead)
|
|
25
|
+
- You need cryptographic implementation guidance (use crypto-patterns skill)
|
|
26
|
+
- You need CSP/CORS header configuration (use csp-cors-headers skill)
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## A01:2021 -- Broken Access Control
|
|
31
|
+
|
|
32
|
+
Occurs when users can act outside their intended permissions.
|
|
33
|
+
|
|
34
|
+
```typescript
|
|
35
|
+
// VULNERABLE: No authorization check
|
|
36
|
+
app.get("/api/users/:id/profile", async (req, res) => {
|
|
37
|
+
const profile = await db.query("SELECT * FROM users WHERE id = $1", [req.params.id]);
|
|
38
|
+
res.json(profile);
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
// SECURE: Verify the authenticated user owns the resource
|
|
42
|
+
app.get("/api/users/:id/profile", requireAuth, async (req, res) => {
|
|
43
|
+
if (req.params.id !== req.user.id && !req.user.roles.includes("admin")) {
|
|
44
|
+
return res.status(403).json({ error: "Forbidden" });
|
|
45
|
+
}
|
|
46
|
+
const profile = await db.query("SELECT * FROM users WHERE id = $1", [req.params.id]);
|
|
47
|
+
if (!profile) return res.status(404).json({ error: "Not found" });
|
|
48
|
+
res.json(profile);
|
|
49
|
+
});
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
```python
|
|
53
|
+
# SECURE: Ownership verification in Python
|
|
54
|
+
@app.route("/api/documents/<doc_id>")
|
|
55
|
+
@login_required
|
|
56
|
+
def get_document(doc_id):
|
|
57
|
+
doc = Document.query.get_or_404(doc_id)
|
|
58
|
+
if doc.owner_id != current_user.id and not current_user.is_admin:
|
|
59
|
+
abort(403)
|
|
60
|
+
return jsonify(doc.to_dict())
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
**Key controls**: Deny by default, enforce ownership checks on every data access,
|
|
64
|
+
log access control failures, disable directory listing.
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
## A02:2021 -- Cryptographic Failures
|
|
69
|
+
|
|
70
|
+
Sensitive data exposed through weak or missing cryptography.
|
|
71
|
+
|
|
72
|
+
```typescript
|
|
73
|
+
// VULNERABLE: Plaintext password storage
|
|
74
|
+
await db.query("INSERT INTO users (email, password) VALUES ($1, $2)", [email, password]);
|
|
75
|
+
|
|
76
|
+
// SECURE: Hash with bcrypt (cost factor 12+)
|
|
77
|
+
import bcrypt from "bcrypt";
|
|
78
|
+
const hashedPassword = await bcrypt.hash(password, 12);
|
|
79
|
+
await db.query("INSERT INTO users (email, password_hash) VALUES ($1, $2)", [email, hashedPassword]);
|
|
80
|
+
const isValid = await bcrypt.compare(submittedPassword, storedHash);
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
**Key controls**: Never store plaintext passwords, enforce HTTPS everywhere,
|
|
84
|
+
classify data by sensitivity, disable caching for sensitive responses,
|
|
85
|
+
never use MD5/SHA1/DES/RC4. See crypto-patterns skill for details.
|
|
86
|
+
|
|
87
|
+
---
|
|
88
|
+
|
|
89
|
+
## A03:2021 -- Injection
|
|
90
|
+
|
|
91
|
+
Untrusted data sent to an interpreter as part of a command or query.
|
|
92
|
+
|
|
93
|
+
### SQL Injection
|
|
94
|
+
|
|
95
|
+
```typescript
|
|
96
|
+
// VULNERABLE: String concatenation
|
|
97
|
+
const query = `SELECT * FROM products WHERE name = '${req.query.name}'`;
|
|
98
|
+
|
|
99
|
+
// SECURE: Parameterized queries
|
|
100
|
+
const results = await db.query("SELECT * FROM products WHERE name = $1", [req.query.name]);
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
### NoSQL Injection
|
|
104
|
+
|
|
105
|
+
```typescript
|
|
106
|
+
// VULNERABLE: Direct user input in MongoDB (attacker sends { "$ne": "" })
|
|
107
|
+
const user = await db.collection("users").findOne({
|
|
108
|
+
username: req.body.username,
|
|
109
|
+
password: req.body.password,
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
// SECURE: Validate input types with Zod
|
|
113
|
+
const LoginSchema = z.object({
|
|
114
|
+
username: z.string().min(1).max(100),
|
|
115
|
+
password: z.string().min(8).max(128),
|
|
116
|
+
});
|
|
117
|
+
const parsed = LoginSchema.safeParse(req.body);
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
### Command Injection
|
|
121
|
+
|
|
122
|
+
```python
|
|
123
|
+
# VULNERABLE: Shell command with user input
|
|
124
|
+
os.system(f"ping -c 4 {hostname}") # hostname = "; rm -rf /"
|
|
125
|
+
|
|
126
|
+
# SECURE: subprocess with argument list (no shell)
|
|
127
|
+
import subprocess, re
|
|
128
|
+
def ping_host(hostname):
|
|
129
|
+
if not re.match(r"^[a-zA-Z0-9._-]+$", hostname):
|
|
130
|
+
raise ValueError("Invalid hostname")
|
|
131
|
+
return subprocess.run(["ping", "-c", "4", hostname], capture_output=True, timeout=30)
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
```go
|
|
135
|
+
// SECURE: exec.CommandContext with separate arguments in Go
|
|
136
|
+
func PingHost(hostname string) (string, error) {
|
|
137
|
+
matched, _ := regexp.MatchString(`^[a-zA-Z0-9._-]+$`, hostname)
|
|
138
|
+
if !matched {
|
|
139
|
+
return "", fmt.Errorf("invalid hostname")
|
|
140
|
+
}
|
|
141
|
+
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
|
|
142
|
+
defer cancel()
|
|
143
|
+
cmd := exec.CommandContext(ctx, "ping", "-c", "4", hostname)
|
|
144
|
+
output, err := cmd.Output()
|
|
145
|
+
return string(output), err
|
|
146
|
+
}
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
### LDAP Injection
|
|
150
|
+
|
|
151
|
+
```typescript
|
|
152
|
+
// SECURE: Escape LDAP special characters
|
|
153
|
+
function escapeLDAP(input: string): string {
|
|
154
|
+
return input.replace(/\\/g, "\\5c").replace(/\*/g, "\\2a")
|
|
155
|
+
.replace(/\(/g, "\\28").replace(/\)/g, "\\29").replace(/\0/g, "\\00");
|
|
156
|
+
}
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
---
|
|
160
|
+
|
|
161
|
+
## A04:2021 -- Insecure Design
|
|
162
|
+
|
|
163
|
+
Flaws in design patterns that cannot be fixed by implementation alone.
|
|
164
|
+
|
|
165
|
+
```typescript
|
|
166
|
+
// SECURE: Rate limiting at the design level
|
|
167
|
+
import rateLimit from "express-rate-limit";
|
|
168
|
+
const loginLimiter = rateLimit({
|
|
169
|
+
windowMs: 15 * 60 * 1000,
|
|
170
|
+
max: 5,
|
|
171
|
+
message: { error: "Too many login attempts. Try again in 15 minutes." },
|
|
172
|
+
keyGenerator: (req) => req.body.email || req.ip,
|
|
173
|
+
});
|
|
174
|
+
app.post("/api/login", loginLimiter, loginHandler);
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
**Key controls**: Use threat modeling (STRIDE, PASTA), limit resource consumption
|
|
178
|
+
per user, separate tenant data, test abuse cases.
|
|
179
|
+
|
|
180
|
+
---
|
|
181
|
+
|
|
182
|
+
## A05:2021 -- Security Misconfiguration
|
|
183
|
+
|
|
184
|
+
```typescript
|
|
185
|
+
// VULNERABLE: Stack traces exposed to users
|
|
186
|
+
app.use((err, req, res, next) => {
|
|
187
|
+
res.status(500).json({ error: err.message, stack: err.stack });
|
|
188
|
+
});
|
|
189
|
+
|
|
190
|
+
// SECURE: Generic error response in production
|
|
191
|
+
app.use((err, req, res, next) => {
|
|
192
|
+
const errorId = crypto.randomUUID();
|
|
193
|
+
logger.error({ errorId, err, path: req.path });
|
|
194
|
+
res.status(500).json({ error: "Internal server error", errorId });
|
|
195
|
+
});
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
**Key controls**: Remove default accounts, disable unnecessary HTTP methods,
|
|
199
|
+
remove server version headers, review cloud storage permissions, automate
|
|
200
|
+
configuration hardening in CI/CD.
|
|
201
|
+
|
|
202
|
+
---
|
|
203
|
+
|
|
204
|
+
## A06:2021 -- Vulnerable and Outdated Components
|
|
205
|
+
|
|
206
|
+
```bash
|
|
207
|
+
npm audit # Check for known vulnerabilities
|
|
208
|
+
npm audit fix # Auto-fix where possible
|
|
209
|
+
npm ci # Use in CI -- respects lockfile exactly
|
|
210
|
+
npm install express@4.21.0 --save-exact # Pin versions
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
See the dependency-auditing skill for comprehensive guidance.
|
|
214
|
+
|
|
215
|
+
---
|
|
216
|
+
|
|
217
|
+
## A07:2021 -- Identification and Authentication Failures
|
|
218
|
+
|
|
219
|
+
```typescript
|
|
220
|
+
// SECURE: Strong authentication with multiple protections
|
|
221
|
+
const LoginSchema = z.object({
|
|
222
|
+
email: z.string().email().max(255),
|
|
223
|
+
password: z.string().min(8).max(128),
|
|
224
|
+
});
|
|
225
|
+
|
|
226
|
+
app.post("/api/login", loginLimiter, async (req, res) => {
|
|
227
|
+
const parsed = LoginSchema.safeParse(req.body);
|
|
228
|
+
if (!parsed.success) return res.status(400).json({ error: "Invalid input" });
|
|
229
|
+
|
|
230
|
+
const user = await findUser(parsed.data.email);
|
|
231
|
+
// Constant-time comparison even when user not found
|
|
232
|
+
const storedHash = user?.passwordHash || "$2b$12$invalidhashplaceholdervalue";
|
|
233
|
+
const isValid = await bcrypt.compare(parsed.data.password, storedHash);
|
|
234
|
+
|
|
235
|
+
if (!user || !isValid) {
|
|
236
|
+
return res.status(401).json({ error: "Invalid credentials" }); // Same message always
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
req.session.regenerate((err) => {
|
|
240
|
+
if (err) return res.status(500).json({ error: "Session error" });
|
|
241
|
+
req.session.userId = user.id;
|
|
242
|
+
res.json({ success: true });
|
|
243
|
+
});
|
|
244
|
+
});
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
**Key controls**: MFA for sensitive operations, no default credentials, account lockout,
|
|
248
|
+
secure session IDs (128+ bits entropy), invalidate sessions on logout/password change,
|
|
249
|
+
identical error messages for invalid username vs password.
|
|
250
|
+
|
|
251
|
+
---
|
|
252
|
+
|
|
253
|
+
## A08:2021 -- Software and Data Integrity Failures
|
|
254
|
+
|
|
255
|
+
```html
|
|
256
|
+
<!-- VULNERABLE: No integrity check -->
|
|
257
|
+
<script src="https://cdn.example.com/library.js"></script>
|
|
258
|
+
|
|
259
|
+
<!-- SECURE: Subresource Integrity (SRI) -->
|
|
260
|
+
<script src="https://cdn.example.com/library.js"
|
|
261
|
+
integrity="sha384-oqVuAfXRKap7fdgcCY5uykM6+R9GqQ8K/uxy9rx7HNQlGYl1kPzQho1wx4JwY8wC"
|
|
262
|
+
crossorigin="anonymous"></script>
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
```typescript
|
|
266
|
+
// SECURE: Verify webhook signatures with constant-time comparison
|
|
267
|
+
function verifyWebhookSignature(payload: string, signature: string, secret: string): boolean {
|
|
268
|
+
const expected = crypto.createHmac("sha256", secret).update(payload, "utf8").digest("hex");
|
|
269
|
+
return crypto.timingSafeEqual(Buffer.from(signature, "hex"), Buffer.from(expected, "hex"));
|
|
270
|
+
}
|
|
271
|
+
```
|
|
272
|
+
|
|
273
|
+
---
|
|
274
|
+
|
|
275
|
+
## A09:2021 -- Security Logging and Monitoring Failures
|
|
276
|
+
|
|
277
|
+
```typescript
|
|
278
|
+
import pino from "pino";
|
|
279
|
+
const logger = pino({
|
|
280
|
+
redact: {
|
|
281
|
+
paths: ["req.headers.authorization", "req.body.password", "*.email", "*.ssn"],
|
|
282
|
+
censor: "[REDACTED]",
|
|
283
|
+
},
|
|
284
|
+
});
|
|
285
|
+
|
|
286
|
+
function logAuthEvent(event: {
|
|
287
|
+
action: "login_success" | "login_failure" | "logout" | "password_reset";
|
|
288
|
+
userId?: string; ip: string; userAgent: string; reason?: string;
|
|
289
|
+
}) {
|
|
290
|
+
logger.info({ type: "auth", ...event });
|
|
291
|
+
}
|
|
292
|
+
```
|
|
293
|
+
|
|
294
|
+
**Key controls**: Log auth events, access control failures, input validation failures.
|
|
295
|
+
Never log passwords/tokens/PII. Ship logs offsite. Alert on attack patterns.
|
|
296
|
+
Retain logs 90+ days.
|
|
297
|
+
|
|
298
|
+
---
|
|
299
|
+
|
|
300
|
+
## A10:2021 -- Server-Side Request Forgery (SSRF)
|
|
301
|
+
|
|
302
|
+
```typescript
|
|
303
|
+
import { URL } from "url";
|
|
304
|
+
import dns from "dns/promises";
|
|
305
|
+
|
|
306
|
+
const BLOCKED_PREFIXES = ["10.", "172.16.", "192.168.", "169.254.", "127."];
|
|
307
|
+
|
|
308
|
+
async function isUrlSafe(urlString: string): Promise<boolean> {
|
|
309
|
+
let parsed: URL;
|
|
310
|
+
try { parsed = new URL(urlString); } catch { return false; }
|
|
311
|
+
if (!["http:", "https:"].includes(parsed.protocol)) return false;
|
|
312
|
+
if (["localhost", "127.0.0.1", "0.0.0.0"].includes(parsed.hostname)) return false;
|
|
313
|
+
|
|
314
|
+
const addresses = await dns.resolve4(parsed.hostname);
|
|
315
|
+
for (const addr of addresses) {
|
|
316
|
+
if (BLOCKED_PREFIXES.some((p) => addr.startsWith(p))) return false;
|
|
317
|
+
}
|
|
318
|
+
return true;
|
|
319
|
+
}
|
|
320
|
+
```
|
|
321
|
+
|
|
322
|
+
```go
|
|
323
|
+
// SECURE: SSRF prevention in Go
|
|
324
|
+
func isPrivateIP(ip net.IP) bool {
|
|
325
|
+
privateRanges := []string{"10.0.0.0/8", "172.16.0.0/12", "192.168.0.0/16", "169.254.0.0/16", "127.0.0.0/8"}
|
|
326
|
+
for _, cidr := range privateRanges {
|
|
327
|
+
_, network, _ := net.ParseCIDR(cidr)
|
|
328
|
+
if network.Contains(ip) { return true }
|
|
329
|
+
}
|
|
330
|
+
return false
|
|
331
|
+
}
|
|
332
|
+
```
|
|
333
|
+
|
|
334
|
+
---
|
|
335
|
+
|
|
336
|
+
## XSS Prevention (Cross-Cutting)
|
|
337
|
+
|
|
338
|
+
```typescript
|
|
339
|
+
// Reflected XSS -- escape output
|
|
340
|
+
import { encode } from "he";
|
|
341
|
+
app.get("/search", (req, res) => {
|
|
342
|
+
res.send(`<h1>Results for: ${encode(req.query.q || "")}</h1>`);
|
|
343
|
+
});
|
|
344
|
+
|
|
345
|
+
// Stored XSS -- sanitize HTML
|
|
346
|
+
import createDOMPurify from "dompurify";
|
|
347
|
+
import { JSDOM } from "jsdom";
|
|
348
|
+
const DOMPurify = createDOMPurify(new JSDOM("").window);
|
|
349
|
+
function sanitize(html: string): string {
|
|
350
|
+
return DOMPurify.sanitize(html, {
|
|
351
|
+
ALLOWED_TAGS: ["b", "i", "em", "strong", "a", "p", "br", "ul", "ol", "li"],
|
|
352
|
+
ALLOWED_ATTR: ["href"], ALLOW_DATA_ATTR: false,
|
|
353
|
+
});
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
// DOM XSS -- use textContent, not innerHTML
|
|
357
|
+
document.getElementById("output").textContent = userInput; // Safe
|
|
358
|
+
document.getElementById("output").innerHTML = userInput; // Vulnerable
|
|
359
|
+
```
|
|
360
|
+
|
|
361
|
+
---
|
|
362
|
+
|
|
363
|
+
## Insecure Deserialization
|
|
364
|
+
|
|
365
|
+
```python
|
|
366
|
+
# VULNERABLE: pickle.loads on untrusted data -- arbitrary code execution
|
|
367
|
+
data = pickle.loads(serialized_data)
|
|
368
|
+
|
|
369
|
+
# SECURE: JSON + Pydantic validation
|
|
370
|
+
from pydantic import BaseModel
|
|
371
|
+
class UserData(BaseModel):
|
|
372
|
+
name: str
|
|
373
|
+
age: int
|
|
374
|
+
def process_data(raw: str) -> UserData:
|
|
375
|
+
return UserData(**json.loads(raw))
|
|
376
|
+
```
|
|
377
|
+
|
|
378
|
+
---
|
|
379
|
+
|
|
380
|
+
## Anti-Patterns Summary
|
|
381
|
+
|
|
382
|
+
| Anti-Pattern | Risk | Fix |
|
|
383
|
+
|-------------|------|-----|
|
|
384
|
+
| String concatenation in queries | SQL/NoSQL injection | Parameterized queries |
|
|
385
|
+
| User input in shell commands | Command injection | Argument arrays, input validation |
|
|
386
|
+
| Plaintext password storage | Credential theft | bcrypt/argon2 hashing |
|
|
387
|
+
| Different errors for missing user vs wrong password | User enumeration | Identical error messages |
|
|
388
|
+
| Stack traces in production | Information disclosure | Generic error + error ID |
|
|
389
|
+
| No rate limiting on auth | Brute force attacks | Rate limiter per IP and account |
|
|
390
|
+
| innerHTML with user data | XSS | textContent or framework escaping |
|
|
391
|
+
| Fetching arbitrary URLs | SSRF | URL allowlist + IP blocking |
|
|
392
|
+
| pickle.loads on untrusted data | Remote code execution | JSON + schema validation |
|
|
393
|
+
| No security event logging | Undetected breaches | Structured logging with alerts |
|
|
394
|
+
|
|
395
|
+
---
|
|
396
|
+
|
|
397
|
+
## Security Testing Checklist
|
|
398
|
+
|
|
399
|
+
- [ ] SQL injection: test with `' OR 1=1 --` in text inputs
|
|
400
|
+
- [ ] XSS: test with `<script>alert(1)</script>` in text inputs
|
|
401
|
+
- [ ] IDOR: change IDs in URLs/bodies to other users' resources
|
|
402
|
+
- [ ] Auth bypass: access protected endpoints without valid tokens
|
|
403
|
+
- [ ] SSRF: submit internal URLs (169.254.169.254, localhost)
|
|
404
|
+
- [ ] Path traversal: test with `../../etc/passwd` in file params
|
|
405
|
+
- [ ] Rate limiting: send 100 rapid requests to auth endpoints
|
|
406
|
+
- [ ] Error handling: verify no stack traces leak in production
|
|
407
|
+
- [ ] Header security: verify CSP, HSTS, X-Frame-Options present
|
|
408
|
+
|
|
409
|
+
---
|
|
410
|
+
|
|
411
|
+
## References
|
|
412
|
+
|
|
413
|
+
- **OWASP Top 10 (2021)**: https://owasp.org/Top10/
|
|
414
|
+
- **OWASP Testing Guide**: https://owasp.org/www-project-web-security-testing-guide/
|
|
415
|
+
- **OWASP Cheat Sheet Series**: https://cheatsheetseries.owasp.org/
|
|
416
|
+
- **CWE Top 25**: https://cwe.mitre.org/top25/archive/2023/2023_top25_list.html
|
|
417
|
+
- **MITRE ATT&CK**: https://attack.mitre.org/
|
|
418
|
+
|
|
419
|
+
---
|
|
420
|
+
|
|
421
|
+
**Last verified**: 2026-02-17 | **Skill version**: 1.0.0
|