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,437 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: crypto-patterns
|
|
3
|
+
description: "Cryptography patterns for developers: password hashing, encryption, key management, JWT, HMAC, TLS configuration, and secure random generation. Use when implementing authentication, data encryption, webhook verification, token-based auth, or any feature requiring cryptographic operations."
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Cryptography Patterns for Developers
|
|
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
|
+
- Implementing password hashing and verification
|
|
18
|
+
- Encrypting sensitive data at rest or in transit
|
|
19
|
+
- Designing JWT-based authentication systems
|
|
20
|
+
- Verifying webhook signatures with HMAC
|
|
21
|
+
- Managing encryption keys and secrets
|
|
22
|
+
- Generating secure random values (tokens, IDs, nonces)
|
|
23
|
+
|
|
24
|
+
## Do Not Use This Skill When
|
|
25
|
+
|
|
26
|
+
- You need to implement a custom cryptographic algorithm (never do this)
|
|
27
|
+
- You need CSP/CORS header configuration (use csp-cors-headers skill)
|
|
28
|
+
- You need general OWASP vulnerability guidance (use owasp-web-security skill)
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## Password Hashing
|
|
33
|
+
|
|
34
|
+
Never use general-purpose hash functions (MD5, SHA-256) for passwords.
|
|
35
|
+
|
|
36
|
+
### bcrypt (Recommended Default)
|
|
37
|
+
|
|
38
|
+
```typescript
|
|
39
|
+
import bcrypt from "bcrypt";
|
|
40
|
+
const SALT_ROUNDS = 12; // Minimum 10, recommended 12-14
|
|
41
|
+
async function hashPassword(plaintext: string): Promise<string> {
|
|
42
|
+
return bcrypt.hash(plaintext, SALT_ROUNDS);
|
|
43
|
+
}
|
|
44
|
+
async function verifyPassword(plaintext: string, hash: string): Promise<boolean> {
|
|
45
|
+
return bcrypt.compare(plaintext, hash);
|
|
46
|
+
}
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
```python
|
|
50
|
+
import bcrypt
|
|
51
|
+
def hash_password(plaintext: str) -> str:
|
|
52
|
+
return bcrypt.hashpw(plaintext.encode("utf-8"), bcrypt.gensalt(rounds=12)).decode("utf-8")
|
|
53
|
+
def verify_password(plaintext: str, hashed: str) -> bool:
|
|
54
|
+
return bcrypt.checkpw(plaintext.encode("utf-8"), hashed.encode("utf-8"))
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
```go
|
|
58
|
+
import "golang.org/x/crypto/bcrypt"
|
|
59
|
+
func HashPassword(password string) (string, error) {
|
|
60
|
+
hash, err := bcrypt.GenerateFromPassword([]byte(password), 12)
|
|
61
|
+
return string(hash), err
|
|
62
|
+
}
|
|
63
|
+
func VerifyPassword(password, hash string) error {
|
|
64
|
+
return bcrypt.CompareHashAndPassword([]byte(hash), []byte(password))
|
|
65
|
+
}
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
### Argon2id (Strongest Option)
|
|
69
|
+
|
|
70
|
+
Winner of the Password Hashing Competition. Use when you need maximum security.
|
|
71
|
+
|
|
72
|
+
```typescript
|
|
73
|
+
import argon2 from "argon2";
|
|
74
|
+
async function hashPassword(plaintext: string): Promise<string> {
|
|
75
|
+
return argon2.hash(plaintext, {
|
|
76
|
+
type: argon2.argon2id, memoryCost: 65536, timeCost: 3, parallelism: 4,
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
async function verifyPassword(plaintext: string, hash: string): Promise<boolean> {
|
|
80
|
+
return argon2.verify(hash, plaintext);
|
|
81
|
+
}
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
### Algorithm Selection
|
|
85
|
+
|
|
86
|
+
| Algorithm | When To Use | Max Password Length |
|
|
87
|
+
|-----------|-------------|---------------------|
|
|
88
|
+
| bcrypt | Default choice, wide support | 72 bytes |
|
|
89
|
+
| Argon2id | Highest security, configurable memory | No practical limit |
|
|
90
|
+
| scrypt | Node.js built-in, no extra deps | No practical limit |
|
|
91
|
+
|
|
92
|
+
### scrypt (Node.js Built-in)
|
|
93
|
+
|
|
94
|
+
```typescript
|
|
95
|
+
import crypto from "crypto";
|
|
96
|
+
import { promisify } from "util";
|
|
97
|
+
const scryptAsync = promisify(crypto.scrypt);
|
|
98
|
+
|
|
99
|
+
async function hashPassword(password: string): Promise<string> {
|
|
100
|
+
const salt = crypto.randomBytes(32);
|
|
101
|
+
const key = (await scryptAsync(password, salt, 64, { N: 16384, r: 8, p: 1 })) as Buffer;
|
|
102
|
+
return `${salt.toString("hex")}:${key.toString("hex")}`;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
async function verifyPassword(password: string, stored: string): Promise<boolean> {
|
|
106
|
+
const [saltHex, hashHex] = stored.split(":");
|
|
107
|
+
const salt = Buffer.from(saltHex, "hex");
|
|
108
|
+
const storedHash = Buffer.from(hashHex, "hex");
|
|
109
|
+
const key = (await scryptAsync(password, salt, 64, { N: 16384, r: 8, p: 1 })) as Buffer;
|
|
110
|
+
return crypto.timingSafeEqual(key, storedHash);
|
|
111
|
+
}
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
---
|
|
115
|
+
|
|
116
|
+
## Integrity Hashing (SHA-256)
|
|
117
|
+
|
|
118
|
+
Use SHA-256 for data integrity verification and checksums. Never for passwords.
|
|
119
|
+
|
|
120
|
+
```typescript
|
|
121
|
+
import crypto from "crypto";
|
|
122
|
+
|
|
123
|
+
function sha256(data: string | Buffer): string {
|
|
124
|
+
return crypto.createHash("sha256").update(data).digest("hex");
|
|
125
|
+
}
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
```python
|
|
129
|
+
import hashlib
|
|
130
|
+
def sha256(data: bytes) -> str:
|
|
131
|
+
return hashlib.sha256(data).hexdigest()
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
---
|
|
135
|
+
|
|
136
|
+
## Symmetric Encryption (AES-256-GCM)
|
|
137
|
+
|
|
138
|
+
AES-256-GCM provides authenticated encryption (confidentiality + integrity).
|
|
139
|
+
|
|
140
|
+
```typescript
|
|
141
|
+
import crypto from "crypto";
|
|
142
|
+
|
|
143
|
+
interface EncryptedPayload {
|
|
144
|
+
iv: string; ciphertext: string; tag: string;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
function encrypt(plaintext: string, key: Buffer): EncryptedPayload {
|
|
148
|
+
const iv = crypto.randomBytes(12); // 96 bits for GCM
|
|
149
|
+
const cipher = crypto.createCipheriv("aes-256-gcm", key, iv);
|
|
150
|
+
let ciphertext = cipher.update(plaintext, "utf8", "hex");
|
|
151
|
+
ciphertext += cipher.final("hex");
|
|
152
|
+
return { iv: iv.toString("hex"), ciphertext, tag: cipher.getAuthTag().toString("hex") };
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
function decrypt(payload: EncryptedPayload, key: Buffer): string {
|
|
156
|
+
const decipher = crypto.createDecipheriv("aes-256-gcm", key, Buffer.from(payload.iv, "hex"));
|
|
157
|
+
decipher.setAuthTag(Buffer.from(payload.tag, "hex"));
|
|
158
|
+
let plaintext = decipher.update(payload.ciphertext, "hex", "utf8");
|
|
159
|
+
plaintext += decipher.final("utf8");
|
|
160
|
+
return plaintext;
|
|
161
|
+
}
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
```python
|
|
165
|
+
from cryptography.hazmat.primitives.ciphers.aead import AESGCM
|
|
166
|
+
import os
|
|
167
|
+
|
|
168
|
+
def encrypt(plaintext: bytes, key: bytes) -> tuple[bytes, bytes]:
|
|
169
|
+
nonce = os.urandom(12)
|
|
170
|
+
return nonce, AESGCM(key).encrypt(nonce, plaintext, None)
|
|
171
|
+
|
|
172
|
+
def decrypt(nonce: bytes, ciphertext: bytes, key: bytes) -> bytes:
|
|
173
|
+
return AESGCM(key).decrypt(nonce, ciphertext, None)
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
### Using libsodium (Simplest API)
|
|
177
|
+
|
|
178
|
+
```typescript
|
|
179
|
+
import sodium from "libsodium-wrappers";
|
|
180
|
+
await sodium.ready;
|
|
181
|
+
|
|
182
|
+
function encryptWithSodium(plaintext: string, key: Uint8Array): string {
|
|
183
|
+
const nonce = sodium.randombytes_buf(sodium.crypto_secretbox_NONCEBYTES);
|
|
184
|
+
const ciphertext = sodium.crypto_secretbox_easy(plaintext, nonce, key);
|
|
185
|
+
const combined = new Uint8Array(nonce.length + ciphertext.length);
|
|
186
|
+
combined.set(nonce);
|
|
187
|
+
combined.set(ciphertext, nonce.length);
|
|
188
|
+
return sodium.to_base64(combined);
|
|
189
|
+
}
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
---
|
|
193
|
+
|
|
194
|
+
## Key Management
|
|
195
|
+
|
|
196
|
+
### Envelope Encryption
|
|
197
|
+
|
|
198
|
+
Encrypt data with a Data Encryption Key (DEK), then encrypt the DEK with a
|
|
199
|
+
Key Encryption Key (KEK) stored in a KMS.
|
|
200
|
+
|
|
201
|
+
```typescript
|
|
202
|
+
// KMS integration pattern
|
|
203
|
+
interface KMSProvider {
|
|
204
|
+
generateDataKey(): Promise<{ plaintext: Buffer; encrypted: Buffer }>;
|
|
205
|
+
decryptDataKey(encryptedKey: Buffer): Promise<Buffer>;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
async function encryptWithKMS(plaintext: string, kms: KMSProvider) {
|
|
209
|
+
const { plaintext: dek, encrypted: encryptedKey } = await kms.generateDataKey();
|
|
210
|
+
const payload = encrypt(plaintext, dek);
|
|
211
|
+
dek.fill(0); // Zero out plaintext DEK from memory
|
|
212
|
+
return { encryptedKey, payload };
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
async function decryptWithKMS(encryptedKey: Buffer, payload: EncryptedPayload, kms: KMSProvider) {
|
|
216
|
+
const dek = await kms.decryptDataKey(encryptedKey);
|
|
217
|
+
const result = decrypt(payload, dek);
|
|
218
|
+
dek.fill(0);
|
|
219
|
+
return result;
|
|
220
|
+
}
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
**Key rules**: Never hardcode keys in source code. Store keys in KMS (AWS KMS,
|
|
224
|
+
Google Cloud KMS, Azure Key Vault) or environment variables. Rotate keys on a
|
|
225
|
+
schedule. Zero out plaintext keys from memory after use.
|
|
226
|
+
|
|
227
|
+
---
|
|
228
|
+
|
|
229
|
+
## JWT Best Practices
|
|
230
|
+
|
|
231
|
+
### Algorithm Selection
|
|
232
|
+
|
|
233
|
+
| Algorithm | Type | Use Case |
|
|
234
|
+
|-----------|------|----------|
|
|
235
|
+
| HS256 | Symmetric | Single-service auth (shared secret, 256+ bits) |
|
|
236
|
+
| RS256 | Asymmetric | Multi-service auth (RSA 2048+ bit key pair) |
|
|
237
|
+
| ES256 | Asymmetric | Modern systems, smaller tokens (ECDSA P-256) |
|
|
238
|
+
|
|
239
|
+
### Secure Implementation
|
|
240
|
+
|
|
241
|
+
```typescript
|
|
242
|
+
import jwt from "jsonwebtoken";
|
|
243
|
+
|
|
244
|
+
const JWT_SECRET = process.env.JWT_SECRET;
|
|
245
|
+
const ACCESS_TOKEN_EXPIRY = "15m"; // Short-lived
|
|
246
|
+
const REFRESH_TOKEN_EXPIRY = "7d"; // Longer, stored securely
|
|
247
|
+
|
|
248
|
+
function generateAccessToken(userId: string, roles: string[]): string {
|
|
249
|
+
return jwt.sign({ sub: userId, roles, type: "access" }, JWT_SECRET, {
|
|
250
|
+
expiresIn: ACCESS_TOKEN_EXPIRY, algorithm: "HS256",
|
|
251
|
+
issuer: "myapp.com", audience: "myapp.com", jwtid: crypto.randomUUID(),
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
function verifyToken(token: string, expectedType: "access" | "refresh") {
|
|
256
|
+
const decoded = jwt.verify(token, JWT_SECRET, {
|
|
257
|
+
algorithms: ["HS256"], // Explicitly allow ONLY expected algorithm
|
|
258
|
+
issuer: "myapp.com", audience: "myapp.com",
|
|
259
|
+
}) as { sub: string; type: string; roles?: string[] };
|
|
260
|
+
if (decoded.type !== expectedType) throw new Error("Invalid token type");
|
|
261
|
+
return decoded;
|
|
262
|
+
}
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
### Token Refresh Flow
|
|
266
|
+
|
|
267
|
+
```typescript
|
|
268
|
+
async function refreshTokens(refreshToken: string) {
|
|
269
|
+
const payload = verifyToken(refreshToken, "refresh");
|
|
270
|
+
if (await isTokenRevoked(payload.jti)) throw new Error("Token revoked");
|
|
271
|
+
await revokeToken(payload.jti); // Rotate: revoke old refresh token
|
|
272
|
+
|
|
273
|
+
const user = await getUserById(payload.sub);
|
|
274
|
+
if (!user || !user.active) throw new Error("User not found or inactive");
|
|
275
|
+
|
|
276
|
+
return {
|
|
277
|
+
accessToken: generateAccessToken(user.id, user.roles),
|
|
278
|
+
refreshToken: generateRefreshToken(user.id),
|
|
279
|
+
};
|
|
280
|
+
}
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
### JWT Anti-Patterns
|
|
284
|
+
|
|
285
|
+
| Anti-Pattern | Risk | Fix |
|
|
286
|
+
|-------------|------|-----|
|
|
287
|
+
| `algorithm: "none"` | Token forgery | Explicit algorithm in verify |
|
|
288
|
+
| Not validating `iss`/`aud` | Token misuse across services | Set and verify both |
|
|
289
|
+
| Long-lived access tokens | Extended compromise window | 15min access + refresh tokens |
|
|
290
|
+
| JWTs in localStorage | XSS token theft | httpOnly cookies |
|
|
291
|
+
| No token revocation | Cannot invalidate stolen tokens | Revocation list |
|
|
292
|
+
| Sensitive data in payload | Exposed (base64, not encrypted) | Only IDs and roles |
|
|
293
|
+
|
|
294
|
+
---
|
|
295
|
+
|
|
296
|
+
## HMAC for Webhook Verification
|
|
297
|
+
|
|
298
|
+
```typescript
|
|
299
|
+
import crypto from "crypto";
|
|
300
|
+
|
|
301
|
+
function verifyWebhookSignature(rawBody: string | Buffer, signatureHeader: string, secret: string): boolean {
|
|
302
|
+
const expected = crypto.createHmac("sha256", secret).update(rawBody).digest("hex");
|
|
303
|
+
const provided = signatureHeader.replace("sha256=", "");
|
|
304
|
+
try {
|
|
305
|
+
return crypto.timingSafeEqual(Buffer.from(provided, "hex"), Buffer.from(expected, "hex"));
|
|
306
|
+
} catch { return false; }
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
function signWebhookPayload(payload: string, secret: string): string {
|
|
310
|
+
return "sha256=" + crypto.createHmac("sha256", secret).update(payload).digest("hex");
|
|
311
|
+
}
|
|
312
|
+
```
|
|
313
|
+
|
|
314
|
+
```python
|
|
315
|
+
import hmac, hashlib
|
|
316
|
+
def verify_webhook(payload: bytes, signature: str, secret: str) -> bool:
|
|
317
|
+
expected = hmac.new(secret.encode(), payload, hashlib.sha256).hexdigest()
|
|
318
|
+
return hmac.compare_digest(expected, signature.replace("sha256=", ""))
|
|
319
|
+
```
|
|
320
|
+
|
|
321
|
+
```go
|
|
322
|
+
import ("crypto/hmac"; "crypto/sha256"; "encoding/hex")
|
|
323
|
+
func VerifyWebhook(payload []byte, signature, secret string) bool {
|
|
324
|
+
mac := hmac.New(sha256.New, []byte(secret))
|
|
325
|
+
mac.Write(payload)
|
|
326
|
+
return hmac.Equal([]byte(hex.EncodeToString(mac.Sum(nil))), []byte(signature))
|
|
327
|
+
}
|
|
328
|
+
```
|
|
329
|
+
|
|
330
|
+
---
|
|
331
|
+
|
|
332
|
+
## Secure Random Generation
|
|
333
|
+
|
|
334
|
+
```typescript
|
|
335
|
+
import crypto from "crypto";
|
|
336
|
+
|
|
337
|
+
function generateToken(bytes: number = 32): string { return crypto.randomBytes(bytes).toString("base64url"); }
|
|
338
|
+
function generateId(): string { return crypto.randomUUID(); }
|
|
339
|
+
function generateOTP(digits: number = 6): string {
|
|
340
|
+
return crypto.randomInt(0, Math.pow(10, digits)).toString().padStart(digits, "0");
|
|
341
|
+
}
|
|
342
|
+
```
|
|
343
|
+
|
|
344
|
+
```python
|
|
345
|
+
import secrets
|
|
346
|
+
def generate_token(bytes: int = 32) -> str: return secrets.token_urlsafe(bytes)
|
|
347
|
+
def generate_otp(digits: int = 6) -> str: return "".join(secrets.choice("0123456789") for _ in range(digits))
|
|
348
|
+
```
|
|
349
|
+
|
|
350
|
+
### Never Use for Security
|
|
351
|
+
|
|
352
|
+
| Insecure | Secure Replacement |
|
|
353
|
+
|----------|-------------------|
|
|
354
|
+
| `Math.random()` | `crypto.randomBytes()` / `crypto.randomInt()` |
|
|
355
|
+
| `random.random()` (Python) | `secrets.token_bytes()` / `secrets.randbelow()` |
|
|
356
|
+
| `rand.Intn()` (Go math/rand) | `crypto/rand.Int()` |
|
|
357
|
+
| UUID v1 (time-based) | UUID v4 (random) or `crypto.randomUUID()` |
|
|
358
|
+
|
|
359
|
+
---
|
|
360
|
+
|
|
361
|
+
## TLS Configuration
|
|
362
|
+
|
|
363
|
+
### nginx
|
|
364
|
+
|
|
365
|
+
```nginx
|
|
366
|
+
ssl_protocols TLSv1.2 TLSv1.3;
|
|
367
|
+
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;
|
|
368
|
+
ssl_prefer_server_ciphers on;
|
|
369
|
+
ssl_stapling on;
|
|
370
|
+
ssl_stapling_verify on;
|
|
371
|
+
ssl_session_cache shared:SSL:10m;
|
|
372
|
+
ssl_session_timeout 1d;
|
|
373
|
+
ssl_session_tickets off;
|
|
374
|
+
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
|
|
375
|
+
```
|
|
376
|
+
|
|
377
|
+
### Node.js
|
|
378
|
+
|
|
379
|
+
```typescript
|
|
380
|
+
const server = https.createServer({
|
|
381
|
+
key: fs.readFileSync("/path/to/private.key"),
|
|
382
|
+
cert: fs.readFileSync("/path/to/certificate.crt"),
|
|
383
|
+
minVersion: "TLSv1.2",
|
|
384
|
+
ciphers: [
|
|
385
|
+
"TLS_AES_256_GCM_SHA384", "TLS_CHACHA20_POLY1305_SHA256",
|
|
386
|
+
"ECDHE-RSA-AES256-GCM-SHA384", "ECDHE-RSA-AES128-GCM-SHA256",
|
|
387
|
+
].join(":"),
|
|
388
|
+
honorCipherOrder: true,
|
|
389
|
+
}, app);
|
|
390
|
+
```
|
|
391
|
+
|
|
392
|
+
**Certificate pinning warning**: Pinning can cause outages if certificates rotate
|
|
393
|
+
without updating pins. Prefer Certificate Transparency monitoring for web apps.
|
|
394
|
+
|
|
395
|
+
---
|
|
396
|
+
|
|
397
|
+
## Anti-Patterns Summary
|
|
398
|
+
|
|
399
|
+
| Anti-Pattern | Risk | Correct Approach |
|
|
400
|
+
|-------------|------|-----------------|
|
|
401
|
+
| MD5/SHA1 for passwords | Rainbow table attacks | bcrypt, argon2id, or scrypt |
|
|
402
|
+
| ECB mode for encryption | Pattern leakage | GCM mode with authentication |
|
|
403
|
+
| Hardcoded encryption keys | Key compromise on code leak | KMS or environment variables |
|
|
404
|
+
| Custom crypto algorithms | Unknown vulnerabilities | Vetted libraries (libsodium, crypto) |
|
|
405
|
+
| Reusing IVs/nonces | Breaks encryption | Random IV for every operation |
|
|
406
|
+
| `Math.random()` for tokens | Predictable output | `crypto.randomBytes()` |
|
|
407
|
+
| Comparing hashes with `===` | Timing attacks | `crypto.timingSafeEqual()` |
|
|
408
|
+
| TLS 1.0/1.1 enabled | Protocol vulnerabilities | TLS 1.2 minimum |
|
|
409
|
+
| Self-signed certs in production | MitM risk | CA-issued certificates |
|
|
410
|
+
|
|
411
|
+
---
|
|
412
|
+
|
|
413
|
+
## Decision Matrix
|
|
414
|
+
|
|
415
|
+
```
|
|
416
|
+
Storing passwords? --> bcrypt (default) or argon2id (max security)
|
|
417
|
+
Encrypting data at rest? --> AES-256-GCM with envelope encryption
|
|
418
|
+
Verifying data integrity? --> SHA-256 hash
|
|
419
|
+
Signing/verifying messages? --> HMAC-SHA256
|
|
420
|
+
Authentication tokens? --> JWT with RS256/ES256 (multi-service) or HS256 (single)
|
|
421
|
+
Random security values? --> crypto.randomBytes() / secrets.token_urlsafe()
|
|
422
|
+
Protecting data in transit? --> TLS 1.2+ with modern cipher suites
|
|
423
|
+
```
|
|
424
|
+
|
|
425
|
+
---
|
|
426
|
+
|
|
427
|
+
## References
|
|
428
|
+
|
|
429
|
+
- **OWASP Password Storage Cheat Sheet**: https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html
|
|
430
|
+
- **OWASP Key Management Cheat Sheet**: https://cheatsheetseries.owasp.org/cheatsheets/Key_Management_Cheat_Sheet.html
|
|
431
|
+
- **JWT Best Practices (RFC 8725)**: https://www.rfc-editor.org/rfc/rfc8725
|
|
432
|
+
- **libsodium Documentation**: https://doc.libsodium.org/
|
|
433
|
+
- **Node.js crypto Module**: https://nodejs.org/api/crypto.html
|
|
434
|
+
|
|
435
|
+
---
|
|
436
|
+
|
|
437
|
+
**Last verified**: 2026-02-17 | **Skill version**: 1.0.0
|