@thierrynakoa/fire-flow 12.2.2 → 13.0.1
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/CREDITS.md +25 -0
- package/DOMINION-FLOW-OVERVIEW.md +182 -38
- package/README.md +399 -690
- package/TROUBLESHOOTING.md +264 -367
- package/agents/fire-debugger.md +54 -0
- package/agents/fire-executor.md +1610 -1033
- package/agents/fire-fact-checker.md +1 -1
- package/agents/fire-planner.md +85 -17
- package/agents/fire-project-researcher.md +1 -1
- package/agents/fire-researcher.md +4 -22
- package/agents/{fire-phoenix-analyst.md → fire-resurrection-analyst.md} +394 -394
- package/agents/fire-reviewer.md +552 -499
- package/agents/fire-verifier.md +114 -19
- package/bin/cli.js +18 -101
- package/commands/fire-0-orient.md +2 -2
- package/commands/fire-1a-new.md +50 -15
- package/commands/fire-1c-setup.md +33 -5
- package/commands/fire-1d-discuss.md +87 -1
- package/commands/fire-2-plan.md +556 -527
- package/commands/fire-3-execute.md +2046 -1356
- package/commands/fire-4-verify.md +975 -906
- package/commands/fire-5-handoff.md +46 -5
- package/commands/fire-6-resume.md +2 -31
- package/commands/fire-add-new-skill.md +138 -19
- package/commands/fire-autonomous.md +14 -2
- package/commands/fire-complete-milestone.md +1 -1
- package/commands/fire-cost.md +179 -183
- package/commands/fire-debug.md +1 -6
- package/commands/fire-loop-resume.md +2 -2
- package/commands/fire-loop-stop.md +1 -1
- package/commands/fire-loop.md +2 -15
- package/commands/fire-map-codebase.md +1 -1
- package/commands/fire-migrate-database.md +548 -0
- package/commands/fire-new-milestone.md +1 -1
- package/commands/fire-reflect.md +1 -2
- package/commands/fire-research.md +142 -21
- package/commands/{fire-phoenix.md → fire-resurrect.md} +859 -603
- package/commands/fire-scaffold.md +297 -0
- package/commands/fire-search.md +1 -2
- package/commands/fire-security-scan.md +483 -484
- package/commands/fire-setup.md +359 -0
- package/commands/fire-skill.md +770 -0
- package/commands/fire-skills-diff.md +506 -506
- package/commands/fire-skills-history.md +388 -388
- package/commands/fire-skills-rollback.md +7 -7
- package/commands/fire-skills-sync.md +470 -470
- package/commands/fire-test.md +5 -5
- package/commands/fire-todos.md +1 -1
- package/commands/fire-update.md +5 -5
- package/commands/fire-validate-skills.md +282 -0
- package/commands/fire-verify-uat.md +9 -177
- package/commands/fire-vuln-scan.md +492 -493
- package/hooks/run-hook.sh +8 -8
- package/hooks/run-session-end.sh +7 -7
- package/hooks/session-end.sh +90 -90
- package/hooks/session-start.sh +1 -1
- package/package.json +4 -25
- package/plugin.json +7 -7
- package/references/autonomy-levels.md +235 -0
- package/references/behavioral-directives.md +95 -3
- package/references/blocker-tracking.md +1 -1
- package/references/circuit-breaker.md +93 -2
- package/references/context-engineering.md +227 -9
- package/references/honesty-protocols.md +70 -1
- package/references/issue-to-pr-pipeline.md +149 -150
- package/references/metrics-and-trends.md +1 -2
- package/references/research-improvements.md +4 -108
- package/references/sdlc-mapping.md +73 -0
- package/references/state-machine.md +151 -0
- package/skills-library/AVAILABLE_TOOLS_REFERENCE.md +333 -0
- package/skills-library/SKILLS-INDEX.md +57 -558
- package/skills-library/SKILLS_LIBRARY_INDEX.md +532 -0
- package/skills-library/_general/api-patterns/api-field-name-mismatch.md +107 -0
- package/skills-library/_general/api-patterns/streaming-command-timeout.md +122 -0
- package/skills-library/_general/api-patterns/streaming-proxy-cors-bypass.md +102 -0
- package/skills-library/_general/automation/settings-gui-generator.md +172 -0
- package/skills-library/_general/database-solutions/data-type-mapping-reference.md +181 -0
- package/skills-library/_general/database-solutions/mysql-limit-offset-string-coercion.md +102 -0
- package/skills-library/_general/database-solutions/mysql-to-pg-migration.md +195 -0
- package/skills-library/_general/database-solutions/orm-schema-portability.md +193 -0
- package/skills-library/_general/database-solutions/persistent-analysis-storage.md +207 -0
- package/skills-library/_general/database-solutions/pg-to-mysql-schema-migration-methodology.md +190 -0
- package/skills-library/_general/database-solutions/sql-dialect-compatibility-matrix.md +306 -0
- package/skills-library/_general/database-solutions/sqlite-to-pg-migration.md +219 -0
- package/skills-library/_general/frontend/canvas-bubble-animation-grouping.md +270 -0
- package/skills-library/_general/frontend/color-token-migration.md +112 -0
- package/skills-library/_general/frontend/framer-motion-layoutid-grouping.md +150 -0
- package/skills-library/_general/frontend/pyqt6-settings-dialog.md +191 -0
- package/skills-library/_general/frontend/react-flow-animated-layout-switching.md +101 -0
- package/skills-library/_general/frontend/react-hooks-order-debugging.md +141 -0
- package/skills-library/_general/frontend/redux-localstorage-auth-desync.md +126 -0
- package/skills-library/_general/frontend/safari-csp-theme-color-debugging.md +124 -0
- package/skills-library/_general/frontend/safari-sw-cache-poisoning.md +138 -0
- package/skills-library/_general/frontend/svg-sparkline-no-charting-library.md +131 -0
- package/skills-library/_general/growth-marketing/oss-daily-growth-intelligence.md +224 -0
- package/skills-library/_general/integrations/claude-code-local-mcp-integration.md +250 -0
- package/skills-library/_general/integrations/mcp-composite-tool-orchestration.md +200 -0
- package/skills-library/_general/methodology/AGENT_SDK_STANDALONE_TOOLING.md +181 -0
- package/skills-library/_general/methodology/AGENT_TEAMS_GUIDE.md +169 -0
- package/skills-library/_general/methodology/ALAS_STATEFUL_EXECUTION.md +207 -0
- package/skills-library/_general/methodology/AUTO_REVIEWER_SUBAGENT.md +211 -0
- package/skills-library/_general/methodology/CONSISTENCY_CHECK_AMBIGUITY_GATE.md +96 -0
- package/skills-library/_general/methodology/DEAD_ENDS_SHELF.md +4 -4
- package/skills-library/_general/methodology/DISTILL_NOT_DUMP.md +108 -0
- package/skills-library/_general/methodology/EXECUTION_PROGRESS_MONITOR.md +157 -0
- package/skills-library/_general/methodology/HIERARCHICAL_REVIEW_MARS.md +122 -0
- package/skills-library/_general/methodology/MCP_INTER_AGENT_BRIDGE.md +207 -0
- package/skills-library/_general/methodology/MERMAID_WIZARD_DIAGRAMS.md +77 -0
- package/skills-library/_general/methodology/MISSING_DIMENSION_DETECTOR.md +89 -0
- package/skills-library/_general/methodology/MULTI_AGENT_COORDINATION.md +397 -0
- package/skills-library/_general/methodology/OBSERVATION_MASKING.md +100 -0
- package/skills-library/_general/methodology/PHOENIX_REBUILD_METHODOLOGY.md +82 -11
- package/skills-library/_general/methodology/REVIEW_BACKTRACK_PANEL.md +140 -0
- package/skills-library/_general/methodology/REVIEW_FIX_LOOP.md +117 -0
- package/skills-library/_general/methodology/VOTING_VERDICT_ARBITRATION.md +155 -0
- package/skills-library/_general/methodology/ZERO_FRICTION_CLI_SETUP.md +2 -2
- package/skills-library/_general/methodology/dead-code-activation.md +123 -0
- package/skills-library/_general/methodology/debug-swarm-researcher-escape-hatch.md +240 -240
- package/skills-library/_general/methodology/shell-autonomous-loop-fixplan.md +1 -1
- package/skills-library/_general/patterns-standards/GOF_DESIGN_PATTERNS_FOR_AI_AGENTS.md +5 -5
- package/skills-library/_general/patterns-standards/cascading-failure-diagnosis.md +119 -0
- package/skills-library/_general/patterns-standards/domain-specific-layout-algorithms.md +209 -0
- package/skills-library/_general/patterns-standards/python-desktop-app-architecture.md +399 -0
- package/skills-library/_general/patterns-standards/realtime-monitoring-dashboard.md +457 -0
- package/skills-library/_general/patterns-standards/togglable-processing-pipeline.md +169 -0
- package/skills-library/_general/performance/liveclock-extraction.md +112 -0
- package/skills-library/_general/performance/ref-based-canvas-animation.md +117 -0
- package/skills-library/_general/performance/use-visible-interval.md +131 -0
- package/skills-library/_general/testing/playwright-firefox-withcredentials-auth-issue.md +104 -0
- package/skills-library/_quarantine/README.md +30 -0
- package/skills-library/api-patterns/BROADCAST_SCHEDULER_SHARED_EXECUTE_FUNCTION.md +150 -0
- package/skills-library/api-patterns/ERROR_RESPONSE_STANDARDS.md +145 -0
- package/skills-library/api-patterns/EXPRESS_ROUTE_ORDERING_MIDDLEWARE_INTERCEPTION.md +326 -0
- package/skills-library/api-patterns/PAGINATION_PATTERNS.md +137 -0
- package/skills-library/api-patterns/PODCAST_PROGRESS_TRACKING_THREE_ROOT_CAUSES.md +277 -0
- package/skills-library/api-patterns/RATE_LIMITING_TOGGLE.md +155 -0
- package/skills-library/api-patterns/graphql-content-queries.md +708 -0
- package/skills-library/appointment-scheduler-design.md +423 -0
- package/skills-library/automation/AUTO_POPULATE_COMPLETE_GUIDE.md +631 -0
- package/skills-library/automation/CC_WORKFLOW_STUDIO.md +83 -0
- package/skills-library/automation/CLAUDE_CODE_SWARM_MODE.md +95 -0
- package/skills-library/automation/DAEMON_TRIGGER_FILE_IPC.md +195 -0
- package/skills-library/automation/scheduled-content-publishing.md +608 -0
- package/skills-library/awesome-workflows/Blogging-Platform-Instructions/view_commands.md +25 -0
- package/skills-library/awesome-workflows/CREDENTIAL-SECURITY-WORKFLOW.md +109 -0
- package/skills-library/awesome-workflows/DEBUGGING-WORKFLOW.md +124 -0
- package/skills-library/awesome-workflows/Design-Review-Workflow/README.md +31 -0
- package/skills-library/awesome-workflows/Design-Review-Workflow/design-principles-example.md +129 -0
- package/skills-library/awesome-workflows/Design-Review-Workflow/design-review-agent.md +107 -0
- package/skills-library/awesome-workflows/Design-Review-Workflow/design-review-claude-md-snippet.md +24 -0
- package/skills-library/awesome-workflows/Design-Review-Workflow/design-review-slash-command.md +38 -0
- package/skills-library/awesome-workflows/PARALLEL-RESEARCH-WORKFLOW.md +89 -0
- package/skills-library/awesome-workflows/PHASE-EXECUTION-WORKFLOW.md +97 -0
- package/skills-library/awesome-workflows/SESSION-HANDOFF-WORKFLOW.md +116 -0
- package/skills-library/cms-patterns/content-branch-preview.md +515 -0
- package/skills-library/cms-patterns/inline-visual-editing.md +666 -0
- package/skills-library/cms-patterns/mdx-component-content.md +649 -0
- package/skills-library/cms-patterns/media-manager-abstraction.md +827 -0
- package/skills-library/cms-patterns/schema-driven-form-generator.md +838 -0
- package/skills-library/complexity-metrics/complexity-divider.md +707 -0
- package/skills-library/complexity-metrics/work-with-complexity.md +193 -0
- package/skills-library/creative-multimedia/animation-stack-guide.md +577 -0
- package/skills-library/creative-multimedia/audio-enhancement-pipeline.md +625 -0
- package/skills-library/creative-multimedia/content-repurposing-pipeline.md +1146 -0
- package/skills-library/creative-multimedia/data-visualization-generator.md +862 -0
- package/skills-library/creative-multimedia/doc-to-podcast-pipeline.md +2184 -0
- package/skills-library/creative-multimedia/ffmpeg-command-generator.md +405 -0
- package/skills-library/creative-multimedia/image-optimization-pipeline.md +605 -0
- package/skills-library/creative-multimedia/multi-format-content-generator.md +1759 -0
- package/skills-library/creative-multimedia/og-image-generator.md +635 -0
- package/skills-library/creative-multimedia/podcast-audio-composition.md +1355 -0
- package/skills-library/creative-multimedia/podcast-quality-evaluation.md +1452 -0
- package/skills-library/creative-multimedia/podcast-script-generation.md +1841 -0
- package/skills-library/creative-multimedia/svg-generation.md +750 -0
- package/skills-library/creative-multimedia/text-to-speech-provider-selector.md +1414 -0
- package/skills-library/creative-multimedia/transcription-pipeline-selector.md +677 -0
- package/skills-library/creative-multimedia/video-streaming-setup.md +559 -0
- package/skills-library/database-solutions/AI_RESPONSE_DATABASE_CACHING.md +520 -0
- package/skills-library/database-solutions/CONDITIONAL_SQL_MIGRATION_PATTERN.md +119 -0
- package/skills-library/database-solutions/DATABASE_COLUMN_NAME_MISMATCH.md +393 -0
- package/skills-library/database-solutions/DATABASE_SCHEMA.md +394 -0
- package/skills-library/database-solutions/DATABASE_SCHEMA_VERIFICATION_GUIDE.md +348 -0
- package/skills-library/database-solutions/DATABASE_STRATEGY.md +71 -0
- package/skills-library/database-solutions/ES_MODULE_SEED_SCRIPT_PATTERN.md +52 -0
- package/skills-library/database-solutions/MIGRATION_GUIDE.md +3 -0
- package/skills-library/database-solutions/PLPGSQL_VARIABLE_CONFLICT_FIX.md +208 -0
- package/skills-library/database-solutions/POSTGRESQL_JSONB_DOUBLE_STRINGIFY_FIX.md +245 -0
- package/skills-library/database-solutions/POSTGRESQL_LICENSE_TABLE_DESIGN.md +393 -0
- package/skills-library/database-solutions/POSTGRESQL_UUID_DOCUMENT_RAG_DUAL_SCOPE.md +732 -0
- package/skills-library/database-solutions/POSTGRES_SQL_TEMPLATE_BINDING_ERROR.md +240 -0
- package/skills-library/database-solutions/PRISMA_DB_PUSH_DATA_LOSS_PREVENTION.md +141 -0
- package/skills-library/database-solutions/PRODUCTION_QUERY_OPTIMIZATION_RESTART_FIX.md +389 -0
- package/skills-library/database-solutions/RLS_SECURITY_GUIDE.md +107 -0
- package/skills-library/database-solutions/SCHEMA_ENHANCEMENTS_GUIDE.md +373 -0
- package/skills-library/database-solutions/SCHEMA_MIGRATION_GUIDE.md +368 -0
- package/skills-library/database-solutions/SCHEMA_VERIFICATION_QUICK_REFERENCE.md +104 -0
- package/skills-library/database-solutions/ai-erd-generator.md +1213 -0
- package/skills-library/database-solutions/content-publishing-states.md +631 -0
- package/skills-library/database-solutions/database-schema-designer.md +522 -0
- package/skills-library/database-solutions/er-diagram-components.md +569 -0
- package/skills-library/database-solutions/er-to-ddl-mapping.md +1405 -0
- package/skills-library/database-solutions/erd-creator-textbook-research.md +433 -0
- package/skills-library/database-solutions/erd-react-flow-architecture.md +1965 -0
- package/skills-library/database-solutions/mariadb-aggregate-function-replacement.md +145 -0
- package/skills-library/database-solutions/normalization-validator.md +778 -0
- package/skills-library/database-solutions/postgres-full-text-search-content.md +494 -0
- package/skills-library/database-solutions/postgresql-to-mysql-runtime-translation.md +286 -0
- package/skills-library/database-solutions/regex-alternation-ordering-sql-types.md +92 -0
- package/skills-library/database-solutions/reserved-word-context-aware-quoting.md +142 -0
- package/skills-library/database-solutions/sql-ddl-generator.md +756 -0
- package/skills-library/database-solutions/supabase-connection-pooler-fix.md +102 -0
- package/skills-library/deployment-security/CPANEL_NODE_DEPLOYMENT.md +166 -0
- package/skills-library/deployment-security/DEPLOYMENT.md +275 -0
- package/skills-library/deployment-security/DEPLOYMENT_CHECKLIST.md +363 -0
- package/skills-library/deployment-security/DEPLOYMENT_PLAN.md +669 -0
- package/skills-library/deployment-security/KNEX_DATABASE_ABSTRACTION.md +444 -0
- package/skills-library/deployment-security/LICENSE_KEY_SYSTEM.md +206 -0
- package/skills-library/deployment-security/NODE18_DEPENDENCY_COMPATIBILITY.md +284 -0
- package/skills-library/deployment-security/PHP_INSTALLER_WIZARD_GUIDE.md +315 -0
- package/skills-library/deployment-security/PM2_ENVIRONMENT_VARIABLE_CACHING.md +256 -0
- package/skills-library/deployment-security/PM2_MEMORY_EXHAUSTION_FIX.md +370 -0
- package/skills-library/deployment-security/PRODUCTION_DEPLOYMENT_GUIDE.md +592 -0
- package/skills-library/deployment-security/PRODUCTION_HARDENING_DOCUMENTATION.md +307 -0
- package/skills-library/deployment-security/PRODUCTION_RECOVERY_CHERRY_PICK_PATTERN.md +202 -0
- package/skills-library/deployment-security/PYINSTALLER_CUDA_WHISPER_BUNDLING.md +236 -0
- package/skills-library/deployment-security/SECURITY.md +41 -0
- package/skills-library/deployment-security/SMTP_SSL_HOSTNAME_MISMATCH_SHARED_HOSTING.md +220 -0
- package/skills-library/deployment-security/SPA_SEO_OPTIMIZATION_CPANEL.md +200 -0
- package/skills-library/deployment-security/SUPABASE_EDGE_FUNCTIONS.md +338 -0
- package/skills-library/deployment-security/VERCEL_GITHUB_DEPLOYMENT_GUIDE.md +858 -0
- package/skills-library/deployment-security/VPS_DEPLOYMENT_READINESS.md +356 -0
- package/skills-library/deployment-security/deployment-changes-not-applying.md +241 -0
- package/skills-library/deployment-security/env-file-management-production-local.md +203 -0
- package/skills-library/deployment-security/express-secure-file-downloads.md +413 -0
- package/skills-library/deployment-security/react-production-deployment-desktop-guide.md +2011 -0
- package/skills-library/deployment-security/self-hosted-supabase-coolify-guide.md +1684 -0
- package/skills-library/deployment-security/unique-features-ai-strategy-plaid-security.md +1613 -0
- package/skills-library/deployment-security/vps-deployment.md +135 -0
- package/skills-library/document-processing/WORD_EXPORT_MARKDOWN_FORMATTING.md +482 -0
- package/skills-library/document-processing/document-ai-landingai-integration.md +677 -0
- package/skills-library/document-processing/express-secure-file-downloads-mern.md +413 -0
- package/skills-library/document-processing/express-secure-file-downloads.md +413 -0
- package/skills-library/document-processing/md-to-word-converter.md +318 -0
- package/skills-library/document-processing/pdf-forms-integration/README.md +101 -0
- package/skills-library/document-processing/pdf-forms-integration/SKILL.md +662 -0
- package/skills-library/ecommerce/ADMIN_PRODUCTS_GUIDE.md +428 -0
- package/skills-library/ecommerce/ECOMMERCE_API_REFERENCE.md +776 -0
- package/skills-library/ecommerce/ECOMMERCE_COMPLETION_SUMMARY.md +673 -0
- package/skills-library/ecommerce/ECOMMERCE_IMPLEMENTATION_GUIDE.md +729 -0
- package/skills-library/ecommerce/ECOMMERCE_QUICK_REFERENCE.md +521 -0
- package/skills-library/ecommerce/ECOMMERCE_TESTING_CHECKLIST.md +565 -0
- package/skills-library/ecommerce/ECOMMERCE_WORKFLOW_GUIDE.md +1059 -0
- package/skills-library/ecommerce/PRODUCT_CREATION_EXPANDED.md +522 -0
- package/skills-library/ecommerce/agentic-commerce-protocol.md +203 -0
- package/skills-library/ecommerce/cart-abandonment-recovery.md +236 -0
- package/skills-library/ecommerce/cart-architecture-patterns.md +300 -0
- package/skills-library/ecommerce/cart-item-count-indicator.md +264 -0
- package/skills-library/ecommerce/checkout-ux-conversion.md +227 -0
- package/skills-library/ecommerce/composable-commerce-selection.md +166 -0
- package/skills-library/ecommerce/ecommerce-analytics-patterns.md +167 -0
- package/skills-library/ecommerce/fraud-detection-patterns.md +179 -0
- package/skills-library/ecommerce/inventory-stock-management.md +270 -0
- package/skills-library/ecommerce/order-saga-state-machine.md +336 -0
- package/skills-library/ecommerce/payment-provider-abstraction.md +245 -0
- package/skills-library/ecommerce/pci-compliance-checklist.md +192 -0
- package/skills-library/ecommerce/refund-chargeback-handling.md +177 -0
- package/skills-library/ecommerce/shipping-carrier-integration.md +218 -0
- package/skills-library/ecommerce/webhook-idempotency-patterns.md +253 -0
- package/skills-library/excalidraw-diagrams/.github/workflows/ci.yml +558 -0
- package/skills-library/excalidraw-diagrams/.github/workflows/prompt-gallery.yml +448 -0
- package/skills-library/excalidraw-diagrams/.github/workflows/release.yml +42 -0
- package/skills-library/excalidraw-diagrams/.github/workflows/test-reusable-ci.yml +25 -0
- package/skills-library/excalidraw-diagrams/CLAUDE.md +57 -0
- package/skills-library/excalidraw-diagrams/LICENSE +21 -0
- package/skills-library/excalidraw-diagrams/README.md +178 -0
- package/skills-library/excalidraw-diagrams/SKILL.md +715 -0
- package/skills-library/form-solutions/BUTTON_TYPE_FORM_SUBMISSION.md +336 -0
- package/skills-library/form-solutions/FILLABLE_PDF_IMPLEMENTATION.md +226 -0
- package/skills-library/form-solutions/SURVEYJS_QUESTIONNAIRE_SYSTEM.md +367 -0
- package/skills-library/form-solutions/tiptap-minimal-setup.md +690 -0
- package/skills-library/frontend/scholarly-classification-bubble-map.md +149 -0
- package/skills-library/infrastructure/ci-cd-pipeline-builder.md +517 -0
- package/skills-library/infrastructure/observability-designer.md +264 -0
- package/skills-library/infrastructure/performance-profiler.md +621 -0
- package/skills-library/installer-wizard-patterns.md +249 -0
- package/skills-library/integrations/CLAUDE_CODE_TOKEN_ANALYTICS.md +160 -0
- package/skills-library/integrations/CONFIGURABLE_AI_PROVIDER_SELECTION.md +728 -0
- package/skills-library/integrations/SOCKET_IO_BROADCAST_ALL_VS_ROOM.md +141 -0
- package/skills-library/integrations/VIRTUAL_MEETINGS_IMPLEMENTATION.md +374 -0
- package/skills-library/integrations/WORDPRESS_LEARNDASH_DATA_RECOVERY.md +53 -0
- package/skills-library/integrations/YOUTUBE_API_SETUP.md +141 -0
- package/skills-library/integrations/YOUTUBE_BOOKMARKING_EXPLANATION.md +252 -0
- package/skills-library/integrations/YOUTUBE_BOOKMARKING_SOLUTION.md +268 -0
- package/skills-library/integrations/YOUTUBE_OAUTH_SETUP_GUIDE.md +200 -0
- package/skills-library/integrations/YOUTUBE_VIDEO_FIX_COMPLETE.md +192 -0
- package/skills-library/integrations/ai-ml/GEMINI_AI_RAG_PIPELINE_COMPLETE_GUIDE.md +195 -0
- package/skills-library/integrations/ai-ml/GEMINI_IMAGE_GENERATION_SETUP.md +64 -0
- package/skills-library/integrations/cloudflare/cloudflare-turnstile-debugging.md +202 -0
- package/skills-library/integrations/cloudflare/cloudflare-turnstile-implementation.md +476 -0
- package/skills-library/integrations/cloudflare-turnstile-debugging.md +202 -0
- package/skills-library/integrations/cloudflare-turnstile-implementation.md +476 -0
- package/skills-library/integrations/ghost-creator-monetization-pattern.md +454 -0
- package/skills-library/integrations/headless-cms-architecture.md +484 -0
- package/skills-library/integrations/headless-cms-stack-selection.md +183 -0
- package/skills-library/integrations/payload-cms-patterns.md +674 -0
- package/skills-library/integrations/realtimestt-openwakeword-cuda-windows.md +229 -0
- package/skills-library/integrations/rss-podcast-integration.md +300 -0
- package/skills-library/integrations/wordpress/WORDPRESS_LEARNDASH_DATA_RECOVERY.md +53 -0
- package/skills-library/integrations/youtube/YOUTUBE_API_SETUP.md +141 -0
- package/skills-library/integrations/youtube/YOUTUBE_BOOKMARKING_EXPLANATION.md +252 -0
- package/skills-library/integrations/youtube/YOUTUBE_BOOKMARKING_SOLUTION.md +268 -0
- package/skills-library/integrations/youtube/YOUTUBE_OAUTH_SETUP_GUIDE.md +200 -0
- package/skills-library/integrations/youtube/YOUTUBE_VIDEO_FIX_COMPLETE.md +192 -0
- package/skills-library/marketing/campaign-analytics.md +97 -0
- package/skills-library/marketing/content-creator.md +105 -0
- package/skills-library/marketing/marketing-strategy-pmm.md +94 -0
- package/skills-library/marketing/social-media-analyzer.md +81 -0
- package/skills-library/methodology/ADVANCED_ORCHESTRATION_PATTERNS.md +401 -0
- package/skills-library/methodology/AGENT_SELF_IMPROVEMENT_LOOP.md +179 -0
- package/skills-library/methodology/BREATH_BASED_PARALLEL_EXECUTION.md +1 -1
- package/skills-library/methodology/CLEANSING_CYCLE.md +358 -0
- package/skills-library/methodology/CONFIDENCE_ANNOTATION_PATTERN.md +143 -0
- package/skills-library/methodology/CRITICAL_PATTERNS_DOCUMENTATION_COMPLETE.md +204 -0
- package/skills-library/methodology/DELIVERABLES_SUMMARY.md +341 -0
- package/skills-library/methodology/DIFFICULTY_AWARE_AGENT_ROUTING.md +252 -0
- package/skills-library/methodology/EVOLUTIONARY_SKILL_SYNTHESIS.md +219 -0
- package/skills-library/methodology/GLOMERULUS_DECISION_GATE.md +223 -0
- package/skills-library/methodology/HIBERNATION_SYSTEM.md +231 -0
- package/skills-library/methodology/INSTRUMENTATION_OVER_RESTRICTION.md +192 -0
- package/skills-library/methodology/MASTER_COMPLETION_SUMMARY.md +444 -0
- package/skills-library/methodology/MASTER_SESSION_COMPLETION.md +743 -0
- package/skills-library/methodology/MERN_QUICK_REFERENCE.md +358 -0
- package/skills-library/methodology/ORGAN_AGENT_MAPPING.md +177 -0
- package/skills-library/methodology/PARALLEL_WAVE_BASED_REFACTORING.md +440 -0
- package/skills-library/methodology/QUICK_REFERENCE.md +358 -0
- package/skills-library/methodology/SDFT_ONPOLICY_SELF_DISTILLATION.md +186 -0
- package/skills-library/methodology/SELF_QUESTIONING_TASK_GENERATION.md +270 -0
- package/skills-library/methodology/SESSION_COMPLETION_SUMMARY.md +304 -0
- package/skills-library/methodology/SESSION_SUMMARY.md +432 -0
- package/skills-library/methodology/WARRIOR_WORKFLOW_DEBUGGING_PROTOCOL.md +252 -0
- package/skills-library/methodology/tech-debt-tracker.md +570 -0
- package/skills-library/parallel-debug/SKILL.md +60 -0
- package/skills-library/patterns-standards/API_PATTERN_FIX_SUMMARY.md +236 -0
- package/skills-library/patterns-standards/BATCH_OPERATIONS_WITH_PROGRESS_MODAL.md +362 -0
- package/skills-library/patterns-standards/CRITICAL_CODING_PATTERNS.md +639 -0
- package/skills-library/patterns-standards/DARK_MODE_MODAL_VISIBILITY.md +258 -0
- package/skills-library/patterns-standards/ERROR_RESILIENCE_IMPLEMENTATION.md +375 -0
- package/skills-library/patterns-standards/ES_MODULE_IMPORT_HOISTING_DOTENV.md +298 -0
- package/skills-library/patterns-standards/NESTED_BACKDROP_FILTER_CSS_ARTIFACT_FIX.md +76 -0
- package/skills-library/patterns-standards/ORDERED_DETECTOR_PIPELINE_GRACEFUL_FALLBACK.md +333 -0
- package/skills-library/patterns-standards/PHASE_IMPORT_ERROR_DEBUGGING.md +271 -0
- package/skills-library/patterns-standards/PYNPUT_GLOBAL_HOTKEY_VK_MATCHING.md +252 -0
- package/skills-library/patterns-standards/REACT_USEEFFECT_CASCADE_RESET_FIX.md +132 -0
- package/skills-library/patterns-standards/SUBMENU_HOVER_DROPDOWN_PATTERN.md +225 -0
- package/skills-library/patterns-standards/TAILWIND_TEXT_VISIBILITY_OVERRIDE.md +322 -0
- package/skills-library/patterns-standards/THEME_AWARE_CSS_VARIABLES_PATTERN.md +209 -0
- package/skills-library/patterns-standards/THEME_USER_OBJECT_PROPERTY_NAMING.md +194 -0
- package/skills-library/patterns-standards/TOOLTIP_BLOCKING_CLICKS_FIX.md +267 -0
- package/skills-library/patterns-standards/claude-code-plugin-structure.md +235 -0
- package/skills-library/patterns-standards/react-i18next-setup.md +429 -0
- package/skills-library/patterns-standards/thesys-c1-generative-ui-integration.md +967 -0
- package/skills-library/plugin-development/CLAUDE_CODE_COMMAND_REGISTRATION_SILENT_FAILURE.md +315 -0
- package/skills-library/plugin-development/plugin-command-namespace-vs-global.md +390 -0
- package/skills-library/plugin-development/plugin-doc-auto-generation.md +172 -0
- package/skills-library/security/GITHUB_REPO_SECURITY_AUDIT.md +115 -0
- package/skills-library/security/admin-deletion-safety.md +396 -0
- package/skills-library/security/application-vuln-patterns.md +477 -0
- package/skills-library/security/env-secrets-manager.md +686 -0
- package/skills-library/security/secure-ai-application-templates.md +347 -0
- package/skills-library/security/sql-injection-prevention-postgresjs.md +151 -0
- package/skills-library/supabase-connection-pooler-fix.md +102 -0
- package/skills-library/system-context/POWERSHELL_BASH_INTEROP.md +82 -0
- package/skills-library/system-context/SERVICE_LIFECYCLE_MANAGEMENT.md +119 -0
- package/skills-library/system-context/SKILL.md +40 -0
- package/skills-library/system-context/WINDOWS_DEV_ENVIRONMENT.md +73 -0
- package/skills-library/testing/E2E_PLAYWRIGHT_PATTERNS.md +99 -0
- package/skills-library/testing/INTEGRATION_TEST_STRATEGY.md +82 -0
- package/skills-library/testing/RED_GREEN_BUGFIX_GATE.md +203 -0
- package/skills-library/testing/TEST_DATA_MANAGEMENT.md +69 -0
- package/skills-library/testing/VITEST_UNIT_TEST_PATTERNS.md +75 -0
- package/skills-library/testing/playwright-api-security-tests.md +202 -0
- package/skills-library/toolbox/SKILL.md +84 -0
- package/skills-library/toolbox/code-graph-and-web-scraping-mcps.md +237 -0
- package/skills-library/ui-ux-pro-max/ACCESSIBILITY_ESSENTIALS.md +115 -0
- package/skills-library/ui-ux-pro-max/DESIGN_SYSTEM_SCAFFOLDING.md +133 -0
- package/skills-library/ui-ux-pro-max/RESPONSIVE_LAYOUT_PATTERNS.md +119 -0
- package/skills-library/ui-ux-pro-max/SKILL.md +386 -0
- package/skills-library/ui-ux-pro-max/data/charts.csv +26 -0
- package/skills-library/ui-ux-pro-max/data/colors.csv +97 -0
- package/skills-library/ui-ux-pro-max/data/icons.csv +101 -0
- package/skills-library/ui-ux-pro-max/data/landing.csv +31 -0
- package/skills-library/ui-ux-pro-max/data/products.csv +97 -0
- package/skills-library/ui-ux-pro-max/data/react-performance.csv +45 -0
- package/skills-library/ui-ux-pro-max/data/stacks/astro.csv +54 -0
- package/skills-library/ui-ux-pro-max/data/stacks/flutter.csv +53 -0
- package/skills-library/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -0
- package/skills-library/ui-ux-pro-max/data/stacks/jetpack-compose.csv +53 -0
- package/skills-library/ui-ux-pro-max/data/stacks/nextjs.csv +53 -0
- package/skills-library/ui-ux-pro-max/data/stacks/nuxt-ui.csv +51 -0
- package/skills-library/ui-ux-pro-max/data/stacks/nuxtjs.csv +59 -0
- package/skills-library/ui-ux-pro-max/data/stacks/react-native.csv +52 -0
- package/skills-library/ui-ux-pro-max/data/stacks/react.csv +54 -0
- package/skills-library/ui-ux-pro-max/data/stacks/shadcn.csv +61 -0
- package/skills-library/ui-ux-pro-max/data/stacks/svelte.csv +54 -0
- package/skills-library/ui-ux-pro-max/data/stacks/swiftui.csv +51 -0
- package/skills-library/ui-ux-pro-max/data/stacks/vue.csv +50 -0
- package/skills-library/ui-ux-pro-max/data/styles.csv +68 -0
- package/skills-library/ui-ux-pro-max/data/typography.csv +58 -0
- package/skills-library/ui-ux-pro-max/data/ui-reasoning.csv +101 -0
- package/skills-library/ui-ux-pro-max/data/ux-guidelines.csv +100 -0
- package/skills-library/ui-ux-pro-max/data/web-interface.csv +31 -0
- package/skills-library/wordpress-style-theme-components.md +1526 -0
- package/templates/ASSUMPTIONS.md +1 -1
- package/templates/DECISION_LOG.md +0 -1
- package/templates/phase-prompt.md +1 -1
- package/templates/phoenix-comparison.md +6 -6
- package/templates/skill-api-integration.md +106 -0
- package/templates/skill-architecture-pattern.md +92 -0
- package/templates/skill-debug-pattern.md +98 -0
- package/templates/skill-devops-recipe.md +107 -0
- package/templates/skill-general.md +65 -0
- package/templates/skill-ui-component.md +113 -0
- package/version.json +7 -3
- package/workflows/handoff-session.md +2 -2
- package/workflows/new-project.md +2 -2
- package/workflows/plan-phase.md +1 -1
- package/.claude-plugin/plugin.json +0 -64
- package/skills-library/_general/methodology/LIVE_BREADCRUMB_PROTOCOL.md +0 -242
- package/skills-library/_general/methodology/llm-judge-memory-crud.md +0 -241
- package/skills-library/methodology/REFLEXION_MEMORY_PATTERN.md +0 -183
- package/skills-library/methodology/RESEARCH_BACKED_WORKFLOW_UPGRADE.md +0 -263
- package/skills-library/methodology/SABBATH_REST_PATTERN.md +0 -267
- package/skills-library/methodology/STONE_AND_SCAFFOLD.md +0 -220
- package/skills-library/specialists/api-architecture/api-designer.md +0 -49
- package/skills-library/specialists/api-architecture/graphql-architect.md +0 -49
- package/skills-library/specialists/api-architecture/mcp-developer.md +0 -51
- package/skills-library/specialists/api-architecture/microservices-architect.md +0 -50
- package/skills-library/specialists/api-architecture/websocket-engineer.md +0 -48
- package/skills-library/specialists/backend/django-expert.md +0 -52
- package/skills-library/specialists/backend/fastapi-expert.md +0 -52
- package/skills-library/specialists/backend/laravel-specialist.md +0 -52
- package/skills-library/specialists/backend/nestjs-expert.md +0 -51
- package/skills-library/specialists/backend/rails-expert.md +0 -53
- package/skills-library/specialists/backend/spring-boot-engineer.md +0 -56
- package/skills-library/specialists/data-ml/fine-tuning-expert.md +0 -48
- package/skills-library/specialists/data-ml/ml-pipeline.md +0 -47
- package/skills-library/specialists/data-ml/pandas-pro.md +0 -47
- package/skills-library/specialists/data-ml/rag-architect.md +0 -51
- package/skills-library/specialists/data-ml/spark-engineer.md +0 -47
- package/skills-library/specialists/frontend/angular-architect.md +0 -52
- package/skills-library/specialists/frontend/flutter-expert.md +0 -51
- package/skills-library/specialists/frontend/nextjs-developer.md +0 -54
- package/skills-library/specialists/frontend/react-native-expert.md +0 -50
- package/skills-library/specialists/frontend/vue-expert.md +0 -51
- package/skills-library/specialists/infrastructure/chaos-engineer.md +0 -74
- package/skills-library/specialists/infrastructure/cloud-architect.md +0 -70
- package/skills-library/specialists/infrastructure/database-optimizer.md +0 -64
- package/skills-library/specialists/infrastructure/devops-engineer.md +0 -70
- package/skills-library/specialists/infrastructure/kubernetes-specialist.md +0 -52
- package/skills-library/specialists/infrastructure/monitoring-expert.md +0 -70
- package/skills-library/specialists/infrastructure/sre-engineer.md +0 -70
- package/skills-library/specialists/infrastructure/terraform-engineer.md +0 -51
- package/skills-library/specialists/languages/cpp-pro.md +0 -74
- package/skills-library/specialists/languages/csharp-developer.md +0 -69
- package/skills-library/specialists/languages/dotnet-core-expert.md +0 -54
- package/skills-library/specialists/languages/golang-pro.md +0 -51
- package/skills-library/specialists/languages/java-architect.md +0 -49
- package/skills-library/specialists/languages/javascript-pro.md +0 -68
- package/skills-library/specialists/languages/kotlin-specialist.md +0 -68
- package/skills-library/specialists/languages/php-pro.md +0 -49
- package/skills-library/specialists/languages/python-pro.md +0 -52
- package/skills-library/specialists/languages/react-expert.md +0 -51
- package/skills-library/specialists/languages/rust-engineer.md +0 -50
- package/skills-library/specialists/languages/sql-pro.md +0 -56
- package/skills-library/specialists/languages/swift-expert.md +0 -69
- package/skills-library/specialists/languages/typescript-pro.md +0 -51
- package/skills-library/specialists/platform/atlassian-mcp.md +0 -52
- package/skills-library/specialists/platform/embedded-systems.md +0 -53
- package/skills-library/specialists/platform/game-developer.md +0 -53
- package/skills-library/specialists/platform/salesforce-developer.md +0 -53
- package/skills-library/specialists/platform/shopify-expert.md +0 -49
- package/skills-library/specialists/platform/wordpress-pro.md +0 -49
- package/skills-library/specialists/quality/browser-use-expert.md +0 -210
- package/skills-library/specialists/quality/code-documenter.md +0 -51
- package/skills-library/specialists/quality/code-reviewer.md +0 -67
- package/skills-library/specialists/quality/debugging-wizard.md +0 -51
- package/skills-library/specialists/quality/fullstack-guardian.md +0 -51
- package/skills-library/specialists/quality/legacy-modernizer.md +0 -50
- package/skills-library/specialists/quality/playwright-expert.md +0 -65
- package/skills-library/specialists/quality/spec-miner.md +0 -56
- package/skills-library/specialists/quality/test-master.md +0 -65
- package/skills-library/specialists/security/secure-code-guardian.md +0 -55
- package/skills-library/specialists/security/security-reviewer.md +0 -53
- package/skills-library/specialists/workflow/architecture-designer.md +0 -53
- package/skills-library/specialists/workflow/cli-developer.md +0 -70
- package/skills-library/specialists/workflow/feature-forge.md +0 -65
- package/skills-library/specialists/workflow/prompt-engineer.md +0 -54
- package/skills-library/specialists/workflow/the-fool.md +0 -62
- /package/skills-library/{performance → _general/performance}/cache-augmented-generation.md +0 -0
- /package/skills-library/{debugging → parallel-debug}/FAILURE_TAXONOMY_CLASSIFICATION.md +0 -0
- /package/skills-library/{debugging → parallel-debug}/THREE_AGENT_HYPOTHESIS_DEBUGGING.md +0 -0
|
@@ -0,0 +1,686 @@
|
|
|
1
|
+
# Env & Secrets Manager
|
|
2
|
+
|
|
3
|
+
**Tier:** POWERFUL
|
|
4
|
+
**Category:** Engineering
|
|
5
|
+
**Domain:** Security / DevOps / Configuration Management
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Overview
|
|
10
|
+
|
|
11
|
+
Complete environment and secrets management workflow: .env file lifecycle across dev/staging/prod,
|
|
12
|
+
.env.example auto-generation, required-var validation, secret leak detection in git history, and
|
|
13
|
+
credential rotation playbook. Integrates with HashiCorp Vault, AWS SSM, 1Password CLI, and Doppler.
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## Core Capabilities
|
|
18
|
+
|
|
19
|
+
- **.env lifecycle** — create, validate, sync across environments
|
|
20
|
+
- **.env.example generation** — strip values, preserve keys and comments
|
|
21
|
+
- **Validation script** — fail-fast on missing required vars at startup
|
|
22
|
+
- **Secret leak detection** — regex scan of git history and working tree
|
|
23
|
+
- **Rotation workflow** — detect → scope → rotate → deploy → verify
|
|
24
|
+
- **Secret manager integrations** — Vault KV v2, AWS SSM, 1Password, Doppler
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## When to Use
|
|
29
|
+
|
|
30
|
+
- Setting up a new project — scaffold .env.example and validation
|
|
31
|
+
- Before every commit — scan for accidentally staged secrets
|
|
32
|
+
- Post-incident response — leaked credential rotation procedure
|
|
33
|
+
- Onboarding new developers — they need all vars, not just some
|
|
34
|
+
- Environment drift investigation — prod behaving differently from staging
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
|
|
38
|
+
## .env File Structure
|
|
39
|
+
|
|
40
|
+
### Canonical Layout
|
|
41
|
+
```bash
|
|
42
|
+
# .env.example — committed to git (no values)
|
|
43
|
+
# .env.local — developer machine (gitignored)
|
|
44
|
+
# .env.staging — CI/CD or secret manager reference
|
|
45
|
+
# .env.prod — never on disk; pulled from secret manager at runtime
|
|
46
|
+
|
|
47
|
+
# Application
|
|
48
|
+
APP_NAME=
|
|
49
|
+
APP_ENV= # dev | staging | prod
|
|
50
|
+
APP_PORT=3000 # default port if not set
|
|
51
|
+
APP_SECRET= # REQUIRED: JWT signing secret (min 32 chars)
|
|
52
|
+
APP_URL= # REQUIRED: public base URL
|
|
53
|
+
|
|
54
|
+
# Database
|
|
55
|
+
DATABASE_URL= # REQUIRED: full connection string
|
|
56
|
+
DATABASE_POOL_MIN=2
|
|
57
|
+
DATABASE_POOL_MAX=10
|
|
58
|
+
|
|
59
|
+
# Auth
|
|
60
|
+
AUTH_JWT_SECRET= # REQUIRED
|
|
61
|
+
AUTH_JWT_EXPIRY=3600 # seconds
|
|
62
|
+
AUTH_REFRESH_SECRET= # REQUIRED
|
|
63
|
+
|
|
64
|
+
# Third-party APIs
|
|
65
|
+
STRIPE_SECRET_KEY= # REQUIRED in prod
|
|
66
|
+
STRIPE_WEBHOOK_SECRET= # REQUIRED in prod
|
|
67
|
+
SENDGRID_API_KEY=
|
|
68
|
+
|
|
69
|
+
# Storage
|
|
70
|
+
AWS_ACCESS_KEY_ID=
|
|
71
|
+
AWS_SECRET_ACCESS_KEY=
|
|
72
|
+
AWS_REGION=eu-central-1
|
|
73
|
+
AWS_S3_BUCKET=
|
|
74
|
+
|
|
75
|
+
# Monitoring
|
|
76
|
+
SENTRY_DSN=
|
|
77
|
+
DD_API_KEY=
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
---
|
|
81
|
+
|
|
82
|
+
## .gitignore Patterns
|
|
83
|
+
|
|
84
|
+
Add to your project's `.gitignore`:
|
|
85
|
+
|
|
86
|
+
```gitignore
|
|
87
|
+
# Environment files — NEVER commit these
|
|
88
|
+
.env
|
|
89
|
+
.env.local
|
|
90
|
+
.env.development
|
|
91
|
+
.env.development.local
|
|
92
|
+
.env.test.local
|
|
93
|
+
.env.staging
|
|
94
|
+
.env.staging.local
|
|
95
|
+
.env.production
|
|
96
|
+
.env.production.local
|
|
97
|
+
.env.prod
|
|
98
|
+
.env.*.local
|
|
99
|
+
|
|
100
|
+
# Secret files
|
|
101
|
+
*.pem
|
|
102
|
+
*.key
|
|
103
|
+
*.p12
|
|
104
|
+
*.pfx
|
|
105
|
+
secrets.json
|
|
106
|
+
secrets.yaml
|
|
107
|
+
secrets.yml
|
|
108
|
+
credentials.json
|
|
109
|
+
service-account.json
|
|
110
|
+
|
|
111
|
+
# AWS
|
|
112
|
+
.aws/credentials
|
|
113
|
+
|
|
114
|
+
# Terraform state (may contain secrets)
|
|
115
|
+
*.tfstate
|
|
116
|
+
*.tfstate.backup
|
|
117
|
+
.terraform/
|
|
118
|
+
|
|
119
|
+
# Kubernetes secrets
|
|
120
|
+
*-secret.yaml
|
|
121
|
+
*-secrets.yaml
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
---
|
|
125
|
+
|
|
126
|
+
## .env.example Auto-Generation
|
|
127
|
+
|
|
128
|
+
```bash
|
|
129
|
+
#!/bin/bash
|
|
130
|
+
# scripts/gen-env-example.sh
|
|
131
|
+
# Strips values from .env, preserves keys, defaults, and comments
|
|
132
|
+
|
|
133
|
+
INPUT="${1:-.env}"
|
|
134
|
+
OUTPUT="${2:-.env.example}"
|
|
135
|
+
|
|
136
|
+
if [ ! -f "$INPUT" ]; then
|
|
137
|
+
echo "ERROR: $INPUT not found"
|
|
138
|
+
exit 1
|
|
139
|
+
fi
|
|
140
|
+
|
|
141
|
+
python3 - "$INPUT" "$OUTPUT" << 'PYEOF'
|
|
142
|
+
import sys, re
|
|
143
|
+
|
|
144
|
+
input_file = sys.argv[1]
|
|
145
|
+
output_file = sys.argv[2]
|
|
146
|
+
lines = []
|
|
147
|
+
|
|
148
|
+
with open(input_file) as f:
|
|
149
|
+
for line in f:
|
|
150
|
+
stripped = line.rstrip('\n')
|
|
151
|
+
# Keep blank lines and comments as-is
|
|
152
|
+
if stripped == '' or stripped.startswith('#'):
|
|
153
|
+
lines.append(stripped)
|
|
154
|
+
continue
|
|
155
|
+
# Match KEY=VALUE or KEY="VALUE"
|
|
156
|
+
m = re.match(r'^([A-Z_][A-Z0-9_]*)=(.*)$', stripped)
|
|
157
|
+
if m:
|
|
158
|
+
key = m.group(1)
|
|
159
|
+
value = m.group(2).strip('"\'')
|
|
160
|
+
# Keep non-sensitive defaults (ports, regions, feature flags)
|
|
161
|
+
safe_defaults = re.compile(
|
|
162
|
+
r'^(APP_PORT|APP_ENV|APP_NAME|AWS_REGION|DATABASE_POOL_|LOG_LEVEL|'
|
|
163
|
+
r'FEATURE_|CACHE_TTL|RATE_LIMIT_|PAGINATION_|TIMEOUT_)',
|
|
164
|
+
re.I
|
|
165
|
+
)
|
|
166
|
+
sensitive = re.compile(
|
|
167
|
+
r'(SECRET|KEY|TOKEN|PASSWORD|PASS|CREDENTIAL|DSN|AUTH|PRIVATE|CERT)',
|
|
168
|
+
re.I
|
|
169
|
+
)
|
|
170
|
+
if safe_defaults.match(key) and value:
|
|
171
|
+
lines.append(f"{key}={value} # default")
|
|
172
|
+
else:
|
|
173
|
+
lines.append(f"{key}=")
|
|
174
|
+
else:
|
|
175
|
+
lines.append(stripped)
|
|
176
|
+
|
|
177
|
+
with open(output_file, 'w') as f:
|
|
178
|
+
f.write('\n'.join(lines) + '\n')
|
|
179
|
+
|
|
180
|
+
print(f"Generated {output_file} from {input_file}")
|
|
181
|
+
PYEOF
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
Usage:
|
|
185
|
+
```bash
|
|
186
|
+
bash scripts/gen-env-example.sh .env .env.example
|
|
187
|
+
# Commit .env.example, never .env
|
|
188
|
+
git add .env.example
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
---
|
|
192
|
+
|
|
193
|
+
## Required Variable Validation Script
|
|
194
|
+
|
|
195
|
+
```bash
|
|
196
|
+
#!/bin/bash
|
|
197
|
+
# scripts/validate-env.sh
|
|
198
|
+
# Run at app startup or in CI before deploy
|
|
199
|
+
# Exit 1 if any required var is missing or empty
|
|
200
|
+
|
|
201
|
+
set -euo pipefail
|
|
202
|
+
|
|
203
|
+
MISSING=()
|
|
204
|
+
WARNINGS=()
|
|
205
|
+
|
|
206
|
+
# --- Define required vars by environment ---
|
|
207
|
+
ALWAYS_REQUIRED=(
|
|
208
|
+
APP_SECRET
|
|
209
|
+
APP_URL
|
|
210
|
+
DATABASE_URL
|
|
211
|
+
AUTH_JWT_SECRET
|
|
212
|
+
AUTH_REFRESH_SECRET
|
|
213
|
+
)
|
|
214
|
+
|
|
215
|
+
PROD_REQUIRED=(
|
|
216
|
+
STRIPE_SECRET_KEY
|
|
217
|
+
STRIPE_WEBHOOK_SECRET
|
|
218
|
+
SENTRY_DSN
|
|
219
|
+
)
|
|
220
|
+
|
|
221
|
+
# --- Check always-required vars ---
|
|
222
|
+
for var in "${ALWAYS_REQUIRED[@]}"; do
|
|
223
|
+
if [ -z "${!var:-}" ]; then
|
|
224
|
+
MISSING+=("$var")
|
|
225
|
+
fi
|
|
226
|
+
done
|
|
227
|
+
|
|
228
|
+
# --- Check prod-only vars ---
|
|
229
|
+
if [ "${APP_ENV:-}" = "production" ] || [ "${NODE_ENV:-}" = "production" ]; then
|
|
230
|
+
for var in "${PROD_REQUIRED[@]}"; do
|
|
231
|
+
if [ -z "${!var:-}" ]; then
|
|
232
|
+
MISSING+=("$var (required in production)")
|
|
233
|
+
fi
|
|
234
|
+
done
|
|
235
|
+
fi
|
|
236
|
+
|
|
237
|
+
# --- Validate format/length constraints ---
|
|
238
|
+
if [ -n "${AUTH_JWT_SECRET:-}" ] && [ ${#AUTH_JWT_SECRET} -lt 32 ]; then
|
|
239
|
+
WARNINGS+=("AUTH_JWT_SECRET is shorter than 32 chars — insecure")
|
|
240
|
+
fi
|
|
241
|
+
|
|
242
|
+
if [ -n "${DATABASE_URL:-}" ]; then
|
|
243
|
+
if ! echo "$DATABASE_URL" | grep -qE "^(postgres|postgresql|mysql|mongodb|redis)://"; then
|
|
244
|
+
WARNINGS+=("DATABASE_URL doesn't look like a valid connection string")
|
|
245
|
+
fi
|
|
246
|
+
fi
|
|
247
|
+
|
|
248
|
+
if [ -n "${APP_PORT:-}" ]; then
|
|
249
|
+
if ! [[ "$APP_PORT" =~ ^[0-9]+$ ]] || [ "$APP_PORT" -lt 1 ] || [ "$APP_PORT" -gt 65535 ]; then
|
|
250
|
+
WARNINGS+=("APP_PORT=$APP_PORT is not a valid port number")
|
|
251
|
+
fi
|
|
252
|
+
fi
|
|
253
|
+
|
|
254
|
+
# --- Report ---
|
|
255
|
+
if [ ${#WARNINGS[@]} -gt 0 ]; then
|
|
256
|
+
echo "WARNINGS:"
|
|
257
|
+
for w in "${WARNINGS[@]}"; do
|
|
258
|
+
echo " ⚠️ $w"
|
|
259
|
+
done
|
|
260
|
+
fi
|
|
261
|
+
|
|
262
|
+
if [ ${#MISSING[@]} -gt 0 ]; then
|
|
263
|
+
echo ""
|
|
264
|
+
echo "FATAL: Missing required environment variables:"
|
|
265
|
+
for var in "${MISSING[@]}"; do
|
|
266
|
+
echo " ❌ $var"
|
|
267
|
+
done
|
|
268
|
+
echo ""
|
|
269
|
+
echo "Copy .env.example to .env and fill in missing values."
|
|
270
|
+
exit 1
|
|
271
|
+
fi
|
|
272
|
+
|
|
273
|
+
echo "✅ All required environment variables are set"
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
Node.js equivalent:
|
|
277
|
+
```typescript
|
|
278
|
+
// src/config/validateEnv.ts
|
|
279
|
+
const required = [
|
|
280
|
+
'APP_SECRET', 'APP_URL', 'DATABASE_URL',
|
|
281
|
+
'AUTH_JWT_SECRET', 'AUTH_REFRESH_SECRET',
|
|
282
|
+
]
|
|
283
|
+
|
|
284
|
+
const missing = required.filter(key => !process.env[key])
|
|
285
|
+
|
|
286
|
+
if (missing.length > 0) {
|
|
287
|
+
console.error('FATAL: Missing required environment variables:', missing)
|
|
288
|
+
process.exit(1)
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
if (process.env.AUTH_JWT_SECRET && process.env.AUTH_JWT_SECRET.length < 32) {
|
|
292
|
+
console.error('FATAL: AUTH_JWT_SECRET must be at least 32 characters')
|
|
293
|
+
process.exit(1)
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
export const config = {
|
|
297
|
+
appSecret: process.env.APP_SECRET!,
|
|
298
|
+
appUrl: process.env.APP_URL!,
|
|
299
|
+
databaseUrl: process.env.DATABASE_URL!,
|
|
300
|
+
jwtSecret: process.env.AUTH_JWT_SECRET!,
|
|
301
|
+
refreshSecret: process.env.AUTH_REFRESH_SECRET!,
|
|
302
|
+
stripeKey: process.env.STRIPE_SECRET_KEY, // optional
|
|
303
|
+
port: parseInt(process.env.APP_PORT ?? '3000', 10),
|
|
304
|
+
} as const
|
|
305
|
+
```
|
|
306
|
+
|
|
307
|
+
---
|
|
308
|
+
|
|
309
|
+
## Secret Leak Detection
|
|
310
|
+
|
|
311
|
+
### Scan Working Tree
|
|
312
|
+
```bash
|
|
313
|
+
#!/bin/bash
|
|
314
|
+
# scripts/scan-secrets.sh
|
|
315
|
+
# Scan staged files and working tree for common secret patterns
|
|
316
|
+
|
|
317
|
+
FAIL=0
|
|
318
|
+
|
|
319
|
+
check() {
|
|
320
|
+
local label="$1"
|
|
321
|
+
local pattern="$2"
|
|
322
|
+
local matches
|
|
323
|
+
|
|
324
|
+
matches=$(git diff --cached -U0 2>/dev/null | grep "^+" | grep -vE "^(\+\+\+|#|\/\/)" | \
|
|
325
|
+
grep -E "$pattern" | grep -v ".env.example" | grep -v "test\|mock\|fixture\|fake" || true)
|
|
326
|
+
|
|
327
|
+
if [ -n "$matches" ]; then
|
|
328
|
+
echo "SECRET DETECTED [$label]:"
|
|
329
|
+
echo "$matches" | head -5
|
|
330
|
+
FAIL=1
|
|
331
|
+
fi
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
# AWS Access Keys
|
|
335
|
+
check "AWS Access Key" "AKIA[0-9A-Z]{16}"
|
|
336
|
+
check "AWS Secret Key" "aws_secret_access_key\s*=\s*['\"]?[A-Za-z0-9/+]{40}"
|
|
337
|
+
|
|
338
|
+
# Stripe
|
|
339
|
+
check "Stripe Live Key" "sk_live_[0-9a-zA-Z]{24,}"
|
|
340
|
+
check "Stripe Test Key" "sk_test_[0-9a-zA-Z]{24,}"
|
|
341
|
+
check "Stripe Webhook" "whsec_[0-9a-zA-Z]{32,}"
|
|
342
|
+
|
|
343
|
+
# JWT / Generic secrets
|
|
344
|
+
check "Hardcoded JWT" "eyJ[A-Za-z0-9_-]{20,}\.[A-Za-z0-9_-]{20,}"
|
|
345
|
+
check "Generic Secret" "(secret|password|passwd|api_key|apikey|token)\s*[:=]\s*['\"][^'\"]{12,}['\"]"
|
|
346
|
+
|
|
347
|
+
# Private keys
|
|
348
|
+
check "Private Key Block" "-----BEGIN (RSA |EC |DSA |OPENSSH )?PRIVATE KEY-----"
|
|
349
|
+
check "PEM Certificate" "-----BEGIN CERTIFICATE-----"
|
|
350
|
+
|
|
351
|
+
# Connection strings with credentials
|
|
352
|
+
check "DB Connection" "(postgres|mysql|mongodb)://[^:]+:[^@]+@"
|
|
353
|
+
check "Redis Auth" "redis://:[^@]+@\|rediss://:[^@]+@"
|
|
354
|
+
|
|
355
|
+
# Google
|
|
356
|
+
check "Google API Key" "AIza[0-9A-Za-z_-]{35}"
|
|
357
|
+
check "Google OAuth" "[0-9]+-[0-9A-Za-z_]{32}\.apps\.googleusercontent\.com"
|
|
358
|
+
|
|
359
|
+
# GitHub
|
|
360
|
+
check "GitHub Token" "gh[ps]_[A-Za-z0-9]{36,}"
|
|
361
|
+
check "GitHub Fine-grained" "github_pat_[A-Za-z0-9_]{82}"
|
|
362
|
+
|
|
363
|
+
# Slack
|
|
364
|
+
check "Slack Token" "xox[baprs]-[0-9A-Za-z]{10,}"
|
|
365
|
+
check "Slack Webhook" "https://hooks\.slack\.com/services/[A-Z0-9]{9,}/[A-Z0-9]{9,}/[A-Za-z0-9]{24,}"
|
|
366
|
+
|
|
367
|
+
# Twilio
|
|
368
|
+
check "Twilio SID" "AC[a-z0-9]{32}"
|
|
369
|
+
check "Twilio Token" "SK[a-z0-9]{32}"
|
|
370
|
+
|
|
371
|
+
if [ $FAIL -eq 1 ]; then
|
|
372
|
+
echo ""
|
|
373
|
+
echo "BLOCKED: Secrets detected in staged changes."
|
|
374
|
+
echo "Remove secrets before committing. Use environment variables instead."
|
|
375
|
+
echo "If this is a false positive, add it to .secretsignore or use:"
|
|
376
|
+
echo " git commit --no-verify (only if you're 100% certain it's safe)"
|
|
377
|
+
exit 1
|
|
378
|
+
fi
|
|
379
|
+
|
|
380
|
+
echo "No secrets detected in staged changes."
|
|
381
|
+
```
|
|
382
|
+
|
|
383
|
+
### Scan Git History (post-incident)
|
|
384
|
+
```bash
|
|
385
|
+
#!/bin/bash
|
|
386
|
+
# scripts/scan-history.sh — scan entire git history for leaked secrets
|
|
387
|
+
|
|
388
|
+
PATTERNS=(
|
|
389
|
+
"AKIA[0-9A-Z]{16}"
|
|
390
|
+
"sk_live_[0-9a-zA-Z]{24}"
|
|
391
|
+
"sk_test_[0-9a-zA-Z]{24}"
|
|
392
|
+
"-----BEGIN.*PRIVATE KEY-----"
|
|
393
|
+
"AIza[0-9A-Za-z_-]{35}"
|
|
394
|
+
"ghp_[A-Za-z0-9]{36}"
|
|
395
|
+
"xox[baprs]-[0-9A-Za-z]{10,}"
|
|
396
|
+
)
|
|
397
|
+
|
|
398
|
+
for pattern in "${PATTERNS[@]}"; do
|
|
399
|
+
echo "Scanning for: $pattern"
|
|
400
|
+
git log --all -p --no-color 2>/dev/null | \
|
|
401
|
+
grep -n "$pattern" | \
|
|
402
|
+
grep "^+" | \
|
|
403
|
+
grep -v "^+++" | \
|
|
404
|
+
head -10
|
|
405
|
+
done
|
|
406
|
+
|
|
407
|
+
# Alternative: use truffleHog or gitleaks for comprehensive scanning
|
|
408
|
+
# gitleaks detect --source . --log-opts="--all"
|
|
409
|
+
# trufflehog git file://. --only-verified
|
|
410
|
+
```
|
|
411
|
+
|
|
412
|
+
---
|
|
413
|
+
|
|
414
|
+
## Pre-commit Hook Installation
|
|
415
|
+
|
|
416
|
+
```bash
|
|
417
|
+
#!/bin/bash
|
|
418
|
+
# Install the pre-commit hook
|
|
419
|
+
HOOK_PATH=".git/hooks/pre-commit"
|
|
420
|
+
|
|
421
|
+
cat > "$HOOK_PATH" << 'HOOK'
|
|
422
|
+
#!/bin/bash
|
|
423
|
+
# Pre-commit: scan for secrets before every commit
|
|
424
|
+
|
|
425
|
+
SCRIPT="scripts/scan-secrets.sh"
|
|
426
|
+
|
|
427
|
+
if [ -f "$SCRIPT" ]; then
|
|
428
|
+
bash "$SCRIPT"
|
|
429
|
+
else
|
|
430
|
+
# Inline fallback if script not present
|
|
431
|
+
if git diff --cached -U0 | grep "^+" | grep -qE "AKIA[0-9A-Z]{16}|sk_live_|-----BEGIN.*PRIVATE KEY"; then
|
|
432
|
+
echo "BLOCKED: Possible secret detected in staged changes."
|
|
433
|
+
exit 1
|
|
434
|
+
fi
|
|
435
|
+
fi
|
|
436
|
+
HOOK
|
|
437
|
+
|
|
438
|
+
chmod +x "$HOOK_PATH"
|
|
439
|
+
echo "Pre-commit hook installed at $HOOK_PATH"
|
|
440
|
+
```
|
|
441
|
+
|
|
442
|
+
Using `pre-commit` framework (recommended for teams):
|
|
443
|
+
```yaml
|
|
444
|
+
# .pre-commit-config.yaml
|
|
445
|
+
repos:
|
|
446
|
+
- repo: https://github.com/gitleaks/gitleaks
|
|
447
|
+
rev: v8.18.0
|
|
448
|
+
hooks:
|
|
449
|
+
- id: gitleaks
|
|
450
|
+
|
|
451
|
+
- repo: local
|
|
452
|
+
hooks:
|
|
453
|
+
- id: validate-env-example
|
|
454
|
+
name: Check .env.example is up to date
|
|
455
|
+
language: script
|
|
456
|
+
entry: bash scripts/check-env-example.sh
|
|
457
|
+
pass_filenames: false
|
|
458
|
+
```
|
|
459
|
+
|
|
460
|
+
---
|
|
461
|
+
|
|
462
|
+
## Credential Rotation Workflow
|
|
463
|
+
|
|
464
|
+
When a secret is leaked or compromised:
|
|
465
|
+
|
|
466
|
+
### Step 1 — Detect & Confirm
|
|
467
|
+
```bash
|
|
468
|
+
# Confirm which secret was exposed
|
|
469
|
+
git log --all -p --no-color | grep -A2 -B2 "AKIA\|sk_live_\|SECRET"
|
|
470
|
+
|
|
471
|
+
# Check if secret is in any open PRs
|
|
472
|
+
gh pr list --state open | while read pr; do
|
|
473
|
+
gh pr diff $(echo $pr | awk '{print $1}') | grep -E "AKIA|sk_live_" && echo "Found in PR: $pr"
|
|
474
|
+
done
|
|
475
|
+
```
|
|
476
|
+
|
|
477
|
+
### Step 2 — Identify Exposure Window
|
|
478
|
+
```bash
|
|
479
|
+
# Find first commit that introduced the secret
|
|
480
|
+
git log --all -p --no-color -- "*.env" "*.json" "*.yaml" "*.ts" "*.py" | \
|
|
481
|
+
grep -B 10 "THE_LEAKED_VALUE" | grep "^commit" | tail -1
|
|
482
|
+
|
|
483
|
+
# Get commit date
|
|
484
|
+
git show --format="%ci" COMMIT_HASH | head -1
|
|
485
|
+
|
|
486
|
+
# Check if secret appears in public repos (GitHub)
|
|
487
|
+
gh api search/code -X GET -f q="THE_LEAKED_VALUE" | jq '.total_count, .items[].html_url'
|
|
488
|
+
```
|
|
489
|
+
|
|
490
|
+
### Step 3 — Rotate Credential
|
|
491
|
+
Per service — rotate immediately:
|
|
492
|
+
- **AWS**: IAM console → delete access key → create new → update everywhere
|
|
493
|
+
- **Stripe**: Dashboard → Developers → API keys → Roll key
|
|
494
|
+
- **GitHub PAT**: Settings → Developer Settings → Personal access tokens → Revoke → Create new
|
|
495
|
+
- **DB password**: `ALTER USER app_user PASSWORD 'new-strong-password-here';`
|
|
496
|
+
- **JWT secret**: Rotate key (all existing sessions invalidated — users re-login)
|
|
497
|
+
|
|
498
|
+
### Step 4 — Update All Environments
|
|
499
|
+
```bash
|
|
500
|
+
# Update secret manager (source of truth)
|
|
501
|
+
# Then redeploy to pull new values
|
|
502
|
+
|
|
503
|
+
# Vault KV v2
|
|
504
|
+
vault kv put secret/myapp/prod \
|
|
505
|
+
STRIPE_SECRET_KEY="sk_live_NEW..." \
|
|
506
|
+
APP_SECRET="new-secret-here"
|
|
507
|
+
|
|
508
|
+
# AWS SSM
|
|
509
|
+
aws ssm put-parameter \
|
|
510
|
+
--name "/myapp/prod/STRIPE_SECRET_KEY" \
|
|
511
|
+
--value "sk_live_NEW..." \
|
|
512
|
+
--type "SecureString" \
|
|
513
|
+
--overwrite
|
|
514
|
+
|
|
515
|
+
# 1Password
|
|
516
|
+
op item edit "MyApp Prod" \
|
|
517
|
+
--field "STRIPE_SECRET_KEY[password]=sk_live_NEW..."
|
|
518
|
+
|
|
519
|
+
# Doppler
|
|
520
|
+
doppler secrets set STRIPE_SECRET_KEY="sk_live_NEW..." --project myapp --config prod
|
|
521
|
+
```
|
|
522
|
+
|
|
523
|
+
### Step 5 — Remove from Git History
|
|
524
|
+
```bash
|
|
525
|
+
# WARNING: rewrites history — coordinate with team first
|
|
526
|
+
git filter-repo --path-glob "*.env" --invert-paths
|
|
527
|
+
|
|
528
|
+
# Or remove specific string from all commits
|
|
529
|
+
git filter-repo --replace-text <(echo "LEAKED_VALUE==>REDACTED")
|
|
530
|
+
|
|
531
|
+
# Force push all branches (requires team coordination + force push permissions)
|
|
532
|
+
git push origin --force --all
|
|
533
|
+
|
|
534
|
+
# Notify all developers to re-clone
|
|
535
|
+
```
|
|
536
|
+
|
|
537
|
+
### Step 6 — Verify
|
|
538
|
+
```bash
|
|
539
|
+
# Confirm secret no longer in history
|
|
540
|
+
git log --all -p | grep "LEAKED_VALUE" | wc -l # should be 0
|
|
541
|
+
|
|
542
|
+
# Test new credentials work
|
|
543
|
+
curl -H "Authorization: Bearer $NEW_TOKEN" https://api.service.com/test
|
|
544
|
+
|
|
545
|
+
# Monitor for unauthorized usage of old credential (check service audit logs)
|
|
546
|
+
```
|
|
547
|
+
|
|
548
|
+
---
|
|
549
|
+
|
|
550
|
+
## Secret Manager Integrations
|
|
551
|
+
|
|
552
|
+
### HashiCorp Vault KV v2
|
|
553
|
+
```bash
|
|
554
|
+
# Setup
|
|
555
|
+
export VAULT_ADDR="https://vault.internal.company.com"
|
|
556
|
+
export VAULT_TOKEN="$(vault login -method=oidc -format=json | jq -r '.auth.client_token')"
|
|
557
|
+
|
|
558
|
+
# Write secrets
|
|
559
|
+
vault kv put secret/myapp/prod \
|
|
560
|
+
DATABASE_URL="postgres://user:pass@host/db" \
|
|
561
|
+
APP_SECRET="$(openssl rand -base64 32)"
|
|
562
|
+
|
|
563
|
+
# Read secrets into env
|
|
564
|
+
eval $(vault kv get -format=json secret/myapp/prod | \
|
|
565
|
+
jq -r '.data.data | to_entries[] | "export \(.key)=\(.value)"')
|
|
566
|
+
|
|
567
|
+
# In CI/CD (GitHub Actions)
|
|
568
|
+
# Use vault-action: hashicorp/vault-action@v2
|
|
569
|
+
```
|
|
570
|
+
|
|
571
|
+
### AWS SSM Parameter Store
|
|
572
|
+
```bash
|
|
573
|
+
# Write (SecureString = encrypted with KMS)
|
|
574
|
+
aws ssm put-parameter \
|
|
575
|
+
--name "/myapp/prod/DATABASE_URL" \
|
|
576
|
+
--value "postgres://..." \
|
|
577
|
+
--type "SecureString" \
|
|
578
|
+
--key-id "alias/myapp-secrets"
|
|
579
|
+
|
|
580
|
+
# Read all params for an app/env into shell
|
|
581
|
+
eval $(aws ssm get-parameters-by-path \
|
|
582
|
+
--path "/myapp/prod/" \
|
|
583
|
+
--with-decryption \
|
|
584
|
+
--query "Parameters[*].[Name,Value]" \
|
|
585
|
+
--output text | \
|
|
586
|
+
awk '{split($1,a,"/"); print "export " a[length(a)] "=\"" $2 "\""}')
|
|
587
|
+
|
|
588
|
+
# In Node.js at startup
|
|
589
|
+
# Use @aws-sdk/client-ssm to pull params before server starts
|
|
590
|
+
```
|
|
591
|
+
|
|
592
|
+
### 1Password CLI
|
|
593
|
+
```bash
|
|
594
|
+
# Authenticate
|
|
595
|
+
eval $(op signin)
|
|
596
|
+
|
|
597
|
+
# Get a specific field
|
|
598
|
+
op read "op://MyVault/MyApp Prod/STRIPE_SECRET_KEY"
|
|
599
|
+
|
|
600
|
+
# Export all fields from an item as env vars
|
|
601
|
+
op item get "MyApp Prod" --format json | \
|
|
602
|
+
jq -r '.fields[] | select(.value != null) | "export \(.label)=\"\(.value)\""' | \
|
|
603
|
+
grep -E "^export [A-Z_]+" | source /dev/stdin
|
|
604
|
+
|
|
605
|
+
# .env injection
|
|
606
|
+
op inject -i .env.tpl -o .env
|
|
607
|
+
# .env.tpl uses {{ op://Vault/Item/field }} syntax
|
|
608
|
+
```
|
|
609
|
+
|
|
610
|
+
### Doppler
|
|
611
|
+
```bash
|
|
612
|
+
# Setup
|
|
613
|
+
doppler setup # interactive: select project + config
|
|
614
|
+
|
|
615
|
+
# Run any command with secrets injected
|
|
616
|
+
doppler run -- node server.js
|
|
617
|
+
doppler run -- npm run dev
|
|
618
|
+
|
|
619
|
+
# Export to .env (local dev only — never commit output)
|
|
620
|
+
doppler secrets download --no-file --format env > .env.local
|
|
621
|
+
|
|
622
|
+
# Pull specific secret
|
|
623
|
+
doppler secrets get DATABASE_URL --plain
|
|
624
|
+
|
|
625
|
+
# Sync to another environment
|
|
626
|
+
doppler secrets upload --project myapp --config staging < .env.staging.example
|
|
627
|
+
```
|
|
628
|
+
|
|
629
|
+
---
|
|
630
|
+
|
|
631
|
+
## Environment Drift Detection
|
|
632
|
+
|
|
633
|
+
Check if staging and prod have the same set of keys (values may differ):
|
|
634
|
+
|
|
635
|
+
```bash
|
|
636
|
+
#!/bin/bash
|
|
637
|
+
# scripts/check-env-drift.sh
|
|
638
|
+
|
|
639
|
+
# Pull key names from both environments (not values)
|
|
640
|
+
STAGING_KEYS=$(doppler secrets --project myapp --config staging --format json 2>/dev/null | \
|
|
641
|
+
jq -r 'keys[]' | sort)
|
|
642
|
+
PROD_KEYS=$(doppler secrets --project myapp --config prod --format json 2>/dev/null | \
|
|
643
|
+
jq -r 'keys[]' | sort)
|
|
644
|
+
|
|
645
|
+
ONLY_IN_STAGING=$(comm -23 <(echo "$STAGING_KEYS") <(echo "$PROD_KEYS"))
|
|
646
|
+
ONLY_IN_PROD=$(comm -13 <(echo "$STAGING_KEYS") <(echo "$PROD_KEYS"))
|
|
647
|
+
|
|
648
|
+
if [ -n "$ONLY_IN_STAGING" ]; then
|
|
649
|
+
echo "Keys in STAGING but NOT in PROD:"
|
|
650
|
+
echo "$ONLY_IN_STAGING" | sed 's/^/ /'
|
|
651
|
+
fi
|
|
652
|
+
|
|
653
|
+
if [ -n "$ONLY_IN_PROD" ]; then
|
|
654
|
+
echo "Keys in PROD but NOT in STAGING:"
|
|
655
|
+
echo "$ONLY_IN_PROD" | sed 's/^/ /'
|
|
656
|
+
fi
|
|
657
|
+
|
|
658
|
+
if [ -z "$ONLY_IN_STAGING" ] && [ -z "$ONLY_IN_PROD" ]; then
|
|
659
|
+
echo "✅ No env drift detected — staging and prod have identical key sets"
|
|
660
|
+
fi
|
|
661
|
+
```
|
|
662
|
+
|
|
663
|
+
---
|
|
664
|
+
|
|
665
|
+
## Common Pitfalls
|
|
666
|
+
|
|
667
|
+
- **Committing .env instead of .env.example** — add `.env` to .gitignore on day 1; use pre-commit hooks
|
|
668
|
+
- **Storing secrets in CI/CD logs** — never `echo $SECRET`; mask vars in CI settings
|
|
669
|
+
- **Rotating only one place** — secrets often appear in Heroku, Vercel, Docker, K8s, CI — update ALL
|
|
670
|
+
- **Forgetting to invalidate sessions after JWT secret rotation** — all users will be logged out; communicate this
|
|
671
|
+
- **Using .env.example with real values** — example files are public; strip everything sensitive
|
|
672
|
+
- **Not monitoring after rotation** — watch audit logs for 24h after rotation to catch unauthorized old-credential use
|
|
673
|
+
- **Weak secrets** — `APP_SECRET=mysecret` is not a secret. Use `openssl rand -base64 32`
|
|
674
|
+
|
|
675
|
+
---
|
|
676
|
+
|
|
677
|
+
## Best Practices
|
|
678
|
+
|
|
679
|
+
1. **Secret manager is source of truth** — .env files are for local dev only; never in prod
|
|
680
|
+
2. **Rotate on a schedule**, not just after incidents — quarterly minimum for long-lived keys
|
|
681
|
+
3. **Principle of least privilege** — each service gets its own API key with minimal permissions
|
|
682
|
+
4. **Audit access** — log every secret read in Vault/SSM; alert on anomalous access
|
|
683
|
+
5. **Never log secrets** — add log scrubbing middleware that redacts known secret patterns
|
|
684
|
+
6. **Use short-lived credentials** — prefer OIDC/instance roles over long-lived access keys
|
|
685
|
+
7. **Separate secrets per environment** — never share a key between dev and prod
|
|
686
|
+
8. **Document rotation runbooks** — before an incident, not during one
|