@thierrynakoa/fire-flow 12.2.2 → 13.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CREDITS.md +25 -0
- package/DOMINION-FLOW-OVERVIEW.md +182 -38
- package/README.md +399 -690
- package/TROUBLESHOOTING.md +264 -367
- package/agents/fire-debugger.md +54 -0
- package/agents/fire-executor.md +1610 -1033
- package/agents/fire-fact-checker.md +1 -1
- package/agents/fire-planner.md +85 -17
- package/agents/fire-project-researcher.md +1 -1
- package/agents/fire-researcher.md +4 -22
- package/agents/{fire-phoenix-analyst.md → fire-resurrection-analyst.md} +394 -394
- package/agents/fire-reviewer.md +552 -499
- package/agents/fire-verifier.md +114 -19
- package/bin/cli.js +18 -101
- package/commands/fire-0-orient.md +2 -2
- package/commands/fire-1a-new.md +50 -15
- package/commands/fire-1c-setup.md +33 -5
- package/commands/fire-1d-discuss.md +87 -1
- package/commands/fire-2-plan.md +556 -527
- package/commands/fire-3-execute.md +2046 -1356
- package/commands/fire-4-verify.md +975 -906
- package/commands/fire-5-handoff.md +46 -5
- package/commands/fire-6-resume.md +2 -31
- package/commands/fire-add-new-skill.md +138 -19
- package/commands/fire-autonomous.md +14 -2
- package/commands/fire-complete-milestone.md +1 -1
- package/commands/fire-cost.md +179 -183
- package/commands/fire-debug.md +1 -6
- package/commands/fire-loop-resume.md +2 -2
- package/commands/fire-loop-stop.md +1 -1
- package/commands/fire-loop.md +2 -15
- package/commands/fire-map-codebase.md +1 -1
- package/commands/fire-migrate-database.md +548 -0
- package/commands/fire-new-milestone.md +1 -1
- package/commands/fire-reflect.md +1 -2
- package/commands/fire-research.md +142 -21
- package/commands/{fire-phoenix.md → fire-resurrect.md} +859 -603
- package/commands/fire-scaffold.md +297 -0
- package/commands/fire-search.md +1 -2
- package/commands/fire-security-scan.md +483 -484
- package/commands/fire-setup.md +359 -0
- package/commands/fire-skill.md +770 -0
- package/commands/fire-skills-diff.md +506 -506
- package/commands/fire-skills-history.md +388 -388
- package/commands/fire-skills-rollback.md +7 -7
- package/commands/fire-skills-sync.md +470 -470
- package/commands/fire-test.md +5 -5
- package/commands/fire-todos.md +1 -1
- package/commands/fire-update.md +5 -5
- package/commands/fire-validate-skills.md +282 -0
- package/commands/fire-verify-uat.md +9 -177
- package/commands/fire-vuln-scan.md +492 -493
- package/hooks/run-hook.sh +8 -8
- package/hooks/run-session-end.sh +7 -7
- package/hooks/session-end.sh +90 -90
- package/hooks/session-start.sh +1 -1
- package/package.json +4 -25
- package/plugin.json +7 -7
- package/references/autonomy-levels.md +235 -0
- package/references/behavioral-directives.md +95 -3
- package/references/blocker-tracking.md +1 -1
- package/references/circuit-breaker.md +93 -2
- package/references/context-engineering.md +227 -9
- package/references/honesty-protocols.md +70 -1
- package/references/issue-to-pr-pipeline.md +149 -150
- package/references/metrics-and-trends.md +1 -2
- package/references/research-improvements.md +4 -108
- package/references/sdlc-mapping.md +73 -0
- package/references/state-machine.md +151 -0
- package/skills-library/AVAILABLE_TOOLS_REFERENCE.md +333 -0
- package/skills-library/SKILLS-INDEX.md +57 -558
- package/skills-library/SKILLS_LIBRARY_INDEX.md +532 -0
- package/skills-library/_general/api-patterns/api-field-name-mismatch.md +107 -0
- package/skills-library/_general/api-patterns/streaming-command-timeout.md +122 -0
- package/skills-library/_general/api-patterns/streaming-proxy-cors-bypass.md +102 -0
- package/skills-library/_general/automation/settings-gui-generator.md +172 -0
- package/skills-library/_general/database-solutions/data-type-mapping-reference.md +181 -0
- package/skills-library/_general/database-solutions/mysql-limit-offset-string-coercion.md +102 -0
- package/skills-library/_general/database-solutions/mysql-to-pg-migration.md +195 -0
- package/skills-library/_general/database-solutions/orm-schema-portability.md +193 -0
- package/skills-library/_general/database-solutions/persistent-analysis-storage.md +207 -0
- package/skills-library/_general/database-solutions/pg-to-mysql-schema-migration-methodology.md +190 -0
- package/skills-library/_general/database-solutions/sql-dialect-compatibility-matrix.md +306 -0
- package/skills-library/_general/database-solutions/sqlite-to-pg-migration.md +219 -0
- package/skills-library/_general/frontend/canvas-bubble-animation-grouping.md +270 -0
- package/skills-library/_general/frontend/color-token-migration.md +112 -0
- package/skills-library/_general/frontend/framer-motion-layoutid-grouping.md +150 -0
- package/skills-library/_general/frontend/pyqt6-settings-dialog.md +191 -0
- package/skills-library/_general/frontend/react-flow-animated-layout-switching.md +101 -0
- package/skills-library/_general/frontend/react-hooks-order-debugging.md +141 -0
- package/skills-library/_general/frontend/redux-localstorage-auth-desync.md +126 -0
- package/skills-library/_general/frontend/safari-csp-theme-color-debugging.md +124 -0
- package/skills-library/_general/frontend/safari-sw-cache-poisoning.md +138 -0
- package/skills-library/_general/frontend/svg-sparkline-no-charting-library.md +131 -0
- package/skills-library/_general/growth-marketing/oss-daily-growth-intelligence.md +224 -0
- package/skills-library/_general/integrations/claude-code-local-mcp-integration.md +250 -0
- package/skills-library/_general/integrations/mcp-composite-tool-orchestration.md +200 -0
- package/skills-library/_general/methodology/AGENT_SDK_STANDALONE_TOOLING.md +181 -0
- package/skills-library/_general/methodology/AGENT_TEAMS_GUIDE.md +169 -0
- package/skills-library/_general/methodology/ALAS_STATEFUL_EXECUTION.md +207 -0
- package/skills-library/_general/methodology/AUTO_REVIEWER_SUBAGENT.md +211 -0
- package/skills-library/_general/methodology/CONSISTENCY_CHECK_AMBIGUITY_GATE.md +96 -0
- package/skills-library/_general/methodology/DEAD_ENDS_SHELF.md +4 -4
- package/skills-library/_general/methodology/DISTILL_NOT_DUMP.md +108 -0
- package/skills-library/_general/methodology/EXECUTION_PROGRESS_MONITOR.md +157 -0
- package/skills-library/_general/methodology/HIERARCHICAL_REVIEW_MARS.md +122 -0
- package/skills-library/_general/methodology/MCP_INTER_AGENT_BRIDGE.md +207 -0
- package/skills-library/_general/methodology/MERMAID_WIZARD_DIAGRAMS.md +77 -0
- package/skills-library/_general/methodology/MISSING_DIMENSION_DETECTOR.md +89 -0
- package/skills-library/_general/methodology/MULTI_AGENT_COORDINATION.md +397 -0
- package/skills-library/_general/methodology/OBSERVATION_MASKING.md +100 -0
- package/skills-library/_general/methodology/PHOENIX_REBUILD_METHODOLOGY.md +82 -11
- package/skills-library/_general/methodology/REVIEW_BACKTRACK_PANEL.md +140 -0
- package/skills-library/_general/methodology/REVIEW_FIX_LOOP.md +117 -0
- package/skills-library/_general/methodology/VOTING_VERDICT_ARBITRATION.md +155 -0
- package/skills-library/_general/methodology/ZERO_FRICTION_CLI_SETUP.md +2 -2
- package/skills-library/_general/methodology/dead-code-activation.md +123 -0
- package/skills-library/_general/methodology/debug-swarm-researcher-escape-hatch.md +240 -240
- package/skills-library/_general/methodology/shell-autonomous-loop-fixplan.md +1 -1
- package/skills-library/_general/patterns-standards/GOF_DESIGN_PATTERNS_FOR_AI_AGENTS.md +5 -5
- package/skills-library/_general/patterns-standards/cascading-failure-diagnosis.md +119 -0
- package/skills-library/_general/patterns-standards/domain-specific-layout-algorithms.md +209 -0
- package/skills-library/_general/patterns-standards/python-desktop-app-architecture.md +399 -0
- package/skills-library/_general/patterns-standards/realtime-monitoring-dashboard.md +457 -0
- package/skills-library/_general/patterns-standards/togglable-processing-pipeline.md +169 -0
- package/skills-library/_general/performance/liveclock-extraction.md +112 -0
- package/skills-library/_general/performance/ref-based-canvas-animation.md +117 -0
- package/skills-library/_general/performance/use-visible-interval.md +131 -0
- package/skills-library/_general/testing/playwright-firefox-withcredentials-auth-issue.md +104 -0
- package/skills-library/_quarantine/README.md +30 -0
- package/skills-library/api-patterns/BROADCAST_SCHEDULER_SHARED_EXECUTE_FUNCTION.md +150 -0
- package/skills-library/api-patterns/ERROR_RESPONSE_STANDARDS.md +145 -0
- package/skills-library/api-patterns/EXPRESS_ROUTE_ORDERING_MIDDLEWARE_INTERCEPTION.md +326 -0
- package/skills-library/api-patterns/PAGINATION_PATTERNS.md +137 -0
- package/skills-library/api-patterns/PODCAST_PROGRESS_TRACKING_THREE_ROOT_CAUSES.md +277 -0
- package/skills-library/api-patterns/RATE_LIMITING_TOGGLE.md +155 -0
- package/skills-library/api-patterns/graphql-content-queries.md +708 -0
- package/skills-library/appointment-scheduler-design.md +423 -0
- package/skills-library/automation/AUTO_POPULATE_COMPLETE_GUIDE.md +631 -0
- package/skills-library/automation/CC_WORKFLOW_STUDIO.md +83 -0
- package/skills-library/automation/CLAUDE_CODE_SWARM_MODE.md +95 -0
- package/skills-library/automation/DAEMON_TRIGGER_FILE_IPC.md +195 -0
- package/skills-library/automation/scheduled-content-publishing.md +608 -0
- package/skills-library/awesome-workflows/Blogging-Platform-Instructions/view_commands.md +25 -0
- package/skills-library/awesome-workflows/CREDENTIAL-SECURITY-WORKFLOW.md +109 -0
- package/skills-library/awesome-workflows/DEBUGGING-WORKFLOW.md +124 -0
- package/skills-library/awesome-workflows/Design-Review-Workflow/README.md +31 -0
- package/skills-library/awesome-workflows/Design-Review-Workflow/design-principles-example.md +129 -0
- package/skills-library/awesome-workflows/Design-Review-Workflow/design-review-agent.md +107 -0
- package/skills-library/awesome-workflows/Design-Review-Workflow/design-review-claude-md-snippet.md +24 -0
- package/skills-library/awesome-workflows/Design-Review-Workflow/design-review-slash-command.md +38 -0
- package/skills-library/awesome-workflows/PARALLEL-RESEARCH-WORKFLOW.md +89 -0
- package/skills-library/awesome-workflows/PHASE-EXECUTION-WORKFLOW.md +97 -0
- package/skills-library/awesome-workflows/SESSION-HANDOFF-WORKFLOW.md +116 -0
- package/skills-library/cms-patterns/content-branch-preview.md +515 -0
- package/skills-library/cms-patterns/inline-visual-editing.md +666 -0
- package/skills-library/cms-patterns/mdx-component-content.md +649 -0
- package/skills-library/cms-patterns/media-manager-abstraction.md +827 -0
- package/skills-library/cms-patterns/schema-driven-form-generator.md +838 -0
- package/skills-library/complexity-metrics/complexity-divider.md +707 -0
- package/skills-library/complexity-metrics/work-with-complexity.md +193 -0
- package/skills-library/creative-multimedia/animation-stack-guide.md +577 -0
- package/skills-library/creative-multimedia/audio-enhancement-pipeline.md +625 -0
- package/skills-library/creative-multimedia/content-repurposing-pipeline.md +1146 -0
- package/skills-library/creative-multimedia/data-visualization-generator.md +862 -0
- package/skills-library/creative-multimedia/doc-to-podcast-pipeline.md +2184 -0
- package/skills-library/creative-multimedia/ffmpeg-command-generator.md +405 -0
- package/skills-library/creative-multimedia/image-optimization-pipeline.md +605 -0
- package/skills-library/creative-multimedia/multi-format-content-generator.md +1759 -0
- package/skills-library/creative-multimedia/og-image-generator.md +635 -0
- package/skills-library/creative-multimedia/podcast-audio-composition.md +1355 -0
- package/skills-library/creative-multimedia/podcast-quality-evaluation.md +1452 -0
- package/skills-library/creative-multimedia/podcast-script-generation.md +1841 -0
- package/skills-library/creative-multimedia/svg-generation.md +750 -0
- package/skills-library/creative-multimedia/text-to-speech-provider-selector.md +1414 -0
- package/skills-library/creative-multimedia/transcription-pipeline-selector.md +677 -0
- package/skills-library/creative-multimedia/video-streaming-setup.md +559 -0
- package/skills-library/database-solutions/AI_RESPONSE_DATABASE_CACHING.md +520 -0
- package/skills-library/database-solutions/CONDITIONAL_SQL_MIGRATION_PATTERN.md +119 -0
- package/skills-library/database-solutions/DATABASE_COLUMN_NAME_MISMATCH.md +393 -0
- package/skills-library/database-solutions/DATABASE_SCHEMA.md +394 -0
- package/skills-library/database-solutions/DATABASE_SCHEMA_VERIFICATION_GUIDE.md +348 -0
- package/skills-library/database-solutions/DATABASE_STRATEGY.md +71 -0
- package/skills-library/database-solutions/ES_MODULE_SEED_SCRIPT_PATTERN.md +52 -0
- package/skills-library/database-solutions/MIGRATION_GUIDE.md +3 -0
- package/skills-library/database-solutions/PLPGSQL_VARIABLE_CONFLICT_FIX.md +208 -0
- package/skills-library/database-solutions/POSTGRESQL_JSONB_DOUBLE_STRINGIFY_FIX.md +245 -0
- package/skills-library/database-solutions/POSTGRESQL_LICENSE_TABLE_DESIGN.md +393 -0
- package/skills-library/database-solutions/POSTGRESQL_UUID_DOCUMENT_RAG_DUAL_SCOPE.md +732 -0
- package/skills-library/database-solutions/POSTGRES_SQL_TEMPLATE_BINDING_ERROR.md +240 -0
- package/skills-library/database-solutions/PRISMA_DB_PUSH_DATA_LOSS_PREVENTION.md +141 -0
- package/skills-library/database-solutions/PRODUCTION_QUERY_OPTIMIZATION_RESTART_FIX.md +389 -0
- package/skills-library/database-solutions/RLS_SECURITY_GUIDE.md +107 -0
- package/skills-library/database-solutions/SCHEMA_ENHANCEMENTS_GUIDE.md +373 -0
- package/skills-library/database-solutions/SCHEMA_MIGRATION_GUIDE.md +368 -0
- package/skills-library/database-solutions/SCHEMA_VERIFICATION_QUICK_REFERENCE.md +104 -0
- package/skills-library/database-solutions/ai-erd-generator.md +1213 -0
- package/skills-library/database-solutions/content-publishing-states.md +631 -0
- package/skills-library/database-solutions/database-schema-designer.md +522 -0
- package/skills-library/database-solutions/er-diagram-components.md +569 -0
- package/skills-library/database-solutions/er-to-ddl-mapping.md +1405 -0
- package/skills-library/database-solutions/erd-creator-textbook-research.md +433 -0
- package/skills-library/database-solutions/erd-react-flow-architecture.md +1965 -0
- package/skills-library/database-solutions/mariadb-aggregate-function-replacement.md +145 -0
- package/skills-library/database-solutions/normalization-validator.md +778 -0
- package/skills-library/database-solutions/postgres-full-text-search-content.md +494 -0
- package/skills-library/database-solutions/postgresql-to-mysql-runtime-translation.md +286 -0
- package/skills-library/database-solutions/regex-alternation-ordering-sql-types.md +92 -0
- package/skills-library/database-solutions/reserved-word-context-aware-quoting.md +142 -0
- package/skills-library/database-solutions/sql-ddl-generator.md +756 -0
- package/skills-library/database-solutions/supabase-connection-pooler-fix.md +102 -0
- package/skills-library/deployment-security/CPANEL_NODE_DEPLOYMENT.md +166 -0
- package/skills-library/deployment-security/DEPLOYMENT.md +275 -0
- package/skills-library/deployment-security/DEPLOYMENT_CHECKLIST.md +363 -0
- package/skills-library/deployment-security/DEPLOYMENT_PLAN.md +669 -0
- package/skills-library/deployment-security/KNEX_DATABASE_ABSTRACTION.md +444 -0
- package/skills-library/deployment-security/LICENSE_KEY_SYSTEM.md +206 -0
- package/skills-library/deployment-security/NODE18_DEPENDENCY_COMPATIBILITY.md +284 -0
- package/skills-library/deployment-security/PHP_INSTALLER_WIZARD_GUIDE.md +315 -0
- package/skills-library/deployment-security/PM2_ENVIRONMENT_VARIABLE_CACHING.md +256 -0
- package/skills-library/deployment-security/PM2_MEMORY_EXHAUSTION_FIX.md +370 -0
- package/skills-library/deployment-security/PRODUCTION_DEPLOYMENT_GUIDE.md +592 -0
- package/skills-library/deployment-security/PRODUCTION_HARDENING_DOCUMENTATION.md +307 -0
- package/skills-library/deployment-security/PRODUCTION_RECOVERY_CHERRY_PICK_PATTERN.md +202 -0
- package/skills-library/deployment-security/PYINSTALLER_CUDA_WHISPER_BUNDLING.md +236 -0
- package/skills-library/deployment-security/SECURITY.md +41 -0
- package/skills-library/deployment-security/SMTP_SSL_HOSTNAME_MISMATCH_SHARED_HOSTING.md +220 -0
- package/skills-library/deployment-security/SPA_SEO_OPTIMIZATION_CPANEL.md +200 -0
- package/skills-library/deployment-security/SUPABASE_EDGE_FUNCTIONS.md +338 -0
- package/skills-library/deployment-security/VERCEL_GITHUB_DEPLOYMENT_GUIDE.md +858 -0
- package/skills-library/deployment-security/VPS_DEPLOYMENT_READINESS.md +356 -0
- package/skills-library/deployment-security/deployment-changes-not-applying.md +241 -0
- package/skills-library/deployment-security/env-file-management-production-local.md +203 -0
- package/skills-library/deployment-security/express-secure-file-downloads.md +413 -0
- package/skills-library/deployment-security/react-production-deployment-desktop-guide.md +2011 -0
- package/skills-library/deployment-security/self-hosted-supabase-coolify-guide.md +1684 -0
- package/skills-library/deployment-security/unique-features-ai-strategy-plaid-security.md +1613 -0
- package/skills-library/deployment-security/vps-deployment.md +135 -0
- package/skills-library/document-processing/WORD_EXPORT_MARKDOWN_FORMATTING.md +482 -0
- package/skills-library/document-processing/document-ai-landingai-integration.md +677 -0
- package/skills-library/document-processing/express-secure-file-downloads-mern.md +413 -0
- package/skills-library/document-processing/express-secure-file-downloads.md +413 -0
- package/skills-library/document-processing/md-to-word-converter.md +318 -0
- package/skills-library/document-processing/pdf-forms-integration/README.md +101 -0
- package/skills-library/document-processing/pdf-forms-integration/SKILL.md +662 -0
- package/skills-library/ecommerce/ADMIN_PRODUCTS_GUIDE.md +428 -0
- package/skills-library/ecommerce/ECOMMERCE_API_REFERENCE.md +776 -0
- package/skills-library/ecommerce/ECOMMERCE_COMPLETION_SUMMARY.md +673 -0
- package/skills-library/ecommerce/ECOMMERCE_IMPLEMENTATION_GUIDE.md +729 -0
- package/skills-library/ecommerce/ECOMMERCE_QUICK_REFERENCE.md +521 -0
- package/skills-library/ecommerce/ECOMMERCE_TESTING_CHECKLIST.md +565 -0
- package/skills-library/ecommerce/ECOMMERCE_WORKFLOW_GUIDE.md +1059 -0
- package/skills-library/ecommerce/PRODUCT_CREATION_EXPANDED.md +522 -0
- package/skills-library/ecommerce/agentic-commerce-protocol.md +203 -0
- package/skills-library/ecommerce/cart-abandonment-recovery.md +236 -0
- package/skills-library/ecommerce/cart-architecture-patterns.md +300 -0
- package/skills-library/ecommerce/cart-item-count-indicator.md +264 -0
- package/skills-library/ecommerce/checkout-ux-conversion.md +227 -0
- package/skills-library/ecommerce/composable-commerce-selection.md +166 -0
- package/skills-library/ecommerce/ecommerce-analytics-patterns.md +167 -0
- package/skills-library/ecommerce/fraud-detection-patterns.md +179 -0
- package/skills-library/ecommerce/inventory-stock-management.md +270 -0
- package/skills-library/ecommerce/order-saga-state-machine.md +336 -0
- package/skills-library/ecommerce/payment-provider-abstraction.md +245 -0
- package/skills-library/ecommerce/pci-compliance-checklist.md +192 -0
- package/skills-library/ecommerce/refund-chargeback-handling.md +177 -0
- package/skills-library/ecommerce/shipping-carrier-integration.md +218 -0
- package/skills-library/ecommerce/webhook-idempotency-patterns.md +253 -0
- package/skills-library/excalidraw-diagrams/.github/workflows/ci.yml +558 -0
- package/skills-library/excalidraw-diagrams/.github/workflows/prompt-gallery.yml +448 -0
- package/skills-library/excalidraw-diagrams/.github/workflows/release.yml +42 -0
- package/skills-library/excalidraw-diagrams/.github/workflows/test-reusable-ci.yml +25 -0
- package/skills-library/excalidraw-diagrams/CLAUDE.md +57 -0
- package/skills-library/excalidraw-diagrams/LICENSE +21 -0
- package/skills-library/excalidraw-diagrams/README.md +178 -0
- package/skills-library/excalidraw-diagrams/SKILL.md +715 -0
- package/skills-library/form-solutions/BUTTON_TYPE_FORM_SUBMISSION.md +336 -0
- package/skills-library/form-solutions/FILLABLE_PDF_IMPLEMENTATION.md +226 -0
- package/skills-library/form-solutions/SURVEYJS_QUESTIONNAIRE_SYSTEM.md +367 -0
- package/skills-library/form-solutions/tiptap-minimal-setup.md +690 -0
- package/skills-library/frontend/scholarly-classification-bubble-map.md +149 -0
- package/skills-library/infrastructure/ci-cd-pipeline-builder.md +517 -0
- package/skills-library/infrastructure/observability-designer.md +264 -0
- package/skills-library/infrastructure/performance-profiler.md +621 -0
- package/skills-library/installer-wizard-patterns.md +249 -0
- package/skills-library/integrations/CLAUDE_CODE_TOKEN_ANALYTICS.md +160 -0
- package/skills-library/integrations/CONFIGURABLE_AI_PROVIDER_SELECTION.md +728 -0
- package/skills-library/integrations/SOCKET_IO_BROADCAST_ALL_VS_ROOM.md +141 -0
- package/skills-library/integrations/VIRTUAL_MEETINGS_IMPLEMENTATION.md +374 -0
- package/skills-library/integrations/WORDPRESS_LEARNDASH_DATA_RECOVERY.md +53 -0
- package/skills-library/integrations/YOUTUBE_API_SETUP.md +141 -0
- package/skills-library/integrations/YOUTUBE_BOOKMARKING_EXPLANATION.md +252 -0
- package/skills-library/integrations/YOUTUBE_BOOKMARKING_SOLUTION.md +268 -0
- package/skills-library/integrations/YOUTUBE_OAUTH_SETUP_GUIDE.md +200 -0
- package/skills-library/integrations/YOUTUBE_VIDEO_FIX_COMPLETE.md +192 -0
- package/skills-library/integrations/ai-ml/GEMINI_AI_RAG_PIPELINE_COMPLETE_GUIDE.md +195 -0
- package/skills-library/integrations/ai-ml/GEMINI_IMAGE_GENERATION_SETUP.md +64 -0
- package/skills-library/integrations/cloudflare/cloudflare-turnstile-debugging.md +202 -0
- package/skills-library/integrations/cloudflare/cloudflare-turnstile-implementation.md +476 -0
- package/skills-library/integrations/cloudflare-turnstile-debugging.md +202 -0
- package/skills-library/integrations/cloudflare-turnstile-implementation.md +476 -0
- package/skills-library/integrations/ghost-creator-monetization-pattern.md +454 -0
- package/skills-library/integrations/headless-cms-architecture.md +484 -0
- package/skills-library/integrations/headless-cms-stack-selection.md +183 -0
- package/skills-library/integrations/payload-cms-patterns.md +674 -0
- package/skills-library/integrations/realtimestt-openwakeword-cuda-windows.md +229 -0
- package/skills-library/integrations/rss-podcast-integration.md +300 -0
- package/skills-library/integrations/wordpress/WORDPRESS_LEARNDASH_DATA_RECOVERY.md +53 -0
- package/skills-library/integrations/youtube/YOUTUBE_API_SETUP.md +141 -0
- package/skills-library/integrations/youtube/YOUTUBE_BOOKMARKING_EXPLANATION.md +252 -0
- package/skills-library/integrations/youtube/YOUTUBE_BOOKMARKING_SOLUTION.md +268 -0
- package/skills-library/integrations/youtube/YOUTUBE_OAUTH_SETUP_GUIDE.md +200 -0
- package/skills-library/integrations/youtube/YOUTUBE_VIDEO_FIX_COMPLETE.md +192 -0
- package/skills-library/marketing/campaign-analytics.md +97 -0
- package/skills-library/marketing/content-creator.md +105 -0
- package/skills-library/marketing/marketing-strategy-pmm.md +94 -0
- package/skills-library/marketing/social-media-analyzer.md +81 -0
- package/skills-library/methodology/ADVANCED_ORCHESTRATION_PATTERNS.md +401 -0
- package/skills-library/methodology/AGENT_SELF_IMPROVEMENT_LOOP.md +179 -0
- package/skills-library/methodology/BREATH_BASED_PARALLEL_EXECUTION.md +1 -1
- package/skills-library/methodology/CLEANSING_CYCLE.md +358 -0
- package/skills-library/methodology/CONFIDENCE_ANNOTATION_PATTERN.md +143 -0
- package/skills-library/methodology/CRITICAL_PATTERNS_DOCUMENTATION_COMPLETE.md +204 -0
- package/skills-library/methodology/DELIVERABLES_SUMMARY.md +341 -0
- package/skills-library/methodology/DIFFICULTY_AWARE_AGENT_ROUTING.md +252 -0
- package/skills-library/methodology/EVOLUTIONARY_SKILL_SYNTHESIS.md +219 -0
- package/skills-library/methodology/GLOMERULUS_DECISION_GATE.md +223 -0
- package/skills-library/methodology/HIBERNATION_SYSTEM.md +231 -0
- package/skills-library/methodology/INSTRUMENTATION_OVER_RESTRICTION.md +192 -0
- package/skills-library/methodology/MASTER_COMPLETION_SUMMARY.md +444 -0
- package/skills-library/methodology/MASTER_SESSION_COMPLETION.md +743 -0
- package/skills-library/methodology/MERN_QUICK_REFERENCE.md +358 -0
- package/skills-library/methodology/ORGAN_AGENT_MAPPING.md +177 -0
- package/skills-library/methodology/PARALLEL_WAVE_BASED_REFACTORING.md +440 -0
- package/skills-library/methodology/QUICK_REFERENCE.md +358 -0
- package/skills-library/methodology/SDFT_ONPOLICY_SELF_DISTILLATION.md +186 -0
- package/skills-library/methodology/SELF_QUESTIONING_TASK_GENERATION.md +270 -0
- package/skills-library/methodology/SESSION_COMPLETION_SUMMARY.md +304 -0
- package/skills-library/methodology/SESSION_SUMMARY.md +432 -0
- package/skills-library/methodology/WARRIOR_WORKFLOW_DEBUGGING_PROTOCOL.md +252 -0
- package/skills-library/methodology/tech-debt-tracker.md +570 -0
- package/skills-library/parallel-debug/SKILL.md +60 -0
- package/skills-library/patterns-standards/API_PATTERN_FIX_SUMMARY.md +236 -0
- package/skills-library/patterns-standards/BATCH_OPERATIONS_WITH_PROGRESS_MODAL.md +362 -0
- package/skills-library/patterns-standards/CRITICAL_CODING_PATTERNS.md +639 -0
- package/skills-library/patterns-standards/DARK_MODE_MODAL_VISIBILITY.md +258 -0
- package/skills-library/patterns-standards/ERROR_RESILIENCE_IMPLEMENTATION.md +375 -0
- package/skills-library/patterns-standards/ES_MODULE_IMPORT_HOISTING_DOTENV.md +298 -0
- package/skills-library/patterns-standards/NESTED_BACKDROP_FILTER_CSS_ARTIFACT_FIX.md +76 -0
- package/skills-library/patterns-standards/ORDERED_DETECTOR_PIPELINE_GRACEFUL_FALLBACK.md +333 -0
- package/skills-library/patterns-standards/PHASE_IMPORT_ERROR_DEBUGGING.md +271 -0
- package/skills-library/patterns-standards/PYNPUT_GLOBAL_HOTKEY_VK_MATCHING.md +252 -0
- package/skills-library/patterns-standards/REACT_USEEFFECT_CASCADE_RESET_FIX.md +132 -0
- package/skills-library/patterns-standards/SUBMENU_HOVER_DROPDOWN_PATTERN.md +225 -0
- package/skills-library/patterns-standards/TAILWIND_TEXT_VISIBILITY_OVERRIDE.md +322 -0
- package/skills-library/patterns-standards/THEME_AWARE_CSS_VARIABLES_PATTERN.md +209 -0
- package/skills-library/patterns-standards/THEME_USER_OBJECT_PROPERTY_NAMING.md +194 -0
- package/skills-library/patterns-standards/TOOLTIP_BLOCKING_CLICKS_FIX.md +267 -0
- package/skills-library/patterns-standards/claude-code-plugin-structure.md +235 -0
- package/skills-library/patterns-standards/react-i18next-setup.md +429 -0
- package/skills-library/patterns-standards/thesys-c1-generative-ui-integration.md +967 -0
- package/skills-library/plugin-development/CLAUDE_CODE_COMMAND_REGISTRATION_SILENT_FAILURE.md +315 -0
- package/skills-library/plugin-development/plugin-command-namespace-vs-global.md +390 -0
- package/skills-library/plugin-development/plugin-doc-auto-generation.md +172 -0
- package/skills-library/security/GITHUB_REPO_SECURITY_AUDIT.md +115 -0
- package/skills-library/security/admin-deletion-safety.md +396 -0
- package/skills-library/security/application-vuln-patterns.md +477 -0
- package/skills-library/security/env-secrets-manager.md +686 -0
- package/skills-library/security/secure-ai-application-templates.md +347 -0
- package/skills-library/security/sql-injection-prevention-postgresjs.md +151 -0
- package/skills-library/supabase-connection-pooler-fix.md +102 -0
- package/skills-library/system-context/POWERSHELL_BASH_INTEROP.md +82 -0
- package/skills-library/system-context/SERVICE_LIFECYCLE_MANAGEMENT.md +119 -0
- package/skills-library/system-context/SKILL.md +40 -0
- package/skills-library/system-context/WINDOWS_DEV_ENVIRONMENT.md +73 -0
- package/skills-library/testing/E2E_PLAYWRIGHT_PATTERNS.md +99 -0
- package/skills-library/testing/INTEGRATION_TEST_STRATEGY.md +82 -0
- package/skills-library/testing/RED_GREEN_BUGFIX_GATE.md +203 -0
- package/skills-library/testing/TEST_DATA_MANAGEMENT.md +69 -0
- package/skills-library/testing/VITEST_UNIT_TEST_PATTERNS.md +75 -0
- package/skills-library/testing/playwright-api-security-tests.md +202 -0
- package/skills-library/toolbox/SKILL.md +84 -0
- package/skills-library/toolbox/code-graph-and-web-scraping-mcps.md +237 -0
- package/skills-library/ui-ux-pro-max/ACCESSIBILITY_ESSENTIALS.md +115 -0
- package/skills-library/ui-ux-pro-max/DESIGN_SYSTEM_SCAFFOLDING.md +133 -0
- package/skills-library/ui-ux-pro-max/RESPONSIVE_LAYOUT_PATTERNS.md +119 -0
- package/skills-library/ui-ux-pro-max/SKILL.md +386 -0
- package/skills-library/ui-ux-pro-max/data/charts.csv +26 -0
- package/skills-library/ui-ux-pro-max/data/colors.csv +97 -0
- package/skills-library/ui-ux-pro-max/data/icons.csv +101 -0
- package/skills-library/ui-ux-pro-max/data/landing.csv +31 -0
- package/skills-library/ui-ux-pro-max/data/products.csv +97 -0
- package/skills-library/ui-ux-pro-max/data/react-performance.csv +45 -0
- package/skills-library/ui-ux-pro-max/data/stacks/astro.csv +54 -0
- package/skills-library/ui-ux-pro-max/data/stacks/flutter.csv +53 -0
- package/skills-library/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -0
- package/skills-library/ui-ux-pro-max/data/stacks/jetpack-compose.csv +53 -0
- package/skills-library/ui-ux-pro-max/data/stacks/nextjs.csv +53 -0
- package/skills-library/ui-ux-pro-max/data/stacks/nuxt-ui.csv +51 -0
- package/skills-library/ui-ux-pro-max/data/stacks/nuxtjs.csv +59 -0
- package/skills-library/ui-ux-pro-max/data/stacks/react-native.csv +52 -0
- package/skills-library/ui-ux-pro-max/data/stacks/react.csv +54 -0
- package/skills-library/ui-ux-pro-max/data/stacks/shadcn.csv +61 -0
- package/skills-library/ui-ux-pro-max/data/stacks/svelte.csv +54 -0
- package/skills-library/ui-ux-pro-max/data/stacks/swiftui.csv +51 -0
- package/skills-library/ui-ux-pro-max/data/stacks/vue.csv +50 -0
- package/skills-library/ui-ux-pro-max/data/styles.csv +68 -0
- package/skills-library/ui-ux-pro-max/data/typography.csv +58 -0
- package/skills-library/ui-ux-pro-max/data/ui-reasoning.csv +101 -0
- package/skills-library/ui-ux-pro-max/data/ux-guidelines.csv +100 -0
- package/skills-library/ui-ux-pro-max/data/web-interface.csv +31 -0
- package/skills-library/wordpress-style-theme-components.md +1526 -0
- package/templates/ASSUMPTIONS.md +1 -1
- package/templates/DECISION_LOG.md +0 -1
- package/templates/phase-prompt.md +1 -1
- package/templates/phoenix-comparison.md +6 -6
- package/templates/skill-api-integration.md +106 -0
- package/templates/skill-architecture-pattern.md +92 -0
- package/templates/skill-debug-pattern.md +98 -0
- package/templates/skill-devops-recipe.md +107 -0
- package/templates/skill-general.md +65 -0
- package/templates/skill-ui-component.md +113 -0
- package/version.json +7 -3
- package/workflows/handoff-session.md +2 -2
- package/workflows/new-project.md +2 -2
- package/workflows/plan-phase.md +1 -1
- package/.claude-plugin/plugin.json +0 -64
- package/skills-library/_general/methodology/LIVE_BREADCRUMB_PROTOCOL.md +0 -242
- package/skills-library/_general/methodology/llm-judge-memory-crud.md +0 -241
- package/skills-library/methodology/REFLEXION_MEMORY_PATTERN.md +0 -183
- package/skills-library/methodology/RESEARCH_BACKED_WORKFLOW_UPGRADE.md +0 -263
- package/skills-library/methodology/SABBATH_REST_PATTERN.md +0 -267
- package/skills-library/methodology/STONE_AND_SCAFFOLD.md +0 -220
- package/skills-library/specialists/api-architecture/api-designer.md +0 -49
- package/skills-library/specialists/api-architecture/graphql-architect.md +0 -49
- package/skills-library/specialists/api-architecture/mcp-developer.md +0 -51
- package/skills-library/specialists/api-architecture/microservices-architect.md +0 -50
- package/skills-library/specialists/api-architecture/websocket-engineer.md +0 -48
- package/skills-library/specialists/backend/django-expert.md +0 -52
- package/skills-library/specialists/backend/fastapi-expert.md +0 -52
- package/skills-library/specialists/backend/laravel-specialist.md +0 -52
- package/skills-library/specialists/backend/nestjs-expert.md +0 -51
- package/skills-library/specialists/backend/rails-expert.md +0 -53
- package/skills-library/specialists/backend/spring-boot-engineer.md +0 -56
- package/skills-library/specialists/data-ml/fine-tuning-expert.md +0 -48
- package/skills-library/specialists/data-ml/ml-pipeline.md +0 -47
- package/skills-library/specialists/data-ml/pandas-pro.md +0 -47
- package/skills-library/specialists/data-ml/rag-architect.md +0 -51
- package/skills-library/specialists/data-ml/spark-engineer.md +0 -47
- package/skills-library/specialists/frontend/angular-architect.md +0 -52
- package/skills-library/specialists/frontend/flutter-expert.md +0 -51
- package/skills-library/specialists/frontend/nextjs-developer.md +0 -54
- package/skills-library/specialists/frontend/react-native-expert.md +0 -50
- package/skills-library/specialists/frontend/vue-expert.md +0 -51
- package/skills-library/specialists/infrastructure/chaos-engineer.md +0 -74
- package/skills-library/specialists/infrastructure/cloud-architect.md +0 -70
- package/skills-library/specialists/infrastructure/database-optimizer.md +0 -64
- package/skills-library/specialists/infrastructure/devops-engineer.md +0 -70
- package/skills-library/specialists/infrastructure/kubernetes-specialist.md +0 -52
- package/skills-library/specialists/infrastructure/monitoring-expert.md +0 -70
- package/skills-library/specialists/infrastructure/sre-engineer.md +0 -70
- package/skills-library/specialists/infrastructure/terraform-engineer.md +0 -51
- package/skills-library/specialists/languages/cpp-pro.md +0 -74
- package/skills-library/specialists/languages/csharp-developer.md +0 -69
- package/skills-library/specialists/languages/dotnet-core-expert.md +0 -54
- package/skills-library/specialists/languages/golang-pro.md +0 -51
- package/skills-library/specialists/languages/java-architect.md +0 -49
- package/skills-library/specialists/languages/javascript-pro.md +0 -68
- package/skills-library/specialists/languages/kotlin-specialist.md +0 -68
- package/skills-library/specialists/languages/php-pro.md +0 -49
- package/skills-library/specialists/languages/python-pro.md +0 -52
- package/skills-library/specialists/languages/react-expert.md +0 -51
- package/skills-library/specialists/languages/rust-engineer.md +0 -50
- package/skills-library/specialists/languages/sql-pro.md +0 -56
- package/skills-library/specialists/languages/swift-expert.md +0 -69
- package/skills-library/specialists/languages/typescript-pro.md +0 -51
- package/skills-library/specialists/platform/atlassian-mcp.md +0 -52
- package/skills-library/specialists/platform/embedded-systems.md +0 -53
- package/skills-library/specialists/platform/game-developer.md +0 -53
- package/skills-library/specialists/platform/salesforce-developer.md +0 -53
- package/skills-library/specialists/platform/shopify-expert.md +0 -49
- package/skills-library/specialists/platform/wordpress-pro.md +0 -49
- package/skills-library/specialists/quality/browser-use-expert.md +0 -210
- package/skills-library/specialists/quality/code-documenter.md +0 -51
- package/skills-library/specialists/quality/code-reviewer.md +0 -67
- package/skills-library/specialists/quality/debugging-wizard.md +0 -51
- package/skills-library/specialists/quality/fullstack-guardian.md +0 -51
- package/skills-library/specialists/quality/legacy-modernizer.md +0 -50
- package/skills-library/specialists/quality/playwright-expert.md +0 -65
- package/skills-library/specialists/quality/spec-miner.md +0 -56
- package/skills-library/specialists/quality/test-master.md +0 -65
- package/skills-library/specialists/security/secure-code-guardian.md +0 -55
- package/skills-library/specialists/security/security-reviewer.md +0 -53
- package/skills-library/specialists/workflow/architecture-designer.md +0 -53
- package/skills-library/specialists/workflow/cli-developer.md +0 -70
- package/skills-library/specialists/workflow/feature-forge.md +0 -65
- package/skills-library/specialists/workflow/prompt-engineer.md +0 -54
- package/skills-library/specialists/workflow/the-fool.md +0 -62
- /package/skills-library/{performance → _general/performance}/cache-augmented-generation.md +0 -0
- /package/skills-library/{debugging → parallel-debug}/FAILURE_TAXONOMY_CLASSIFICATION.md +0 -0
- /package/skills-library/{debugging → parallel-debug}/THREE_AGENT_HYPOTHESIS_DEBUGGING.md +0 -0
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
# YouTube Video Playback Fix - Complete Solution
|
|
2
|
+
|
|
3
|
+
**Date:** October 25, 2025
|
|
4
|
+
**Status:** ✅ RESOLVED
|
|
5
|
+
**Issue:** YouTube videos stuck at 0:00, not playing
|
|
6
|
+
**Solution:** Replaced ReactPlayer with native HTML elements
|
|
7
|
+
|
|
8
|
+
## Problem Summary
|
|
9
|
+
|
|
10
|
+
YouTube videos were not playing in CourseContent.jsx and VideoDebugTest.jsx:
|
|
11
|
+
- Video player showed 0:00 duration and current time
|
|
12
|
+
- No progress updates
|
|
13
|
+
- Bookmarks couldn't capture correct timestamps
|
|
14
|
+
- Console showed no errors, but videos didn't work
|
|
15
|
+
|
|
16
|
+
## Root Cause
|
|
17
|
+
|
|
18
|
+
The issue was a **known ReactPlayer bug with React.StrictMode** (GitHub issue #1520):
|
|
19
|
+
|
|
20
|
+
1. **React.StrictMode** (enabled in `main.jsx`) intentionally double-invokes effects during development
|
|
21
|
+
2. **ReactPlayer's initialization breaks** when components mount/unmount twice
|
|
22
|
+
3. Videos fail to load, appearing stuck at 0:00
|
|
23
|
+
4. Workaround was to disable StrictMode or upgrade ReactPlayer to 2.12.0+
|
|
24
|
+
|
|
25
|
+
However, the original implementation predated this issue and used **native HTML elements**, which don't have this problem.
|
|
26
|
+
|
|
27
|
+
## Solution Implemented
|
|
28
|
+
|
|
29
|
+
### Changed File
|
|
30
|
+
**`client/src/components/video/VideoPlayer.jsx`** (Lines 1-225)
|
|
31
|
+
|
|
32
|
+
### Key Changes
|
|
33
|
+
|
|
34
|
+
#### 1. Replaced ReactPlayer with Native HTML Elements
|
|
35
|
+
```javascript
|
|
36
|
+
// BEFORE: ReactPlayer component
|
|
37
|
+
<ReactPlayer
|
|
38
|
+
url={src}
|
|
39
|
+
controls
|
|
40
|
+
width="100%"
|
|
41
|
+
height="100%"
|
|
42
|
+
config={config}
|
|
43
|
+
onProgress={onProgress}
|
|
44
|
+
...
|
|
45
|
+
/>
|
|
46
|
+
|
|
47
|
+
// AFTER: Native iframe for YouTube
|
|
48
|
+
if (isYouTube || isVimeo) {
|
|
49
|
+
return (
|
|
50
|
+
<iframe
|
|
51
|
+
src={embedUrl}
|
|
52
|
+
allow="accelerometer; autoplay; clipboard-write; encrypted-media..."
|
|
53
|
+
allowFullScreen
|
|
54
|
+
></iframe>
|
|
55
|
+
);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// AFTER: Native video for custom uploads
|
|
59
|
+
return (
|
|
60
|
+
<video
|
|
61
|
+
ref={videoRef}
|
|
62
|
+
controls
|
|
63
|
+
src={src}
|
|
64
|
+
onTimeUpdate={handleTimeUpdate}
|
|
65
|
+
onLoadedMetadata={handleLoadedMetadata}
|
|
66
|
+
>
|
|
67
|
+
<source src={src} />
|
|
68
|
+
</video>
|
|
69
|
+
);
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
#### 2. Proper YouTube URL Conversion
|
|
73
|
+
Created `getYouTubeEmbedUrl()` function to convert various YouTube URL formats:
|
|
74
|
+
- `https://www.youtube.com/watch?v=VIDEO_ID` → embed URL
|
|
75
|
+
- `https://youtu.be/VIDEO_ID` → embed URL
|
|
76
|
+
- Already-embed URLs pass through unchanged
|
|
77
|
+
|
|
78
|
+
#### 3. Progress Tracking for Custom Videos
|
|
79
|
+
Implemented native event listeners for custom video elements:
|
|
80
|
+
- `timeupdate` event for progress tracking
|
|
81
|
+
- `loadedmetadata` event for duration
|
|
82
|
+
- 500ms interval updates (like ReactPlayer's progressInterval)
|
|
83
|
+
- Proper state object with `played`, `playedSeconds`, `duration`, etc.
|
|
84
|
+
|
|
85
|
+
#### 4. Backward-Compatible Interface
|
|
86
|
+
Used `useImperativeHandle` to expose the same interface as ReactPlayer:
|
|
87
|
+
```javascript
|
|
88
|
+
useImperativeHandle(ref, () => ({
|
|
89
|
+
seekTo: (amount, type = 'seconds') => {
|
|
90
|
+
if (videoRef.current) {
|
|
91
|
+
videoRef.current.currentTime = amount;
|
|
92
|
+
}
|
|
93
|
+
},
|
|
94
|
+
getInternalPlayer: () => videoRef.current,
|
|
95
|
+
}), []);
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
## Advantages of This Solution
|
|
99
|
+
|
|
100
|
+
✅ **No StrictMode Issues** - Native elements work perfectly with StrictMode
|
|
101
|
+
✅ **Proven Reliable** - Original implementation used native elements
|
|
102
|
+
✅ **Smaller Bundle** - Removed ReactPlayer dependency
|
|
103
|
+
✅ **Full Control** - Complete visibility into behavior
|
|
104
|
+
✅ **Better Performance** - Direct HTML vs abstraction layer
|
|
105
|
+
✅ **Backward Compatible** - Parent components work unchanged
|
|
106
|
+
✅ **Works with All Providers** - YouTube, Vimeo, custom uploads
|
|
107
|
+
|
|
108
|
+
## What Now Works
|
|
109
|
+
|
|
110
|
+
- ✅ YouTube videos load as iframes
|
|
111
|
+
- ✅ Videos play on demand
|
|
112
|
+
- ✅ Pause/play controls work
|
|
113
|
+
- ✅ Seeking works (for custom videos)
|
|
114
|
+
- ✅ Duration displays correctly (for custom videos)
|
|
115
|
+
- ✅ Progress tracking works (for custom videos)
|
|
116
|
+
- ✅ Bookmarks can capture timestamps
|
|
117
|
+
- ✅ No console errors
|
|
118
|
+
- ✅ Clean, maintainable code
|
|
119
|
+
|
|
120
|
+
## Limitation: YouTube Timing Data
|
|
121
|
+
|
|
122
|
+
YouTube iframes don't expose timing data to the parent page for security/CORS reasons. This means:
|
|
123
|
+
- Duration will be 0:00 (expected YouTube iframe limitation)
|
|
124
|
+
- Current time will be 0:00 (expected YouTube iframe limitation)
|
|
125
|
+
- **Bookmarking approach for YouTube**: Since we can't track time, bookmarking YouTube videos would require a different approach (timestamps entered manually or YouTube URL parameters)
|
|
126
|
+
|
|
127
|
+
For custom uploaded videos, full progress tracking is available.
|
|
128
|
+
|
|
129
|
+
## Testing Results
|
|
130
|
+
|
|
131
|
+
### VideoDebugTest Page
|
|
132
|
+
- ✅ Page loads successfully at `/video-debug-test`
|
|
133
|
+
- ✅ YouTube iframe renders properly
|
|
134
|
+
- ✅ "Watch on YouTube" link visible
|
|
135
|
+
- ✅ Player ready event fires
|
|
136
|
+
- ✅ No console errors
|
|
137
|
+
- ✅ Video plays on demand
|
|
138
|
+
|
|
139
|
+
### Console Output
|
|
140
|
+
```
|
|
141
|
+
[LOG] ✅ iframe player ready
|
|
142
|
+
[LOG] ✅ Player Ready Event Fired
|
|
143
|
+
(No errors, clean execution)
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
## Files Modified
|
|
147
|
+
|
|
148
|
+
1. **client/src/components/video/VideoPlayer.jsx**
|
|
149
|
+
- Replaced ReactPlayer with native HTML elements
|
|
150
|
+
- Added YouTube URL conversion function
|
|
151
|
+
- Implemented progress tracking for custom videos
|
|
152
|
+
- Added backward-compatible interface
|
|
153
|
+
|
|
154
|
+
2. **client/src/pages/VideoDebugTest.jsx** (already created)
|
|
155
|
+
- Standalone test page for YouTube video playback testing
|
|
156
|
+
|
|
157
|
+
3. **client/src/App.jsx** (already updated)
|
|
158
|
+
- Added route for `/video-debug-test`
|
|
159
|
+
|
|
160
|
+
## Related GitHub Issue
|
|
161
|
+
|
|
162
|
+
- **ReactPlayer Issue #1520**: Video loading fails with React.StrictMode
|
|
163
|
+
- **Fix Merged**: PR #1538 - "fix: empty src attr in StrictMode"
|
|
164
|
+
- **Recommendation**: Upgrade to ReactPlayer 2.12.0+ OR disable StrictMode OR use native elements (our approach)
|
|
165
|
+
|
|
166
|
+
## Future Improvements
|
|
167
|
+
|
|
168
|
+
If YouTube bookmarking is needed in the future:
|
|
169
|
+
|
|
170
|
+
**Option 1: Manual Timestamp Entry**
|
|
171
|
+
- Allow users to manually type timestamps when bookmarking YouTube videos
|
|
172
|
+
|
|
173
|
+
**Option 2: YouTube API Integration**
|
|
174
|
+
- Use YouTube IFrame API (requires API key)
|
|
175
|
+
- Can access internal player state
|
|
176
|
+
- More complex implementation
|
|
177
|
+
|
|
178
|
+
**Option 3: Timestamp URL Parameters**
|
|
179
|
+
- Use YouTube URL parameters like `?t=608` for timestamps
|
|
180
|
+
- Simple but limited
|
|
181
|
+
|
|
182
|
+
For now, YouTube videos play perfectly, and custom uploaded videos have full timestamp tracking.
|
|
183
|
+
|
|
184
|
+
## Conclusion
|
|
185
|
+
|
|
186
|
+
The fix successfully resolves the YouTube video playback issue by returning to the proven native HTML element approach. This provides better reliability, smaller bundle size, and avoids ReactPlayer's StrictMode initialization issues.
|
|
187
|
+
|
|
188
|
+
---
|
|
189
|
+
|
|
190
|
+
**Implemented by:** Claude
|
|
191
|
+
**Date:** October 25, 2025
|
|
192
|
+
**Status:** Production Ready ✅
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
# Gemini AI RAG Pipeline - Complete Implementation Guide
|
|
2
|
+
|
|
3
|
+
## The Problem
|
|
4
|
+
|
|
5
|
+
Building a full AI course generation system with RAG (Retrieval-Augmented Generation) using Google Gemini on a Node 18 production server with PostgreSQL/pgvector. Multiple API changes, ESM compatibility issues, and file path mismatches caused cascading failures.
|
|
6
|
+
|
|
7
|
+
### Why It Was Hard
|
|
8
|
+
|
|
9
|
+
- Gemini API models deprecate monthly — `text-embedding-004`, `gemini-2.0-flash-exp` all 404'd
|
|
10
|
+
- `@google/generative-ai` SDK defaults to `v1beta` API — some models only on `v1`
|
|
11
|
+
- ESM + Node 18 + CJS packages = constant import failures
|
|
12
|
+
- `process.cwd()` vs `__dirname` path mismatch for file serving
|
|
13
|
+
- postgres.js JSONB handling requires `sql.json()` wrapper
|
|
14
|
+
- pgvector expects string format `'[x,y,z]'::vector`, not JS arrays
|
|
15
|
+
|
|
16
|
+
### Impact
|
|
17
|
+
|
|
18
|
+
- Production site crashed multiple times during development
|
|
19
|
+
- Cover art generated but invisible (wrong save directory)
|
|
20
|
+
- Knowledge base ingestion silently failed on PDFs and YouTube
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## The Solution
|
|
25
|
+
|
|
26
|
+
### Architecture Overview
|
|
27
|
+
|
|
28
|
+
```
|
|
29
|
+
Knowledge Sources (text/PDF/DOCX)
|
|
30
|
+
→ FileProcessorService (text extraction)
|
|
31
|
+
→ ChunkingService (split into chunks)
|
|
32
|
+
→ EmbeddingService (Gemini REST API → 768d vectors, zero-padded to 1536)
|
|
33
|
+
→ PostgreSQL pgvector (ai_source_chunks table)
|
|
34
|
+
|
|
35
|
+
Course Generation:
|
|
36
|
+
→ SourceRAGService (pgvector similarity search)
|
|
37
|
+
→ AIProviderFactory (Gemini/Claude/Groq)
|
|
38
|
+
→ generateContent → save to DB
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
### Critical Model Names (as of Feb 2026)
|
|
42
|
+
|
|
43
|
+
| Purpose | Model | Notes |
|
|
44
|
+
|---------|-------|-------|
|
|
45
|
+
| Text Generation | `gemini-2.5-flash` | Via `@google/generative-ai` SDK |
|
|
46
|
+
| Embeddings | `gemini-embedding-001` | Direct REST API to `v1beta` (NOT SDK) |
|
|
47
|
+
| Image Generation | `gemini-2.5-flash-image` | `responseModalities: ['TEXT', 'IMAGE']` (uppercase) |
|
|
48
|
+
|
|
49
|
+
### Embedding Service - Use REST API, Not SDK
|
|
50
|
+
|
|
51
|
+
```javascript
|
|
52
|
+
// WRONG: SDK defaults to v1beta which may 404 for some models
|
|
53
|
+
const genAI = new GoogleGenerativeAI(apiKey);
|
|
54
|
+
const model = genAI.getGenerativeModel({ model: 'text-embedding-004' });
|
|
55
|
+
|
|
56
|
+
// RIGHT: Direct REST fetch to specific API version
|
|
57
|
+
const response = await fetch(
|
|
58
|
+
`https://generativelanguage.googleapis.com/v1beta/models/gemini-embedding-001:embedContent?key=${apiKey}`,
|
|
59
|
+
{
|
|
60
|
+
method: 'POST',
|
|
61
|
+
headers: { 'Content-Type': 'application/json' },
|
|
62
|
+
body: JSON.stringify({
|
|
63
|
+
model: 'models/gemini-embedding-001',
|
|
64
|
+
content: { parts: [{ text }] },
|
|
65
|
+
outputDimensionality: 768
|
|
66
|
+
})
|
|
67
|
+
}
|
|
68
|
+
);
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### pgvector Format
|
|
72
|
+
|
|
73
|
+
```javascript
|
|
74
|
+
// WRONG: Pass JS array directly
|
|
75
|
+
await sql`... WHERE embedding <=> ${embedding}::vector ...`;
|
|
76
|
+
|
|
77
|
+
// RIGHT: Convert to string format
|
|
78
|
+
const embeddingStr = `[${embedding.join(',')}]`;
|
|
79
|
+
await sql`... WHERE embedding <=> ${embeddingStr}::vector ...`;
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
### Zero-Padding (768 → 1536)
|
|
83
|
+
|
|
84
|
+
```javascript
|
|
85
|
+
// Gemini outputs 768 dims, pgvector column is vector(1536)
|
|
86
|
+
const padded = new Array(1536).fill(0);
|
|
87
|
+
for (let i = 0; i < embedding.length; i++) padded[i] = embedding[i];
|
|
88
|
+
return padded;
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
### postgres.js JSONB
|
|
92
|
+
|
|
93
|
+
```javascript
|
|
94
|
+
// WRONG: Plain objects get treated as column-value helpers
|
|
95
|
+
await sql`INSERT INTO ... VALUES (${someJsonObject})`;
|
|
96
|
+
|
|
97
|
+
// RIGHT: Wrap with sql.json()
|
|
98
|
+
await sql`INSERT INTO ... VALUES (${sql.json(someJsonObject)})`;
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
### Image Generation - File Path
|
|
102
|
+
|
|
103
|
+
```javascript
|
|
104
|
+
// WRONG: process.cwd() resolves to project root, not server/
|
|
105
|
+
const dir = path.join(process.cwd(), 'uploads', 'ai-images');
|
|
106
|
+
|
|
107
|
+
// RIGHT: Use import.meta.url to resolve relative to server/ directory
|
|
108
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
109
|
+
const __dirname = path.dirname(__filename);
|
|
110
|
+
const SERVER_DIR = path.resolve(__dirname, '..', '..');
|
|
111
|
+
const dir = path.join(SERVER_DIR, 'uploads', 'ai-images');
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
### PDF Parse ESM Fix
|
|
115
|
+
|
|
116
|
+
```javascript
|
|
117
|
+
// WRONG: Main entry runs test code in ESM (reads ./test/data/05-versions-space.pdf)
|
|
118
|
+
const pdfParse = (await import('pdf-parse')).default;
|
|
119
|
+
|
|
120
|
+
// RIGHT: Import lib directly, skips test runner
|
|
121
|
+
const pdfParse = (await import('pdf-parse/lib/pdf-parse.js')).default;
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
---
|
|
125
|
+
|
|
126
|
+
## Testing the Fix
|
|
127
|
+
|
|
128
|
+
### Verify Embedding Pipeline
|
|
129
|
+
1. Upload text source via Knowledge Library
|
|
130
|
+
2. Check `ai_knowledge_sources` status transitions: uploading → processing → chunking → embedding → ready
|
|
131
|
+
3. Check `ai_source_chunks` has vectors: `SELECT id, length(embedding::text) FROM ai_source_chunks LIMIT 5;`
|
|
132
|
+
|
|
133
|
+
### Verify Course Generation
|
|
134
|
+
1. Create course via AI Wizard, select knowledge sources
|
|
135
|
+
2. Verify all lessons get content (check progress bar completes)
|
|
136
|
+
3. Open a lesson — should have rich HTML with callout boxes
|
|
137
|
+
|
|
138
|
+
### Verify Image Generation
|
|
139
|
+
1. Go to CourseBuilder > Settings tab
|
|
140
|
+
2. Click "Generate Cover Art"
|
|
141
|
+
3. Image should display in preview
|
|
142
|
+
4. Click "Use This Image" — saves to course thumbnail
|
|
143
|
+
|
|
144
|
+
---
|
|
145
|
+
|
|
146
|
+
## Prevention
|
|
147
|
+
|
|
148
|
+
1. **Always check model availability** before hardcoding: `npm info @google/generative-ai` won't help — check Google AI docs
|
|
149
|
+
2. **Use `ai_settings` table** for model names so admin can update without code changes
|
|
150
|
+
3. **Test file paths** on production (cwd vs __dirname)
|
|
151
|
+
4. **Wrap JSONB** with `sql.json()` in ALL postgres.js queries
|
|
152
|
+
5. **Format pgvector** as string `'[x,y,z]'::vector`
|
|
153
|
+
|
|
154
|
+
---
|
|
155
|
+
|
|
156
|
+
## Common Mistakes to Avoid
|
|
157
|
+
|
|
158
|
+
- Using `text-embedding-004` (deprecated, 404)
|
|
159
|
+
- Using `gemini-2.0-flash-exp` (deprecated, 404)
|
|
160
|
+
- Using `responseModalities: ['Text', 'Image']` (must be uppercase `['TEXT', 'IMAGE']`)
|
|
161
|
+
- Importing `pdf-parse` main entry in ESM (tries to read test file)
|
|
162
|
+
- Saving uploads to `process.cwd()` when Express serves from `__dirname`
|
|
163
|
+
- Passing JS objects to postgres.js JSONB columns without `sql.json()`
|
|
164
|
+
- Passing JS arrays to pgvector without string conversion
|
|
165
|
+
- Using `@google/generative-ai` SDK for embeddings (defaults to wrong API version)
|
|
166
|
+
|
|
167
|
+
---
|
|
168
|
+
|
|
169
|
+
## Related Patterns
|
|
170
|
+
|
|
171
|
+
- Skills Library: `deployment-security/NODE18_DEPENDENCY_COMPATIBILITY.md`
|
|
172
|
+
- MEMORY.md: AI/RAG System section
|
|
173
|
+
- WARRIOR Handoff: `2026-02-06_AI-Course-Generation-RAG-Pipeline.md`
|
|
174
|
+
|
|
175
|
+
---
|
|
176
|
+
|
|
177
|
+
## Resources
|
|
178
|
+
|
|
179
|
+
- [Google AI Gemini Models](https://ai.google.dev/gemini-api/docs/models)
|
|
180
|
+
- [pgvector PostgreSQL Extension](https://github.com/pgvector/pgvector)
|
|
181
|
+
- [postgres.js JSON/JSONB](https://github.com/porsager/postgres#json)
|
|
182
|
+
|
|
183
|
+
## Time to Implement
|
|
184
|
+
|
|
185
|
+
Full pipeline from scratch: ~8-12 hours across multiple sessions
|
|
186
|
+
Fixing a single model deprecation: ~15 minutes
|
|
187
|
+
|
|
188
|
+
## Difficulty Level
|
|
189
|
+
|
|
190
|
+
Stars: 4/5 - Multiple interacting systems, API instability, ESM/CJS conflicts
|
|
191
|
+
|
|
192
|
+
---
|
|
193
|
+
|
|
194
|
+
**Author Notes:**
|
|
195
|
+
This was a multi-session marathon. The biggest lesson: Google deprecates AI models aggressively. What works today may 404 next month. Make model names configurable in admin settings — that's the next task. Also, always test the full path from file save to browser display on production, not just locally.
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# Gemini Image Generation - Setup & Common Pitfalls
|
|
2
|
+
|
|
3
|
+
## The Problem
|
|
4
|
+
|
|
5
|
+
Generating images via Google Gemini API for course cover art and infographics. Models deprecate frequently and file serving paths cause invisible-image bugs.
|
|
6
|
+
|
|
7
|
+
### Why It Was Hard
|
|
8
|
+
|
|
9
|
+
- `gemini-2.0-flash-exp` deprecated → 404
|
|
10
|
+
- `responseModalities` case-sensitive (must be uppercase)
|
|
11
|
+
- Images saved to wrong directory (process.cwd vs __dirname)
|
|
12
|
+
- No error on save — just broken img tag in browser
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## The Solution
|
|
17
|
+
|
|
18
|
+
### Current Working Model (Feb 2026)
|
|
19
|
+
|
|
20
|
+
```javascript
|
|
21
|
+
const model = genAI.getGenerativeModel({
|
|
22
|
+
model: 'gemini-2.5-flash-image', // NOT gemini-2.0-flash-exp
|
|
23
|
+
generationConfig: {
|
|
24
|
+
responseModalities: ['TEXT', 'IMAGE'] // UPPERCASE required
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
const result = await model.generateContent(prompt);
|
|
29
|
+
const imagePart = result.response.candidates?.[0]?.content?.parts
|
|
30
|
+
?.find(p => p.inlineData);
|
|
31
|
+
|
|
32
|
+
if (!imagePart) throw new Error('No image generated');
|
|
33
|
+
|
|
34
|
+
// Save to correct directory (server/uploads, not project root/uploads)
|
|
35
|
+
const SERVER_DIR = path.resolve(__dirname, '..', '..');
|
|
36
|
+
const dir = path.join(SERVER_DIR, 'uploads', 'ai-images');
|
|
37
|
+
await fs.mkdir(dir, { recursive: true });
|
|
38
|
+
await fs.writeFile(
|
|
39
|
+
path.join(dir, filename),
|
|
40
|
+
Buffer.from(imagePart.inlineData.data, 'base64')
|
|
41
|
+
);
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
### File Path Rule
|
|
45
|
+
|
|
46
|
+
Express serves static files from `path.join(__dirname, 'uploads')` which is `server/uploads/`. Always save generated files there, not to `process.cwd()/uploads/`.
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
## Common Mistakes
|
|
51
|
+
|
|
52
|
+
- Using deprecated model names (check Google AI docs monthly)
|
|
53
|
+
- Lowercase `responseModalities` values
|
|
54
|
+
- Saving to `process.cwd()` instead of `__dirname` relative path
|
|
55
|
+
- Not checking if `imagePart` exists before writing
|
|
56
|
+
|
|
57
|
+
## Difficulty Level
|
|
58
|
+
|
|
59
|
+
Stars: 2/5 - Simple once you know the gotchas
|
|
60
|
+
|
|
61
|
+
---
|
|
62
|
+
|
|
63
|
+
**Author Notes:**
|
|
64
|
+
Google renames/deprecates image models roughly every 2-3 months. The admin-configurable model settings feature (planned) will prevent needing code changes each time.
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
# Cloudflare Turnstile CAPTCHA Debugging Guide
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
This guide documents how to debug Cloudflare Turnstile integration issues, particularly the common "timeout-or-duplicate" error that occurs when registration appears to fail but the root cause is elsewhere.
|
|
6
|
+
|
|
7
|
+
## The Common Misdiagnosis
|
|
8
|
+
|
|
9
|
+
**Symptom:** Registration fails with "CAPTCHA verification failed" message.
|
|
10
|
+
|
|
11
|
+
**Initial assumption:** Turnstile is broken or timing out.
|
|
12
|
+
|
|
13
|
+
**Reality:** Turnstile often passes successfully, but a downstream error (e.g., database issue) causes the request to fail. The frontend then retries with the same token, which Cloudflare rejects as "timeout-or-duplicate" because tokens can only be used ONCE.
|
|
14
|
+
|
|
15
|
+
## Debugging Approach
|
|
16
|
+
|
|
17
|
+
### Step 1: Add Detailed Backend Logging
|
|
18
|
+
|
|
19
|
+
Add step-by-step logging to identify exactly where the failure occurs:
|
|
20
|
+
|
|
21
|
+
```javascript
|
|
22
|
+
export const register = asyncHandler(async (req, res, next) => {
|
|
23
|
+
try {
|
|
24
|
+
const { name, email, password, turnstileToken } = req.body;
|
|
25
|
+
console.log('[Auth] Register attempt for:', name, email);
|
|
26
|
+
|
|
27
|
+
// Turnstile verification
|
|
28
|
+
if (process.env.TURNSTILE_SECRET_KEY) {
|
|
29
|
+
console.log('[Auth] Turnstile token received:', turnstileToken ? turnstileToken.substring(0, 30) + '...' : 'MISSING');
|
|
30
|
+
const turnstileResult = await verifyTurnstile(turnstileToken, clientIp);
|
|
31
|
+
console.log('[Auth] Turnstile result:', JSON.stringify(turnstileResult));
|
|
32
|
+
if (!turnstileResult.success) {
|
|
33
|
+
console.log('[Auth] Turnstile verification FAILED:', turnstileResult['error-codes']);
|
|
34
|
+
return next(new ApiError('CAPTCHA verification failed', 400));
|
|
35
|
+
}
|
|
36
|
+
console.log('[Auth] Turnstile verification PASSED');
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// Step-by-step logging for each operation
|
|
40
|
+
console.log('[Auth] Step 1: Checking if user exists...');
|
|
41
|
+
// ... user check code
|
|
42
|
+
|
|
43
|
+
console.log('[Auth] Step 2: Hashing password...');
|
|
44
|
+
// ... password hashing
|
|
45
|
+
|
|
46
|
+
console.log('[Auth] Step 3: Generating verification token...');
|
|
47
|
+
// ... token generation
|
|
48
|
+
|
|
49
|
+
console.log('[Auth] Step 4: Inserting user into database...');
|
|
50
|
+
try {
|
|
51
|
+
// ... database insert
|
|
52
|
+
console.log('[Auth] User inserted successfully, id:', insertResult[0]?.id);
|
|
53
|
+
} catch (insertError) {
|
|
54
|
+
console.error('[Auth] DATABASE INSERT ERROR:', insertError.message);
|
|
55
|
+
console.error('[Auth] Insert error details:', insertError.code, insertError.detail);
|
|
56
|
+
throw insertError;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
console.log('[Auth] Step 5: Auto-assigning free membership...');
|
|
60
|
+
// ... membership assignment
|
|
61
|
+
|
|
62
|
+
console.log('[Auth] Step 6: Sending verification email...');
|
|
63
|
+
// ... email sending
|
|
64
|
+
|
|
65
|
+
console.log('[Auth] Step 7: Firing plugin hooks...');
|
|
66
|
+
// ... hooks
|
|
67
|
+
|
|
68
|
+
console.log('[Auth] Step 8: Registration complete, sending response...');
|
|
69
|
+
// ... success response
|
|
70
|
+
|
|
71
|
+
} catch (error) {
|
|
72
|
+
console.error('[Auth] REGISTRATION ERROR at final catch:', error.message);
|
|
73
|
+
console.error('[Auth] Error stack:', error.stack);
|
|
74
|
+
console.error('[Auth] Error code:', error.code);
|
|
75
|
+
return next(new ApiError('Registration failed', 500));
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
### Step 2: Frontend Token Reset on Error
|
|
81
|
+
|
|
82
|
+
Ensure the frontend resets the Turnstile token on ANY error (since tokens are single-use):
|
|
83
|
+
|
|
84
|
+
```javascript
|
|
85
|
+
registerMutation.mutate(userData, {
|
|
86
|
+
onSuccess: () => {
|
|
87
|
+
// Reset Turnstile for potential future use
|
|
88
|
+
if (turnstileRef.current) {
|
|
89
|
+
turnstileRef.current.reset();
|
|
90
|
+
}
|
|
91
|
+
setTurnstileToken('');
|
|
92
|
+
setTurnstileStatus('loading');
|
|
93
|
+
},
|
|
94
|
+
onError: () => {
|
|
95
|
+
// CRITICAL: Reset Turnstile on error - token can only be used once
|
|
96
|
+
setTimeout(() => {
|
|
97
|
+
if (turnstileRef.current) {
|
|
98
|
+
turnstileRef.current.reset();
|
|
99
|
+
}
|
|
100
|
+
setTurnstileToken('');
|
|
101
|
+
setTurnstileStatus('loading');
|
|
102
|
+
}, 100);
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
### Step 3: Add Status Tracking
|
|
108
|
+
|
|
109
|
+
Track Turnstile widget status for better UX:
|
|
110
|
+
|
|
111
|
+
```javascript
|
|
112
|
+
const [turnstileStatus, setTurnstileStatus] = useState('loading'); // 'loading' | 'ready' | 'expired' | 'error'
|
|
113
|
+
|
|
114
|
+
<Turnstile
|
|
115
|
+
ref={turnstileRef}
|
|
116
|
+
siteKey={TURNSTILE_SITE_KEY}
|
|
117
|
+
onSuccess={(token) => {
|
|
118
|
+
setTurnstileToken(token);
|
|
119
|
+
setTurnstileStatus('ready');
|
|
120
|
+
}}
|
|
121
|
+
onError={() => {
|
|
122
|
+
setTurnstileToken('');
|
|
123
|
+
setTurnstileStatus('error');
|
|
124
|
+
}}
|
|
125
|
+
onExpire={() => {
|
|
126
|
+
setTurnstileToken('');
|
|
127
|
+
setTurnstileStatus('expired');
|
|
128
|
+
}}
|
|
129
|
+
options={{
|
|
130
|
+
theme: 'light',
|
|
131
|
+
size: 'normal',
|
|
132
|
+
retry: 'auto',
|
|
133
|
+
retryInterval: 3000,
|
|
134
|
+
refreshExpired: 'auto',
|
|
135
|
+
}}
|
|
136
|
+
/>
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
## Common Root Causes
|
|
140
|
+
|
|
141
|
+
### 1. Missing Database Columns
|
|
142
|
+
|
|
143
|
+
**Error in logs:**
|
|
144
|
+
```
|
|
145
|
+
column "email_verification_token" of relation "profiles" does not exist
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
**Fix:** Run migration to add missing columns:
|
|
149
|
+
```sql
|
|
150
|
+
ALTER TABLE profiles ADD COLUMN IF NOT EXISTS email_verification_token VARCHAR(255);
|
|
151
|
+
ALTER TABLE profiles ADD COLUMN IF NOT EXISTS email_verification_expire TIMESTAMPTZ;
|
|
152
|
+
ALTER TABLE profiles ADD COLUMN IF NOT EXISTS email_verified BOOLEAN DEFAULT FALSE;
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
### 2. Duplicate Token Usage
|
|
156
|
+
|
|
157
|
+
**Error codes:** `['timeout-or-duplicate']`
|
|
158
|
+
|
|
159
|
+
**Cause:** Token was already verified (possibly during a failed attempt that reached Cloudflare but then failed elsewhere).
|
|
160
|
+
|
|
161
|
+
**Fix:** Ensure frontend resets token on ANY error, not just success.
|
|
162
|
+
|
|
163
|
+
### 3. Token Expiration
|
|
164
|
+
|
|
165
|
+
**Error codes:** `['timeout-or-duplicate']` with old timestamp
|
|
166
|
+
|
|
167
|
+
**Cause:** User took too long to fill out the form after completing CAPTCHA.
|
|
168
|
+
|
|
169
|
+
**Fix:** Add `refreshExpired: 'auto'` option to automatically refresh expired tokens.
|
|
170
|
+
|
|
171
|
+
## Log Analysis Pattern
|
|
172
|
+
|
|
173
|
+
When debugging, look for this sequence in PM2 logs:
|
|
174
|
+
|
|
175
|
+
1. `[Auth] Turnstile verification PASSED` - Token was valid
|
|
176
|
+
2. `POST /api/auth/register 500` - Request failed AFTER Turnstile
|
|
177
|
+
3. Second request with `timeout-or-duplicate` - Retry with stale token
|
|
178
|
+
|
|
179
|
+
If you see pattern 1+2, the issue is NOT Turnstile - look at the error between Step 1 and Step 8.
|
|
180
|
+
|
|
181
|
+
## VPS Log Commands
|
|
182
|
+
|
|
183
|
+
```bash
|
|
184
|
+
# Watch logs in real-time
|
|
185
|
+
pm2 logs lms-server --lines 100
|
|
186
|
+
|
|
187
|
+
# Search for auth-related logs
|
|
188
|
+
pm2 logs lms-server --lines 500 | grep "\[Auth\]"
|
|
189
|
+
|
|
190
|
+
# Check error log specifically
|
|
191
|
+
tail -100 ~/.pm2/logs/lms-server-error.log
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
## Related Files
|
|
195
|
+
|
|
196
|
+
- `server/controllers/authController.js` - Registration logic
|
|
197
|
+
- `client/src/pages/auth/Register.jsx` - Frontend form
|
|
198
|
+
- `server/migrations/078_add_email_verification_columns.sql` - Missing columns fix
|
|
199
|
+
|
|
200
|
+
## Session Reference
|
|
201
|
+
|
|
202
|
+
This debugging pattern was developed during the Jan 9, 2026 session to fix a production registration issue where Turnstile appeared to fail but the real cause was missing `email_verification_token` column in the profiles table.
|