@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,271 @@
|
|
|
1
|
+
# Phase Import Error Debugging - Multi-File Server Crash Investigation
|
|
2
|
+
|
|
3
|
+
## The Problem
|
|
4
|
+
|
|
5
|
+
After implementing a multi-file feature phase (Phase 3.4 - Student Activity Timeline), the server crashed with import errors. A previous fix attempt was reverted, leaving the codebase in a broken state. The initial symptom reported was misleading (react-quill CSS import), but the real issues were server-side import errors in newly created files.
|
|
6
|
+
|
|
7
|
+
### Error Messages
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
Error: Cannot find module '../middleware/auth.js' imported from authMiddleware
|
|
11
|
+
Error: sql is not a function (from database.js which doesn't export sql)
|
|
12
|
+
Error: node-fetch is not defined (on Node 18+ where native fetch exists)
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
### Why It Was Hard
|
|
16
|
+
|
|
17
|
+
1. **Misleading initial symptom** - The handoff mentioned "react-quill CSS import" failure, but the real issues were server-side
|
|
18
|
+
2. **Revert obscured the problem** - A fix commit (054c62f) was reverted, putting broken imports back
|
|
19
|
+
3. **Multiple files affected** - Three different files had three different import errors
|
|
20
|
+
4. **ES Module specifics** - The errors relate to ES Module export/import patterns
|
|
21
|
+
5. **Environment differences** - Local (Node 24) worked, server (Node 18) failed
|
|
22
|
+
|
|
23
|
+
### Impact
|
|
24
|
+
|
|
25
|
+
- Server would not start
|
|
26
|
+
- All Phase 3.4 features unavailable
|
|
27
|
+
- Required git revert which lost valid fixes
|
|
28
|
+
- Blocked deployment pipeline
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## The Solution
|
|
33
|
+
|
|
34
|
+
### Root Cause
|
|
35
|
+
|
|
36
|
+
Phase 3.4 created several server files with **incorrect assumptions about exports**:
|
|
37
|
+
|
|
38
|
+
| File | Wrong Import | Correct Import | Why Wrong |
|
|
39
|
+
|------|--------------|----------------|-----------|
|
|
40
|
+
| `podcastProgressRoutes.js` | `import { authMiddleware }` | `import { protect }` | Export is named `protect`, not `authMiddleware` |
|
|
41
|
+
| `calendarSyncService.js` | `import sql from '../config/database.js'` | `import sql from '../config/sql.js'` | `database.js` exports `connectDatabase()`, not `sql` |
|
|
42
|
+
| `announcementService.js` | `import fetch from 'node-fetch'` | Remove import | Node 18+ has native `fetch` |
|
|
43
|
+
|
|
44
|
+
### How to Fix
|
|
45
|
+
|
|
46
|
+
#### 1. Fix Auth Middleware Import
|
|
47
|
+
|
|
48
|
+
**Wrong:**
|
|
49
|
+
```javascript
|
|
50
|
+
import { authMiddleware } from '../middleware/auth.js';
|
|
51
|
+
router.use(authMiddleware);
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
**Correct:**
|
|
55
|
+
```javascript
|
|
56
|
+
import { protect } from '../middleware/auth.js';
|
|
57
|
+
router.use(protect);
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
**Why:** Check the actual exports in `auth.js`:
|
|
61
|
+
```javascript
|
|
62
|
+
export const protect = async (req, res, next) => { ... }
|
|
63
|
+
export const authorize = (...roles) => { ... }
|
|
64
|
+
// Note: There is NO authMiddleware export
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
#### 2. Fix Database Import
|
|
68
|
+
|
|
69
|
+
**Wrong:**
|
|
70
|
+
```javascript
|
|
71
|
+
import sql from '../config/database.js';
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
**Correct:**
|
|
75
|
+
```javascript
|
|
76
|
+
import sql from '../config/sql.js';
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
**Why:** The database config has two files:
|
|
80
|
+
- `sql.js` - Exports the postgres `sql` instance (for queries)
|
|
81
|
+
- `database.js` - Exports `connectDatabase()` function (for initialization only)
|
|
82
|
+
|
|
83
|
+
#### 3. Remove node-fetch Import
|
|
84
|
+
|
|
85
|
+
**Wrong:**
|
|
86
|
+
```javascript
|
|
87
|
+
import fetch from 'node-fetch';
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
**Correct:**
|
|
91
|
+
```javascript
|
|
92
|
+
// Note: Using native fetch (Node 18+)
|
|
93
|
+
// No import needed
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
**Why:** Node 18+ includes native `fetch`. The `node-fetch` package is only needed for Node 16 and earlier.
|
|
97
|
+
|
|
98
|
+
---
|
|
99
|
+
|
|
100
|
+
## Debugging Process
|
|
101
|
+
|
|
102
|
+
### Step 1: Verify Current State
|
|
103
|
+
|
|
104
|
+
```bash
|
|
105
|
+
# Check what imports exist
|
|
106
|
+
grep -n "authMiddleware\|protect" server/routes/podcastProgressRoutes.js
|
|
107
|
+
grep -n "database\|sql" server/services/calendarSyncService.js
|
|
108
|
+
grep -n "node-fetch\|fetch" server/services/announcementService.js
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
### Step 2: Check What Exports Actually Exist
|
|
112
|
+
|
|
113
|
+
```bash
|
|
114
|
+
# Check auth middleware exports
|
|
115
|
+
grep -n "export" server/middleware/auth.js
|
|
116
|
+
|
|
117
|
+
# Check what database config files exist and export
|
|
118
|
+
ls server/config/ | grep -E "database|sql"
|
|
119
|
+
head -30 server/config/database.js
|
|
120
|
+
head -30 server/config/sql.js
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
### Step 3: Check Git History
|
|
124
|
+
|
|
125
|
+
```bash
|
|
126
|
+
# Find the commit that tried to fix this
|
|
127
|
+
git log --oneline -10
|
|
128
|
+
|
|
129
|
+
# See what that commit changed
|
|
130
|
+
git show <commit-hash> --stat --name-only
|
|
131
|
+
|
|
132
|
+
# Check if there's a revert
|
|
133
|
+
git log --oneline | grep -i "revert"
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
### Step 4: Test Fixes
|
|
137
|
+
|
|
138
|
+
```bash
|
|
139
|
+
# Syntax check
|
|
140
|
+
cd server && node --check server.js
|
|
141
|
+
|
|
142
|
+
# Build test
|
|
143
|
+
cd client && npm run build
|
|
144
|
+
|
|
145
|
+
# Full start test
|
|
146
|
+
npm run dev
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
---
|
|
150
|
+
|
|
151
|
+
## Prevention
|
|
152
|
+
|
|
153
|
+
### 1. Always Check Exports Before Importing
|
|
154
|
+
|
|
155
|
+
Before writing an import, verify the export exists:
|
|
156
|
+
|
|
157
|
+
```bash
|
|
158
|
+
# Quick check for available exports
|
|
159
|
+
grep "export" path/to/module.js
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
### 2. Use Consistent Naming Conventions
|
|
163
|
+
|
|
164
|
+
If the project uses `protect` for auth middleware, don't assume `authMiddleware` exists.
|
|
165
|
+
|
|
166
|
+
### 3. Document Module Contracts
|
|
167
|
+
|
|
168
|
+
In `server/middleware/auth.js`:
|
|
169
|
+
```javascript
|
|
170
|
+
/**
|
|
171
|
+
* Auth Middleware Exports:
|
|
172
|
+
* - protect: Require authenticated user
|
|
173
|
+
* - authorize(...roles): Require specific roles
|
|
174
|
+
* - isAdmin: Require admin role
|
|
175
|
+
* - optionalAuth: Parse auth if present, continue if not
|
|
176
|
+
*/
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
### 4. Use TypeScript or JSDoc
|
|
180
|
+
|
|
181
|
+
TypeScript would catch these errors at compile time:
|
|
182
|
+
```typescript
|
|
183
|
+
// This would error: 'authMiddleware' is not exported from './auth.js'
|
|
184
|
+
import { authMiddleware } from './auth.js';
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
### 5. Check Node Version for Native APIs
|
|
188
|
+
|
|
189
|
+
Before using packages like `node-fetch`:
|
|
190
|
+
```javascript
|
|
191
|
+
// Check if native fetch exists
|
|
192
|
+
if (typeof fetch === 'undefined') {
|
|
193
|
+
// Only import node-fetch for older Node versions
|
|
194
|
+
const { default: fetch } = await import('node-fetch');
|
|
195
|
+
}
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
---
|
|
199
|
+
|
|
200
|
+
## Related Patterns
|
|
201
|
+
|
|
202
|
+
- [ES_MODULE_IMPORT_HOISTING_DOTENV.md](./ES_MODULE_IMPORT_HOISTING_DOTENV.md) - ES Module import timing issues
|
|
203
|
+
- [PM2_ENVIRONMENT_VARIABLE_CACHING.md](../deployment-security/PM2_ENVIRONMENT_VARIABLE_CACHING.md) - Server restart issues
|
|
204
|
+
|
|
205
|
+
---
|
|
206
|
+
|
|
207
|
+
## Common Mistakes to Avoid
|
|
208
|
+
|
|
209
|
+
- ❌ **Assuming export names** - Always verify the actual export name
|
|
210
|
+
- ❌ **Copying import patterns from other files** - Module structures vary
|
|
211
|
+
- ❌ **Not checking git history** - Reverts can hide valid fixes
|
|
212
|
+
- ❌ **Trusting initial error reports** - Symptoms often mislead (react-quill CSS vs server imports)
|
|
213
|
+
- ❌ **Ignoring Node version differences** - Native APIs vary by version
|
|
214
|
+
|
|
215
|
+
---
|
|
216
|
+
|
|
217
|
+
## Diagnostic Commands Reference
|
|
218
|
+
|
|
219
|
+
```bash
|
|
220
|
+
# Check all exports in a file
|
|
221
|
+
grep -n "export" path/to/file.js
|
|
222
|
+
|
|
223
|
+
# Find all files importing a module
|
|
224
|
+
grep -r "from './auth" server/
|
|
225
|
+
|
|
226
|
+
# Check git for when a file was created
|
|
227
|
+
git log --oneline -- path/to/file.js
|
|
228
|
+
|
|
229
|
+
# See what a specific commit changed
|
|
230
|
+
git show <hash> --stat
|
|
231
|
+
|
|
232
|
+
# Check Node version
|
|
233
|
+
node --version
|
|
234
|
+
|
|
235
|
+
# Syntax check without running
|
|
236
|
+
node --check server/server.js
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
---
|
|
240
|
+
|
|
241
|
+
## Time to Implement
|
|
242
|
+
|
|
243
|
+
**Fix Time:** 5-10 minutes once root cause identified
|
|
244
|
+
**Debug Time:** 30-60 minutes (following this pattern)
|
|
245
|
+
|
|
246
|
+
## Difficulty Level
|
|
247
|
+
|
|
248
|
+
⭐⭐⭐ (3/5) - Moderate difficulty due to misdirection from initial symptom
|
|
249
|
+
|
|
250
|
+
---
|
|
251
|
+
|
|
252
|
+
**Author Notes:**
|
|
253
|
+
|
|
254
|
+
The key insight from this debugging session: **Don't trust the initial error report**. The handoff said "react-quill CSS import" but that was a red herring. The real issues were three separate server import errors that shared no relationship to react-quill.
|
|
255
|
+
|
|
256
|
+
**Always verify:**
|
|
257
|
+
1. What files were recently changed?
|
|
258
|
+
2. What do those files actually import?
|
|
259
|
+
3. Do those exports actually exist?
|
|
260
|
+
4. Was there a fix attempt that got reverted?
|
|
261
|
+
|
|
262
|
+
The debugging process took longer than the fix because the symptom pointed the wrong direction. Once we traced the git history and checked the actual exports, the fix was trivial.
|
|
263
|
+
|
|
264
|
+
---
|
|
265
|
+
|
|
266
|
+
**Session Context:** 2026-01-28 - Phase 3.4 Student Activity Timeline import fixes
|
|
267
|
+
**Commit:** e9ecd45
|
|
268
|
+
**Files Fixed:**
|
|
269
|
+
- `server/routes/podcastProgressRoutes.js`
|
|
270
|
+
- `server/services/calendarSyncService.js`
|
|
271
|
+
- `server/services/announcementService.js`
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
# Pynput Global Hotkeys with Virtual Key Code Matching
|
|
2
|
+
|
|
3
|
+
## The Problem
|
|
4
|
+
|
|
5
|
+
Building a Windows desktop app with global hotkey detection (e.g., Ctrl+Shift+M for hold-to-talk). Two obstacles:
|
|
6
|
+
|
|
7
|
+
1. **`keyboard` library (v0.13.5) is broken on Python 3.13+** — its low-level Windows hooks (`SetWindowsHookEx`) install and the listener thread starts, but callbacks never fire. The library was last updated in 2020 and has no fix.
|
|
8
|
+
|
|
9
|
+
2. **Modifier keys corrupt `pynput` char values** — when Ctrl is held, pressing a letter key changes its `.char` attribute via Windows' control-character mapping (Ctrl+M → `'\r'`, Ctrl+D → `'\x04'`, Ctrl+A → `'\x01'`). Naive char-based matching silently fails for every Ctrl+letter combo.
|
|
10
|
+
|
|
11
|
+
### Impact
|
|
12
|
+
|
|
13
|
+
- Hotkeys appear to register (no errors) but never fire — completely silent failure
|
|
14
|
+
- Extremely hard to debug because the hook thread is alive, the listener is running, everything *looks* correct
|
|
15
|
+
- Every Ctrl+letter hotkey is affected (26 possible combos), not just edge cases
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## The Solution
|
|
20
|
+
|
|
21
|
+
### Root Cause
|
|
22
|
+
|
|
23
|
+
**Issue 1:** The `keyboard` library's `_winkeyboard.py` uses internal threading and ctypes patterns that broke with Python 3.13+'s threading changes. The hook message pump thread runs but never delivers events to callbacks.
|
|
24
|
+
|
|
25
|
+
**Issue 2:** Windows translates Ctrl+letter keypresses into ASCII control characters at the API level. When pynput's hook receives Ctrl+M, the OS reports `char='\r'` (carriage return, 0x0D) instead of `char='m'`. But the **virtual key code (`vk`)** remains `77` (= `ord('M')`) regardless of modifiers.
|
|
26
|
+
|
|
27
|
+
### The Fix: Use pynput with VK-based matching
|
|
28
|
+
|
|
29
|
+
Replace `keyboard` with `pynput.keyboard.Listener` and match keys by `vk` (virtual key code) instead of `char`.
|
|
30
|
+
|
|
31
|
+
```python
|
|
32
|
+
from pynput.keyboard import Key, Listener, KeyCode
|
|
33
|
+
|
|
34
|
+
# WRONG: Match by char — fails when Ctrl is held
|
|
35
|
+
def _to_key_bad(name: str):
|
|
36
|
+
return KeyCode.from_char(name) # KeyCode(char='m')
|
|
37
|
+
|
|
38
|
+
def _match_bad(key, target) -> bool:
|
|
39
|
+
# ctrl+m gives key.char='\r', target.char='m' → NEVER MATCHES
|
|
40
|
+
return key.char == target.char
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
# RIGHT: Match by virtual key code — stable regardless of modifiers
|
|
44
|
+
def _to_key_good(name: str):
|
|
45
|
+
return KeyCode.from_vk(ord(name.upper())) # KeyCode(vk=77)
|
|
46
|
+
|
|
47
|
+
def _match_good(key, target) -> bool:
|
|
48
|
+
key_vk = getattr(key, 'vk', None)
|
|
49
|
+
target_vk = getattr(target, 'vk', None)
|
|
50
|
+
if key_vk is not None and target_vk is not None:
|
|
51
|
+
return key_vk == target_vk
|
|
52
|
+
# Fallback for special keys
|
|
53
|
+
return key == target
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
### Full Hold-to-Talk Hotkey Manager Pattern
|
|
57
|
+
|
|
58
|
+
```python
|
|
59
|
+
from pynput.keyboard import Key, Listener, KeyCode
|
|
60
|
+
import time
|
|
61
|
+
|
|
62
|
+
# Map config strings → sets of pynput Key objects (left, right, generic)
|
|
63
|
+
_MODIFIER_MAP = {
|
|
64
|
+
"ctrl": {Key.ctrl_l, Key.ctrl_r, Key.ctrl},
|
|
65
|
+
"shift": {Key.shift_l, Key.shift_r, Key.shift},
|
|
66
|
+
"alt": {Key.alt_l, Key.alt_r, Key.alt},
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
class HotkeyManager:
|
|
70
|
+
def __init__(self, hotkey_str: str, on_start, on_stop):
|
|
71
|
+
parts = hotkey_str.lower().split("+")
|
|
72
|
+
trigger_name = parts[-1]
|
|
73
|
+
self._mod_names = parts[:-1]
|
|
74
|
+
|
|
75
|
+
# Use vk for letter keys, Key enum for special keys
|
|
76
|
+
if len(trigger_name) == 1:
|
|
77
|
+
self._trigger = KeyCode.from_vk(ord(trigger_name.upper()))
|
|
78
|
+
else:
|
|
79
|
+
self._trigger = _SPECIAL_KEYS[trigger_name] # Key.space, etc.
|
|
80
|
+
|
|
81
|
+
self._on_start = on_start
|
|
82
|
+
self._on_stop = on_stop
|
|
83
|
+
self._active = False
|
|
84
|
+
self._held_mods: set[Key] = set()
|
|
85
|
+
self._debounce_s = 0.2
|
|
86
|
+
self._last_time = 0.0
|
|
87
|
+
self._listener = None
|
|
88
|
+
|
|
89
|
+
def _key_matches(self, key, target) -> bool:
|
|
90
|
+
if key == target:
|
|
91
|
+
return True
|
|
92
|
+
if isinstance(key, KeyCode) and isinstance(target, KeyCode):
|
|
93
|
+
key_vk = getattr(key, 'vk', None)
|
|
94
|
+
target_vk = getattr(target, 'vk', None)
|
|
95
|
+
if key_vk is not None and target_vk is not None:
|
|
96
|
+
return key_vk == target_vk
|
|
97
|
+
return False
|
|
98
|
+
|
|
99
|
+
def _mods_held(self) -> bool:
|
|
100
|
+
for mod_name in self._mod_names:
|
|
101
|
+
if not (self._held_mods & _MODIFIER_MAP.get(mod_name, set())):
|
|
102
|
+
return False
|
|
103
|
+
return True
|
|
104
|
+
|
|
105
|
+
def _on_press(self, key):
|
|
106
|
+
# Track modifier state
|
|
107
|
+
for mod_keys in _MODIFIER_MAP.values():
|
|
108
|
+
if key in mod_keys:
|
|
109
|
+
self._held_mods.add(key)
|
|
110
|
+
return
|
|
111
|
+
|
|
112
|
+
now = time.monotonic()
|
|
113
|
+
if (
|
|
114
|
+
self._key_matches(key, self._trigger)
|
|
115
|
+
and not self._active
|
|
116
|
+
and self._mods_held()
|
|
117
|
+
and (now - self._last_time) > self._debounce_s
|
|
118
|
+
):
|
|
119
|
+
self._active = True
|
|
120
|
+
self._last_time = now
|
|
121
|
+
self._on_start()
|
|
122
|
+
|
|
123
|
+
def _on_release(self, key):
|
|
124
|
+
# Modifier released while active → stop
|
|
125
|
+
for mod_keys in _MODIFIER_MAP.values():
|
|
126
|
+
if key in mod_keys:
|
|
127
|
+
self._held_mods.discard(key)
|
|
128
|
+
if self._active:
|
|
129
|
+
self._active = False
|
|
130
|
+
self._on_stop()
|
|
131
|
+
return
|
|
132
|
+
|
|
133
|
+
# Trigger key released → stop
|
|
134
|
+
if self._key_matches(key, self._trigger) and self._active:
|
|
135
|
+
self._active = False
|
|
136
|
+
self._on_stop()
|
|
137
|
+
|
|
138
|
+
def register(self):
|
|
139
|
+
self._listener = Listener(on_press=self._on_press, on_release=self._on_release)
|
|
140
|
+
self._listener.start()
|
|
141
|
+
|
|
142
|
+
def unregister(self):
|
|
143
|
+
if self._listener:
|
|
144
|
+
self._listener.stop()
|
|
145
|
+
self._listener = None
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
### Critical Design Decisions
|
|
149
|
+
|
|
150
|
+
| Decision | Why |
|
|
151
|
+
|----------|-----|
|
|
152
|
+
| `KeyCode.from_vk(ord(name.upper()))` | VK codes are stable when modifiers are held. `from_char()` produces chars that get corrupted by Ctrl. |
|
|
153
|
+
| `{Key.ctrl_l, Key.ctrl_r, Key.ctrl}` in modifier map | pynput sometimes reports `Key.ctrl` (generic) instead of `Key.ctrl_l`/`Key.ctrl_r`. Must accept all three. |
|
|
154
|
+
| Modifier release also triggers stop | For hold-to-talk: releasing ANY part of the combo should stop. User might release Ctrl before M. |
|
|
155
|
+
| 200ms debounce | Prevents double-firing from key repeat when holding the combo. |
|
|
156
|
+
| `set` for held modifiers | O(1) intersection check with `_MODIFIER_MAP` sets. |
|
|
157
|
+
|
|
158
|
+
---
|
|
159
|
+
|
|
160
|
+
## Windows Ctrl+Key Character Mapping Reference
|
|
161
|
+
|
|
162
|
+
| Combo | `.char` received | `.vk` | ASCII Control |
|
|
163
|
+
|-------|-----------------|-------|---------------|
|
|
164
|
+
| Ctrl+A | `'\x01'` | 65 | SOH |
|
|
165
|
+
| Ctrl+C | `'\x03'` | 67 | ETX |
|
|
166
|
+
| Ctrl+D | `'\x04'` | 68 | EOT |
|
|
167
|
+
| Ctrl+M | `'\r'` (0x0D) | 77 | CR |
|
|
168
|
+
| Ctrl+H | `'\x08'` | 72 | BS |
|
|
169
|
+
| Ctrl+I | `'\t'` (0x09) | 73 | HT |
|
|
170
|
+
| Ctrl+J | `'\n'` (0x0A) | 74 | LF |
|
|
171
|
+
| Ctrl+[ | `'\x1b'` | 219 | ESC |
|
|
172
|
+
|
|
173
|
+
Every letter A-Z maps to control code `0x01`-`0x1A` when Ctrl is held. VK is always `ord(letter.upper())`.
|
|
174
|
+
|
|
175
|
+
---
|
|
176
|
+
|
|
177
|
+
## Testing the Fix
|
|
178
|
+
|
|
179
|
+
```python
|
|
180
|
+
from pynput.keyboard import Key, Controller, Listener, KeyCode
|
|
181
|
+
import time
|
|
182
|
+
|
|
183
|
+
results = {'start': 0, 'stop': 0}
|
|
184
|
+
hm = HotkeyManager("ctrl+shift+m",
|
|
185
|
+
on_start=lambda: results.update({'start': results['start']+1}),
|
|
186
|
+
on_stop=lambda: results.update({'stop': results['stop']+1}))
|
|
187
|
+
hm.register()
|
|
188
|
+
time.sleep(0.3)
|
|
189
|
+
|
|
190
|
+
kb = Controller()
|
|
191
|
+
kb.press(Key.ctrl_l); kb.press(Key.shift_l)
|
|
192
|
+
time.sleep(0.1)
|
|
193
|
+
kb.press('m'); time.sleep(0.3); kb.release('m')
|
|
194
|
+
time.sleep(0.1)
|
|
195
|
+
kb.release(Key.shift_l); kb.release(Key.ctrl_l)
|
|
196
|
+
time.sleep(0.3)
|
|
197
|
+
|
|
198
|
+
hm.unregister()
|
|
199
|
+
assert results['start'] == 1 and results['stop'] >= 1
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
---
|
|
203
|
+
|
|
204
|
+
## Prevention
|
|
205
|
+
|
|
206
|
+
1. **Never use `keyboard` library with Python 3.13+** — hooks install silently but fire zero events
|
|
207
|
+
2. **Never match pynput keys by `.char` when Ctrl is a modifier** — char is corrupted by OS
|
|
208
|
+
3. **Always use `KeyCode.from_vk()` for letter keys** in hotkey registration
|
|
209
|
+
4. **Include `Key.ctrl` (generic)** alongside `Key.ctrl_l`/`Key.ctrl_r` in modifier maps — pynput behavior varies
|
|
210
|
+
5. **Kill stale instances** before debugging hotkey issues — multiple processes registering hooks can cause Windows to silently disable them
|
|
211
|
+
|
|
212
|
+
---
|
|
213
|
+
|
|
214
|
+
## Common Mistakes to Avoid
|
|
215
|
+
|
|
216
|
+
- Using `keyboard.on_press_key()` on Python 3.13+ (silent failure, no error)
|
|
217
|
+
- Using `KeyCode.from_char('m')` then comparing with `==` against a key pressed with Ctrl held
|
|
218
|
+
- Only checking `Key.shift_l` / `Key.ctrl_l` without the generic `Key.shift` / `Key.ctrl`
|
|
219
|
+
- Forgetting modifier-release-as-stop for hold-to-talk patterns (user releases Ctrl before the trigger key)
|
|
220
|
+
- Not debouncing — key repeat fires rapid press events when holding a combo
|
|
221
|
+
|
|
222
|
+
---
|
|
223
|
+
|
|
224
|
+
## Related Patterns
|
|
225
|
+
|
|
226
|
+
- Hold-to-talk audio recording: pair with `sounddevice` for mic capture
|
|
227
|
+
- System tray integration: `pystray` runs on main thread, hotkey listener runs in background thread
|
|
228
|
+
- Frozen mode detection: `getattr(sys, 'frozen', False)` for PyInstaller builds
|
|
229
|
+
|
|
230
|
+
---
|
|
231
|
+
|
|
232
|
+
## Resources
|
|
233
|
+
|
|
234
|
+
- [pynput documentation](https://pynput.readthedocs.io/)
|
|
235
|
+
- [keyboard library (abandoned)](https://github.com/boppreh/keyboard) — last release 0.13.5 (2020)
|
|
236
|
+
- [Windows Virtual Key Codes](https://learn.microsoft.com/en-us/windows/win32/inputdev/virtual-key-codes)
|
|
237
|
+
- [ASCII Control Characters](https://en.wikipedia.org/wiki/ASCII#Control_characters)
|
|
238
|
+
|
|
239
|
+
---
|
|
240
|
+
|
|
241
|
+
## Time to Implement
|
|
242
|
+
|
|
243
|
+
**15-30 minutes** to replace `keyboard` with the pynput pattern. Most time spent discovering the char corruption issue.
|
|
244
|
+
|
|
245
|
+
## Difficulty Level
|
|
246
|
+
|
|
247
|
+
Stars: 3/5 — The fix itself is straightforward once you understand the root cause. The difficulty is **diagnosing** it: hooks install without error, listener threads are alive, everything looks correct, but callbacks never fire (keyboard lib) or silently mismatch (char corruption).
|
|
248
|
+
|
|
249
|
+
---
|
|
250
|
+
|
|
251
|
+
**Author Notes:**
|
|
252
|
+
The two traps here are *silent*. The `keyboard` library doesn't throw errors — its hooks just never fire on Python 3.13+. And pynput's char corruption doesn't throw errors either — `'\r' != 'm'` just evaluates to False and your hotkey silently never triggers. The VK code is the only stable identifier across all modifier states.
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
# React useEffect Cascade Reset Fix
|
|
2
|
+
|
|
3
|
+
## Problem
|
|
4
|
+
|
|
5
|
+
Custom hooks with cascading dropdown state (e.g., Book → Chapter → Verse) use `useEffect` chains where selecting a parent resets child values to `null`. When programmatically navigating to a specific location (e.g., clicking a search result to jump to Genesis 3:15), the cascade effects fire and **destroy the child selections** before the UI can render them.
|
|
6
|
+
|
|
7
|
+
**Symptoms:**
|
|
8
|
+
- Clicking a search result navigates to the correct book/chapter but verse is not highlighted
|
|
9
|
+
- Programmatic navigation sets all three values, but useEffect on book change wipes chapter/verse
|
|
10
|
+
- The chapter effect then fires again and wipes the verse
|
|
11
|
+
|
|
12
|
+
## Root Cause
|
|
13
|
+
|
|
14
|
+
React's `useEffect` chains create a cascade:
|
|
15
|
+
|
|
16
|
+
```
|
|
17
|
+
setSelectedBook("Genesis") → useEffect[selectedBook] fires → setSelectedChapter(null) ← DESTROYS
|
|
18
|
+
setSelectedVerse(null) ← DESTROYS
|
|
19
|
+
setSelectedChapter(3) → useEffect[selectedChapter] fires → setSelectedVerse(null) ← DESTROYS
|
|
20
|
+
setSelectedVerse(15) → Already nullified by cascade
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
Even though all three `setState` calls happen synchronously, React batches them but the effects still run in order, each one resetting the children.
|
|
24
|
+
|
|
25
|
+
## Solution: Programmatic Navigation Ref Guard
|
|
26
|
+
|
|
27
|
+
Use a `useRef` flag to skip cascade resets during programmatic navigation:
|
|
28
|
+
|
|
29
|
+
```typescript
|
|
30
|
+
import { useState, useEffect, useCallback, useRef } from 'react'
|
|
31
|
+
|
|
32
|
+
export function useCascadingNavigation() {
|
|
33
|
+
const [selectedBook, setSelectedBook] = useState<string | null>(null)
|
|
34
|
+
const [selectedChapter, setSelectedChapter] = useState<number | null>(null)
|
|
35
|
+
const [selectedVerse, setSelectedVerse] = useState<number | null>(null)
|
|
36
|
+
|
|
37
|
+
// Ref to skip cascade resets during programmatic navigation
|
|
38
|
+
const programmaticNavRef = useRef(false)
|
|
39
|
+
|
|
40
|
+
// Update chapters when book changes
|
|
41
|
+
useEffect(() => {
|
|
42
|
+
if (selectedBook) {
|
|
43
|
+
const chapterCount = getChapterCount(selectedBook)
|
|
44
|
+
setChapters(Array.from({ length: chapterCount }, (_, i) => i + 1))
|
|
45
|
+
|
|
46
|
+
// Skip reset during programmatic navigation
|
|
47
|
+
if (!programmaticNavRef.current) {
|
|
48
|
+
setSelectedChapter(null)
|
|
49
|
+
setSelectedVerse(null)
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}, [selectedBook])
|
|
53
|
+
|
|
54
|
+
// Update verses when chapter changes
|
|
55
|
+
useEffect(() => {
|
|
56
|
+
if (selectedBook && selectedChapter) {
|
|
57
|
+
fetchVerseCount(selectedBook, selectedChapter)
|
|
58
|
+
|
|
59
|
+
// Skip verse reset during programmatic navigation
|
|
60
|
+
if (!programmaticNavRef.current) {
|
|
61
|
+
setSelectedVerse(null)
|
|
62
|
+
}
|
|
63
|
+
// Reset flag after chapter effect processes
|
|
64
|
+
programmaticNavRef.current = false
|
|
65
|
+
}
|
|
66
|
+
}, [selectedBook, selectedChapter])
|
|
67
|
+
|
|
68
|
+
// Navigate to a specific location without cascade resets
|
|
69
|
+
const navigateToVerse = useCallback((book: string, chapter: number, verse: number) => {
|
|
70
|
+
programmaticNavRef.current = true
|
|
71
|
+
setSelectedBook(book)
|
|
72
|
+
setSelectedChapter(chapter)
|
|
73
|
+
setSelectedVerse(verse)
|
|
74
|
+
}, [])
|
|
75
|
+
|
|
76
|
+
// Safety cleanup: ensure flag is always reset after effects process
|
|
77
|
+
useEffect(() => {
|
|
78
|
+
programmaticNavRef.current = false
|
|
79
|
+
})
|
|
80
|
+
|
|
81
|
+
return {
|
|
82
|
+
selectedBook, setSelectedBook,
|
|
83
|
+
selectedChapter, setSelectedChapter,
|
|
84
|
+
selectedVerse, setSelectedVerse,
|
|
85
|
+
navigateToVerse, // Use this for programmatic navigation
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
### Key Implementation Details
|
|
91
|
+
|
|
92
|
+
1. **`programmaticNavRef`** — A ref (not state) because it needs to be set synchronously before effects run, without triggering re-renders.
|
|
93
|
+
|
|
94
|
+
2. **Flag reset location** — The flag is reset in the **chapter effect** (the last cascade effect that needs guarding), not immediately after setting state. This ensures the flag persists through all cascade effects.
|
|
95
|
+
|
|
96
|
+
3. **Safety cleanup effect** — An unconditional `useEffect(() => { programmaticNavRef.current = false })` with no dependency array runs after every render, ensuring the flag is always cleaned up even if an effect chain is interrupted.
|
|
97
|
+
|
|
98
|
+
4. **Consumer usage** — Components call `navigateToVerse()` instead of individual setters:
|
|
99
|
+
|
|
100
|
+
```typescript
|
|
101
|
+
// In BibleViewer.tsx (consumer component)
|
|
102
|
+
const { navigateToVerse } = useBibleNavigation()
|
|
103
|
+
|
|
104
|
+
useEffect(() => {
|
|
105
|
+
if (navigateTo && navigateTo !== prevNavigateToRef.current) {
|
|
106
|
+
prevNavigateToRef.current = navigateTo
|
|
107
|
+
navigateToVerse(navigateTo.book, navigateTo.chapter, navigateTo.verse)
|
|
108
|
+
}
|
|
109
|
+
}, [navigateTo, navigateToVerse])
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
## When to Apply This Pattern
|
|
113
|
+
|
|
114
|
+
- Any cascading dropdown hook (Country → State → City)
|
|
115
|
+
- Multi-level navigation (Book → Chapter → Verse, Category → Subcategory → Item)
|
|
116
|
+
- Any hook where parent selection resets child selections, AND you need programmatic deep navigation
|
|
117
|
+
- Search result → detail view navigation
|
|
118
|
+
|
|
119
|
+
## Anti-Patterns to Avoid
|
|
120
|
+
|
|
121
|
+
1. **Don't use state for the flag** — `useState` triggers re-renders and the flag won't be set before effects run
|
|
122
|
+
2. **Don't set all values in a single effect** — Still triggers cascades because each `setState` triggers dependent effects
|
|
123
|
+
3. **Don't try `flushSync`** — Doesn't prevent effect cascades, just forces synchronous DOM updates
|
|
124
|
+
4. **Don't remove the cascade resets entirely** — Manual dropdown selection genuinely needs child resets
|
|
125
|
+
|
|
126
|
+
## Tech Stack
|
|
127
|
+
- React 18+ (hooks, useRef, useEffect, useCallback)
|
|
128
|
+
- TypeScript
|
|
129
|
+
- Any UI framework with cascading state
|
|
130
|
+
|
|
131
|
+
## Tags
|
|
132
|
+
`react` `useEffect` `cascade` `useState` `navigation` `dropdown` `useRef` `programmatic-navigation`
|