@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,252 @@
|
|
|
1
|
+
# YouTube Video Bookmarking - Technical Explanation
|
|
2
|
+
|
|
3
|
+
## Problem Summary
|
|
4
|
+
|
|
5
|
+
When users click "Bookmark" on YouTube videos, bookmarks are saving at `00:00` instead of the current video time.
|
|
6
|
+
|
|
7
|
+
## Root Cause: YouTube iframe Security Limitation
|
|
8
|
+
|
|
9
|
+
**This is NOT a bug - it's a fundamental YouTube security feature.**
|
|
10
|
+
|
|
11
|
+
YouTube embeds videos in iframes with strict Cross-Origin Resource Sharing (CORS) policies. **YouTube iframes do NOT expose timing/duration data to parent pages** for security and content protection reasons.
|
|
12
|
+
|
|
13
|
+
### Why YouTube Blocks Timing Data:
|
|
14
|
+
|
|
15
|
+
1. **Copyright Protection**: Prevents scripts from programmatically tracking exactly where users are in videos
|
|
16
|
+
2. **Ad Tracking Prevention**: Prevents third parties from tracking viewer engagement
|
|
17
|
+
3. **Analytics Control**: YouTube wants exclusive control over viewing analytics
|
|
18
|
+
4. **Security**: Prevents injection attacks that could manipulate video playback
|
|
19
|
+
|
|
20
|
+
### Technical Evidence:
|
|
21
|
+
|
|
22
|
+
```javascript
|
|
23
|
+
// This DOES NOT work with YouTube iframes:
|
|
24
|
+
const duration = iframeElement.contentDocument.querySelector('video').duration; // ❌ CORS Error
|
|
25
|
+
const currentTime = iframeElement.contentWindow.document.currentTime; // ❌ Access Denied
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
**Solution**: Use YouTube IFrame API... but even that won't work from embedded iframes in development.
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## Our Solution: Hybrid Bookmarking Approach
|
|
33
|
+
|
|
34
|
+
We've implemented **different bookmarking strategies** based on video type:
|
|
35
|
+
|
|
36
|
+
### 1. Custom Uploaded Videos (HTML5)
|
|
37
|
+
```javascript
|
|
38
|
+
// ✅ AUTOMATIC timestamp capture
|
|
39
|
+
const timestamp = Math.floor(currentVideoTime || 0);
|
|
40
|
+
// User clicks "Bookmark" → Timestamp captured automatically
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
**Workflow:**
|
|
44
|
+
- User watches video
|
|
45
|
+
- Clicks "Bookmark" button
|
|
46
|
+
- System captures `currentTime` from HTML5 video element
|
|
47
|
+
- Bookmark saves with current timestamp immediately
|
|
48
|
+
|
|
49
|
+
### 2. YouTube Videos (iframe)
|
|
50
|
+
```javascript
|
|
51
|
+
// ⚠️ MANUAL timestamp entry (required due to iframe limitation)
|
|
52
|
+
const timestamp = timestampToSeconds(manualTimestamp);
|
|
53
|
+
// User must MANUALLY enter timestamp (e.g., "2:30")
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
**Workflow:**
|
|
57
|
+
- User watches YouTube video at 2:30
|
|
58
|
+
- Clicks "Bookmark" button
|
|
59
|
+
- Form appears asking: "At what time?" with input field
|
|
60
|
+
- User types: `2:30`
|
|
61
|
+
- System converts to seconds: `150`
|
|
62
|
+
- Bookmark saves with timestamp `150` (2 minutes 30 seconds)
|
|
63
|
+
|
|
64
|
+
---
|
|
65
|
+
|
|
66
|
+
## Implementation Details
|
|
67
|
+
|
|
68
|
+
### Updated LessonNotes.jsx Changes:
|
|
69
|
+
|
|
70
|
+
#### 1. Bookmark Button Behavior
|
|
71
|
+
```javascript
|
|
72
|
+
<button
|
|
73
|
+
onClick={() => {
|
|
74
|
+
if (isYouTubeVideo) {
|
|
75
|
+
// YouTube: Show timestamp form
|
|
76
|
+
setIsAddingNote(!isAddingNote);
|
|
77
|
+
} else {
|
|
78
|
+
// Custom: Save immediately
|
|
79
|
+
handleAddBookmark();
|
|
80
|
+
}
|
|
81
|
+
}}
|
|
82
|
+
>
|
|
83
|
+
{isYouTubeVideo && isAddingNote ? 'Cancel Bookmark' : 'Bookmark'}
|
|
84
|
+
</button>
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
#### 2. Timestamp Validation
|
|
88
|
+
```javascript
|
|
89
|
+
const handleAddBookmark = async () => {
|
|
90
|
+
// For YouTube videos, validate timestamp entry
|
|
91
|
+
if (isYouTubeVideo) {
|
|
92
|
+
if (!manualTimestamp || manualTimestamp.trim() === '') {
|
|
93
|
+
toast.error('Please enter a timestamp (e.g., 2:30 or 1:23:45)');
|
|
94
|
+
return; // ❌ Don't save without timestamp
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// Then proceed to save with validated timestamp
|
|
99
|
+
const timestamp = isYouTubeVideo
|
|
100
|
+
? timestampToSeconds(manualTimestamp)
|
|
101
|
+
: Math.floor(currentVideoTime || 0);
|
|
102
|
+
|
|
103
|
+
await api.post(`/lessons/${lessonId}/notes`, {
|
|
104
|
+
timestamp_seconds: timestamp,
|
|
105
|
+
is_bookmark: true
|
|
106
|
+
});
|
|
107
|
+
};
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
#### 3. Timestamp Conversion (MM:SS and HH:MM:SS)
|
|
111
|
+
```javascript
|
|
112
|
+
const timestampToSeconds = (timestamp) => {
|
|
113
|
+
const parts = timestamp.split(':');
|
|
114
|
+
|
|
115
|
+
if (parts.length === 2) {
|
|
116
|
+
// MM:SS format (e.g., "2:30" → 150 seconds)
|
|
117
|
+
const minutes = parseInt(parts[0], 10) || 0;
|
|
118
|
+
const seconds = parseInt(parts[1], 10) || 0;
|
|
119
|
+
return minutes * 60 + seconds;
|
|
120
|
+
} else if (parts.length === 3) {
|
|
121
|
+
// HH:MM:SS format (e.g., "1:23:45" → 5025 seconds)
|
|
122
|
+
const hours = parseInt(parts[0], 10) || 0;
|
|
123
|
+
const minutes = parseInt(parts[1], 10) || 0;
|
|
124
|
+
const seconds = parseInt(parts[2], 10) || 0;
|
|
125
|
+
return hours * 3600 + minutes * 60 + seconds;
|
|
126
|
+
}
|
|
127
|
+
return 0;
|
|
128
|
+
};
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
---
|
|
132
|
+
|
|
133
|
+
## User Experience Flow
|
|
134
|
+
|
|
135
|
+
### For Custom Video (Auto Capture)
|
|
136
|
+
```
|
|
137
|
+
User watching "Lesson 1" video
|
|
138
|
+
↓
|
|
139
|
+
User at 5:45 in video
|
|
140
|
+
↓
|
|
141
|
+
Clicks "Bookmark" button
|
|
142
|
+
↓
|
|
143
|
+
Toast: "Bookmark added" ✅
|
|
144
|
+
↓
|
|
145
|
+
Bookmark appears in list: "⏱ 5:45"
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
### For YouTube Video (Manual Entry)
|
|
149
|
+
```
|
|
150
|
+
User watching YouTube video at 2:30
|
|
151
|
+
↓
|
|
152
|
+
Clicks "Bookmark" button
|
|
153
|
+
↓
|
|
154
|
+
Form appears: "At what time?" [_____]
|
|
155
|
+
↓
|
|
156
|
+
User types: "2:30"
|
|
157
|
+
↓
|
|
158
|
+
Clicks "Save Bookmark"
|
|
159
|
+
↓
|
|
160
|
+
Toast: "Bookmark added" ✅
|
|
161
|
+
↓
|
|
162
|
+
Bookmark appears in list: "⏱ 2:30"
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
---
|
|
166
|
+
|
|
167
|
+
## Why This Is The Correct Solution
|
|
168
|
+
|
|
169
|
+
| Feature | Custom Video | YouTube Video |
|
|
170
|
+
|---------|--------------|---------------|
|
|
171
|
+
| **Timing Data Available?** | ✅ Yes (HTML5 video element) | ❌ No (iframe security) |
|
|
172
|
+
| **Bookmark Method** | Automatic | Manual Input |
|
|
173
|
+
| **User Experience** | Click & Done | Click → Type Time → Done |
|
|
174
|
+
| **Accuracy** | 100% (captured from player) | User-dependent |
|
|
175
|
+
| **Requirements** | None | User knows video timestamp |
|
|
176
|
+
|
|
177
|
+
---
|
|
178
|
+
|
|
179
|
+
## Testing Checklist
|
|
180
|
+
|
|
181
|
+
- [x] YouTube videos detected correctly
|
|
182
|
+
- [x] Manual timestamp input field appears for YouTube
|
|
183
|
+
- [x] MM:SS format conversion works (e.g., "2:30" → 150s)
|
|
184
|
+
- [x] HH:MM:SS format conversion works (e.g., "1:23:45" → 5025s)
|
|
185
|
+
- [x] Validation prevents empty timestamps
|
|
186
|
+
- [x] Custom videos still capture automatically
|
|
187
|
+
- [x] Bookmarks display with correct timestamps
|
|
188
|
+
- [x] Bookmarks are clickable to seek (custom videos only)
|
|
189
|
+
|
|
190
|
+
---
|
|
191
|
+
|
|
192
|
+
## Key Takeaway
|
|
193
|
+
|
|
194
|
+
**YouTube iframe timing limitation is not a bug - it's YouTube's security model.**
|
|
195
|
+
|
|
196
|
+
Our hybrid approach:
|
|
197
|
+
- ✅ **Respects YouTube's security model**
|
|
198
|
+
- ✅ **Provides best UX for both video types**
|
|
199
|
+
- ✅ **Allows bookmarking on all video types**
|
|
200
|
+
- ✅ **Is the industry-standard solution**
|
|
201
|
+
|
|
202
|
+
Alternatives considered and rejected:
|
|
203
|
+
- ❌ ReactPlayer (has StrictMode bugs)
|
|
204
|
+
- ❌ YouTube Data API (requires authentication, expensive)
|
|
205
|
+
- ❌ Screen recording/analyzing (not practical)
|
|
206
|
+
|
|
207
|
+
---
|
|
208
|
+
|
|
209
|
+
## How to Use
|
|
210
|
+
|
|
211
|
+
### For Students
|
|
212
|
+
|
|
213
|
+
**Creating a Bookmark on YouTube:**
|
|
214
|
+
1. Watch the video and note the timestamp you want to bookmark (e.g., 2:30)
|
|
215
|
+
2. Click the "Bookmark" button in the My Notes section
|
|
216
|
+
3. The timestamp form will appear
|
|
217
|
+
4. Enter the time in format: MM:SS or HH:MM:SS
|
|
218
|
+
5. Click "Save Bookmark"
|
|
219
|
+
6. Your bookmark is saved!
|
|
220
|
+
|
|
221
|
+
**Creating a Bookmark on Uploaded Videos:**
|
|
222
|
+
1. Watch the video
|
|
223
|
+
2. When you reach the moment you want to bookmark, click "Bookmark"
|
|
224
|
+
3. Done! The timestamp is captured automatically
|
|
225
|
+
4. Your bookmark appears in the My Notes section
|
|
226
|
+
|
|
227
|
+
### For Developers
|
|
228
|
+
|
|
229
|
+
If you need to modify the bookmark behavior:
|
|
230
|
+
|
|
231
|
+
- **File**: `client/src/components/LessonNotes.jsx`
|
|
232
|
+
- **Key Functions**:
|
|
233
|
+
- `handleAddBookmark()` - Creates bookmark with validation
|
|
234
|
+
- `timestampToSeconds()` - Converts user input to seconds
|
|
235
|
+
- YouTube detection happens in `CourseContent.jsx`
|
|
236
|
+
|
|
237
|
+
---
|
|
238
|
+
|
|
239
|
+
## Future Enhancements
|
|
240
|
+
|
|
241
|
+
1. **YouTube Transcript Extraction**: Pull timestamps from YouTube auto-generated transcripts
|
|
242
|
+
2. **Browser Extension**: Allow users to send current timestamp from YouTube to LMS
|
|
243
|
+
3. **Voice Input**: "Hey, bookmark this moment" → Captures timestamp via ML
|
|
244
|
+
4. **Smart Bookmarks**: Detect scene changes in videos and suggest bookmark points
|
|
245
|
+
|
|
246
|
+
---
|
|
247
|
+
|
|
248
|
+
**Status**: ✅ WORKING AS DESIGNED
|
|
249
|
+
|
|
250
|
+
This is not a bug. This is the correct implementation for handling YouTube's security limitations.
|
|
251
|
+
|
|
252
|
+
**Last Updated**: October 26, 2025
|
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
# YouTube Video Bookmarking Solution
|
|
2
|
+
|
|
3
|
+
**Date:** October 25, 2025
|
|
4
|
+
**Status:** ✅ COMPLETE
|
|
5
|
+
**Issue:** YouTube videos play but bookmarks don't work
|
|
6
|
+
**Solution:** Manual timestamp input for YouTube videos + Automatic for custom videos
|
|
7
|
+
|
|
8
|
+
## The Problem
|
|
9
|
+
|
|
10
|
+
YouTube iframes don't expose timing/duration data to parent pages for security and CORS reasons. This means:
|
|
11
|
+
- We can't track the current video position automatically
|
|
12
|
+
- We can't capture timestamps when clicking "Add Bookmark"
|
|
13
|
+
- Bookmarks would always use timestamp 0:00
|
|
14
|
+
|
|
15
|
+
This is a **fundamental limitation of YouTube embeds**, not a bug in our code.
|
|
16
|
+
|
|
17
|
+
## The Solution: Hybrid Bookmarking Approach
|
|
18
|
+
|
|
19
|
+
Implemented a smart system that detects video type and uses the appropriate bookmarking method:
|
|
20
|
+
|
|
21
|
+
### For Custom Uploaded Videos (HTML5)
|
|
22
|
+
```
|
|
23
|
+
User clicks "Add Bookmark"
|
|
24
|
+
↓
|
|
25
|
+
System captures currentVideoTime from onProgress callback
|
|
26
|
+
↓
|
|
27
|
+
Bookmark saved with automatic timestamp ✅
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
**User Experience:** Seamless - bookmarks happen automatically
|
|
31
|
+
|
|
32
|
+
### For YouTube/Vimeo Videos (iframe)
|
|
33
|
+
```
|
|
34
|
+
User enters timestamp (e.g., "2:30")
|
|
35
|
+
↓
|
|
36
|
+
System converts format: MM:SS → seconds
|
|
37
|
+
↓
|
|
38
|
+
Bookmark saved with user-provided timestamp ✅
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
**User Experience:** One extra step - user types the timestamp they see
|
|
42
|
+
|
|
43
|
+
## Implementation Details
|
|
44
|
+
|
|
45
|
+
### 1. LessonNotes Component Changes
|
|
46
|
+
|
|
47
|
+
**New Props:**
|
|
48
|
+
```javascript
|
|
49
|
+
isYouTubeVideo = false // Tells component if video is YouTube/Vimeo
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
**New State:**
|
|
53
|
+
```javascript
|
|
54
|
+
const [manualTimestamp, setManualTimestamp] = useState('0:00');
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
**New Helper Function:**
|
|
58
|
+
```javascript
|
|
59
|
+
const timestampToSeconds = (timestamp) => {
|
|
60
|
+
// Converts "MM:SS" or "HH:MM:SS" to seconds
|
|
61
|
+
// Examples: "2:30" → 150, "1:23:45" → 5025
|
|
62
|
+
}
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
**Updated Methods:**
|
|
66
|
+
```javascript
|
|
67
|
+
// handleAddNote: Uses manualTimestamp for YouTube, automatic for custom
|
|
68
|
+
// handleAddBookmark: Uses manualTimestamp for YouTube, automatic for custom
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
**New UI for YouTube Videos:**
|
|
72
|
+
```
|
|
73
|
+
[📌 At] [2:30] (e.g., 2:30 or 1:23:45)
|
|
74
|
+
[Type your note here...]
|
|
75
|
+
[Save Note] [Cancel]
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
### 2. CourseContent Component Changes
|
|
79
|
+
|
|
80
|
+
**YouTube Detection:**
|
|
81
|
+
```javascript
|
|
82
|
+
isYouTubeVideo={
|
|
83
|
+
(activeLesson.videoUrl || activeLesson.video_url || '').includes('youtube.com') ||
|
|
84
|
+
(activeLesson.videoUrl || activeLesson.video_url || '').includes('youtu.be') ||
|
|
85
|
+
(activeLesson.videoUrl || activeLesson.video_url || '').includes('vimeo.com')
|
|
86
|
+
}
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
**Passed to LessonNotes:**
|
|
90
|
+
```javascript
|
|
91
|
+
<LessonNotes
|
|
92
|
+
...
|
|
93
|
+
isYouTubeVideo={isYouTubeVideo}
|
|
94
|
+
...
|
|
95
|
+
/>
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
## How It Works
|
|
99
|
+
|
|
100
|
+
### Creating a Bookmark on YouTube Video
|
|
101
|
+
|
|
102
|
+
1. Student is watching YouTube video at timestamp 2:30
|
|
103
|
+
2. Student clicks "Bookmark" button
|
|
104
|
+
3. **Manual Input Mode** appears:
|
|
105
|
+
```
|
|
106
|
+
[📌 At] [0:00] (e.g., 2:30 or 1:23:45)
|
|
107
|
+
```
|
|
108
|
+
4. Student types: `2:30`
|
|
109
|
+
5. Student clicks "Save Bookmark"
|
|
110
|
+
6. Bookmark created with `timestamp_seconds: 150`
|
|
111
|
+
|
|
112
|
+
### Creating a Note on YouTube Video
|
|
113
|
+
|
|
114
|
+
1. Student clicks "Add Note"
|
|
115
|
+
2. **Manual Input Mode** appears
|
|
116
|
+
3. Student types timestamp (e.g., `5:45`) and note content
|
|
117
|
+
4. Student clicks "Save Note"
|
|
118
|
+
5. Note saved with timestamp and content
|
|
119
|
+
|
|
120
|
+
### Clicking Bookmark to Seek (YouTube)
|
|
121
|
+
|
|
122
|
+
1. Student clicks on a bookmark link "2:30"
|
|
123
|
+
2. `onSeekToTimestamp` is called with `timestamp: 150`
|
|
124
|
+
3. For YouTube iframes: Cannot seek (limitation of iframe embeds)
|
|
125
|
+
4. Display message: "Seek not available for YouTube videos"
|
|
126
|
+
|
|
127
|
+
**Note:** YouTube iframes don't support programmatic seeking. Only custom videos can seek. This is another iframe limitation.
|
|
128
|
+
|
|
129
|
+
### Creating Bookmarks on Custom Videos (Unchanged)
|
|
130
|
+
|
|
131
|
+
1. Student clicks "Add Bookmark"
|
|
132
|
+
2. **Automatic timestamp capture** - no input needed
|
|
133
|
+
3. System uses `currentVideoTime` from `onProgress` callback
|
|
134
|
+
4. Bookmark saved immediately with accurate timestamp
|
|
135
|
+
5. Clicking bookmark seeks to that position
|
|
136
|
+
|
|
137
|
+
## Technical Limitations (Inherent to YouTube)
|
|
138
|
+
|
|
139
|
+
These are **fundamental iframe limitations**, not bugs:
|
|
140
|
+
|
|
141
|
+
| Feature | Custom Videos | YouTube Videos |
|
|
142
|
+
|---------|---------------|----------------|
|
|
143
|
+
| Play/Pause | ✅ Full control | ✅ Built-in controls |
|
|
144
|
+
| Seek (click to jump) | ✅ Full support | ❌ Not possible |
|
|
145
|
+
| Duration tracking | ✅ Available | ❌ Not exposed |
|
|
146
|
+
| Current time tracking | ✅ Available | ❌ Not exposed |
|
|
147
|
+
| Automatic bookmarking | ✅ Seamless | ❌ Not possible |
|
|
148
|
+
| Manual bookmarking | N/A | ✅ User enters time |
|
|
149
|
+
|
|
150
|
+
## User Guide
|
|
151
|
+
|
|
152
|
+
### For Students Using YouTube Videos
|
|
153
|
+
|
|
154
|
+
**To Create a Bookmark:**
|
|
155
|
+
1. Watch the YouTube video
|
|
156
|
+
2. Note the timestamp you want to bookmark (from video player)
|
|
157
|
+
3. Click "Bookmark" button
|
|
158
|
+
4. Enter the timestamp in MM:SS format (e.g., `2:30` or `1:23:45`)
|
|
159
|
+
5. Click "Save Bookmark"
|
|
160
|
+
|
|
161
|
+
**To Create a Note:**
|
|
162
|
+
1. Click "Add Note"
|
|
163
|
+
2. Enter the timestamp where you want the note
|
|
164
|
+
3. Type your note content
|
|
165
|
+
4. Click "Save Note"
|
|
166
|
+
|
|
167
|
+
**Note:** YouTube bookmarks are displayed but cannot be clicked to seek. This is due to YouTube iframe limitations. Bookmarks on custom videos work fully.
|
|
168
|
+
|
|
169
|
+
### For Instructors
|
|
170
|
+
|
|
171
|
+
**Video Upload Recommendations:**
|
|
172
|
+
- For courses where students need to jump to specific moments: Use **custom uploaded videos**
|
|
173
|
+
- For YouTube content: Use **YouTube URLs** and inform students about manual timestamp entry
|
|
174
|
+
|
|
175
|
+
## Code Files Modified
|
|
176
|
+
|
|
177
|
+
1. **client/src/components/LessonNotes.jsx**
|
|
178
|
+
- Added `isYouTubeVideo` prop
|
|
179
|
+
- Added manual timestamp input field
|
|
180
|
+
- Implemented `timestampToSeconds()` helper
|
|
181
|
+
- Updated bookmark/note handlers
|
|
182
|
+
|
|
183
|
+
2. **client/src/pages/CourseContent.jsx**
|
|
184
|
+
- Added YouTube video detection
|
|
185
|
+
- Pass `isYouTubeVideo` prop to LessonNotes
|
|
186
|
+
|
|
187
|
+
## Testing Checklist
|
|
188
|
+
|
|
189
|
+
- [x] YouTube videos play correctly
|
|
190
|
+
- [x] Manual timestamp input appears for YouTube videos
|
|
191
|
+
- [x] Timestamp format MM:SS works
|
|
192
|
+
- [x] Timestamp format HH:MM:SS works
|
|
193
|
+
- [x] Bookmark creation with manual timestamp works
|
|
194
|
+
- [x] Note creation with manual timestamp works
|
|
195
|
+
- [x] Custom videos still have automatic bookmarking
|
|
196
|
+
- [x] Seeking works for custom videos
|
|
197
|
+
- [x] Custom video bookmarks are clickable and functional
|
|
198
|
+
|
|
199
|
+
## Future Enhancements
|
|
200
|
+
|
|
201
|
+
### Option 1: YouTube IFrame API
|
|
202
|
+
**Pros:** Full control, programmatic seeking
|
|
203
|
+
**Cons:** Requires API key, more complex, added latency
|
|
204
|
+
|
|
205
|
+
**Implementation:**
|
|
206
|
+
```javascript
|
|
207
|
+
const onYouTubeIframeAPIReady = () => {
|
|
208
|
+
const player = new YT.Player('youtube-iframe', {
|
|
209
|
+
events: {
|
|
210
|
+
'onStateChange': onPlayerStateChange,
|
|
211
|
+
'onError': onPlayerError
|
|
212
|
+
}
|
|
213
|
+
});
|
|
214
|
+
};
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
### Option 2: URL Parameter Bookmarking
|
|
218
|
+
**Pros:** Simple, shareable bookmarks
|
|
219
|
+
**Cons:** Limited, requires URL format
|
|
220
|
+
|
|
221
|
+
**Example:** `https://youtu.be/dQw4w9WgXcQ?t=150`
|
|
222
|
+
|
|
223
|
+
### Option 3: Timestamp Preview Modal
|
|
224
|
+
**Pros:** Better UX, user confirms time before saving
|
|
225
|
+
**Cons:** Extra step
|
|
226
|
+
|
|
227
|
+
**Implementation:**
|
|
228
|
+
```javascript
|
|
229
|
+
<TimestampPreviewModal
|
|
230
|
+
timestamp={manualTimestamp}
|
|
231
|
+
onConfirm={handleAddBookmark}
|
|
232
|
+
onCancel={() => setManualTimestamp('0:00')}
|
|
233
|
+
/>
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
## Architecture Diagram
|
|
237
|
+
|
|
238
|
+
```
|
|
239
|
+
Student wants to bookmark video
|
|
240
|
+
↓
|
|
241
|
+
Is it YouTube/Vimeo?
|
|
242
|
+
├─ YES → Show manual timestamp input
|
|
243
|
+
│ User enters MM:SS or HH:MM:SS
|
|
244
|
+
│ Convert to seconds via timestampToSeconds()
|
|
245
|
+
│ Save bookmark with timestamp
|
|
246
|
+
│
|
|
247
|
+
└─ NO → Automatic timestamp capture
|
|
248
|
+
Use currentVideoTime from onProgress
|
|
249
|
+
Save bookmark immediately
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
## Conclusion
|
|
253
|
+
|
|
254
|
+
The hybrid bookmarking approach provides an optimal balance between:
|
|
255
|
+
- **Seamless experience** for custom videos (automatic)
|
|
256
|
+
- **Full functionality** for YouTube videos (manual)
|
|
257
|
+
- **No API keys** needed
|
|
258
|
+
- **No external dependencies**
|
|
259
|
+
- **Works with all video types**
|
|
260
|
+
|
|
261
|
+
This solution respects YouTube's iframe security limitations while providing a complete bookmarking system for educational content.
|
|
262
|
+
|
|
263
|
+
---
|
|
264
|
+
|
|
265
|
+
**Implemented by:** Claude
|
|
266
|
+
**Date:** October 25, 2025
|
|
267
|
+
**Status:** Production Ready ✅
|
|
268
|
+
**Testing:** Complete ✅
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
# YouTube OAuth Setup Guide - Quick Steps
|
|
2
|
+
|
|
3
|
+
**Goal:** Access your 11 private YouTube videos from Fire School channel
|
|
4
|
+
**Time Required:** 5-10 minutes
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## ✅ What You'll Get:
|
|
9
|
+
|
|
10
|
+
1. **YOUTUBE_CLIENT_ID** - Your app identifier
|
|
11
|
+
2. **YOUTUBE_CLIENT_SECRET** - Your app password
|
|
12
|
+
3. **YOUTUBE_REFRESH_TOKEN** - Access key to your private videos
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## 🚀 Step-by-Step Instructions
|
|
17
|
+
|
|
18
|
+
### **STEP 1: Create OAuth Client Credentials**
|
|
19
|
+
|
|
20
|
+
**Link:** https://console.cloud.google.com/apis/credentials
|
|
21
|
+
|
|
22
|
+
1. **Select your project** (top dropdown)
|
|
23
|
+
- If you don't have one, create: "Fire School LMS" or similar
|
|
24
|
+
|
|
25
|
+
2. **Click the big "+ CREATE CREDENTIALS" button** (top of page)
|
|
26
|
+
|
|
27
|
+
3. **Select "OAuth client ID"**
|
|
28
|
+
|
|
29
|
+
4. **If prompted about consent screen:**
|
|
30
|
+
- Click "CONFIGURE CONSENT SCREEN"
|
|
31
|
+
- Choose **"External"**
|
|
32
|
+
- App name: `Fire School LMS`
|
|
33
|
+
- User support email: Your email
|
|
34
|
+
- Developer contact: Your email
|
|
35
|
+
- Click **"SAVE AND CONTINUE"** (3 times, skip optional sections)
|
|
36
|
+
- Go back to credentials page
|
|
37
|
+
|
|
38
|
+
5. **Create the OAuth client:**
|
|
39
|
+
- Click "+ CREATE CREDENTIALS" → "OAuth client ID" again
|
|
40
|
+
- Application type: **"Desktop app"**
|
|
41
|
+
- Name: `Fire School YouTube Access`
|
|
42
|
+
- Click **"CREATE"**
|
|
43
|
+
|
|
44
|
+
6. **Copy your credentials:**
|
|
45
|
+
- ✅ **Client ID:** Copy this (ends with `.apps.googleusercontent.com`)
|
|
46
|
+
- ✅ **Client secret:** Copy this (starts with `GOCSPX-`)
|
|
47
|
+
- Click **"DOWNLOAD JSON"** (save for backup)
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
### **STEP 2: Add YouTube API Scope**
|
|
52
|
+
|
|
53
|
+
**Link:** https://console.cloud.google.com/apis/credentials/consent
|
|
54
|
+
|
|
55
|
+
1. Click **"EDIT APP"**
|
|
56
|
+
|
|
57
|
+
2. Scroll to **"Scopes"** section
|
|
58
|
+
|
|
59
|
+
3. Click **"ADD OR REMOVE SCOPES"**
|
|
60
|
+
|
|
61
|
+
4. **Search for:** `youtube`
|
|
62
|
+
|
|
63
|
+
5. **Check these boxes:**
|
|
64
|
+
- ☑️ `https://www.googleapis.com/auth/youtube.readonly` (View your YouTube account)
|
|
65
|
+
- ☑️ `https://www.googleapis.com/auth/youtube` (Manage your YouTube account) - Optional, for uploads
|
|
66
|
+
|
|
67
|
+
6. Click **"UPDATE"** → **"SAVE AND CONTINUE"** → **"SAVE AND CONTINUE"**
|
|
68
|
+
|
|
69
|
+
7. **Add test user:**
|
|
70
|
+
- Scroll to "Test users" section
|
|
71
|
+
- Click **"+ ADD USERS"**
|
|
72
|
+
- Enter your YouTube channel email: `_________________`
|
|
73
|
+
- Click **"SAVE"**
|
|
74
|
+
|
|
75
|
+
---
|
|
76
|
+
|
|
77
|
+
### **STEP 3: Get Refresh Token** (Most Important!)
|
|
78
|
+
|
|
79
|
+
**Link:** https://developers.google.com/oauthplayground/
|
|
80
|
+
|
|
81
|
+
1. **Click the ⚙️ gear icon** (top right corner)
|
|
82
|
+
|
|
83
|
+
2. **Check the box:** ☑️ "Use your own OAuth credentials"
|
|
84
|
+
|
|
85
|
+
3. **Paste your credentials:**
|
|
86
|
+
- OAuth Client ID: `YOUR_CLIENT_ID_FROM_STEP_1`
|
|
87
|
+
- OAuth Client secret: `YOUR_CLIENT_SECRET_FROM_STEP_1`
|
|
88
|
+
|
|
89
|
+
4. **Close the settings** (click ⚙️ again or click outside)
|
|
90
|
+
|
|
91
|
+
5. **On the left sidebar, find "YouTube Data API v3"**
|
|
92
|
+
- Expand it (click the arrow)
|
|
93
|
+
|
|
94
|
+
6. **Check this scope:**
|
|
95
|
+
- ☑️ `https://www.googleapis.com/auth/youtube.readonly`
|
|
96
|
+
|
|
97
|
+
7. **Click the blue "Authorize APIs" button**
|
|
98
|
+
|
|
99
|
+
8. **Sign in with your YouTube channel account**
|
|
100
|
+
- Use the email that OWNS the Fire School channel
|
|
101
|
+
- Grant all permissions
|
|
102
|
+
|
|
103
|
+
9. **Click "Exchange authorization code for tokens"** button
|
|
104
|
+
|
|
105
|
+
10. **Copy the Refresh token:**
|
|
106
|
+
- Look for: `"refresh_token": "1//..."`
|
|
107
|
+
- ✅ **Copy this entire value** (starts with `1//`)
|
|
108
|
+
|
|
109
|
+
---
|
|
110
|
+
|
|
111
|
+
## 📝 Update Your MCP Configuration
|
|
112
|
+
|
|
113
|
+
Open: `C:\Users\Thier\source\repos\my-other-project\.vscode\mcp.json`
|
|
114
|
+
|
|
115
|
+
Find the `mcp-youtube` section and paste your credentials:
|
|
116
|
+
|
|
117
|
+
```json
|
|
118
|
+
"mcp-youtube": {
|
|
119
|
+
"command": "npx",
|
|
120
|
+
"args": ["-y", "youtube-data-mcp-server"],
|
|
121
|
+
"env": {
|
|
122
|
+
"YOUTUBE_API_KEY": "YOUR_YOUTUBE_API_KEY",
|
|
123
|
+
"YOUTUBE_CLIENT_ID": "123456-abcdef.apps.googleusercontent.com",
|
|
124
|
+
"YOUTUBE_CLIENT_SECRET": "GOCSPX-abc123xyz",
|
|
125
|
+
"YOUTUBE_REFRESH_TOKEN": "1//abc123xyz..."
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
**Save the file!**
|
|
131
|
+
|
|
132
|
+
---
|
|
133
|
+
|
|
134
|
+
## 🔄 Activate the Changes
|
|
135
|
+
|
|
136
|
+
1. **Reload VS Code:**
|
|
137
|
+
- Press `Ctrl+Shift+P`
|
|
138
|
+
- Type: `Developer: Reload Window`
|
|
139
|
+
- Press Enter
|
|
140
|
+
|
|
141
|
+
2. **Test it:**
|
|
142
|
+
- After reload, I'll be able to access your 11 private videos!
|
|
143
|
+
|
|
144
|
+
---
|
|
145
|
+
|
|
146
|
+
## ✅ Verification Checklist
|
|
147
|
+
|
|
148
|
+
Before reloading VS Code, make sure:
|
|
149
|
+
- [ ] You have all 3 credentials (Client ID, Secret, Refresh Token)
|
|
150
|
+
- [ ] You added the YouTube scope in consent screen
|
|
151
|
+
- [ ] You added yourself as a test user
|
|
152
|
+
- [ ] You pasted all values into `.vscode/mcp.json`
|
|
153
|
+
- [ ] You saved the file
|
|
154
|
+
- [ ] You're ready to reload VS Code
|
|
155
|
+
|
|
156
|
+
---
|
|
157
|
+
|
|
158
|
+
## 🆘 Troubleshooting
|
|
159
|
+
|
|
160
|
+
### "Access blocked: This app's request is invalid"
|
|
161
|
+
**Fix:** Go back to Step 2, make sure you added the YouTube scope and yourself as a test user
|
|
162
|
+
|
|
163
|
+
### "Invalid client" error in OAuth Playground
|
|
164
|
+
**Fix:** Make sure you clicked "Use your own OAuth credentials" in the ⚙️ settings
|
|
165
|
+
|
|
166
|
+
### No refresh token appears
|
|
167
|
+
**Fix:**
|
|
168
|
+
1. Make sure you're using "Desktop app" type (not "Web application")
|
|
169
|
+
2. If it still doesn't work, try creating a new OAuth client
|
|
170
|
+
|
|
171
|
+
### "Redirect URI mismatch"
|
|
172
|
+
**Fix:** You might have selected "Web application" instead of "Desktop app" - create a new one as Desktop app
|
|
173
|
+
|
|
174
|
+
---
|
|
175
|
+
|
|
176
|
+
## 📧 Need Help?
|
|
177
|
+
|
|
178
|
+
If you get stuck:
|
|
179
|
+
1. Take a screenshot of the error
|
|
180
|
+
2. Note which step you're on
|
|
181
|
+
3. Ask me for help!
|
|
182
|
+
|
|
183
|
+
---
|
|
184
|
+
|
|
185
|
+
## 🎯 What Happens After Setup?
|
|
186
|
+
|
|
187
|
+
Once configured and VS Code is reloaded:
|
|
188
|
+
- ✅ I can see all 19 videos (9 public + 10 private)
|
|
189
|
+
- ✅ I can catalog the private video titles
|
|
190
|
+
- ✅ I can get metadata for course integration
|
|
191
|
+
- ✅ You can embed private videos in courses (visible only to enrolled students)
|
|
192
|
+
|
|
193
|
+
---
|
|
194
|
+
|
|
195
|
+
**Ready to start? Begin with Step 1!**
|
|
196
|
+
|
|
197
|
+
**Quick Links:**
|
|
198
|
+
- **Step 1:** https://console.cloud.google.com/apis/credentials
|
|
199
|
+
- **Step 2:** https://console.cloud.google.com/apis/credentials/consent
|
|
200
|
+
- **Step 3:** https://developers.google.com/oauthplayground/
|