@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,277 @@
|
|
|
1
|
+
# Podcast Progress Tracking - Three Root Causes & Fixes
|
|
2
|
+
|
|
3
|
+
## The Problem
|
|
4
|
+
|
|
5
|
+
"Resume where you left off" for podcast episodes was completely broken. Every save attempt returned HTTP 500, every load returned 404, and progress was never persisted. Users could not resume playback from their last position.
|
|
6
|
+
|
|
7
|
+
### Why It Was Hard
|
|
8
|
+
|
|
9
|
+
Three independent root causes were stacked on top of each other, making diagnosis extremely difficult:
|
|
10
|
+
1. Database column type mismatch (UUID vs TEXT) caused silent 500 errors
|
|
11
|
+
2. RSS GUID whitespace corruption made IDs unmatchable
|
|
12
|
+
3. Express `%2F` decoding broke URL-type route parameters
|
|
13
|
+
|
|
14
|
+
Each fix alone appeared to "not work" because the other two were still failing. Only after fixing all three simultaneously did the feature start working.
|
|
15
|
+
|
|
16
|
+
### Impact
|
|
17
|
+
|
|
18
|
+
- Zero podcast progress was ever saved to the database
|
|
19
|
+
- Users always started episodes from the beginning
|
|
20
|
+
- Console showed `[useSavePodcastProgress] Failed to save progress` on every playback tick
|
|
21
|
+
- POST `/api/podcast-progress` => 500 (every time)
|
|
22
|
+
- GET `/api/podcast-progress/:episodeId` => 404 (every time)
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
## Root Cause 1: UUID Column vs URL Episode IDs
|
|
27
|
+
|
|
28
|
+
### The Problem
|
|
29
|
+
|
|
30
|
+
The `podcast_progress` table was created with `episode_id UUID NOT NULL`. But RSS episode GUIDs are URLs like:
|
|
31
|
+
```
|
|
32
|
+
https://permalink.castos.com/podcast/31199/episode/2313538
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
PostgreSQL rejected every INSERT because a URL string is not a valid UUID.
|
|
36
|
+
|
|
37
|
+
### The Fix
|
|
38
|
+
|
|
39
|
+
Migration to change column type from UUID to TEXT:
|
|
40
|
+
|
|
41
|
+
```sql
|
|
42
|
+
-- Migration 136: Fix podcast_progress.episode_id column type
|
|
43
|
+
ALTER TABLE podcast_progress DROP CONSTRAINT IF EXISTS podcast_progress_user_id_episode_id_key;
|
|
44
|
+
ALTER TABLE podcast_progress ALTER COLUMN episode_id TYPE TEXT USING episode_id::TEXT;
|
|
45
|
+
ALTER TABLE podcast_progress ADD CONSTRAINT podcast_progress_user_id_episode_id_key UNIQUE (user_id, episode_id);
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
For production (where you can't run migration files directly), create a one-time migration endpoint:
|
|
49
|
+
|
|
50
|
+
```javascript
|
|
51
|
+
// server/routes/migrations.js
|
|
52
|
+
router.post('/fix-podcast-progress-column', async (req, res) => {
|
|
53
|
+
try {
|
|
54
|
+
await sql`ALTER TABLE podcast_progress DROP CONSTRAINT IF EXISTS podcast_progress_user_id_episode_id_key`;
|
|
55
|
+
await sql`ALTER TABLE podcast_progress ALTER COLUMN episode_id TYPE TEXT USING episode_id::TEXT`;
|
|
56
|
+
await sql`ALTER TABLE podcast_progress ADD CONSTRAINT podcast_progress_user_id_episode_id_key UNIQUE (user_id, episode_id)`;
|
|
57
|
+
res.json({ success: true, message: 'episode_id changed from UUID to TEXT' });
|
|
58
|
+
} catch (error) {
|
|
59
|
+
res.status(500).json({ success: false, message: error.message });
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
### Lesson
|
|
65
|
+
|
|
66
|
+
Never use UUID columns for externally-sourced identifiers. RSS GUIDs, OAuth tokens, external API IDs, etc. are arbitrary strings. Always use TEXT for IDs you don't control.
|
|
67
|
+
|
|
68
|
+
---
|
|
69
|
+
|
|
70
|
+
## Root Cause 2: RSS GUID Whitespace
|
|
71
|
+
|
|
72
|
+
### The Problem
|
|
73
|
+
|
|
74
|
+
The `rss-parser` npm package returns `item.guid` with leading whitespace (newline + 20 spaces):
|
|
75
|
+
|
|
76
|
+
```
|
|
77
|
+
\n https://permalink.castos.com/podcast/31199/episode/2313538
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
This invisible whitespace meant:
|
|
81
|
+
- Saving used the dirty ID: `\n https://...`
|
|
82
|
+
- Loading compared against clean IDs: no match
|
|
83
|
+
- URL-encoding produced: `%0A++++++++++++++++++++https%3A%2F%2F...`
|
|
84
|
+
|
|
85
|
+
### The Fix
|
|
86
|
+
|
|
87
|
+
Trim GUIDs at the source (RSS parser output):
|
|
88
|
+
|
|
89
|
+
```javascript
|
|
90
|
+
// server/services/podcastService.js - Episode mapping
|
|
91
|
+
id: (item.guid || `episode-${index}`).trim(),
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
Also trim on the server controller side as defense-in-depth:
|
|
95
|
+
|
|
96
|
+
```javascript
|
|
97
|
+
// server/controllers/podcastProgressController.js
|
|
98
|
+
const cleanEpisodeId = String(episodeId).trim();
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
### Lesson
|
|
102
|
+
|
|
103
|
+
Always `.trim()` external string data at ingestion boundaries. RSS feeds, API responses, and user input commonly contain invisible whitespace.
|
|
104
|
+
|
|
105
|
+
---
|
|
106
|
+
|
|
107
|
+
## Root Cause 3: Express `%2F` Decoding Breaks URL Route Params
|
|
108
|
+
|
|
109
|
+
### The Problem
|
|
110
|
+
|
|
111
|
+
Route params containing URLs break because Express automatically decodes `%2F` to `/`:
|
|
112
|
+
|
|
113
|
+
```
|
|
114
|
+
GET /podcast-progress/https%3A%2F%2Fpermalink.castos.com%2Fpodcast%2F31199
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
Express decodes this to:
|
|
118
|
+
```
|
|
119
|
+
GET /podcast-progress/https://permalink.castos.com/podcast/31199
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
Which splits into multiple path segments, causing a 404.
|
|
123
|
+
|
|
124
|
+
### The Fix
|
|
125
|
+
|
|
126
|
+
Use query parameters instead of route parameters for URL-type IDs:
|
|
127
|
+
|
|
128
|
+
**Before (broken):**
|
|
129
|
+
```javascript
|
|
130
|
+
// Routes
|
|
131
|
+
router.get('/:episodeId', controller.getEpisodeProgress);
|
|
132
|
+
router.delete('/:episodeId', controller.deleteProgress);
|
|
133
|
+
|
|
134
|
+
// Controller
|
|
135
|
+
const episodeId = req.params.episodeId;
|
|
136
|
+
|
|
137
|
+
// Client
|
|
138
|
+
api.get(`/podcast-progress/${encodeURIComponent(episodeId)}`);
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
**After (working):**
|
|
142
|
+
```javascript
|
|
143
|
+
// Routes
|
|
144
|
+
router.get('/episode', controller.getEpisodeProgress);
|
|
145
|
+
router.delete('/episode', controller.deleteProgress);
|
|
146
|
+
|
|
147
|
+
// Controller
|
|
148
|
+
const episodeId = String(req.query.id || '').trim();
|
|
149
|
+
|
|
150
|
+
// Client
|
|
151
|
+
api.get('/podcast-progress/episode', { params: { id: episodeId } });
|
|
152
|
+
api.delete('/podcast-progress/episode', { params: { id: episodeId } });
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
### Lesson
|
|
156
|
+
|
|
157
|
+
Never use Express route parameters for values that may contain forward slashes. Query parameters handle URL-type IDs correctly because they're part of the query string, not the path.
|
|
158
|
+
|
|
159
|
+
---
|
|
160
|
+
|
|
161
|
+
## Bonus: Debounce vs Throttle for Playback Progress
|
|
162
|
+
|
|
163
|
+
### The Problem
|
|
164
|
+
|
|
165
|
+
The save hook used a 10-second **debounce**, but the `handleListen` callback fires every ~250ms during playback, resetting the debounce timer each time. Progress was never saved during continuous playback.
|
|
166
|
+
|
|
167
|
+
### The Fix
|
|
168
|
+
|
|
169
|
+
Use a **throttle** (via `useRef` timestamp) instead of debounce for periodic saves during playback:
|
|
170
|
+
|
|
171
|
+
```javascript
|
|
172
|
+
const lastSaveTimeRef = useRef(0);
|
|
173
|
+
|
|
174
|
+
const handleListen = useCallback(() => {
|
|
175
|
+
const now = Date.now();
|
|
176
|
+
if (now - lastSaveTimeRef.current >= 15000) { // 15-second throttle
|
|
177
|
+
lastSaveTimeRef.current = now;
|
|
178
|
+
saveImmediate({ episodeId, positionSeconds, durationSeconds });
|
|
179
|
+
}
|
|
180
|
+
}, [episodeId, positionSeconds, durationSeconds]);
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
Use **immediate save** (no debounce) for explicit user actions:
|
|
184
|
+
|
|
185
|
+
```javascript
|
|
186
|
+
const handlePause = () => {
|
|
187
|
+
saveImmediate({ episodeId, positionSeconds, durationSeconds });
|
|
188
|
+
};
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
Use `fetch` with `keepalive: true` for `beforeunload` (not `navigator.sendBeacon` which doesn't support Authorization headers):
|
|
192
|
+
|
|
193
|
+
```javascript
|
|
194
|
+
window.addEventListener('beforeunload', () => {
|
|
195
|
+
fetch('/api/podcast-progress', {
|
|
196
|
+
method: 'POST',
|
|
197
|
+
headers: {
|
|
198
|
+
'Content-Type': 'application/json',
|
|
199
|
+
'Authorization': `Bearer ${token}`,
|
|
200
|
+
},
|
|
201
|
+
body: JSON.stringify({ episodeId, positionSeconds, durationSeconds }),
|
|
202
|
+
keepalive: true,
|
|
203
|
+
});
|
|
204
|
+
});
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
---
|
|
208
|
+
|
|
209
|
+
## Testing the Fix
|
|
210
|
+
|
|
211
|
+
### Verification via Playwright
|
|
212
|
+
|
|
213
|
+
1. Navigate to podcast page, select an episode
|
|
214
|
+
2. Monitor network requests for POST `/api/podcast-progress`
|
|
215
|
+
3. Verify POST returns 200 (not 500)
|
|
216
|
+
4. Reload page, navigate back to same episode
|
|
217
|
+
5. Verify GET `/api/podcast-progress/episode?id=...` returns 200 with saved position
|
|
218
|
+
6. Verify audio player resumes at saved position (check console for `[PodcastPlayer] Resuming at Xs`)
|
|
219
|
+
|
|
220
|
+
### Expected Results
|
|
221
|
+
|
|
222
|
+
```
|
|
223
|
+
POST /api/podcast-progress => 200 (saves every 15 seconds)
|
|
224
|
+
GET /api/podcast-progress/episode?id=<cleanId> => 200 (returns position)
|
|
225
|
+
Console: [PodcastPlayer] Resuming at 491.0s of 2831.7s
|
|
226
|
+
Player position: 08:12 (not 00:00)
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
---
|
|
230
|
+
|
|
231
|
+
## Prevention
|
|
232
|
+
|
|
233
|
+
1. **Use TEXT for external IDs** - Never assume external systems use UUIDs
|
|
234
|
+
2. **Trim all external strings** - RSS, APIs, webhooks all produce dirty data
|
|
235
|
+
3. **Use query params for URL-type IDs** - Express `%2F` decoding is a known gotcha
|
|
236
|
+
4. **Throttle, don't debounce, periodic saves** - Debounce resets on every tick
|
|
237
|
+
5. **Test with real data via Playwright** - Unit tests with clean mock data miss these edge cases
|
|
238
|
+
|
|
239
|
+
---
|
|
240
|
+
|
|
241
|
+
## Related Patterns
|
|
242
|
+
|
|
243
|
+
- [RSS Podcast Integration](../integrations/rss-podcast-integration.md) - Full RSS podcast setup
|
|
244
|
+
- [Express Route Ordering](EXPRESS_ROUTE_ORDERING_MIDDLEWARE_INTERCEPTION.md) - Express routing gotchas
|
|
245
|
+
- [Supabase Connection Fix](../database-solutions/supabase-connection-pooler-fix.md) - Database connection issues
|
|
246
|
+
|
|
247
|
+
## Common Mistakes to Avoid
|
|
248
|
+
|
|
249
|
+
- Using UUID columns for non-UUID identifiers from external systems
|
|
250
|
+
- Assuming `rss-parser` returns clean strings (it doesn't)
|
|
251
|
+
- Using `encodeURIComponent()` for route params with slashes (Express decodes `%2F` anyway)
|
|
252
|
+
- Using debounce for periodic saves during continuous playback (use throttle)
|
|
253
|
+
- Using `navigator.sendBeacon()` when you need Authorization headers (use `fetch` + `keepalive`)
|
|
254
|
+
|
|
255
|
+
---
|
|
256
|
+
|
|
257
|
+
## Resources
|
|
258
|
+
|
|
259
|
+
- [Express %2F issue](https://github.com/expressjs/express/issues/3552)
|
|
260
|
+
- [rss-parser npm](https://www.npmjs.com/package/rss-parser)
|
|
261
|
+
- [MDN: fetch keepalive](https://developer.mozilla.org/en-US/docs/Web/API/fetch#keepalive)
|
|
262
|
+
|
|
263
|
+
## Time to Implement
|
|
264
|
+
|
|
265
|
+
**30-45 minutes** for all three fixes (if you know the root causes). **6+ hours** to diagnose from scratch.
|
|
266
|
+
|
|
267
|
+
## Difficulty Level
|
|
268
|
+
|
|
269
|
+
Diagnosis: ⭐⭐⭐⭐⭐ (5/5) - Three stacked root causes make this extremely hard to diagnose
|
|
270
|
+
Fix: ⭐⭐ (2/5) - Each individual fix is simple once identified
|
|
271
|
+
|
|
272
|
+
---
|
|
273
|
+
|
|
274
|
+
**Author Notes:**
|
|
275
|
+
This bug took multiple sessions and Playwright browser automation to diagnose. The key insight was using Playwright to observe actual network requests on the live site, which revealed the 500/404 pattern. From there, tracing the episode ID format in the URL (`%0A++++++++++++++++++++https%3A%2F%2F...`) immediately revealed the whitespace issue, and checking the database schema revealed the UUID mismatch. The Express `%2F` issue was found by testing what happened after fixing the first two.
|
|
276
|
+
|
|
277
|
+
The stacking effect is the real danger: each fix alone makes you think "it's still broken" when really it's a different bug now. Always enumerate all possible failure points before concluding a fix didn't work.
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: rate-limiting-toggle
|
|
3
|
+
category: api-patterns
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
contributed: 2026-02-24
|
|
6
|
+
contributor: dominion-flow
|
|
7
|
+
tags: [rate-limiting, api, middleware, express, toggle, throttle, bypass]
|
|
8
|
+
difficulty: medium
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# Rate Limiting with Toggle
|
|
12
|
+
|
|
13
|
+
## Problem
|
|
14
|
+
|
|
15
|
+
Rate limiting protects APIs from abuse, but during development, testing, or specific workflows you need it OFF. Hardcoded rate limits slow down dev, break integration tests, and frustrate admins who need burst access.
|
|
16
|
+
|
|
17
|
+
## Solution Pattern
|
|
18
|
+
|
|
19
|
+
Implement rate limiting as toggleable middleware — on/off globally, per-route, or per-user. Environment variable controls the master switch.
|
|
20
|
+
|
|
21
|
+
## Implementation
|
|
22
|
+
|
|
23
|
+
### Express Middleware with Global Toggle
|
|
24
|
+
|
|
25
|
+
```javascript
|
|
26
|
+
// middleware/rateLimiter.js
|
|
27
|
+
const rateLimit = require('express-rate-limit')
|
|
28
|
+
|
|
29
|
+
// Master toggle — set RATE_LIMIT_ENABLED=false to disable
|
|
30
|
+
const ENABLED = process.env.RATE_LIMIT_ENABLED !== 'false'
|
|
31
|
+
|
|
32
|
+
function createLimiter(options = {}) {
|
|
33
|
+
const defaults = {
|
|
34
|
+
windowMs: 15 * 60 * 1000, // 15 minutes
|
|
35
|
+
max: 100, // 100 requests per window
|
|
36
|
+
standardHeaders: true,
|
|
37
|
+
legacyHeaders: false,
|
|
38
|
+
message: { error: 'Too many requests, slow down' },
|
|
39
|
+
skip: () => !ENABLED, // <-- THE TOGGLE: skip all checks when disabled
|
|
40
|
+
...options,
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
return rateLimit(defaults)
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// Pre-built tiers
|
|
47
|
+
const limiter = {
|
|
48
|
+
// Standard API routes
|
|
49
|
+
standard: createLimiter({ max: 100 }),
|
|
50
|
+
|
|
51
|
+
// Auth routes (stricter)
|
|
52
|
+
auth: createLimiter({ max: 20, windowMs: 15 * 60 * 1000 }),
|
|
53
|
+
|
|
54
|
+
// Upload routes (lenient)
|
|
55
|
+
upload: createLimiter({ max: 10, windowMs: 60 * 60 * 1000 }),
|
|
56
|
+
|
|
57
|
+
// Webhook routes (no limit by default)
|
|
58
|
+
webhook: createLimiter({ max: 1000 }),
|
|
59
|
+
|
|
60
|
+
// Custom: pass your own options
|
|
61
|
+
custom: createLimiter,
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
module.exports = { limiter, ENABLED }
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
### Per-Route Toggle
|
|
68
|
+
|
|
69
|
+
```javascript
|
|
70
|
+
// routes/api.js
|
|
71
|
+
const { limiter } = require('../middleware/rateLimiter')
|
|
72
|
+
|
|
73
|
+
// Apply to specific routes
|
|
74
|
+
router.use('/auth', limiter.auth)
|
|
75
|
+
router.use('/upload', limiter.upload)
|
|
76
|
+
router.use('/api', limiter.standard)
|
|
77
|
+
|
|
78
|
+
// Some routes never rate-limited
|
|
79
|
+
router.use('/health', (req, res) => res.json({ ok: true }))
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
### Per-User Bypass (Admin/API Key)
|
|
83
|
+
|
|
84
|
+
```javascript
|
|
85
|
+
// middleware/rateLimiter.js — enhanced skip function
|
|
86
|
+
function createLimiter(options = {}) {
|
|
87
|
+
return rateLimit({
|
|
88
|
+
...defaults,
|
|
89
|
+
skip: (req) => {
|
|
90
|
+
// Master toggle
|
|
91
|
+
if (!ENABLED) return true
|
|
92
|
+
|
|
93
|
+
// Admin bypass
|
|
94
|
+
if (req.user?.role === 'admin') return true
|
|
95
|
+
|
|
96
|
+
// API key bypass (for trusted integrations)
|
|
97
|
+
if (req.headers['x-api-key'] === process.env.RATE_LIMIT_BYPASS_KEY) return true
|
|
98
|
+
|
|
99
|
+
// Per-route disable via route metadata
|
|
100
|
+
if (req.route?.rateLimitDisabled) return true
|
|
101
|
+
|
|
102
|
+
return false
|
|
103
|
+
},
|
|
104
|
+
...options,
|
|
105
|
+
})
|
|
106
|
+
}
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
### .env Configuration
|
|
110
|
+
|
|
111
|
+
```bash
|
|
112
|
+
# Production: ON
|
|
113
|
+
RATE_LIMIT_ENABLED=true
|
|
114
|
+
RATE_LIMIT_BYPASS_KEY=your-secret-key-for-trusted-clients
|
|
115
|
+
|
|
116
|
+
# Development: OFF
|
|
117
|
+
RATE_LIMIT_ENABLED=false
|
|
118
|
+
|
|
119
|
+
# Testing: OFF (in test setup)
|
|
120
|
+
# process.env.RATE_LIMIT_ENABLED = 'false'
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
### Runtime Toggle (No Restart)
|
|
124
|
+
|
|
125
|
+
```javascript
|
|
126
|
+
// For when you need to flip it without restarting the server
|
|
127
|
+
// admin route — protected behind auth
|
|
128
|
+
router.post('/admin/rate-limit', requireAdmin, (req, res) => {
|
|
129
|
+
const { enabled } = req.body
|
|
130
|
+
process.env.RATE_LIMIT_ENABLED = enabled ? 'true' : 'false'
|
|
131
|
+
res.json({ rateLimitEnabled: enabled })
|
|
132
|
+
})
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
## Response Headers (When Active)
|
|
136
|
+
|
|
137
|
+
```
|
|
138
|
+
X-RateLimit-Limit: 100
|
|
139
|
+
X-RateLimit-Remaining: 87
|
|
140
|
+
X-RateLimit-Reset: 1708934400
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
Clients can read these headers to self-throttle.
|
|
144
|
+
|
|
145
|
+
## When to Use
|
|
146
|
+
|
|
147
|
+
- Any API that faces the internet
|
|
148
|
+
- APIs with mixed access patterns (humans + bots + admins)
|
|
149
|
+
- Development environments where rate limits slow you down
|
|
150
|
+
|
|
151
|
+
## When NOT to Use
|
|
152
|
+
|
|
153
|
+
- Internal microservice-to-microservice calls (use circuit breakers instead)
|
|
154
|
+
- WebSocket connections (different throttling model)
|
|
155
|
+
- When the upstream proxy (nginx, Cloudflare) already handles rate limiting
|