@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,336 @@
|
|
|
1
|
+
# Order Saga Pattern + State Machine
|
|
2
|
+
|
|
3
|
+
> Model order lifecycle as a finite state machine with saga-pattern compensating transactions for distributed processing.
|
|
4
|
+
|
|
5
|
+
**When to use:** Building any order processing system — especially those involving payment capture, inventory reservation, and fulfillment coordination across services.
|
|
6
|
+
**Stack:** Node.js/Express, PostgreSQL/MySQL, optional message queue (BullMQ, SQS)
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## Order State Machine
|
|
11
|
+
|
|
12
|
+
```
|
|
13
|
+
┌──────────────────────────────────────────────┐
|
|
14
|
+
│ │
|
|
15
|
+
┌────────┐ ┌───▼─────┐ ┌──────────┐ ┌──────────┐ ┌───┴──────┐
|
|
16
|
+
│ CREATED│───▶│CONFIRMED│───▶│PROCESSING│───▶│ SHIPPED │───▶│DELIVERED │
|
|
17
|
+
└───┬────┘ └───┬─────┘ └────┬─────┘ └────┬─────┘ └──────────┘
|
|
18
|
+
│ │ │ │
|
|
19
|
+
│ ┌───▼─────┐ ┌────▼─────┐ ┌────▼─────┐
|
|
20
|
+
└────────▶│CANCELLED│ │ FAILED │ │ RETURNED │
|
|
21
|
+
└─────────┘ └──────────┘ └──────────┘
|
|
22
|
+
│
|
|
23
|
+
┌────▼─────┐
|
|
24
|
+
│ REFUNDED │
|
|
25
|
+
└──────────┘
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
### State Definitions
|
|
29
|
+
|
|
30
|
+
```javascript
|
|
31
|
+
const ORDER_STATES = {
|
|
32
|
+
CREATED: 'created', // Order placed, awaiting payment
|
|
33
|
+
CONFIRMED: 'confirmed', // Payment captured successfully
|
|
34
|
+
PROCESSING: 'processing', // Being prepared for fulfillment
|
|
35
|
+
SHIPPED: 'shipped', // Handed to carrier
|
|
36
|
+
DELIVERED: 'delivered', // Confirmed delivered
|
|
37
|
+
CANCELLED: 'cancelled', // Cancelled before shipment
|
|
38
|
+
FAILED: 'failed', // Payment or processing failed
|
|
39
|
+
RETURNED: 'returned', // Customer returned the order
|
|
40
|
+
REFUNDED: 'refunded', // Refund issued
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
const VALID_TRANSITIONS = {
|
|
44
|
+
created: ['confirmed', 'cancelled', 'failed'],
|
|
45
|
+
confirmed: ['processing', 'cancelled', 'refunded'],
|
|
46
|
+
processing: ['shipped', 'cancelled', 'failed'],
|
|
47
|
+
shipped: ['delivered', 'returned'],
|
|
48
|
+
delivered: ['returned'],
|
|
49
|
+
returned: ['refunded'],
|
|
50
|
+
cancelled: [], // Terminal state
|
|
51
|
+
failed: ['created'], // Allow retry
|
|
52
|
+
refunded: [], // Terminal state
|
|
53
|
+
};
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
### Transition Enforcement
|
|
57
|
+
|
|
58
|
+
```javascript
|
|
59
|
+
async function transitionOrder(orderId, newStatus, metadata = {}) {
|
|
60
|
+
const order = await db.query('SELECT * FROM orders WHERE id = $1', [orderId]);
|
|
61
|
+
if (!order.rows[0]) throw new Error(`Order ${orderId} not found`);
|
|
62
|
+
|
|
63
|
+
const currentStatus = order.rows[0].status;
|
|
64
|
+
const allowed = VALID_TRANSITIONS[currentStatus];
|
|
65
|
+
|
|
66
|
+
if (!allowed || !allowed.includes(newStatus)) {
|
|
67
|
+
throw new Error(
|
|
68
|
+
`Invalid transition: ${currentStatus} → ${newStatus}. ` +
|
|
69
|
+
`Allowed: ${allowed?.join(', ') || 'none (terminal state)'}`
|
|
70
|
+
);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// Record transition in history
|
|
74
|
+
await db.query(
|
|
75
|
+
`INSERT INTO order_status_history (order_id, from_status, to_status, metadata, created_at)
|
|
76
|
+
VALUES ($1, $2, $3, $4, NOW())`,
|
|
77
|
+
[orderId, currentStatus, newStatus, JSON.stringify(metadata)]
|
|
78
|
+
);
|
|
79
|
+
|
|
80
|
+
// Update order
|
|
81
|
+
await db.query(
|
|
82
|
+
'UPDATE orders SET status = $1, updated_at = NOW() WHERE id = $2',
|
|
83
|
+
[newStatus, orderId]
|
|
84
|
+
);
|
|
85
|
+
|
|
86
|
+
// Emit event for side effects
|
|
87
|
+
await emitOrderEvent(orderId, newStatus, metadata);
|
|
88
|
+
}
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
---
|
|
92
|
+
|
|
93
|
+
## Checkout Saga (Orchestrated)
|
|
94
|
+
|
|
95
|
+
The checkout process is a saga — a sequence of steps where each step has a compensating action for rollback:
|
|
96
|
+
|
|
97
|
+
```javascript
|
|
98
|
+
async function executeCheckoutSaga(orderId, cartId, paymentMethodId) {
|
|
99
|
+
const saga = new SagaOrchestrator();
|
|
100
|
+
|
|
101
|
+
// Step 1: Validate cart
|
|
102
|
+
saga.addStep({
|
|
103
|
+
name: 'validate_cart',
|
|
104
|
+
execute: async () => {
|
|
105
|
+
const validation = await validateCartForCheckout(cartId);
|
|
106
|
+
if (!validation.valid) throw new Error(`Cart invalid: ${validation.issues[0].message}`);
|
|
107
|
+
return validation;
|
|
108
|
+
},
|
|
109
|
+
compensate: async () => {
|
|
110
|
+
// Nothing to roll back — validation is read-only
|
|
111
|
+
},
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
// Step 2: Reserve inventory
|
|
115
|
+
saga.addStep({
|
|
116
|
+
name: 'reserve_inventory',
|
|
117
|
+
execute: async (ctx) => {
|
|
118
|
+
const items = await getCartItems(cartId);
|
|
119
|
+
for (const item of items) {
|
|
120
|
+
await reserveStock(item.product_id, item.variant_id, item.quantity, orderId);
|
|
121
|
+
}
|
|
122
|
+
return { items };
|
|
123
|
+
},
|
|
124
|
+
compensate: async (ctx) => {
|
|
125
|
+
// COMPENSATE: Release reserved inventory
|
|
126
|
+
const items = await getCartItems(cartId);
|
|
127
|
+
for (const item of items) {
|
|
128
|
+
await releaseStock(item.product_id, item.variant_id, item.quantity, orderId);
|
|
129
|
+
}
|
|
130
|
+
},
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
// Step 3: Capture payment
|
|
134
|
+
saga.addStep({
|
|
135
|
+
name: 'capture_payment',
|
|
136
|
+
execute: async (ctx) => {
|
|
137
|
+
const paymentIntent = await stripe.paymentIntents.create({
|
|
138
|
+
amount: ctx.validate_cart.subtotal * 100,
|
|
139
|
+
currency: 'usd',
|
|
140
|
+
payment_method: paymentMethodId,
|
|
141
|
+
confirm: true,
|
|
142
|
+
metadata: { order_id: orderId },
|
|
143
|
+
}, {
|
|
144
|
+
idempotencyKey: `checkout-${orderId}`,
|
|
145
|
+
});
|
|
146
|
+
return { paymentIntent };
|
|
147
|
+
},
|
|
148
|
+
compensate: async (ctx) => {
|
|
149
|
+
// COMPENSATE: Refund payment
|
|
150
|
+
if (ctx.capture_payment?.paymentIntent) {
|
|
151
|
+
await stripe.refunds.create({
|
|
152
|
+
payment_intent: ctx.capture_payment.paymentIntent.id,
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
},
|
|
156
|
+
});
|
|
157
|
+
|
|
158
|
+
// Step 4: Create order record
|
|
159
|
+
saga.addStep({
|
|
160
|
+
name: 'create_order',
|
|
161
|
+
execute: async (ctx) => {
|
|
162
|
+
await transitionOrder(orderId, 'confirmed', {
|
|
163
|
+
payment_intent_id: ctx.capture_payment.paymentIntent.id,
|
|
164
|
+
});
|
|
165
|
+
return { confirmed: true };
|
|
166
|
+
},
|
|
167
|
+
compensate: async (ctx) => {
|
|
168
|
+
// COMPENSATE: Mark order as failed
|
|
169
|
+
await transitionOrder(orderId, 'failed', { reason: 'saga_rollback' });
|
|
170
|
+
},
|
|
171
|
+
});
|
|
172
|
+
|
|
173
|
+
// Step 5: Clear cart
|
|
174
|
+
saga.addStep({
|
|
175
|
+
name: 'clear_cart',
|
|
176
|
+
execute: async () => {
|
|
177
|
+
await db.query("UPDATE carts SET status = 'converted' WHERE id = $1", [cartId]);
|
|
178
|
+
},
|
|
179
|
+
compensate: async () => {
|
|
180
|
+
await db.query("UPDATE carts SET status = 'active' WHERE id = $1", [cartId]);
|
|
181
|
+
},
|
|
182
|
+
});
|
|
183
|
+
|
|
184
|
+
// Execute saga
|
|
185
|
+
try {
|
|
186
|
+
const result = await saga.run();
|
|
187
|
+
return { success: true, order_id: orderId, ...result };
|
|
188
|
+
} catch (err) {
|
|
189
|
+
// Saga automatically runs compensating actions in reverse order
|
|
190
|
+
return { success: false, error: err.message, rollback: saga.getCompensationLog() };
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
### Saga Orchestrator Implementation
|
|
196
|
+
|
|
197
|
+
```javascript
|
|
198
|
+
class SagaOrchestrator {
|
|
199
|
+
constructor() {
|
|
200
|
+
this.steps = [];
|
|
201
|
+
this.context = {};
|
|
202
|
+
this.completedSteps = [];
|
|
203
|
+
this.compensationLog = [];
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
addStep({ name, execute, compensate }) {
|
|
207
|
+
this.steps.push({ name, execute, compensate });
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
async run() {
|
|
211
|
+
for (const step of this.steps) {
|
|
212
|
+
try {
|
|
213
|
+
const result = await step.execute(this.context);
|
|
214
|
+
this.context[step.name] = result;
|
|
215
|
+
this.completedSteps.push(step);
|
|
216
|
+
} catch (err) {
|
|
217
|
+
// Run compensating actions in REVERSE order
|
|
218
|
+
for (const completed of [...this.completedSteps].reverse()) {
|
|
219
|
+
try {
|
|
220
|
+
await completed.compensate(this.context);
|
|
221
|
+
this.compensationLog.push({ step: completed.name, status: 'compensated' });
|
|
222
|
+
} catch (compErr) {
|
|
223
|
+
this.compensationLog.push({
|
|
224
|
+
step: completed.name, status: 'compensation_failed',
|
|
225
|
+
error: compErr.message
|
|
226
|
+
});
|
|
227
|
+
// Log but continue — try to compensate remaining steps
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
throw new Error(`Saga failed at ${step.name}: ${err.message}`);
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
return this.context;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
getCompensationLog() { return this.compensationLog; }
|
|
237
|
+
}
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
---
|
|
241
|
+
|
|
242
|
+
## Database Schema
|
|
243
|
+
|
|
244
|
+
```sql
|
|
245
|
+
CREATE TABLE orders (
|
|
246
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
247
|
+
user_id UUID NOT NULL REFERENCES users(id),
|
|
248
|
+
status VARCHAR(20) NOT NULL DEFAULT 'created',
|
|
249
|
+
subtotal DECIMAL(10,2) NOT NULL,
|
|
250
|
+
tax DECIMAL(10,2) DEFAULT 0,
|
|
251
|
+
shipping DECIMAL(10,2) DEFAULT 0,
|
|
252
|
+
total DECIMAL(10,2) NOT NULL,
|
|
253
|
+
payment_intent_id VARCHAR(255),
|
|
254
|
+
shipping_address JSONB,
|
|
255
|
+
notes TEXT,
|
|
256
|
+
created_at TIMESTAMP DEFAULT NOW(),
|
|
257
|
+
updated_at TIMESTAMP DEFAULT NOW()
|
|
258
|
+
);
|
|
259
|
+
|
|
260
|
+
CREATE TABLE order_items (
|
|
261
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
262
|
+
order_id UUID NOT NULL REFERENCES orders(id),
|
|
263
|
+
product_id UUID NOT NULL REFERENCES products(id),
|
|
264
|
+
variant_id UUID REFERENCES product_variants(id),
|
|
265
|
+
quantity INTEGER NOT NULL,
|
|
266
|
+
unit_price DECIMAL(10,2) NOT NULL,
|
|
267
|
+
total_price DECIMAL(10,2) NOT NULL
|
|
268
|
+
);
|
|
269
|
+
|
|
270
|
+
CREATE TABLE order_status_history (
|
|
271
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
272
|
+
order_id UUID NOT NULL REFERENCES orders(id),
|
|
273
|
+
from_status VARCHAR(20),
|
|
274
|
+
to_status VARCHAR(20) NOT NULL,
|
|
275
|
+
metadata JSONB DEFAULT '{}',
|
|
276
|
+
created_at TIMESTAMP DEFAULT NOW()
|
|
277
|
+
);
|
|
278
|
+
|
|
279
|
+
-- Inventory reservations (for saga rollback)
|
|
280
|
+
CREATE TABLE inventory_reservations (
|
|
281
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
282
|
+
product_id UUID NOT NULL,
|
|
283
|
+
variant_id UUID,
|
|
284
|
+
quantity INTEGER NOT NULL,
|
|
285
|
+
order_id UUID NOT NULL,
|
|
286
|
+
status VARCHAR(20) DEFAULT 'reserved', -- reserved | committed | released
|
|
287
|
+
created_at TIMESTAMP DEFAULT NOW(),
|
|
288
|
+
expires_at TIMESTAMP DEFAULT NOW() + INTERVAL '30 minutes'
|
|
289
|
+
);
|
|
290
|
+
|
|
291
|
+
CREATE INDEX idx_orders_user ON orders(user_id);
|
|
292
|
+
CREATE INDEX idx_orders_status ON orders(status);
|
|
293
|
+
CREATE INDEX idx_order_history ON order_status_history(order_id);
|
|
294
|
+
CREATE INDEX idx_reservations_order ON inventory_reservations(order_id);
|
|
295
|
+
CREATE INDEX idx_reservations_expiry ON inventory_reservations(expires_at)
|
|
296
|
+
WHERE status = 'reserved';
|
|
297
|
+
```
|
|
298
|
+
|
|
299
|
+
---
|
|
300
|
+
|
|
301
|
+
## Event Hooks
|
|
302
|
+
|
|
303
|
+
```javascript
|
|
304
|
+
async function emitOrderEvent(orderId, newStatus, metadata) {
|
|
305
|
+
const handlers = {
|
|
306
|
+
confirmed: [sendOrderConfirmationEmail, notifyFulfillment],
|
|
307
|
+
processing: [updateInventoryCommit],
|
|
308
|
+
shipped: [sendShippingNotification, generateTrackingPage],
|
|
309
|
+
delivered: [sendDeliveryConfirmation, requestReview],
|
|
310
|
+
cancelled: [sendCancellationEmail, releaseInventory, processRefund],
|
|
311
|
+
failed: [sendFailureNotification, releaseInventory],
|
|
312
|
+
returned: [processReturn, sendReturnConfirmation],
|
|
313
|
+
refunded: [sendRefundConfirmation],
|
|
314
|
+
};
|
|
315
|
+
|
|
316
|
+
const fns = handlers[newStatus] || [];
|
|
317
|
+
for (const fn of fns) {
|
|
318
|
+
try {
|
|
319
|
+
await fn(orderId, metadata);
|
|
320
|
+
} catch (err) {
|
|
321
|
+
console.error(`Event handler failed for ${newStatus}:`, err);
|
|
322
|
+
// Log but don't fail the transition — side effects are secondary
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
```
|
|
327
|
+
|
|
328
|
+
---
|
|
329
|
+
|
|
330
|
+
## Sources
|
|
331
|
+
|
|
332
|
+
- microservices.io: Saga Pattern (2025)
|
|
333
|
+
- Medusa.js v2: Workflow-based commerce architecture (2025)
|
|
334
|
+
- SagaLLM: Transaction Guarantees for Multi-Agent (VLDB 2025, arXiv:2503.11951)
|
|
335
|
+
- Sylius: State machines in e-commerce modeling (2025)
|
|
336
|
+
- commercetools: Order state machines documentation (2025)
|
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
# Payment Provider Abstraction Layer
|
|
2
|
+
|
|
3
|
+
> Adapter pattern for swapping payment providers without re-architecting. Supports Stripe, PayPal, and future providers.
|
|
4
|
+
|
|
5
|
+
**When to use:** Building a payment system that may need to support multiple providers, or creating a provider-agnostic payment API.
|
|
6
|
+
**Stack:** Node.js/Express, TypeScript recommended
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## The Problem
|
|
11
|
+
|
|
12
|
+
Without abstraction:
|
|
13
|
+
- Adding a second payment provider requires changing every payment-related file
|
|
14
|
+
- Provider-specific code (Stripe's `client_secret`, PayPal's `order_id`) leaks into business logic
|
|
15
|
+
- Testing requires live provider credentials
|
|
16
|
+
- Switching providers is a rewrite, not a configuration change
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## Provider Interface
|
|
21
|
+
|
|
22
|
+
```typescript
|
|
23
|
+
interface PaymentProvider {
|
|
24
|
+
name: string;
|
|
25
|
+
|
|
26
|
+
// Create a payment session (checkout)
|
|
27
|
+
createPaymentSession(params: {
|
|
28
|
+
amount: number; // In smallest currency unit (cents)
|
|
29
|
+
currency: string; // ISO 4217 (usd, eur, gbp)
|
|
30
|
+
customerId?: string; // Your internal customer ID
|
|
31
|
+
metadata?: Record<string, string>;
|
|
32
|
+
successUrl?: string;
|
|
33
|
+
cancelUrl?: string;
|
|
34
|
+
}): Promise<PaymentSession>;
|
|
35
|
+
|
|
36
|
+
// Capture a previously authorized payment
|
|
37
|
+
capturePayment(sessionId: string): Promise<PaymentResult>;
|
|
38
|
+
|
|
39
|
+
// Refund a completed payment
|
|
40
|
+
refundPayment(params: {
|
|
41
|
+
paymentId: string;
|
|
42
|
+
amount?: number; // Partial refund (omit for full refund)
|
|
43
|
+
reason?: string;
|
|
44
|
+
}): Promise<RefundResult>;
|
|
45
|
+
|
|
46
|
+
// Get payment status
|
|
47
|
+
getPaymentStatus(paymentId: string): Promise<PaymentStatus>;
|
|
48
|
+
|
|
49
|
+
// Verify webhook signature
|
|
50
|
+
verifyWebhook(params: {
|
|
51
|
+
body: Buffer | string;
|
|
52
|
+
signature: string;
|
|
53
|
+
secret: string;
|
|
54
|
+
}): Promise<WebhookEvent>;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
interface PaymentSession {
|
|
58
|
+
id: string; // Provider's session/order ID
|
|
59
|
+
checkoutUrl: string; // URL to redirect user to
|
|
60
|
+
expiresAt?: Date;
|
|
61
|
+
providerData?: any; // Raw provider response (for debugging)
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
interface PaymentResult {
|
|
65
|
+
success: boolean;
|
|
66
|
+
paymentId: string; // Provider's payment/transaction ID
|
|
67
|
+
amount: number;
|
|
68
|
+
currency: string;
|
|
69
|
+
status: 'captured' | 'pending' | 'failed';
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
interface RefundResult {
|
|
73
|
+
success: boolean;
|
|
74
|
+
refundId: string;
|
|
75
|
+
amount: number;
|
|
76
|
+
status: 'completed' | 'pending' | 'failed';
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
type PaymentStatus = 'pending' | 'authorized' | 'captured' | 'failed' | 'refunded' | 'cancelled';
|
|
80
|
+
|
|
81
|
+
interface WebhookEvent {
|
|
82
|
+
id: string;
|
|
83
|
+
type: string; // Normalized event type
|
|
84
|
+
paymentId?: string;
|
|
85
|
+
data: Record<string, any>;
|
|
86
|
+
}
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
---
|
|
90
|
+
|
|
91
|
+
## Stripe Implementation
|
|
92
|
+
|
|
93
|
+
```typescript
|
|
94
|
+
import Stripe from 'stripe';
|
|
95
|
+
|
|
96
|
+
class StripeProvider implements PaymentProvider {
|
|
97
|
+
name = 'stripe';
|
|
98
|
+
private stripe: Stripe;
|
|
99
|
+
|
|
100
|
+
constructor(secretKey: string) {
|
|
101
|
+
this.stripe = new Stripe(secretKey);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
async createPaymentSession(params) {
|
|
105
|
+
const session = await this.stripe.checkout.sessions.create({
|
|
106
|
+
payment_method_types: ['card'],
|
|
107
|
+
line_items: [{
|
|
108
|
+
price_data: {
|
|
109
|
+
currency: params.currency,
|
|
110
|
+
product_data: { name: 'Order' },
|
|
111
|
+
unit_amount: params.amount,
|
|
112
|
+
},
|
|
113
|
+
quantity: 1,
|
|
114
|
+
}],
|
|
115
|
+
mode: 'payment',
|
|
116
|
+
success_url: params.successUrl,
|
|
117
|
+
cancel_url: params.cancelUrl,
|
|
118
|
+
metadata: params.metadata,
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
return {
|
|
122
|
+
id: session.id,
|
|
123
|
+
checkoutUrl: session.url,
|
|
124
|
+
expiresAt: new Date(session.expires_at * 1000),
|
|
125
|
+
providerData: session,
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
async capturePayment(sessionId) {
|
|
130
|
+
const session = await this.stripe.checkout.sessions.retrieve(sessionId);
|
|
131
|
+
return {
|
|
132
|
+
success: session.payment_status === 'paid',
|
|
133
|
+
paymentId: session.payment_intent as string,
|
|
134
|
+
amount: session.amount_total,
|
|
135
|
+
currency: session.currency,
|
|
136
|
+
status: session.payment_status === 'paid' ? 'captured' : 'pending',
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
async refundPayment(params) {
|
|
141
|
+
const refund = await this.stripe.refunds.create({
|
|
142
|
+
payment_intent: params.paymentId,
|
|
143
|
+
amount: params.amount,
|
|
144
|
+
reason: params.reason as any,
|
|
145
|
+
});
|
|
146
|
+
return {
|
|
147
|
+
success: refund.status === 'succeeded',
|
|
148
|
+
refundId: refund.id,
|
|
149
|
+
amount: refund.amount,
|
|
150
|
+
status: refund.status === 'succeeded' ? 'completed' : 'pending',
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
async getPaymentStatus(paymentId) {
|
|
155
|
+
const intent = await this.stripe.paymentIntents.retrieve(paymentId);
|
|
156
|
+
const statusMap = {
|
|
157
|
+
succeeded: 'captured',
|
|
158
|
+
processing: 'pending',
|
|
159
|
+
requires_payment_method: 'failed',
|
|
160
|
+
canceled: 'cancelled',
|
|
161
|
+
};
|
|
162
|
+
return statusMap[intent.status] || 'pending';
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
async verifyWebhook(params) {
|
|
166
|
+
const event = this.stripe.webhooks.constructEvent(
|
|
167
|
+
params.body, params.signature, params.secret
|
|
168
|
+
);
|
|
169
|
+
return {
|
|
170
|
+
id: event.id,
|
|
171
|
+
type: this.normalizeEventType(event.type),
|
|
172
|
+
paymentId: (event.data.object as any).payment_intent,
|
|
173
|
+
data: event.data.object as any,
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
private normalizeEventType(stripeType: string): string {
|
|
178
|
+
const map = {
|
|
179
|
+
'checkout.session.completed': 'payment.completed',
|
|
180
|
+
'payment_intent.succeeded': 'payment.captured',
|
|
181
|
+
'payment_intent.payment_failed': 'payment.failed',
|
|
182
|
+
'charge.refunded': 'payment.refunded',
|
|
183
|
+
};
|
|
184
|
+
return map[stripeType] || stripeType;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
---
|
|
190
|
+
|
|
191
|
+
## Payment Service (Provider-Agnostic)
|
|
192
|
+
|
|
193
|
+
```typescript
|
|
194
|
+
class PaymentService {
|
|
195
|
+
private providers: Map<string, PaymentProvider> = new Map();
|
|
196
|
+
private defaultProvider: string;
|
|
197
|
+
|
|
198
|
+
constructor(defaultProvider: string) {
|
|
199
|
+
this.defaultProvider = defaultProvider;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
registerProvider(provider: PaymentProvider) {
|
|
203
|
+
this.providers.set(provider.name, provider);
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
getProvider(name?: string): PaymentProvider {
|
|
207
|
+
const providerName = name || this.defaultProvider;
|
|
208
|
+
const provider = this.providers.get(providerName);
|
|
209
|
+
if (!provider) throw new Error(`Payment provider '${providerName}' not registered`);
|
|
210
|
+
return provider;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
// All business logic uses these methods — never calls providers directly
|
|
214
|
+
async createCheckout(params: { amount: number; currency: string; provider?: string }) {
|
|
215
|
+
return this.getProvider(params.provider).createPaymentSession(params);
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
async processRefund(params: { paymentId: string; amount?: number; provider?: string }) {
|
|
219
|
+
return this.getProvider(params.provider).refundPayment(params);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
// Setup
|
|
224
|
+
const paymentService = new PaymentService('stripe');
|
|
225
|
+
paymentService.registerProvider(new StripeProvider(process.env.STRIPE_SECRET_KEY));
|
|
226
|
+
// paymentService.registerProvider(new PayPalProvider(process.env.PAYPAL_CLIENT_ID));
|
|
227
|
+
|
|
228
|
+
export { paymentService };
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
---
|
|
232
|
+
|
|
233
|
+
## Adding a New Provider
|
|
234
|
+
|
|
235
|
+
1. Implement `PaymentProvider` interface
|
|
236
|
+
2. Call `paymentService.registerProvider(new YourProvider(...))`
|
|
237
|
+
3. Done — all existing business logic works without changes
|
|
238
|
+
|
|
239
|
+
---
|
|
240
|
+
|
|
241
|
+
## Sources
|
|
242
|
+
|
|
243
|
+
- Internal gap analysis: GAP-ECOM-6 (Payment Method Abstraction)
|
|
244
|
+
- Medusa.js v2: Payment Module Provider architecture (2025)
|
|
245
|
+
- Stripe Agent Toolkit: Provider interface patterns (2025)
|