@thierrynakoa/fire-flow 12.2.1 → 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 -455
- package/TROUBLESHOOTING.md +264 -264
- 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-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 -24
- 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/tools/uat-runner.py +179 -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/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,203 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: env-file-management-production-local
|
|
3
|
+
category: deployment-security
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
contributed: 2026-01-24
|
|
6
|
+
contributor: my-other-project
|
|
7
|
+
last_updated: 2026-01-24
|
|
8
|
+
tags: [environment, dotenv, security, deployment, vite, production, secrets, mern]
|
|
9
|
+
difficulty: medium
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# Environment File Management: Production vs Local
|
|
13
|
+
|
|
14
|
+
## Problem
|
|
15
|
+
|
|
16
|
+
Production server uses wrong environment (e.g., TEST Stripe keys instead of LIVE keys). Common symptoms:
|
|
17
|
+
|
|
18
|
+
- Stripe checkout shows "TEST MODE" badge in production
|
|
19
|
+
- Checkout session URLs contain `cs_test_` instead of `cs_live_`
|
|
20
|
+
- Payment processors reject transactions
|
|
21
|
+
- API keys suddenly "stop working" after deployment
|
|
22
|
+
|
|
23
|
+
**Root Cause**: Developers assume `.env` files are deployed with git, but they are NOT tracked in version control. Production server's `.env` must be manually configured via SSH.
|
|
24
|
+
|
|
25
|
+
## Solution Pattern
|
|
26
|
+
|
|
27
|
+
### 1. File Structure (Server)
|
|
28
|
+
|
|
29
|
+
```
|
|
30
|
+
server/
|
|
31
|
+
├── .env # Current environment (NOT in git)
|
|
32
|
+
├── .env.local # Local dev overrides (NOT in git)
|
|
33
|
+
├── .env.productionbackup # Backup of prod config (NOT in git)
|
|
34
|
+
├── .env.localbackup # Backup of local config (NOT in git)
|
|
35
|
+
└── .env.example # Template with placeholders (IN git)
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
### 2. File Structure (Client/Vite)
|
|
39
|
+
|
|
40
|
+
```
|
|
41
|
+
client/
|
|
42
|
+
├── .env # Local development (NOT in git)
|
|
43
|
+
├── .env.production # Production build values (IN git - PUBLIC keys only!)
|
|
44
|
+
└── .env.example # Template for developers (IN git)
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
### 3. Critical Rules
|
|
48
|
+
|
|
49
|
+
**Server .env files (NEVER in git):**
|
|
50
|
+
- Contains SECRET keys (sk_live_, client_secret, JWT_SECRET)
|
|
51
|
+
- Must be manually configured on each server via SSH
|
|
52
|
+
- Create backups: `.env.productionbackup`, `.env.localbackup`
|
|
53
|
+
|
|
54
|
+
**Client .env.production (IN git):**
|
|
55
|
+
- Contains ONLY publishable/public keys (pk_live_, client_id)
|
|
56
|
+
- Used by Vite during `npm run build`
|
|
57
|
+
- Safe to commit because these are public-facing
|
|
58
|
+
|
|
59
|
+
**VITE_ Prefix Required:**
|
|
60
|
+
- All client-side variables MUST have `VITE_` prefix
|
|
61
|
+
- Without prefix, Vite will NOT expose the variable to the frontend
|
|
62
|
+
|
|
63
|
+
### 4. .gitignore Configuration
|
|
64
|
+
|
|
65
|
+
```gitignore
|
|
66
|
+
# Environment files - NEVER commit secrets
|
|
67
|
+
.env
|
|
68
|
+
.env.local
|
|
69
|
+
.env.development
|
|
70
|
+
.env.development.local
|
|
71
|
+
.env.test
|
|
72
|
+
.env.test.local
|
|
73
|
+
.env.production.local
|
|
74
|
+
*.local
|
|
75
|
+
|
|
76
|
+
# Explicit backups
|
|
77
|
+
server/.env.productionbackup
|
|
78
|
+
server/.env.localbackup
|
|
79
|
+
client/.env.productionbackup
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
**Note:** `client/.env.production` is intentionally NOT in .gitignore because it contains only public keys.
|
|
83
|
+
|
|
84
|
+
## Code Example
|
|
85
|
+
|
|
86
|
+
### Before (Problematic - secrets exposed)
|
|
87
|
+
|
|
88
|
+
```env
|
|
89
|
+
# client/.env.production (WRONG - secrets in client!)
|
|
90
|
+
VITE_STRIPE_SECRET_KEY=sk_live_xxx # NEVER do this!
|
|
91
|
+
VITE_PAYPAL_SECRET=EIhBzb... # NEVER do this!
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
### After (Correct - public keys only)
|
|
95
|
+
|
|
96
|
+
```env
|
|
97
|
+
# client/.env.production (CORRECT - public keys only)
|
|
98
|
+
VITE_API_URL=https://yourdomain.com/api
|
|
99
|
+
VITE_STRIPE_PUBLISHABLE_KEY=pk_live_51KFrTBB...
|
|
100
|
+
VITE_PAYPAL_CLIENT_ID=AVPCNK2OFrV3Wx46...
|
|
101
|
+
VITE_SITE_NAME=My App
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
```env
|
|
105
|
+
# server/.env (CORRECT - secrets on server only)
|
|
106
|
+
STRIPE_SECRET_KEY=sk_live_51KFrTBB...
|
|
107
|
+
PAYPAL_CLIENT_SECRET=EIhBzb...
|
|
108
|
+
JWT_SECRET=y2300cd87b131c28...
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
## Manual Deployment Process (SSH)
|
|
112
|
+
|
|
113
|
+
When deploying, you must manually update the production server's `.env`:
|
|
114
|
+
|
|
115
|
+
```bash
|
|
116
|
+
# 1. SSH into production server
|
|
117
|
+
ssh user@server.example.com
|
|
118
|
+
|
|
119
|
+
# 2. Navigate to app directory
|
|
120
|
+
cd ~/mern-app
|
|
121
|
+
|
|
122
|
+
# 3. Pull code changes (does NOT include .env)
|
|
123
|
+
git pull origin main
|
|
124
|
+
|
|
125
|
+
# 4. Edit server .env with production values
|
|
126
|
+
nano server/.env
|
|
127
|
+
|
|
128
|
+
# 5. Update these values:
|
|
129
|
+
# - STRIPE_SECRET_KEY=sk_live_...
|
|
130
|
+
# - JWT_SECRET=your-secure-secret
|
|
131
|
+
# - NODE_ENV=production
|
|
132
|
+
# - All other production-specific values
|
|
133
|
+
|
|
134
|
+
# 6. Rebuild client
|
|
135
|
+
cd client && npm run build && cd ..
|
|
136
|
+
|
|
137
|
+
# 7. Copy built files to public directory
|
|
138
|
+
cp -r client/dist/* ~/public_html/
|
|
139
|
+
|
|
140
|
+
# 8. Restart application
|
|
141
|
+
pm2 restart all
|
|
142
|
+
|
|
143
|
+
# 9. Verify
|
|
144
|
+
pm2 logs --lines 20
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
## Debugging "Wrong Environment" Issues
|
|
148
|
+
|
|
149
|
+
### Step 1: Check Server Key Prefix
|
|
150
|
+
|
|
151
|
+
```bash
|
|
152
|
+
# On production server
|
|
153
|
+
grep STRIPE_SECRET_KEY ~/mern-app/server/.env
|
|
154
|
+
# Should show: sk_live_... NOT sk_test_...
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
### Step 2: Check Client Build Keys
|
|
158
|
+
|
|
159
|
+
```bash
|
|
160
|
+
# In client/.env.production (local repo)
|
|
161
|
+
grep VITE_STRIPE ~/client/.env.production
|
|
162
|
+
# Should show: pk_live_... NOT pk_test_...
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
### Step 3: Verify Checkout Session
|
|
166
|
+
|
|
167
|
+
- `cs_test_` in URL = Server using TEST key
|
|
168
|
+
- `cs_live_` in URL = Server using LIVE key
|
|
169
|
+
|
|
170
|
+
The checkout session prefix is determined by the SERVER's secret key, not the client's publishable key.
|
|
171
|
+
|
|
172
|
+
## When to Use
|
|
173
|
+
|
|
174
|
+
- Setting up new MERN/Vite projects
|
|
175
|
+
- Debugging "wrong environment" issues (test vs live keys)
|
|
176
|
+
- After losing .env configuration
|
|
177
|
+
- Training new team members on environment management
|
|
178
|
+
- Creating deployment documentation
|
|
179
|
+
|
|
180
|
+
## When NOT to Use
|
|
181
|
+
|
|
182
|
+
- Projects using cloud secrets managers (AWS Secrets Manager, HashiCorp Vault)
|
|
183
|
+
- Containerized deployments with environment injection (Docker secrets, K8s ConfigMaps)
|
|
184
|
+
- Single-environment projects with no prod/dev separation
|
|
185
|
+
|
|
186
|
+
## Common Mistakes
|
|
187
|
+
|
|
188
|
+
1. **Assuming .env deploys with git** - It doesn't. Manual SSH update required.
|
|
189
|
+
2. **Putting secrets in client .env** - Client code is public. Never put secrets there.
|
|
190
|
+
3. **Forgetting VITE_ prefix** - Variable won't be exposed to frontend.
|
|
191
|
+
4. **Not creating backups** - One wrong edit loses all your config.
|
|
192
|
+
5. **Hardcoding fallback keys in code** - These override environment variables.
|
|
193
|
+
|
|
194
|
+
## Related Skills
|
|
195
|
+
|
|
196
|
+
- [stripe-payment-integration-complete](../integrations/stripe-payment-integration-complete.md)
|
|
197
|
+
- [react-production-deployment-desktop-guide](./react-production-deployment-desktop-guide.md)
|
|
198
|
+
|
|
199
|
+
## References
|
|
200
|
+
|
|
201
|
+
- Vite Environment Variables: https://vitejs.dev/guide/env-and-mode
|
|
202
|
+
- dotenv Best Practices: https://www.npmjs.com/package/dotenv
|
|
203
|
+
- OWASP Secrets Management: https://cheatsheetseries.owasp.org/cheatsheets/Secrets_Management_Cheat_Sheet.html
|
|
@@ -0,0 +1,413 @@
|
|
|
1
|
+
# Express.js Secure File Downloads - Industry Standard Solution
|
|
2
|
+
|
|
3
|
+
## Problem Statement
|
|
4
|
+
Digital file downloads failing in Express.js application with various errors:
|
|
5
|
+
- 404 errors (missing endpoint)
|
|
6
|
+
- Payment status enum validation errors
|
|
7
|
+
- File not found errors despite files existing
|
|
8
|
+
- Path duplication issues (absolute paths treated as relative)
|
|
9
|
+
|
|
10
|
+
## Root Cause Analysis
|
|
11
|
+
|
|
12
|
+
### The Critical Bug
|
|
13
|
+
**Path Duplication Issue**: Database stored absolute file paths, but code treated them as relative paths, resulting in duplicated paths like:
|
|
14
|
+
```
|
|
15
|
+
C:\Users\...\uploads\C:\Users\...\uploads\digital-files\file.pdf
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
### Contributing Factors
|
|
19
|
+
1. **Inconsistent Path Storage**: Mix of absolute and relative paths in database
|
|
20
|
+
2. **No Path Type Detection**: Code assumed all paths were relative
|
|
21
|
+
3. **Manual Path Construction**: Using string concatenation instead of Express utilities
|
|
22
|
+
4. **Missing Fallback Logic**: No recovery mechanism when primary path fails
|
|
23
|
+
|
|
24
|
+
## Industry Standard Solution
|
|
25
|
+
|
|
26
|
+
### Complete Working Implementation
|
|
27
|
+
|
|
28
|
+
```javascript
|
|
29
|
+
/**
|
|
30
|
+
* Digital Downloads Controller
|
|
31
|
+
* Secure file download with purchase verification
|
|
32
|
+
*/
|
|
33
|
+
|
|
34
|
+
import sql from '../config/sql.js';
|
|
35
|
+
import path from 'path';
|
|
36
|
+
import fs from 'fs';
|
|
37
|
+
import { fileURLToPath } from 'url';
|
|
38
|
+
|
|
39
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
40
|
+
const __dirname = path.dirname(__filename);
|
|
41
|
+
|
|
42
|
+
export const downloadDigitalFile = async (req, res) => {
|
|
43
|
+
try {
|
|
44
|
+
const { fileId } = req.params;
|
|
45
|
+
const userId = req.user.id;
|
|
46
|
+
|
|
47
|
+
console.log('📥 [Download Digital File] Request:', {
|
|
48
|
+
fileId,
|
|
49
|
+
userId
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
// 1. GET FILE INFO FROM DATABASE
|
|
53
|
+
const files = await sql`
|
|
54
|
+
SELECT
|
|
55
|
+
ddf.*,
|
|
56
|
+
p.id as product_id,
|
|
57
|
+
p.name as product_name
|
|
58
|
+
FROM digital_download_files ddf
|
|
59
|
+
JOIN products p ON p.id = ddf.product_id
|
|
60
|
+
WHERE ddf.id = ${fileId}
|
|
61
|
+
`;
|
|
62
|
+
|
|
63
|
+
if (files.length === 0) {
|
|
64
|
+
return res.status(404).json({
|
|
65
|
+
success: false,
|
|
66
|
+
message: 'File not found'
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
const file = files[0];
|
|
71
|
+
|
|
72
|
+
// 2. VERIFY PURCHASE (Allow free products that stay in 'pending')
|
|
73
|
+
const purchases = await sql`
|
|
74
|
+
SELECT o.id as order_id, o.payment_status, o.total_amount
|
|
75
|
+
FROM orders o
|
|
76
|
+
JOIN order_items oi ON oi.order_id = o.id
|
|
77
|
+
WHERE o.user_id = ${userId}
|
|
78
|
+
AND oi.product_id = ${file.product_id}
|
|
79
|
+
LIMIT 1
|
|
80
|
+
`;
|
|
81
|
+
|
|
82
|
+
if (purchases.length === 0 && req.user.role !== 'admin') {
|
|
83
|
+
return res.status(403).json({
|
|
84
|
+
success: false,
|
|
85
|
+
message: 'You must purchase this product to download it'
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// 3. INTELLIGENT PATH RESOLUTION WITH FALLBACK
|
|
90
|
+
let filePath;
|
|
91
|
+
|
|
92
|
+
// Check if file_path is absolute or relative
|
|
93
|
+
if (path.isAbsolute(file.file_path)) {
|
|
94
|
+
// It's already a full path (legacy data)
|
|
95
|
+
filePath = file.file_path;
|
|
96
|
+
console.log('📥 [Download] Using absolute path from DB:', filePath);
|
|
97
|
+
} else {
|
|
98
|
+
// It's a relative path (correct way)
|
|
99
|
+
const uploadsDir = path.join(__dirname, '..', 'uploads');
|
|
100
|
+
filePath = path.join(uploadsDir, file.file_path);
|
|
101
|
+
console.log('📥 [Download] Built path from relative:', filePath);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// 4. VERIFY FILE EXISTS WITH FALLBACK
|
|
105
|
+
if (!fs.existsSync(filePath)) {
|
|
106
|
+
console.error('❌ [Download] File not found at primary path:', filePath);
|
|
107
|
+
|
|
108
|
+
// Try fallback: extract filename and look in digital-files directory
|
|
109
|
+
const fileName = path.basename(file.file_path);
|
|
110
|
+
const fallbackPath = path.join(__dirname, '..', 'uploads', 'digital-files', fileName);
|
|
111
|
+
|
|
112
|
+
if (fs.existsSync(fallbackPath)) {
|
|
113
|
+
console.log('✅ [Download] Found file at fallback path:', fallbackPath);
|
|
114
|
+
filePath = fallbackPath;
|
|
115
|
+
} else {
|
|
116
|
+
return res.status(404).json({
|
|
117
|
+
success: false,
|
|
118
|
+
message: 'File not found on server'
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
// 5. USE EXPRESS BUILT-IN DOWNLOAD METHOD (INDUSTRY STANDARD)
|
|
124
|
+
// This handles headers, streaming, and security automatically
|
|
125
|
+
res.download(filePath, file.original_filename || file.display_name, (err) => {
|
|
126
|
+
if (err) {
|
|
127
|
+
console.error('❌ [Download] Error sending file:', err);
|
|
128
|
+
// Don't send response if headers already sent
|
|
129
|
+
if (!res.headersSent) {
|
|
130
|
+
res.status(500).json({
|
|
131
|
+
success: false,
|
|
132
|
+
message: 'Error downloading file'
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
} else {
|
|
136
|
+
console.log('✅ [Download] File sent successfully');
|
|
137
|
+
}
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
// 6. OPTIONAL: LOG DOWNLOAD FOR ANALYTICS
|
|
141
|
+
await sql`
|
|
142
|
+
INSERT INTO download_logs (
|
|
143
|
+
user_id, file_id, product_id, downloaded_at
|
|
144
|
+
) VALUES (
|
|
145
|
+
${userId}, ${fileId}, ${file.product_id}, CURRENT_TIMESTAMP
|
|
146
|
+
)
|
|
147
|
+
`.catch(err => {
|
|
148
|
+
// Don't fail the download if logging fails
|
|
149
|
+
console.error('⚠️ [Download] Failed to log download:', err);
|
|
150
|
+
});
|
|
151
|
+
|
|
152
|
+
} catch (error) {
|
|
153
|
+
console.error('❌ [Download Digital File Error]:', error);
|
|
154
|
+
res.status(500).json({
|
|
155
|
+
success: false,
|
|
156
|
+
message: 'Error downloading file',
|
|
157
|
+
error: error.message
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
};
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
### Routes Configuration
|
|
164
|
+
|
|
165
|
+
```javascript
|
|
166
|
+
// server/routes/digitalDownloadsRoutes.js
|
|
167
|
+
import express from 'express';
|
|
168
|
+
import { downloadDigitalFile } from '../controllers/digitalDownloadsController.js';
|
|
169
|
+
import auth from '../middleware/auth.js';
|
|
170
|
+
|
|
171
|
+
const router = express.Router();
|
|
172
|
+
|
|
173
|
+
// Protected route - requires authentication
|
|
174
|
+
router.get('/:fileId/download', auth, downloadDigitalFile);
|
|
175
|
+
|
|
176
|
+
export default router;
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
### Server Integration
|
|
180
|
+
|
|
181
|
+
```javascript
|
|
182
|
+
// server/server.js
|
|
183
|
+
import digitalDownloadsRoutes from './routes/digitalDownloadsRoutes.js';
|
|
184
|
+
|
|
185
|
+
// Register the routes
|
|
186
|
+
app.use('/api/digital-files', digitalDownloadsRoutes);
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
## Key Features of This Solution
|
|
190
|
+
|
|
191
|
+
### 1. **Path Type Detection**
|
|
192
|
+
```javascript
|
|
193
|
+
if (path.isAbsolute(file.file_path)) {
|
|
194
|
+
// Handle absolute paths
|
|
195
|
+
} else {
|
|
196
|
+
// Handle relative paths
|
|
197
|
+
}
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
### 2. **Express res.download() Method**
|
|
201
|
+
- **Built-in Security**: Prevents directory traversal attacks
|
|
202
|
+
- **Automatic Headers**: Sets correct Content-Type and Content-Disposition
|
|
203
|
+
- **Streaming Support**: Efficient for large files
|
|
204
|
+
- **Error Handling**: Callback for handling failures
|
|
205
|
+
- **Custom Filename**: Can specify download name different from stored name
|
|
206
|
+
|
|
207
|
+
### 3. **Fallback Mechanism**
|
|
208
|
+
```javascript
|
|
209
|
+
const fileName = path.basename(file.file_path);
|
|
210
|
+
const fallbackPath = path.join(__dirname, '..', 'uploads', 'digital-files', fileName);
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
### 4. **Purchase Verification**
|
|
214
|
+
- Checks orders table for purchase record
|
|
215
|
+
- Allows admin bypass for testing
|
|
216
|
+
- Handles free products (may stay in 'pending' status)
|
|
217
|
+
|
|
218
|
+
### 5. **Proper Error Handling**
|
|
219
|
+
- Checks if headers already sent before error response
|
|
220
|
+
- Graceful failure for optional features (logging)
|
|
221
|
+
- Detailed console logging for debugging
|
|
222
|
+
|
|
223
|
+
## Common Pitfalls to Avoid
|
|
224
|
+
|
|
225
|
+
### ❌ Don't Do This:
|
|
226
|
+
```javascript
|
|
227
|
+
// Manual file streaming (security risk)
|
|
228
|
+
const stream = fs.createReadStream(filePath);
|
|
229
|
+
stream.pipe(res);
|
|
230
|
+
|
|
231
|
+
// String concatenation for paths
|
|
232
|
+
const filePath = __dirname + '/../uploads/' + file.file_path;
|
|
233
|
+
|
|
234
|
+
// No purchase verification
|
|
235
|
+
// Anyone with fileId could download
|
|
236
|
+
|
|
237
|
+
// Assuming all paths are relative
|
|
238
|
+
const filePath = path.join(uploadsDir, file.file_path); // Fails with absolute paths
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
### ✅ Do This Instead:
|
|
242
|
+
```javascript
|
|
243
|
+
// Use Express's built-in method
|
|
244
|
+
res.download(filePath, filename, callback);
|
|
245
|
+
|
|
246
|
+
// Use path.join with detection
|
|
247
|
+
if (path.isAbsolute(file.file_path)) { ... }
|
|
248
|
+
|
|
249
|
+
// Always verify ownership
|
|
250
|
+
const purchases = await sql`...`;
|
|
251
|
+
if (purchases.length === 0) { ... }
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
## Testing Verification
|
|
255
|
+
|
|
256
|
+
### 1. Test File Upload and Storage
|
|
257
|
+
```bash
|
|
258
|
+
# Check uploaded files exist
|
|
259
|
+
ls -la server/uploads/digital-files/
|
|
260
|
+
|
|
261
|
+
# Verify database entries
|
|
262
|
+
node -e "
|
|
263
|
+
import sql from './server/config/sql.js';
|
|
264
|
+
const files = await sql\`SELECT * FROM digital_download_files\`;
|
|
265
|
+
console.log(files);
|
|
266
|
+
"
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
### 2. Test Download Endpoint
|
|
270
|
+
```bash
|
|
271
|
+
# Test with curl (replace with actual token and fileId)
|
|
272
|
+
curl -H "Authorization: Bearer YOUR_TOKEN" \
|
|
273
|
+
http://localhost:5000/api/digital-files/FILE_ID/download \
|
|
274
|
+
--output test-download.pdf
|
|
275
|
+
```
|
|
276
|
+
|
|
277
|
+
### 3. Test Path Resolution
|
|
278
|
+
```javascript
|
|
279
|
+
// Test script: testPaths.js
|
|
280
|
+
import path from 'path';
|
|
281
|
+
|
|
282
|
+
const testPaths = [
|
|
283
|
+
'C:\\Users\\test\\uploads\\file.pdf', // Absolute Windows
|
|
284
|
+
'/home/user/uploads/file.pdf', // Absolute Unix
|
|
285
|
+
'digital-files/file.pdf', // Relative
|
|
286
|
+
'file.pdf' // Just filename
|
|
287
|
+
];
|
|
288
|
+
|
|
289
|
+
testPaths.forEach(testPath => {
|
|
290
|
+
console.log(`${testPath}: ${path.isAbsolute(testPath) ? 'ABSOLUTE' : 'RELATIVE'}`);
|
|
291
|
+
});
|
|
292
|
+
```
|
|
293
|
+
|
|
294
|
+
## Database Schema Requirements
|
|
295
|
+
|
|
296
|
+
```sql
|
|
297
|
+
-- Digital download files table
|
|
298
|
+
CREATE TABLE digital_download_files (
|
|
299
|
+
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
300
|
+
product_id uuid NOT NULL REFERENCES products(id) ON DELETE CASCADE,
|
|
301
|
+
display_name varchar(255) NOT NULL,
|
|
302
|
+
original_filename varchar(255),
|
|
303
|
+
file_path text NOT NULL, -- Can be absolute or relative
|
|
304
|
+
file_size bigint,
|
|
305
|
+
mime_type varchar(100),
|
|
306
|
+
display_order integer DEFAULT 0,
|
|
307
|
+
created_at timestamptz DEFAULT now()
|
|
308
|
+
);
|
|
309
|
+
|
|
310
|
+
-- Optional: Download tracking
|
|
311
|
+
CREATE TABLE download_logs (
|
|
312
|
+
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
313
|
+
user_id uuid NOT NULL REFERENCES profiles(id),
|
|
314
|
+
file_id uuid NOT NULL REFERENCES digital_download_files(id),
|
|
315
|
+
product_id uuid NOT NULL REFERENCES products(id),
|
|
316
|
+
downloaded_at timestamptz DEFAULT now(),
|
|
317
|
+
ip_address inet
|
|
318
|
+
);
|
|
319
|
+
```
|
|
320
|
+
|
|
321
|
+
## Migration for Existing Systems
|
|
322
|
+
|
|
323
|
+
If you have existing data with mixed path types:
|
|
324
|
+
|
|
325
|
+
```javascript
|
|
326
|
+
// Migration script to normalize paths
|
|
327
|
+
import sql from './server/config/sql.js';
|
|
328
|
+
import path from 'path';
|
|
329
|
+
|
|
330
|
+
const files = await sql`SELECT * FROM digital_download_files`;
|
|
331
|
+
|
|
332
|
+
for (const file of files) {
|
|
333
|
+
let normalizedPath = file.file_path;
|
|
334
|
+
|
|
335
|
+
// If absolute, convert to relative
|
|
336
|
+
if (path.isAbsolute(file.file_path)) {
|
|
337
|
+
// Extract just the relevant part
|
|
338
|
+
const match = file.file_path.match(/digital-files[\\\/].+$/);
|
|
339
|
+
if (match) {
|
|
340
|
+
normalizedPath = match[0].replace(/\\/g, '/');
|
|
341
|
+
|
|
342
|
+
await sql`
|
|
343
|
+
UPDATE digital_download_files
|
|
344
|
+
SET file_path = ${normalizedPath}
|
|
345
|
+
WHERE id = ${file.id}
|
|
346
|
+
`;
|
|
347
|
+
console.log(`Updated: ${file.file_path} -> ${normalizedPath}`);
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
```
|
|
352
|
+
|
|
353
|
+
## Security Considerations
|
|
354
|
+
|
|
355
|
+
1. **Authentication Required**: Always verify user is logged in
|
|
356
|
+
2. **Purchase Verification**: Check user owns the product
|
|
357
|
+
3. **Path Traversal Prevention**: res.download() handles this automatically
|
|
358
|
+
4. **File Existence Check**: Verify file exists before attempting download
|
|
359
|
+
5. **Error Information**: Don't expose internal paths in error messages to users
|
|
360
|
+
6. **Rate Limiting**: Consider adding download rate limits per user
|
|
361
|
+
|
|
362
|
+
## Performance Optimization
|
|
363
|
+
|
|
364
|
+
For high-traffic applications:
|
|
365
|
+
|
|
366
|
+
```javascript
|
|
367
|
+
// 1. Cache file existence checks
|
|
368
|
+
const fileCache = new Map();
|
|
369
|
+
|
|
370
|
+
// 2. Use CDN for large files
|
|
371
|
+
if (file.file_size > 10 * 1024 * 1024) { // > 10MB
|
|
372
|
+
return res.redirect(cdnUrl);
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
// 3. Add download queuing for concurrent limits
|
|
376
|
+
const downloadQueue = new Queue({ concurrency: 10 });
|
|
377
|
+
```
|
|
378
|
+
|
|
379
|
+
## Troubleshooting Guide
|
|
380
|
+
|
|
381
|
+
### Problem: "File not found on server"
|
|
382
|
+
- Check file actually exists in uploads directory
|
|
383
|
+
- Verify path in database matches actual location
|
|
384
|
+
- Check file permissions (readable by Node.js process)
|
|
385
|
+
- Try fallback path mechanism
|
|
386
|
+
|
|
387
|
+
### Problem: "Payment status enum error"
|
|
388
|
+
- Check valid enum values in database
|
|
389
|
+
- Consider removing strict payment status check
|
|
390
|
+
- Allow 'pending' status for free products
|
|
391
|
+
|
|
392
|
+
### Problem: Downloads work locally but not in production
|
|
393
|
+
- Check file paths (Windows vs Linux)
|
|
394
|
+
- Verify uploads directory is included in deployment
|
|
395
|
+
- Check file permissions on server
|
|
396
|
+
- Ensure proper environment variables
|
|
397
|
+
|
|
398
|
+
## Related Skills
|
|
399
|
+
- [PostgreSQL JSON Aggregation](./postgresql-json-aggregation.md)
|
|
400
|
+
- [Express.js Authentication Middleware](./express-auth-middleware.md)
|
|
401
|
+
- [File Upload Handling](./file-upload-handling.md)
|
|
402
|
+
|
|
403
|
+
## References
|
|
404
|
+
- [Express.js res.download() Documentation](https://expressjs.com/en/api.html#res.download)
|
|
405
|
+
- [Node.js Path Module](https://nodejs.org/api/path.html)
|
|
406
|
+
- [OWASP File Upload Security](https://owasp.org/www-community/vulnerabilities/Unrestricted_File_Upload)
|
|
407
|
+
|
|
408
|
+
---
|
|
409
|
+
|
|
410
|
+
**Last Updated**: October 31, 2024
|
|
411
|
+
**Tested With**: Express 4.x, Node.js 18+, PostgreSQL 14+
|
|
412
|
+
**Author**: Claude (Anthropic)
|
|
413
|
+
**Context**: MERN Community LMS Project - Digital Downloads Feature
|